通过Timelock合约可以引入了一种延迟函数执行的机制。如果想让某个函数调用满足一定的时间约束时才执行,可以在Timelock中注册该调用,后面也可以取消注册。 <br> 举个易于理解的例子: 你有个鱼池,你给鱼池设置了个规定:**只有放入的鱼长了x斤时,你才能捞出来**。那么,你可以往鱼池里面放入小鱼,等到它长了x斤,捞出来吃掉。如果很不幸,鱼养死了,那么捞出丢掉。 这个例子对应到Timelock合约中的操作: - 放入鱼 ==> 注册函数调用; - 捞出来吃掉 ==> 执行函数调用; - 鱼死了丢掉 ==> 取消注册; <br> 在Compound协议中,Timelock用于DAO治理。当有调整协议设置的提案时,必须通过Timelock进行操作,Timelock会在执行提案时设置一段等待期。这样给了社区充分的反应时间,他们可以取消提案或退出系统…… 下面会以Compound协议中的[Timelock合约代码](https://etherscan.io/address/0x6d903f6003cca6255d85cca4d3b5e5146dc33925#code)进行讲解。 (注:下文中**排队**一词与**注册**是描述同一操作) <br> 先看看变量: ```solidity 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个用于设置全局变量的函数:  这三个函数看代码即可知道它们的意图。但是,为什么要`msg.sender == address(this)`呢?其实,这种对管理员更改的控制与链上治理的概念一致,此类操作被视为交易也需要排队。 <br> 合约中主要的三个函数:对交易进行排队、取消交易排队、执行事务。这三个函数需要由admin来调用  在调用时,传入**目标地址、值、函数签名、数据和预计执行时间**,对这5个数据进行哈希处理,并映射为`true`,表明该交易在排队。取消排队,则映射为`false`。 <br>  用于执行交易,会检查时间是否满足,该交易是否在排队。通过`target`、`value`、`signature`、`data`参数,可以进行一个函数调用,即`target.call`的执行。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up