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
Allowance意味着我们可以批准另一个合约或地址来转移我们的 ERC20 代币。这种要求在分布式应用程序中很常见,例如托管、游戏、拍卖等。因此,我们需要一种方法来批准其他地址使用我们的代币。假设您有tether合同,并且您想要 DEX(去中心化交易所)或任何其他实体从tether合同中转移代币。因此,您可以跟踪哪个实体可以从映射中的 Tether 合约传输多少资金。
// my address is allowing your address for this much token\n mapping(address=>mapping(address=>uint)) public allowance;\nRun Code Online (Sandbox Code Playgroud)\n在 ERC20 标准中,我们有一个全局变量,allowed在其中保存从“所有者地址”到“批准的支出者\xe2\x80\x99s”地址,然后到代币数量的映射。调用approve()函数可以将批准添加到其所需的_spender和_value。这里不检查token数量,会在transfer()中检查。
一旦获得批准,“批准的支出者”就可以用来transferFrom()转移代币。_from是所有者地址,_to是接收者\xe2\x80\x99s地址,_value是需要发送的令牌数量。首先,我们检查所有者是否确实拥有所需数量的代币。
假设您想将一些以太币存入 DEFI 平台。与DEFI平台交互实际上是与该平台的智能合约交互。在存钱之前,您首先要approve进行交易。你是说这个合约地址可以从我的账户里拿走一些钱。然后调用depositDEFI智能合约的函数并存入资金。传输按以下顺序发生:
1- 在 Defi 内部,Defi 合约必须deposit从中获取代币tether
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}\nRun Code Online (Sandbox Code Playgroud)\n2-里面tether有transferFrom
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 }\nRun Code Online (Sandbox Code Playgroud)\n第一个要求是检查津贴。mapping(address=>mapping(address=>uint)) public allowance。所以实际上在调用这个之前,tether合约必须更新它的allowance映射,这样transferFrom才能顺利运行
3- 更新津贴approve:
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 }\nRun Code Online (Sandbox Code Playgroud)\n
什么津贴和批准真的在做什么?
让我们假设用户有一个和用户乙.A有1000个令牌,并且想要允许B花费100 个令牌.
approve(address(B), 100)allowance(address(A), address(B))transferFrom(address(A), address(B), 100)| 归档时间: |
|
| 查看次数: |
528 次 |
| 最近记录: |