概述
- 外部账户(Externally Owned Accounts)
- 合约账户(Smart Contract Accounts)
BTC 采用基于交易的模型,一个账户有多少币没有显式记录,如果想要知道只能顺着区块链去查 UTXO 才能知道。
ETH 采用基于账户的模型,就像现实中的银行账户一样,一个账户有多少币是显式记录在区块链上的,每次支付的时候就检测余额并修改余额即可,无需关注币的来源。
为什么 ETH 会使用这种模式呢?因为 ETH 要支持智能合约(Smart Contract),这就要求参与者的身份要比较稳定,否则很难知道合约的参与者究竟是哪个账户
外部账户(Externally Owned Accounts)
外部账账户内记录的下列内容:
- balance:余额
- nonce:不同于 BTC,这里则表示该账户发起过多少笔交易。
账户的信息都会记录到一种名为「状态树」的数据结构中,每次交易都会更新状态树的对应节点。
重放攻击(Replay Attack)
基于账户的模式天然地对双花攻击(Double Spending Attack)有防范作用,但是容易成为重放攻击的目标。
重放攻击就是将一个已经上链的交易重新放送一次,由于这笔交易具有被攻击账户的签名,所以全节点会认为其是有效的,所以会导致一笔交易重复执行。对此 ETH 通过`nonce`字段来防范,这个字段记录了该账户发起过多少笔交易,每笔交易都要记录当前的`nonce`值,这样就可以有效防范重放攻击了。因为当一笔交易被重放时,其`nonce`值会比账户中记录的`nonce`值小,由此可以判断该账户没有发起过这笔交易。
合约账户(Smart Contract Accounts)
合约账户记录下列内容:
- Code:即合约代码
- Storage:相关数据
合约内的代码可以被其它用户所调用,也可以被其它合约调用,用以完成合约的功能。创建合约的时候会返回一个地址,根据这个地址即可调用合约代码。
智能合约代码一般使用 Solidity 语言编写,运行在 EVM(Ethereum Virtual Machine)上,且代码一旦上链,则极难更改。