我的位置: 主页 > 数字币群文章 > 数字币群技巧 > Chainlink如何辅佐智能合约获取外部数据

Chainlink如何辅佐智能合约获取外部数据

发布人:数字币群 发时间:2019-07-16 03:50 热度:
智能合约自己没有访谒区块链外部数据的能力。而外部的数据对付大大都智能合约应用场景来说都是至关重要的,所

智能合约自己没有访谒区块链外部数据的能力。而外部的数据对付大大都智能合约应用场景来说都是至关重要的,所以这一成果的缺掉限制了智能合约的更进一步的成长。好比涉及金融,数字货币6月,提供链,保险,安适等诸多范围的智能合约都依赖于外部事件。智能合约无法获取关键的链下事件信息,好比价格改观,物流日期,以及付出能力。没有这些外部的信息,大大都智能合约的应用都是没有实际应用价值的。

为什么智能合约无法自主获取外部数据?

因为区块链网络是确定性的。智能合约在区块链这种去中心化的,央妈数字货币,自我调治的根本设施上运行,此中的任何信息都是确定的,可验证的。区块链可以正常运行,必需在各个参预方之间达成共鸣。为了实现这个方针,人们设计了[各类]*共鸣机制*,好比事情量证明(Proof of Work),权益证明(Proof of Stake),步履证明(Proof of Activity)。这些共鸣机制使得区块链这一漫衍式的系统形成一个统一的状态。

有了这些共鸣机制,就可以验证网络上的交易,确定统一果然账本的状态。这种设计允许区块链以公安然安祥安适的方法运行,而无需使用集中式身份验证。因此,区块链整体上是*确定性状态机*。

但是区块链外部的数据长短确定性的,因为从某种意义上说,它是通过区块链的历史无法验证的值。外部数据会受各类因素的影响动态变革。价格的频繁变革,公司实时更新物流信息,物流变革的更新,等等。因为这些信息是不确定的,智能合约没有一种方法可以验证这些数据进而达成共鸣。因此,无法确认为真实的数据对区块链没有任何意义。

如何把外部数据供给给智能合约?

通过区块链中间件,出格是安适可靠的预言机可以实现。预言机饰演者数据代办代理人的角色,连接外部数据与智能合约。它充当区块链数据API之间的中间层,将数据转换为区块链可以读取的格局。别的,预言机还卖力验证外部数据的正确性,因此可信赖的来源(信任最小化)至关重要。

但是,在中心化的预言机处事中,预言机会有被打击的可能性(被黑客打击,处事停机,数据篡改等),这导致智能合约丢掉了确定性和可靠性这一最关键的特性,从而使大大都基于现实场景的智能合约用例的不成用。如何解决这一问题呢,答案是去中心化的预言机网络。或者说是Chainlink

Chainlink通过供给与智能合约开发者的安适性和可靠性相匹配的去中心化的预言机网络来解决联通性问题。通过外部适配器(也被称为chainlinks),区块链可以安适地与chainlinked API连接。开发人员可以便利地将他们本身的智能合约与预先编写的Chainlink API套件连进行连接,从而成立一个链下的预言机连接。

例如,假设您开发了一个智能合约,可以把代币发送到一个地点。Chainlink(输出预言机)通过PayPal发送离线付出。然后,预言机可以基于离线付出在链上供给收据,从而完成区块链系统中的交易循环。

有了Chainlink,智能合约此刻能够通过一个去中心化的预言机网络在大大都现实世界的应用场景中正常运行。Chainlink通过安适可靠得方法满足智能合约的预设条件,因此所有相关方都可以从智能合约生态系统的巨大潜力中受益。

代码层面,预言机是如何事情的?

使用预言机需要由足足数量的LINK代币,以及一些根基的Solididy常识,Solidity是编写智能合约的语言。请参考Chainlink的[Solidity接口文档]来了解Chainlink的所有要领。最后,wield能从Chainlink的预言机请求数据,你需要首先在你的合约中担任ChainlinkClient合约。你可以通过[这里]的例子作为指导来创建合约,也可以参考[文档]。

预言机可以辅佐智能合约请求和获取区块链的外部数据。我们通过jobs来执行预言机任务来完成请求。这些jobs有与预言机地点相对应的JobID。这些Job由一系列任务,或称为[适配器],所构成,在指定JobID发送请求时, 这些任务或适配器界说了要完成的事情。

为了更好地展示预言机如安在代码层面运行,我们通过一个请求以太网价格的示例智能合约来解释:

contract MyContract is ChainlinkClient {
address owner;
constructor() public {
// Set the address for the LINK token on the public network
// 设置大众网络的LINK代币刊行地点
setPublicChainlinkToken();
owner = msg.sender;
}
// Additional functions here...
// 其他的函数...
}

首先,为了能使用Chainlink网络,你需要在你的合约中担任ChainlinkClient合约。这是一个测试网和正式网通用的结构函数体。这是因为我们使用了setPublicChainlinkToken()要领,这个要领会按照合约部署的网络环境,自动的获取LINK代币的刊行地点。

所有当前的预言机和LINK代币地点都可以在[这里]。存储LINK代币地点后,您可以指定预言机合约地点及其相应的JobID来创建请求。

// Creates a Chainlink request to the specified oracle with a given Job ID
// 通过给定预言机地点和JobID来创建Chainlink请求
function requestEthereumPrice(address _oracle, bytes32 _jobId) 
public
onlyOwner
{
// newRequest takes a JobID, a callback address, and callback function as input
// 新的请求需要JobID,回调地点和回调函数作为输入
Chainlink.Request memory req = buildChainlinkRequest(_jobId, this, this.fulfill.selector);

// Adds a URL with the key "get" to the request parameters
// 添加一个URL设置"get"作为key来请求参数
req.add("get", "https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD");

// Uses input param (dot-delimited string) as the "path" in the request parameters
// 使用点分隔断绝分手的字符串作为请求参数中的path
req.add("path", "USD");

// Adds an integer with the key "times" to the request parameters
// 为请求参数设置倍数
req.addInt("times", 100);

// Sends the request with 1 LINK to the oracle contract
// 向预言机还有发送1 LINK
sendChainlinkRequestTo(_oracle, req, ORACLE_PAYMENT);
}

请求通过buildChainlinkRequest()要领创建,接受相应的参数填写到Chainlink.Request布局体中作为负载。你可以使用req.add()向请求添加参数,好比URL。一旦你筹备好了所有的必需参数,可以通过sendChainlinkRequestTo()要领发送到特定的预言机合约地点,并付出1 LINK的代币,作为给节点运营方的奖励。请注意,在主网上,付出金额是各不不异的,但是为了便利大家理解,我们目前设置了为每次请求花费1 LINK。由于测试网络上这些代币没有任何价值,所以我们可以通过[水龙头]来获取。

uint256 constant private EXPECTED_RESPONSES = 3;
uint256[] private prices;
uint256 public avgPrice;

function fulfillEthereumPrice(bytes32 _requestId, uint256 _price)
public
recordChainlinkFulfillment(_requestId)
{
if(prices.push(_price) == EXPECTED_RESPONSES) {
uint256 sum;
for(uint i = 0; i < prices.length; i++) {
sum = sum.add(prices[i]);
delete prices[i];
}
avgPrice = sum.div(EXPECTED_RESPONSES);
}
}

当Chainlink节点从指定的端点取回功效后,预言机合约会挪用回填要领(fulfillment method)。回填要领应该通过recordChainlinkFulfillment()改削器或validateChainlinkCallback()要领掩护起来。这样可以防备无关的人挪用该要领,并且只能按照你的请求填写相应的功效。

将所有这些组合到一起,就可以完成一个可以在以太坊测试网络上可以获取外部数据的预言机合约了。完整代码见[这里]。

我如何开始使用Chainlink?

想要快速上手,你可以通过[这里]的辅佐,通过Truffle部署智能合约。如果你已熟悉智能合约开发,欢迎您随时检察我们最新的博客文章“[44种通过Chainlink增强您的智能合约的要领]”。

关键词: Chainlink  智能合约  

    分享给朋友: