Oracle
2018-08-24 本文已影响0人
Jisen
一部预言机可以视为是与一个预言者(oracle)相连接的图灵机。在区块链中,预言机为智能合约打开了外部世界的大门,使得智能合约可以将真实世界的信息作为合约执行的条件。
目前大部分项目都是通过第三方服务oraclize.it部署预言机。Oraclize服务允许智能合同从外部环境访问数据。
下图描述了Oraclize的机制:
它使用TLSNotary
来实现它的serivce信任值,并预取网络中所有节点的真实世界数据以达成一致,这不能用Ethereum智能合约完成。
ETH
- 如果当前正在使用私有链,为了使用Oraclize服务,必须先安装ethereum-bridge。它是一个日志侦听器,侦听来自私有链的oraclize查询,并连接到oraclize服务。
- 将oraclize服务的智能合约文件oraclizeAPI_0.4.sol下载到自己工作目录的truffle合约文件夹,并将该文件重命名为
usingOraclize
。在自己的合约中调用该合约:
import "./usingOraclize.sol";
- 启动testrpc
- 通过以下命令启动Ethereum-bridge:
node bridge -H localhost:8545 -a 1
- tag -a 定义了用于部署oraclize合约的帐户。它会给你一个OAR地址。
OAR=OraclizeAddrResolverI(0x5049063e4a7704ac155e4f1f42a4954bbef5bbde);
- 使用新的地址解析器来更新您的智能合约构造函数。
- 在Oraclize服务中,必须向Oraclize智能合约发送查询。Oraclize接收你的查询并发出相应的请求。一旦服务接收到来自API的数据,他们就会在智能合约中调用回调函数,这样就可以访问和处理所请求的数据。
pragma solidity ^0.4.16;
import "./usingOraclize.sol"; //Importing Oraclize
contract TestOraclizeCall is usingOraclize {
uint public price;
event Log(string text);
//Constructor
function TestOraclizeCall() {
OAR = OraclizeAddrResolverI(0x5049063e4a7704ac155e4f1f42a4954bbef5bbde);
}
function __callback(bytes32 _myid, string _result) {
require (msg.sender == oraclize_cbAddress());
Log(_result);
price = parseInt(_result, 2);
}
function update() payable {
oraclize_query("URL","json(https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD).USD");
}
}
比如上面代码用于查询当前ETH的USD价格,oraclize_query
函数被用于调用第三方API。__callback
函数,第一个参数是请求的id。第二个参数是请求的结果。
注意必须使用truffle来编译和运行合同。
扩展链接
- oraclize.it
- Codius Smart Oracle system
- 谈谈区块链(14):以太坊的预言机(oracle)
- 智能预言机:一种简单、强大的执行智能合同的方法
- Smart Oracles: A Simple, Powerful Approach to Smart Contracts
- oraclize/ethereum-api
- oraclize/ethereum-examples
- ethereum-bridge
- Understanding oracles
- Oraclize-Tutorial
- Getting started with Oraclize
- ETH call through oraclize
- blockchain-oracles
- How does Oraclize handle the TLSnotary secret?
- Oracle预言机项目发展概览
- Gnosis 预言机
- 欧链技术白皮书
- realitykeys
- codius
- Introducing the Proofshield