乐趣区

关于区块链:将智能合约连接到Twitter-API

像 Twitter 这样的社交媒体平台领有丰盛的数据,展现了全世界人们所关怀的热门话题。咱们正在进入一个数据驱动的世界,而 Chainlink 提供了一个渠道,将这个宏大的数据集平安地连贯到链上世界,为咱们的社交媒体生存带来智能合约的可靠性和透明度保障。

在这次的实战演练中,咱们将介绍如何让你的智能合约连贯到 Twitter API。具体来说,咱们将解释如何从智能合约中收回一条推文,然而围绕社交媒体进行数据分析和智能合约的执行所展现进去的可能性却是有限的。

构造函数

pragma solidity ^0.6.12;

import "https://github.com/smartcontractkit/chainlink/evm-contracts/src/v0.6/ChainlinkClient.sol";

contract ChainlinkTwitter is ChainlinkClient {
    address private oracle;
    bytes32 private jobId;
    uint256 private fee;
    uint256 public statusCode;
    
    //only the contract owner should be able to tweet
    address payable owner;
    modifier onlyOwner {require(msg.sender == owner);
    _;
    }

    constructor() public {setPublicChainlinkToken();
        oracle = 0x4CF0507fe3236DedDbE6cD18508f35D9b5e16e7C; // oracle address
        jobId = "948db03c9576480a8fa0545bee5b28ab"; //job id
        fee = 11 * 10 ** 17; // 1.1 LINK
        owner = msg.sender;
    }

咱们从相熟的 ChainlinkClient 导入和继承开始。导入 ChainlinkClient 合约蕴含了构建申请、提交给一个或多个 Chainlink 节点,并接管回复所需的所有性能。只需定义你抉择的 oracle 地址,该节点为其 Twitter Job 提供的作业标准 ID(job spec ID),并定义该节点解决申请所需的费用。此外,咱们还定义了 onlyOwner 修饰符,这样只有创立合约的地址能力通过这个合约发推特。

Tweet 函数

//tweets the supplied string
    function tweet(string memory twt) public onlyOwner{Chainlink.Request memory req = buildChainlinkRequest(jobId, address(this), this.fulfill.selector);
        //req.add("endpoint", "https://api.twitter.com/1.1/statuses/update.json");
        req.add("status", twt);
        req.add("copyPath", "statusCode")
        sendChainlinkRequestTo(oracle, req, fee);
    }
    
    //callback function
    function fulfill(bytes32 _requestId, uint256 _statusCode) public recordChainlinkFulfillment(_requestId) {statusCode = _statusCode;}

构建了合约之后,发推特就非常简单了。tweet 函数接管要推送的字符串,创立申请构造体,并将其提交给定义的 Chainlink 节点。申请构造中须要两个字段:statuscopyPathstatus,即咱们心愿公布的推文,在 Twitter 内部适配器中被定义为一个输出,该节点将运行它来实现这项工作。而 copyPath 则是所有 Chainlink 节点反对的默认适配器的一部分,它通知节点如何解析 JSON 输入。此外,endpoint 能够指定为不同的 Twitter 端点,具备不同的性能,但适配器默即可公布推文状态,因而目前不须要关怀这一参数。

{
  jobRunID: 0,
  data: {result: 1315380402618499000},
  result: 1315380402618499000,
  statusCode: 200
}

下面是内部适配器的 JSON 输入示例,在其 market.link 列表上提供。咱们心愿失去该推文的 statusCode 来确认它是否胜利。statusCode是输入的 JSON 构造中第一层的 key,所以门路只是 statusCode。如果咱们心愿检索 data: {result:},其中 result 是第二层的 key,咱们能够应用点符号将门路指定为 data.result。更多对于 Copy 和其余适配器的信息在 Chainlink 适配器文档页面提供。

构建好蕴含 tweet 和要返回的门路的申请,就能够提交申请,之后就会被节点解决,并在 fulfill() 回调中返回 statusCode。用户合约端只须要构建和提交申请即可,因为大部分沉重的工作都由 Chainlink 节点解决。

Twitter 内部适配器和节点配置

在节点方面,有几件事咱们必须做。

  • 装置并运行 Twitter 内部适配器
  • 在节点和适配器之间建设一个桥接器
  • 创立一个应用桥接器的工作标准(job spec)

正如 Twitter 适配器列表中所概述的那样,在应用 yarn 运行适配器之前,须要四个环境变量来定义 Twitter API 的连贯拜访。

TWITTER_CONSUMER_KEY
TWITTER_CONSUMER_SECRET
TWITTER_ACCESS_TOKEN_KEY
TWITTER_ACCESS_TOKEN_SECRET

git clone https://github.com/tweether-protocol/twitter-cl-ea
cd twitter-cl-ea
yarn
yarn start

默认状况下,适配器监听端口为 8080。请留神,如果你的节点和适配器不是运行在同一个容器中,或者不是本地的,localhost:8080 对它们来说是不一样的。在这种状况下,当你定义连贯节点的桥接器时,你须要依据你的适配器运行的地位,指定你的 docker 容器的 IP(172.x.x.x)或你的主机的本地 IP(192.168.1.x)。也能够将适配器托管在一台独自的机器上,在这种状况下,您能够指定它的公共 IP 或本地 IP,如果它在同一个局域网内。

在您的节点和适配器之间定义一个桥接器非常简单。只需在你的节点界面上填写新建网桥页面,并输出适配器的 URL(适配器 IP:8080),给它起个名字,并指定你想要的最低确认数和费用金额。

当初适配器曾经运行并连贯到您的节点,咱们须要定义一个作业标准(job spec),以便在智能合约申请调用桥接器时应用它。在节点仪表板的 New Job 局部里,咱们定义了一个 JSON 标准,阐明什么会启动一个作业(job),以及这个 job 会执行什么工作(task)。

在这个 Twitter 适配器的状况下,咱们的作业标准(job spec)应该是这样的。

{
 "initiators": [
   {
     "type": "runlog",
     "params": {"address": "YOUR ORACLE CONTRACT ADDRESS HERE"}
   }
 ],
 "tasks": [
   {
     "type": "twitter-cl-ea",
     "confirmations": null,
     "params": {}},
   {
     "type": "copy",
     "confirmations": null,
     "params": {}},
   {
     "type": "ethuint256",
     "confirmations": null,
     "params": {}},
   {
     "type": "ethtx",
     "confirmations": null,
     "params": {}}
 ],
 "startAt": null,
 "endAt": null
}

首先是触发器(initiator)。用来通知节点要监控哪个 oracle 合约,并从哪个 oracle 合约上获取 job。这与后面创立申请智能合约时应用的 oracle 地址雷同。申请被发送到链上的这个 oracle,因为节点正在监控它的作业申请(job requests),所以当申请进来时,它将启动这个 job。更多对于部署这个 oracle 合约的内容,能够在 Fulfilling Chainlink Requests 文档页找到。

接下来是工作(tasks)。当然,咱们这里须要的是 Twitter 工作 – 只需填写 Twitter 适配器的桥接器名称即可。接下来咱们定义了 copy adapter 工作,这样它就会解决申请中的 copyPath,而后用 ethuint256 适配器将输入转换为 unit256,最初用 ethtx 适配器将答案提交回链上。至此,节点设置就实现了。在创立这个 job spec 时,会提供一个 job ID,而申请合约在造成申请时应用的就是这个 job ID。

结束语

心愿这个演练可能帮忙进一步展现 Chainlink 将任何 API 连贯到您的智能合约的后劲,同时也解释了节点经营方解决这些工作所需的一些配置。

如果你是一名开发人员,并心愿将你的智能合约连贯到链外数据和零碎,请拜访开发人员文档并退出 Discord 上的技术探讨。如果你想安顿一个电话,更深刻地探讨集成问题,请在这里分割。

退出移动版