简单说说:Timelock合约

  • 卡卡
  • 更新于 18小时前
  • 阅读 68

通过Timelock合约可以引入了一种延迟函数执行的机制。如果想让某个函数调用满足一定的时间约束时才执行,可以在Timelock中注册该调用,后面也可以取消注册。

通过Timelock合约可以引入了一种延迟函数执行的机制。如果想让某个函数调用满足一定的时间约束时才执行,可以在Timelock中注册该调用,后面也可以取消注册。

<br>

举个易于理解的例子:

你有个鱼池,你给鱼池设置了个规定:只有放入的鱼长了x斤时,你才能捞出来。那么,你可以往鱼池里面放入小鱼,等到它长了x斤,捞出来吃掉。如果很不幸,鱼养死了,那么捞出丢掉。

这个例子对应到Timelock合约中的操作:

  • 放入鱼 ==> 注册函数调用;
  • 捞出来吃掉 ==> 执行函数调用;
  • 鱼死了丢掉 ==> 取消注册;

<br>

在Compound协议中,Timelock用于DAO治理。当有调整协议设置的提案时,必须通过Timelock进行操作,Timelock会在执行提案时设置一段等待期。这样给了社区充分的反应时间,他们可以取消提案或退出系统……

下面会以Compound协议中的Timelock合约代码进行讲解。

(注:下文中排队一词与注册是描述同一操作)

<br>

先看看变量:

uint public constant GRACE_PERIOD = 14 days;   // 宽限期 (超过这个时间段没执行就会过期)
uint public constant MINIMUM_DELAY = 2 days;   // 最小延迟
uint public constant MAXIMUM_DELAY = 30 days;  // 最大延迟

address public admin;         // 管理员 (要想成为admin,得先成为pendindAdmin)
address public pendingAdmin;  // 待定管理员
 // 当前的延迟,可以设置,但不能超过MINIMUM_DELAY和MAXIMUM_DELAY的约束
uint public delay;           

mapping (bytes32 => bool) public queuedTransactions;  // 映射: 某个交易是否在排队

<br>

3个用于设置全局变量的函数:

image-20241224091016033.png

这三个函数看代码即可知道它们的意图。但是,为什么要msg.sender == address(this)呢?其实,这种对管理员更改的控制与链上治理的概念一致,此类操作被视为交易也需要排队。

<br>

合约中主要的三个函数:对交易进行排队、取消交易排队、执行事务。这三个函数需要由admin来调用

image-20241224093042886.png

在调用时,传入目标地址、值、函数签名、数据和预计执行时间,对这5个数据进行哈希处理,并映射为true,表明该交易在排队。取消排队,则映射为false

<br>

image-20241224093632469.png

用于执行交易,会检查时间是否满足,该交易是否在排队。通过targetvaluesignaturedata参数,可以进行一个函数调用,即target.call的执行。 <br>


区块链\&web3开发技术交流群(纯净版)欢迎加入交流:<https://t.me/+PGwDonY3f2o3NDg1>

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
卡卡
卡卡
智能合约开发&安全,去中心化爱好者