概述

  • 外部账户(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)上,且代码一旦上链,则极难更改。