什么批准和津贴方法在ERC20标准中真正做了什么?

sha*_*abi 1 blockchain solidity

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

这是什么_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);
}
Run Code Online (Sandbox Code Playgroud)

Yil*_*maz 10

    \n
  • Allowance意味着我们可以批准另一个合约或地址来转移我们的 ERC20 代币。这种要求在分布式应用程序中很常见,例如托管、游戏、拍卖等。因此,我们需要一种方法来批准其他地址使用我们的代币。假设您有tether合同,并且您想要 DEX(去中心化交易所)或任何其他实体从tether合同中转移代币。因此,您可以跟踪哪个实体可以从映射中的 Tether 合约传输多少资金。

    \n
     // my address is allowing your address for this much token\n mapping(address=>mapping(address=>uint)) public allowance;\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • 在 ERC20 标准中,我们有一个全局变量,allowed在其中保存从“所有者地址”到“批准的支出者\xe2\x80\x99s”地址,然后到代币数量的映射。调用approve()函数可以将批准添加到其所需的_spender_value。这里不检查token数量,会在transfer()中检查。

    \n
  • \n
  • 一旦获得批准,“批准的支出者”就可以用来transferFrom()转移代币。_from是所有者地址,_to是接收者\xe2\x80\x99s地址,_value是需要发送的令牌数量。首先,我们检查所有者是否确实拥有所需数量的代币。

    \n
  • \n
\n

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

\n

1- 在 Defi 内部,Defi 合约必须deposit从中获取代币tether

\n
function depositTokens(uint _amount) public{\n  require(_amount>0,'amount cannot be zero');\n  // transfer tether to this contract address for staking\n  tether.transferFrom(msg.sender,address(this), _amount);\n // update the state inside Defi, like staked tokens, amount etc\n}\n
Run Code Online (Sandbox Code Playgroud)\n

2-里面tethertransferFrom

\n
mapping(address=>mapping(address=>uint)) public allowance;\n\nfunction transferFrom(address _from, address _to, uint256 _value) public returns (bool success){\n        // check the allowance\n        require(_value <=allowance[_from][msg.sender]);\n        balanceOf[_to]+=_value;\n        balanceOf[_from]-=_value;\n        allowance[_from][msg.sender]-=_value;\n        emit Transfer(_from,_to,_value);\n        return true;\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

3- 更新津贴approve

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


Rom*_*lov 9

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

让我们假设用户有一个和用户.A有1000个令牌,并且想要允许B花费100 个令牌.

  • A会打电话approve(address(B), 100)
  • B将检查A通过呼叫允许使用多少令牌allowance(address(A), address(B))
  • B将通过电话将这些代币发送到他的帐户transferFrom(address(A), address(B), 100)

  • 在transferFrom中,B可以将这笔钱发送给像C这样的其他人吗? (3认同)