event LogError(bytes32 description);
上面罗列出的所有机制描写的都是中心化的预言机系统,都需要依赖可信的权威。固然它们可觉得很多应用处事,它们的存在仍然意味着以太坊网络中的单点妨碍。环绕着去中心化预言机,人们已经提出了许多打算:去中心化预言机可以用于担保数据可得性,还可搭配链上数据汇总系统建设独立数据提供者网络。
getIntraday(“IBM”, now);
function getResponseString(uint256 id, bytes32 name) public constant
uint256 public divisor;
迄今为止,我们只接头请求和分发数据情境下的预言机。可是,预言机也可以用来执行任意计较。给定以太坊内涵的区块gas上限和相对较贵的计较本钱,是一个出格有用的成果。不可是通报数据请求的功效,计较预言机也可以用来执行带有一组输入的相关计较并返回计较功效,而这种计较大概无法在链长举办。举个例子,我们可以利用计较预言机来执行计较麋集型的回归计较,以预计某个债券智能合约的收益。
// datasource argument)
oraclize_query(60 * 10, “URL”,
uint256 id = oracle.initRequest(0, this.handleSuccess, this.handleFailure);
function handleFailure(uint256 id) public {
returns(bytes32);
emit LogError(error);
}
uint256 high = oracle.getResponseUint(id, “high”);
Jason Teutsch最近提出一种新型的去中心化链外数据可得性预言机。这种设计操作了一条专用的事情量证明区块链,后者可以在给按时间内正确地记录挂号过的数据是否可得。矿工会实验下载、存储和流传所有新近挂号的数据,因此担保数据在当地是可得的。这样的系统是昂贵的,因为每一个挖矿节点都要存储和流传所有挂号过的数据。该系统可以通过在挂号期竣事后释放数据来反复操作存储空间。
让我们从最简朴的“当即读取”式预言机开始,这种预言机提供即时决定所需的数据,譬喻“ethereumbook.info的地点是什么”或“这小我私家是否高出18岁”。那些但愿查询此类数据的人倾向于在“即时”的基本上这样做;查找是在需要信息时完成的,大概永远不会再次查找。这种预言机的例子包罗那些持有组织数据或由组织宣布数据(譬喻学术证书、拨号代码、机构会员资格、机场标识符、自主ID等)的预言机。这种范例的预言机一旦将数据存储在其合约存储中,其他智能合约就可以利用对预言机合约的请求挪用来查找。它大概会更新。预言机存储中的数据也可用于通过区块链启用(即,以太坊客户端毗连)应用措施直接查找,而无须通过调解并发生宣布生意业务的gas本钱。想要查抄买酒顾主年数的商店可以这样利用预言机。这种范例的预言机对付大概需要运行和维护处事器来答复此类数据请求的组织或公司具有吸引力。留意:由预言机存储的数据大概不是预言机正在处事的原始数据,譬喻,出于效率或隐私原因,大学大概会为已往学生的学业后果证书设立一个预言机。可是,存储证书的完整具体信息(细致到所修的课程和到达的后果)是多余的。相反,证书的哈希就足够了。同样,当局大概但愿将国民身份证放入以太坊平台,个中显然包括的细节需要保密。再次,散列数据(更仔细的做法是,在默尔克树中利用Salt)而且仅将根哈希存储在智能合约的存储中将是组织这种处事的有效方法。
pragma solidity ^0.4.11;
一个相关的想法是谢林币协议。个中,多个参加者记录数值,这些数值的中位数会被当成“正确”谜底。记录者必需先质押担保金,这些担保金会按照它与中位数的靠近水平从头分派,由此可以鼓励人们记录与其他人提供的值临近的值。这样配合的数值,也就是所谓的“谢林点”,估量会靠近真实值,因为真实数值是响应者协作中所环绕的自然而明明的方针。
{
// query params are (delay in seconds, datasource type,
newOraclizeQuery(“Oraclize query was sent, standing by for the
uint256 bid = oracle.getResponseUint(id, “bid”);
去中心化预言机
event newOraclizeQuery(string description);
留意,伪随机函数,譬喻加密安详哈希函数(它们是确定性的,因此实际上也是EVM的一部门),对付很多应用来说是不足的。假想一个猜硬币决胜负的游戏场景,这个游戏依赖于扔硬币正后面的随意性。矿工可以等闲破解这个游戏:他们只需要打包那些对其有利的随机功效即可。那么我们如何办理这个问题呢?既然所有节点都可以就签名生意业务的内容告竣一致,那么我们就可以引入外部信息,包罗随机性、价值信息、天气预报等,作为发送到网络的生意业务的数据部门。可是,这些数据自己无法信任,因为它的来历无法核实。因此,我们方才并没有完全办理这个问题。我们利用预言机实验办理这些问题,在本章的其余部门将具体接头这些问题。
· 布置任何进一步须要的生意业务,譬喻通知等。
Solidity中的预言机客户端接口
oracle.executeRequest(id);
answer…”);
支持利用的数据源,如URL、WolframAlpha、IPFS或计较。
作为可验证预言机事实上的尺度,“Cryptlet”的观念已经被类型化为微软更遍及的ESC框架的一部门。Cryptlet在一个密封安详区中运行,该密封安详区是从基本设施好比I/O中抽象出来的,而且附加上了CryptoDelegate,所以输入和输出动静城市自动签名、验证和证明。Cryptlet支持漫衍式生意业务,所以合约逻辑可以用具备ACID属性的方法来处理惩罚巨大的多步调、多区块链生意业务以及外部系统生意业务。开拓者因此可以建设用于智能合约中的可移植的、独立且具隐私性的事实理会。Cryptlet遵循下列名目:
· 其他区块链上产生的事件:可互操纵函数。
一系列其他方案也是大概的,譬喻,可以从EOA请求数据并直接返回数据,从而无须利用预言机警能合约。
}
function queryTicker() public payable {
bytes32 ric = oracle.getResponseString(id, “symbol”);
// Do something with the price data
在本章中,我们将接头预言机(oracle),它是可觉得智能合约提供外部数据源的系统。 “oracle”一词来自希腊神话,代表可以或许与神灵交换的人,他们可以看到将来的愿景。在的上下文中,预言机是一个可以答复以太坊外部问题的系统。在抱负环境下,预言机是无信任的系统,这意味着它们不需要被信任,因为它们是凭据去中心化的原则运行的。
代码11-1是一个Solidity示例,展示了Oraclize如何从API不绝获取ETH/USD价值并以可用的方法存储功效。
ETH/USD price ticker leveraging CryptoCompare API
function initRequest(
Town Crier(http://www.towncrier.org/)是一个基于可信执行情况的验证数据馈送预言机系统;这些要领回收基于硬件的安详区(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)。
pragma solidity ^0.4.1;
· 以太币市场价值:譬喻gas价值预言机。
uint public ethUsd;
真实性证明是用暗码学证据证明数据没有被改动过。基于很多证明技能(譬喻,数字签名证明),它们将需要的信任从数据传输者高效地转移到证明人(证明要领的提供者)。通过链上验证证据,智能合约可以在利用数据前验证数据的完整性。Oraclize(现已插手Chainlink网络)http://www.oraclize.it/就是一个操作多种真实性证明的预言机处事的例子。此刻以太坊主网查询数据时可以利用的个中一种证明方法是TLSNotary Proof。TLSNotary Proof答允客户端向第三方提交证据,证明客户端与某处事器之间产生了HTTPS网络流量。固然HTTPS自身是安详的,但它并不支持数据签名。因此,TLSNotaryProof依赖于TLSNotary签名方案(通过PageSigner)。TLSNotaryProof操作了传输层安详协议(Transport Layer Security,TLS),这让TLS可以掌控密钥,在获取数据后给数据签名,并将数据分派给三方:处事器(预言机)、受审单元(Oraclize)以及审计方。Oraclize利用亚马逊网络处事器(AWS)虚拟机实例作为审计方,可以验证自实例化以来它没有被修悔改。这一AWS实例存储着TLSNotary密文,密文让它可以提供厚道性证明。固然这套方案在数据改动上提供了比纯粹的“请求/响应”机制更高的安详担保,我们仍然需要假设亚马逊本身不会改动虚拟机实例。
if (msg.sender != oraclize_cbAddress()) throw;
金融数据提供者ThomsonReuters也为以太坊提供了一项名为“BlockOneIQ”的预言机处事,让运行在私有或者可网络上的智能合约可以请求市场和参考数据。代码112是该预言机的交互接口,以及用于提倡请求的客户端智能合约。
Chainlink(https://chain.link)已经提出了一种去中心化预言机网络,由三个要害智能合约(声誉合约、订单匹共同约、数据汇总合约)以及数据提供者的链外注册表构成。声誉合约用来跟踪数据提供者的表示。声誉合约中的分数会更新到链外注册表中。订单匹共同约会从利用声誉合约的预言机中选择竞标者,并最终确定处事层级要约(Service Level Agreement,SLA),个中包括了查询参数和要求的预言机数量。这也意味着数据购置者不会直接与个别预言机生意业务。数据汇总合约会从多个预言机处收集响应(利用“commit reveal”模式提交),计较查询的最终总功效,然后将功效反馈反映誉合约。
数据查询的价值会由queryTicker函数执行。为执行数据查询请求,Oraclize要求用付出一小笔用度,用于赔偿传输和处理惩罚功效到_callback函数进程中产生的gas用度以及为处事付出的特别用度。用度的数额视数据源和要求的可信证明范例(假如有所指定的话)而定。一旦检索了数据,_callback函数就会由Oraclize节制的许可账户挪用;这一进程会传入响应值和独一的queryId参数,后者可以用于处理惩罚和跟踪来自Oraclize的多个待定的回调。
new SampleContractConstructor())
* a string result such as “123.45” to be converted to uint 12345.
if (oraclize_getPrice(“URL”) > this.balance) {
function addArgumentToRequestString(uint256 id, bytes32 name, bytes32 arg)
{
}
代码11-1:利用Oraclize从外部来历更新ETH/USD汇率
}
*/
· 查抄是否提供了付款和数据会见权限。
queryTicker();
public;
assert(msg.sender == address(oracle));
· 将事务广播到网络。
contract OracleB1IQClient {
· 统计与准统计数据:安详标识、国度代号、钱币代号等。
function addArgumentToRequestUint(uint256 id, bytes32 name, uint256 arg) public;
newOraclizeQuery(“Oraclize query was NOT sent, please add some ETH
· 与自然灾害相关的参数触发器:触发大型自然灾害债券智能合约(譬喻地动的里氏震级丈量债券)。
这样的去中心化方案要面对的个中一个重大挑战是:构建数据汇总函数。Chainlink提议计较响应附加权重,这样就可觉得每一个预言机响应记录有效性分数。此处,发明一个“无效”的分数并不是毫无代价的,因为它成立在:(以对统计提供的响应的偏离来怀抱)过于偏远的数据点是不正确的这一前提之上。基于某一预言机响应环绕响应漫衍的位置来计较有效性分数有必然风险,详细表示为处罚偏离平均值的正确谜底。因此,Chainlink提供汇总函数的尺度荟萃,但也支持利用定制化的汇总合约。
returns(uint256);
event newCallbackResult(string result);
为给定命据源设定的参数,大概包罗JSON或XML理会助手的利用。
: base(id, bindingId, name, address, hostContainer, contract)
import “github.com/oraclize/ethereum-api/oraclizeAPI.sol”;
}
function getIntraday(bytes32 ric, uint256 timestamp) public {
fsym=ETH&tsyms=USD,EUR,GBP).USD”);
去中心化的预言机可以办理个中一些问题,并为以太坊智能合约提供无信任的外部数据。审慎选择,你就可以开始摸索以太坊与预言机提供的“真实世界”之间的桥梁。
// called from callback since we’re polling the price
· 成本市场数据:譬喻为一揽子代币化资产或证券订价。
function OracleB1IQClient(address addr) public payable {
// specifies JSONPath, to fetch specific portion of JSON API result
}
function(uint256
MessageApi = new CryptletMessageApi(GetType().FullName,
一般来说,在思量利用预言机时要很是小心信任模子。假如你认为预言机可以信任,那么你大概会通过将其袒露给潜在的错误输入来粉碎智能合约的安详性。也就是说,假如仔细思量安详假设,那么预言时机很是有用。
ethUsd = parseInt(_result, 2);
配置预言机的三种主要方法可以分为请求与响应、宣布与订阅和当即读取。
为什么需要预言机?
为团结Oraclize,EthUsdPriceTicker合约必需是usingOraclize合约的子合约;后者是在oraclizeAPI文件中界说好的。数据请求会由usingOraclize合约内置的oraclize_query函数提倡。这是一个重载函数,估量至少需要两个参数:
uint256 low = oracle.getResponseUint(id, “low”);
/*
* Uses inherited “parseInt” helper from “usingOraclize”, allowing for
· 汇率数据:譬喻让与法定钱币准确挂钩。
“json(https://min-api.cryptocompare.com/data/price?\
预言机的应用场景和示例
string address, IContainerServices hostContainer, bool contract)
oracle.deleteResponse(id);
This contract keeps in storage an updated ETH/USD price,
function __callback(bytes32 _queryId, string _result, bytes _proof) public {
}
假如你愿意信任会合而可审计的处事,你可以再次会见Oraclize。它们提供的处事答允去中心化应用请求在沙盒AWS虚拟机中执行的计较功效。AWS实例从包括在存档中的用户设置的Dockerfile建设可执行容器,该存档上载到星际文件系统(IPFS,拜见第12章“数据存储”一节)。按照请求,Oraclize利用其哈希检索此存档,然后在AWS上初始化并执行Docker容器,通报将作为情况变量提供应应用措施的任何参数。容器化应用措施按照时间限制执行计较,并将功效写入尺度输出,Oraclize可以对其举办检索并返回到去中心化应用。Oraclize今朝在可审计的t2.microAWS实例上提供此处事,因此假如计较具有一些很是重要的值,则可以查抄是否执行了正确的Docker容器。尽量如此,这不是一个真正去中心化的办理方案。
Oracle private oracle;
预言机的设计模式
TrueBit(https://truebit.io)是一个可扩展和可验证的链外计较办理方案。它引入了一个办理者和验证者系统,它们被鼓励各自执行计较和验证这些计较。假如一个计较功效受到挑战,链上就会相应执行对该计较子集的迭代验证历程——这是一种范例的“验证游戏”。验证游戏会举办几轮,每一轮城市递归地磨练相关计较的更小子集。挑战充实细分之后,游戏的终局便到来,法官(以太坊矿工)便可在链上最终裁定相关挑战是否公道。实际上,TrueBit是计较市场的一种实现,去中心化应用因此可觉得可验证计较付出;计较固然是在链外执行的,但依靠以太坊来强制执行验证者游戏的法则。理论上来说,这让免信任型智能合约安详地执行任意计较任务。
newCallbackResult(_result);
uint256 open = oracle.getResponseUint(id, “open”);
将数据放入智能合约的存储空间,使数据可用。
contract EthUsdPriceTicker is usingOraclize {
“oraclize_” prepended methods indicate inheritance from “usingOraclize”
function handleSuccess(uint256 id) public {
正如你所看到的,预言机为智能合约提供了至关重要的处事:它们将外部事实带入合约执行。虽然,预言机也会带来很大的风险:假如它们是受信任的来历而且大概受到损害,大概导致它们提供的智能合约的执行受损。
“请求/响应”种别是最巨大的:这是数据空间太大而无法存储在智能合约中的环境,而且用户每次只需要整个数据集的一小部门。它也是数据提供贸易务的合用模子。实际上,这样的预言机可以实现为链上智能合约系统,以及用于监督请求和检索、返回数据的链外基本布局。来自去中心化应用的数据请求凡是是涉及很多步调的异步进程。在这种模式中,首先,EOA与去中心化应用举办交互,从而与预言机警能合约中界说的成果举办交互。此函数启动对预言机的请求,除了大概包括回调函数和调治参数的增补信息之外,还利用相关参数具体说明所请求的数据。一旦验证了此事务,就可以将预言机请求视为预言机合约发出的EVM事件,可能作为状态变动;可以检索参数并用于执行链外数据源的实际查询。预言机大概还需要付款来处理惩罚请求,回调的gas付出以及会见所请求数据的权限。最后,功效数据由预言机所有者签名,证明在给按时间内的数据有效性,并在事务中通报给直接或通过预言机合约发出请求的去中心化应用。按照调治参数,预言机可以按期广播进一步更新数据的事务(譬喻,日终订价信息)。
function executeRequest(uint256 id) public;
请留意,某些预言机提供针对特定私有数据源的数据,譬喻学术证书或当局ID。这些数据的来历,如大学或当局部分,是完全可信的,数据的真实性是主观的(真相只能通过来历的权威来确定)。因此,不能无信地提供这样的数据,即不信任来历,因为没有独立可验证的客观事实。因此,我们将这些数据源包括在我们对预言机的界说中,因为它们还为智能合约提供了数据桥梁。它们提供的数据凡是回收证明的形式,如护照或成绩记录。“证言”将成为将来区块链平台乐成的重要构成部门,出格是在验证身份或声誉的相关问题方面,因此摸索区块链平台如作甚其提供处事很是重要。
雷同地,可以向支持物联网的硬件传感器发出请求和响应。因此,预言机可以是人、软件或硬件。此处描写的请求与响应模式常见于客户端与处事器体系布局。固然这是一种有用的动静通报模式,答允应用措施举办双向对话,,但在某些环境下这大概是不符合的。譬喻,在请求与响应模式下,需要预言机利率的智能债券大概必需天天请求数据,以确保利率始终是正确的。鉴于利率不常常变革,宣布与订阅模式大概更符合这种环境,尤其是思量到以太坊的有限带宽。
to cover for the query fee”);
数据认证
以太坊平台的一个要害组件是EVM,它可以或许在分手网络中的任何节点上执行措施并更新受共鸣法则约束的以太坊状态。为了保持共鸣,EVM的执行进程必需完全确定,而且仅基于以太坊状态和签名生意业务的共享上下文。这发生了两个出格重要的效果:一个是EVM和智能合约没有内涵的随机性来历;另一个是外部数据只能作为生意业务的数据载荷引入。
uint256 close = oracle.getResponseUint(id, “close”);
· 时间和隔断数据:基于精准的SI(国际单元制)时间怀抱的事件触发器。·天气数据:譬喻基于天气预报的保险费计较器。
在接下来的部门,我们将研究可以实现预言机的一些要领,包罗根基的预言机的设计模式、计较性预言机、去中心化的预言机以及Solidity中的预言机客户端实现。
按照界说,所有的预言机都提供了一些要害成果。这些本领包罗:
大概由预言机提供的更大都据示例包罗:
/*
· 从链外数据源检索相关数据(并在须要时加密)。
在宣布与订阅模式中,宣布者(在此上下文中是指预言机)不直接向吸收者发送动静,而是将宣布的动静分类到差异的类中。订阅者可以或许表达对一个或多个类的乐趣并仅检索那些感乐趣的动静。在这种模式下,预言机大概会在每次变动时将利率写入其本身的内部存储。多个订阅的DApp可以简朴地从预言机合约中读取它,从而淘汰对网络带宽的影响,同时最大限度地低落存储本钱。
bytes32 error = oracle.getResponseError(id);
oraclize_setProof(proofType_TLSNotary | proofStorage_IPFS);
请求与响应预言机的步调可以总结如下:
总结
// signals TLSN proof generation and storage on IPFS
代码11-2:合约挪用BlockOneIQ处事以获取市场数据
下一个配置方法是宣布与订阅,在这种预言机中,要对预期改变的数据(大概是按期和频繁地)提供有效的广播处事,预言秘密么由链上的智能合约轮询,要么由链外守护历程监督和更新。此种别具有雷同于RSS摘要或WebSub的模式,个中预言机利用新信息举办更新,并用标志暗示新数据可供“订阅”的人利用。感乐趣的人必需将预言机轮询到查抄最新信息是否已变动,或监听预言机合约的更新并在产生时采纳动作。示例包罗价值馈送、天气信息、经济或社会统计、交通数据等。在Web处事器规模,轮询效率很是低,但在区块链平台的对等情况中却不是这样:以太坊客户必需跟上所有状态变动,包罗对合约存储的变动,因此轮询数据变动是对同步客户端的当地挪用。以太坊事件日志使应用措施出格容易留意预言机更新,因此这种模式在某些方面甚至可以被视为“推送”处事。可是,假如轮询是通过智能合约完成的——这对付某些去中心化的应用大概是须要的(譬喻,在无法激活鼓励的环境下),则大概发生大量的gas支出。
oracle = Oracle(addr);
即便我们假设被去中心化应用查询的数据源是权威的和值得信任的,仍然存在一个突出的问题:鉴于预言机以及“请求/响应”机制大概由多个实体来操纵,我们如何才气信任这个机制呢?数据在传输进程中被改动的大概性显然是存在的,所以,让链外要领可以证明返回数据的完整性长短常要害的。两种常见的数据认证要领是真实性证明(authenticity proof)以及可信执行情况(Trusted Execution Environment,TEE)。
· 损坏水平核验:保险合约。
一旦数据在智能合约的存储中可用,其他智能合约就可以通过挪用预言机警能合约的“检索”成果来会见它;它也可以通过“查察”预言机的存储直接由以太坊节点或支持网络的客户端会见。
利用签名动静在链上传输数据。
抱负环境下,预言机提供了一种无信任(或至少近乎无信任)的方法来获取外在的(即“真实世界”或“链外”)信息,譬喻足球角逐的功效、黄金的价值或真正的随机数字,用于以太坊平台上的智能合约。它们还可用于直接将数据安详地中继到DApp前端。因此,可以将预言机视为弥合链外世界与智能合约之间差距的机制。答允智能合约基于真实世界的事件和数据来强制执行合约干系,从而大大扩展了它们的范畴。可是,这也会赐与太坊的安详模子带来外部风险。思量一个“智能遗嘱”合约——当一小我私家归天时分派资产。这是智能合约规模中常常接头的内容,并突出了可信任的预言机的风险。假如由这样的合约节制的担任金额足够高,那么在所有者灭亡之前进攻预言机(发出假的死讯)并触发资产分派的念头长短常强烈的。
像TrueBit这样的系统有许多应用,从呆板进修到任意事情量证明的验证。后者的个中一个例子是Doge Ethereum桥接,它操作TrueBit来验证狗狗币(Dogecoin)的事情量证明算法Scrypt,这是一种强内存需求且计较麋集的函数,它不行能在以太坊区块gas上限内计较完成。通过在TrueBit执行这种验证,在以太坊Rinkeby测试网络上用智能合约安详地验证狗狗币生意业务便成为大概。
contract Oracle {
}
function getResponseUint(uint256 id, bytes32 name) public constant
在广播或多播模式中,预言时机将所有动静宣布到信道,订阅合约将在各类订阅模式下收听信道。譬喻,预言机大概会将动静宣布到加密钱币汇率信道。订阅智能合约假如需要时间序列,譬喻移动平均计较,则可以请求信道的全部内容;另一个大概只需要现货价值计较最新利率。在预言机不需要知道订阅合约的身份的环境下,广播模式是符合的。
}
计较机性的预言机
oracle.addArgumentToRequestString(id, “symbol”, ric);
· 利用包括的数据对事务举办签名。
oracle.addArgumentToRequestUint(id, “timestamp”, timestamp);
uint256 queryType, function(uint256) external onSuccess,
· 物理随机数源或熵源(譬喻量子现象或热现象):如在彩票智能合约中公正地选出获奖者。
利用initRequest函数启动数据请求,该函数答允指定查询范例(在此示例中是对日内价值的请求)以及两个回调函数。这将返回一个uint256标识符,然后可用于提供其他参数。addArgumentToRequestString函数用于指定路透代码表(RIC),此处为IBM库存,addArgumentToRequestUint答允指按时间戳。此刻,传入block.timestamp的别名将检索IBM的当前价值。然后由executeRequest函数执行该请求。处理惩罚完请求后,预言机合约将利用查询标识符挪用onSuccess回调函数,从而答允检索功效数据;假如检索失败,onFailure回调函数将返回错误代码。乐成检索的可用字段包罗open(开盘价)、high(最高价)、low(最低价)、close(收盘价)和bid/ask(买/卖价)。
}
}
function deleteResponse(uint256 id) public constant;
oracle.deleteResponse(id);
assert(msg.sender == address(oracle));
function getResponseError(uint256 id) public constant returns(bytes32);
(希)安德烈亚斯·M.安东波罗斯. 能干以太坊:开拓智能合约和去中心化应用 (OReilly佳构图书系列) (Chinese Edition) (Kindle Locations 5007-5013). Kindle Edition.
* Parse the result string into an unsigned integer for on-chain use.
public SampleContractCryptlet(Guid id, Guid bindingId, string name,
*/
· 政治事件:预测市场的走势。·举动事件:预测市场走势以及体育博彩相关的合约。·地理定位数据:譬喻供给链跟踪。
· 航班统计数据:譬喻用于集体和俱乐部的机票条约。
从链外的数据源收集数据。
· 指标引用数据:譬喻将利率纳入智能金融衍生品合约。
) external onFailure) public returns (uint256 id);
public class SampleContractCryptlet : Cryptlet
which is updated every 10 minutes.
// requests query
queryTicker();
uint256 ask = oracle.getResponseUint(id, “ask”);
} else {
/*
*/
function EthUsdPriceTicker() payable {
让我们进一步阐明这两个效果。首先我们要领略为什么在EVM中需要克制真正的随机函数,不让它们为智能合约提供随机性。请思量在执行此类函数后对实验告竣共鸣的影响:节点A将执行呼吁并代表智能合约存储3在其存储中,而节点B执行沟通的智能合约,将存储7。因此,节点A和节点B就功效状态应该是什么将得出差异的结论,尽量在沟通的上下文中运行完全沟通的代码。实际上,每次评估智能合约时,大概会到达差异的功效状态。因此,由于其浩瀚节点活着界各地独立运行,网络将无法就功效状态应该是什么告竣去中心化的共鸣。在实践中,它会比这个例子巨大得多,因为包罗以太币转移在内的连锁效应会以指数方法增长。
· 理会查询。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。