solidity - 何时(何时不)在 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))
构造函数参数来自哪里。
解决方案
该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
接口的合约,因此您可以执行和调用它的public
和external
函数。
这是您传递的外部合同的地址 - 而不是构造函数参数。
contract ERC20Token {
function mint() public {
}
}
ERC20Token _token = ERC20Token(address(token));
_token.mint();
推荐阅读
- javascript - 如何使用 Node Js 编写和检索临时二进制文件?
- python - pandas DataFrame 列中特定值的连续行的累积计数
- reporting-services - SSRS 服务器的登陆页面或错误 html 页面
- php - 使用 php 从远程服务器在 ejabberd(本地主机上)上注册用户
- sql - 动态排序和按列排序
- math - Mandelbrot Set - 颜色光谱建议?
- nixos - fetchFromGitHub,过滤下来作为 environment.etc."file".source
- c# - MSMQ MessageQueue.BeginReceive(时间跨度,对象)
- mysql - 为什么SQL中的结果总和与原始数据的结果不兼容?
- ios - 在不同的单元格笔尖中显示 2 组 Firebase 数据