3

I am trying to run a bidding smart contract on a private blockchain and my smart contract is working on the Remix IDE and the same works on my private chain except for one function [dataOwnedBy()] which is suposed to return an array of bytes32 but returns all zero values in geth console. I have compiled and deployed my smart contract using truffle.

The function which is not working is : (along with data declaration snippet and other function prototypes)

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;
}

After closing the bid, when I query the above function with the winner's address, it returns array of size 10 bytes32 values, all equal to zero, where it should be returning the data_ids owned by the address.!

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)

This is the console output :

playbid.whoOwns("data_id1")

"0x7d8eb703bd863313325b784ac35017614484f2e7"

playbid.dataOwnedBy("0x7d8eb703bd863313325b784ac35017614484f2e7")

["0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000"]

Instead the first value of the array should be the hex of "data_id1".

Don't know what is going wrong here, but it works perfectly fine on Remix IDE. Thanks in advance !

1 Answers1

1

As your code is working OK in remix, there is no problem with the smart contract code. I experienced same issue when I wanted to return some arrays back to my web3j powered java app. I also tested web3js and encountered the same problem. The returned array was broken the same way.
I ended up in serializing and deserializing arrays to strings with a delimiter, both in inputs and outputs.