我试图在不使用元掩码的情况下向Ethereum Rinkeby测试网络写入一些数据,但是在调用该方法时却出现以下错误 ,但是我的论点数是正确的
UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 246): Error: Invalid number of arguments to Solidity function
节点代码
var Web3 = require('web3')
var contract = require("truffle-contract")
var quickBooks = require('../build/contracts/quickBooks.json')
Web3.providers.HttpProvider.prototype.sendAsync = Web3.providers.HttpProvider.prototype.send;
var provider = new Web3.providers.HttpProvider("https://rinkeby.infura.io/v3/KEY")
var quickBooksContract = contract(quickBooks);
quickBooksContract.setProvider(provider);
var writeToEthereum = async function(_json){
//console.log(_json)
var instance = await quickBooksContract.at('ADDRESS')
var result = await instance.write.call(_json,_json.txhash,_json.createdt,"1",_json.write_set[0].set,{
from : "ADDRESS"
})
console.log(result);
}
固体
pragma实验性ABIEncoderV2;
签订quickBooks {
struct Tx{
string txId;
string timeStamp;
string blockHash;
string payLoad;
string json;
}
mapping(string => Tx) private data;
function write(string _json,string _txId,string _timeStamp,string _blockHash,string _payLoad) public returns(bool success){
data[_txId] = Tx(_txId,_timeStamp,_blockHash,_payLoad,_json);
return true;
}
function read(string _txId)public returns(Tx){
return data[_txId];
}
}
答案 0 :(得分:0)
这可能与https://github.com/ethereum/web3.js/issues/1043
有关查看那里的讨论。
如果您正在使用松露,请尝试:
请,删除您的构建文件夹,然后运行命令。
npm run truffle migrate --reset --compile-all
我发现在本地运行松露到文件夹时效果最好 比全球范围要大,因为测试版和不同版本的更新 最近很快。如果您更喜欢全局方法,请尝试
truffle migrate --reset --compile-all
如果这样做没有帮助,请确保提供正确的数据类型。可能是您提供的是字符串而不是int。
如果这也无济于事,我将需要更多有关您使用的Web3版本以及是否使用松露以及版本的信息。
如果您想了解有关Solidity和智能合约创建的更多信息,请查看我专门为此做的课程-Solidity Smart Contracts: Build Dapps In Ethereum Blockchain
以下是折扣券: QAUS8657
答案 1 :(得分:0)
您的call
合同功能不正确,您应该在函数名称之后将参数传递给该函数。您这样做的方式是将参数传递到call()
选项的位置。
await instance.write(<params here>).call();
您可以在文档上详细了解此内容:https://web3js.readthedocs.io/en/1.0/web3-eth-contract.html