Ich habe einen Vertrag, der so aussieht:
contract a {
struct Str {
uint256 totalTokens;
mapping(address => uint256) playerTokens;
}
mapping(uint256 => Str) public tokenStores;
}
Nehmen wir nun an, dass wir tokenStores als öffentlich definiert haben und eine Getter-Methode automatisch zugewiesen wird. Ist es möglich, mit einem Schlüssel aus Javascript auf einen bestimmten playerTokens-Wert zuzugreifen? Irgendein Workaround möglich in Solidity ^0.5.0 ??
Mit einem Getter von kommt man nicht aus, public
weil der Compiler (noch) nicht weiß, wie man die Funktion mit verschachtelten Schlüsseln formuliert. Ich glaube, dass dies möglich ist, wenn Sie es speziell für das experimentelle ABI wünschen.
Eine sicherere, konventionellere Problemumgehung besteht darin, einfach einen eigenen Getter zu konstruieren.
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]);
}
}
Ich hoffe es hilft.
Sie können eine Funktion wie diese in Smart Contract haben, um Werte aus der Zuordnung zurückzugeben. Sie können diese Funktion aus Ihrem Javascript-Code mit web3 aufrufen, um das zu erhalten, was Sie benötigen.
function getPlayerTokens(uint _tokenStoresId, address playerAdd)
public
view
returns(uint)
{
Str storage s = tokenStores[_tokenStoresId];
return s.playerTokens[playerAdd];
}
Fliege
Rob Hitchens
Str
). Sie könnten eine Struktur enthalten. Sie deklarieren die Struktur auf die übliche Weise und wandeln dann einen Member in diesen Typ um.struct A { ... } struct B { A aStruct; } mapping(address = B) private bMap;
Rob Hitchens
bMap
ist eine Abbildung vonB
Strukturen.B
Strukturen enthalten eineA
Struktur.