苏泽
大家好 这里是苏泽 一个钟爱区块链技术的后端开发者
本篇专栏 ←持续记录本人自学两年走过无数弯路的智能合约学习笔记和经验总结 如果喜欢拜托三连支持~
前面的专栏带大家熟悉了 区块链的基本组成 、共识机制、智能合约、最小信任机制 以及EVM等知识 如遇不懂的概念或名词全部可以在前面的文章找到解释哦
区块链专栏:http://t.csdnimg.cn/CCnWE
正文
目录
预言机概念
起源
图灵在图灵机(Turing Machine)的基础上,加入了一个称为预言者(oracle)的黑盒,组成了预言机(Oracle Machine)。
所谓预言者,是一个可以回答特定问题集合的实体。即它可以向图灵机系统内部输入信息,帮助图灵机完成运算。
所以,预言机是连接智能合约与区块链外部世界的中间件(middleware),是区块链重要的基础设施,它的作用是为区块链上的智能合约(Smart Contract)提供数据信息的。
Chainlink到底是什么
混智能合约
Chainlink使用其去中心化的预言机网络将智能合约与外部数据连接起来。Chainlink API请求由预言机1:1处理。
了解Chainlink架构
怎么使用?
智能合约如何使用预言机?
Remix
FISCO BICOS
FISCO BCOS的功能:
如何进行选择
合约如何与现实链接
后期会专门讲解 solidity(编写智能合约的主要流行语言)、FISCO BICOS的使用 以及对接具体项目的实战示例
敬请期待 求三连~
预言机概念
预言机的英文为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 Machine)的基础上,加入了一个称为预言者(oracle)的黑盒,组成了预言机(Oracle Machine)。
所谓预言者,是一个可以回答特定问题集合的实体。即它可以向图灵机系统内部输入信息,帮助图灵机完成运算。
以太坊的智能合约是“图灵完备(Turing Complete)”的,某种意义上可以看做一个图灵机,所以以太坊的设计者借鉴这个概念,把向“图灵完备的智能合约”这个图灵机输入信息的也被称为预言机oracle。
也就是说 一方向他输入信息 他就会回答对应的问题
所以,预言机是连接智能合约与区块链外部世界的中间件(middleware),是区块链重要的基础设施,它的作用是为区块链上的智能合约(Smart Contract)提供数据信息的。
Chainlink到底是什么
在认识他之前 我们必须先认识 混智能合约 智能合约我说过http://t.csdnimg.cn/cbhUm 那混智能合约是怎么回事呢?
混智能合约
智能合约可以连接到现实世界的资产市场价格,以产生强大的应用程序。将智能合约与链下数据和服务安全地连接起来,使它们成为混合智能合约。这是使用预言机完成的。
Chainlink使用其去中心化的预言机网络将智能合约与外部数据连接起来。Chainlink API请求由预言机1:1处理。
也就是说,预言机有的 Chainlink都会有 而且封装的更好 供我们使用
了解Chainlink架构
- 首先,Chainlink 使用其去中心化预言机网络,将智能合约与外部数据连接起来。每一个Chainlink API的请求都由一个预言机处理。
- 而后他会聚合来自多个方面的数据预言机。通过链上聚合,数据从去中心化的 独立的网络预言机 节点。该架构应用于Chainlink Data Feeds ,从而可以聚合资产价格数据等数据。
在《精通以太坊(Matering Ethereum)》一书中,提出了三种预言机的设计模式,分别是
- 立即读取(immediate-read)
- 发布/订阅(publish–subscribe)
- 请求/响应(request–response)
而基于LINK ERC677 token完成的预言机功能,就属于其中的请求/响应模式。这是一种较为复杂的模式,上图中展示的是一个不含有聚合过程的简单请求/相应流程。
怎么使用?
在了解到如何使用之前我们得先知道如何进行部署
部署智能合约 是将代码推送到的过程blockchain ,此时它驻留在链上地址。一旦部署,代码就无法更改,并且被称为不可变的。
只要知道地址,它的功能就可以通过接口、在Etherscan上或通过web3js、web3py、ethers等库调用。合约也可以写成与区块链上的其他合约交互。
智能合约如何使用预言机?
-
部署Chainlink预言机合约:首先,需要在区块链上部署Chainlink预言机合约。这个合约将负责与链下数据源进行通信,并将数据传递给智能合约。
-
配置预言机合约:在部署预言机合约后,需要配置它与链下数据源的连接。这包括设置数据源的地址、API密钥等信息,以便预言机可以正确地获取数据。
-
编写智能合约:在智能合约中,需要引入Chainlink的预言机合约(类似Java引入依赖,python引入库一样的道理),并定义一个函数来调用预言机获取数据。这个函数将使用预言机合约提供的接口来请求数据,并将数据返回给智能合约。
-
处理返回的数据:一旦预言机获取到数据,它将通过回调函数将数据返回给智能合约。智能合约可以在回调函数中对数据进行处理,例如验证数据的有效性、更新合约状态等。
Remix
Remix是一个网络IDE(集成开发环境) 也就是 你敲代码(编写合约的地方)
用于在浏览器中创建、运行和调试智能合约。它是由以太坊基金会开发和维护的。Remix允许Solidity开发人员在没有开发机器的情况下编写智能合约 ,因为所需的一切都包含在网络界面中。它简化了已部署的合约的交互方式,不需要命令行界面。Remix 也支持样例合约。这意味着Remix,可以从Github加载代码。
FISCO BICOS
FISCO BCOS是一个基于区块链技术的开源平台,它可以用于构建企业级的区块链应用。
FISCO BCOS的功能:
- 智能合约:FISCO BCOS支持编写智能合约,智能合约是一种在区块链上执行的自动化合约。可以使用Solidity等编程语言编写智能合约,然后部署到FISCO BCOS网络中。
- 链上数据存储:FISCO BCOS提供了分布式存储功能,可以将数据存储在区块链上,确保数据的不可篡改性和透明性。
- 交易处理:FISCO BCOS支持高并发的交易处理,可以满足企业级应用的需求。
- 身份认证:FISCO BCOS提供了身份认证功能,可以确保参与区块链网络的各方的身份安全和可信度。
- 隐私保护:FISCO BCOS支持隐私保护功能,可以对交易和数据进行加密和隐私保护,确保敏感信息不被泄露。
如何进行选择
FISCO BCOS和Remix是两个与智能合约开发相关的工具。下面将介绍它们的选择和使用。
FISCO BCOS是一个联盟链平台,它支持Solidity作为智能合约开发语言。Solidity是一门面向区块链平台设计的编程语言,具有广泛的影响力和社区支持。如果你需要直接的构建一个企业级的项目,或是你目前手上已经有了一些项目。你需要把区块链集成进来,那么选择使用FISCO BCOS作为区块链平台是一个很好的选择。
Remix是一个在线的Solidity集成开发环境(IDE),它提供了编写、编译、部署和调试智能合约的功能。通过Remix,你可以直接在浏览器中编写和测试智能合约,无需安装任何开发环境。如果你想快速上手Solidity并进行智能合约的开发和测试,Remix是一个很好的选择。
合约如何与现实链接
合约可以在Remix或是FISCO BICOS上面进行 编写 测试 但是如何让你的合约与项目进行交互呢?
使用Solidity引入Chainlink并使用其API查询现实世界信息的例子,例如查询天气(当然了,实际的业务大概是查询某某币的市值之类的操作而非那么无聊,这里只是简单举个例子):
-
创建Truffle项目:
- 打开终端并创建一个新的文件夹,例如
MyChainlinkWeather
。 - 进入该文件夹并运行
truffle init
命令以初始化Truffle项目。
- 打开终端并创建一个新的文件夹,例如
-
安装Chainlink开发库:
- 在终端中进入项目文件夹,并运行
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 IDfee = 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的网络设置,例如Ropsten测试网络。
- 运行
truffle migrate --network ropsten
命令将合约部署到Ropsten测试网络。
-
调用合约获取天气信息:
- 在Truffle控制台或使用Web3.js等工具中,调用合约的
requestWeather
函数来发起Chainlink请求并获取天气信息。
- 在Truffle控制台或使用Web3.js等工具中,调用合约的
此外 如果你要将在链上的数据 跟你的项目相结合的时候 可能就要用到FISCO BICOS,使用他的sdk
后期会专门讲解 solidity(编写智能合约的主要流行语言)、FISCO BICOS的使用 以及对接具体项目的实战示例
敬请期待 求三连~