咸鱼

咸鱼是以盐腌渍后,晒干的鱼

0%

2.2、solidity编写锁仓合约

所谓“锁仓合约”是指,用合约作为第三方托管资金,进行两方交易,并且有时间限制。

举个简单的例子:
一位老板雇佣一位工人工作10天,老板怕工人中途跑路,工人怕老板是奸商发不发工资,那么第三方托管是不错的选择,但是我们可以通过锁仓合约来实现,更加公正。

实现:老板创建一个锁仓合约,把钱转到合约上,10天后工人可以申请释放金额,但是没有到10天(如第9天)工人都无法把钱取出。

这个就是“时间锁”。

OpenZeppelin 项目已经实现了时间锁,我们可以基于它来修改适合我们的需求,来看看源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
pragma solidity ^0.4.24;

import "./SafeERC20.sol";


/**
* @title TokenTimelock
* @dev TokenTimelock is a token holder contract that will allow a
* beneficiary to extract the tokens after a given release time
*/
contract TokenTimelock {
using SafeERC20 for ERC20Basic;

// ERC20 basic token contract being held
ERC20Basic public token;

// beneficiary of tokens after they are released
address public beneficiary;

// timestamp when token release is enabled
uint256 public releaseTime;

// 构造函数,在合约创建时运行
// _token 是指代币的地址,代表代币的种类
// _beneficiary 是收款的账号地址
// _releaseTime 是一个Unix时间戳(秒),表示过了这个时间就可以释放代币
constructor(
ERC20Basic _token,
address _beneficiary,
uint256 _releaseTime
)
public
{
// solium-disable-next-line security/no-block-members
require(_releaseTime > block.timestamp);
token = _token;
beneficiary = _beneficiary;
releaseTime = _releaseTime;
}

/**
* 这个是释放代币的函数,需要人为调用,如果调用成功,代币将转到beneficiary
* @notice Transfers tokens held by timelock to beneficiary.
*/
function release() public {
// solium-disable-next-line security/no-block-members
require(block.timestamp >= releaseTime);

uint256 amount = token.balanceOf(address(this));
require(amount > 0);

token.safeTransfer(beneficiary, amount);
}
}

本文只是讲一个简单的时间锁,另外还有断崖式持续锁仓(OpenZeppelin已实现)等可以自由实现。