ERC20 标准中的 approve 和 allowance 方法到底在做什么?

what approve and allowance methods are really doing in ERC20 Standard?

问题是 allowanceapprove 到底在做什么?

_spender 是什么,它在做什么?

有没有人可以给我解释一下?

contract Token {
    uint256 public totalSupply;
    function balanceOf(address _owner) constant returns (uint256 balance);
    function transfer(address _to, uint256 value) returns (bool success);
    function transferFrom(address _from, address _to, uint256 value) returns (bool success);
    function approve(address _spender, uint256 _value) returns (bool success);
    function allowance(address _owner, address _spender) constant returns (uint256 remaining);
    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

what allowance and approve are doing really?

假设我们有用户 A​​ 和用户 BA​​ 有 1000 个代币,想授权 B 花费其中的 100 个。

  • A​​ 会调用 approve(address(B), 100)
  • B会检查有多少令牌A​​通过调用allowance(address(A), address(B))
  • 给了他使用权限
  • B 将通过调用 transferFrom(address(A), address(B), 100)
  • 将这些代币发送到他的帐户
  • Allowance 意味着我们可以批准另一个合约或地址能够转移我们的 ERC20 代币。而这种需求在分布式应用中很常见,比如托管、游戏、拍卖等。因此,我们需要一种方法来批准其他地址使用我们的代币。假设您有 tether 合约,并且您想要 DEX 或任何其他实体从 tether 合约转移代币。因此,您可以跟踪哪个实体可以从映射中的 tether 合约转移多少。

     // my address is allowing your address for this much token
     mapping(address=>mapping(address=>uint)) public allowance;
    
  • 在 ERC20 标准中,我们有一个全局变量“allowed”,其中我们保留从所有者地址到批准的支出者地址再到代币数量的映射。调用 approve() 函数可以为其所需的 _spender 和 _value 添加批准。这里不检查token的数量,在transfer()中检查。

  • 一旦获得批准,批准的消费者可以使用 transferFrom() 转移代币。 _from 是所有者地址,_to 是接收者地址,_value 是需要发送的代币数量。首先,我们检查所有者是否实际拥有所需数量的代币。

假设您想将一些以太币存入 DEFI 平台。与 DEFI 平台交互实际上是与该平台的智能合约进行交互。在您存钱之前,您首先要 approve 交易。你是说这个合约地址可以从我的账户里拿走一些钱。然后调用DEFI智能合约的deposit函数,存入资金。这是转移发生的顺序:

1- 在 Defi 内部,defi 合约有 deposittether

获取代币
function depositTokens(uint _amount) public{
  require(_amount>0,'amount cannot be zero');
  // transfer tether to this contract address for staking
  tether.transferFrom(msg.sender,address(this), _amount);
 // update the state inside Defi, like staked tokens, amount etc
}

2- 在 tether 里面我们有 transferFrom

mapping(address=>mapping(address=>uint)) public allowance;

function transferFrom(address _from, address _to, uint256 _value) public returns (bool success){
        // check the allowance
        require(_value <=allowance[_from][msg.sender]);
        balanceOf[_to]+=_value;
        balanceOf[_from]-=_value;
        allowance[_from][msg.sender]-=_value;
        emit Transfer(_from,_to,_value);
        return true;
    }

第一个要求是检查津贴。 mapping(address=>mapping(address=>uint)) public allowance。所以实际上在调用这个之前,tether 合约必须更新它的 allowance 映射所以这个 transferFrom 会 运行 顺利

3- 更新津贴 approve:

function approve(address _spender, uint _value)public returns (bool success){
        allowance[msg.sender][_spender]=_value;
        // This event must trigger when a successful call is made to the approve function.
        emit Approval(msg.sender,_spender,_value);
        return true;
    }