原文:2017-02-07谈谈区块链(18):以太坊的UTXO,作者谈国鹏
参考:2017-02-03 其实并没有什么比特币,只有 UTXO,作者 孟岩 渡鸦
(谈国鹏)谈谈区块链(18):以太坊的UTXO
本来并没有计划写这篇文章,只是这两天微信里有一篇文章传播的比较厉害,叫:《其实并没有什么比特币,只有UTXO》。其中有这么一句话:HyperLedger 和Ethereum 一开始并没有采用 UTXO,现在前者已经切换回 UTXO,后者打算增加这个选项。很多朋友过来问我有没有这么回事,所以专门写一篇文章来阐述我的观点。
困扰之源
UTXO 代表 Unspent Transaction Output。
在比特币社区里,Transaction 被简称为 TX,所以上面这个短语缩写为 UTXO。一般会认为 UTXO 是比特币区块链设计当中的一部分,但事实上 UTXO 和区块链没有必然的联系,你可以完全照搬比特币区块链,但不使用UTXO。
HyperLedger 和Ethereum 一开始并没有采用 UTXO,现在前者已经切换回 UTXO,后者打算增加这个选项。我觉得这也是中本聪的过人之处——后来者照着临摹,中间想搞点小改进,结果做到后面,发现还是人家原版的水平高,纷纷又改回来…..
这篇文章给大家造成很大的困扰,是因为大家都知道以太坊和Hyperledger当前都是基于账户模型的,没有任何UXTO的概念。而作者在文章中指出Hyperledger已切换到UTXO,以太坊也在考虑增加,究竟是怎么回事。
首先说Hyperledger fabric
fabric里连代币都没有(比特币里有比特币,以太坊里有以太币),说什么UTXO就没头没脑了。遍查fabric1.0的整个代码,只在chaincode example里找到一些关于UTXO的内容,那只是用chaincode实现对比特币UTXO的一个存储功能,而且只是一个智能合约的示例。
那作者为什么说fabric已经切换到UTXO了呢?
遍查网络,的确发现了相关的内容。
- 一篇是ConsenSys的文章,开头第一句话就是:
Recently there has been a proposal to have UTXO based architecture as the fabric of the Hyperledger project.
(网址:https://medium.com/@ConsenSys/thoughts-on-utxo-by-vitalik-buterin-2bb782c67e53#.sttqvpfqe )
- 另一篇是数字资产公司(Digital Asset Holdings)的文章,里面说到:
We are also switching from our simplistic notion of accounts and balances to adopt to de facto standard of the Bitcoin UTXO model, lightly modified.
(网址:https://digitalasset.com/press/hyperledger-beta-retired.html )
这些似乎印证了作者的观点。但实际不然,因为这两篇文章都是时间比较老(2016年3月份),在那个时间点的确有那样的建议和讨论。并且很显然当前代码里没有任何UTXO,所有的代码和工作模式仍然是账户模型。
我们在网络上继续寻找,在Reddit的帖子上找到了关于这方面的讨论:
Both Vitalik and ConsenSys do indeed believe that UTXO is unnecessarily complicated to serve as the Hyperledger fabric.
所以结论是:fabric的UTXO只是曾经的一个讨论,目前并没有在fabric 1.0中实现。而且以后如果要增加的话首先得为fabric引进自己的代币。我个人的观点认为,fabric为商用智能合约系统设计,基于账户模型更加合适。
下面我们说以太坊的UTXO。
以太坊的确是在考虑引进UTXO,但是此UTXO非彼UTXO。并不是像大家想象的那样,用UTXO来替换现有的账户模型。
首先以太坊为智能合约而设计,其账户模型里除了有余额(balance),还有智能合约代码,还有nonce(为防止重放攻击),以及自定义的存储。把这些换成UTXO显然不合适,因为UTXO胜任不了。比特币的UTXO里只有一个简单的属性:余额(balance)。
那么以太坊的UTXO是指什么呢?这就是以太坊的另一个话题了:分片(Sharding)。
分片是扩展以太坊、增加TPS的有效方法,目前正在社区里被广泛讨论和研究。目前的以太坊的工作模式是所有节点(比如共16万个)同时验证所有交易,实际上这是极度低效和没有必要的一种模式。为了保证一致性,如果我们按照地址的前4位来分片,可以把所有地址分成16片。这样每个交易只需要其中1万台节点验证便可通过。如果一个交易涉及的账户都在同一片区并没有什么问题,但如果涉及到不同片区问题就来了。
为了解决不同片区之间的交易问题,以太坊设计出了称为收据(receipt)的工作模式。而这个收据的模式和UTXO类似,故而也称为以太坊的UTXO。
既然此UTXO并不是指替换当前账户模型,变成比特币模式的UTXO,那么是不是说明当前账户模型就没有问题呢?也不是!当前账户模型的确存在一些弊端。
以太坊中以太币的转移安全性不如比特币高。
下面是一个真实的例子。一个网友请我帮忙,让我帮助从Yobit.net追讨258个ETH。原因是他从Yobit.net转移币到云币网账户时,发生了out of gas错误。云币网给出的目标地址是一个合约地址,而Yobit.net以为是个外部地址,交易设置的gasLimit为21000(这对于合约账户就不够了),因此发生了out of gas的异常。币的转移被取消,但是这个交易(Transaction)却是完成的。
Yobit.net系统以交易成功作为币转移成功的依据,所以出现了问题。而这些问题是在UTXO模型里不会发生的。
所以针对这些问题,以太坊社区为提高转移以太币的安全性,也在考虑设置更加抽象的账户模型,把控制权交给EVM(智能合约层面),这样每个用户可以自定义自己的账户模型。通过智能合约能够实现任意的账户模型,比如UTXO。
这些都还没有发生,但是我相信UTXO也将在未来的以太坊中扮演重要的角色!
更多内容请关注谈谈区块链的微信公众号:ttblockchain。
(孟岩)其实并没有什么比特币,只有 UTXO
参考:2017-02-03 其实并没有什么比特币,只有 UTXO,作者 孟岩 渡鸦
那么UTXO高在哪里?
比特币的很多技术点都不是中本聪的原创。比如:
- 基于“工作量证明(Proof-of-Work)”的共识达成机制是Adam Back在 Hashcash 里提出来的;
- 将全部交易计入一本总账、并给交易打时间戳来防范双花攻击(double-spend attack)的思想是Wei Dai的b-money和Nick Szabo的Bitgold提出来的,
- 更不用说比特币网络是零优化的大水漫灌式P2P网络,仅就 P2P 技术而言,很多方面还赶不上2001年出现的 BitTorrent 。
但是有三个技术点绝对是中本聪原创,一个是区块链的设计,一个是UTXO,一个是智能合约。而这三个设计是极为天才的,被斯坦福大学密码学和计算机安全教授 Dan Boneh 评价为“extremely brilliant”,“必将激发无穷的创新”。
技术手段与经济机制的融合
当然,但中本聪最了不起的地方并不是这三个单点创新,而是将所有这些技术点跟密码学货币自身特点相结合,设计了一套“惩恶扬善”的经济激励制度,将技术创新与制度设计糅合成一个严丝合缝的体系。
在这个体系里,任何人都可以建立一个匿名节点,编写破坏性的代码,然后实施匿名攻击,即便你攻击得手、偷来大笔财富,也不会暴露身份,所以可以逍遥法外。
这个系统赤身裸体,开门揖盗,任由你攻击破坏,甚至如果你成功的突破防线偷来一大笔财富,整个比特币体系不但不会惩罚你,还会坚定的保障你的赃款。然后悬赏100亿美金,运行七年,至今为止,在主干区块链上,没有发生一起成功的攻击,一次都没有。
中本聪把比特币设计得跟数学原理一样漂亮,很多后来者连抄都抄不到这个水平。我想这就是为什么加州大学洛杉矶分校的金融学教授 Bhagwan Chowdhry会提名中本聪为2016年度诺贝尔经济学奖候选人。我相信中本聪在比特币里的很多设计思想,以及整个比特币开发者社区所做的大量改进,不仅是区块链的开山之作,而且也会成为IT系统设计的一个创新思想源泉。
UTXO 的设计就很值得玩味。在《什么是UTXO》一文中对其设计方案进行了介绍。本文要讨论的是UTXO 的优点和不足。
中本聪为什么要把比特币设计成这样呢?考虑到他应该也不是从未来穿越回来的人物,以常理推论,他一开始应该也是从基于账户的系统出发来设计的,但他后来决定切换到UTXO方案,一定是遇到什么问题。
很遗憾,比特币的源代码里找不到这些问题的答案。比特币的开发始于2007年5月,目前在Github 上最早的一版比特币源代码是2009年9月16日中本聪 push 上去的 0.1.5 版,但其中 UTXO 的设计已经成型。
后来有人翻出自己的老邮件,找到了比特币2008年9月版的代码。那份代码是比特币区块链上线之前几个星期发布的,应该非常接近比特币创世纪运行的那个版本。可如果你仔细去看的话,其中 UTXO 也已经定型。我们注定无法通过代码考据来发现 UTXO 的设计脉络了。
其他文献材料呢?也不行。中本聪在发表比特币之前,主要是与一些密码学专家邮件交流,这些邮件外界看不到。而他积极参加论坛讨论,主要发生在比特币已经发表以后。我找不到他在 UTXO 设计形成过程之中发表过任何相关的只言片语。
既然这些办法都不行,我们就只好靠猜了。
我猜测,中本聪一开始设计比特币时,也采用了账户方案。但在2007年下半年或2008年上半年的某一个时刻,中本聪发现基于账户的方案有问题,于是创造了 UTXO 方案。
那么基于账户的方案会遇到哪些问题呢?
如果采用基于账户的方案,可以肯定的是,你需要一个数据库。这个数据库能够让你很方便的查到张三、李四各自的账户余额。
而 UTXO 方案当然也需要一个数据库,这个数据库记录着当前系统里每一笔“没有花出去的交易输出”,也是就比特币。当节点接收到一笔交易的时候,它需要去 UTXO 数据库里查,看看这笔交易所引用的 UTXO 是否存在,它的收款人(拥有者)是不是当前新交易的付款者。而交易结束之后,数据库要做相应的更新。
首先要明确,无论是账户数据库还是 UTXO 数据库,必须是分散的,每结点一个克隆,一定不能是中心化的。如果比特币系统有一个中心数据库,不管你有多少节点,每一笔交易都要跑去中心数据库验证一下、然后再执行“转账”的事务操作,那就完全谈不上“去中心化”,比特币就毫无价值了,不如老老实实用支付宝。
既然都是每个节点克隆一个数据库,根据交易过程同步修改,那么一个账户数据库跟一个 UTXO 数据库,又有什么分别呢?
进一步思考,我们会发现还是有很大分别。
首先,长期来看,账户数据库会无限膨胀,而UTXO 数据库体积会小很多。要知道,比特币是个匿名体系,它的账户就是“地址”。每一个比特币用户可以拥有几乎无限多的地址,在比特币系统来看,它完全不知道两个地址背后对应的是不是同一个人。