何时(何时不)在 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
接口的合约,因此您可以执行并调用其 public
和external
个函数。
这是您传递的外部合同的地址 - 而不是构造函数参数。
contract ERC20Token {
function mint() public {
}
}
ERC20Token _token = ERC20Token(address(token));
_token.mint();
我有两个像这样的 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
接口的合约,因此您可以执行并调用其 public
和external
个函数。
这是您传递的外部合同的地址 - 而不是构造函数参数。
contract ERC20Token {
function mint() public {
}
}
ERC20Token _token = ERC20Token(address(token));
_token.mint();