{"author":{"address":null,"user":"https://learnblockchain.cn/people/13459"},"content":{"body":"通过Timelock合约可以引入了一种延迟函数执行的机制。如果想让某个函数调用满足一定的时间约束时才执行，可以在Timelock中注册该调用，后面也可以取消注册。\r\n\r\n\u003cbr\u003e\r\n\r\n举个易于理解的例子：\r\n\r\n你有个鱼池，你给鱼池设置了个规定：**只有放入的鱼长了x斤时，你才能捞出来**。那么，你可以往鱼池里面放入小鱼，等到它长了x斤，捞出来吃掉。如果很不幸，鱼养死了，那么捞出丢掉。\r\n\r\n这个例子对应到Timelock合约中的操作：\r\n\r\n- 放入鱼 ==\u003e 注册函数调用；\r\n- 捞出来吃掉 ==\u003e 执行函数调用；\r\n- 鱼死了丢掉 ==\u003e 取消注册；\r\n\r\n\u003cbr\u003e\r\n\r\n在Compound协议中，Timelock用于DAO治理。当有调整协议设置的提案时，必须通过Timelock进行操作，Timelock会在执行提案时设置一段等待期。这样给了社区充分的反应时间，他们可以取消提案或退出系统……\r\n\r\n下面会以Compound协议中的[Timelock合约代码](https://etherscan.io/address/0x6d903f6003cca6255d85cca4d3b5e5146dc33925#code)进行讲解。\r\n\r\n(注：下文中**排队**一词与**注册**是描述同一操作)\r\n\r\n\u003cbr\u003e\r\n\r\n先看看变量：\r\n\r\n```solidity\r\nuint public constant GRACE_PERIOD = 14 days;   // 宽限期 （超过这个时间段没执行就会过期）\r\nuint public constant MINIMUM_DELAY = 2 days;   // 最小延迟\r\nuint public constant MAXIMUM_DELAY = 30 days;  // 最大延迟\r\n\r\naddress public admin;         // 管理员 (要想成为admin，得先成为pendindAdmin)\r\naddress public pendingAdmin;  // 待定管理员\r\n // 当前的延迟，可以设置，但不能超过MINIMUM_DELAY和MAXIMUM_DELAY的约束\r\nuint public delay;           \r\n\r\nmapping (bytes32 =\u003e bool) public queuedTransactions;  // 映射: 某个交易是否在排队\r\n```\r\n\r\n\u003cbr\u003e\r\n\r\n\r\n3个用于设置全局变量的函数：\r\n\r\n\r\n![image-20241224091016033.png](https://img.learnblockchain.cn/attachments/2024/12/ZjNPexap676a50a6bf621.png)\r\n\r\n这三个函数看代码即可知道它们的意图。但是，为什么要`msg.sender == address(this)`呢？其实，这种对管理员更改的控制与链上治理的概念一致，此类操作被视为交易也需要排队。\r\n\r\n\u003cbr\u003e\r\n\r\n合约中主要的三个函数：对交易进行排队、取消交易排队、执行事务。这三个函数需要由admin来调用\r\n\r\n\r\n\r\n![image-20241224093042886.png](https://img.learnblockchain.cn/attachments/2024/12/31dGUdzT676a50f440ee0.png)\r\n\r\n在调用时，传入**目标地址、值、函数签名、数据和预计执行时间**，对这5个数据进行哈希处理，并映射为`true`，表明该交易在排队。取消排队，则映射为`false`。\r\n\r\n\u003cbr\u003e\r\n\r\n\r\n![image-20241224093632469.png](https://img.learnblockchain.cn/attachments/2024/12/tjqomU9C676a510ac7b57.png)\r\n\r\n用于执行交易，会检查时间是否满足，该交易是否在排队。通过`target`、`value`、`signature`、`data`参数，可以进行一个函数调用，即`target.call`的执行。\r\n\u003cbr\u003e\r\n\r\n--- \r\n\u003e 区块链\\\u0026web3开发技术交流群（纯净版）欢迎加入交流:\u003chttps://t.me/+PGwDonY3f2o3NDg1\u003e","title":"简单说说：Timelock合约"},"history":null,"timestamp":1735020974,"version":1}