区块链 智能合约 能够通过集成 去中心化预言机 来访问链下数据。在深入探讨如何使用它们之前,重要的是要了解智能合约在大局中的重要性,以及为什么它们需要预言机来访问数据。
每天都在发生交易,就像数万年来一样。它们通常受协议或合同约束。这可能是由供应商的服务条款、监管框架或两者结合驱动的。这些协议的参数并不总是清晰或透明,并且它们最终受品牌(无论是人还是公司)及其履行预先商定的条款的意愿支配。
合同,像世界上的其他事物一样,正在走向数字化。区块链技术的兴起引入了智能合约,这是一种更防篡改、透明和公平的系统,用于管理此类协议。智能合约由数学而非品牌管理。它们在执行后自动执行合同的参数,为所有各方创建更公平的结构。
智能合约面临的挑战是,它们通常依赖于将真实世界数据与区块链(或从一个区块链到另一个区块链的数据)桥接的能力,以便智能合约可以识别质量、评估可靠数据,并在满足条款后触发商定的结果。传统上,这是一个过于复杂和困难的过程,这限制了更广泛的采用。
关于 Chainlink
Chainlink 是一个开源抽象层,它提供了一个框架,可以轻松地将任何区块链与任何外部(或单独的区块链)API 连接起来。您可以将 Chainlink 视为 TCP/IP 中的传输层的区块链等效物,确保数据可靠地传入和传出。Chainlink 旨在成为智能合约的标准数据层,释放它们影响外部世界的真正能力,并将它们变成外部感知的通用智能合约。
智能合约有能力彻底改变业务中处理信任和自动化的方式,但它们的作用范围仅限于区块链上的事件,这严重限制了它们的潜力。开发人员希望互动的大部分内容都存在于“真实世界”中,例如定价数据、运输事件、世界事件等。为了创建通用智能合约,这些合约是外部感知的,因此可以使用世界数据在指尖处理广泛的通用工作,Chainlink 网络为 Solidity 和其他区块链开发人员提供了一个去中心化预言机框架来构建。
您可以 使用这些预言机在以太坊主网上实时检索去中心化应用程序 (dApp) 的数据。
Chainlink 适配器
适配器 是每个 Chainlink 节点默认支持的默认数据操作函数。在这种情况下,节点是去中心化的预言机。它们满足数据请求,Chainlink 网络由不断增长的节点数量组成。节点由众多独立的运营商运行。通过适配器,所有开发人员都有一个用于发出数据请求的标准接口,节点运营商有一个用于服务该数据的标准。这些适配器包括 HTTP GET、HTTP POST、Compare、Copy 等功能。适配器是 dApp 与外部世界数据的连接。
例如,以下是 HttpGet 适配器的参数
- get:接受一个字符串,其中包含要向其发出 GET 请求的 API URL
- headers:接受一个对象,其中键为字符串,值为字符串数组
- queryParams:接受字符串或字符串数组作为 URL 的查询参数
- extPath:接受一个斜杠分隔的字符串或字符串数组,以附加到作业的 URL
Chainlink 请求
为了让通用智能合约与这些适配器交互,您需要另一个功能,即请求。所有从 ChainlinkClient 继承的合约都可以创建一个 Chainlink.Request 结构,允许开发人员向 Chainlink 去中心化预言机发出请求。此请求应根据您要发出的请求将所需的适配器参数添加到结构中。提交此请求需要一些基本字段,例如您要用作预言机的节点的地址、jobId 和商定的费用。除了这些默认字段之外,您还可以将所需的适配器参数添加到请求结构中
// Set the URL to perform the GET request on
request.add("get", "https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD");
有了这个结构,请求是灵活的,可以制定以适应各种情况,包括从任何 API 获取、发布和操作数据,因为请求可以包含任何适配器功能。使该系统去中心化的原因是 Chainlink 的预言机网络由许多此类节点组成,开发人员可以根据自己的需求自由选择需要请求的节点以及数量。这实现了通过多个来源进行冗余故障转移和错误检查,正如高可靠性 dApp 通常需要的那样。
有关构建请求以及在 ChainlinkClient 合约中提交请求和接收响应所需的功能的更多信息,请参阅 Chainlink 的完整 HTTP GET 请求示例。
对于常见请求,节点运营商可能已经预配置了现有的预言机作业,在这种情况下,请求要简单得多。您只需要创建默认请求结构,而无需构建自定义请求结构并添加必要的适配器。不需要额外的适配器参数;您选择的去中心化预言机组将知道如何根据创建请求结构时提供的 jobId 做出响应。
此示例来自完整的 CoinGecko Consumer API
Chainlink.Request memory req = buildChainlinkRequest(jobId, address(this), this.fulfillEthereumPrice.selector);
sendChainlinkRequestTo(oracle, req, fee);
您可以使用去中心化预言机数据服务,例如 Chainlink Market,搜索现有的预言机及其支持的作业,以找到您需要的 jobId。
外部适配器
但是,如果您的智能合约有默认适配器功能未涵盖的复杂用例怎么办?如果您需要执行一些高级数据操作怎么办?也许您不想将原始数据提交到您的合约,而是提交通过对多个数据点进行统计分析而生成的元数据。也许您可以使用默认适配器在链上操作数据,但想要降低 gas 成本。也许您不想在链上进行 API 请求,因为您使用的是凭证源,并且您不想在链上或预言机作业规范中指定这些凭证。这就是 外部适配器 的用武之地。

(Chainlink, ©2020)
外部适配器是 Chainlink 的“无论您需要什么数据;我们都可以处理它”。当我们说通用智能合约时,我们真的指的是通用。由于外部适配器是在 Chainlink 预言机节点链下存在的代码片段,因此它们可以用您选择的任何语言编写,并执行您能想到的任何功能——只要数据输入和输出符合适配器的 JSON 规范即可。外部适配器充当 Chainlink 去中心化预言机网络和外部数据之间的接口,让节点运营商知道如何请求和接收 JSON 响应,然后 JSON 响应将在链上使用。
通过外部适配器在链下定义此接口规范开辟了广阔的可能性:您现在可以根据您的个人安全标准在链下存储您的 API 凭证,数据可以用您选择的语言以任何方式编程 ,所有这些操作都不会使用任何以太坊 gas 费用来资助链上 交易。 从某种意义上说,外部适配器就像去中心化预言机的另一层,在区块链外部快速且低成本地打包数据,并将其放入一个整洁的 JSON 格式中,以供 Chainlink 预言机节点可验证地在链上提交。
外部适配器是使 Chainlink 成为如此通用的去中心化预言机网络的重要组成部分。合约开发人员可以根据需要自由实现这些适配器,或者他们可以从 Chainlink Market 上的 现有适配器 中进行选择。如果您是希望创建外部适配器的智能合约开发人员,Chainlink 仅要求您为数据请求和返回数据指定 JSON 接口;在这两个接口之间,开发人员可以自由创建和操作数据以适应其用例。作为预言机节点运营商,要支持外部适配器并处理额外的请求,您必须在您的节点用户界面中为它 创建一个桥接器,并将适配器的桥接器名称添加到您支持的任务中。

(ChainLink, ©2020)
{
"initiators": [
{ "type": "runLog" }
],
"tasks": [
{ "type": "randomNumber" },
{ "type": "copy",
"params": {"copyPath": ["details", "current"]}},
{ "type": "multiply",
"params": {"times": 100 }},
{ "type": "ethuint256" },
{ "type": "ethtx" }
]
}
您可以在 Chainlink 的 构建外部适配器 页面上访问创建外部适配器的完整示例。
Chainlink 致力于为区块链和智能合约开发人员提供工具,以使用真实世界数据增强通用智能合约,完全按照他们需要的方式。Chainlink 的设计,结合了通过默认适配器和可扩展的外部适配器对任何 API 的直接调用,为开发人员提供了一个灵活的平台,让他们可以根据需要创建,并使用他们可能需要的任何数据。这为智能合约打开了一个字面意义上的数据世界,以及由此实现的新用例。
开始使用 Chainlink 构建
如果您是希望使用外部数据提高智能合约实用性的智能合约开发人员,请尝试此 Chainlink 示例演练,以部署与链下数据交互的通用智能合约。
Chainlink 在 MIT 许可证 下开源,因此,如果您正在开发的产品可以从 Chainlink 去中心化预言机中受益,或者想要协助开发 Chainlink 网络,请访问 开发者文档 或加入 Discord 上的技术讨论。您还可以在 Chainlink 的 网站、Twitter、Reddit、YouTube、Telegram 和 GitHub 上了解更多信息。
评论已关闭。