智能预言机:一种简单、强大的执行智能合同的方法
时间:2014-08-04 来源:巴比特 作者:少平(@鱼看见水)
我们的制度想当然地认为我们仍然生活在纸媒介的世界。我们用纸质的合同,纸质的法律确认我们的关系。 智能合同减少了由合同原则,第三方,或者他们的工具所施加的精神和计算的交易成本。搜索阶段、协商阶段、承诺阶段、执行阶段和裁定阶段构成了智能合同。 -尼克·萨博 《在公共网络上确认关系并保证关系安全》(1997) 综述 智能预言机(smart oracle)提供了一种简单、灵活的实施智能合同(smart contract)的方法,将商业逻辑,法律和其它一致同意的规则翻译成代码。智能预言机建立在预言机,或者向智能合同提供真实外在世界信息的实体的理念上。在这样的系统内,规则可以被任何一种编程语言翻译成代码,合同可以与任何接收加密签名命令的服务相交互。这包括,但不限于,密码学货币网络。我们引入一种智能预言机,称为Codius(码律,在拉丁文中“ius”表示法律),利用谷歌的本机客户端(Native Client)作为代码沙盒。 在这篇论文中,我们先介绍一些定义和智能合同概念的背景。接下来我们介绍我们设计的智能预言机和描述一些技术实施细节和这一系统的安全威胁模型。最后一部分,我们描述一些智能合同的金融和非金融应用,以及智能预言机整体对智能合同的巨大潜力。 #FormatImgID_0#定义 智能合同(smart contract) 智能合同是程序,它们将条件和结果写成了代码。这些代码事先获得了合同参与方的一致同意,而且代码必须由诚实的中立系统执行。 开发和利用智能合同主要有以下三个关键步骤: 1. 将合同条款翻译成代码。因为数字系统是完全确定的,所以合同的所有可能的结果,包括对违背合同行为的惩罚和仲裁者(非确定的),必须明确地说明。 2. 就将要运行的代码达成一致意见。实际上,合同参与方应用广泛使用的结构化合同模块建立他们的合同。一旦这些合同被同意,保证最终执行的代码是先前的代码是非常重要的。 3. 以值得信任的方式执行代码。代码必须由中立的第三方或者一组独立的、极不可能勾结的实体运行。智能合同也可以不用执行代码,细节参见线下合同部分。 使用智能合同而不是传统合同的好处是更快的执行速度,更加有效和精确的按照达成的协议进行。 预言机(Oracle) 一些智能合同系统,包括建立在比特币上的,都是严格确定的。为了与真实世界交互,这些系统依靠被称为“预言机”的外部系统提交的加密签名信息。 预言机是可信任的实体,它签署关于外部世界状态的信息。因为签名确认可以很明确地实现,预言机允许确定的智能合同对不确定的外部世界作出反应。 智能预言机或者合同主持者(Smart Oracle or Contract Host) 智能预言机的理念在下一部分中详细解释,但是使用术语”智能预言机”和“合同主持者”是同义的。 合同参与方(contracting parties) 合同的参与方是同意使用智能合同执行协议的人或者企业。其它相关的实体是合同的作者和合同的所有者。合同作者就是写代码的人。例如,作者可以是一个或者一组发表了开源拍卖合同的开发者。合同的所有者就是准备好合同,让智能预言机执行的实体。 注意,合同的主持者不应该是合同参与者的任何一方或者与他们有关联的实体。 公/私钥密码学 公/私钥密码学使得信息可以被加密或者被翻译成一组任意的字符。当信息被公钥加密时,只有相应的私钥可以解密。 公/私钥密码学也使得私钥的持有者可以加密地对信息进行签名。任何人都可以明确地确认这一签名只有私钥的持有者才能创建出来。 公/私钥密码学也是智能预言机的基础,所以了解基本的非对称加密和加密签名的工作原理是非常有用的。更多的密码学知识,我们推荐维基百科的文章:公钥密码学和数字签名和简化的公钥密码学解释 分布式网络和共识数据库 虽然Codius智能预言机项目独立于所有现有的分布式网络,共识数据库和密码学货币,但是它深受比特币和瑞波的启发。了解比特币这一点对点网络和数字货币,请看bitcoin.org。了解更多的瑞波这一可以转移任何类型价值的分布式协议,请看ripple.com。 从预言机到智能预言机 智能合同和预言机的概念提出来已经有一段时间了。几个较早的设计(包括比特币)依赖于在共识网络中执行合同,这要求合同的执行是确定的。在这篇论文中,我们打算说明,在智能预言机中执行合同能够显著地推广和简化系统。 智能合同概念的提出主要归功于尼克·萨博,他在1990s后期认为确认关系和将关系编码到软件和硬件,将简化商业逻辑和功能,并保证安全。他写过合同条款,例如债券和产权合同。萨博认为自动贩卖机是智能合同的“祖先”,因为它的硬件和软件执行了一个简单的合同协议。任何一个向自动贩卖机投钱的人都会得到零食,自动贩卖机的所有者甚至并没有明确说明合同。戴伟在1990s年,在他的B-money提议中也写过数字合同,描述了自我执行的、基于密码学的合同,与萨博的理念相似。 最近人们对密码学货币兴趣的激增重新燃起了对智能合同的兴趣。基于数学的密码学货币网络为智能合同提供了重要的构件:有价值的数字资产,它可以通过加密签名进行转移。例如比特币和瑞波协议中的资产被公/私钥账户所拥有。当交易带有只有账户所有者的私钥才能产生的签名时,支付就被执行了。智能合同能够创建这样的加密签名,从而被指定为任何类型数字资产的部分或者完全的所有者。 不幸的是,密码学货币开发者发现设计一种包含强大的智能合同语言和强壮的共识系统的系统的挑战非常大。比特币脚本语言允许将简单的逻辑编码,并在比特币网络上执行。然而,编码高级的逻辑和执行不可信任的代码已经被证明非常复杂。 共识网络设置新功能时,必须非常保守谨慎。因为网络中的每一个人都必须同意任何一个改动,所以这一技术相对而言难以更改或者升级。比特币百科中明确地提到这一担忧,写到“更加复杂的脚本命令是不被允许的,因为考虑到客户端在执行时可能出现错误。如果使用这些脚本命令的交易被包含到区块中,任何困境都可能有分叉的风险。”分叉区块链或者分布式账本意味着创建出多重竞争的网络状态,这是共识系统十分不想得到的后果。 我们认为以安全的、值得信任的方式实施强大的智能合同,同时不会增加现有的共识网络例如比特币和瑞波网络的复杂性,是可能的。 不可信任代码的执行应该与共识数据库和其它追踪和转移资产所有权的服务相分离。分离的合同系统可以处理不可信任的代码执行和通过加密签名与共识数据库交互。这些签名原生于共识网络,所以不需要任何修改。将合同与共识网络分离还有一个额外的好处:合同可以与多重网络进行交互,也可以与任何类型的网上服务进行交互。这意味着一个智能合同可以与比特币和瑞波进行交互,可以与基于网络的服务例如Paypal,Google,Ebay等进行交互,甚至可以与其它的互联网协议例如SSH,LDAP,SMTP和XMPP协议进行交互。 如果合同的执行分离于现有的系统,代码应该在哪里执行呢 这就要引入智能预言机了。 大多数智能合同的方案,甚至那些建在共识网络,例如比特币网络内部的智能合同,都依靠独立的实体告知合同外部世界的状态。比特币合同依赖于“预言机”,通过将签名引入网络来证实外部世界的事实。智能预言机将预言机的概念更深入一步,将不可信任的代码放到预言机中执行。智能预言机是可信的或半可信的实体,它既可以提供关于外部世界的信息,也可以执行合同参与方同意的代码。 实施智能预言机 智能预言机的实施需要做许多事情。在下面的内容中,我们将介绍对大多数智能预言机都不可缺少的元素。智能预言机的关键组成部分:安全地确认代码,沙箱代码,预言机应用程序接口,合同主持(contract hosting)和计费模型,和合同客户端。 下面的内容是关于智能预言机技术细节的。更加关心宏观的前景,不太关心技术细节的读者可以直接跳到最后三节内容:线下合同,金融应用及其它和结论。 安全地确认代码 一旦合同参与方同意他们安排的协议规则,他们必须将规则翻译成代码。合同参与方检查代码和保证代码代表了他们统一的商业逻辑,这是十分重要的过程。同样重要的是,他们应该确认上传到智能预言机的代码是他们刚刚检查过的代码。这就要引入确定的代码编译,散列和模块代码重用。 确定性编译 所有的合同参与方都想确认最终的机器执行的代码代表了他们同意的逻辑。对于编译语言,这意味着源代码必须被分享,用可复制的过程将源代码编译成机器语言。对于解释型语言,分享源代码就足够了。无论哪一种方法,合同参与方同意将要被智能预言机执行的最终命令,这是至关重要的。 散列 加密安全散列是确认二进制或者源代码文件的方便方法。散列函数将任意数量的数据作为输入,产生一串短的、固定长度的字符串。散列能够用于确认任何文字或者数据。 虽然可能不必要这样做,但是我们推荐使用抵抗冲突的散列函数。这意味着打算发现输出相同的两个不同的输入是不实际的。用相同的散列生成两片工作码是极其困难的,即使使用只是抵抗次原像的散列函数。然而,如果某人可以用相同的散列创建两种不同的合同,这回造成严重的问题。因此,我们推荐使用抵抗次原像和抵抗冲突的散列函数。 模块 传统的合同经常分享通用的模板,智能合同也是这样的。任何一个智能预言机系统都可能提供一些可以重复使用的代码。这既增加了便利性有增加了安全性。 许多合同将具有简单和易于理解的逻辑,这些逻辑建立在众所周知、广泛使用的模块之上。模块可以包含基本的功能,例如与比特币或者瑞波网络连接的机制。模块也可以包含更先进的功能,例如标准化的拍卖,代理,或者债券实施。这些逻辑可能被许多独立的合同参与方广泛使用和核实。 Codius使用被散列核实过的模块,这些模块可以被多个合同分享和使用。 代码沙盒 智能预言机理念的核心是让用户同意合同的代码和同意将合同上传到执行合同的第三方的能力。智能预言机必须能够安全地执行用户的代码,这些代码不可信任,甚至可能带有病毒。预言机必须保护自身的系统和它们正在运行的其它合同的完整性。 四种最常用的限制不可靠代码功能的方法描述如下。不同的智能预言机系统可能选择使用不同的方法,它们也可将多种方法结合在一起使用,增加安全性。在最后我们将综合讨论这四种方法,解释我们为什么为Codius选择谷歌的本机客户端。 1.虚拟机 虚拟机是在一个物理机上模拟相互分离的计算机的环境。一台主机或者计算机可以运行多个虚拟机,每个虚拟机有完整的操作系统。虚拟机的安全依赖计算机处理器的虚拟命令设置。虚拟机与外部世界或者宿主计算机的通信受到虚拟机监视器的严格管理。 虚拟机技术可以追溯到1960s年代,现在广泛地应用于沙盒代码。大多数云计算提供商使用虚拟机在每台主机上运行多个用户的代码。虚拟机可能是最安全的方法之一。但是,它的缺点是消耗更多的计算资源。因为每台虚拟机都包含操作系统,对许多合同来说不现实。然而,合同主持者可能为高价值的合同提供虚拟机,因为合同的参与方为了更安全的执行环境,将会支付更多的费用。 2.操作系统保护域( Operating System Protection Domains) 许多处理架构建有保护域。保护域被操作系统使用,允许操作系统将个人的处理进程与其它进程和硬件隔绝。依靠保护域的安全技术包括基于处理过程的隔绝,FreeBSD监狱,Linux容器,SELinux,AppArmor等等。 容器系统(container system),例如Docker,正在越来越流行,因为它们轻便、启动更快。然而,这些容器作为沙盒技术的安全性不够。 在这一模式下,所有的安全都依赖于宿主操作系统执行权限层的能力。这意味着核心的故障可能导致沙盒的漏洞。另外,大多数流行的操作系统内核提供了非常大的攻击面,使得保证安全更加困难。基于操作系统特性例如保护域和基于处理过程隔绝的方法可以与其它机制联合使用。 3.软件故障隔离 软件故障隔离依靠编译软件减少命令集或者在机器语言水平限制可能命令集。沙盒可以通过确认二进制代码保证它不包含允许集以外的操作,执行它的规则。 软件故障隔离室非常吸引认得沙盒技术,因为校对机是唯一可信任的部分,而且可以用很少的代码实施。这导致最低限度的信任代码基础,这使得系统更加容易地确认,因此更加安全。 4.基于性能的安全 基于性能的安全是设计原则,规定程序不能够引用未经同意的函数或者资源。它可以简单地理解成奥威尔小说《1984》中的“新话”,它“通过限制英语的表达方式消除个人的思想”。如果你没有词语表达非法的思想,你就不可能违法。 智能合同系统可以要求不可信任的代码用一种特殊的语言重写。不幸的是,基于性能的安全沙盒将强迫所有的合同作者使用一种并不流行的语言。 Codius和谷歌本机客户端(Google Native Client) 谷歌的本机客户端是一个运行不可信任的x86代码的沙盒,这一底层命令被大多数计算机处理器所使用。开发本机客户端是为了在网上运行编译后的二进制代码。本机客户端提高了软件的故障隔离能力,为软件提供受限的执行环境,保护用户远离潜在的恶意代码。 本机客户端可以用来运行任何一种编程语言,目前支持C,C++,Python,V8JavaScript,Ruby,Go,Mono和 Lua。最近本机客户端支持x86-32和x86-64架构,也支持ARM和MIPS架构。谷歌用本机客户端运行需要较多运算的网页应用,例如Hangouts Video、QuickOffice和ChromeOS运行不可信任代码的应用和数据中心。最新版本的可移植本机客户端模块只比虚拟机编译的代码慢10-25%,所以本机客户端不仅启动快速,而且提供高性能地执行。 Codius使用本机客户端,因为它提供了独一无二的安全性、性能和灵活性的组合。 合同应用程序接口 即使智能合同在沙盒中运行,并且程序的功能被限制了,但是还有应用程序接口的问题。为了对合同的功能进行更精确的控制,Codius合同的作者详细规定了合同可以同什么样的应用程序接口接触。 合同主持(Contract Hosting) 单一(可信任)主持模型(Single (Trusted) Host Model) 最基本的智能预言机只包含一个预言机。这一预言机是可信任的,它会正确地执行代码,合同的参与者能确信它不会携款逃跑或者与合同的某一参与方相勾结。 现在许多公司为其它公司和个人提供运行代码的服务,他们受到用户的信任。单一可信任主持者模型类似于软件即服务的提供者。我们认为,对于大多数智能合同,单一可信任主持者就足够了,而且它设置简单,很有吸引力。 多重(不可信任)主持模型(Multiple (Untrusted) Host Model) 虽然单一可信任的合同主持者对大多数用户来说已经足够了,但是高价值的合同最好还是使用多重主持者模型。在这一模型中,合同代码分布在几个独立的智能预言机中,例如10个。设置一个临界值,为了合同执行,临界值数量的智能预言机必须就结果达成一致。例如,用户使用7/10模型,只有当等于大于7个智能预言机一致时,合同才能够执行。这一模型留出了3个缓冲,也许有的智能预言机离线,有问题或者被黑客攻击,只要不多于3个不影响合同代码的执行。多重主持模型比单一主持模型更加复杂,成本更加高,但是它提供了更好的安全保障。 记费(Billing) 智能预言机最灵活的一点是计费系统,它允许合同的参与方为合同的执行向智能预言机支付费用。计费系统与核心系统设计完全分离,所以智能预言机可以可以接受它们选择的任何支付方式,从信用卡支付到比特币支付。事前收取费用还是事后收取费用完全由预言机的运营者决定。 合同客户端(Contract Clients) 合同参与方为了管理他们参与的智能合同,他们需要与合同主持者交互的软件。 我们预期,许多合同模块都有相应的客户端软件。根据使用情况,客户端可能有非常不同的特性,从优雅的图形用户界面到贫乏的命令行工具。在白皮书中,我们假设合同的作者也将提供合适的客户端或者第三方开发者指导,让他们的已有的客户端可以与合同交互。 线下合同(Offline Contracts) 在现在的法律系统中,大多数合同完全是“线下”的,即不需要调用法律系统。调用法律系统的威胁使得合同的参与方遵守合同条款。 在智能合同领域,线下合同也是可能和有用的。合同参与方将会遵守下面的协议: 1.创建的合同明确规定合同参与方违背合同协议将会受到惩罚。 2.向合同代码末尾增加随机值。这将使得通过代码的散列获得合同细节知识变得棘手。 3.向合同的主持者要求合同的公钥,但是不上传合同。 4.公钥能够获得代管基金或者能够控制合同参与方资产的权力 5.合同的参与方现在可以在线下进行交互。 6 如果合同的一方进行欺骗,受害者能够上传合同,运行合同,对违背合同的一方进行惩罚。 只要合同的参与方没人进行欺骗,合同就可以用不用上传和执行。 合同的参与方必须做出可信的威胁,如果另一方违背合同,就应该上传合同和施加惩罚。这类似与现在的法律系统,参与方必须做出他们将进行起诉的威胁,如果另一方违背合同。不同之处在于,智能合同的诉讼的成本更低,速度更快,结果可以预期。 这种合同避免了运行合同的成本,除非出现纠纷。这可能会引起合同的主持者如何取得费用的问题。我们有两种解决方案。 合同主持者从纠纷中赚钱。 合同主持者从发行公钥中赚钱。 金融应用及其它 智能合同能被应用于塑造具有明确的条件和结果的任何类型的协议或者关系。智能预言机使得智能合同的实施变得简单、灵活和强大。 下面是我们现在可以期许的一些应用,从最简单应用的开始,难度依次递增。 1.桥接价值网络。像比特币和瑞波这样的分布式网络的记录账户和余额的账本或者区块链是分开的。传统的金融系统也有它们自己的账本。建立在智能预言机上的合同能够在分开的系统之间创建自动的、完全可信的桥接。这样的桥接能够接收来自于其中一个系统的支付,然后立即在另一个系统发起支付。 2.代理。智能合同能够很容易地建立起来,充当代理账户,监控两人之间的交易。商品、财产或者服务的买家把货款打到合同账户中。这个合同将监控外部服务信息,例如对于域名交易,它会监控域名注册者,对于房产交易,它会监控公开房屋所有权记录。当所有权由卖家转到买家时,合同会自动将货款发给卖家。 3.密码学货币钱包控制。目前比特币和瑞波没有好的机制使得“拉回支付”(pull payment)可行。“拉回支付”即如同信用卡支付模式,卖家代表买家发起支付。合同控制的钱包包括许多不同类型的复杂控制,从每日取款限额到允许特定实体收款。这将使得认购、条件支付和不用公开私钥的精细化钱包控制成为可能。 4.数字资产拍卖。如果智能合同被给与了数字资产的所有权,它就能执行拍卖规则。它可以被设计为在比特币或者瑞波网络上接受投标资金,拍卖结束后,向投标失败者返还资金。 5.金融衍生品。监控数字或非数字资产的合同也能够应用于期货合约、远期合约、互换合约、期权合约。 6.债务和权益。其它基于根据事先制定的规则实现支付和权益变动的证券也能够写成智能合同。 7.智能财产。智能财产的经典例子是智能汽车,它能通过可转让的,但不可伪造的数字标记(digital token)知晓谁是它的主人。合同可以管理所有权的转移和附带规则。这包括临时性授权和其它协议中担保财产的潜在使用。 8.投票。未来智能合同可以用来执行民主、官僚和其它类型的对资产或者组织的控制结构。像其它所有应用一样,合同执行事先定义的规则,甚至包括更改合同自身代码的规则。许多非金融应用要求更复杂的基础设施和更加成熟的生态系统,所以我们预期这样的应用建成需要一段时间。 结论 智能合同是科技、商业和法律领域令人兴奋的新前沿。我们希望这篇论文和Codius项目可以为智能合同融入普通人的生活做出贡献。 智能预言机结合了提供真实世界信息的预言机和有沙箱保护的代码执行环境。它独立于现有的分布式网络,例如比特币和瑞波网络,可以与任何基于互联网的服务,包括所有的分布式共识数据库,进行交互。将不可靠的执行代码与分布式网络分开,减少了复杂度,从而增加了两个系统的安全。 Codius的实施过程利用谷歌本机客户端将不信任的代码运行在沙盒中,这使得程序员可以使用任何编程语言写智能合同。它利用确定性编译、散列和签名秘钥安全地识别合同和模块。我们建议高价值的合同采用多方签名,进行分布式计算。 Codius和智能预言机为开发者、企业家、法律和金融专业人员打开了新的可能性。以前需要冗长的法律合同的协议现在可以翻译成代码,并由智能预言机自动执行。智能预言机拥有赋予人们建立更加公平、成本更小、效率更高的法律系统的潜力,智能预言机是能够实现这些梦想的方法之一。 想加入我们吗 加入我们社区吧!请访问:www.codius.org 致谢: 这篇论文的作者是Ripple洛杉矶实验室的Evan Schwartz和Stefan Thomas。特别感谢David Schwartz指明线下合同的概念。 来自社区的贡献太多了,难以一一列出,但是我们还是要感谢这一领域的先行者。 加文·安德森,他独立地得出了可编程的预言机的概念。 感谢马克·赫恩在智能合同领域的先驱性工作。 感谢Reality Keys项目、Orisi团队和Early Temple项目实施与现实经济交互的单一签名和多重签名的预言机。 感谢以太坊团队创建了智能合同平台,让更多的人了解到智能合同的理念。 感谢谷歌和本机客户端团队的不断支持。 感谢CommonAccord项目James Hazard对白皮书的意见反馈。 译者注: 特别专业的技术细节没有翻译,能力不及,对论文的整体理解没有太大影响。有错请指,研究还是看原文吧。国外已经有好几个项目在做智能合同了,或者说区块链与真实经济的交互。国内的所谓比特币死忠却认为人家在发明水陆两用“二代”自行车,哎……搞自行车的莱特兄弟最后发明出来的不是水路两用“二代”自行车,是飞机! |