web3 接口上的 eth.call 为返回 bytes32/strings 数组的合约函数返回 null 值

Posted

技术标签:

【中文标题】web3 接口上的 eth.call 为返回 bytes32/strings 数组的合约函数返回 null 值【英文标题】:eth.call on web3 interface returns null value for contract function returning array of bytes32/strings 【发布时间】:2018-04-25 13:04:41 【问题描述】:

我正在尝试在私有区块链上运行出价智能合约,而我的智能合约正在 Remix IDE 上运行,并且在我的私有链上运行相同,除了一个函数 [dataOwnedBy()] 应该返回一个数组bytes32 但在 geth 控制台中返回所有零值。 我已经使用 truffle 编译并部署了我的智能合约。

不起作用的函数是:(连同数据声明sn-p和其他函数原型)

struct data
    bytes32 data_id;
    address bidder;
    uint bid;


mapping(bytes32=>data) bidInfo;
mapping(address=>data[]) dataOwned;   //data owned by each address
address[] dataOwners;                 //list of address who own data

function Bid(bytes32 data_id) public payable  ... 
function closeBid(bytes32 data_id) public  ... 
function whoOwns(bytes32 _data_id) constant public returns (address) ... 

function dataOwnedBy(address _addr) constant public returns (bytes32[10])
    uint length = dataOwned[_addr].length;
    bytes32[10] memory _idArray;               
    for (uint i=0;i<length;i++)
        _idArray[i] = (dataOwned[_addr][i].data_id);
    
    return _idArray;

关闭投标后,当我用中标者的地址查询上述函数时,它返回大小为 10 bytes32 值的数组,全部为零,它应该返回该地址拥有的 data_ids。!

Version Information from console
> web3.version.api
"0.20.1"

truffle(development)> version
Truffle v3.4.11 (core: 3.4.11)
Solidity v0.4.15 (solc-js)

这是控制台输出:

playbid.whoOwns("data_id1")

“0x7d8eb703bd863313325b784ac35017614484f2e7”

playbid.dataOwnedBy("0x7d8eb703bd863313325b784ac35017614484f2e7")

[ “0x0000000000000000000000000000000000000000000000000000000000000000”, “0x0000000000000000000000000000000000000000000000000000000000000000”, “0x0000000000000000000000000000000000000000000000000000000000000000”, “0x0000000000000000000000000000000000000000000000000000000000000000”, “0x0000000000000000000000000000000000000000000000000000000000000000”, “0x0000000000000000000000000000000000000000000000000000000000000000”, “0x0000000000000000000000000000000000000000000000000000000000000000”, “0x0000000000000000000000000000000000000000000000000000000000000000”, “0x0000000000000000000000000000000000000000000000000000000000000000”, “0x0000000000000000000000000000000000000000000000000000000000000000”] P>

数组的第一个值应该是“data_id1”的十六进制。

不知道这里出了什么问题,但它在 Remix IDE 上运行良好。 提前致谢!

【问题讨论】:

【参考方案1】:

由于您的代码在混音中运行良好,因此智能合约代码没有问题。当我想将一些数组返回到我的 web3j 驱动的 java 应用程序时,我遇到了同样的问题。我也测试了web3js,也遇到了同样的问题。返回的数组以同样的方式被破坏。 我最终在输入和输出中将数组序列化和反序列化为带有分隔符的字符串。

【讨论】:

以上是关于web3 接口上的 eth.call 为返回 bytes32/strings 数组的合约函数返回 null 值的主要内容,如果未能解决你的问题,请参考以下文章

react-native 上的 web3:错误:返回错误:gas 资金不足 * 价格 + 价值

以太坊如何使用web3.js或者rpc接口获取交易数据交易时间与确认数?

创建自己的区块链合约java版web3接口——以太坊代币

如何让服务器将远程 json 对象返回给客户端?反应/快递/web3

web3.eth.sendSignedTransaction() 总是返回“返回错误:nonce 太低”

通过 web3.js 调用智能合约函数没有响应