揭开Chainlink的神秘面纱

本文将详细解析Chainlink网络中的各个要素如何协力为区块链开发者打造一个稳健且可扩展的系统,并与外部世界交互。Chainlink网络为复杂的智能合约提供了可靠且防篡改的数据输入和输出,将智能合约连接至链下数据、事件和支付系统。

Chainlink的底层架构是去中心化的预言机,这个概念一直以来都受到区块链社区的大力追捧。Chainlink不同于其他中心化预言机网络,其网络由多个独立节点组成,为用户提供了独一无二的使用体验。节点操作者的服务可以得到验证,服务质量高的节点还可得到LINK奖励。如果节点违规操作或服务水平低,则会受到惩罚。

Chainlink在2017年9月发布的白皮书(https://link.smartcontract.com/whitepaper)中首次披露了其网络的设计架构。到目前为止,Chainlink的架构与当初的设计思路基本保持一致。目前Chainlink的代码库(https://github.com/smartcontractkit/chainlink)仍然活跃,当初计划的许多功能都在持续上线中。

Kaleido刚刚发布了1.0.22版本,这个版本在开源项目0.7.0版本基础上更新了Chainlink runtime。Chainlink是Kaleido应用市场最早发布的APP之一,首个版本在2019年1月发布。

下方链接可查看Chainlink总体架构:
https://docs.chain.link/docs/architecture-overview

Chainlink相较其他预言机技术的不同之处

我将Chainlink与其他类型的预言机做了一个对比:
在这里插入图片描述

Chainlink网络的构成要素

Chainlink网络由众多节点组成,每个节点都有具体的任务描述,节点执行链上预言机合约发出的任务指令。Chainlink节点操作者为客户端智能合约提供服务,可获得LINK奖励。

预言机智能合约

预言机合约是Chainlink的内核,也是Chainlink在Kaleido区块链网络中的核心价值。

• 可以决定使用哪些Chainlink节点完成任务
• 可以将客户端智能合约连接至Chainlink网络
• 将任务执行结果从Chainlink网络返回至客户端智能合约
• 如果节点服务水平低下,则没收其抵押通证作为惩罚

智能合约会发布EVM活动,目的是为了广播客户端对外部数据或任务的请求,即预言机请求(OracleRequest),并与Chainlink网络节点进行交互。请求对象包括任务ID(job ID)、客户付款金额、客户期望的任务执行参数以及客户端合约接收返回结果的回调地址。

区块链网络中可能有一个以上活跃的预言机合约。因此,Chainlink节点操作者需要选择希望服务的预言机合约,合约也需对申请服务的预言机进行选择。

客户端智能合约

Chainlink预言机主要服务的对象是智能合约。这也是对企业区块链APP开发者最关键的一块内容。如上文所述,客户端智能合约无法与链下世界交互。比如要通过一个特殊的载体,在交易事件广播中将数据请求发布出去,让链下的服务提供者可以看到请求,搜集所需数据,并通过交易调用智能合约,将数据传输到链上。
在这里插入图片描述
智能合约与链下世界交互的方式:请求-事件-响应模式

Chainlink的设计思路就是基于请求-事件-响应的模式,并建立了更加精细化的交互流程。应用开发者不需要从零开始写智能合约,他们可以在ChainlinkClient.sol(标准合约模板)基础上进行开发,这样能大幅缩短开发流程。

应用开发者只需实现客户端智能合约的三个部分即可:
• 决定使用哪个LinkToken合约和预言机合约,可以在构造函数中进行配置

  constructor(address _link, address _oracle) public Ownable() {
    setChainlinkToken(_link);
    setChainlinkOracle(_oracle);
  }

• 实现对应的函数:使用要求的参数和回调函数构建一个任务请求,然后发送到预言机合约

function requestEthereumPrice(string _jobId)
    public
    onlyOwner
  {
    Chainlink.Request memory req = buildChainlinkRequest(stringToBytes32(_jobId), address(this), this.fulfillEthereumPrice.selector);
    req.add("get", "https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD");
    req.add("path", "USD");
    req.addInt("times", 100);
    sendChainlinkRequest(req, ORACLE_PAYMENT);
  }

• 实现回调函数:将响应数据作为参数传入

 function fulfillEthereumPrice(bytes32 _requestId, uint256 _price)
    public
    recordChainlinkFulfillment(_requestId)
  {
    emit RequestEthereumPriceFulfilled(_requestId, _price);
    currentPrice = _price;
  }

Chainlink节点

Chainlink节点负责执行任务请求。区块链网络可以接入任意数量的Chainlink节点。节点互相独立,它们之间不存在任何P2P网络,只能与接入的区块链节点交互,接收任务请求并通过交易将结果发回到链上。
在这里插入图片描述
Chainlink节点接收任务请求并通过交易发送结果

使用Chainlink客户端智能合约的组织可以部署一些共享Chainlink节点实例,任务需求部署后产生的Job ID可以在所有参与的组织中进行共享。只要有Job ID就可以使用Chainlink的预言机服务。目前发布的版本中,每次部署任务都会产生一个新的Job ID。因此,每个数据请求都有对应的Chainlink节点。也就是说,Chainlink暂时还未完全实现最初设想的去中心化架构。

LinkToken智能合约

在去中心化的世界里,必须要有一个稳健的机制,既能激励诚实守信的行为,又能惩戒违规行为。Chainlink使用经济激励的方式,以LINK通证作为奖励或进行处罚。LinkToken是ERC2.0合约,可实现transfer、approve和transferFrom等标准化操作。另外,它还实现了ERC677接口,可调用transferAndCall函数,在单笔交易中实现支付和调用功能。

LINK通证有以下两个使用场景:
• 规范节点操作者的行为:提供服务的Chainlink节点必须在预言机合约中抵押一定金额的LINK,并在合约中注册。预言机合约将评估节点操作者的表现,一旦发现违规操作,概不退还抵押资金。
• 客户端向节点操作者付款:当节点操作者发布任务描述时也会设置服务价格。客户端合约在发布任务请求时会以LINK支付服务费。

Kaleido上的Chainlink服务为每个环境提供了价值10亿个LINK通证的资金池,仅限Kaleido区块链网络使用(注:这些LINK通证没有实际货币价值)。所有联盟成员都可以通过服务控制界面或Kaleido平台API支取LINK。然而,所有Chainlink节点执行任务都不允许付款功能,也就是说内部任务是“不收费”的,不需要用LINK支付。Chainlink服务管理员仍然可以定义新的外部适配器类型。

任务(Job)
归根到底,预言机是为了完成任务,比如执行代码逻辑或获取外部数据,而这些任务在EVM这样受限的链上环境是无法进行操作的。Chainlink将Job定义为描述具体工作的模型。以下是具体示例:

{
  "initiators": [{
    "type": "RunLog",
    "params": { }
  }],
  "tasks": [{
    "type": "HTTPGet",
    "confirmations": 0,
    "params": { "get": "https://bitstamp.net/api/ticker/" }
  }, {
    "type": "JSONParse",
    "params": { "path": [ "last" ] }
  }, {
    "type": "Multiply",
    "params": { "times": 100 }
  }, {
    "type": "EthUint256"
  }, {
    "type": "EthTx"
  }]
}

所有Job都分为两部分:
• 启动器(initiator):指任务触发方式。任务可以由目标区块链发布的事件启动,也可以按预先设置的日程启动一次或反复启动,还可以直接根据对Chainlink节点发出的HTTP请求启动。
• 子任务(task):完成任务(job)的具体步骤。类型可以是HTTPGet和JSONParse等内部task,也可以是通过Chainlink外部适配器的定制化task。

Job需要在Chainlink节点注册。注册后,节点会生成独一无二的Job ID。客户端可以用这个ID发送任务执行请求。

总结

下图显示了Chainlink网络的各个构成要素。
在这里插入图片描述

Chainlink网络的工作流程:
• 第一步:在交易中调用客户端智能合约执行功能,功能实现需要外部数据。智能合约使用job ID准备发出请求,并设置任务参数。客户端智能合约调用预言机合约执行请求。
• 第二步:预言机合约发布事件(包含Job ID和参数,以及客户端合约承诺支付的LINK金额)
• 第三步:所有连接到区块链网络的Chainlink节点都通过事件广播得知任务请求。
• 第四步:部署了Job ID的Chainlink节点得知自己已接受任务请求。将Job ID对应的任务内容与事件中的参数相结合,为任务执行设置环境。
• 第五步:收到所需数据后,Chainlink节点向预言机合约发出一笔交易,提醒任务已完成。交易信息包含任务执行结果。
• 第六步:预言机合约使用request ID查询请求方,并使用预言机结果数据触发请求方合约的回调。

到这一步,客户端智能合约已经成功从链下获得了所需数据,并开始处理客户端发出的原始交易请求。

眼见为实

使用Chainlink是非常有趣的体验,也是区块链与链下世界连通的关键环节。但要在端到端实现具体功能,还需要修改和添加大量代码,这项工作往往会让人望而却步。为了帮助开发者快速掌握这项技术,Kaleido团队现已发布了两个示例:
• 开发Chainlink客户端智能合约的Truffle项目
• 用JavaScript开发示例应用,展示与Chainlink客户端智能合约的交互方式

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值