我对Ethereum和javascript很陌生,所以希望有人能帮我解决这个问题,因为BigNumber上的其他任何一个答案都不能帮助我理解为什么这对我不起作用。我试过用BigNumber.js将数字转换为大数,但它告诉我它不再是数字了?!
CreateNewProject函数运行良好(除了它两次调用元问询之外,这是一个单独的问题(请您也回答这个问题)。目前的主要问题是bigNumber和getProject函数。
我的聪明合同是
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函数可以与以下功能交互:
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");
}
})
}我不明白为什么还会这样:
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时:
var hexString = (11).toString(16);然后将hexString传递到函数中:
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函数创建的项目,但是我不能返回这个项目。救命啊!
发布于 2019-02-22 14:58:37
我不确定,也不能测试,但如果我是你,我会尝试做一个result.toNumber()
编辑:对于两个Metamask,我建议您在调用契约函数时删除web3.eth.sendTransaction,封装web3的使用。我想说的是,您正在尝试发送一个事务的合同函数调用。打电话给合同函数。
Edit2:您使用回调调用契约函数,因此它是异步的。结果是回调,而不是返回。您可以进入回调地狱,也可以使用异步/等待语法,如: var b=等待ProjectContractInstance.getProject(1);
https://ethereum.stackexchange.com/questions/67474
复制相似问题