像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节点。申请构造中须要两个字段:status
和 copyPath
。status
,即咱们心愿公布的推文,在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上的技术探讨。如果你想安顿一个电话,更深刻地探讨集成问题,请在这里分割。
发表回复