《精通以太坊》预言机“狗万·ManBetX”
本文摘要:在本章中,我们将辩论应验机(oracle),它是可以为以太坊智能合约获取外部数据源的系统。
在本章中,我们将辩论应验机(oracle),它是可以为以太坊智能合约获取外部数据源的系统。“oracle”一词来自希腊神话,代表需要与神灵交流的人,他们可以看见未来的愿景。在区块链的上下文中,应验机是一个可以问以太坊外部问题的系统。在理想情况下,应验机是无信任的系统,这意味著它们不必须被信任,因为它们是按照去中心化的原则运营的。
为什么必须应验机?以太坊平台的一个关键组件是EVM,它需要在集中网络中的任何节点上执行程序并改版不受共识规则约束的以太坊状态。为了维持共识,EVM的继续执行过程必需几乎确认,并且仅有基于以太坊状态和亲笔签名交易的分享上下文。
这产生了两个尤其最重要的后果:一个是EVM和智能合约没内在的随机性来源;另一个是外部数据不能作为交易的数据载荷引进。让我们更进一步分析这两个后果。首先我们要解读为什么在EVM中必须禁令确实的随机函数,不想它们为智能合约获取随机性。
请求考虑到在继续执行此类函数后对尝试达成协议共识的影响:节点A将执行命令并代表智能合约存储3在其存储中,而节点B继续执行完全相同的智能合约,将存储7。因此,节点A和节点B就结果状态应当是什么将得出结论有所不同的结论,尽管在完全相同的上下文中运营完全相同的代码。
实质上,每次评估智能合约时,可能会超过有所不同的结果状态。因此,由于其众多节点在世界各地独立国家运营,网络将无法就结果状态应当是什么达成协议去中心化的共识。在实践中,它不会比这个例子简单得多,因为还包括以太币移往在内的连锁效应不会以指数方式快速增长。
留意,伪随机函数,例如加密安全性哈希函数(它们是确定性的,因此实质上也是EVM的一部分),对于许多应用于来说是过于的。假想一个猜中硬币决胜负的游戏场景,这个游戏依赖扔到硬币正反面的政治性。矿工可以只能密码这个游戏:他们只必须包那些对其不利的随机结果才可。
那么我们如何解决问题这个问题呢?既然所有节点都可以就亲笔签名交易的内容达成协议完全一致,那么我们就可以引进外部信息,还包括随机性、价格信息、天气预报等,作为发送到网络的交易的数据部分。但是,这些数据本身无法信任,因为它的来源无法核实。因此,我们刚并没几乎解决问题这个问题。
我们用于应验机尝试解决问题这些问题,在本章的其余部分将详尽辩论这些问题。应验机的应用于场景和示例理想情况下,应验机获取了一种无信任(或最少几近无信任)的方式来提供外在的(即“真实世界”或“链外”)信息,例如足球比赛的结果、黄金的价格或确实的随机数字,用作以太坊平台上的智能合约。它们还可用作必要将数据安全地中继到DApp前端。
因此,可以将应验机视作调和链外世界与智能合约之间差距的机制。容许智能合约基于真实世界的事件和数据来强制执行合约关系,从而大大拓展了它们的范围。
但是,这也不会给以太坊的安全性模型带给外部风险。考虑到一个“智能遗嘱”合约——当一个人去世时分配资产。这是智能合约领域中常常辩论的内容,并引人注目了可信任的应验机的风险。
如果由这样的合约掌控的承继金额充足低,那么在所有者丧生之前反击应验机(收到骗的死讯)并启动时资产分配的动机是十分反感的。请注意,某些应验机获取针对特定私有数据源的数据,例如学术证书或政府ID。这些数据的来源,如大学或政府部门,是几乎可靠的,数据的真实性是主观的(真凶不能通过来源的权威来确认)。
因此,无法无信地获取这样的数据,即不信任来源,因为没独立国家可验证的客观事实。因此,我们将这些数据源包括在我们对应验机的定义中,因为它们还为智能合约获取了数据桥梁。它们获取的数据一般来说使用证明的形式,如护照或成就记录。
“证言”将沦为未来区块链平台顺利的最重要组成部分,特别是在检验身份或声誉的涉及问题方面,因此探寻区块链平台如何为其获取服务十分最重要。有可能由应验机获取的更好数据示例还包括:· 物理随机数源或熵源(例如量子现象或热现象):如在彩票智能合约中公平地投票决定获奖者。
· 与自然灾害涉及的参数触发器:启动时大型自然灾害债券智能合约(例如地震的里氏震级测量债券)。· 汇率数据:例如让加密货币与法定货币准确挂勾。· 资本市场数据:例如为一揽子代币化资产或证券定价。· 指标提到数据:例如将利率划入智能金融衍生品合约。
· 统计资料与定统计数据:安全性标识、国家代号、货币代号等。· 时间和间隔数据:基于精准的SI(国际单位制)时间度量的事件触发器。·天气数据:例如基于天气预报的保险费计算器。
· 政治事件:预测市场的走势。·运动事件:预测市场走势以及体育博彩涉及的合约。
·地理定位数据:例如供应链追踪。· 损毁程度核验:保险合约。· 其他区块链上再次发生的事件:可互操作函数。
· 以太币市场价格:例如gas价格应验机。· 航班统计数据:例如用作团体和俱乐部的机票合约。
在接下来的部分,我们将研究可以构建应验机的一些方法,还包括基本的应验机的设计模式、计算出来性应验机、去中心化的应验机以及Solidity中的应验机客户端构建。应验机的设计模式根据定义,所有的应验机都获取了一些关键功能。这些能力还包括:从链外的数据源搜集数据。用于亲笔签名消息在链上传输数据。
将数据放进智能合约的存储空间,使数据能用。一旦数据在智能合约的存储中能用,其他智能合约就可以通过调用应验机智能合约的“检索”功能来采访它;它也可以通过“查阅”应验机的存储必要由以太坊节点或反对网络的客户端采访。设置应验机的三种主要方式可以分成催促与号召、公布与订阅者和立刻加载。
让我们从最简单的“立刻加载”式应验机开始,这种应验机获取即时决策所需的数据,例如“ethereumbook.info的地址是什么”或“这个人否多达18岁”。那些期望查找此类数据的人偏向于在“即时”的基础上这样做到;查询是在必须信息时已完成的,有可能总有一天会再度查询。这种应验机的例子还包括那些持有人的组织数据或由的组织公布数据(例如学术证书、电话号码代码、机构会员资格、机场标识符、自律ID等)的应验机。
这种类型的应验机一旦将数据存储在其合约存储中,其他智能合约就可以用于对应验机合约的催促调用来查询。它可能会改版。应验机存储中的数据也可用作通过区块链落成(即,以太坊客户端相连)应用程序必要查询,而无须通过调整并产生公布交易的gas成本。
想检查买酒顾客年龄的商店可以这样用于应验机。这种类型的应验机对于有可能必须运行和维护服务器来问此类数据催促的的组织或公司具备吸引力。留意:由应验机存储的数据有可能不是应验机正在服务的原始数据,例如,出于效率或隐私原因,大学可能会为过去学生的学业成绩证书成立一个应验机。
但是,存储证书的原始详细信息(精细到所修的课程和超过的成绩)是多余的。忽略,证书的哈希就充足了。某种程度,政府有可能期望将公民身份证放进以太坊平台,其中似乎包括的细节必须保密。
再度,散列数据(更加细心的作法是,在默尔克树中用于Salt)并且仅有将根哈希存储在智能合约的存储中将是的组织这种服务的有效地方式。下一个设置方式是公布与订阅者,在这种应验机中,要对预期转变的数据(有可能是定期和频密地)获取有效地的广播服务,应验机要么由链上的智能合约轮询,要么由链外城主进程监控和改版。此类别具备类似于RSS概要或WebSub的模式,其中应验机用于新的信息展开改版,后用标记回应新的数据可可供“订阅者”的人用于。
感兴趣的人必需将应验机轮询到检查近期信息否已变更,或监听应验机合约的改版并在再次发生时采取行动。示例还包括价格馈送、天气信息、经济或社会统计资料、交通数据等。
在Web服务器领域,轮询效率非常低,但在区块链平台的对等环境中却不是这样:以太坊客户必需跟上所有状态变更,还包括对合约存储的变更,因此轮询数据变更是对实时客户端的本地调用。以太坊事件日志使应用程序尤其更容易留意应验机改版,因此这种模式在某些方面甚至可以被视作“启动时”服务。
但是,如果轮询是通过智能合约已完成的——这对于某些去中心化的应用于有可能是适当的(例如,在无法转录鼓舞的情况下),则有可能产生大量的gas开支。“催促/号召”类别是最简单的:这是数据空间太大而无法存储在智能合约中的情况,并且用户每次只必须整个数据集的一小部分。
它也是数据提供商业务的限于模型。实质上,这样的应验机可以构建为链上智能合约系统,以及用作监控催促和检索、回到数据的链外基础结构。来自去中心化应用于的数据催促一般来说是牵涉到许多步骤的异步过程。
在这种模式中,首先,EOA与去中心化应用于展开交互,从而与应验机智能合约中定义的功能展开交互。此函数启动对应验机的催促,除了有可能包括消息传递函数和调度参数的补足信息之外,还用于涉及参数详尽解释所催促的数据。
一旦检验了此事务,就可以将应验机催促视作应验机合约收到的EVM事件,或者作为状态变更;可以检索参数并用作继续执行链外数据源的实际查找。应验机有可能还必须缴付来处置催促,消息传递的gas缴纳以及采访所催促数据的权限。最后,结果数据由应验机所有者亲笔签名,证明在等价时间内的数据有效性,并在事务中传送给必要或通过应验机合约发出请求的去中心化应用于。
根据调度参数,应验机可以定期广播更进一步改版数据的事务(例如,日终定价信息)。催促与号召应验机的步骤可以总结如下:· 接管来自DApp的查找。
· 解析查找。· 检查否获取了缴付和数据采访权限。
· 从链外数据源检索涉及数据(并在适当时加密)。· 用于包括的数据对事务展开亲笔签名。
· 将事务广播到网络。· 决定任何更进一步适当的交易,例如通报等。
一系列其他方案也是有可能的,例如,可以从EOA催促数据并必要回到数据,从而须用于应验机智能合约。类似于地,可以向反对物联网的硬件传感器发出请求和号召。
因此,应验机可以是人、软件或硬件。此处叙述的催促与号召模式多见于客户端与服务器体系结构。虽然这是一种简单的消息传递模式,容许应用程序展开双向对话,但在某些情况下这有可能是不适合的。例如,在催促与号召模式下,必须应验机利率的智能债券有可能必需每天催促数据,以保证利率一直是准确的。
鉴于利率不常常变化,公布与订阅者模式有可能更加适合这种情况,特别是在是考虑到以太坊的受限比特率。在公布与订阅者模式中,发布者(在此上下文中是指应验机)不必要向接收者发送到消息,而是将公布的消息分类到有所不同的类中。
订阅者者需要传达对一个或多个类的兴趣并仅检索那些感兴趣的消息。在这种模式下,应验机可能会在每次变更时将利率载入其自己的内部存储。多个订阅者的DApp可以非常简单地从应验机合约中加载它,从而增加对网络带宽的影响,同时最大限度地减少存储成本。在广播或多播模式中,应验机会将所有消息公布到信道,订阅者合约将在各种订阅者模式下收看信道。
例如,应验机可能会将消息公布到加密货币汇率信道。订阅者智能合约如果必须时间序列,例如移动平均值计算出来,则可以催促信道的全部内容;另一个有可能只必须现货价格计算出来近期利率。在应验机不必须告诉订阅者合约的身份的情况下,广播模式是适合的。
数据证书即便我们假设被去中心化应用于查找的数据源是权威的和有一点信任的,依然不存在一个引人注目的问题:鉴于应验机以及“催促/号召”机制有可能由多个实体来操作者,我们如何才能信任这个机制呢?数据在传输过程中被伪造的可能性似乎是不存在的,所以,让链外方法可以证明回到数据的完整性是十分关键的。两种少见的数据证书方法是真实性证明(authenticity proof)以及可靠继续执行环境(Trusted Execution Environment,TEE)。
真实性证明是用密码学证据证明数据没被伪造过。基于许多证明技术(例如,数字签名证明),它们将必须的信任从数据传输者高效地移往到证明人(证明方法的提供者)。通过链上检验证据,智能合约可以在用于数据前检验数据的完整性。
Oraclize(现重新加入Chainlink网络)就是一个利用多种真实性证明的应验机服务的例子。现在以太坊主网查找数据时可以用于的其中一种证明方式是TLSNotary Proof。
TLSNotary Proof容许客户端向第三方递交证据,证明客户端与某服务器之间再次发生了HTTPS网络流量。虽然HTTPS自身是安全性的,但它并不反对数据亲笔签名。因此,TLSNotaryProof依赖TLSNotary亲笔签名方案(通过PageSigner)。
TLSNotaryProof利用了传输层安全性协议(Transport Layer Security,TLS),这让TLS可以掌控密钥,在获取数据后给数据亲笔签名,并将数据分配给三方:服务器(应验机)、审讯单位(Oraclize)以及审核方。Oraclize用于亚马逊网络服务器(AWS)虚拟机实例作为审核方,可以检验自实例化以来它没被改动过。
这一AWS实例存储着TLSNotary密文,密文让它可以获取真诚性证明。虽然这套方案在数据伪造上获取了比纯粹的“催促/号召”机制更高的安全性确保,我们依然必须假设亚马逊自己会伪造虚拟机实例。Town Crier()是一个基于可靠继续执行环境的检验数据馈送应验机系统;这些方法使用基于硬件的安全区(security enclave)来检验数据完整性。
Town Crier用于英特尔的SGX(Software Guard eXtensions)来确保对HTTPS查找的号召可以被检验为可靠的。SGX也获取了完整性确保,使得在安全区中运营的应用于受到CPU维护,不被其他进程伪造。它也获取了机密性,确保应用程序在安全区中运营时,其状态对其他进程来说是不由此可知的。
最后,SGX通过分解应用程序确认在安全区中运营的数字签名(通过其建构结果的哈希值来安全性地确认),让证明沦为有可能。通过检验这一数字签名,去中心化应用于就可以证明Town Crier实例正在SGX安全性区内安全性地运营。这样就反过来证明了该实例没被伪造过,由Town Crier收到的数据是可靠的。此外,这种机密属性还让Town Crier可以处置隐私数据:用于Town Crier实例的公钥来加密数据查找催促。
在安全区(如SGX)中运营应验机的“催促/号召”机制,我们几乎可以指出Town Crier是在可靠第三方硬件中安全性地运营,确保了所催促的数据不不受伪造地回到(假设我们坚信Intel/SGX)。计算机性的应验机迄今为止,我们只辩论催促和发给数据情境下的应验机。但是,应验机也可以用来继续执行给定计算出来。
等价以太坊内在的区块gas下限和比较较贵的计算成本,是一个尤其简单的功能。不只是传递数据催促的结果,计算出来应验机也可以用来继续执行具有一组输出的涉及计算出来并回到计算结果,而这种计算出来有可能无法在链上展开。
荐个例子,我们可以用于计算出来应验机来继续执行计算出来密集型的重返计算出来,以估算某个债券智能合约的收益。如果你不愿信任集中于而可审核的服务,你可以再度采访Oraclize。
它们获取的服务容许去中心化应用于催促在沙盒AWS虚拟机中继续执行的计算结果。AWS实例从包括在副本中的用户配备的Dockerfile创立可继续执行容器,该副本上传到星际文件系统(IPFS,参看第12章“数据存储”一节)。根据催促,Oraclize用于其哈希检索此副本,然后在AWS上初始化并继续执行Docker容器,传送将作为环境变量获取给应用程序的任何参数。容器化应用程序根据时间容许继续执行计算出来,并将结果载入标准输入,Oraclize可以对其展开检索并回到到去中心化应用于。
Oraclize目前在可审核的t2.microAWS实例上获取此服务,因此如果计算出来具备一些十分最重要的值,则可以检查否继续执行了准确的Docker容器。尽管如此,这不是一个确实去中心化的解决方案。作为可验证应验机事实上的标准,“Cryptlet”的概念早已被规范化为微软公司更加普遍的ESC框架的一部分。Cryptlet在一个密封安全区中运营,该密封安全区就是指基础设施比如I/O中抽象化出来的,并且可选上了CryptoDelegate,所以输出和输入消息都会自动亲笔签名、检验和证明。
Cryptlet反对分布式交易,所以合约逻辑可以用不具备ACID属性的方式来处置简单的多步骤、多区块链交易以及外部系统交易。开发者因此可以创立用作智能合约中的可移植的、独立国家且不具隐私性的事实解析。Cryptlet遵循下列格式:public class SampleContractCryptlet : Cryptlet{public SampleContractCryptlet(Guid id, Guid bindingId, string name,string address, IContainerServices hostContainer, bool contract): base(id, bindingId, name, address, hostContainer, contract){MessageApi = new CryptletMessageApi(GetType().FullName,new SampleContractConstructor())TrueBit(https://truebit.io)是一个可拓展和可验证的链外计算出来解决方案。
它引进了一个解决问题者和检验者系统,它们被鼓舞各自继续执行计算出来和检验这些计算出来。如果一个计算结果受到挑战,链上就不会适当继续执行对该计算出来子集的递归检验进程——这是一种类型的“检验游戏”。
检验游戏不会展开几轮,每一轮都会迭代地按规定涉及计算出来的更加小子集。挑战充份细分之后,游戏的终局之后来临,法官(以太坊矿工)之后可在链上最后裁决涉及挑战否合理。实质上,TrueBit是计算出来市场的一种构建,去中心化应用于因此可以为可验证计算出来缴纳;计算出来虽然是在链外继续执行的,但依赖以太坊来强制执行检验者游戏的规则。理论上来说,这让免除信任型智能合约安全性地继续执行给定计算出来任务。
像TrueBit这样的系统有很多应用于,从机器学习到给定工作量证明的检验。后者的其中一个例子是Doge Ethereum桥接,它利用TrueBit来检验狗狗币(Dogecoin)的工作量证明算法Scrypt,这是一种强劲内存市场需求且计算出来密集的函数,它不有可能在以太坊区块gas下限内计算出来已完成。
通过在TrueBit继续执行这种检验,在以太坊Rinkeby测试网络上用智能合约安全性地检验狗狗币交易之后沦为有可能。去中心化应验机上面列出出有的所有机制叙述的都是中心化的应验机系统,都必须倚赖可靠的权威。
虽然它们可以为许多应用服务,它们的不存在依然意味著以太坊网络中的单点故障。环绕着去中心化应验机,人们早已明确提出了很多计划:去中心化应验机可以用作保证数据求得性,还可配上链上数据汇总系统创立独立国家数据提供者网络。Chainlink(https://chain.link)早已明确提出了一种去中心化应验机网络,由三个关键智能合约(声誉合约、订单给定合约、数据汇总合约)以及数据提供者的链外注册表构成。声誉合约用来追踪数据提供者的展现出。
声誉合约中的分数不会改版到链外注册表中。订单给定合约不会从用于声誉合约的应验机中自由选择竞标者,并最后确认服务层级契约(Service Level Agreement,SLA),其中包括了查找参数和拒绝的应验机数量。这也意味著数据购买者会必要与个体应验机交易。
数据汇总合约不会从多个应验机处搜集号召(用于“commit reveal”模式递交),计算出来查找的最后总结果,然后将结果对系统返声誉合约。这样的去中心化方案要面对的其中一个根本性挑战是:建构数据汇总函数。Chainlink建议计算出来号召可选权重,这样就可以为每一个应验机号召记录有效性分数。
此处,找到一个“违宪”的分数并不是毫无价值的,因为它创建在:(以对统计资料获取的号召的背离来度量)过分偏僻的数据点是不准确的这一前提之上。基于某一应验机号召环绕号召产于的方位来计算出来有效性分数有一定风险,具体表现为惩罚背离平均值的准确答案。因此,Chainlink获取汇总函数的标准子集,但也反对用于自定义简化的汇总合约。
一个涉及的点子是杜林币协议。其中,多个参与者记录数值,这些数值的中位数不会被当作“准确”答案。记录者必需再行质押保证金,这些保证金不会根据它与中位数的相似程度重新分配,由此可以鼓舞人们记录与其他人获取的值相似的值。
这样联合的数值,也就是所谓的“谢林点”,预计不会相似现实值,因为现实数值是响应者协作中所环绕的大自然而显著的目标。Jason Teutsch最近明确提出一种新型的去中心化链外数据求得性应验机。这种设计利用了一条专用的工作量证明区块链,后者可以在等价时间内正确地记录注册过的数据否可得。
矿工不会尝试iTunes、存储和传播所有新近注册的数据,因此保证数据在本地是求得的。这样的系统是便宜的,因为每一个挖矿节点都要存储和传播所有注册过的数据。该系统可以通过在注册期完结后获释数据来反复利用存储空间。
Solidity中的应验机客户端模块代码11-1是一个Solidity示例,展出了Oraclize如何从API大大提供ETH/USD价格并以能用的方式存储结果。代码11-1:用于Oraclize从外部来源改版ETH/USD汇率/*ETH/USD price ticker leveraging CryptoCompare APIThis contract keeps in storage an updated ETH/USD price,which is updated every 10 minutes.*/pragma solidity ^0.4.1;import "github.com/oraclize/ethereum-api/oraclizeAPI.sol";/*"oraclize_" prepended methods indicate inheritance from "usingOraclize"*/contract EthUsdPriceTicker is usingOraclize {uint public ethUsd;event newOraclizeQuery(string description);event newCallbackResult(string result);function EthUsdPriceTicker() payable {// signals TLSN proof generation and storage on IPFSoraclize_setProof(proofType_TLSNotary | proofStorage_IPFS);// requests queryqueryTicker();}function __callback(bytes32 _queryId, string _result, bytes _proof) public {if (msg.sender != oraclize_cbAddress()) throw;newCallbackResult(_result);/** Parse the result string into an unsigned integer for on-chain use.* Uses inherited "parseInt" helper from "usingOraclize", allowing for* a string result such as "123.45" to be converted to uint 12345.*/ethUsd = parseInt(_result, 2);// called from callback since we're polling the pricequeryTicker();}function queryTicker() public payable {if (oraclize_getPrice("URL")this.balance) {newOraclizeQuery("Oraclize query was NOT sent, please add some ETHto cover for the query fee");} else {newOraclizeQuery("Oraclize query was sent, standing by for theanswer...");// query params are (delay in seconds, datasource type,// datasource argument)// specifies JSONPath, to fetch specific portion of JSON API resultoraclize_query(60 * 10, "URL","json(https://min-api.cryptocompare.com/data/price?\fsym=ETHtsyms=USD,EUR,GBP).USD");}}}为融合Oraclize,EthUsdPriceTicker合约必需是usingOraclize合约的子合约;后者是在oraclizeAPI文件中定义好的。
数据催促不会由usingOraclize合约内置的oraclize_query函数发动。这是一个牵引函数,预计最少必须两个参数:反对用于的数据源,如URL、WolframAlpha、IPFS或计算出来。
为等价数据源原作的参数,有可能还包括JSON或XML解析助手的用于。数据查找的价格不会由queryTicker函数继续执行。为继续执行数据查找催促,Oraclize拒绝用缴纳部分笔费用,用作补偿传输和处理结果到_callback函数过程中再次发生的gas费用以及为服务缴纳的额外费用。
费用的数额视数据源和拒绝的可靠证明类型(如果有所登录的话)而以定。一旦检索了数据,_callback函数就不会由Oraclize掌控的许可账户调用;这一过程不会起源于响应值和唯一的queryId参数,后者可以用作处置和追踪来自Oraclize的多个以此类推的消息传递。
金融数据提供者ThomsonReuters也为以太坊获取了一项取名为“BlockOneIQ”的应验机服务,让运营在私有也许可网络上的智能合约可以催促市场和参照数据。代码112是该应验机的交互模块,以及用作发动催促的客户端智能合约。
代码11-2:合约调用BlockOneIQ服务以提供市场数据pragma solidity ^0.4.11;contract Oracle {uint256 public divisor;function initRequest(uint256 queryType, function(uint256) external onSuccess,function(uint256) external onFailure) public returns (uint256 id);function addArgumentToRequestUint(uint256 id, bytes32 name, uint256 arg) public;function addArgumentToRequestString(uint256 id, bytes32 name, bytes32 arg)public;function executeRequest(uint256 id) public;function getResponseUint(uint256 id, bytes32 name) public constantreturns(uint256);function getResponseString(uint256 id, bytes32 name) public constantreturns(bytes32);function getResponseError(uint256 id) public constant returns(bytes32);function deleteResponse(uint256 id) public constant;}contract OracleB1IQClient {Oracle private oracle;event LogError(bytes32 description);function OracleB1IQClient(address addr) public payable {oracle = Oracle(addr);getIntraday("IBM", now);}function getIntraday(bytes32 ric, uint256 timestamp) public {uint256 id = oracle.initRequest(0, this.handleSuccess, this.handleFailure);oracle.addArgumentToRequestString(id, "symbol", ric);oracle.addArgumentToRequestUint(id, "timestamp", timestamp);oracle.executeRequest(id);}function handleSuccess(uint256 id) public {assert(msg.sender == address(oracle));bytes32 ric = oracle.getResponseString(id, "symbol");uint256 open = oracle.getResponseUint(id, "open");uint256 high = oracle.getResponseUint(id, "high");uint256 low = oracle.getResponseUint(id, "low");uint256 close = oracle.getResponseUint(id, "close");uint256 bid = oracle.getResponseUint(id, "bid");uint256 ask = oracle.getResponseUint(id, "ask");uint256 timestamp = oracle.getResponseUint(id, "timestamp");oracle.deleteResponse(id);// Do something with the price data}function handleFailure(uint256 id) public {assert(msg.sender == address(oracle));bytes32 error = oracle.getResponseError(id);oracle.deleteResponse(id);emit LogError(error);}}用于initRequest函数启动数据催促,该函数容许登录查找类型(在此示例中是对日内价格的催促)以及两个消息传递函数。这将回到一个uint256标识符,然后可用作获取其他参数。addArgumentToRequestString函数用作登录路透代码表格(RIC),此处为IBM库存,addArgumentToRequestUint容许登录时间砍。现在,起源于block.timestamp的别称将检索IBM的当前价格。
然后由executeRequest函数继续执行该催促。处置完了催促后,应验机合约将用于查找标识符调用onSuccess消息传递函数,从而容许检索结果数据;如果检索告终,onFailure消息传递函数将回到错误代码。顺利检索的能用字段还包括open(开盘价)、high(最高价)、low(最低价)、close(收盘价)和bid/ask(卖/卖价)。
总结正如你所看见的,应验机为智能合约获取了至关重要的服务:它们将外部事实带进合约继续执行。当然,应验机也不会带给相当大的风险:如果它们是不受信任的来源并且有可能受到伤害,有可能造成它们获取的智能合约的继续执行损毁。一般来说,在考虑到用于应验机时要十分小心信任模型。如果你指出应验机可以信任,那么你可能会通过将其曝露给潜在的错误输出来毁坏智能合约的安全性。
也就是说,如果细心考虑到安全性假设,那么应验机会十分简单。去中心化的应验机可以解决问题其中一些问题,网卓新闻网,并为以太坊智能合约获取无信任的外部数据。慎重自由选择,你就可以开始探寻以太坊与应验机获取的“真实世界”之间的桥梁。
(希)安德烈亚斯·M.安东波罗斯. 通晓以太坊:研发智能合约和去中心化应用于 (OReilly精品图书系列) (Chinese Edition) (Kindle Locations 5007-5013). Kindle Edition.。
本文关键词:狗万·ManBetX,狗万官网唯一,狗万ManBetX官网登录入口,狗万ManBetX下载,狗万app官方网站
本文来源:狗万·ManBetX-www.vn-otp.com