智能合约方法不是web3中的功能

时间:2018-01-31 16:47:21

标签: javascript ethereum solidity web3js

我正在尝试关注web3上较旧的tutorial,但我收到的错误是我认为应该更新Solidity。我有下面的代码如下所示

var express = require("express"),
    Web3 = require("web3"),
    web3;    
if (typeof web3 !== 'undefined') {
  web3 = new Web3(web3.currentProvider);
} else {
  // set the provider you want from Web3.providers
  web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
}

web3.eth.defaultAccount = web3.eth.accounts[0];

//define contract variable using ABI from compiled Remix tab.
var myContract = new web3.eth.Contract([abi_data]);

myContract.options.address = 'contract_address';

myContract.methods.totalSupply(function(err,res){
    if(!err){
        console.log(res);
    } else {
        console.log(err);
    }
})

其中abi_data是我的合同的abi数据,contract_address是我在Roptsen测试网络中的合同的实际地址,其中totalSupply()是我在Ropsten测试网络上的可靠性智能合约中的方法返回合同中引用的令牌的总供应量。使用node app.js对此进行测试以查看此日志是否正确时,将返回此错误...

/home/ubuntu/workspace/node_modules/web3-eth-contract/src/index.js:693
    throw errors.InvalidNumberOfParams(args.length, this.method.inputs.length, this.method.name);
    ^

Error: Invalid number of parameters for "totalSupply". Got 1 expected 0!
    at Object.InvalidNumberOfParams (/home/ubuntu/workspace/node_modules/web3-core-helpers/src/errors.js:32:16)
    at Object._createTxObject (/home/ubuntu/workspace/node_modules/web3-eth-contract/src/index.js:693:22)
    at Object.<anonymous> (/home/ubuntu/workspace/client/app.js:290:25)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
    at Module.runMain (module.js:604:10)
    at run (bootstrap_node.js:389:7)
    at startup (bootstrap_node.js:149:9)

totalSupply在Soldiity中定义如下......

function totalSupply() constant returns (uint256 totalSupply){
    return _totalSupply;
}

使用Adam的修复程序,我仍然会收到以下错误...

Error: Invalid JSON RPC response: ""
at Object.InvalidResponse (/home/ubuntu/workspace/node_modules/web3-core-helpers/src/errors.js:42:16)
at XMLHttpRequest.request.onreadystatechange (/home/ubuntu/workspace/node_modules/web3-providers-http/src/index.js:73:32)
at XMLHttpRequestEventTarget.dispatchEvent (/home/ubuntu/workspace/node_modules/xhr2/lib/xhr2.js:64:18)
at XMLHttpRequest._setReadyState (/home/ubuntu/workspace/node_modules/xhr2/lib/xhr2.js:354:12)
at XMLHttpRequest._onHttpRequestError (/home/ubuntu/workspace/node_modules/xhr2/lib/xhr2.js:544:12)
at ClientRequest.<anonymous> (/home/ubuntu/workspace/node_modules/xhr2/lib/xhr2.js:414:24)
at emitOne (events.js:96:13)
at ClientRequest.emit (events.js:188:7)
at Socket.socketErrorListener (_http_client.js:310:9)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at emitErrorNT (net.js:1277:8)
at _combinedTickCallback (internal/process/next_tick.js:80:11)
at process._tickCallback (internal/process/next_tick.js:104:9)

2 个答案:

答案 0 :(得分:2)

仔细查看调用方法的web3 1.0 documentation(它与0.2x API非常不同)。要调用契约方法,您需要首先使用contractInstance.methods.methodName()创建方法对象,将“methodName”替换为您要调用的合同中的方法。您还需要将contract函数的参数传递给此方法(此处不会传递回调)。使用方法对象,您可以使用call方法(用于constant函数)或send(用于事务)。 totalSupply应该是一个常量函数,所以你的代码应该是:

myContract.methods.totalSupply().call(function(err,res){
    if(!err){
        console.log(res);
    } else {
        console.log(err);
    }
);

或者您可以使用返回的Promise而不是传入回调:

myContract.methods.totalSupply().call().then(function(res){
    console.log(res);
}).catch(function(err) {
    console.log(err);
});

发送事务类似,但使用事件发射器来接收事务哈希,收据等

答案 1 :(得分:0)

实际上有一个简单的解决方法:

我一直在使用express和web3,但web3 1.0.0-beta才是问题所在。您只需要安装稳定版本,例如0.19.0或0.20.0

// test code
let app = XCUIApplication()
let predicate = NSPredicate(format: "label MATCHES 'interesting text'")
let labels = app
    .staticTexts
    .matching(identifier: "myLabel")
    .matching(predicate)
for i in 0..<labels.count {
    labels.element(boundBy: i).tap()
}

然后它会起作用。