BTC 系统是基于交易的账本,系统中并未显示记录账户有多少钱,只能通过 UTXO 进行推算。但实际中,使用起来较为别扭。
A 转给 B 钱的时候,需要说明币的来源。实际中只需要存钱说明来源,花钱则不用。此外,账户中的钱在花的时候,必须一次性全部花出去。
如图 1,B 收到 A 的 10 个 BTC,他想要给 C 3 个 BTC,如果按照 1 中方式,其余 7 个比特币会以交易费的形式给挖出区块的矿工。
因此,为了避免这种情况,便吸引采用 2 中方式,将 3 个 BTC 转给 C,将剩余 7 个 BTC 转到自己的另一账户 D 上面。
以太坊系统则采用了基于账户的模型,与现实中银行账户相似。系统中显示记录每个账户以太币的数量,转账是否合法只需要查看转账者账户中以太币是否足够即可,同时也不需要每次全部转账。同时,这也也天然地==防范了双花攻击 (double spending attack)==。
当然,以太坊发这种模式也存在缺点,这种模式存在==重放攻击 (replay attack)==的缺陷。A 向 B 转账,过一段时间,B 将 A 的交易重新发布,从而导致 A 账户被扣钱两次。
==为了防范重放攻击,给账户交易添加计数器 (nonce) 记录该账户交易过多少次,转账时候将转账次数计入交易的内容中,然后一起进行签名==。系统中全节点维护账户余额和该计数器的交易数,从而防止本地篡改余额或进行重放攻击。
以太坊系统中存在两类账户:外部账户和合约账户。
- 外部账户:类似于 BTC 系统中公私钥对,存在账户余额 balance 和计数器 nonce
- 合约账户:并非通过公私钥对控制(不能主动发起交易,只能接收到外部账户调用后才能发起交易或调用其他合约账户)。除了 balance 和 nonce 之外还有code、storage (相关状态-存储)
创建合约时候会返回一个地址,就可以对其调用。调用过程中,代码不变但状态会发生改变。
为什么要做以太坊,换基于账户的模型?
比特币中支持每次更换账户,但以太坊是为了支持智能合约,而合约签订双方是需要明确且较少变化的。尤其是对于合约账户来说,需要保持稳定状态。