这篇文章将会介绍智能合约中的时间锁是什么,并且讲解如何开发它。你将会开发一个智能合约,这个合约可以将 ERC-20 通证的铸造请求按时间排列。
这个教程将会使用到:
- Foundry
- Solidity
- Ethereum
教程的代码可以在这个 GitHub Repo 中找到。
什么是智能合约的时间锁
本质上,时间锁是用来将智能合约中的某个函数限制在一段时间内的代码。“if”语句就可以实现最简单的时间锁:
if (block.timestamp < _timelockTime) {
revert ErrorNotReady(block.timestamp, _timelockTime);
}
时间锁的应用场景
智能合约中的时间锁有很多潜在的应用场景,它们通常会被用在通证首次公开发行中,用于实现通证销售的一些功能。时间锁也可以被用来按照时间表授权投资资金使用,即用户只有在一段时间以后才可以取出资金。
另一个可能的场景就是通过智能合约去实现遗嘱。使用 Chainlink Keepers,你可以周期性的检查遗嘱的主人是否还在,一旦死亡证明被发布,这个遗嘱的智能合约就会解锁。
以上只是很少的一些应用案例,智能合约时间锁有很多种场景去使用。在这个案例中,我们会聚焦于一个 ERC-20 合约,用时间锁实现一个队列来铸造它。
怎样创建一个智能合约时间锁
在这个教程中,我们会使用 Foundry 来开发和测试 Solidity 合约。关于 Foundry 这个框架,你可以它的 GitHub 中找到更多的信息。
初始化项目
你可以使用 forge init
初始化项目。项目初始化完成后,forge test
命令会进行一次检查确保项目初始化的过程没有问题。
❯ forge init timelocked-contract
Initializing /Users/rg/Development/timelocked-contract...
Installing ds-test in "/Users/rg/Development/timelocked-contract/lib/ds-test", (url: https://github.com/dapphub/ds-test, tag: None)
Installed ds-test
Initialized forge project.
❯ cd timelocked-contract
❯ forge test
[⠒] Compiling...
[⠰] Compiling 3 files with 0.8.10
[⠔] Solc finished in 143.06ms
Compiler run successful
Running 1 test for src/test/Contract.t.sol:ContractTest
[PASS] testExample() (gas: 190)
Test result: ok. 1 passed; 0 failed; finished in 469.71µs
创建测试
你需要创建一些测试来确保智能合约可以实现时间锁的所有的要求。需要测试的主要功能就是下面这些:
- 让通证的铸造操作加入队列
- 一旦时间到来就进行铸造
- 取消早在队列中的铸造操作
除了这些功能以外,你还需要保证智能合约没有重复入列或入列之前铸造这些错误操作。
当项目被初始化以后,你需要去运行这些测试,因为你需要这些测试用例来保证你的项目的实际执行与设想的没有偏差。这些测试存储在 src/test/Contract.t.sol
中。在 Foundry 中,会使用测试的名字来表示这些测试应该是成功还是失败。比如说 testThisShouldWork
表示应该通过,而 testFailShouldNotWork
表示只有这个测试被 revert 的时候才会通过。
还有一些其他的使用惯例。时间锁会基于一个队列,这个队列会使用 _toAddress
, _