个性化阅读
专注于IT技术分析

以太坊Oracle合同:我们可以信任Oracle吗?

点击下载

本文概述

本文是有关以太坊oracle合约用法的三部分系列的最后一部分。

  • 第一部分是对使用松露框架进行设置, 运行和测试的代码的介绍。
  • 第二部分对代码进行了一些研究, 并将其用作讨论Solidity的一些代码和设计功能的起点。

现在, 在最后一部分中, 我想问一些问题:我们刚刚做了什么, 为什么?并尝试提供一些希望的发人深省的思想途径。关于使用oracles与不信任关系以及与区块链相关的”不信任”一词在现实世界中的实际含义, 仍然存在很多争议。当我们将其中一些想法从概念形式引入实际应用时, 我们将被迫与这样的问题进行交涉并达成协议。让我们开始吧。

回顾:为什么我们需要一个以太坊预言家?

这触及了在区块链上执行代码的本质的核心。为了满足不变性和确定性的要求, 并且作为链上节点实际执行代码的方式的产物, 智能合约无法直接到达区块链之外以做任何事情。

对于大多数程序员而言, 这一事实引入了一种非常不自然的思维方式。如果我们需要某个地方的数据, 通常我们只需将其连接到某个地方并将其拉出即可。需要天气报告数据的智能合约吗?只需连接到天气供稿即可。但不是;区块链智能合约绝对不能做到这一点;如果某些数据尚未在区块链上, 则合同代码在执行时无法访问。因此, 解决方案是在合同执行时在区块链上已经存在所需的数据。这需要外部机制, 而不是将数据拉入链中, 而是将数据推入链中, 专门供其他合同使用。那外部机器就是神谕。推入链中的数据被推入Oracle合同中, 然后大概已为与其他合同共享数据作了准备。这种设置的一个例子正是我们在本文三部曲的前两部分中构建和检查的。

以太坊甲骨文插图

明显的安全孔

对我来说, 所有公共区块链中涉及的中心问题是T字:信任。从最纯粹的角度来看, 这些系统正在做的事情就是尽最大努力保证(在这个世界上不可能有完美的保证, 但是要尽可能地接近)我们不必盲目地信任任何一方。精明的读者可能已经对Boxing Bets示例中的一些明显的安全漏洞提出了质疑。我想集中讨论那些对于我们讨论不信任以及它与智能合约中的oracle的使用如何联系最重要的问题。

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。汽水显然是最受喜爱的。每个人都在苏打上下注。数不清的钱骑在它上面。我, 合同的所有者, 决定拉快。在比赛确定之前, 我将oracle更改为我自己的恶意oracle, 它与官方oracle相同, 只不过它采用硬编码方式宣布Glass Joe为获胜者。它宣布格拉斯·乔(Glass Joe), 我赚了所有的钱, 没有人能阻止我。在那之后, 也许没人会再相信我的合同了, 但是假设我不在乎;也许我写和发布合同只是为了拉劫。

有哪些替代方案?

1.不允许更改预言

我们上面发现的问题是由于我们允许合同所有者更改预告片而引起的。因此, 假设我们只是对oracle地址进行硬编码, 而根本不允许对其进行更改?好吧, 我们实际上可以做到, 这不是不可能的。但是, 随之而来的问题是, 如果那个预言家退出了该怎么办-无论出于何种原因停止提供数据?然后, 我们需要获取一个新的Oracle。或者, 如果最初被信任的那个预言家被证明已损坏并且不再受信任, 该怎么办?同样, 我们将要更改为新的oracle。如果我们对Oracle进行了硬编码, 则更改Oracle的唯一方法是发布使用其他Oracle的新合同。好的, 再次, 我们可以做到这一点。这不是不可能的。请注意, 当然, 智能合约无法像网站那样容易地更新。那不容易吗?如果发现错误或安全漏洞, 只需修补它, 没有人会明智。智能合约部署模型更接近于收缩包装的软件模型。一旦软件在用户手中, 它就已经存在, 你无法修复它。你必须提示用户手动升级自己。智能合约有点相似。该合同一旦在区块链上, 就和区块链的其余部分一样是不变的, 除非你编写了使其可变的逻辑部分。

但是, 这不一定是一个障碍。现在有很多关于如何使智能合约可修改的模型和思想流派。该主题本身将是很不错的文章, 但是现在你可以查看这篇Hackernoon文章以及有关智能合约策略的文章。

从用户的角度来看会是什么样?假设我正在考虑在即将到来的Don Flamenco比赛中下注。我可以清楚地看到, 合同毫不费力地对我已经知道并信任的一个预言进行了硬编码(好吧, 足够信任就可以进行一定程度的下注)。就是这样了。很简单如果合同所有者使用新的Oracle发布了合同的新版本, 我仍然(应该)具有继续使用旧合同的自由。也许。这取决于升级的处理方式。如果合同被禁用或销毁, 我可能会不走运。但是在香草味的情况下, 它仍然应该站立。

2.在持续时间内锁定oracle

我们可以在代码中添加一些复杂性(对于一个示例来说, 过于复杂并不是很理想, 但是对于现实世界的解决方案, 我们可能希望这种复杂性带来好处), 以便减轻上述问题的困扰。我认为要做的一个非常合理的事情是添加在下注期间会”锁定” oracle的代码。换句话说, 合同的逻辑可以非常清楚和简单地保证, 我下注时出现的任何预言都必须是用于确定获胜者的预言。因此, 即使在此同时预言发生变化, 其他比赛, 我的比赛和我的赌注也必须在整个过程中保持相同。这与允许用户知道谁是oracle齐头并进。

让我们用一个简单的例子来说明这一点。我是用户。我正在考虑对即将到来的Little Mac战斗打赌。合同中有一项设施, 使我可以检查将用于确定本场比赛获胜者的预言机。我确认该合同是任天堂体育公司提供的众所周知的合同。我对那个神谕有足够的信心。 (要增加一点复杂度, 也许合同允许用户从一系列给定匹配的预言中选择)。现在, 我可以检查oracle的代码, 并看到oracle的逻辑保证了将使用同一oracle来确定比赛的结果。因此, 作为投注者, 我至少有保证。这并不排除我的Oracle可能是恶意的(即损坏或不可信)的事实, 但至少可以确保我无法在后台对其进行更改。

这里的风险是, 在我下注与确定比赛之间, 甲骨文”停业了”(停止维护或更新)。金钱可能被锁定在合同中, 变得无法收回。为此, 我们可以(也许)在合同中加入一个时间激活条款, 其中, 如果某个比赛在某个时间或日期之前尚未决定(可能是比赛定义的一部分), 则该比赛被视为”停滞”, 而所有资金都被锁定在其中返回到投注者。

3.让oracle是用户定义的

从某种意义上讲, 甚至更复杂(但可能更有趣)的是将oracle地址保留为”空白”, 以允许用户指定自己的oracle, 并围绕这些oracle形成自己的投注池(通过合同)。遵循合同的逻辑, 使用相同预言的用户组可以一起下注。这使用户有责任选择他们信任的Oracle, 并与其他志趣相投的用户共享该Oracle。实际上, 它分散了博彩社区, 因此只有在拥有大量用户的情况下, 它才有效。否则, 涉及的投注者将很少使投注真正变得有趣和有利可图。如果我是唯一使用我最喜欢的甲骨文下注的人, 那就没有太多的激励了!但另一方面, 它有责任从合同所有人中选择一个值得信赖的预言家, 他可以自己洗手。如果某些用户发现不信任的甲骨文, 他们将停止使用该甲骨文, 而改用另一种甲骨文, 而没有人会生气于合同所有人。他只是提供了比赛场地, 并光荣地履行了自己的职责。

这种策略的复杂性在于, 我们不得不以某种方式让一批自然的甲骨文在野外”生长”, 而正是这些甲骨文完全适合此解决方案。我们必须向全世界广播潜在的甲骨文必须遵守的确切界面, 并希望有足够数量的甲骨文能够为用户提供一些选择。也许我们可以用我们自己的一两个种子进行批处理。如果不需要的话, 那么我们就没有下注DApp。但是, 如果这样做的话, 我不得不承认, 用户选择的, 有机种植的甲骨文在野外的想法是一种有趣且有吸引力的解决方案。

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

从不信任的意义上讲就是腐败;甲骨文的所有者/维护者/经理可能会宣称一场比赛有不正确的结果, 以充实自己。

示例:我是实际Oracle的所有者/维护者, 该Oracle将拳击数据馈送到区块链上以供投注合同使用。我的甲骨文没有直接参与任何投注安排或投注管理。它的工作是简单地提供投注合同(也许还有其他数量的合同)可以使用的数据。但是, 我个人可以使用投注合同进行投注, 而投注合同又使用我的甲骨文。无论如何我都是匿名的, 所以我不怕任何报应。一旦我对这种合同下注, 就会有明显的利益冲突。特别是, 我使用真实, 准确的信息更新Oracle的诚实性可能与我的投注行为相抵触。

因此, 假设在即将举行的桑德曼(Sandman)/冯·凯瑟(von Kaiser)比赛中, 冯·凯瑟(von Kaiser)很大程度上是弱者, 我继续对冯·凯瑟(von Kaiser)进行大量下注。当冯·凯泽(von Kaiser)如预期般失败时, 我会用我的甲骨文错误地称他为获胜者!博彩合同会按预期执行(目前无法阻止它), 我在比赛中杀了人, 没有追索权, 也没有办法惩罚我, 生命还在继续。在那之后, 也许人们不再使用我的神谕了。也许我不在乎。

我们如何防止这种情况?

现在, 我们面临的问题要大得多, 并且这涉及到与甲骨文有关的所谓”不信任”的核心问题。甲骨文被信任为中立的第三方, 甚至是受信任的第三方。问题是, 先知是由人管理的。另一个问题是, 甲骨文对客户合同的执行方式进行了很多控制, 因为它提供了合同所依据的数据。我们怎么能知道我们可以信任给定的甲骨文?

我们为什么要相信任何一个神谕?

如果区块链智能合约的整个想法是消除对任何人的信任的需求, 那么我们面对不信任就必须”信任”甲骨文的事实不是吗?好吧, 我会说:是时候长大了, 儿子(或女儿)!没有纯粹的不信任之类的东西, 而区块链也不提供不信任的环境。区块链是促进人类互动的一层。人与人之间的互动仍然是核心或最终结果, 并且人与人之间的互动不能没有信任。

链接:Oracle问题

信任的演变

时光倒流, 我怎么能相信另一个人呢?假设我正在狩猎猛mm象, 那个家伙说他会帮我狩猎猛mm象, 以换取一半的肉?他怎么能相信我会提供一半?一旦狩猎结束, 我怎么能相信这不会打我的脑袋, 并杀死整个猛mm象?

当时, 暴力威胁可能是许多社会经济信任的核心。如果我尝试窃取该家伙的股份, 我相信他会尝试攻击我, 这会给我带来风险。即使我有信心在与他的战斗中获胜, 我(作为穴居人)对战斗也很了解, 以至于知道会发生任何事情, 即使我在技术上获胜, 也很容易遭受致命的伤害。这始终是一种风险, 也是一种能源投资。在那个世界上, 这足以使人们保持诚实。

总的来说, 我不会作弊, 因为这样做并不符合我的整体利益。换句话说, 欺骗的预期结果小于合作的预期结果。

如果不是这种情况, 或者演员认为不是这种情况, 则可能一个或多个会选择不参加。例如, 如果我看到另一个人是一个9英尺高的巨人, 有角和怪兽的牙齿, 我可能会选择逃跑而不做任何事情;这个家伙对我来说太危险了, 他可以不受惩罚地偷走自己喜欢的东西。如果我们大致相等, 那么我们认为欺骗处于一种不利于任何一方的最大利益, 进行合作符合我们双方的利益, 因此, 假设双方理智而理性, 双方将合作。

Oracle合同与信任的演变

随着文化的发展, 人与人之间的互动也在发展。他们的暴力程度有所降低, 尽管隐性的武力威胁并没有消失。文化习俗给了人们更大的合作动机, 以及不同形式的欺骗手段。

快进到文明的早期;我正在讨价还价购买100蒲式耳小麦。这是一种原始的期货合约;我今天要为下个月收获的谷物付款。我给那个家伙我的铜币, 我们握手, 分享一杯大麦啤酒, 并且分道扬until直到下个月解决合同。好像还可以

我已经屈服于那个家伙的怜悯;他有我的全部钱, 而我什么都没有。那么, 是什么让我对他将兑现合同充满信心?一些东西。他是个商人;他定期与当地居民做生意。他与我认识的人做生意, 而且他总是公平, 准时地交往。他以诚实着称。此外, 我知道他对作弊有抑制作用。他主要以他是个诚实的商人为生来谋生。如果他欺骗我, 我会让大家知道, 这将损害他的良好声誉, 进而损害他的生意。如果他的客户群放弃了他, 他欺骗我所赚的钱与他将来可能无法赚到的钱相比将很小。所以我知道欺骗我不一定符合他的最大利益。

这很棒;上图没有武力或暴力威胁。除了两件事:

  1. 武力威胁并没有完全消失。对作弊的另一种抑制作用可能是想到被骗者会做什么。我有武器, 朋友们忠于我。作为一个愤怒的被骗政党, 我可以诉诸武力。这就是部落战争的开始!
  2. 可能还存在某种形式的治理系统, 该系统将评估案件的详细信息, 并可能对商人处以罚款或将其入狱。由政府支持的标准激励措施始终以武力威胁为后盾, 因为拒绝支付罚款, 拒绝入狱, 拒绝遵守所有措施的根本惩罚最终是武力。直到今天。如果我拒绝支付罚款, 我可能会被捕。如果我拒绝逮捕, 将对我使用武力, 而且我可能会违背我的意愿而入狱甚至被杀(如果我的抵抗力足够顽强)。在那里, 我们看到了只有两步之遥的暴力威胁!

如今的分散式信任

快进到今天。违反合同有哪些不利因素?它们与以前的方案有很大不同吗?

X公司有购买此产品的回扣。你为什么相信他们会做到这一点?与前面的示例相同;骗取零用钱对公司几乎没有好处, 而损害声誉则使公司损失很多。这是许多信任方案的基础, 并且已经存在了很长时间。再有, 就像在谷物商人的例子中那样, 存在武力威胁, 尽管在这种情况下, 武力威胁并不会解决。公司可能被罚款或受到集体诉讼的处罚, 公司必须支付罚款或面临更严厉的处罚。这些惩罚得到政府的支持, 而政府又受到经济和军事力量的威胁, 尽管我们可能认为经济力量的威胁又受到军事力量, 即暴力的支持。

传统系统

由政府批准的武力支持的合同模式已经为人类服务了数千年?还是有?是的, 它是自然而然的进步。在没有政府的情况下, 一群人组成政府。似乎你似乎无法阻止人们组建政府。他们将形成。

那么, 区块链智能合约呢?区块链和智能合约模型如何确保可信赖性或消除作弊行为?不要只说”不信任”, 这不是答案!在我们之前的示例中, 以某种方式消除了作弊行为。

让我们仔细看看区块链如何实现(或替换)该功能。

区块链系统:比特币

要将这个大问题分解为较小的问题, 让我们从比特币开始。比特币如何抑制作弊?我可以自由运行我想要的任何比特币节点软件, 只要它看起来符合比特币网络的协议即可。没有人会阻止我运行自己的本地比特币节点, 该节点在遵守网络协议的情况下可以完成所需的工作。我有什么办法可以将其用于非法收益?

当然, 我可以将任何类型的交易发布到比特币网络中进行审批。我可以发布将所有比特币都发送给我的交易, 然后将其释放到网络上, 等待将其添加到区块中, 然后哇, 现在所有的比特币都属于我了?不, 因为加密。

我没有你的私钥, 因此此类交易必须使用你的私钥进行签名。因此, 我被密码术所阻止。还是我谁说必须签署这样的交易?如果我尝试的话会怎样?好吧, 当然会发生的是整个比特币网络都会拒绝我的交易。为什么有人会接受呢?除了它们都在运行标准节点这一事实之外, 它们会一发不可收拾, 为什么他们会帮助我作弊?这样做肯定会破坏比特币网络的完整性, 并且这样做会破坏他们自己的加密货币财富。因此, 对于他们来说, 帮助我(一个匿名的陌生人)欺骗另一个匿名的陌生人没有任何意义。即使一个非理性的参与者以某种方式接受了我的无效交易, 绝大多数的比特币网络也会拒绝它, 而且这没有机会。这次再次被纯粹的数字击败。

但是, 如果我是一个强大的采矿公司怎么办?当然, 现在我有更多能力使事情变得更有利。我可以, 但是仍然无法给我任何绝对的力量。即使作为一个强大的矿工, 如果我控制的网络不到50%, 那么我做不到。我有一定的能力来选择将交易添加到区块中的顺序, 但这几乎不足以铸造或窃取硬币。即使我确实控制了超过50%的网络(假设读者知道与比特币一样的与工作量证明相关的众所周知的51%攻击), 我的主要力量还是要花双倍的钱。虽然这是一种很酷的功能, 但这样做是否符合我的最大利益却非常令人怀疑, 因为它会破坏比特币的完整性。似乎我会更好地利用自己的控制权来开采所有硬币, 从而赚更多的钱, 并维护财富的基础。因此, 我没有被打败, 但我的作弊冲动受到了协议固有的抑制因素的阻碍。这种抑制作用基本上由数字的力量来支持。参与者对比特币网络的压倒性共识。

区块链智能合约和Oracle合约

什么是智能合约?假设我部署了误导性合同来欺骗人们向我汇款?还是假设我部署了博彩合同并使用了前面所述的一种攻击(如果可以这样称呼)?我可以做到, 这可能会骗到一些人。作为不诚实的演员, 我可能会从这种努力中获得一些微利。反对该协议的理由是, 每个参与者都应仔细考虑(就像对待任何合同一样)他们即将加入的合同以及可能被滥用的潜在方式。他们还应该考虑来源-如果有的话, 他们知道发布和维护合同的一方以及任何相关的预言或相关合同的内容。人们希望, 不诚实的合同不会持续很长时间, 直到网络将其非正式地标记为不诚实, 从而使参与者自愿避免它, 并切断它。网络很大, 单词传播很快。

除了某些时候, 你仍然需要信任一个人。博彩合同中的数据由Oracle提供。神谕是由人维护的。无论你增加多少层以保持网络诚实, 在某些时候它仍然会变成人类。那么, 根据我们的投注示例, 你会信任哪种类型的Oracle?我会相信, 通过欺骗, 损失多于收获的甲骨文。示例:假设ESPN或类似的网络是甲骨文的发起人。你希望他们比任何人都能够提供诚实的数据, 因为在拳击投注中非法赢得一笔小额款项会因声誉损失而蒙上阴影。在这种情况下, 由于我们信任诚实的谷物商人, 因此你的信任得到了充分的重视。这种类型的信任安排是古老且完善的。

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

本文总结

为了提出一个观点, 提供思想和讨论的参考, 并总结我的文章, 我将提出一些简单的观察结果, 而不是简单的结论。因为对于一个如此复杂的主题, 一个简洁的结论感觉就像是一个简单的故事和一个过分简化的故事。我要提出的意见(请随时讨论/反驳/矛盾)是:

  • 信任是基于这样的假设, 即对方从合作中获得的利益远大于从欺诈中获得的利益, 这种信任是古老的, 在实际情况下有效, 并且并未消失。在某些情况下, 它在区块链世界中仍然是固有的, 尽管在许多情况下可能已被消除。在我们的oracle示例中, 它仍然有效。
  • 自远古时代以来, 基于武力或暴力威胁的信任就已经存在于人类社会中, 但在我们的智能合约模型中却非常少见, 而通过加密和大量共识的巧妙结合而被强制执行所取代。

我挑战以太坊开发人员做两件事:

  1. 在公共区块链(例如比特币或以太坊)的系统中, 可以考虑以任何方式通过隐式或显式武力威胁来强制执行任何操作。
  2. 想一想现代合同法或金融法中的任何主要规则体系, 无论以明示或暗示的武力威胁都不以某种方式实施。
信任与国家权力图的演变

旧的东西新的东西

而且, 我认为在这里我们已经达到了主要的区别, 这确实是我们说区块链系统与过去的系统相比具有”革命性”的真正原因。以我的方式来看, 它根本不是不信任, 而是更稳定的信任平台, 最值得注意的是, 它完全不依赖武力或暴力威胁。

一方面, 在缺乏作弊动机的情况下, 我们拥有久经考验的互惠互利保证。没什么新鲜的。新功能是引入了加密辅助共识, 这有助于阻止欺骗并保持系统诚实。这两个元素的综合产生了真正令人瞩目的东西, 这在人类历史上是第一次可能:一种适用于大型匿名团体的系统, 在该系统中, 找不到任何地方有明确或隐含的武力威胁作为抑制或惩罚措施。我相信那是真正令人惊奇的事情。如果忽略了这一方面, 那么我们拥有的就是一种很棒的新技术(我承认, 它足够酷了)。但是, 从这方面考虑, 很明显, 我们已经进入了治理的新时代。

赞(0)
未经允许不得转载:srcmini » 以太坊Oracle合同:我们可以信任Oracle吗?

评论 抢沙发

评论前必须登录!