目前主流的区块链采用UTXO(Unspent Transaction Output)账户(Account)模型来组织交易,其中比特币采用UTXO模型,以太坊采用Account模型。

UTXO 模型

UTXO全名是Unspent Transaction Outputs,未花费交易输出,举个例子;

假设A挖出了区块1,获得了10个BTC,这个时候在UTXO模型中,A的余额是10,同时A向B和C分别转账5个比特币,这两笔交易被打包到区块2中,这个时候UTXO模型中,B和C的余额分别是5,当查看区块4打包的交易以后,发现这时的UTXO模型中显示,G和C有2.5个BTC,H有5个BTC。

凑输入和找零

UTXO有个性质就是一个交易的输入必须是另一个交易的输出,这就导致了一个问题,在上图中,地址F如果只需要2.5个BTC怎么办?
F的来源只可能B,C但是无论我们怎么组合都无法满足H只需要2.5个BTC的需求。这个时候就需要将一次转账拆分成转向两个地址,其中地址C’还由C控制,这样就完成了一次找零。

C’被称为找零地址。

如果不设置找零地址,其中的差额将会被矿工当做手续费扣除。

凑整的过程与找零刚好相反,地址H的输入就是一个凑整的过程。

总结
  • 除了了BTC产生的交易外每一笔交易的输出都是另一笔交易输入;
  • 如果丢失私钥丧失账户的控制权后,UTXO会一直保存这个账户的余额,因为没有输出;
  • 随着比特币的碎片化和账户私钥的丢失,UTXO模型会越来越膨胀;
  • 验证一笔交易的余额是否足够需要向上追溯;
  • 通过UTXO模型可以一定程度上避免双花攻击;
  • UTXO通过找零设置新地址增加了一定的隐私性,因为除了你本人是不知道哪个地址是找零地址,哪个是收款地址。

Account模型

相比较UTXO模型Account模型更加符合我们的认知,类似传统的银行账户,以太坊采用账户模型主要是为了支持智能合约,对于智能合约来说需要一个相对稳定的身份。
举个例子,当我们签订一份合同,希望双方的身份很明确,但是在UTXO模型中,身份可以通过找零地址变更,当合同出现问题很难明确权责。

以太坊作为智能合约操作平台,将账户划分为两类:外部账户(EOAs)和合约账户(contract account)

外部账户

外部账户(external owned accouts)是由私钥创建,具有以下特点;

  • 拥有以太余额;
  • 能发送交易,包括转账和执行合约代码;
  • 被私钥控制;
  • 没有相关的可执行代码;
合约账户

含有合约代码的账户, 被外部账户或者合约创建,合约在创建时被分配到一个账户地址, 用于存储合约代码以及合约部署或执行过程中产生的存储数据,其具有如下特点;

  • 不能发送交易;
  • 合约账户接收到外部账户发来的交易以后可以通过Message调用其他合约账户;
  • 合约账户存储了合约代码和合约状态;