写入以太坊wiithout元掩码

时间:2018-10-16 13:56:58

标签: node.js ethereum web3

我试图在不使用元掩码的情况下向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];
} 

}

2 个答案:

答案 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