eth.call в интерфейсе web3 возвращает нулевое значение для контрактной функции, возвращающей массив байтов32 / строк

Я пытаюсь запустить смарт-контракт торгов в частной цепочке блоков, и мой смарт-контракт работает в Remix IDE, и то же самое работает в моей частной цепочке, за исключением одной функции [dataOwnedBy ()], которая предназначена для возврата массива байтов32, но возвращает все нулевые значения в консоли geth. Я скомпилировал и развернул свой смарт-контракт с использованием трюфеля.

Не работает следующая функция: (вместе с фрагментом объявления данных и другими прототипами функций)

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 он отлично работает. Заранее спасибо !


person Shivam Pathak    schedule 12.11.2017    source источник


Ответы (1)


Поскольку ваш код работает нормально в ремиксе, проблем с кодом смарт-контракта нет. У меня возникла такая же проблема, когда я хотел вернуть некоторые массивы обратно в мое Java-приложение на базе web3j. Я также тестировал web3js и столкнулся с той же проблемой. Возвращенный массив был разбит таким же образом.
Я закончил сериализацию и десериализацию массивов в строки с разделителем, как на входах, так и на выходах.

person saman.shahmohamadi    schedule 31.12.2018