前言 #
在讲以太坊的账户之前,先说下比特币的账户有哪些缺点,再来讲以太坊跟比特币账户模式的不同点。
比特币账户 #
前面我们说过,比特币中账户就是一个私钥地址,且账户并没有显式的余额的概念,余额是通过UTXO集合算出来的。此外,在比特币的一次转账中,必须要一次性的把一个UTXO集合的输出全部花掉。
例如上图所示,如果A的UTXO输出有10个比特币,要转3个比特币转给B,那么A要把剩下的7个毕业币转给自己的另外一个账户A’,否则那7个比特币就变成给矿工的手续费了。
以太坊账户 #
在以太坊中账户与现在的银行账户模式类似,都是显式地记录了账户的余额,转账只需要查询转账者的账户中是否有足够余额的钱。
这种模式的好处是:
- 转账变得简单清晰,不再需要将余额转给自己的另一个账号。
- 天然地防范了 Double Spending 攻击,因为花两次,就会扣账户两次的钱 。
以太坊的账户模式解决了比特币中的Double Spending 攻击,但又会带来另一种问题,就是Replay 攻击。以上图来举例,假如B是有恶意的,将A->B的这个交易再广播给其他的节点,那么A的钱会被再扣一次,B的钱会再加一次。其实可以看出Replay 攻击跟Double Spending 攻击是对称的,前者是收款人有恶意,后者是付款人有恶意。
如何解决 #
以太坊中是引入nonce值来解决Replay 攻击的。在以太坊的每个交易中不仅有交易相关的信息,而且有一个nonce值,其是一个连续递增的整数,nonce值可以理解为账号的第几次交易。
假设A->B的这个交易是A的第20个交易,其他节点接收到这个信后后,A账户的nonce值会加1变成21,此时如果B要重放这个交易,其他节点接收到这个消息后发现当前的nonce值不相等,就会决绝这个交易。假设B将nonce值改成21,再进行重放呢?不可能,因为整个交易需要A的私钥签名,B即使改了nonce值也无法伪造签名。
BTW,nonce这个名称其用的并不恰当,用counter计数器更为合适,这个是历史原因,也无法深究了哈哈哈~
以太坊账户类型 #
以太坊中存在两种类型的账户
- 外部账户:利用公私钥来控制,存储了账户余额及nonce值
- 合约账户:也有账户余额及nonce值,还有代码code以及存储storage,合约账户不能主动发起交易,只能由外部账户来调用
同样是基于区块链,为什么以太坊要独立创造出一套这种账户系统?不同于比特币可以无限创建账户,打一枪换一炮式的交易,以太坊主要聚焦于智能合约,而对合约的双方来说,都需要有一个稳定的身份。