深入理解以太坊系列(1): 比特币的局限性

比特币是具有划时代意义的伟大创新,如其白皮书名称所示,其主要目的是构建一个点对点的电子现金系统,实现去中心化的交易。比特币重点解决了双重支付问题,其试验发明让世人认识了很多新的概念:工作量证明、挖矿、区块链、数字货币钱包等。比特币的成功带动了数字货币的兴起,在其后最具有重大创新意义的项目便是以太坊。

从本篇文章起,我将陆续开始深入理解以太坊系列的撰写。有了比特币的基础,学习以太坊会相对容易一些,以太坊的很多设计都借鉴了比特币,其中最为人们熟知的便是智能合约。与比特币的学习方法类似,通过阅读白皮书作为了解以太坊的开始。以太坊白皮书是一个在时刻更新的版本,其最新在线文档地址是:https://github.com/ethereum/wiki/wiki/White-Paper

从以太坊的角度来看比特币,会有新的启发。

状态转换系统

statetransition.png

以太坊白皮书将比特币账本解释为一个状态转换系统。状态转换函数是以当前状态S和交易TX为输入,输出新的状态S’:

APPLY(S,TX) -> S' or ERROR

1.验证交易TX的每个输入:
如果引用的UTXO不存在于现在的状态中(S),返回错误提示
如果签名与UTXO所有者的签名不一致,返回错误提示
2.如果所有的UTXO输入面值总额小于所有的UTXO输出面值总额,返回错误提示
3.返回新状态S’,新状态S’中移除了所有的输入UTXO,增加了所有的输出UTXO

比特币系统的“状态”是所有已经被挖出的、没有花费的比特币(技术上称为“未花费的交易输出,unspent transaction outputs 或UTXO”)的集合。

比特币的局限性

比特币之后的去中心化应用,核心是实现共识协议,通常有三种方法:

1. 建立一个独立的网络
2. 在比特币系统上建立协议
3. 在比特币系统上使用脚本

第一种方案需要重新实现共识协议,每一个应用都需要创建独立的区块链和建立、测试所有状态转换及网络代码,需要花费大量的时间,难以实现。

第二种方案基于比特币,但却没有继承比特币可以进行简化确认支付(SPV) 的特性,可扩展性差。

第三种方案采用比特币的脚本语言,不过由于语言限制,开发能力较有限。白皮书中阐述了其具体的局限性:

缺少图灵完备性 – 尽管比特币脚本语言可以支持多种计算,但是它不能支持所有的计算。最主要的缺失是循环语句。不支持循环语句的目的是避免交易确认时出现无限循环。理论上,对于脚本程序员来说,这是可以克服的障碍,因为任何循环都可以用多次重复if 语句的方式来模拟,但是这样做会导致脚本空间利用上的低效率,例如,实施一个替代的椭圆曲线签名算法可能将需要256次重复的乘法,而每次都需要单独编码。

价值盲(Value-blindness)。UTXO脚本不能为账户的取款额度提供精细的控制。例如,预言机合约(oracle contract)的一个强大应用是对冲合约,A和B各自向对冲合约中发送价值1000美元的比特币,30天以后,脚本向A发送价值1000美元的比特币,向B发送剩余的比特币。虽然实现对冲合约需要一个预言机(oracle)决定1比特币值多少美元,但是与现在完全中心化的解决方案相比,这一机制已经在减少信任和基础设施方面有了巨大的进步。然而,因为UTXO是不可分割的,为实现此合约,唯一的方法是非常低效地采用许多有不同面值的UTXO(例如对应于最大为30的每个k,有一个2^k的UTXO)并使预言机挑出正确的UTXO发送给A和B。

缺少状态 – UTXO只能是已花费或者未花费状态,这就没有给需要任何其它内部状态的多阶段合约或者脚本留出生存空间。这使得实现多阶段期权合约、去中心化的交换要约或者两阶段加密承诺协议(对确保计算奖励非常必要)非常困难。这也意味着UTXO只能用于建立简单的、一次性的合约,而不是例如去中心化组织这样的有着更加复杂的状态的合约,使得元协议难以实现。二元状态与价值盲结合在一起意味着另一个重要的应用-取款限额-是不可能实现的。

区块链盲(Blockchain-blindness)- UTXO看不到区块链的数据,例如随机数和上一个区块的哈希。这一缺陷剥夺了脚本语言所拥有的基于随机性的潜在价值,严重地限制了博彩等其它领域应用。

以太坊的目标是可以运行智能合约的去中心化平台。可以理解为是一个去中心化的状态机或是计算机网络,用户可以通过内置的图灵完备的编程语言来创建合约并自动执行。