委托交易在区块链中用的可能很少,在生活中很多,但是ERC20实现起来似乎感觉很难理解!这里深度剖析一下委托交易是怎么个原理!
委托转账原理分析:
假设:A账号有10000个token代币,B账号没有token代币,C账号也没有token代币!
那么:A账号 委托 B账号 转给C账号 100个token代币 怎么来实现呢?
首先:A账号 和 B账号建立一种委托关联,登录A账户执行approve(b,100)方法结果为:结果:_allowed[A][B] = 100token
然后:在执行登录B账户执行transferFrom(A,C,100),这里的B就是委托账号发送者,gas从B扣,必须确保token数量小于 _allowed[A][B]
总结:其实就是A转入C,但是要经过B的账号来发送交易!
委托转账原理分析:
假设:A账号有10000个token代币,B账号没有token代币,C账号也没有token代币!
那么:A账号 委托 B账号 转给C账号 100个token代币 怎么来实现呢?
首先:A账号 和 B账号建立一种委托关联,登录A账户执行approve(b,100)方法结果为:结果:_allowed[A][B] = 100token
然后:在执行登录B账户执行transferFrom(A,C,100),这里的B就是委托账号发送者,gas从B扣,必须确保token数量小于_allowed[A][B]
总结:其实就是A转入C,但是要经过B的账号来发送交易!
contract ERC20 {
using SafeMath for uint256;
mapping (address => uint256) internal _balances;
mapping (address => mapping (address => uint256)) internal _allowed;
// 执行这个方法之前必须先执行approve建立委托关联数据加入_allowed中
function transferFrom(address from, address to, uint256 value) public returns (bool) {
// 这里是自己添加的,方便调试和优化代码
uint allower_value = _allowed[from][msg.sender];
require(allower_value >= value,"实际转账数量超过了委托数量");
// 这里是ERC20自己实现的!
_transfer(from, to, value);
_approve(from, msg.sender, _allowed[from][msg.sender].sub(value));
return true;
}
// 建立一种委托关联(这个方法也就是在maping对象_allowed中)
// 添加【需要发送token的人】和委托者【实际转账的人】之间的关系(后续的委托操作会查询这个maping中的数据记录)
function approve(address spender, uint256 value) public returns (bool) {
_approve(msg.sender, spender, value);
return true;
}
// 委托关联执行的逻辑!
function _approve(address owner, address spender, uint256 value) internal {
require(spender != address(0));
require(owner != address(0));
_allowed[owner][spender] = value;
emit Approval(owner, spender, value);
}
// 转账交易执行的逻辑!
function _transfer(address from, address to, uint256 value) internal {
require(to != address(0));
_balances[from] = _balances[from].sub(value);
_balances[to] = _balances[to].add(value);
emit Transfer(from, to, value);
}
}