由于区块链生态系统的性质,从链上智能合约中访问链外数据是不可能的。然而,Chainlink为区块链oracle提供了一个平台,区块链oracle是网络上充当链上和链下数据之间桥梁的节点。oracle使智能合约能够从外部世界检索数据。
每个oracle节点都可以配置为执行范围广泛的任务,具体取决于它支持的适配器。其中一些适配器包括httpget、httppost、JSON Parse、Multiply等的实现。
如何使用Chainlink Oracle
注意:在此示例中,我们使用的是Ropsten测试网。
假设我们要创建一个智能合约,该合约以以太坊的美元价格为准,这是根据受欢迎的价格分析网站CoinGecko的报道得出的。我们知道,我们的智能合约没有本地方法可以调用外部HTTP API,但是oracle节点可以。
使用请求和响应周期,我们的智能合约可以从oracle节点请求数据,该节点被配置为执行HTTP GET请求,并为oracle实现回调函数以响应。

图1:请求和接收数据流
我们不能简单地使用任何Oracle,因为每个Oracle被配置为执行特定的任务,具体取决于它们支持的适配器。为了找到适合我们需求的高品质Oracle,我们必须使用诸如Chainlink Market之类的挂牌服务进行搜索。
Chainlink market
列表服务使我们能够找到可以满足我们要求的Oracle。常用的API通常具有预先配置的对某些端点的请求的oracle实现,这使我们的开发更加容易。我们可以通过转到Chainlink Market主页并在搜索栏中键入“ CoinGecko”来确定所需的CoinGecko端点是否已由Oracle实施。

图2:Chainlink Market搜索“ CoinGecko”
如图2所示,我们得到了一些结果!
Nodes部分列出了已返回搜索字符串结果的oracle节点。这可能意味着它们支持从coingeckoapi检索数据的作业,在可用的三个节点中,Omniscience-Ropsten已验证(带圆圈),表明了它的可靠性。它的作业运行次数也最多。
向下滚动,我们可以在Jobs标题下看到ETH-USD CoinGecko。这看起来很完美,因为它似乎可以准确描述我们要检索的内容,并使用经过验证的节点。

图3显示了节点详细信息页面,该页面为我们提供了有关Oracle节点的更多信息。在左侧(红色矩形内)是oracle的链上地址。如果要使用此oracle,则需要记下该地址。
在屏幕的右侧是三个选项卡:Adapters, Feeds和Jobs。点击Jobs并滚动直到找到ETH-USD CoinGecko。单击该链接以显示工作信息页面。

图4向我们显示了jobs信息页面,在该页面中,我们可以查看有关jobs要求的详细信息。突出显示了作业ID和运行此作业的成本(也记下这些)。
页面右侧是“任务列表”。这是作业被调用时执行的操作的列表。每个任务使用一个受支持的适配器,一个接一个地创建一个任务链。让我们遍历列表中的每个任务,以找出作业如何获取所需的数据:
1. HTTP GET Request

第一个任务是使用HTTP GET调用CoinGecko API。我们可以从参数中的URL确认它发出了正确的CoinGecko请求。这将返回JSON响应主体。
2. JSON Parse

由于任务1返回JSON,因此下一个任务需要解析它以访问目标数据。任务2使用JSON Parse适配器通过提供的路径遍历返回的JSON对象。例如任务2路径中的目标数据将位于以下JSON结构中:
{"market_data":{"current_price":{"usd":"PRICE_HERE"}}}3. Multiply

我们已经从JSON中获取了价格,但还没有完全准备好。由于Solidity不能处理小数,任务3将价格乘以100000000,以确保它可以表示为整数。
4. ETH Int256

然后任务4将结果转换为编码的int256。
5. ETH Transaction

最后任务5创建一个以太坊事务,将结果发送回原始合约。
智能合约编写
现在我们已经选择了一个可以满足请求的Oracle,让我们写一个可以提出请求的合约。Chainlink提供了一个名为ChainlinkClient的父合约,我们将对其进行扩展以简化请求和响应周期。
pragmasolidity0.6.0;import"https://github.com/smartcontractkit/chainlink/evm-contracts/src/v0.6/ChainlinkClient.sol";import"https://github.com/smartcontractkit/chainlink/evm-contracts/src/v0.6/vendor/Ownable.sol";contractExampleOracleClientisChainlinkClient,Ownable{addressconstantprivateORACLE=0x83dA1beEb89Ffaf56d0B7C50aFB0A66Fb4DF8cB1;stringconstantprivateJOB_ID="93547cb3c6784ec08a366be6211caa24";uint256constantprivateORACLE_PAYMENT=1*LINK/10;uint256publiccurrentPrice;eventRequestEthereumPriceFulfilled(bytes32indexedrequestId,uint256indexedprice);constructor()publicOwnable()functionrequestEthereumPrice()publiconlyOwnerfunctionfulfillEthereumPrice(bytes32_requestId,uint256_price)publicrecordChainlinkFulfillment(_requestId)functionwithdrawLink()publiconlyOwnerfunctionstringToBytes32(stringmemorysource)privatepurereturns(bytes32result)assembly{//solhint-disable-lineno-inline-assemblyresult:=mload(add(source,32))}}}图5向我们展示了ExampleOracleClient合约。它具有使用通过Chainlink Market找到的Oracle向CoinGecko请求以太坊的最新美元价格的功能。让我们逐行浏览:
第7行:节点详细信息页面上的图3中找到的Oracle地址
第8和9行:图4中找到的工作ID和价格
第11行:currentPrice是将由执行请求的oracle填充的字段。
第19行:setPublicChainlinkToken()是ChainlinkClient父合约中可用的函数,该函数设置当前网络上LINK令牌的地址。
第22–25行:requestEthereumPrice()使用Oracle地址,作业ID,价格和回调函数构建Chainlink请求。然后它使用sendChainlinkRequestTo()请求数据,这是父ChainlinkClient合约提供的另一个功能。
第27行:Oracle用于完成请求的回调函数
第32行:使所有者能够从合约中提取LINK令牌的函数
第37行:用于构建请求的实用程序功能
尝试将此合约粘贴到Remix IDE中并部署到Ropsten测试网。部署后,将一些Ropsten LINK发送到其地址(您可以在此处找到Ropsten LINK水龙头)。然后当该事务成功完成后,在您可用的功能列表中单击requestEthereumPrice。几秒钟/分钟后,单击currentPrice按钮,您应该会看到一个价格!

结论
Chainlink oracle是强大的工具,可实现外部世界与区块链之间的互操作性。诸如Chainlink Market之类的清单服务是一种有用的目录服务,用于查找最适合您的智能合约需求的Oracle。
在我们的示例中,我们发现了一个oracle作业,该作业已配置为从目标终端请求数据。如果这样的工作不存在,或者您找不到它,也可以。Oracle还支持接受GET请求URL作为参数并从中获取数据的作业。这意味着您可以使用Chainlink oracle从任何外部API检索数据。
新加坡交易所SGX FX采用Chainlink预言机平台 机构级OTC FX数据上链赋能全球DeFi与代币化资产
21Shares携手法国兴业银行,强化德国及东欧市场加密ETP流动性
Interactive Brokers新增LINK、AVAX、SUI:加密货币交易扩展至12种资产
CME集团6月30日推出现货报价期货:比特币、以太坊及标普500等长达5年持有
eToro推出加密资产转账与兑现功能:比特币、以太坊可无缝投资多资产
nxtAssets GmbH携手SIX推出比特币与以太坊ETP:加密资产交易总数达398
Clearstream携手Crypto Finance推出加密资产托管服务,德意志交易所集团引领机构投资者新风潮
西班牙BBVA获批推出比特币和以太坊交易服务,零售客户可通过手机银行直接管理加密资产
Bybit遭遇重大黑客攻击,15亿美元数字货币被盗
Bybit遭遇安全漏洞,1.4亿美元以太坊代币被盗,市场反应激烈
Bybit交易所遭黑客攻击,14亿美元ETH被盗,资金安全隐患引发行业关注
以太坊 ETF 在美国上市首日交易量达 10 亿美元,占比特币交易量的 23%
现货以太 ETF 将于今日在 SEC 最终批准后开始交易
芝商所推出以微欧元计价的比特币和以太坊期货
TP-ICAP 通过 Chainlink 向区块链提供外汇数据
Visa (NYSE:V) 設想在以太坊網絡上進行自動支付
俄罗斯银行建议对NFT、智能合约进行监管
MetaMask“Portfolio Dapp”新增跨链桥服务
0xScope:Alameda以太坊上627个地址总资产约1亿美元
Paradigm:BTC和ETH看跌期权的需求重新出现



