首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BigNumber错误:新的BigNumber()不是一个基数16的数字:

BigNumber错误:新的BigNumber()不是一个基数16的数字:
EN

Ethereum用户
提问于 2019-02-22 11:55:43
回答 1查看 1.5K关注 0票数 0

我对Ethereum和javascript很陌生,所以希望有人能帮我解决这个问题,因为BigNumber上的其他任何一个答案都不能帮助我理解为什么这对我不起作用。我试过用BigNumber.js将数字转换为大数,但它告诉我它不再是数字了?!

CreateNewProject函数运行良好(除了它两次调用元问询之外,这是一个单独的问题(请您也回答这个问题)。目前的主要问题是bigNumber和getProject函数。

我的聪明合同是

代码语言:javascript
复制
struct Project {
    address projectOwner;
    uint projectID;
    string projectName;
    uint goal;
    uint pledged;
    uint totalPledges;
    mapping(uint => Pledge) pledges;
}

struct Pledge {
    address pledge;
    uint pledged;
}


uint projectCounter = 1;
mapping(uint => Project) projectsList;


function CreateProject(string calldata _projectName, uint _goal) external returns (uint projectID){
    projectID = projectCounter;
    projectsList[projectID] = Project(msg.sender, projectID, _projectName, _goal, 0, 0);
    projectCounter++;
}


//This will return the details of a specified project by projectID
function getProject(uint _projectID) public view returns (address projectOwner, string memory projectName, uint goal, uint pledged) {
    require(projectCounter > 0, "No Projects Exist");
    Project memory p = projectsList[_projectID];

    return (p.projectOwner, p.projectName, p.goal, p.pledged);
}

我的web3 js函数可以与以下功能交互:

代码语言:javascript
复制
function CreateNewProject() {

    var projectName = document.getElementById("ProjectName").value;
    var projectGoal = document.getElementById("ProjectGoal").value;
    web3.eth.sendTransaction(
    ProjectContractInstance.CreateProject(projectName, projectGoal, function(error, result) {
        if (!error) {
            console.log(JSON.stringify(result));
            document.getElementById("test1").innerHTML = "Project created!  Your project number is ";
            console.log(JSON.stringify("a" + a));
        } else {
            console.log(error);
            console.log("error happened");
        }
    }));

}

function GetProject() {

    const BigNumber = require('bignumber.js');

    // Set DECIMAL_PLACES for the original BigNumber constructor
    BigNumber.set({ DECIMAL_PLACES: 16 })
    let x = new BigNumber(1);

    var b = ProjectContractInstance.getProject(x ,function(error, result) {
        if(!error) {
            console.log(JSON.stringify(result));
            console.log("no error");
        } else {
            console.log(error);

            console.log("error occurred");
        }
    })
}

我不明白为什么还会这样:

代码语言:javascript
复制
BigNumber Error: new BigNumber() not a base 16 number: 
at T (chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/inpage.js:1:289033)
at chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/inpage.js:1:294599
at new r (chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/inpage.js:1:286552)
at i.formatOutputString [as _outputFormatter] (chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/inpage.js:1:171979)
at chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/inpage.js:1:176324
at i.decode (chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/inpage.js:1:176346)
at chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/inpage.js:1:169300
at Array.map (<anonymous>)
at d.decodeParams (chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/inpage.js:1:169273)
at u.unpackOutput (chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/inpage.js:1:199674)

当我使用以下方法将其更改为基础16时:

代码语言:javascript
复制
var hexString = (11).toString(16);

然后将hexString传递到函数中:

代码语言:javascript
复制
 function getProject() {

    const BigNumber = require('bignumber.js');

    // Set DECIMAL_PLACES for the original BigNumber constructor
    BigNumber.set({ DECIMAL_PLACES: 16 })
    let x = new BigNumber(1);

    var b = ProjectContractInstance.getProject(hexString ,function(error, result) {
        if(!error) {
            console.log(JSON.stringify(result));
            console.log("no error");
        } else {
            console.log(error);

            console.log("error occurred");
        }
    })
}

inpage.js:1 Uncaught BigNumber Error: new BigNumber() not a number: b
at T (chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/inpage.js:1:289033)
at chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/inpage.js:1:294599
at new r (chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/inpage.js:1:286959)
at new r (chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/inpage.js:1:286391)
at h (chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/inpage.js:1:179632)
at Object.toTwosComplement (chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/inpage.js:1:181223)
at i.a [as _inputFormatter] (chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/inpage.js:1:170396)
at i.encode (chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/inpage.js:1:175604)
at chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/inpage.js:1:168053
at Array.map (<anonymous>)

因此,基本上,第一个错误告诉我,我正在传递的数字不是基数16,当我将它更改为基数16时,它告诉我它不再是一个数字!(不,这是现在的巫术要求)!在我失去理智之前,谁能帮我理解这一点?

正如我已经说过的,如果我在浏览器上创建了一个新项目,这是很好的,我可以从Remix运行getProject来显示我通过web3函数创建的项目,但是我不能返回这个项目。救命啊!

EN

回答 1

Ethereum用户

发布于 2019-02-22 14:58:37

我不确定,也不能测试,但如果我是你,我会尝试做一个result.toNumber()

编辑:对于两个Metamask,我建议您在调用契约函数时删除web3.eth.sendTransaction,封装web3的使用。我想说的是,您正在尝试发送一个事务的合同函数调用。打电话给合同函数。

Edit2:您使用回调调用契约函数,因此它是异步的。结果是回调,而不是返回。您可以进入回调地狱,也可以使用异步/等待语法,如: var b=等待ProjectContractInstance.getProject(1);

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

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

复制
相关文章

相似问题

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