智能合约导引


#1

1 智能合约

本文所描述的合约皆建立在区块链技术层面之上。虽然区块链合约(下称合约)当前发展迅速而且种类繁多,但是主要分为4大类:比特币类,侧链类,以太坊类,混合类。其中混合类诸如EOS的WASM(WebAssembly)、SIA的文件合约(File Contract)、IPFS结合以太坊合约(Eth Contract)、BSTK结合以太坊合约(Eth Contract)等等。

接下来的篇幅主要是集中在BSTK的合约设计与实现方面。BSTK属于混合类合约实现方案,结合了比特币、侧链、以太坊、交易压缩、闪电网络、隔离见证等若干技术。与之相较,偏向比特币类的合约技术MAST(Merkelized Abstract Syntax Trees)仍旧表现的很朦胧。

1.1 什么是智能合约

历史角度:智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易。这些交易可追踪且不可逆转。智能合约概念于1994年由Nick Szabo首次提出。摘自wikipedia 。

技术角度:[1] 合约参与方编写代码并签名,然后上链(托管第三方) [2] 链上验证、共识、履行(执行)合约 [3] 履行成功,参与方资产按照合约约定重新分配;履行失败,参与方资产将原路返回

Fig 0. 代码形式的合约

平台角度:类DAO(Decentralized Autonomous Organization),类众筹平台(Crowdfunding Platform)。传统众筹平台需要合约第三方参与,属于典型的中心化方案,缺点有很多,不做赘述。智能合约平台也需要合约第三方参与,不过使用的是区块链方案,借助区块链的分布式计算、共识、密码学等优势来达成合约的审计与履行。
image

Fig 1. 传统众筹平台
image
Fig 2. 智能合约平台

1.2 为什么需要智能合约

本文所有合约都是基于区块链技术之上来阐述,所以智能合约优势的发挥离不开区块链的属性。

问题1:没有区块链,合约以及履行合约的系统会带来那些缺陷?
答:中心化第三方设计本身就是不可靠的。制定和履行合约的人会犯错,会带来合约所描述的业务风险以及实施代价增高;合约数据易被篡改或灭失。

问题2:使用区块链,合约以及履行合约的系统会具有那些优势?
答:[1] 区块链不可变性,这意味着智能合约永远不会改变,没有人可以篡改或违反合约 [2] 分布式,这意味着合约的结果由网络中的每个人(网络节点)验证,就像区块链上的任何交易一样。分布式使攻击者无法强制控制释放权益归属资产,因为所有其他参与者都会检测到此类尝试并将其标记为无效(单点攻击无效)。
image

Fig 3. 基于区块链分布式特性的合约优势

1.3 朦胧的智能合约

-智能合约当前仍旧出于萌芽期。因为以太坊的智能合约漏洞百出,然而比特币依旧是最稳定和难以攻破的系统,所以本文使用BSTK方案作为智能合约设计与实现的技术选择。关于为什么以太坊智能合约漏洞百出,参见MIT技术洞见。

-智能合约不具备灵活性。相比于传统合约或者法律凭证,如果需要调整,那么得到的只能是干巴巴的拒绝,这会导致智能合约技术的使用范畴变的狭窄。

-智能合约的双刃剑。智能合约是图灵完备的,导致了合约的复杂度无限升高。复杂意味着更多能力,但也伴随着更多错误以及惨痛的代价。脚本系统是非图灵完备的,这也说明为什么比特币系统非常牢靠的原因之一。

-智能合约是合约吗?不是,确切的说是“代码约定”,因为智能合约并不具备符合人类社会一般要求的合约属性。当下大多数情况,所谓“智能合约”只是利益驱使炒作的技术噱头而已。

1.4 智能合约的优势

-直接与对方打交道。 智能合约消除了对中间方的需求,并允许与对方建立透明,直接的关系。

-分布、可用、严格履行。 由于参与者不依赖于第三方,因此没有任何一个人或实体控制数据或资产。 即使任何个人离开区块链网络,网络也将继续运行而不会丢失数据或失去完整性。

-信任。 区块链协议决定数据一经登记上链是不可改变的,智能合约同样作为上链数据具备不可变性。

-欺诈减少。 由于智能合约存储在分布式区块链网络中,因此其结果将由该网络中的每个人进行验证。 因此,没有人可以强制控制释放其他人的资金或数据,因为所有其他区块链参与者都会发现这一点并将此类尝试标记为无效。

-成本效益。 消除中间方可以免除额外费用,使企业及其客户不仅可以直接进行互动和交易,而且可以在交易中收取低费用或不收取任何费用。

-持续记录与审计。 所有合约、交易都按时间顺序存储在区块链中,并且通过区块链可追溯性达到审计合约履行结果的目的。

1.5 智能合约的应用

智能合约相对应用范围比较广泛,在很多业务领域都能够见到智能合约的身影。常见的应用领域例如物联网、分布式电商、分布式存储、医疗大数据、人工智能等。值的思考的是随着业务领域的复杂度升高,合约的拟定与履行将成为一件复杂的事情。如Fig 4.所示,如果停留在普通货币资产层面,合约的实施比较现实和可行,但是进入到自治层面,例如自治业务、自治组织、自治政府、自治社会,合约的实施还有待观察,毕竟越倾向于社会层面,其维度与复杂度都是难以想象的,毕竟合约仍旧处于萌芽期。
image

Fig 4. 智能合约的应用

2 BSTK设计与实现

BSTK技术地图

-侧链(SideChain)与2WP(2 Way Peg)
-联合楔入(Federated Peg)
-单一托管(Single Custodial)
-简单支付验证证明(Simple Payment Verification Proof,SPV Proof)
-联合挖矿(Federated Mining)
-驱动链(DriveChain)
-交易压缩协议网络(Lumino Transaction Compress Protocol Network,LTCP Network)

2.1 侧链

2.1.1 什么是侧链

侧链是附生在主链之上的区块链网络。侧链与主链的角色能够互换,属于相对概念。常见主链是基于比特币系统的网络。

2.1.2 为什么使用侧链

面向主链层面:
-主链轻易不能变更,太多尝试和创新需求就需要放在侧链实现
-主链软硬分叉的代价过高,分布式系统上线之后往往维护难度远远高于中心化系统
-主链现行规则和协议不能打破

面向市面上山寨币层面:
-创新少,投机多
-链生态碎片化,难以统一
-缺乏验证机制、缺乏安全、缺乏数量和质量上的交易所

面向其他技术:
-基于比特币区块链技术的类侧链,例如万事达币Omni/MasterCoin,合约币Counterparty(XCP),基于Omni实现的TetherCoin等,但都不是侧链
-非比特币区块链技术的类侧链,例如染色币ColoredCoin等,纯粹只是应用层实现

2.1.3 侧链设计基础

如Fig 5.所示,Parent Chain代表主链,SideChain代表侧链,主链上Alice把币锁到特殊地址,然后确认若干区块,发送SPV proof到侧链,侧链收到SPV proof之后,创建侧链币指向Alice在侧链的地址,然后在侧链确认若干个区块。
image

Fig 5. 单向楔入与SPV Proof

-单向楔入。单向楔入是一个过程,是指从链的一侧锁定资产,经过“等待期”之后,向另一链发送SPV Proof,然后创建该侧链的等价资产,经过“竞争期”之后,该用户该侧资产就可以被激活可用。

-SPV Proof。简单支付验证证明基于区块链的区块头和PoW Proof获得。包括PoW Proof的确认高度,锁定资产的交易对应的区块的块头信息(Merkle root,锁定交易到根的构造路径Hash值,Nonce值,上个区块PreHash值)

2.1.4 单向楔入侧链问题

问题:
-为了支持单向楔入侧链实现,网络设计变的复杂
-钱包变的复杂,要求支持多币种
-趋于网络中心化
-无法避免主链软分叉风险
-侧链被51%攻击很容易 例如偷币,银行挤兑,使用者不愿承担侧链损失难以推广等问题

方案:
-针对攻击问题,侧链可采用联合挖矿(Federated Mining),篇幅有限,不做赘述
-针对安全问题,侧链可以采用zk-SNACK,也就是ZCOIN引入并实现的加密学技术

2.2 双向楔入

双向楔入分为四个阶段,具体如下。
-发送锁定交易,把比特币锁定在比特币主链上。
-等待确认期。确认期的作用是等待更多区块确认锁定交易,可防止假冒锁定和拒绝服务攻击,等待时间是1~2天。
-在侧链上赎回比特币。上述确认期结束后,用户在侧链上创建一个交易花掉锁定交易的输出,并且提供一个SPV工作量证明,输出到自己侧链上的地址。这个交易也称为赎回交易,SPV工作量证明是指赎回交易所在区块的工作量证明。
-等待一个竞争期。竞争期的作用是防止双重支付,在此期间,新转移过来的币不能在侧链上花费。竞争期的目的是防止重组时出现双花,在重组期间会转走先前锁定的币。在这个延迟期内的任何时刻,如果有一个新的工作证明发布出来,且对应的有着更多累计工作量的链中没有包含那个生成锁定输出的区块,那么该转换将被追溯为失效。我们称此为重组证明。

image
Fig 6. 双向锚定示意图

竞争期结束后,这个赎回交易将被打包到区块中,用户就可以使用自己的比特币了,从侧链转移比特币的过程也是如此,当用户想把币从侧链上转回父链时,与原先转移所用的方法相同:在侧链上将币发送至一个SPV锁定的输出,并产生一个充分的SPV证明来表明该输出已经完成,然后使用这个证明来解锁父链上先前被锁定的那个等面值的输出。

由于楔入式侧链可能会从很多链中搬运资产,且无法对这些链的安全性做出假定,因此,不同资产不可相互兑换是非常重要的(除非是一个显式声明的交易)。否则,恶意用户可以通过创建一条资产毫无价值的无价值链进行偷盗,即将这样一种资产移到一个侧链,再用它去兑换别的东西。为了应对这种情况,侧链必须有效地将不同父链中的资产处置为不同的资产类型。

总之,我们提议让父链和侧链相互做数据的SPV验证。由于不能指望父链客户端能看到每条侧链,因此为了证明所有权,用户必须从侧链导入工作量的证明到父链。在对称式双向楔入中,反向的操作也是如此。

为了让比特币系统成为父链,需要有一个能识别和验证SPV证明的脚本扩展。最起码的要求是,这种证明需要做得足够小,以便能放进比特币系统一个交易之中。不过,这只是一个软分叉,对于不使用新功能的交易不会产生影响。

2.3 驱动链

2.3.1 为什么使用驱动链

因为主链如果是比特币区块链系统,或者是比特币区块链叉出的新型公链系统,例如根源链,实现双向锚定会复杂化。前文也提到过,主链的变动最好没有,或者很小,因为主链的变更会带来很大的风险与代价。

2.3.2 驱动链

驱动链将被锁定比特币的监管权交给比特币矿工,并且允许比特币矿工们投票决定何时解锁比特币和将解锁的比特币发送到哪里。矿工使用比特币区块链投票,使用区块里的某些字段来实现投票(例如 coinbase 字段)。越多的诚实矿工参与进来投票,则安全性就越高。下图是对驱动链的描述:

Fig 7. 驱动链过程示意图

2.4 Lumino 交易压缩协议网络

Lumino 交易压缩协议网络(Lumino Transaction Compress Protocol Network,LTCP Network)是类似于Lightning Network的技术,Lumino是一种新型的链下支付渠道网络。

2.4.1 闪电网络问题

如果闪电网络覆盖数十亿用户,仍旧产生大量的链上交易。每当一个中心出现问题或者当一方消失的时候,这样的情况就会发生。此外,用户需要经常给他们的支付通道补充余额,这就需要更多的链上交易。假设每个用户每个月都使用一个主要的支付通道,那么每个通道每个月也需要结算,并且要求不会出现重大问题的节点,这样吞吐量才能够容纳 200 万用户使用支付通道。总之,当基数飙升后,闪电网络的压力依旧很大,依旧不能根本解决性能问题。

2.4.2 LTCP方案

LTCP 协议貌似可以只占用区块 5 字节的空间来完成余额更新,将能够容纳 10 亿用户使用 BSTK侧链系统。技术细节参见LTCP。

2.5 BSTK设计与实现

Fig 8. BSTK混合侧链过程示意图

2.5.1 为什么混合

当矿工参与联合挖矿的程度比较低时,“驱动链/侧链”的安全性是很低的。为了保证整个网络安全运行,采用双向锚定在侧链,驱动链在主链的混合设计方式。

2.5.2 设计要点

-主链的安全性是基于驱动链外加一组公证人。
-矿工和公证人(拥有不同的权重)共同投票决定解锁哪些主链资产。
-公证人使用数字签名进行投票,而矿工则在他们的 coinbase 交易中写入一个特殊的标记进行投票。

因此,这是中心化和安全性之间的一种权衡博弈。最终的“类双向锚定”设计可以被称为“驱动链+公证人+2WP”的侧链设计。