为何ethers.js调用合约函数返回值为数组而非单个值?
问题原因分析
当你通过myContract.functions.MAX_COUNT()调用合约函数时,ethers.js(主流以太坊开发库)的函数调用接口无论合约函数返回几个值,都会把结果包装成数组返回。
你的Solidity合约里,MAX_COUNT是public constant,Solidity会自动为它生成一个同名的getter函数,这个函数的返回值是单个uint256类型。但在functions调用方式下,哪怕只有一个返回值,也会被放在数组里,所以你拿到的是[BigNumber { value: "64" }]而不是单个BigNumber对象。
修复方案
有两种常见的解决方式:
- 直接访问合约的属性(而非通过
functions方法):
it('should access MAX_COUNT', async () => { const maxCount = await myContract.MAX_COUNT(); // 直接访问属性,返回单个BigNumber expect(maxCount.toNumber()).to.equal(64); });
- 从返回数组中取出第一个元素:
it('should access MAX_COUNT', async () => { const maxCount = await myContract.functions.MAX_COUNT(); expect(maxCount[0].toNumber()).to.equal(64); });
另外要注意,Solidity的数值在ethers.js里会被转为BigNumber类型,不能直接和普通数字用equal比较,要么用toNumber()转成数字,要么用BigNumber的比较逻辑:
expect(maxCount[0]).to.equal(BigNumber.from(64));
内容的提问来源于stack exchange,提问作者bguiz
相关产品推荐
相关产品推荐

