深入理解以太坊系列(2): 以太坊账户

比特币采用了UTXO结构。每个UTXO包含其所有者及价值信息,系统中的每一笔的交易由若干UTXO输入和若干UTXO输出组成。UTXO无法只提取部分,每次必须完整的使用,这有点像我们生活现实中的现金。比特币系统中,一个用户的“余额”是该用户的私钥能够有效签名的所有UTXO的总和。以太坊采用了与比特币不同的实现方式——账户,类似我们生活中的银行卡。

在以太坊系统中,账户是一个20字节的地址,包含四个部分:

1. 随机数,用于确定每笔交易只能被处理一次的计数器
2. 账户目前的以太币余额
3. 账户的合约代码,如果有的话
4. 账户的存储(默认为空)

以太坊有两种类型的账户:用户账户(EOA)和合约账户

用户账户或称作外部账户由私钥控制,每个账户都有自己的余额。拥有者可以通过创建和签名一笔交易从自己的外部账户发送消息。如果账户余额足够支付交易费用,则交易有效,那么发起方账户会扣除相应金额,而接受方账户则计入该金额。

合约账户由代码控制。在一些情况下,当合约账户收到一条消息,合约内部的代码就会被激活,允许它对内部存储进行读取和写入、发送其它消息或者创建合约。

账户的好处有以下几点:

1. 节省空间
如果一个账户有5个UTXO,则从UTXO模式转成账户模式所需空间会从300字节降到30字节。具体计算如下:

UTXO:300 = (20+32+8)* 5 (20是地址字节数,32是TX的id字节数,8是交易金额值字节数);
账户:30 = 20 + 8 + 2 ( 20是地址字节数,8是交易金额值字节数,2是nonce②字节数)

但实际节约并没有这么大,因为账户需要被存储在Patricia树中。另外以太坊中交易也比比特币中的更小(以太坊中100字节,比特币中200-250字节),因为每次交易只需要生成一次引用,一次签名,以及一个输出。

2. 更好的货币通用性
不支持根据货币来源对货币进行区分。由于没有区块链层货币溯源的概念,所以不管是在技术还是法律上,通过建立白名单/黑名单,根据货币的来源进行区分并不实际。

3. 简单
以太坊编码更简单、更易于理解,尤其是在涉及到复杂脚本时。尽管任何去中心化应用都可以用UTXO方式来实现,但实际操作中,想要实现一个脚本来对UTXO的输出做特定限制或者特殊要求时,UTXO的实现方式比以太坊使用账户的方式要复杂的多。

4. 轻客户端
以太坊轻客户端可随时沿指定方向扫描状态树来访问与账户相关的所有数据。而在UTXO模式中,引用随着每个交易的变化而变化,这对于长时间运行并使用了上文提到的UTXO根状态传播机制的dapp应用来说,无疑是繁重的.

UTXO模式最大的优点是:

较高程度的隐私保护
如果用户每次交易都使用一个新的地址,那么账户之间的相互关联就很困难。这样做适用于对安全性要求高的货币系统,但对任何dapp应用来说就不合适了。因为dapp通常需要跟踪用户复杂的绑定状态,而dapp的状态并不能像货币系统中的状态那样简单地划分。

以太坊在设计中对于隐私的考虑是:如果用户真的关心私密性,则可以通过合约中的签名数据包协议来建立一个加密“混合器”进行加密。

以太坊账户方式的一个弱点是:为了阻止重放攻击,每笔交易必须有nonce。这就使得账户需要跟踪nonce的使用情况。而且,不再使用的账户,无法从账户状态中移除。