首页 > 解决方案 > 何时(何时不)在 Solidity 中使用 new 关键字

问题描述

我有两个像这样的 Solidity 合同(基于教程):

pragma solidity >=0.4.16 <0.9.0;

contract ERC20Token {
    string public name;
    mapping(address => uint) public balances;
    
    function mint() public {
        balances[tx.origin]++;
    }
}

contract MyContract {
    address payable wallet;
    address public token;
    
    constructor(address payable _wallet, address _token)  {
        wallet = _wallet;
        token = _token;
    }
    function buyToken() public payable {
        ERC20Token _token = ERC20Token(address(token));
        _token.mint();
        wallet.transfer(msg.value);
    }
}

我的问题是他们为什么使用ERC20Token _token = ERC20Token(address(token)); 为了访问该类并调用他的 .mint() 函数。

我的基本反射将改为执行以下操作:

ERC20Token _token = new ERC20Token();
_token.mint();

这是因为 ERC20Token 合约没有构造函数,所以我不确定RC20Token(address(token))构造函数参数来自哪里。

标签: solidity

解决方案


new ERC20Token()表达式部署一个新ERC20Token合约并返回其(新部署的)地址。

由于您ERC20Token没有任何构造函数(和构造函数参数),因此您不需要传递任何参数。但如果它确实有构造函数参数,则需要传递它们。例子:

contract ERC20Token {
    constructor (string memory _name, string memory _symbol) {
    }
}
address deployedTo = new ERC20Token("MyToken", "MyT");

ERC20Token _token = ERC20Token(<address>)创建一个帮助对象,允许将其_token视为实现ERC20Token接口的合约,因此您可以执行和调用它的publicexternal函数。

这是您传递的外部合同的地址 - 而不是构造函数参数。

contract ERC20Token {
    function mint() public {
    }
}
ERC20Token _token = ERC20Token(address(token));
_token.mint();

推荐阅读