当心不可能的智能合约

源节点: 1576899

三种最常见的智能合约误解

作为流行的区块链平台的开发人员,我们有时会被问到是否存在类似以太坊的智能合约。 多链 路线图。 我总是给出的答案是: 不,或者至少还没有.

但是在充斥着炒作的区块链世界中,智能合约风靡一时,那为什么不呢? 好吧,问题是,虽然我们现在知道了许可的比特币式区块链的三个强大用例(来源,公司间记录和轻量级财务),但我们仍未找到以太坊式智能合约的等效用例。

这并不是说人们缺乏他们想要智能合约做什么的想法。 而是很多这样的想法 根本不可能。 您会看到,当聪明人听到“聪明合同”一词时,他们的想象力就会狂奔。 他们构想了自主智能软件的梦想,它走进了世界,带走了它的数据。

不幸的是,智能合约的实际情况远不止这些:

智能合约是一段存储在区块链中的代码,由区块链交易触发,并在该区块链的数据库中读写数据。

而已。 真。 智能合约只是在区块链上运行并与该区块链的状态进行交互的代码的花哨名称。 还有什么 is 码? 它是Pascal,它是Python,它是PHP。 它是Java,它是Fortran,它是C ++。 如果我们在谈论数据库,那就是 存储过程 用SQL扩展编写。 所有这些语言从根本上都是等效的,可以用相同的方式解决相同的问题。 当然,每种方法都有其优点和缺点–您会疯狂地使用C建立网站或使用Ruby压缩高清视频。 但至少在原则上,如果您想。 您只是在便利性,性能以及很可能是您的头发方面付出了沉重的代价。

智能合约的问题不仅仅是人们的期望被夸大了。 正是这些期望导致许多人将时间和金钱花在不可能实现的想法上。 从高级管理人员遇到新技术到真正理解该技术的优点和局限性的那一刻,大型公司似乎有足够的资源走很长的路。 也许我们自己的经验可以帮助缩短这段时间。

在过去的XNUMX个月中,我们获得了许多智能合同用例,并且发现自己一次又一次地回应说,它们根本无法完成。 结果,我们确定了三种最常见的智能合约误解。 这些想法没有错,因为技术不成熟或工具尚不可用。 相反,他们误解了 驻留在数据库中并以分散方式运行的代码的基本属性.

联系外部服务

通常,提出的第一个用例是一个智能合约,该合约会响应某些外部事件而更改其行为。 例如,一项农业保险保单根据给定月份的降雨量有条件地支付。 想象的过程是这样的:智能合约会一直等到预定时间,再从外部服务中检索天气报告,并根据收到的数据适当地执行操作。

这听起来很简单,但这也是不可能的。 为什么? 因为区块链是基于共识的系统,这意味着它仅在每个节点在处理完每个事务和块后达到相同状态时才起作用。 区块链上发生的所有事情都必须完全是确定性的,差异不可能蔓延。一旦两个诚实的节点不同意链的状态,整个系统就一文不值。

现在回想一下,智能合约是由链上的每个节点独立执行的。 因此,如果智能合约从外部来源检索某些信息,则每个节点将重复且分别地执行此检索。 但是由于该来源不在区块链之外, 不能保证每个节点都会收到相同的答案。 源可能会在来自不同节点的请求之间更改其响应时间,或者它可能暂时不可用。 无论哪种方式,共识都将被破坏,整个区块链将消失。

那么解决方法是什么? 实际上,这很简单。 一个或多个受信方(“甲骨文”)不是使用智能合约来启动对外部数据的检索,而是创建了一种将数据嵌入到链中的交易。 每个节点将拥有此数据的相同副本,因此可以安全地用于智能合约计算中。 换句话说,一个神谕 数据进入区块链而不是智能合约 它在。

当涉及导致外部事件的智能合约时,也会出现类似的问题。 例如,许多人都喜欢智能合约的想法,该合约调用银行的API以进行汇款。 但是,如果每个节点都独立执行链中的代码,那么谁负责调用此API? 如果答案仅仅是一个节点,那么如果该特定节点有意发生故障,该怎么办? 如果答案是每个节点,我们是否可以使用该API的密码信任每个节点? 而且我们真的希望API调用数百次吗? 更糟糕的是,如果智能合约需要知道API调用是否成功,那么我们就回到了依赖外部数据的问题。

和以前一样,有一个简单的解决方法。 我们没有使用智能合约来调用外部API,而是使用可信任的服务来监视区块链的状态并执行某些响应操作。 例如,一家银行可以主动监视区块链,并执行反映链上交易的汇款。 这对区块链共识没有任何风险,因为该链完全扮演被动角色。

查看这两种变通办法,我们可以得出一些意见。 首先,它们都需要一个受信任的实体来管理区块链与外界之间的交互。 尽管这在技术上是可行的,但它破坏了分散系统的目标。 其次,这些变通办法中使用的机制是 读写数据库。 提供外部信息的Oracle只是将信息写入链中。 反映现实世界中区块链状态的服务仅是从该链中读取内容而已。 换句话说,区块链与外界之间的任何交互都限于常规数据库操作。 稍后我们将详细讨论这个事实。

实施链上支付

这是我们经常听到的另一个建议:使用智能合约自动支付所谓“智能债券”的息票。 这个想法是为了使智能合约代码在适当的时间自动启动付款,避免手动操作,并保证发行人不会违约。

当然,为了使其正常工作,用于支付的资金也必须存在于区块链中,否则,智能合约就不可能保证其支付。 现在回想一下,区块链只是一个数据库,在这种情况下,是一个包含已发行债券和一些现金的金融分类帐。 因此,当我们谈论优惠券支付时,我们实际上在谈论的是在约定的时间自动进行的数据库操作。

尽管该自动化技术上可行,但存在财务困难。 如果用于票息支付的资金由债券的智能合约控制,那么这些支付的确可以得到保证。 但这也意味着那些资金 债券发行人不能将其用于其他任何用途。 如果这些资金 并不 在智能合约的控制下, 没有办法可以保证付款.

换句话说,聪明的债券对发行人而言毫无意义,对投资者而言则毫无意义。 如果您考虑一下,这将是显而易见的结果。 从投资者的角度来看,债券的全部要点是诱人的收益率,但要付出一定的违约风险。 对于发行人而言,债券的目的是为生产性但有些冒险的活动筹集资金,例如建立新工厂。 债券发行人无法利用所筹集的资金,同时又保证投资者将获得还款。 不足为奇的是 风险与收益之间的联系不是区块链可以解决的问题.

隐藏机密数据

就像我一样 以前写过,部署区块链的最大挑战是它们提供的根本透明性。 例如,如果十家银行一起建立了区块链,而两家银行进行双边交易,那么其他八家银行将立即可见。 尽管有多种方法可以缓解此问题,但没有一种方法比集中式数据库的简单性和效率更高,在该数据库中,受信任的管理员可以完全控制谁可以看到什么。

有人认为智能合约可以解决这个问题。 首先,每个智能合约都包含其自己的微型数据库,对此它具有完全控制权。 此数据库上的所有读取和写入操作均由合同的代码进行调解,因此一个合同不可能直接读取另一个人的数据。 (数据和代码之间的这种紧密耦合称为封装,这是流行的基础 面向对象的编程 范例。)

因此,如果一个智能合约无法访问另一个人的数据,我们是否解决了区块链机密性问题? 谈论在智能合约中隐藏信息有意义吗? 不幸的是,答案是否定的。 因为即使一个智能合约无法读取另一个人的数据,该数据仍然存储在链中的每个节点上。 对于每个区块链参与者,它都位于一个 参与者完全控制的系统。 无论何时何地,只要他们选择这样做,都无法阻止他们从自己的系统中读取信息。

将数据隐藏在智能合约中与将其隐藏在网页的HTML代码中一样安全。 当然,普通的网络用户不会看到它,因为它没有显示在他们的浏览器窗口中。 但是,Web浏览器只需要添加“查看源代码”功能(如它们所具有的那样),隐藏的信息就变得普遍可见。 类似地,对于隐藏在智能合约中的数据,所有人要做的就是修改其区块链软件以显示合约的完整状态,而所有的保密性都将丢失。 一个体面的程序员可以在一个小时左右的时间内完成该操作。

什么是智能合约

智能合约无法做的事情太多了,人们可能会问他们实际上是干什么的。 但是为了回答这个问题,我们需要回到区块链本身的基础上。 概括地说,区块链使不相互信任的实体可以直接安全地共享数据库,而无需中央管理员。 区块链可以实现数据去中介,这可以显着节省复杂性和成本。

任何数据库都可以通过“事务”进行修改,其中包含对数据库的一组更改,这些更改必须整体上成功或失败。 例如,在一个财务分类帐中,从爱丽丝到鲍勃的付款由以下交易表示:(a)检查爱丽丝是否有足够的资金;(b)从爱丽丝的帐户中扣除一定数量;(c)将相同数量添加到鲍勃的。

在常规的集中式数据库中,这些事务是由单个受信机构创建的。 相比之下,在由区块链驱动的共享数据库中,交易可以由该区块链的任何用户创建。 而且,由于这些用户彼此之间并不完全信任,因此数据库必须包含限制执行交易的规则。 例如,在点对点财务分类帐中,每笔交易必须保留资金的总量,否则参与者可以自由地给自己任意数量的钱。

人们可以想象表达这些规则的各种方式,但是目前有两种主要的范例,分别受比特币和以太坊的启发。 比特币方法,我们可以称之为“交易约束”,它根据以下各项评估每个交易:(a)该交易删除的数据库条目,以及(b)创建的条目。 在财务分类帐中,规则指出,已删除条目中的资金总数必须与所创建的总额相匹配。 (我们认为对现有条目的修改等同于删除该条目并在其位置创建一个新条目。)

来自以太坊的第二个范例是智能合约。 这说明对合同数据的所有修改必须由其代码执行。 (在传统数据库的背景下,我们可以将其视为 强制执行 存储过程。)要修改合同数据,区块链用户发送 要求 其代码,该代码确定是否以及如何满足这些请求。 如 这个例子,用于财务分类帐的智能合约执行与集中式数据库管理员相同的三项任务:检查是否有足够的资金,从一个帐户中扣除并添加到另一个帐户中。

正如我已经讲过的,这两种范例都是有效的,并且各有其优缺点 之前深入讨论。 总而言之,比特币风格的交易约束提供了出色的并发性和性能,而以太坊风格的智能合约则提供了更大的灵活性。 因此,回到什么是智能合约的问题:

智能合约适用于无法通过交易约束实现的区块链用例。

给定使用智能合约的标准,我还没有看到合格的合格区块链的强大用例。 我知道的所有引人入胜的区块链应用程序都可以用比特币式交易实现,该交易可以处理许可和常规数据存储,以及资产创建,转移,托管,交换和破坏。 尽管如此,新的用例仍在出现,如果有些用例,我也不会感到惊讶 do 需要智能合约的力量。 或者至少是比特币范式的扩展。

无论答案是什么,记住的关键是智能合约只是限制数据库中执行的交易的一种方法。 这无疑是有用的事情,并且对于使该数据库可以安全共享至关重要。 但是智能合约无法做任何其他事情,并且它们当然无法逃脱它们所驻留的数据库的边界。

请发表任何评论 在领英.

时间戳记:

更多来自 Multichain