何时(何时不)在 Solidity 中使用 new 关键字

When (and when not) to use the new keyword in Solidity

我有两个像这样的 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)); 来访问 class 并调用 .mint() 函数.

我的基本反应是改为执行以下操作:

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

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

new ERC20Token() 表达式部署了一个新的 ERC20Token 合约和 returns 它的(新部署的)地址。

因为你的 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();