solidity以太坊之ERC20中的approve和transferFrom真正的含义是什么(委托转账)

委托交易在区块链中用的可能很少,在生活中很多,但是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);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43343144/article/details/89017364