在本章中,我们将讲解如下内容:
·Oraclize的工作原理。
·什么是Oraclize的多种数据源,它们各自如何工作。

·在Oraclize中共识的工作原理。
·在以太坊智能合约中整合Oraclize。
·用Solidity库使处理字符串变得容易。
·创建足球投注App。
Oraclize概述
Oraclize是一种服务,旨在使智能合约可以访问来自其他区块链或者万维网的数据。该服务目前在比特币以及以太坊测试网和主网上可用。Oraclize的特殊之处是你不需要信任它,因为它可以为所提供给智能合约的全部数据做真实性证明。
我们将学习如何在以太坊智能合约中使用Oraclize服务从万维网中抓取数据。
Oraclize的工作原理
下面来看以太坊智能合约使用Oraclize从其他区块链和万维网中抓取数据的过程。
为了抓取外部数据,以太坊智能合约需要发送一个查询给Oraclize,指定数据源(表示从哪里抓取数据)和数据源的参数(表示
抓取什么数据)。
向Oraclize发送一个查询,意味着发送一个合约调用(即内部交易)给以太坊区块链中出现的Oraclize合约。
Oraclize服务端不断寻找新传入智能合约的查询。当它发现一个新的查询时,就抓取结果,并调用合约的_callback方法将结果返回。
数据源
Oraclize允许智能合约抓取数据的源列表如下:
·URL。URL数据源允许用户发送HTTP GET或者POST请求,即万维网中抓取数据。
·WolframAlpha。WolframAlpha数据源允许用户向WolframAlpha知识引擎提交查询,并得到答案。
·blockchain。blockchain数据源允许用户访问其他区块链的数据。可以提交给blockchain数据源的查询包括bitcoin blockchain height、litecoinhashrate、bitcoin difficulty、1NPFRDJuEdyqEn2nmLNaWMfojNksFjbL4S balance等。
·IPFS。IPFS数据源允许用户抓取IPFS中存储的文件。
·nested。nested数据源是一个元数据源,它不提供访问其他服务的权限。它用来提供简单相加逻辑,允许单个查询在任何可用数据源的基础上进行子查询,并产生一个单独字符串作为结果,例如:
·computation。computation数据源允许特定应用的可审计执行进入安全的链下状,也就是说,它允许抓取应用的链下执行结果。在退出前,该应用必须在最后一行打印查询结果(在标准输出栏)。执行环境用Dockerfile描述,创建和运行该文件会立即启动主应用。Dockerfile初始化和应用执行应当尽快结束:在AWS t2.micro实例中最长执行时间为5min。这里考虑AWS t2.micro实例,因为Oraclize用它执行该应用。由于数据源输入是包含此类文件的ZIP文档包的IPFS多个哈希(Dockerfile和任何外部文件依赖,且Dockerfile必须位于档案的根目录里),用户应当事前小心地准备这个档案,并推送给IPFS。
真实性证明
尽管Oraclize是可信服务,用户可能还想检查一下Oraclize返回的数据是否真实,也就是说,检查它在传输过程中是否受到Oraclize或者其
他人的操控。
Oraclize提供的TLSNotary proof的来源是可选的,包括URL、区块链以及nested和computation数据源。该proof对WolframAlpha和IPFS数据
源不可用。目前,Oraclize仅支持TLSNotary proof,但是未来可能支持一些其他验证方式。目前,TLSNotary proof需要手动验证,但是Oraclize已经应用于链上proof验证,也就是说,智能合约代码可以自己验证TLSNotary proof同时从Oraclize接收数据,如果proof结果是非法的,就丢弃该数据。
这个工具()是Oraclize提供的开源工具,以验证TLSNotary proof。
下面概括一下TLSNotary的工作原理。为了理解TLSNotary的工作原理,首先需要理解TLS的工作原理。TLS协议提供一个让客户端和服务
端创建加密session的方式,这样其他任何人都不能读取或操纵客户端和服务端之间的传输内容。服务端首先发送证书(证书由受信任的CA颁
发给域名所有者)给客户端。证书包含服务端公钥。使用CA的公钥解码证书,这样可以验证该证书确实是由CA颁发的,并得到服务端的公
钥。然后,客户端生成一个对称密钥和一个MAC密钥,并使用服务端公钥加密它们,发送到服务端。只有拥有私钥的服务端才能够解码这条
信息。现在客户端和服务端共享同样的对称密钥和MAC密钥,由于其他人都不知道密钥,他们可以开始彼此发送和接收数据。在对称密钥和
MAC密钥一起被用于生成加密信息的签名的地方,对称密钥用于加密和解密数据,这样一旦攻击者修改信息,另一方就可以知道。
TLSNotary是TLS的改进,Oraclize用它提供密码学proof,以表示它们提供给智能合约的数据就是数据源在特定时间提供给Oraclize的数
据。事实上,TLSNotary协议是开源技术,由PageSigner项目开发使用。
TLSNotary在三方(服务端、审计方和被审计方)之间分解对称加密密钥和MAC密钥。TLSNotary的基本思想是被审计方可以向审计方证
明某一个给定结果是由服务端在某个给定时间返回的。
TLSNotary实现上述功能的过程为:审计方计算对称密钥和MAC密钥,并且只向被审计方提供对称密钥。被审计方不需要MAC密钥,因
为MAC签名检测确保来自服务端的TLS数据在传输过程中不被篡改。有了对称密钥,被审计方可以解码来自服务端的数据。因为银行使用
MAC密钥“签署”所有信息,而且只有服务端和审计方知道MAC密钥,因此正确的MAC签名可以被当作特定信息来自银行且未经被审计方篡改的证明。
在Oraclize服务情况下,Oraclize是被审计方,而审计方是一个特别设计的开源Amazon机器图像锁定的AWS实例。
它们提供的证明数据是一个正常TLSNotaryproof确实已发生的AWS实例的已签名证明。它们还提供一些涉及AWS实例中软件运行的其他
证明,即自初始化之后它是否被修改过。
定价
来自任意以太坊地址的第一个Oraclize查询调用都是完全免费的。Oraclize调用在测试网中都是免费的!
这只适合在测试环境进行适度使
用。
从第二个调用起,要进行查询就必须支付以太币了。在发送查询到Oraclize(即进行内部交易调用)时,会扣除一定费用(从调用合约向
Oraclize合约转账以太币)。扣除的以太币数量取决于数据源和证明类型。
表显示了发送查询时扣除的以太币数量。
所以如果正在发出HTTP请求,而且想要有TLSNotary proof,则调用合约必须有价值$0.05的以太币;否则,就返回异常。
来源:区块链研究实验室(bc-tech-lab)