我正在测试一个基于Openzeppelin-solidity的ERC20合同。但我正在观察一种奇怪的行为,阅读一个全局变量。这是合同:
pragma solidity ^0.4.24;
import "../node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";
contract FunnyToken is ERC20 {
string public constant name = "FunnyToken";
string public constant symbol = "FYT";
uint8 public constant decimals = 18;
uint256 private _totalSupply = 10000 * (10 ** uint256(decimals));
address private owner;
constructor() public {
owner = msg.sender;
}
}然后,我将其truffle migrate到ganache-cli,并在松露控制台上运行以下命令:
FunnyToken.deployed().then(inst=> tok=inst);
tok.totalSupply();返回值是:BigNumber { s: 1, e: 0, c: [ 0 ] }。因此,我得出结论,_totalSupply全局变量没有被正确初始化,因为函数totalSupply的实现方式如下:
function totalSupply() public view returns (uint256) {
return _totalSupply;
}有人能解释一下是怎么回事吗?
发布于 2018-10-23 20:56:58
问题在于您正在FunnyToken契约中创建一个新的存储变量。基本契约仍将访问旧的存储变量。
一种解决方案是在构造函数中分配值。
pragma solidity ^0.4.0;
contract TokenBase {
uint _totalSupply;
function totalSupply() public view returns (uint) {
return _totalSupply;
}
}
contract Token is TokenBase {
// uint _totalSupply = 4321; // <-- this creates a new storage variable
constructor() public {
_totalSupply = 1234; // It is better to initialize the old variable
}
}另一个可能的解决方案是重写契约中的函数totalSupply(),但是您将浪费额外的存储空间。
发布于 2018-10-22 18:23:02
您所需要做的就是将大号转换为实际数字。此外,考虑到有多少人使用开放齐柏林飞艇,这种情况似乎很不寻常。尝试将大号显示为数字。
const number = tok.totalSupply()
number.toNumber()发布于 2019-05-03 04:09:38
您将_totalSupply声明为
uint256 private _totalSupply = 10000 * (10 ** uint256(decimals));因为它是基本契约中的私有变量,所以您无法从任何派生契约(原因)中调用它。
现在,在Solidity ^0.5.0中跳过同样的内容就更简单了:
pragma solidity ^0.5.0;
import 'openzeppelin-solidity/contracts/token/ERC721/ERC721Full.sol';
import 'openzeppelin-solidity/contracts/token/ERC721/ERC721Mintable.sol';
contract FunnyToken is ERC20 {
string public constant name = "FunnyToken";
string public constant symbol = "FYT";
uint8 public constant decimals = 18;
uint256 public _totalSupply = 10000;
address private owner;
constructor() public {
owner = msg.sender;
}
}上面的希望是显而易见的。谢谢
https://ethereum.stackexchange.com/questions/61004
复制相似问题