首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ERC20 totalSupply没有返回正确的值

ERC20 totalSupply没有返回正确的值
EN

Ethereum用户
提问于 2018-10-22 18:09:35
回答 3查看 2.5K关注 0票数 1

我正在测试一个基于Openzeppelin-solidity的ERC20合同。但我正在观察一种奇怪的行为,阅读一个全局变量。这是合同:

代码语言:javascript
复制
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,并在松露控制台上运行以下命令:

代码语言:javascript
复制
FunnyToken.deployed().then(inst=> tok=inst);
tok.totalSupply();

返回值是:BigNumber { s: 1, e: 0, c: [ 0 ] }。因此,我得出结论,_totalSupply全局变量没有被正确初始化,因为函数totalSupply的实现方式如下:

代码语言:javascript
复制
function totalSupply() public view returns (uint256) {
    return _totalSupply;
  }

有人能解释一下是怎么回事吗?

EN

回答 3

Ethereum用户

发布于 2018-10-23 20:56:58

问题在于您正在FunnyToken契约中创建一个新的存储变量。基本契约仍将访问旧的存储变量。

一种解决方案是在构造函数中分配值。

代码语言:javascript
复制
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(),但是您将浪费额外的存储空间。

票数 2
EN

Ethereum用户

发布于 2018-10-22 18:23:02

您所需要做的就是将大号转换为实际数字。此外,考虑到有多少人使用开放齐柏林飞艇,这种情况似乎很不寻常。尝试将大号显示为数字。

代码语言:javascript
复制
const number = tok.totalSupply()
number.toNumber()

请参阅如何将BigNumber转换成数字?

票数 1
EN

Ethereum用户

发布于 2019-05-03 04:09:38

您将_totalSupply声明为

代码语言:javascript
复制
uint256 private _totalSupply = 10000 * (10 ** uint256(decimals));

因为它是基本契约中的私有变量,所以您无法从任何派生契约(原因)中调用它。

现在,在Solidity ^0.5.0中跳过同样的内容就更简单了:

代码语言:javascript
复制
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;
    }
}

上面的希望是显而易见的。谢谢

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/61004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档