Web3接口中的eth.call返回一个空值,该合约函数返回一个bytes32/字符串数组。

3

我正在尝试在私有区块链上运行竞标智能合约,我的智能合约在 Remix IDE 上工作,在我的私有链上也可以正常工作,只有一个函数[dataOwnedBy()]无法在 geth控制台中返回字节数组的数组,而是返回所有零值。

我使用 truffle 编译和部署了我的智能合约。

不起作用的函数是:(包括数据声明片段和其他函数原型)

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"]

相反,数组的第一个值应该是"data_id1"的十六进制。

不知道出了什么问题,但在Remix IDE上完全正常运行。 提前感谢!

1个回答

1

由于您的代码在remix中正常工作,因此智能合约代码没有问题。当我想将一些数组返回到我的web3j驱动的Java应用程序时,我也遇到了同样的问题。我还测试了web3js,并遇到了同样的问题。返回的数组以相同的方式被破坏。
最终,我使用分隔符将数组序列化和反序列化为字符串,同时处理输入和输出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接