如何在 web3.js 中将 uint32[]、uint8[] 参数传递给智能合约

Posted

技术标签:

【中文标题】如何在 web3.js 中将 uint32[]、uint8[] 参数传递给智能合约【英文标题】:how to pass uint32[], uint8[] parameter to smart contract in web3.js 【发布时间】:2021-09-16 18:15:07 【问题描述】:

我正在做估算气体。这是我的代码。

var sdate = new Date('2021-07-01 00:00:00');
var edate = new Date('2021-07-31 00:00:00');
var arrDate = [];
arrDate.push(sdate/1000);
arrDate.push(edate/1000);
var arrCategory = [1,12,14];


var param1 = web3.eth.abi.encodeParameter('uint32[]',arrDate);
var param2 = web3.eth.abi.encodeParameter('uint8[]',arrCategory);


let Contract = new web3.eth.Contract(myPack.abi, myPack.ca);
Contract.methods.createTicket(param1, param2).estimateGas(from: accounts[0])
.then(console.log);

我遇到了错误

Uncaught TypeError: t.map is not a function
at h.formatParam (index.js:218)
at index.js:100
at Array.map ()
at h.encodeParameters (index.js:94)
at index.js:439
at Array.map ()
at Object.d._encodeMethodABI (index.js:438)
at Object.d._processExecuteArguments (index.js:701)
at Object.d._executeMethod (index.js:720)
at estimateGas (issuecfm:257)

我在 encodeParameter 之前尝试了一些东西

大数

var BN =  web3.utils.BN;
arrDate = arrDate.map(item => return new BN(item));
arrCategory = arrCategory.map(item => return new BN(item));

和字符串

arrDate = arrDate.map(item => return item.toString());
arrCategory = arrCategory.map(item => return item.toString());

经过大量搜索,我尽我所能。但我仍然得到同样的错误。如果您能教我如何修改我的代码,我将不胜感激。

【问题讨论】:

【参考方案1】:

使用 web3 合约辅助函数,您需要传递“原始”JS 参数,而不是 ABI 编码的数据。

let contract = new web3.eth.Contract(myPack.abi, myPack.ca);

// mind the `arrDate` and `arrCategory` instead of `param1` and `param2`
contract.methods.createTicket(arrDate, arrCategory)
    .estimateGas(from: accounts[0])
    .then(console.log);

【讨论】:

这是一个非常简单的解决方案。我是初学者,不知道。感谢您的聪明回答。

以上是关于如何在 web3.js 中将 uint32[]、uint8[] 参数传递给智能合约的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ARM NEON 中将 uint8x8_t 加载到 float32x4 中?

uint32_t 和 u_int32_t 的区别

web3.js链接以太坊并查询钱包u余额

C语言之如何输出uint32

以太坊Dapp开发通过web3.js调用智能合约

如何在 Swift 3 中将 [UInt8] 数组复制到 C 指针?