翻译:子轩 校对:Neo MA
2018年8月,美国国家标准与技术研究院(NIST)发布了"Blockchain Technology Overview"一文,较为全面、客观地梳理了区块链技术。文章颇具价值,μNEST将其译成中文,以飨读者,并用十期进行系列连载。本期为系列连载的第七期,为大家详细介绍分叉和智能合约的相关内容。
5.分叉
在黄金时代不断求变和技术升级绝非易事。公链网络的用户分布在世界各地并由用户间的共识实现自治,任何改变都极其困难。对区块链网络进行协议和数据结构的改变称为分叉。分叉可分为两类:硬分叉和软分叉。对软分叉而言,改动对于没有升级的节点是向后兼容的。对硬分叉而言,如果节点不更新就会拒收改动后的区块,因此硬分叉的改动不向后兼容。这导致了同一区块链可能出现多个不同的版本(译者注:例如ETC与ETH,BTC与BCH)。由于出块节点和用户的信息是已知的,许可链网络通过要求软件升级可以减少分叉导致的影响。
在前文4.7节中提到,分叉也被一些区块链网络用来描述临时性的账本冲突(如区块链网络内两个或多个区块有相同的区块编号)。在这里是指账本中的一种临时性分叉,并非由软件变更所致。
5.1软分叉
由于软分叉是向后兼容的,所以未升级的节点仍可以和升级节点之间进行交易。如果没有(或很少)节点进行了升级,那么升级后的规则将不被执行。
一个发生在比特币上软分叉的例子是,添加新共识规则以支持第三方托管和时间锁退款。2014年曾有提议,修改“对指令CHECKLOCKTIMEVERIFY可不执行任何操作(OP_NOP2)”,该指令使交易的输出值在未来某一时点可使用。对那些实施了这一改动的节点而言,节点软件将执行新的操作,但对那些不支持改动的节点来说交易仍然有效,因为它就像执行了空指令(NOP)而已。
这里我们虚构一个软分叉,假设区块链决定减少区块大小(如从1MB到0.5MB)。已升级的节点将会调整区块大小并照常交易,而由于改动并未违反规则(区块大小不超过允许的最大上限),未升级的节点会将这些区块视为有效的。然而,如果未升级的节点想创建一个大小超过0.5MB的区块,已升级节点将拒绝视其有效。
5.2硬分叉
硬分叉是不向后兼容的。在某一特定时点(通常是个特定的区块号或高度),所有出块节点都需要切换到升级后的协议。另外,所有节点需要进行新协议的升级从而保证识别新格式区块。由于拒绝接收不符合版本要求规格的区块,未升级的节点无法在区块链上继续交易。
出块节点如不进行升级则将继续使用旧协议格式发布区块。未升级的用户节点将拒绝新格式的区块,只接收旧格式的区块。这导致了同时存在两个版本的区块链。值得注意的是,不同硬分叉版本上的用户彼此间无法互动。虽然大多数硬分叉是有意为之的,但软件错误也可能在无意间产生硬分叉。
以太坊的硬分叉事件为大家所熟知。2016年以太坊上创建了名为DAO的智能合约。由于智能合约的构造存在漏洞,攻击者窃取了当时价值5000万美元的以太币。以太的持有者对硬分叉的提议进行了投票表决,结果大多数用户同意硬分叉并创造了新版本的区块链。在修复该漏洞后,失窃的资产也被找回。
对加密货币而言,硬分叉造成的区块链分裂会让用户拥有两个分叉上的独立货币(即货币总量加倍)。由于两条链并不兼容,如果所有活动转移到新链上,那旧链也有可能被停止使用。在以太坊的硬分叉事件中,大部分支持者去了新链,旧链被重新命名为以太坊经典并继续运行。
5.3密码学改动与分叉
如果发现区块链网络中使用的密码学技术有漏洞,唯一可能的解决办法就是进行一次硬分叉,当然,这取决于漏洞的重要性程度。如果漏洞存在于底层算法,那么就需要一个硬分叉让所有未来的用户都使用更强大的算法。而选择新的哈希算法可能造成很严重的问题——所有现存的挖矿硬件都会失效。
假设SHA-256算法中发现了漏洞,使用SHA-256的区块链需要一个使用新哈希算法的硬分叉。转到新哈希算法上的区块会“锁住”之前所有使用SHA-256的区块(为了验证),所有新生成的区块需使用新的哈希算法。区块链网络可以根据自身需要从多种密码学哈希算法中进行选择。比如,比特币选择了SHA-256,而以太坊则选择了Keccak-256。
一种可能的情况是,现在区块链网络中的密码学功能需要进行调整,以应对量子计算机的发展,因为它会大大削弱(一些情况下,甚至是可以说废掉)现有的一些密码学算法。NIST内部报告8105就是关于后量子密码学的,里面有一张表描述了量子计算对一些常用密码学算法的影响,详见下面的表2。
表2:量子计算对普通密码学算法的影响
如果强大的量子计算机真的成为现实,那绝大多数区块链依赖的非对称密钥的算法都需要被替换。这是因为,基于大整数分解复杂计算(如RSA)或解决离散对数(如DSA,DH)的算法在量子计算面前将显得不堪一击。区块链网络使用的哈希算法在面对量子计算攻击时的情况会稍好一些,但依旧羸弱。
6.智能合约
智能合约最早可以追溯到1994年。Nick Szabo是这样定义智能合约的:一个执行合约的计算机交易协议。智能合约的设计满足了契约性场景的要求(如付款、质押、涉密,甚至强制执行),最小化了恶意行为和偶发状况地同时,最小化了对信任中介的需求。
智能合约扩充并推动了区块链技术。智能合约是被密码学签名部署在区块链网络中的代码和数据(有时也指功能和状态)的集合(如以太坊智能合约,超级账本Fabric的链码),并被各节点执行。所有执行智能合约的节点必须得到相同的处理结果,该结果将被记录在区块链上。
区块链用户可以通过向智能合约提供的公共功能发送数据来创建交易。智能合约调用相应的方法为用户输入的数据提供服务。链上的代码是防窃取和防篡改的,因而可以被视为第三方的信任主体。智能合约可以执行计算、储存信息、显示公开状态,并向其他账户自动拨款,而这并不意味着智能合约只能提供金融服务功能。例如,本文的作者创建了一个以太坊智能合约并公开生成可信的随机数。当然,并不是所有区块链都能运行智能合约。
智能合约代码可以代表多方交易,这通常体现在商业进程中。在多方参与的场景中,智能合约具有诸多优势:提供防篡改的数据、过程透明以培养信任感、支持更好的商业决策、降低传统B2B应用中的沟通成本、缩短交易时间。
智能合约必须是确定性的,给定的输入值总是输出相同结果。此外,所有执行智能合约的节点必须一致认可(智能合约)执行后的新状态。为此,智能合约不处理调用它时给定参数之外的外部数据,任何智能合约使用来源于外部系统的数据时需要借助“预言机”。
对许多区块链项目而言,出块节点在出块的同时执行智能合约代码。在一些区块链项目中出块节点在发布新块时不会执行智能合约代码,而是对其他运行智能合约节点的结果进行验证。在使用智能合约的公链网络中(如以太坊),用户向智能合约发起交易需要为代码执行的消耗付费。基于代码的复杂程度,当智能合约触发时有多少执行时间可以被消耗有明确的限制。如果超过限制,执行进程立即停止,交易被放弃。该机制不仅奖励节点执行智能合约代码,也防止了恶意用户通过部署占用大量或所有计算资源的合约(例如无限循环调用)来对节点发起拒绝服务攻击。
对使用智能合约的许可链网络而言,比如那些使用超级账本链码(的项目),用户就不一定要为智能合约的代码执行付费。许可链网络内的用户彼此相识,可以使用其他方法防止作恶行为(如取消准入)。
前六期内容回顾:
https://mp.weixin.qq.com/s/yUbV1BOknCg5TP1xh8YYAg
联系我们
Homepage:iotee.io
Facebook:NESTchain
Twitter:@miuNEST
Telegram:@miuNEST
Reddit:r/miuNEST
Medium:r/miuNEST
Steemit:μNEST
微信公众号二维码
Congratulations @jeff-miunest! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :
Click here to view your Board
If you no longer want to receive notifications, reply to this comment with the word
STOP
Do not miss the last post from @steemitboard:
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit