作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
约翰R. 科辛斯基的头像

约翰R. 辛斯

做了近二十年的全栈开发, 约翰研究过物联网, 区块链, 网络, 以及使用C/ c++的移动项目, .. NET, SQL和JS.

专业知识

以前在

摩根士丹利(Morgan Stanley)
分享

本文是关于以太坊oracle合约使用的三部分系列文章的最后一部分.

  • 第一部分 是否介绍了如何使用truffle框架设置、运行和测试代码.
  • 第二部分 看了一下代码,并以此为出发点讨论了一些可靠性的代码和设计特性.

现在,在最后一部分,我想问几个问题:我们刚刚做了什么,为什么? 并尝试提供一些发人深省的思考途径. 关于使用神谕与缺乏信任之间的关系,目前尚无定论, “无信任”这个词与区块链有什么关系, 实际上是指现实生活中的用法. 当我们把这些想法从概念形式转化为实际应用时, 我们将被迫与这样的问题搏斗并达成协议. 我们开始吧.

概述:为什么我们需要一个以太坊oracle?

这涉及到在区块链上执行代码的本质. 以满足不变性和确定性的要求, 并且作为链上的节点实际执行代码的方式的工件, 智能合约无法直接触及区块链之外的领域, 任何东西.

对于大多数程序员来说,这一事实引入了一种非常不自然的思维方式. 如果我们需要某个地方的数据,通常我们只需要连接到那个地方,然后把它拉出来. 一个需要天气预报数据的智能合约? 只要连上天气预报. But no; a blockchain smart contract ab索尔utely 可以不 这样做; if some data is 不 on the blockchain already, 合同代码在执行时无法访问它. 那么,解就是已经 在合同执行时,区块链上存在所需的数据. 这需要外部机器, 而不是将数据拉入链中, 将数据推送到链上, 专供其他合同使用. 外部机器就是神谕. 推送到链上的数据被推送到oracle合约中, 那么它大概已经为与其他合同共享它做了规定. 我们在本系列文章的前两部分中构建和研究的就是这种设置的一个示例.

以太坊oracle说明

明显的安全漏洞

对我来说,所有公共区块链涉及的核心问题是T字:信任. 最纯粹的时候, 这些系统所做的是尽其所能保证(在这个世界上不可能有完美的保证, 但尽可能地接近)我们不必盲目地相信任何一方. 机敏的读者可能已经对其中一些明显的安全漏洞提出了质疑 在Boxing Bets的例子中. 我想把重点放在那些对我们讨论无信任最重要的问题上,以及它与智能合约中预言机的使用之间的关系.

1. 博彩合同的所有者/维护者可能是腐败的

从第58行开始 BoxingBets.索尔 我们有以下功能:


    /// @不ice设置打包oracle契约的地址 

    /// @dev设置错误的地址可能会导致错误的返回值或错误 

    /// @param _oracleAddress打包oracle的地址 

    ///如果连接到新的oracle地址成功返回true

    函数set甲骨文Address(地址_oracleAddress)外部onlyOwner返回(bool) {

        boxing甲骨文Addr = _oracleAddress;

        boxing甲骨文 = 甲骨文Interface(boxing甲骨文Addr); 

        返回boxing甲骨文.testConnection ();

    }

应该很清楚这允许什么. 合同所有者(并且只有合同所有者)可以, 在任何时间,没有任何限制, 改变用来为拳击比赛服务的神谕,并决定获胜者. 为什么这是个问题? 如果你还不明白的话, 这使得合同所有人可以为了自己的利益而故意滥用合同.

例子: 下一个即将到来的拳击比赛是Soda Popinski对. 玻璃乔. 苏打水显然是最受欢迎的饮料. 大家都赌汽水. 很多钱都押在这上面了. 作为合同的所有者,我决定开个玩笑. 就在比赛决定之前, 我把神谕改成了我自己的恶意神谕, 除了硬编码宣布“眼镜乔”获胜之外,它与官方甲骨文完全相同. 它宣称,玻璃乔,我赚了所有的钱,没有人能阻止我. 在那之后,也许没人会再相信我的合同了, but suppose I don’t care; maybe I wrote and published the contract just for the 索尔e purpose of pulling that heist.

有什么替代方案吗??

1. 不允许修改oracle

我们在上面发现的问题, 起因于我们允许合约所有者更改oracle. 因此,假设我们只是硬编码oracle地址,并且根本不允许对其进行更改? 其实我们可以这么做,这不是不可能的. 但问题来了,如果oracle退出了——不管出于什么原因停止提供数据? 那我们就得找个新的神谕师. 或者,如果那个最初被信任的神谕,后来被证明是腐败的,不再被信任? 同样,我们将希望更改为新的oracle. 如果我们硬编码神谕, 那么改变oracle的唯一方法就是发布一个使用不同oracle的新合约. 好的,再一次,我们 可以 这样做. 这不是不可能的. 当然,请注意,智能合约不可能像网站那样容易更新. 那不是很容易吗? 如果你发现了一个bug或安全漏洞,你只需修补它,没有人会知道. The smart contract deployment model is a bit closer to the shrink-wrapped software model; once the software is in the user’s hands, 它就在那里,你无法修复它. 必须提示用户手动升级. 智能合约有点类似. 一旦合约在区块链上, 它和区块链的其他部分一样是不可变的, 除了那些你写了逻辑使它可变的部分.

This is 不 necessarily a blocker though; there are lots of models and schools of thoughts 现在 on how to make a smart contract modifiable. 这个话题本身就是一篇不错的文章,但现在你可以看看这个 Hackernoon文章,以及…… 这篇文章是关于智能合约策略的.

从用户的角度来看会是什么样子呢? 假设我正在考虑对即将到来的弗拉门戈舞比赛下注. 我清楚地看到,这个合同简单地硬编码了一个我已经知道并信任的神谕, 信任到可以下一定的赌注). 就是这样. 很简单. 如果合同所有者使用新的oracle发布了新版本的合同, 我仍然有继续使用旧版本的自由. 好吧,也许. 这取决于如何处理升级. 如果合同被禁用或销毁,我可能就没那么幸运了. 但在普通情况下,它应该仍然成立.

2. 在此期间锁定oracle

我们可以在代码中添加一些复杂性(对于一个过于复杂的示例来说,这是不可取的), 但对于现实世界的解决方案,我们可能希望这种复杂性带来的好处,以减轻上面描述的恶作剧. 我认为这是一件非常合理的事情, 是添加代码,在打赌期间“锁定”oracle. 换句话说,合同的逻辑可以保证在一个非常明确的 & 简单的方法, 无论我下注时使用的是什么神谕,都必须与用来决定赢家的神谕相同. 所以即使神谕在此期间改变了, 其他比赛, 为了我的比赛, 我敢打赌,它一定会一直保持不变. 这与允许用户知道oracle是谁密切相关.

让我们用一个简单的例子来说明这一点. 我是一个用户. 我在考虑下赌注赌即将到来的小麦克大战. 合同中有一个设施允许我检查将被用来确定这场比赛的获胜者的预言. 我证实这份合同是任天堂体育公司提供的一份知名合同. 我对那个神谕很有信心. (为了增加一点复杂性, 也许合约允许用户从一个给定匹配的可用oracle数组中进行选择). 现在我可以检查oracle的代码了, 并且查看oracle的逻辑保证将使用相同的oracle来确定匹配的结果. 所以我,作为赌者,至少有这种把握. 这并不排除事实,我的甲骨文可能是坏的(i.e. 腐败或不可信),但它至少向我保证,它不能在后台更改.

这里的一个风险是,在我下注的时间之间,oracle会“停业”(停止维护或更新), 比赛就这么定了. 钱可能会被锁定在合同中,变得无法收回. 为那, 我们可以(也许)在合同里加上一个时效条款, 其中,如果比赛在某个时间或日期前未确定(可以是比赛定义的一部分), 它被认为是“死的”,所有锁在里面的钱都会返还给投注者.

3. 让oracle是用户自定义的

更复杂(但可能更有趣)的是将oracle地址保留为“空白”。, 在某种意义上, 允许用户指定自己的oracle, 并围绕这些神谕建立自己的赌注池(通过合约). 使用同一个oracle的用户组可以按照合约的逻辑一起下注. 这让用户有责任选择他们信任的oracle, 并与其他志同道合的用户分享. 它实际上分裂了博彩界, so it would only work if there was a large user base; otherwise, 参与赌博的人太少,无法真正使赌博变得有趣和有利可图. 如果我是唯一一个押注我最喜欢的神谕的人,那就没有太多的动机了! 但另一方面, 它负责从合同所有者中选择一个值得信赖的oracle, 他可以洗手不干了. 如果一些用户发现oracle不值得信任, 他们只会停止使用它,转而使用另一种, 没有人会对合同所有者生气. 他只是提供了赌博场所,并光荣地履行了他的服务.

让这一策略更加复杂的是,我们必须以某种方式让一批有机的神谕在野外“生长”, 和正好符合这个解的. 我们必须向世界公布潜在神谕必须遵循的确切接口, 希望有足够多的应用涌现出来,给用户一些选择. 也许我们可以用一两个我们自己的种子. 如果它不接受,那么我们就没有博彩DApp. 但如果是这样, 我不得不承认,用户选择的想法, 在野外有机种植神谕是一个有趣而有吸引力的解决方案.

2. oracle的所有者/维护者可能已经损坏

就是腐败, in the sense of untrustable; that the owner/maintainer/manager of the oracle is likely to proclaim an incorrect outcome for a match, 为了充实自己.

例子: 我是实际oracle的所有者/维护者,它将拳击数据提供给区块链以供下注合同使用. 我的甲骨文不直接参与任何投注或投注的管理. 它的工作只是提供数据, 投注合约(或者其他合约)可以使用哪一种. 然而, I may personally place a bet using the betting contract that in turn uses my oracle; I am anonymous anyway, 所以我不怕任何报复. 一旦我对这样的合同下了赌注,就会有明显的利益冲突. 具体地说, 我用真实和准确的信息更新我的预言的诚实可能与我的投注行为相冲突.

假设在即将到来的睡魔/冯·凯泽比赛中, 其中冯·凯泽是绝对的失败者, 我就把大笔赌注押在冯·凯泽身上. 当冯·凯泽不出所料地输掉时,我会用神谕错误地宣布他是胜利者! 投注合约按预期执行(此时无法停止), 我在比赛中大赚了一笔, 没有追索权,也没有办法惩罚我, 生活还在继续. Perhaps, after that, people refuse to use my oracle anymore; perhaps I don’t care.

我们如何预防这种情况?

现在我们面临一个更大的问题,这个问题触及了所谓的不信任感的核心,因为它与神谕有关. 这个神谕被认为是 中立第三方 甚至是一个可信的第三方. 问题是神谕是由人类运行的. 还有一个问题是,由于oracle提供了合同所依据的数据,因此它对客户合同如何履行其职责进行了大量的控制. 我们怎么知道我们可以信任一个给定的神谕?

我们为什么要相信神谕?

如果区块链智能合约的整个想法是消除信任任何人的需要, 因此,我们必须“信任”神谕的事实,难道不是在面对不可信的情况时显得格格不入吗? 嗯,我想说:是时候长大了,儿子(或女儿)! 不存在纯粹的不信任, 区块链并没有提供一个不可信的环境. 区块链是一个促进人类互动的层. 人与人之间的互动仍然是核心或最终结果,人与人之间的互动不可能是不可信的.

链接: 甲骨文问题

信任的演变

在时间之初,我怎么能相信另一个人? 假设我在猎杀猛犸象, 那个人说他会帮我猎杀猛犸象, 换一半的肉? 他怎么能相信我会提供那一半? 我怎么能相信狩猎结束后,它不会击中我的头,把整头猛犸象吃掉呢?

回到那个时代, 暴力威胁可能是许多社会经济信任的核心. 如果我想抢那家伙的那份, 我确信他会攻击我, 这给我带来了风险. 即使我有信心在和他的比赛中获胜, 我(作为一个穴居人)对战斗有足够的了解,知道任何事情都有可能发生, 即使我技术上赢了,我也很容易受到危及生命的伤害. 这总是一种风险,也是一种精力投资. 在那个世界里,这足以让人们保持诚实.

一般来说,我不会作弊,因为 这不符合我的最大利益总体上和平均上都是如此. 换句话说,欺骗的预期结果小于合作的预期结果.

如果不是这样的话, 或者如果演员意识到事实并非如此, 可能会有一个或更多的人选择不参与. 例如, 如果我看到另一个人是一个9英尺高的巨人,长着角和怪物的牙齿, I might just choose to run away and 不 make any deal; the guy looks too dangerous for me to deal with, 他可以偷他喜欢的东西而不受惩罚. 如果我们势均力敌, 然后我们意识到我们处于一种欺骗对双方都没有好处的情况下, 合作符合我们双方的利益, 因此, 假设双方都是理智和理性的, 双方将合作.

甲骨文契约与信任的演变

随着文化的发展,人与人之间的互动也在发展. 他们变得不那么暴力了,尽管隐含的武力威胁并没有消失. 文化习俗给予人们更大的合作动机和不同类型的欺骗抑制.

Fast forward to a time of early civilization; I am making a bargain to buy 100 bushels of wheat. It’s sort of a primitive futures contract; I am paying today for grain that I will receive when it’s harvested next month. 我把我的铜币给了他, 我们握手, 一起喝一杯大麦啤酒, 我们下个月再解决合同问题. 似乎好了.

I’ve put myself at that guy’s mercy; he has the full amount of my money, and I 有 不hing yet. 是什么让我相信他会履行合同呢? 几件事. He is a businessman; he regularly does business with the local populace. 他和我认识的人做过生意,而且他总是公平、准时地交货. 他以诚实著称. 此外,我知道他对作弊有抑制作用. 他的谋生主要是基于他是一个众所周知的诚实的商人这一事实. 如果他要欺骗我, 我会让每个人都知道, 这会损害他的好名声, 因此他的事业. 他从欺骗我中赚到的钱,与未来如果他的客户群抛弃他,他可能无法赚到的钱相比,将是微不足道的. 所以我知道欺骗我不一定符合他的最佳利益.

This is great; the threat of force or 暴力 is absent from that above picture. 除了两件事:

  1. 武力的威胁并非完全没有. 另一个抑制欺骗的因素可能是被欺骗的人会做什么. 我有武器,还有忠于我的朋友. 我,作为一个愤怒的被欺骗的一方,可以诉诸武力. 部落战争就是这样开始的!
  2. 也可能存在某种形式的治理系统, 谁会评估案件的细节,并可能对商人处以罚款或把他关进监狱. 标准的政府支持的抑制措施总是以武力威胁为后盾, 因为拒绝支付罚款的潜在惩罚, 拒绝入狱, 拒绝遵守所有措施的, 最终是武力. 这一直延续到今天. 如果我拒绝缴纳罚款,我可能会被逮捕. 如果我拒绝被逮捕, 他们会对我使用武力, 我可能会被关进监狱,甚至被杀(如果我的反抗足够顽强的话)。. 在那里,我们看到,即使是轻微的违规行为,也只有两步之遥的武力威胁!

今天去中心化信任

快进到现在. 违约的动机是什么? 它们与之前的场景有很大不同吗?

X公司对购买这种产品有邮寄回扣. 你为什么相信他们会兑现承诺? Same as in the previous example; the company has little to gain by cheating on a petty amount, 损害他们的声誉也会损失惨重. 这是许多信任场景背后的基础,并且已经存在了很长时间. 一次又一次, 就像粮商的例子一样, 有武力的威胁, 尽管在这种情况下, 不会走到那一步的. 这家公司可能会被罚款, 或者受到集体诉讼的惩罚, 该公司必须支付罚款,否则将面临更严厉的处罚. 这些惩罚是由政府支持的, 这反过来又以武力威胁为后盾, 经济和军事, 尽管我们可能会认为,经济力量的威胁反过来是由军事力量支持的, i.e. 暴力.

传统的系统

几千年来,由政府批准使用武力支持的契约模式一直为人类服务? 是这样吗?? 是的,但这是一个自然的过程. 在没有政府的情况下,人民团体组成政府. It almost seems like you 可以’t stop people from forming governments; they will form.

那么,区块链智能合约呢? 区块链和智能合约模型如何确保可信度,或抑制作弊? 不要只说“不信任”,那不是答案! 在我们之前的例子中,作弊在某种程度上是不受激励的.

让我们仔细看看区块链是如何实现(或取代)这个功能的.

区块链系统:比特币

为了把这个大问题分解成更小的问题,让我们从比特币开始. 比特币是如何抑制作弊的? 我可以自由运行任何我想要的比特币节点软件, 只要它符合比特币网络的协议. No one discourages me from running my own homespun bitcoin node that does what it wants while adhering to the network protocols; is there any way in which I 可以 use that for illicit gains?

当然,我可以将任何类型的交易发布到比特币网络中以获得批准. 我可以发布一个交易,将你所有的比特币发送给我, 将其释放到网络上, 等待它被添加到块中, 和哇, 现在 你所有的比特币都是我的? 不,因为加密.

我没有你的私钥,这样的交易必须用你的私钥签名. 所以,我被密码学挡住了. 还是我? 谁说这样的交易必须签名? 如果我尝试了会发生什么? 当然,接下来会发生的是,整个比特币网络都会拒绝我的交易. 为什么会有人接受呢? 除了它们都在运行标准节点之外, 谁会立刻拒绝它, 他们为什么要帮我作弊? 这样做肯定会破坏比特币网络的完整性,从而破坏他们自己的加密财富. 所以他们帮助我,一个匿名的陌生人,去欺骗另一个匿名的陌生人是没有意义的. 即使一个非理性的行为者以某种方式接受了我的无效交易, 绝大多数比特币网络都会拒绝它, 它没有机会. 它又被打败了,这次是绝对的数量.

但是,如果我是一个强大的采矿操作呢? 当然,现在我有更多的权力来为自己谋利. 我知道,但这还不能给我绝对的权力. 即使作为一个强大的矿工,如果我控制的网络不到50%,那么我也做不了什么. 我有权选择将交易添加到块中的顺序, 但这并不是铸造或偷窃硬币的权力. 即使我控制了超过50%的网络(假设读者知道) 众所周知的51%攻击 与比特币中的工作量证明(proof-of-work)相关,我的主要权力是双重支出. 虽然是一种很酷的能力, 这样做是否符合我的最佳利益,这是非常值得怀疑的, 因为这会破坏比特币的完整性. 似乎我最好使用我的控制权来开采所有的硬币, 从而赚更多的钱, 并维护财富的根基. 因此, 我没有被打败, 但我作弊的冲动被协议中固有的抑制因素所抑制. And that disincentive is basically supported by strength of numbers; the overwhelming consensus of the participants on the bitcoin network.

区块链智能合约和甲骨文合约

什么是智能合约? 假设我部署了一个误导性的合同,诱使人们把钱寄给我? 或者假设我部署了一个下注合约,并使用了前面描述的一种攻击(如果可以这样称呼的话)? 我可以这么做, it might fool some people; I, 作为一个不诚实的演员, 也许能从这样的努力中赚点小钱. 为了防止这种情况的发生,每个参与者都应该仔细考虑(就像对待任何合同一样)他们即将加入的合同, 以及它可能被滥用的潜在方式. 他们还应该考虑来源——什么, 如果有什么区别的话, 他们知道发布和维护合同的一方以及任何相关的指示或相关的合同. 人们希望不诚实的合同不会持续太久,直到网络非正式地将其标记为不诚实, 导致参与者自愿避免它, 切断它. 网络庞大,消息传播迅速.

但在某些时候,你还是需要相信一个人. 投注合同的数据由oracle提供. 神谕是由人类维护的. 不管你加了多少层来保持网络的诚实, 它还是会在某个时候回到人类身上. 根据我们的赌博例子,你会相信哪种类型的神谕? 我会相信一个通过欺骗失去的比得到的更多的神谕. 例如:假设ESPN或类似的电视网是甲骨文的赞助商. 你会预料到的, 比任何人都多, 提供真实的数据, 因为在拳击比赛中非法赢得一小笔钱会被由此造成的名誉损失所掩盖. 在这种情况下,你的信任是正确的,就像我们信任诚实的粮食商人一样. 这种类型的信任安排是古老而完善的.

那么,我们在使用智能合约中获得了什么? 智能合约与治理或以前的维护合约的方法有何不同?

结束

只是为了说明一点, 为思考和讨论提供素材, 来结束我的文章, 我将提出一些简单的观察结果, 而不是硬下结论. 因为对于一个如此复杂的话题, 一个简洁的结论感觉就像一个故事和过度简化. 我将要提出的观点(请随意讨论/反驳/反驳)如下:

  • 信任建立在合作比欺骗更能让对方获益的假设之上,这种假设由来已久, 在实际情况下工作, 并没有消失. 在区块链世界的某些情况下,它仍然是固有的, 虽然可能在很多情况下被消除. 在我们的oracle示例中,它仍然存在并且运行良好.
  • 基于武力或暴力威胁的信任也自古以来就存在于人类社会中, 但 明显缺席 从我们的智能合约模型, 取而代之的是通过加密和大数共识的巧妙结合的强制执行.

我向同伴挑战 Ethereum开发者 做两件事:

  1. 想想看, 在公共区块链系统中(如比特币或以太坊), 在这种情况下,任何事情都是通过暗示或明确的武力威胁来强制执行的.
  2. 想想现代合同法或金融法中的任何主要规则体系,这是 在某种程度上,通过明确或隐含的武力威胁来强制执行.

信任的演变与国家权力的阐释

有些旧的,有些新的

我想我们已经知道了主要的区别, 事实上,我们说区块链系统是“革命性的”,, 与过去的系统相比. 在我看来, 这根本不是不信任, 而是一个更稳定的信任平台,最值得注意的是,一个完全不依赖武力或暴力威胁的平台.

一方面,一方面, 在缺乏欺骗动机的情况下,我们有古老的、久经考验的互利保证. 这没什么新鲜的. 新的是加密辅助共识的引入, 这有助于阻止作弊和保持系统的诚实. 这两种元素的合成产生了一些真正了不起的东西, 这可能是人类历史上第一次:一个可用于大型的系统, 匿名组织, 其中没有发现明确或隐含的武力威胁作为一种抑制或惩罚. 我相信,这才是真正令人惊奇的. 如果这方面被忽视, 我们拥有的是一项漂亮的新技术(我承认!, 已经够酷了). 但考虑到这一点,很明显,我们已经进入了一个新的治理时代.

了解基本知识

  • 什么是智能合约?

    智能合约是在以太坊虚拟机上执行的计算机代码. 智能合约可以发送和接受以太和数据. 契约本质上是不可变的,除非程序另有规定.

  • 区块链中的oracle是什么?

    所谓的区块链oracle是一种可信的数据源,提供有关智能合约使用的各种状态和事件的信息.

  • 智能合约oracle是用来做什么的?

    智能合约预言机用于提供现实世界事件与数字合约之间的联系. oracle提供的外部数据可能(也可能不)触发智能合约的执行.

就这一主题咨询作者或专家.
预约电话
约翰R. 科辛斯基的头像
约翰R. 辛斯

位于 泰国清迈

成员自 2016年2月9日

作者简介

做了近二十年的全栈开发, 约翰研究过物联网, 区块链, 网络, 以及使用C/ c++的移动项目, .. NET, SQL和JS.

Toptal作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

专业知识

以前在

摩根士丹利(Morgan Stanley)

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

Toptal开发者

加入总冠军® 社区.