3 votes

eth.call sur l'interface web3 renvoie une valeur nulle pour le contrat fonction renvoyant un tableau d'octets32/chaînes de caractères

J'essaie d'exécuter un contrat intelligent sur une blockchain privée et mon contrat intelligent fonctionne sur l'IDE Remix et la même chose fonctionne sur ma chaîne privée à l'exception d'une fonction [dataOwnedBy()] qui est censée retourner un tableau de bytes32 mais qui retourne toutes les valeurs zéro dans la console geth. J'ai compilé et déployé mon smart contract en utilisant truffle.

La fonction qui ne fonctionne pas est la suivante : (avec l'extrait de déclaration de données et d'autres prototypes de fonction)

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

Après avoir clôturé l'enchère, lorsque j'interroge la fonction ci-dessus avec l'adresse du gagnant, elle renvoie un tableau de 10 valeurs bytes32, toutes égales à zéro, alors qu'elle devrait renvoyer les data_ids appartenant à l'adresse !

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)

Voici la sortie de la console :

playbid.whoOwns("data_id1")

"0x7d8eb703bd863313325b784ac35017614484f2e7"

playbid.dataOwnedBy("0x7d8eb703bd863313325b784ac35017614484f2e7")

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

Au lieu de cela, la première valeur du tableau doit être l'hexagone de "data_id1".

Je ne sais pas ce qui ne va pas ici, mais cela fonctionne parfaitement sur Remix IDE. Merci d'avance !

1voto

Comme votre code fonctionne correctement dans remix, il n'y a pas de problème avec le code du contrat intelligent. J'ai rencontré le même problème lorsque j'ai voulu renvoyer des tableaux à mon application Java basée sur web3j. J'ai également testé web3js et j'ai rencontré le même problème. Le tableau retourné était cassé de la même manière.
J'ai fini par sérialiser et désérialiser les tableaux en chaînes de caractères avec un délimiteur, à la fois dans les entrées et les sorties.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X