mapeo de acceso dentro del mapeo de estructura en Solidity ^ 0.5.0

Tengo un contrato que se ve así:

contract a {
    struct Str {
        uint256 totalTokens;
        mapping(address => uint256) playerTokens;
    }

    mapping(uint256 => Str) public tokenStores;
}

ahora suponga que hemos definido tokenStores como público y se asignará automáticamente un método getter, ¿es posible acceder a un valor de playerTokens en particular usando una clave de javascript? ¿Alguna solución posible en Solidity ^ 0.5.0?

Respuestas (2)

No puede hacerlo con un captador publicporque el compilador (todavía) no sabe cómo formular la función con claves anidadas. Creo que esto es posible si especifica que desea el ABI experimental.

Una solución alternativa más segura y convencional es simplemente construir su propio getter.

contract a { 

  struct Str {
    uint256 totalTokens;
    mapping(address => uint256) playerTokens;
  }

  mapping(uint256 => Str) private tokenStores;  // we'll make the getter manually

  function getPlayerToken(uint256 tokenId, address player) public returns(uint, uint) {
      Str storage t =  tokenStores[tokenId];
      return (t.totalTokens, t.playerTokens[player]);
  }
}

Espero eso ayude.

¿Cómo agregaría una estructura Str a tokenStores?
??? tokenStore es un mapeo de estructuras ( Str). Podrían contener una estructura. Declaras la estructura de la forma habitual y luego lanzas un miembro como ese tipo.struct A { ... } struct B { A aStruct; } mapping(address = B) private bMap;
bMapes un mapeo de Bestructuras. BLas estructuras contienen una Aestructura.

Puede tener una función como esta en un contrato inteligente para devolver valores del mapeo. Puede llamar a esta función desde su código javascript usando web3 para obtener lo que necesita.

function getPlayerTokens(uint _tokenStoresId, address playerAdd)
        public
        view 
        returns(uint)
    {
        Str storage s = tokenStores[_tokenStoresId];
        return s.playerTokens[playerAdd];

    }
sí, esta es una función separada, que es bastante sencilla. Pero quiero saber si es posible acceder desde la propia función getter automatizada