首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >this.transferFrom和transferFrom有什么区别?

this.transferFrom和transferFrom有什么区别?
EN

Ethereum用户
提问于 2023-04-04 14:39:17
回答 2查看 38关注 0票数 1

如果只调用transferFrom,则会出现不足允许错误。但是,如果使用this.transferFrom关键字调用this,则它将无错误地传输(使用许可方法)。

这有什么区别?

代码语言:javascript
复制
//SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol";

contract MyContract is ERC20, ERC20Permit {
    uint public INITIAL_SUPPLY = 1000000000000000000000000;
    event wPermit(address indexed owner, address indexed spender, uint256 amount);
    constructor() ERC20("YYYYK", "YYYK") ERC20Permit("YYYYK_TEST") {
        _mint(msg.sender, INITIAL_SUPPLY);
    }
     
    function transferWithPermit_success
    (
        uint256 _amount,
        uint256 deadline, 
        uint8 v, 
        bytes32 r, 
        bytes32 s
    ) external {
        require(_amount > 0, "Cannot send 0");
        permit(msg.sender, address(this), _amount, deadline, v, r, s);
        this.transferFrom(msg.sender, address(this), _amount);
    }

    function transferWithPermit_fail
    (
        uint256 _amount,
        uint256 deadline, 
        uint8 v, 
        bytes32 r, 
        bytes32 s
    ) external {
        require(_amount > 0, "Cannot send 0");
        permit(msg.sender, address(this), _amount, deadline, v, r, s);
        transferFrom(msg.sender, address(this), _amount);
    }
}
EN

回答 2

Ethereum用户

发布于 2023-04-04 18:01:04

这有点难以解释,让我试试:当使用此函数时:

代码语言:javascript
复制
permit(msg.sender, address(this), _amount, deadline, v, r, s);

您正在授予对合同地址使用调用方令牌的权限。换句话说,契约实例"this“是获得执行事务权限的实例。

transferFrom()函数的ERC20库如下:

代码语言:javascript
复制
function transferFrom(
address from,
address to,
uint256 amount
) public virtual override returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
return true;
}

如果你观察到这些线条:

代码语言:javascript
复制
address spender = _msgSender();
_spendAllowance(from, spender, amount);

在这里,我们可以看到该函数使用"spender“的权限来执行事务。而花钱的人是"msg.sender“。

因此,如果我们直接调用transferFrom(),函数将在msg.sender中查找权限,在本例中,该权限是函数的调用者。并且这个用户没有许可,因为它被授予了合同,而不是调用者。

另一方面,如果调用this.transferFrom(),则表示调用函数的是"this",即当前契约实例。而且合同也有许可职能的许可。

这就是为什么this.transferFrom()可以工作,但是transferFrom()不能工作。

我希望这是清楚的,如果没有,请不要犹豫,要求澄清。

票数 2
EN

Ethereum用户

发布于 2023-04-04 18:01:40

区别在于当您使用this.transferFrom()时,契约对自身进行“外部”调用,从而将msg.sender修改为自身。当您调用transferfrom()时,原始msg.sender在进行内部调用时被保留下来。

票数 2
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/148502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档