智能合约的作用很多,但是很多数据还是要基于互联网,那么如何在合约中获取互联网中的数据?Oraclize就是为了这个目的而诞生的。

工作原理:

智能合约通过对Oraclize发布一个合约之间的调用请求来获取数据,指定数据源和参数。Oraclize根据收到的请求获取数据,利用callBack函数返回结果。

Oraclize的数据源列表如下:

URL:互联网中的连接。

WolframAlpha:WolframAlpha是开发计算数学应用软件的沃尔夫勒姆研究公司开发出的新一代的搜索引擎,能根据问题直接给出答案的网站,于 2009年5月15日晚7点(美国中部当地时间,北京时间5月16日上午8点)提前上线,用户在搜索框键入需要查询的问题后,该搜索引擎将直接向用户返回答案,而不是返回一大堆链接。

·blockchain:其他区块链的数据

·IPFS:文件传输系统中的数据

·nested:nested数据源是一个元数据源,它不提供访问其他服务的权限。它用来提供简单相加逻辑,允许单个查询在任何可用数据源的基础上进行子查询,并产生一个单独字符串作为结果。

·computation:它允许抓取应用的链下执行结果。在退出前,该应用必须在最后一行打印查询结果(在标准输出栏)

真实性:

Oraclize提供了的TLSNotary  Proof来证明返回的结果是没有经过任何人修改的。TLS是一个网络传输协议,利用可信机构颁发的CA来保证传输正确。TLSNotary是TLS的改进,能够证明Oraclize提供给合约的数据就是某个特点时间点的正确数据。

服务费:

合约第一次对Oraclize的调用都是免费的。

第二个调用开始需要支付以太币,合约之间的支付,具体多少取决于调用的数据源和证明类型。

API简介:

1.证明API

需要Proof证明数据正确性:

oraclize_setProof(proofType_TLSNotary|proofStorage_IPFS)

第一个参数是证明类型,第二个是proof存储的位置,现在唯一的是存储在IPFS上。

不需要Proof证明:

oraclize_setProof(proofType_NONE)

2.查询API:oraclize_query

oraclize_query函数至少需要两个实参:数据源,输入值(查询条件)

类似这样:

oraclize_query("URL","http:XX//id=XX");

如果第一个参数是字符串,那么就认定是数据源。第二个参数就是查询条件。

如果有三个参数,则是一个POST请求,那么第三个参数就是POST请求的参数。

oraclize还可以做预约查询:

oraclize_query(,"WolframAlpha",:"random number between  0 and 100")

上述代码的参数是60,是一个整数,那么接口默认是一个预约查询的请求,预定60s以后执行查询。上面的目的是调用WolframAlpha数据源查询0到100的随机数,这也是很多时间solidity随机数不安全的解决方案之一。

3.自定义gas

调用oraclize的时候需要支付一定的费用,这个费用除了oraclize自己收取之外还用于回调的时候支付的gas。默认是200000gas。用户可以指定callback函数的gasLimit,但是如果用户发送给oraclize的gas过高,那么超过gasLimit的部分将会返回给oraclize。如果gas过低,可能永远不会收到回调。

oraclize_query("WolfameAlpha","random betwwen 0 and 100",);

第三个参数如果是整数就表示gas费用,这个值不能小于默认的200000.

4.回调

oraclize获取数据以后会调用合约地址的下面三个方法中的一个:

1._callback(bytes32 myid,string result)“.”Myid都是一个独特的ID。这个ID由oraclize_query方法返回。如果合约里有多个oraclize_query调用,则将这用于匹配该结果的查询。

2.如果需要TLSNortary的proof,则结果为_callback(bytes32 myid,string result,bytes proof)

3.没有其他方法  调用 匿名函数 function()

5.解析助手

oraclize还提供了一些利于解析页面的工具,类似于一些爬虫库封装的解析html页面的简单方法。

6.获取查询价格

如果在实际查询之前想知道查询需要多少费用,可以使用Oraclize.getPrice()函数获取所需的wei的数量。第一个实参是数据源,第二个实参是可选项,即自定义gas。一个常见的使用示例是,当以太币余额不足以进行查询时,通知客户端向合约添加以太币

加密查询

为了满足一些场景:比如用户不想暴露自己的查询地址,参数等信息。Oraclize提供了一个加密查询的方法。用python写的:https://github.com/Oraclize/encrypted-queries。只有客户端能解密。

这就是oraclize理论的介绍。

05-11 19:50