NodeJS 写入以太坊而不使用元掩码

iezvtpos  于 2023-03-22  发布在  Node.js
关注(0)|答案(2)|浏览(113)

我试图在不使用 meta掩码的情况下将一些数据写入以太坊Rinkeby测试网络,但在调用该方法时,我得到了下面的错误,但我的参数计数是正确的
未处理承诺拒绝警告:未处理的承诺拒绝(拒绝ID:246):错误:Solidity函数的参数数目无效
节点代码

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 experimental ABIEncoderV2;

contract 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];
    } 
}
t1qtbnec

t1qtbnec1#

你的call合约函数是错误的,你应该在函数名之后传递参数给函数。你这样做的方式是在call()选项的位置传递参数。
await instance.write(<params here>).call();
你可以在docs上阅读更多关于这方面的内容:https://web3js.readthedocs.io/en/1.0/web3-eth-contract.html

lyr7nygr

lyr7nygr2#

这可能与https://github.com/ethereum/web3.js/issues/1043有关
看看那里的讨论。
如果您正在使用松露,请尝试:
伙计们,删除你的构建文件夹,然后运行命令。

npm run truffle migrate --reset --compile-all

我发现在本地运行truffle比全局运行truffle效果更好,因为测试版和不同版本最近更新得很快

truffle migrate --reset --compile-all

如果这没有帮助,请确保您提供了正确的数据类型。可能是您提供的是字符串而不是int。
如果这没有帮助,我将需要更多的信息,你使用的是什么版本的web3,如果你使用的是truffle,哪个版本是它。

相关问题