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?
No puede hacerlo con un captador public
porque 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.
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];
}
Volar
Rob Hitchens
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;
Rob Hitchens
bMap
es un mapeo deB
estructuras.B
Las estructuras contienen unaA
estructura.