Vyper: Trüffeltest liest Mapping-Wert in Struktur

Ich habe die folgende Struktur in meiner Vyper-Datei:

races: public({
  start: timestamp,
  end: timestamp,
  racersBetHash: bytes32[address],
  racersBetAmount: wei_value[address]
}[int128])

Dann rufe ich diese Funktion auf:

@public
@payable
def registerRacerBet(_tokenHash: bytes32, _raceID: int128) -> bool:
  self.races[_raceID].racersBetAmount[msg.sender] = msg.value
  self.races[_raceID].racersBetHash[msg.sender] = _tokenHash

  log.NewUserBet(_raceID, msg.sender,
                 self.races[_raceID].racersBetHash[msg.sender],
                 self.races[_raceID].racersBetAmount[msg.sender])
  return True

In meinem Trüffeltest kann ich die Korrektheit des Protokolls testen, daher bin ich mir sicher, dass die Struktur richtig definiert ist, aber wenn ich versuche, den Wert der Struktur für die beiden Zuordnungsfelder zu lesen, wird der Aufruf auf Null zurückgesetzt Wert.

Ich habe keine Probleme zu lesen startundend

const currentHashBet = await instance.races__racersBetHash.call(0, '0xf17f52151ebef6c7334fad080c5704d77216b732');

aktuelleHashBet:0x0000000000000000000000000000000000000000000000000000000000000000

Es ist also eine Weile her, dass ich glaube, dass es in Solidität nicht möglich ist, ein Array in einer Struktur zurückzugeben, siehe ethereum.stackexchange.com/questions/61402/…

Antworten (1)

Sie haben einige Möglichkeiten, die erste besteht darin, Ihre eigene Funktion zu schreiben, die eine Struktur korrekt zurückgibt.

In Solidity könnte das so aussehen

pragma solidity ^0.4.13;

contract Project
{
struct Person {
    address addr;
    uint funds;
}

Person[] people;

function getPeople(uint[] indexes)
    public
    returns (address[], uint[])
{
    address[] memory addrs = new address[](indexes.length);
    uint[]    memory funds = new uint[](indexes.length);

    for (uint i = 0; i < indexes.length; i++) {
        Person storage person = people[indexes[i]];
        addrs[i] = person.addr;
        funds[i] = person.funds;
    }

    return (addrs, funds);
  }
}

Ich denke, Ihr Problem ist, dass Sie den Index des Zuordnungselements nicht hinzufügen. Siehe public-struct-array-Variablen-Getter .

Lassen Sie mich wissen, wenn Sie Fragen haben. Möglicherweise haben Sie auch die Reihenfolge von Index und Adresse umgekehrt.

const currentHashBet = warte auf instance.races__racersBetHash.call( '0xf17f52151ebef6c7334fad080c5704d77216b732',0);

Wenn ich mich richtig erinnere, ist 0x000 der Nullwert für Adressen, existiert nicht.

Hallo, ich habe versucht, den Parameter zurückzusetzen, aber die Transaktion wurde rückgängig gemacht. Auch wenn ich in das Artefakt schaue, hat die Funktion diese "Signatur", "inputs": [ { "type": "int128", "name": "arg0" }, { "type": "address", "name": "arg1" } ],da Sie lesen können, dass die erste Eingabe der Index und die zweite die Adresse ist. Ich verstehe den Nutzen dieses Getters nicht, wenn ich einen benutzerdefinierten schreiben muss.
Ich denke, Sie müssen möglicherweise einen benutzerdefinierten Getter schreiben, da wir aufgrund von EVM-Einschränkungen kein dynamisches Array direkt in Solidity zurückgeben können. Ich vermute, dass dies in Vyper dasselbe ist. Siehe Dynamisches Array und Dynamische Arrays
Ironischerweise bin ich auf das gleiche Problem gestoßen, das Sie hatten, es scheint, dass Arrays in Strukturen nicht mit öffentlichen Gettern zurückgegeben werden können, Sie müssen eine Getter schreiben, um das Array innerhalb der Struktur zu erhalten.