预言机的英文为Oracle,和著名的数据库服务提供商Oracle(甲骨文)重名,但是两者除了名字相同以为并没有任何关系。Oracle这个单词是什么意思,下面是我在vocabulary.com上查到的Oracle的含义:
Back in ancient times, an oracle was someone who offered advice or a prophecy thought to have come directly from a divine source. In modern usage, any good source of information can be called an oracle.
中文的大概意思是:在古代,oracle是一个提出建议或预言的人,他的建议或预言被认为是直接来自于神。在现代用法中,任何好的信息来源都可以称为oracle。
计算机领域内的预言机一词,最早是图灵提出的。(没错 正是在下的博客名“图灵重生我名苏泽”的那个图灵,计算机之父)
所谓预言者,是一个可以回答特定问题集合的实体。即它可以向图灵机系统内部输入信息,帮助图灵机完成运算。
以太坊的智能合约是“图灵完备(Turing Complete)”的,某种意义上可以看做一个图灵机,所以以太坊的设计者借鉴这个概念,把向“图灵完备的智能合约”这个图灵机输入信息的也被称为预言机oracle。
也就是说 一方向他输入信息 他就会回答对应的问题
在认识他之前 我们必须先认识 混智能合约 智能合约我说过http://t.csdnimg.cn/cbhUm 那混智能合约是怎么回事呢?
智能合约可以连接到现实世界的资产市场价格,以产生强大的应用程序。将智能合约与链下数据和服务安全地连接起来,使它们成为混合智能合约。这是使用预言机完成的。
也就是说,预言机有的 Chainlink都会有 而且封装的更好 供我们使用
在《精通以太坊(Matering Ethereum)》一书中,提出了三种预言机的设计模式,分别是
而基于LINK ERC677 token完成的预言机功能,就属于其中的请求/响应模式。这是一种较为复杂的模式,上图中展示的是一个不含有聚合过程的简单请求/相应流程。
在了解到如何使用之前我们得先知道如何进行部署
部署智能合约 是将代码推送到的过程blockchain ,此时它驻留在链上地址。一旦部署,代码就无法更改,并且被称为不可变的。
只要知道地址,它的功能就可以通过接口、在Etherscan上或通过web3js、web3py、ethers等库调用。合约也可以写成与区块链上的其他合约交互。
Remix是一个网络IDE(集成开发环境) 也就是 你敲代码(编写合约的地方)
用于在浏览器中创建、运行和调试智能合约。它是由以太坊基金会开发和维护的。Remix允许Solidity开发人员在没有开发机器的情况下编写智能合约 ,因为所需的一切都包含在网络界面中。它简化了已部署的合约的交互方式,不需要命令行界面。Remix 也支持样例合约。这意味着Remix,可以从Github加载代码。
FISCO BCOS是一个基于区块链技术的开源平台,它可以用于构建企业级的区块链应用。
FISCO BCOS和Remix是两个与智能合约开发相关的工具。下面将介绍它们的选择和使用。
FISCO BCOS是一个联盟链平台,它支持Solidity作为智能合约开发语言。Solidity是一门面向区块链平台设计的编程语言,具有广泛的影响力和社区支持。如果你需要直接的构建一个企业级的项目,或是你目前手上已经有了一些项目。你需要把区块链集成进来,那么选择使用FISCO BCOS作为区块链平台是一个很好的选择。
Remix是一个在线的Solidity集成开发环境(IDE),它提供了编写、编译、部署和调试智能合约的功能。通过Remix,你可以直接在浏览器中编写和测试智能合约,无需安装任何开发环境。如果你想快速上手Solidity并进行智能合约的开发和测试,Remix是一个很好的选择。
合约可以在Remix或是FISCO BICOS上面进行 编写 测试 但是如何让你的合约与项目进行交互呢?
使用Solidity引入Chainlink并使用其API查询现实世界信息的例子,例如查询天气(当然了,实际的业务大概是查询某某币的市值之类的操作而非那么无聊,这里只是简单举个例子):
MyChainlinkWeather
。truffle init
命令以初始化Truffle项目。npm install @chainlink/contracts --save
命令以安装Chainlink开发库。在项目的contracts
目录中创建一个新的Solidity合约文件,例如WeatherContract.sol
。
在合约文件中导入Chainlink相关的库和合约
pragma solidity ^0.8.0;
import "@chainlink/contracts/src/v0.8/ChainlinkClient.sol";
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
创建一个合约,继承自ChainlinkClient
合约,并设置构造函数:
contract WeatherContract is ChainlinkClient {
address private oracle;
bytes32 private jobId;
uint256 private fee;
string public weather;
constructor() {
setPublicChainlinkToken();
oracle = 0x0000000000000000000000000000000000000000; // 设置你选择的Chainlink Oracle地址
jobId = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // 设置你选择的Job ID
fee = 0.1 * 10 ** 18; // 设置你愿意支付的LINK费用
}
}
function requestWeather() public {
Chainlink.Request memory request = buildChainlinkRequest(jobId, address(this), this.fulfill.selector);
request.add("url", "https://api.weatherapi.com/v1/current.json?key=YOUR_API_KEY&q=YOUR_LOCATION");
request.add("path", "current.condition.text");
sendChainlinkRequestTo(oracle, request, fee);
}
function fulfill(bytes32 _requestId, bytes32 _weather) public recordChainlinkFulfillment(_requestId) {
weather = bytes32ToString(_weather);
}
function bytes32ToString(bytes32 _bytes32) private pure returns (string memory) {
bytes memory bytesArray = new bytes(32);
for (uint256 i; i < 32; i++) {
bytesArray[i] = _bytes32[i];
}
return string(bytesArray);
}
truffle migrate --network ropsten
命令将合约部署到Ropsten测试网络。requestWeather
函数来发起Chainlink请求并获取天气信息。此外 如果你要将在链上的数据 跟你的项目相结合的时候 可能就要用到FISCO BICOS,使用他的sdk