繁体   English   中英

Solidity 0.5.1,创建合约object时,为什么我们必须将令牌传递给该合约的构造函数,即使没有构造函数

[英]Solidity 0.5.1, when creating a contract object, why do we have to pass the token to that contract's constructor even if there is no constructor

这是代码:

pragma solidity 0.5.1;

contract ERC20Token{

string public name;
mapping(address => uint256) public balances;

function mint() public{
    balances[tx.origin] += 1;
    }
}


contract MyContract {

address payable wallet;
address public token;

constructor(address payable _wallet, address _token) public {
    wallet = _wallet;
    token = _token;
}

function() external payable {
buyToken();
}

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

过程:

首先,我们首先通过部署 ERC20Token 合约来获取 ERC20Token 合约地址。

其次,MyContract 构造函数将(钱包地址和ERC20Token 合约地址)作为两个参数。

然后,我们从这一行创建一个 ERC20Token 合约 object

ERC20Token _token = ERC20Token(address(token));

我对这条线的工作方式感到困惑。 即使是 ERC20Token 合约也不包含任何构造函数,上面的代码将令牌作为参数传递给 ERC20Token 构造函数。

如果我从上面的代码中删除令牌参数:

ERC20Token _token = ERC20Token();

我会收到一个名为

明确类型转换所需的一个参数

任何人都可以向我解释为什么这种情况会发生吗?

如果没有new关键字,您将指向一个已部署的ERC20Token合约实例,并在参数中传递其地址。 由于合约已经部署并且构造函数已经执行,因此您无需传递其构造函数参数。

// address of existing instance
ERC20Token _token = ERC20Token(address(token));

使用new关键字,您将部署ERC20Token的新实例,指定其构造函数参数。 然后通过将变量类型转换为address类型来获得其地址。

// creating new instance
// passing constructor params (in your case empty)
ERC20Token _token = new ERC20Token();

// address of the newly deployed contract
address tokenAddress = address(_token);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM