solidity 이 더 리 움 의 ERC 20 의 approve 와 transfer From 의 진정한 의 미 는 무엇 입 니까?

위탁 거래 는 블록 체인 에서 사용 하 는 것 이 적 고 생활 속 에서 많이 사용 되 지만 ERC 20 이 실현 되면 이해 하기 어 려 울 것 같 습 니 다!위탁 거래 가 어떤 원리 인지 깊이 분석 해 보 자!
    위탁 이체 원리 분석:
    가설: 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);
    }
}

좋은 웹페이지 즐겨찾기