以太坊预言机合约:我们可以信任预言机吗?
已发表: 2022-03-11本文是关于使用以太坊预言机合约的三部分系列文章的最后一部分。
- 第一部分是介绍如何使用 truffle 框架设置、运行和测试代码。
- 第二部分对代码进行了一些研究,并将其作为讨论 Solidity 的一些代码和设计特性的起点。
现在,在最后一部分中,我想问几个问题:我们刚刚做了什么,为什么? 并尝试提供一些有希望的发人深省的思考途径。 对于预言机的使用与去信任有何关系,以及与区块链相关的“去信任”一词在实际使用中的实际含义,陪审团仍然非常不清楚。 当我们将其中一些想法从它们的概念形式带入实际应用时,我们将被迫与这样的问题搏斗并接受这些问题。 那么让我们开始吧。
回顾:为什么我们需要以太坊预言机?
这触及了在区块链上执行代码的本质。 为了满足不变性和确定性的要求,并且作为代码由链上节点实际执行的方式的人工制品,智能合约无法直接到达区块链之外做好任何事情。
对于大多数程序员来说,这一事实引入了一种非常不自然的思维方式。 如果我们需要来自某个地方的数据,通常我们只是连接到某个地方并拉取它。 需要天气预报数据的智能合约? 只需连接到天气源。 但不是; 区块链智能合约绝对不能做到这一点; 如果某些数据尚未在区块链上,则合约代码在执行时无法访问它。 因此,解决方案是在合同执行时已经在区块链上拥有所需的数据。 这需要外部机器,而不是将数据拉入链中,而是将数据推送到链上,专门供其他合约使用。 那个外部机器就是神谕。 推送到链上的数据被推送到一个预言机合约中,然后该合约可能已经为与其他合约共享它做出了规定。 该设置的一个示例正是我们在这篇文章三部曲的前两部分中构建和检查的内容。
明显的安全漏洞
对我来说,所有公共区块链涉及的核心问题是 T 字:信任。 最纯粹的是,这些系统正在尽最大努力保证(在这个世界上没有完美的保证是可能的,但尽可能接近)我们不必盲目地信任任何一方。 精明的读者可能已经质疑拳击投注示例中的一些明显的安全漏洞。 我想重点关注那些对于我们讨论去信任以及它与使用智能合约的预言机的关系最重要的那些。
1. 投注合约的所有者/维护者可能存在腐败
从 BoxingBets.sol 的第 58 行开始,我们有以下函数:
/// @notice sets the address of the boxing oracle contract to use /// @dev setting a wrong address may result in false return value, or error /// @param _oracleAddress the address of the boxing oracle /// @return true if connection to the new oracle address was successful function setOracleAddress(address _oracleAddress) external onlyOwner returns (bool) { boxingOracleAddr = _oracleAddress; boxingOracle = OracleInterface(boxingOracleAddr); return boxingOracle.testConnection(); }
应该很清楚这允许什么。 合同所有者(并且只有合同所有者)可以在任何时候不受任何限制地更改用于服务拳击比赛的预言机并确定获胜者。 为什么这是个问题? 如果这对您来说还不是很明显,这允许合同所有者故意滥用合同谋取私利。
示例:下一场即将到来的拳击比赛是 Soda Popinski 对 Glass Joe。 苏打水显然是最受欢迎的。 每个人都赌苏打水。 大量的钱骑在上面。 我,合同所有者,决定拉一个快速的。 就在比赛决定之前,我将预言机更改为我自己的恶意预言机,这与官方预言机相同,只是硬编码宣布 Glass Joe 为获胜者。 它宣称玻璃乔,我赚了所有的钱,没有人能阻止我。 在那之后,也许没有人会再相信我的合同了,但假设我不在乎; 也许我编写和发布合同的唯一目的是为了进行抢劫。
有哪些替代方案?
1. 不允许更改预言机
我们在上面发现的问题源于我们允许合约所有者更改预言机这一事实。 那么,假设我们只是对预言机地址进行硬编码,并且根本不允许更改它? 好吧,我们实际上可以做到这一点,这不是不可能的。 但随之而来的问题是,如果那个预言机退出——出于某种原因停止提供数据怎么办? 然后我们需要获得一个新的神谕。 或者,如果最初受信任的预言机被证明是腐败的并且不再受信任怎么办? 同样,我们将要更改为新的预言机。 如果我们对预言机进行硬编码,那么更改预言机的唯一方法是发布使用不同预言机的新合约。 好的,再次,我们可以做到这一点。 这不是不可能的。 当然,请注意,智能合约不能像网站那样容易更新。 那不是很容易吗? 如果您发现错误或安全漏洞,您只需修补它,没有人更聪明。 智能合约部署模型更接近于收缩包装的软件模型; 一旦软件在用户手中,它就在那里,你无法修复它。 您必须提示用户手动升级自己。 智能合约有点类似。 一旦该合约在区块链上,它与区块链的其余部分一样是不可变的,除了您编写了使其可变的逻辑的部分。
不过,这不一定是阻止程序; 现在有很多关于如何使智能合约可修改的模型和思想流派。 这个主题本身就是一篇不错的文章,但现在你可以查看这篇 Hackernoon 文章,以及这篇关于智能合约策略的文章。
从用户的角度来看,这会是什么样子? 假设我正在考虑对即将举行的唐弗拉门戈比赛下注。 我清楚地看到,合约简单地硬编码了一个我已经知道并信任的预言机(好吧,信任足以下一定规模的赌注)。 就是这样了。 很简单。 如果合约所有者使用新的预言机发布新版本的合约,我仍然(应该)有继续使用旧预言机的自由。 也许会。 这取决于如何处理升级。 如果合同被禁用或销毁,我可能会倒霉。 但在香草的情况下,它应该仍然存在。
2. 锁定预言机持续时间
我们可以在代码中添加一些复杂性(对于一个太复杂的示例来说并不是真正需要的,但对于现实世界的解决方案,我们可能希望这种复杂性带来的好处),以减轻像上面描述的那样的恶作剧。 我认为一个非常合理的做法是添加在赌注期间“锁定”预言机的代码。 换句话说,合约的逻辑可以以非常清晰和简单的方式保证,无论我下注时出现的任何预言机都必须是用于确定获胜者的相同预言机。 因此,即使同时预言机发生变化,对于其他比赛、我的比赛和我的赌注,它也必须始终保持不变。 这与允许用户知道谁是预言机密切相关。
让我们举一个简单的例子来说明这一点。 我是用户。 我正在考虑对即将到来的 Little Mac 比赛下注。 合同中有一个工具可以让我检查用于确定这场比赛获胜者的预言机。 我确认该合同是任天堂体育提供的众所周知的合同。 我对那个预言有足够的信心。 (为了增加一点复杂性,也许合约允许用户从一组可用的预言机中选择给定匹配)。 现在我可以检查 oracle 的代码,并看到 oracle 的逻辑保证将使用相同的 oracle 来确定匹配的结果。 所以,作为投注者,我至少有这样的保证。 这并不排除我的预言机可能是坏的(即腐败或不可信)的事实,但它至少向我保证它不能在后台更改。
这里的一个风险是,在我下注和比赛决定之间,预言机“停业”(停止维护或更新)。 钱可能被锁定在合同中,变得无法收回。 为此,我们可以(也许)在合同中加入一个时间激活条款,其中如果一场比赛在某个时间或日期尚未确定(可能是比赛定义的一部分),它被认为是“死的”并且所有的钱都被锁定在里面返还给投注者。
3.让预言机是用户自定义的
一个更复杂(但可能更有趣)的方法是将预言机地址“留空”,从某种意义上说,以允许用户指定自己的预言机,并围绕这些预言机(通过合约)形成自己的投注池。 使用同一个预言机的用户组可以按照合约的逻辑一起下注。 这让用户有责任选择他们信任的预言机,并与其他志同道合的用户共享该预言机。 它实际上分散了博彩社区,因此只有在有大量用户群的情况下才会起作用; 否则,参与的投注者太少,无法真正使投注变得有趣和有利可图。 如果我是唯一一个用我最喜欢的预言机下注的人,那么那里没有太多的动力! 但另一方面,它有责任从合约所有者那里选择一个值得信赖的预言机,而他可以不用担心。 如果一些用户发现一个预言机不可信,他们会干脆停止使用它并切换到另一个,没有人会对合约所有者生气。 他只是提供了投注场地并光荣地履行了他的服务。
使这种策略更加复杂的是,我们必须以某种方式让一批有机的预言机在野外“生长”,以及完全适合这个解决方案的预言机。 我们必须向全世界广播潜在的预言机必须遵守的确切界面,并希望能够涌现出足够多的预言机,以便真正给用户一些选择。 也许我们可以用我们自己的一两个播种。 如果不采取,那么我们就没有投注 DApp。 但如果是这样,我不得不承认,用户选择的、在野外有机种植的预言机的想法是一个有趣且有吸引力的解决方案。
2. 预言机的所有者/维护者可能已经腐败
腐败,即不可信任的意义上的腐败; 预言机的所有者/维护者/管理员可能会宣布匹配的错误结果,以丰富自己。
示例:我是实际预言机的所有者/维护者,该预言机将拳击数据输入区块链以供投注合约使用。 我的预言机不直接参与任何投注或投注管理。 它的工作是简单地提供投注合约(可能还有任何数量的其他合约)可以使用的数据。 但是,我个人可以使用投注合同进行投注,而投注合同又使用我的预言机; 反正我是匿名的,所以我不怕任何报复。 一旦我对这样的合同下注,就会存在明显的利益冲突。 具体来说,我用真实和准确的信息更新我的预言的诚实可能与我的投注行为相冲突。
因此,假设在即将到来的 Sandman/von Kaiser 比赛中,von Kaiser 在很大程度上处于劣势,我继续对 von Kaiser 下了大赌注。 当冯凯撒如预期失败时,我用我的神谕错误地宣布他为赢家! 投注合同按应有的方式执行(此时无法阻止),我在比赛中杀人,没有追索权也没有办法惩罚我,生活还在继续。 也许,在那之后,人们不再使用我的预言机了; 也许我不在乎。
我们怎样才能防止这种情况发生?
现在我们面临一个更大的问题,它切入了与预言机有关的所谓去信任的核心。 预言机被信任为中立的第三方,甚至是可信的第三方。 问题是预言机是由人类运行的。 还有一个问题是预言机对客户合同如何履行其职责进行了大量控制,因为它提供了合同所依据的数据。 我们怎么知道我们可以信任给定的神谕?

我们为什么要相信任何神谕?
如果区块链智能合约的整个想法是消除信任任何人的需要,那么我们必须“信任”一个预言机这一事实难道不是在不信任的情况下飞行吗? 好吧,我想说:是时候长大了,儿子(或女儿)! 不存在纯粹的去信任,区块链也不提供去信任的环境。 区块链是促进人类互动的一层。 人际互动仍然是核心或最终结果,人际互动不能是不信任的。
链接:Oracle 问题
信任的演变
回到时间的黎明,我怎么能相信另一个人? 假设我在猎猛犸象,那家伙说他会帮我猎杀猛犸象,以换取一半的肉? 他怎么能相信我会提供一半? 一旦狩猎结束,我怎么能相信它不会击中我的头部并带走整个猛犸象?
回到那个时代,暴力威胁可能是多种社会经济信任的核心。 如果我试图窃取那个人的份额,我确信他会试图攻击我,这会给我带来风险。 即使我有信心在与他的战斗中获胜,我(作为一个穴居人)对战斗有足够的了解,知道任何事情都可能发生,即使我在技术上赢了,我也很容易受到危及生命的伤害。 这始终是一种风险和能源投资。 在那个世界上,这足以让人们保持诚实。
一般来说,我不会作弊,因为这样做不符合我的最大利益,总体而言,平均而言,这样做。 换句话说,欺骗的预期结果小于合作的预期结果。
如果情况并非如此,或者如果演员认为情况并非如此,则可能有一个或多个人会选择不参与。 例如,如果我看到对方是一个 9 英尺高的巨人,长着角和怪物的牙齿,我可能会选择逃跑,不做任何交易; 这家伙看起来对我来说太危险了,他可以简单地偷他喜欢的东西而不受惩罚。 如果我们大致相等,那么我们会认为我们处于这样一种情况,即欺骗不符合任何一方的最佳利益,合作符合我们双方的利益,因此,假设双方都是理智和理性的,双方将合作。
随着文化的发展,人类的互动也在发展。 他们变得不那么暴力了,尽管隐含的武力威胁并没有消失。 文化习俗给了人们更大的合作动力和不同类型的作弊抑制因素。
快进到早期文明时代; 我正在讨价还价买 100 蒲式耳小麦。 这是一种原始的期货合约; 我今天为下个月收割时收到的谷物付款。 我给那家伙我的铜币,我们握手,分享一杯大麦啤酒,然后分道扬镳,直到下个月才能完成合同。 似乎还可以。
我任凭那个人摆布; 他有我全部的钱,而我什么都没有。 那么是什么让我对他能够履行合同充满信心呢? 一些东西。 他是个商人; 他经常与当地民众做生意。 他和我认识的人做生意,而且他总是公平准时地交付。 他以诚实着称。 此外,我知道他对作弊有抑制作用。 他的谋生主要是因为他被认为是一个诚实的交易者。 如果他要骗我,我会让所有人都知道,这会损害他的良好声誉,从而损害他的生意。 与如果他的客户群抛弃他,他未来可能无法赚到的钱相比,他从欺骗我中赚到的钱将是很小的。 所以我知道欺骗我不一定符合他的最大利益。
这很棒; 上图没有武力或暴力威胁。 除了两件事:
- 武力威胁并非完全不存在。 另一个抑制作弊的因素可能是想到一个被骗的人会做什么。 我有武器,还有忠于我的朋友。 我,作为一个愤怒的被骗者,可以诉诸武力。 部落战就这样开始了!
- 也可能存在某种治理系统,该系统将评估案件的细节,并可能对商人处以罚款或将其送进监狱。 您的标准政府支持的抑制措施总是以武力威胁为后盾,因为拒绝支付罚款、拒绝入狱、拒绝遵守所有措施的潜在惩罚最终都是武力。 这一直延续到今天。 如果我拒绝支付罚款,我可能会被逮捕。 如果我拒绝被捕,就会有人对我使用武力,我可能会违背自己的意愿被关进监狱,甚至会被杀(如果我的抵抗足够顽强的话)。 在那里,我们看到只有两步之遥的武力威胁,即使是轻微的违规行为!
今天的去中心化信任
快进到今天。 违反合同的不利因素是什么? 它们与以前的情况有很大不同吗?
公司 X 有购买此产品的邮寄回扣。 您为什么相信他们会实现这一目标? 和前面的例子一样; 公司从小额作弊中获益甚少,而损害声誉则损失惨重。 这是许多信任场景背后的基础,并且由来已久。 再一次,就像在谷物商人的例子中一样,存在武力威胁,尽管在这种情况下,它不会发生这种情况。 公司可能会被罚款,或受到集体诉讼的惩罚,公司必须支付罚款或面临更严厉的惩罚。 这些惩罚得到了政府的支持,而政府又得到了经济和军事力量威胁的支持,尽管我们可以认为经济力量的威胁反过来又得到军事力量的支持,即暴力。
传统系统
以政府批准的武力为后盾的合同模式已经为人类服务了数千年? 或者有吗? 嗯,它有,但这是一个自然的进展。 在没有政府的情况下,一群人组成政府。 似乎您无法阻止人们组建政府; 它们会形成。
那么,区块链智能合约呢? 区块链和智能合约模型如何确保可信度,或抑制作弊行为? 不要只说“不信任”,那不是答案! 在我们之前的示例中,作弊以某种方式被抑制了。
让我们仔细看看区块链如何实现(或替代)该功能。
区块链系统:比特币
为了把这个大问题分解成小问题,让我们从比特币开始。 比特币如何抑制作弊行为? 我可以自由运行任何我想要的比特币节点软件,只要它看起来遵守比特币网络的协议。 没有人阻止我运行我自己的比特币节点,在遵守网络协议的同时做它想做的事; 有什么方法可以用来获取非法收益吗?
当然,我可以将任何类型的交易发布到比特币网络中以供批准。 我可以发布一个将你所有的比特币发送给我的交易,将它释放到网络上,等待它被添加到一个区块中,哇,现在你所有的比特币都属于我了吗? 不,因为加密。
我没有你的私钥,这样的交易必须用你的私钥签名。 所以,我被密码学阻止了。 还是我? 谁说这样的交易必须签署? 如果我尝试它会发生什么? 好吧,当然会发生的是整个比特币网络都会拒绝我的交易。 为什么会有人接受? 除了他们都在运行标准节点,这会立即拒绝它,他们为什么要帮我作弊? 这样做肯定会破坏比特币网络的完整性,从而破坏他们自己的加密财富。 所以他们帮助我这个匿名的陌生人欺骗另一个匿名的陌生人是没有意义的。 即使一个非理性的行为者以某种方式接受了我的无效交易,比特币网络的绝大多数都会拒绝它,它没有机会。 它再次被击败,这一次是纯粹的数字。
但是,如果我是一个强大的采矿企业怎么办? 当然,现在我有更多的权力来解决对我有利的事情。 我有,但它仍然没有给我任何接近绝对权力的东西。 即使作为一个强大的矿工,如果我控制不到 50% 的网络,那我也做不了什么。 我有一些权力来选择将交易添加到区块中的顺序,但这几乎不是铸造或窃取硬币的权力。 即使我确实控制了超过 50% 的网络(假设读者知道众所周知的与比特币中的工作量证明相关的 51% 攻击),我的主要能力还是双花。 虽然这是一种很酷的力量,但这样做是否符合我的最大利益是非常值得怀疑的,因为它会破坏比特币的完整性。 似乎我最好用我的控制来挖掘所有的硬币,从而赚更多的钱,并维护这些财富所在的基础。 因此,我没有被打败,但我作弊的冲动被协议中有机内置的抑制因素所阻碍。 而这种抑制作用基本上得到了数字强度的支持; 比特币网络参与者的压倒性共识。
区块链智能合约和 Oracle 合约
什么是智能合约? 假设我部署了一个误导性的合同来欺骗人们向我汇款? 或者假设我部署了一个投注合约并使用了前面描述的一种攻击(如果你可以这样称呼它们)? 我可以这样做,它可能会愚弄一些人; 我作为一个不诚实的演员,可能会从这样的努力中获得一些微薄的利润。 对它的防御是每个参与者都仔细考虑(就像对待任何合同一样)他们将成为一方的合同,以及可能被滥用的方式。 他们还应该考虑来源——他们对发布和维护合同的一方以及任何相关的预言机或相关合同的了解(如果有的话)。 人们会希望一份不诚实的合同不会持续很长时间,然后网络会非正式地将其标记为不诚实,导致参与者自愿回避,将其切断。 网络很大,消息传得很快。
除了在某些时候,你仍然需要信任一个人。 投注合约的数据由预言机提供。 神谕是由人类维护的。 无论您添加多少层以试图保持网络诚实,它仍然会在某个时候回到人类身上。 那么,以我们的投注示例为例,您会信任哪种类型的预言机? 通过作弊,我会相信一个失去比得到更多的神谕。 示例:假设 ESPN 或类似的网络是预言机的赞助商。 你会比任何人都更希望他们提供诚实的数据,因为在拳击赌注中非法赢得小额奖金会被由此造成的声誉损失所掩盖。 在这种情况下,您的信任是很好的,就像我们信任诚实的粮商一样。 这种类型的信托安排是古老而完善的。
那么,我们在使用智能合约方面获得了什么? 智能合约与治理或以前维护合约的方法有何不同?
包起来
只是为了说明一个观点,为思考和讨论提供食物,并结束我的文章,我将提出一些简单的观察,而不是硬性结论。 因为对于一个如此复杂的话题,一个简洁的结论感觉就像一个平淡无奇的故事和过于简单化。 我要提出的意见(请随时讨论/反驳/反驳)如下:
- 基于这样的假设,即对方从合作中获得的收益比从欺骗中获得的更多,这种信任是古老的,在实际情况中起作用,并且并没有消失。 它在区块链世界的某些情况下仍然是固有的,尽管在许多情况下可能会被消除。 在我们的 oracle 示例中,它仍然存在并且运行良好。
- 自古以来,基于武力或暴力威胁的信任也是人类社会固有的,但在我们的智能合约模型中明显缺失,取而代之的是通过加密和大量共识的巧妙组合来执行。
我挑战以太坊开发者做两件事:
- 想想任何方式,在公共区块链(例如比特币或以太坊)系统中,任何事情都是通过隐含或明确的武力威胁来实施的。
- 想想现代合同或金融法中的任何主要规则体系,它在某种程度上不是通过明确或隐含的武力威胁来执行的。
旧的东西,新的东西
而且我认为,与过去的系统相比,我们已经找到了主要区别,这也是我们说区块链系统是“革命性”的真正原因。 在我看来,这根本不是不信任,而是一个更稳定的信任平台,而且——最值得注意的是——一个完全不依赖武力或暴力威胁的平台。
一方面,在缺乏作弊动机的情况下,我们拥有久经考验的互惠互利保证。 这不是什么新鲜事。 新功能是引入了加密辅助共识,这有助于阻止作弊并保持系统诚实。 这两种元素的综合产生了真正非凡的东西,这在人类历史上尚属首次:一种可用于大型匿名群体的系统,在该系统中,没有任何地方可以发现明确或隐含的武力威胁作为一种抑制或惩罚. 我相信,这才是真正令人惊奇的地方。 如果忽略了这方面,我们所拥有的就是一项漂亮的新技术(我承认,这已经足够酷了)。 但是当考虑到这方面时,很明显我们已经进入了一个新的治理时代。