13

问题是什么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);
}
4

2 回答 2

39

什么津贴和批准真的在做什么?

假设我们有用户A和用户BA有 1000 个代币,并希望允许B花费其中的 100 个。

  • A会打电话approve(address(B), 100)
  • B将通过调用来检查A允许他使用多少令牌allowance(address(A), address(B))
  • B将通过调用将这些代币发送到他的帐户transferFrom(address(A), address(B), 100)
于 2018-02-07T13:19:32.933 回答
6
  • Allowance意味着我们可以批准另一个合同或地址,以便能够转移我们的 ERC20 代币。这种要求在分布式应用程序中很常见,例如托管、游戏、拍卖等。因此,我们需要一种方法来批准其他地址来使用我们的代币。假设您有tether合同,并且您想要 DEX 或任何其他实体从tether合同中转移硬币。因此,您可以在映射中跟踪哪个实体可以从 Tether 合约转移多少。

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

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

假设您想将一些以太币存入 DEFI 平台。与 DEFI 平台交互实际上是与该平台的智能合约交互。在你存钱之前,你首先approve进行交易。你说这个合约地址可以从我的账户里拿一些钱。然后你调用depositDEFI 智能合约的函数并存入钱。这是按顺序进行传输的方式:

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;
    }
于 2021-08-17T16:30:41.107 回答