Vyper: valor de mapeo de lectura de prueba de trufa dentro de la estructura

Tengo la siguiente estructura dentro de mi archivo vyper:

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

Entonces llamo a esta función:

@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

Dentro de mi prueba de trufa, puedo probar la exactitud del registro, por lo que estoy seguro de que la estructura está definida correctamente, pero si trato de leer el valor de la estructura para los dos campos de mapeo, la llamada vuelve a cero. valor.

No tengo problemas para leer startyend

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

actualHashBet:0x0000000000000000000000000000000000000000000000000000000000000000

Así que ha pasado un tiempo, no creo que sea posible en solidez devolver una matriz en una estructura, consulte ethereum.stackexchange.com/questions/61402/…

Respuestas (1)

Tiene algunas opciones, la primera es escribir su propia función que devuelva una estructura correctamente.

En Solidity esto podría verse como

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

Creo que su problema es que no está agregando el índice del elemento de mapeo. Consulte el captador de variables public-struct-array .

Avíseme si tiene alguna pregunta, también es posible que haya invertido el orden del índice y la dirección.

const currentHashBet = espera instancia.carreras__racersBetHash.call( '0xf17f52151ebef6c7334fad080c5704d77216b732',0);

Si no recuerdo mal, 0x000 es el valor nulo para las direcciones, no existe.

Hola, he intentado revertir el parámetro, pero la transacción fue revertida. Además, si miro el artefacto, la función tiene esta "firma", "inputs": [ { "type": "int128", "name": "arg0" }, { "type": "address", "name": "arg1" } ],como puede leer, la primera entrada es el índice y la segunda es la dirección. No entiendo la utilidad de este captador si tengo que escribir uno personalizado.
Creo que es posible que deba escribir un captador personalizado, ya que no podemos devolver una matriz dinámica directamente en Solidity debido a las limitaciones de EVM, sospecho que esto es lo mismo en Vyper. Ver matriz dinámica y matrices dinámicas
Irónicamente, me encontré con el mismo problema que tenías, parece que las matrices en estructuras no se pueden devolver con captadores públicos, tienes que escribir un captador para obtener la matriz dentro de la estructura.