5月29日 22:35

Solidity 中如何处理时间锁(Timelock)机制?

时间锁就是给合约操作加一个延迟:提案创建后必须等待指定时间(如 48 小时)才能执行,期间可以取消。核心实现:mapping(bytes32 => uint256) public queuedTimestampqueue() 记录时间戳,execute() 检查 block.timestamp >= queuedTimestamp[id] + delay。OpenZeppelin 的 TimelockController 是生产级实现,支持多角色( proposer / executor / admin)和最小延迟保障。

追问

Timelock 和 multisig 哪个更安全?

不互斥,通常组合使用。Multisig 防止单点私钥风险,Timelock 防止即时作恶——即使 multisig 签了名,社区也有时间审查和反应。Uniswap、Compound 的治理都是 multisig + timelock 双层。

如何防止 Timelock 被绕过?

关键:delayminDelay 只能通过 Timelock 自身的提案修改(self-governance),不能有外部 admin 直接改延迟。OpenZeppelin 的 TimelockController 默认就是这样——admin 角色也必须走提案流程。

什么操作必须加时间锁?

代币增发(mint)、升级代理合约(upgrade)、修改费率、提取资金——凡是影响用户资产的操作都该加。只读操作和紧急暂停(pause)通常不加,因为暂停是保护性操作。

Timelock 的 gas 消耗如何?

queueexecute 各约 5-8 万 gas,主要是 SSTORE 和权限检查。批量操作(batch / scheduleBatch)可以省一些,因为共享一次权限检查。

如何实现可取消的时间锁?

cancel(bytes32 id) 函数,只有 proposer 角色可以调用,删除 queuedTimestamp[id]。执行时如果找不到时间戳就 revert。争议操作被社区反对时,proposer 可以主动取消,避免硬分叉。

标签:Solidity