售前客服二维码
文章均源于网络收集编辑侵删
提示:仅接受技术开发咨询!
Ethereum中的很多智能契约需要通过一个外部定时器触发才能在链上执行,所以dApp在链上发起投票时会遇到问题,因为投票通常是有时间窗的。由于Solidity中没有计时器,智能契约的投票机制需要访问外部工具来启动或关闭投票窗口。事实上,在传统系统中,定时功能并不难实现。系统可以设置NTP时间与操作系统时间同步,或者使用物理时钟或定时器计时,甚至使用睡眠表达式将代码暂停一段时间。实度智能契约中的事件由离线交易触发,这意味着区块链如以太网需要访问离线闹钟触发事件或调用函数。好消息是,开发人员可以使用Chaink节点作为闹钟来可靠地触发智能合同执行。
这篇文章将教你如何在dApp中轻松控制投票时间。现在,随着越来越多的dApp走DAO路线,把更多的权力交给用户,这种投票机制变得越来越重要。具体步骤如下:
将链接功能包导入智能合同并继承它
格式化并提交链链接睡眠(“直到”)请求
将合同所有人设置为唯一有权发起投票的人
用简单的KYC确认每个地址只投票一次。
使用Getters功能查看投票状态
这个例子中使用的代码可以在GitHub中查看,也可以查看Remix,方便部署。
当然,这只是一个基本的例子。您可以使用链接“直到”来请求随时触发任何事件。这个例子只是一个初始框架,你可以在这个框架上开发其他需要时间控制的智能合同。
合同定义和构造函数:
import ' github.com/smart contract kit/chainlink/EVM-contracts/src/v 0.6/chainlink client . sol ';
合同链接时间注释是链接客户端
{
uint私有oraclePayment
私有oracle地址;
字节32私有作业标识;
uint私有yesCount
uint私有noCount
bool private votingLive
映射(address=bool)公共投票人;
//只有合同所有人才能开始投票
应付业主地址;
仅修饰符所有者{
require(msg . sender==owner);
_;
{}
constructor() public {
setpublicchanlinktoken();
owner=msg.sender
oraclePayment=0.1 * 10 * * 18//0.1链接
//Kovan报警神谕
Oracle=0x2f 90 a6 d 021 db 21e 1b 2a 077 C5 a 37 B3 c7e 75d 15 b 7e;
jobId=' a7ab 70d 561d 34 EB 49 e 9 b 1612 FD 2e 044 b ';
//初始化投票
yes count=0;
no count=0;
votingLive=false
{}
导入链接客户端,并使用关键字“是”来继承,然后您可以轻松地从链接节点请求数据。然后,我们需要定义几个全局变量,包括定时器预测器的地址,可以在链接页面上查看。
此外,我们需要一个作业规范标识和一些变量来跟踪投票,并将投票者地址映射为布尔值,以确认地址是否已经投票。最后,我们需要定义一个修饰符,规定只有合同拥有者才有权发送消息调用函数。然后在构造函数中初始化合同所有者地址和其他变量。注意:映射不需要初始化,布尔类型的默认值为false。
向链接发送开始投票的请求:
函数start投票(uint voteMinutes)public only owner {
链环。request memory req=buildChainlinkRequest(JobID,address(this),this . fulfill . selector);
req.addUint('直到',现在voteMinutes * 1分钟);
//启动投票窗口,然后提交$voteMinutes睡眠请求
votingLive=true
发送链接请求至(甲骨文、请求、甲骨文支付);
{}
//开始投票请求的回调
函数实现(字节32 _requestId)公共记录链链接实现(_requestId) {
//$voteMinutes分钟已过,停止投票
votingLive=false
{}
我们合同的第一个功能,开始投票,需要向链接发送请求。在这里,我们使用onlyOwner修饰符来确保只有合同所有者有投票权。
我们在文章《怎样将智能合约和API连接在一起》中提到,链接客户端契约导出了链接的数据结构。请求,可根据具体要求更改为不同格式。在示例中,我们在数据结构中添加了“直到”而不是“获取”请求。构造函数中定义的chaink节点的地址可以标识这个直到字符串,节点收到请求后会在指定时间内挂起任务管道(注意:指定时间指的是“voteMinutes”)。
在提交请求之前,我们需要将votingLive设置为true,即投票成功启动,投票功能将检查变量状态以允许或拒绝投票。然后我们可以提交请求,链链接节点将暂停任务管道。通过这种方式,我们可以在由直到请求结束所设置的时间之后调用Fulfillcallback函数。当完成函数被调用时,设置的投票时间已经结束,所以你可以将votingLive设置回false并关闭投票。综上所述,我们应该先创建一个“直到”的请求,其中包含指定的时间,并发送给某个节点,然后在节点在指定的时间内暂停后,调用fulfill函数。链环计时器/闹钟就这么简单!使用简单的votingLive布尔逻辑,我们可以在向chaink闹钟提交请求之前开始投票,并在暂停一段时间后调用回调函数时关闭投票。在这个例子中,我们只使用一个布尔标识符,但是您可以基于它开发其他延迟函数。
投票并检查投票状态:
//如果投票是实时的,则递增适当的投票计数器
功能投票(bool voteCast)公共{
require(!投票人[msg.sender],‘已经投票了!’);
//如果投票是实时的,而地址还没有投票,请点票
if(VOTEcast){ YesCount;{}
if(!voteCast){ no count;{}
//地址已投票,标记为已投票
选民[msg . sender]=true;
{}
//输出当前投票计数
函数getVotes()公共视图返回(uint yesVotes,uint noVotes) {
返回(是计数,否计数);
{}
//让用户知道他们的投票是否被计算在内
函数haveYouVoted()公共视图返回(bool) {
返回投票人[msg . sender];
{}
这里需要用能真正实现投票的逻辑。投票功能接受真/假参数,以检查用户是否已经投票。如果验证通过,则计算投票,并且对应于其映射中的地址的值被更新为真,指示他们已经投票。我们使用require表达式而不是if表达式来验证地址。这样,已经投票的交易将被拒绝。最后,因为Ethereum事务不会返回结果,所以我们添加了一些简单的视图函数来检查当前的投票数,并确认投票是否被计数。希望本文能让大家了解chaink在主网上的一个实用功能,为你的智能合同实现更大的价值。想了解Chainlink的其他功能,请关注Chainlink发布的可验证随机数生成工具Chainlink VRF,访问Chainlink定价机制开发dApp进行流动性挖掘,或者了解Chainlink预测器的最新研究成果。
文章均源于网络收集编辑侵删
提示:仅接受技术开发咨询!