以太坊与比特币账户的区别

以太坊与比特币的账户模型,从根本设计出发点来讲是不同的。

根据以太坊黄皮书的描述,以太坊账户的概念与“银行储蓄账户”的概念相似。

每个人都能开设账户,且账户初始余额为0。 当以太坊区块链运行时,不断产生的交易会往账户中增加或者减少相应的款项,账户余额随着交易的执行而变更。 这个账户的状态是日积月累地随着时间和交易而变化的。 任意确定的时刻的任意账户的余额是可以唯一确定的。 检索和查询账户余额的操作是便利的,仅需要找到该账户,并读取最后的账户状态即可知晓。

比特币的”Unspent Transaction Output”未花费结余模型(以下简称 UTXO)则刚好相反。

比特币的概念与纸币的概念相似。 例如一个用户收到100元、20元、10元的纸币,比特币没有真正的“账户”的概念。 该用户持有的余额并不是一个单纯的总和数字,而是在此钱包中所有未花费的纸币(输出)的总和。 这就是”Unspent Transaction Output”名称的由来。 而任何支付行为也不是简单的对账户余额的加减。 支付行为是两个顺序操作的过程:

  • 1.取出在钱包中未花费的数张纸币。
  • 2.支付给对方相应款项,并同时创建一张面额较小的纸币,作为找零交给自身。

这个操作胜在不需要时刻保持追踪每个用户的余额,减轻了系统负担。

但是,当想查询一个用户究竟有多少余额的时候,需要遍历区块链交易历史,并集齐该用户所有未花费的输出,才能计算出余额。 所幸比特币钱包软件帮助我们自动收集数据,代劳了这个枯燥的过程。

隐私与安全性的比较

以太坊和比特币都是公链,所有的交易的地址在都是在网络中公开并永久记录。 用户在每次收入、消费时,都不可避免地会和现实世界的人打交道。比特币用户和钱包采用如下的两条准则保护用户的隐私:

  • 任一地址仅用于一次收款,一次付款。不可反复收款/付款。
  • 用户每次收款都推荐生成新的地址来接收款项。
  • 用户使用过的地址,即使余额为零也永远不删除,保留在钱包软件中。

这三条指导思想在比特币桌面客户端,以及轻量级手机比特币钱包中都得到了贯彻。最大程度保障了用户的隐匿性。而以太坊则恰恰相反,它鼓励的是:

  • 任何地址都可以被反复使用,收款/付款不受限制。一个人对应一个地址。
  • 以太坊地址除了接收以太币,还能接收其他数字资产。

那么,孰优孰劣呢?请思考如下的生活场景。

张三日常使用虚拟货币作为工资结算的方式。

  • 他租房生活,需要支付房租、去便利店购物,需要支付购物费用。
  • 当然,他也有些隐私的个人爱好需要用虚拟货币支付,他并不希望被人知道。
  • 他也和其他人进行虚拟货币面对面交易。

若张三使用 以太坊 ,张三的公开地址是唯一的,他的日常交易行为如下图所示。

../_images/Picture16.png

张三使用单一账户收工资、支付生活花费的示意图

在这种情形下, 使用以太坊账户比使用日常银行账户的隐私性还要低
  • 张三用唯一的账户来进行一切的日常活动,
  • 他的老板将每月发放给他的工资转账到张三的账户,
  • 如果老板在区块链中查询张三的地址,将会非常清楚张三每月的支出情况(交易记录在区块链上公开透明、永久保存);
  • 张三的房东因交房租与他有资金来往,也可以查询张三的公开地址,知道张三的每月固定收入情况与日常消费支出情况。
  • 当张三与他人进行面对面虚拟货币交易时,他人可以直接通过公开地址知道张三的账户中的虚拟货币余额,如果存量过多则容易引起他人歹念 。
  • 更有数据挖掘公司,从商店,房东等渠道收集与张三公开地址相关的各种信息进行汇总,最后得出张三的用户画像,和现在互联网广告商的行为类似。

若张三使用 比特币 ,张三的钱包 App将替他为每次接收比特币而自动产生新地址,如下图所示。

../_images/Picture17.png

比特币收款形式:多地址收款。灰色为张三控制的地址集合

这种情形下,隐私性得到了一定提升:
  • 老板每月发的工资都将被送入一个新地址(图中地址1、地址2、地址3)。
  • 每次付房租的时候,产生的找零也将进入一个新的地址。
  • 在旁观者看来,并没有一个总账户来明确知晓张三的隐形富豪身份。
  • 当使用持有比特币数额较小的地址和他人进行虚拟货币交易时,张三也不会因为持币数量过多而成为他人觊觎的目标。
  • 数据挖掘公司也更难以清晰勾勒出张三的用户画像,因为并没有一个地址反复有资金进出,所以无法分析该地址持有者的日常行为。

数据体积与并发能力

单一以太坊的账户状态其实是世界状态的一个子状态,在全网络的节点中都会留下一份相同的状态拷贝。 每次相关的交易将变更这个账户的状态。 而在对比之下,比特币仅有地址与交易两种数据记录在区块链上,它与持有人不挂钩,并没有保留一份与持有人相关的总和状态。

在系统设计中,以太坊与比特币选择了“空间换时间”和“时间换空间”的不同道路。这在编程领域中是非常经典的做法。

以太坊的账户仅维持一个账户的单一状态,任何状态的改写都是通过交易完成的,对于某账户的结算行为是串行执行的。 账户状态修改后同步到每个网络节点中备份。账户的状态占用硬盘空间体积小,易于查询。 但同时交易过程是不可并发的,只能一笔交易对状态修改完后,再进行下一笔交易。以太坊的交易输入也较为简单,为单一输入。

比特币的 UTXO 则不然。持有人拥有数个,甚至大量的未消费输出UTXO(类比持有多张纸币)。 查询到该持有人的总未消费余额需要花费时间在区块链上进行搜索。 当持有人想同时购买两样不同的东西,并分别为其支付的时候,他可以用不同的未消费输出UTXO来分开支付,发送交易请求到网络上。 交易的确认结算将有很大概率是并行的。这将大大提高对于单一持有人结算的速度。

发送交易时对双花的处理

在数字货币交易中,将一笔交易发送两次,企图让两次转账都获得网络确认的行为,称为双花(double spend)。在数字货币的世界中,经常会发生因为程序错误或者黑客故意反复发送交易请求的行为。这些情况在现实世界中的现金付款场景里是不存在的,纸币在购买前存在于买家手中,在购买后存在于卖家手中。一张纸币不可能同时出现在两处,也不可能被买家支付两次给不同的人。

比特币针对双花问题的处理较为简单直接。它通过共识机制的一部分:仅承认积累难度最高的链为公认链以及用对UTXO 总额检查的方式来防止该问题。举例说明,当交易者花费当前 10BTC 的 UTXO 发送两笔交易承诺付款,分别为6BTC 和8 BTC 时,两笔交易的“输入”方相同,为同一UTXO原地址。下面分两种情况进行讨论。

  • 情况一:矿工错误地打包这两笔交易进入同一个区块, UTXO 总额校验将发挥作用,计算得出 6+8=14>10,则同时包含着两笔交易的区块自动视为废块。所以只能择其一打包入块。
  • 情况二:当两笔交易分别隶属于不同矿工同时挖出的不同区块时,处在积累难度最高的链条的块将根据“最高链为公认链”原则而得到承认。另外一个链所在的交易块则自动被网络放弃。这个“最高”的链条的差异并不会在1~2个区块挖掘后迅速体现出来,需要经过5~6个块的追加后才能形成,类似于同一棵树干长出的两条不同的枝干,需要经过5~6年才能明确观察出哪个枝干更长。这也就是充值比特币时候常说的等待6个块确认后再确定转账成功的由来。6个块确认后一般最长的链条已经形成。

以太坊的账户模型里有nonce(已发送交易数)这个字段。它起到的作用不仅是防止双花,更是强制以太坊的状态 “有序化”。这是对它自身单一账户模型无法保留历史记录的补充。nonce字段在每发出一笔确认过的交易后就自动+1。例如,在以太坊上进行的某一次模拟双花攻击中,当攻击者的账户余额为100以太币的时候,他发出两笔交易nonce编号为“6” 和 “8”的交易。编号“6”的交易承诺付款90以太币,同时编号为“8”的交易承诺付款80以太币,这将大于他的总余额100以太币。 当以太坊网络接收到两个请求后,因为nonce必须有先后顺序,会优先处理编号为“6”的交易请求。而轮到“8”交易请求的时候会因为余额不足(100-90=10 < 80)而被自动拒绝。