传统合同和智能合约

elisa   |     |   1224 次阅读

以太坊和其他智能合约平台的兴起,比如Wave和Neo,对大部分比特币的拥护者来说是非常困惑的。在他们错失了巨大收益的同时,新的投资者现在仍然在炒作中获利。现在Rootstock都已经出现了,我想研究“图灵完备的智能合约”到底要干什么。现在已经有相关应用了吗?还是说都只是嘴上说说?

什么是智能合约?

智能合约是由尼克萨博在1996年首次提出的概念。更确切的说,它是出现在比特币时代之前的,他对智能合约的定义如下:

一个智能合约是一套以数字形式定义的约定,包括合约参与方可以在上面执行这些约定的协议……智能合约的基本思想是,各种各样的合约条款……可以嵌入到我们使用的硬件和软件中……从而使得攻击者需要很大的代价去攻击。

因此,尼克萨博设想了一种能够自动执行的智能合约,而且攻击它的代价是昂贵的。很显然,当区块链出现的时候,人们就已经开始了努力尝试用区块链来实现这种可自动执行且攻击代价昂贵的智能合约。毕竟,PoW共识算法之下回溯更改区块中的一笔交易,代价是巨大的;而且可以提供自动执行的审查交易进入以太坊等。他们保证了图灵完备性,意味着什么都可以执行。

所有这些新的智能合约的平台,为用户提供了一个新的去中心化的世界:编写和执行从不停止的代码成为可能,这就导致了未来各种各样的创新,比如“去中心化的优步”、“去中心化的爱彼迎”以及“去中心化的黑暗网络市场”。或者更进一步来讲:去中心化的计算。以太坊试图成为“世界的计算机”。你可以看下面以太坊官方的视频,以了解更多关于以太坊能实现的东西:

视频链接:https://www.youtube.com/watch?v=j23HnORQXvs

问题1 :现实资产

但是当很多人阅读尼克萨博的文章时,很明显的感觉到,尼克萨博对“为了把现实世界中的资产和行为与智能合约联系起来,可信人和公证人是需要的”是非常清楚的。你不能把强迫一个人去使用区块链来把他的车通过软件来交给他。你不能强迫一个人使用区块链根据软件定义规范来创建一个特定的应用程序。你不能强迫你的毒贩来用区块链来发给你那些你已经支付的大麻。这是不可能的。在这些情况下,显然需要一名仲裁员。交易的双方都需要信任第三方,如果双方都不同意那么就需要它来进行仲裁。

在这些情况下,当现实世界的资产或服务转化成数字货币时,很明显“智能合约”不能增加很多,他们唯一能做的就是为联合账户提供理论。在大多数情况下,这就是一个简单的“2/3的多重签名”:买方、卖方和受信的第三方创建一个联合账户。当买方收到货物时,他会签署交易,卖方收到钱时,也会签署交易。如果买方不想签署交易,因为他认为产品不好或者服务不到位,受信的第三方就可以进行仲裁,如果他认为合适的话,可以退还买方(部分)金额。如果卖方可以证明他确实做到了事前已达成协议,仲裁员可以决定绕过买方并把钱寄给卖方。

但是,等等……我们是要干什么来着?这难道不可能在比特币上持续几年吗?是的,这意味着整个用例在比特币上是可能的。那这样看来,以太坊以及其他的智能合约平台没有添加任何有用的东西。区块链看起来并不需要一个图灵完备的平台。

问题2:可信节点

那运行网站或者相关平台呢?现实世界中没有任何资产应用到这些项目中。当然,这不仅仅是货币交易对吧?好吧,我们这样想,我们想在以太坊这种世界计算机上运行一个网站,这样这个网站就能“永不停歇”。这听起来相当模糊。它在实际中意味着什么呢?网站的创建者把网站的代码放到区块链上,所有的节点都下载代码,打开网站。如果每一个节点都需要下载所有的网站,这将会造成巨大的带宽和存储消耗。这看起来非常的低效。如果你不需要这个网站,那你为什么还为了它而下载所有的代码?通常来讲,用户只从网站服务器上下载他们需要的文件,并在浏览器中打开它。“图灵完备的智能平台”所尝试的是另一种方式。

好吧,我们假设只有某些节点下载了所有网站的内容,其他节点只下载了部分的内容。我们现在部署的是一种分布式的服务器,任意一个用户都可以连接到它并获得网站。用户本身不会运行一个全节点来连接到他们自己版本的网站。但是,运行一个全节点的动机是什么呢?你只能通过执行代码来获得奖励,而不是通过存储和广播大量的数据。比方说,智能合约平台编写了一个合约,让用户为每一次发向节点的数据请求进行支付。(请注意,这也需要所谓的分片,因为当只有某些特定的节点可以对请求数据应答时,也只有这些节点就可以对智能合约验证有效性。)用户是如何确定他得到的是一个正确的而不是低级甚至是错误虚假的版本?除非用户使用原始服务验证数据,否则无法解决此问题。所以用户要么盲目的信任他连接到的节点,要么……

他就连接到在区块链上发布网站的原始节点。那么我们又回到了一开始……很明显,连接到为网站服务的中心服务器上是更加有效的。如果你想要拥有一个永不停歇的网站,那么就把它当做一个在Tor或I2P网络上运行的隐藏服务……不需要巨大的带宽和极大地存储代价,不需要信任其他节点,不需要支付访问……人们往往会忘记,互联网本身就是相当的去中心化的。如果你运行自己的服务器,那么你就是以去中心化的方式来运行你的网站的。然而,为网站申请一个托管公司却是更有效更可靠的。

问题3:数据服务

这就带给了我们预言机(Oracle)的概念。预言机基本上是一个提供数据的可信服务。与被用作网站服务器的非全节点相比,这是一个不太激进的想法,因为预言机唯一的目的就是为智能合约提供一份独特的输入数据。想象一下,在欧元兑美元汇率上有两个选项。你可以打赌,到今年年底欧元将跌至1美元以下。智能合约可以处理一切。所有的代码都在区块链上运行的:你在合约地址中存入一定金额,当智能合约检测到一欧元确实低于一美元时,合约就会执行,然后你就会双倍的拿回你的钱。若果今年年底,欧元并没有跌至1美元以下,你就输了,你的钱就会被拿走。

这看起来非常直接,非常容易实现,对吧?不过有个小问题……智能合约从哪里得到支持它检查欧元和美元汇率的实时数据?这些数据区块链上是没有的,而是存在外部的。你可以使用例如这个链接中的免费的API来跟踪欧元和美元的汇率,并且把它编码到智能合约中。但是仍然有一个很大的问题……当外部数据源崩溃时,会显示0为欧元和美元兑换汇率,这时会发生什么?智能合约是可以自动执行的。交易是有效的而且是不可变更的。所以这两个选项的创建者因为数据源中的bug而丢失了钱。你可以使用不同的数据源来提供数据并忽略异常值。例如,你使用了3个实时更新的数据源,那么智能合约会自动忽略离平均值最远的那个,并根据剩下的两个数据重新计算平均值。这似乎已经解决了问题。如果有异常值,也不会影响智能合约要用的数据的。但是弱点依旧存在。如果已经到了12月31号,欧元兑美元的汇率仍然没有下降到1美元以下,那么你将要损失1000万美元。那么你现在就有一个非常大的动机去贿赂其中的两条数据源:显示一分钟的0.9美元作为汇率,为此你支付他们200万。结果呢,你会赌赢,并且获利2000万!而且数据源拥有者也可以自己创建投注,并故意在他们的软件中创建漏洞,从中获利。

很显然区块链并没有解决这种问题,并且使它变得更糟。NADAQ上的错误数据资料可以通过回滚一些交易来修正,但区块链上的智能合约是无法回滚的(除非您是Vitalik Buterin的朋友)。我希望你现在明白为什么我对这个可信任的数据整个概念持有怀疑的态度。如果赌注不多的时候你可以信任一个数据源。即使发生错误你也只是损失少量的资金。如果你信任你的交易对手,并且他是一个诚实节点的话,你甚至可能拿回你的钱。但是,我非常确信,那些处理大笔交易的大公司是不会相信外部数据源的。他们会要求交易签名。是的,我们确实回到了交易中可信的第三方。

如果你不信任外部数据,那么我们能不能仅仅用一个多方签名的交易来决定到底是谁赢了赌注?实现是非常简单的:你在服务器上运行一个“智能脚本”。这个服务器把外部数据作为输入,来决定何时触发一个发送给仲裁员的警报。仲裁员会手动检查数据是否确实正确,如果是正确的,那么它就会对交易进行签名。如果仲裁员确定了这笔数据是错误的,那么你就可以起诉他并把你的钱拿回来。所以外部数据提供者就有提供正确数据的动机。这个系统也是非常有效的,因为区块链不需要检查每一个智能合约,它只需要验证多重签名交易的有效性。一切都发生在链上。我不会冒昧的构建“去中心化的外部数据”的“创新”。我非常确定那些也是可以玩的,但这就超出了本文的范围。

问题4:扩展性

仍然不相信“从不停止的代码”没有真正的用例? 我将提供另一个不需要信任的数据的例子。可以想象一个赌博的“dapp”(去中心化的应用),其中前一个块的哈希值被用作随机数生成器。你可以赌哈希是偶数或奇数。业主用一大笔钱资助了这个智能合约。赌徒提前下注给智能合约,并投注“偶”。如果哈希确实是偶数,那么他会得到1.98倍的赌注。当哈希值是奇数的时候,他什么也得不到,所以庄家上风是1%。这些都是可以编码和自动执行的。网站是没必要用这些的,所有这一切可以在块链上完成。 通常,您将为客户提供(集中式的,哈哈)网站作为GUI,但不是必需的。问题是:所有这些赌博交易数据仍然需要流经整个以太坊网络。每个节点需要检查用户发起的所有博弈。

在过去,Satoshi dice曾经以类似的方式在比特币网络上运作。你可以向固定的博弈地址发送交易,如果你赢了,网站将自动把钱返回来。但是……你需要信任这个网站,相信它诚实地行事。理论上他们可以在拿到你的钱来运行。这就是以太坊的优势吧!等等等,不会那么快。 Satoshi dice 曾经是一个“链上”的服务,但它不再是了。猜猜这是为什么?答案很简单:拥堵。所有这些小额交易都需要被所有节点存储和转发。在早期的比特币没有被用得太多的时候,这些小额交易就有足够的区块空间。但是,目前交易费是如此之高,以至于小额交易不可能再很容易的被包含到区块中。因此,Satoshi dice转为了一种中心化的模式:您首先在网站上投放比特币,然后才能开始下注。当完成后,你可以对币提现。与去中心化模型相比,这样做更有效率。我们曾经这样设想过,也这样做过。这很有趣,但长期来看,由于网络健康这是不可持续的。所以我们不这样做,以太坊也没有添加任何有用的东西。顺便说一下,由于……网络拥塞,Etherdice目前是无法使用的。需要更多的证明吗?那就看看这篇关于微软和以太坊的论文:他们不会使用块链本身,他们需要一个链下的更扩展性更强的解决方案。

问题5:挖矿动机

回到前面的例子,除了可扩展性,还有第二个问题:矿工们可以操纵块的哈希散列。他们可以下注,然后只发布拥有他们所需要的哈希值的块。实际上,这可能就是为什么Etherdice 使用外部数据(可能是random.org)来获得随机性的原因:

唯一的外部依赖是随机性的来源,因为区块链的确定性的本质使它难以通过安全的方式获得随机数据。

那么,如果即使是一个简单的博弈“智能合约”都不能依赖区块链,那么大公司怎么会用这个技术来创造重要且复杂的智能合约呢?

需要另一个例子? 我从以太坊挖矿社区那里听到了一个故事:在进行众筹的时候,为了不错过非常好的“投资机会”,投资者会相互竞争,尽快的把交易放到区块中。一些矿工通过一些侧面的渠道把交易包含到区块中来获得报酬。这些矿工拒绝其他交易。或者他们自己购买整个众筹,并且排出其他的投资者。所以挖矿的激励机制可能会矿工审查机构来获利。

还需要另一个例子?目前,一个去中心化的交互尚未实现。但是想象一下,一个矿工能够在去中心化的交易所上审查确定的买卖指令,并且能用自己的交易来运行它?它会第一个倾销这个代币,因而它也能在价格崩盘之前退出。这一切都是可能的。

所以,恕我直言,智能合约在区块链上是不安全的,那么你在外部服务器上就需要一个仲裁员和一段智能脚本,以可靠、可扩展的高效的方式来完成这些事情。

只是承载资产

那么我们剩下的就是,智能合约只用链上的数据、不依赖区块哈希值的随机性、也不依赖于执行的顺序。保存到区块链中的数据是非常有限的:包括交易数据、区块哈希和时间戳而已。所以这些“智能合约”实际上就是“传统的合同”。它们做不了其他任何更有用的事情。

目前,区块链唯一的价值加密数字货币。因为真实世界中资产并不是数字化的,所以把它们存储到区块链上是不可能的。数字货币就是一种所谓的“现实资产的承载货币”。它的价值就是代币本身。你不需要信任一个外部平台。当你转移代币时,你转移的就是价值。现在有一种可以扩展智能合约的方式:创造新的承载资产。

目前这种情况发生的频率很高,以太坊上众筹的项目的数目是惊人的。这些代币代表了它们本身的价值。它们大部分需要信任一个基础的平台,因为代币将会收到作为股息的利润。但是,代币仍然保持着预期的价值,并应能反映对平台的信任和获得股息的机会。那么众筹确实是智能合约的一个自然而然的应用。人们可以创建一个拥有收入来源的平台,而且利润自动分配给代币持有者,并且不会受到开发商的干扰。这是智能合约的一个潜在用例,但是可能会遇到像我们在satoshi dice 中看到的低效。它没有扩展性。如果平台的拥有者或者开发商是人工进行股息支付的,那使用一个“图灵完备的智能合约”也没有任何优势了。这是可以通过彩色币(Color Coin)的协议来完成的,没必要用以太坊。还要考虑这些众筹潜在的法律风险,根据法律政令他们中的大部分都是要关闭的。剩下的就是一些不三不四的“去中心化公司”(黑暗网络市场),向他们投资本身就是一种风险。

现在有一种更有趣的承载资产的类型:加密法币。如果政府决定在区块链上发行一个法币,那么代币就可以代表它本身的价值。在这种情况下,更有趣的是理论上智能合约将会成为可能。如果你能创建一个去中心化的交易所,理论上你可以得到区块链上数据交换的频率,并消除对外部数据存储的需求。但是就像我们看到的一样,区块链无法安全的实现链上交易。而且再次声明,区块链是非常低效的,任何大规模的交易都是不可能的。这一切虽然听起来不错,但实际上是不可行的。

图灵完备性增加了更多的风险,而不是利益

所以在我看来,区块链对智能合约来说并不是很有用。(非常有限的)附加福利是不值得的,因为我们同样需要考虑风险。事实就是,用图灵完备的平台来构建安全的应用是非常困难的。DAO的惨败已经让我们意识到了这件事情。我宁愿相信一个专注于钱的问题的区块链,也不愿在区块链上尝试智能合约,在大多数情况下,这根本没有什么利益可言,而且会面临更大的风险。

所以智能合约是可能的……

……但是也只是在非常具体的情况下。可扩展性问题使得它并不能被广泛的应用。在区块链上唯一能用的智能合约是易于计算的合约,不需要太大的存储能力和带宽,而且不是经常执行。所以在实践中,它只适用于大型交易。在区块链上用智能合约来执行大量的小额交易在经济上是不可行的。如果你仍然希望扩大交易量,则需要在外部服务器上运行“智能脚本”,并定期向区块链进行结算。如果你使用外部数据的话,智能合约也会有风险。所以最好是在区块链上使用多重签名,并且在外部服务器上运行一段智能脚本。如果你不想用外部数据,那么你就仅限于持有链上的无形资产,这跟传统合约也没什么两样。


原文链接:http://weuse.cash/2017/08/15/dumb-contracts-and-smart-scripts/
作者:weuse.cash匿名作者
翻译 & 校对:刘艳安 & Elisa

 
1 人喜欢