了解ERC20的transferFrom及相关功能中潜在的安全风险

问题描述 投票:0回答:1

我的任务是尝试了解 ERC20 TransferFrom 和相关功能中潜在的安全风险,这是我第一次真正研究 Solidity 或智能合约 语境: 2天前,我意识到我的代币在未经我批准的情况下被转移到了一个不良行为者地址,该交易是一个MultiCall交易。在此之前大约 6 小时,我通过 MetaMask 进行了交换代币交换,我现在意识到我可能已经批准向坏人正在使用的合约授予许可,所以反过来我正在尝试逆向工程这一切是如何工作的

合约:0x0000a1F1cE0572381189e51e6e682f41D8Dc0000

交易哈希:0x42433dfecc2c355c8bbb9881a6fdbb91e0fdfa5ee0485fa64920e7010d66848b

我主要关心的是确定合同的这些片段是否允许在未经原始所有者明确批准的情况下转让或铸造代币的可能性。

我对“公共虚拟覆盖”感兴趣。

我走在正确的道路上吗?

 * @dev See {IERC20-transfer}.
 *
 * Requirements:
 *
 * - `recipient` cannot be the zero address.
 * - the caller must have a balance of at least `amount`.
 */
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
    _transfer(_msgSender(), recipient, amount);
    return true;
}

/**
 * @dev See {IERC20-allowance}.
 */
function allowance(address owner, address spender) public view virtual override returns (uint256) {
    return _allowances[owner][spender];
}

/**
 * @dev See {IERC20-approve}.
 *
 * Requirements:
 *
 * - `spender` cannot be the zero address.
 */
function approve(address spender, uint256 amount) public virtual override returns (bool) {
    _approve(_msgSender(), spender, amount);
    return true;
}  
solidity smartcontracts
1个回答
0
投票

我主要关心的是确定合同的这些片段是否允许在未经原始所有者明确批准的情况下转让或铸造代币的可能性。

我对“公共虚拟覆盖”感兴趣。

让我们从

public virtual override
片段开始:

  • public
    是一个 函数可见性 说明符。它可以从合约内部以及合约外部调用此函数。
  • virtual
    modifier 使函数能够被子合约覆盖,并且
    override
    覆盖父定义。但在部署到同一地址之前,继承仅适用于“本地”合约。不同地址上的另一份合约不能覆盖您的合约。
您的问题中链接的交易的

事件日志显示之前已有批准。 ERC20 标准要求所有代币检查是否获得批准,并拒绝任何未经批准的

transferFrom()
。因此,只要代币代码遵循ERC20标准,就不可能使用
transferFrom()
功能进行未经批准的转账。

© www.soinside.com 2019 - 2024. All rights reserved.