0%

solidity | ERC20 中的 transfer 和 transferFrom 区别

这是困扰我很久的问题,这里做一个解答。

代码如下

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
contract ERC20 is IERC20{

mapping(address => uint256) public override balanceOf;

mapping(address => mapping(address => uint256)) public override allowance;

uint256 public override totalSupply; // 代币总供给

string public name; // 名称
string public symbol; // 代号

uint8 public decimals = 18; // 小数位数

constructor(string memory name_, string memory symbol_){
name = name_;
symbol = symbol_;
}

function transfer(address to, uint amount) external override returns (bool) {
balanceOf[msg.sender] -= amount;
balanceOf[to] += amount;
emit Transfer(msg.sender, to, amount);
return true;
}

function approve(address spender, uint amount) external override returns (bool) {
allowance[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}

function transferFrom(
address sender,
address recipient,
uint amount
) external override returns (bool) {
allowance[sender][msg.sender] -= amount;
balanceOf[sender] -= amount;
balanceOf[recipient] += amount;
emit Transfer(sender, recipient, amount);
return true;
}

}

只看代码的话,感觉 transfertransferFrom 没有一点区别。

上面的代码只是一个简单的说明,不能用于生产环境。

其实是这样的,transfer 是自己调用,transferFrom 是别人调用。

  • A账号有10000token代币,B账号没有token代币,C账号也没有token代币!
  • A账号 委托 B账号 转给C账号 100token代币 怎么来实现呢?
  • A账号 和 B账号建立一种委托关联,登录A账户执行approve(b,100)方法结果为:结果:allowance[A][B] = 100token
  • 在执行登录B账户执行transferFrom(A,C,100),这里的B就是委托账号发送者,gasB扣,必须确保token数量小于allowance[A][B]
  • 其实就是A转入C,但是要经过B的账号来发送交易!
请我喝杯咖啡吧~