【51CTO.com快译】区块链智能合约能够通过集成去中心化的Oracle来访问链外数据。用户在深入研究如何使用它们之前,重要的是要了解区块链智能合约在全局中的重要性以及为什么需要Oracle来访问数据的原因。
如今,全球每天都在发生大量交易,并且它们通常受到协议或合同的约束。这可能是由供应商的服务条款、监管框架或两者的组合所驱动的。这些协议的参数并不总是明确或透明的,它们最终取决于组织以及它是否愿意按照事先商定的条款行事。
越来越多的合同正在实现数字化。区块链技术的兴起引入了智能合约,这是一种防止篡改、透明、公平的管理此类协议的系统。智能合约是由数学而不是组织来管理的。一旦合同生效,它们会自动执行合同的参数,为各方创造一个更加公平的结构。
智能合约的挑战在于,它们通常依赖于将现实世界数据与区块链(或数据从一个区块链转移到另一个区块链)进行桥接的能力,以便智能合约能够识别质量、评估可靠数据并触发商定的结果满足条件。而在以往这是一个过于复杂和困难的过程,限制了更广泛的采用。
关于Chainlink
Chainlink是一个开源抽象层,它提供了一个框架,可以轻松地将区块链与外部(或单独的区块链)API连接。你可以将Chainlink视为TCP/IP中传输层的等效区块链,以确保数据可靠地传入和传出。Chainlink旨在成为智能合约的标准数据层,释放其影响外部世界的真正能力,并将其转变为具有外部意识的通用智能合约。
智能合约可以彻底改变业务中信任和自动化的处理方式,但是它们对区块链事件应用范围的限制严重限制了其潜力。开发人员希望与之交互的大部分内容都存在于“真实世界”中,例如定价数据、航运条件、全球事件等,以创建通用智能合约。这些合约具有外部意识,因此可以在掌握世界数据的情况下处理广泛而通用的工作,Chainlink网络为Solidity和其他区块链开发人员提供了一个用于构建分散式Oracle的框架。
可以使用这些Oracle在以太坊网站上实时检索分散应用程序(dApp)的数据。
Chainlink适配器
适配器是每个Chainlink节点默认支持的数据操作功能。节点在这种情况下是分散的。它们满足数据请求,而Chainlink网络由数量不断增长的节点组成。其节点由众多独立的运营商运营。通过适配器,所有开发人员都具有用于发出数据请求的标准接口,而节点操作人员将遵循用于处理该数据的标准。这些适配器包括HTTP GET、HTTP POST、比较,复制等功能。适配器是dApp与外部世界数据的连接。
例如,这是HttpGet适配器的参数:
Get:获取包含API URL的字符串以向Get请求。
headers:将包含键作为字符串,将值作为字符串数组的对象。
queryParams:获取URL的查询参数的字符串或字符串数组。
extPath:采用斜杠分隔的字符串或字符串数组,以附加到作业的URL。
Chainlink请求
为了使通用智能合约与这些适配器进行交互,需要其他功能。从Chainlink Client继承的所有合同都可以创建Chainlink.Request结构,该结构允许开发人员向Chainlink分散的Oracle发出请求。该请求应根据要发出的请求将所需的适配器参数添加到结构中。提交这一请求需要一些基本字段,例如要用作Oracle的节点的地址、jobId和约定的费用。除了这些默认字段之外,还可以将所需的适配器参数添加到请求结构中:
//设置网址以在上执行Get请求
request.add("get", "https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD");
使用这个结构,其请求是灵活的,并且可以制定为适合各种情况的请求,这些情况涉及从任何API获娶发布和操作数据,因为请求可以包含任何适配器功能。使该系统去中心化的原因是Chainlink的Oracle网络由许多这些节点组成,并且开发人员可以根据自己的需求自由选择节点和数量。正如高可靠性dApp经常需要的那样,这可以通过多个来源实现冗余故障转移和错误检查。
有关构造请求以及在ChainlinkClient合同内提交请求和接收响应所需的功能的更多信息,可以查看Chainlink的完整HTTP GET请求示例。
对于常见请求,节点操作人员可能已经预先配置了现有的Oracle作业,在这种情况下,其请求要简单得多。而无需构建自定义请求结构并添加必要的适配器。无需其他适配器参数,选择的分散式预言集将基于创建请求结构时提供的jobId知道如何响应。
这一示例来自完整的CoinGecko Consumer API:
Chainlink.Request memory req = build Chainlink Request(jobId, address(this),this. fulfill Ethereum Price.selector);send Chainlink Request To(oracle, req, fee);
可以使用分散的Oracle数据服务(例如Chainlink Market)搜索现有的Oracle及其支持的作业以找到所需的jobId。
外部适配器
但是如果智能合约有复杂的用例,而默认适配器功能未涵盖这一用例,那么该怎么办?如果需要执行一些高级数据操作怎么办?也许不是要提交到合同的原始数据,而是由对多个数据点进行统计分析生成的元数据。也许可以使用默认适配器在链上操作数据,但希望降低成本。也许由于使用凭据来源,不希望其API请求在链上,并且不想在链上或在Oracle作业规范中指定这些凭据。这是外部适配器发挥作用的地方。
由于外部适配器是与Chainlink Oracle节点脱链存在的代码段,因此它们可以用选择的任何语言编写,并执行人们可以想到的任何功能,只要数据输入和输出遵循适配器的JSON规范。外部适配器充当Chainlink分散式Oracle网络与外部数据之间的接口,使节点操作员知道如何请求和接收JSON响应,然后在链上使用它们。
通过外部适配器在链外定义这一接口规范将带来巨大的可能性:现在可以根据个人安全标准在链外存储API凭据,可以采用选择的语言以任何方式对数据进行编程,所有这些无需使用任何以太坊费用来资助链上交易的情况。从某种意义上说,外部适配器就像去中心化Oracle的另一层一样,以低成本、快速地将数据打包到区块链外部,然后将其转换为整洁的JSON格式,以由Chainlink oracle节点在链上进行验证。
外部适配器是使Chainlink成为一个多功能的分散式Oracle网络的重要部分。合同开发人员可以根据需要自由实施这些适配器,也可以从Chainlink市场上的现有适配器中进行选择。如果是寻求创建外部适配器的智能合约开发人员,Chainlink只要求为数据请求和返回数据指定JSON接口。在这两个接口之间,开发人员可以自由创建和操作数据以适应其用例。作为Oracle节点操作人员,要支持外部适配器并处理其他请求,必须在节点用户界面中为其创建网桥,并将适配器的桥名称添加到支持的任务中。
你可以在Chainlink构建外部适配器页面上访问创建外部适配器的完整示例。
Chainlink致力于为区块链和智能合约开发人员提供工具,使他们可以根据实际需要,以真实数据来支持通用智能合约。
Chainlink致力于为区块链和智能合约开发人员提供工具,使他们可以根据实际需要,以真实数据来支持通用智能合约。Chainlink的设计结合了通过默认适配器和可扩展外部适配器对任何API的直接调用,为开发人员提供了一个灵活的平台,可以根据需要创建所需的任何数据。这为智能合约打开了一个真正的数据世界,并赋予新的用例。
使用Chainlink进行构建
如果是智能合约开发人员,希望通过外部数据增加智能合约的实用性,需要尝试此Chainlink示例演练,以部署与链外数据进行交互的通用智能合约。
Chainlink是根据MIT许可证开放的源代码,因此,如果要开发一款可以从Chainlink分散式预言中受益的产品,或者想协助开发Chainlink网络,需要参考开发人员文档或参加有关Discord的技术讨论。还可以在Chainlink的网站、Twitter、Reddit、YouTube、Telegram和GitHub上了解更多信息。
原文标题:Create universal blockchain smart contracts,作者:Gage Mondok
【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】