Zugriffszuordnung innerhalb der Zuordnung von Struct in Solidity ^0.5.0

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 ??

Antworten (2)

Mit einem Getter von kommt man nicht aus, publicweil 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.

Wie würden Sie tokenStores eine Str-Struktur hinzufügen?
??? tokenStore ist eine Zuordnung von Strukturen ( 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;
bMapist eine Abbildung von BStrukturen. BStrukturen enthalten eine AStruktur.

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];

    }
Ja, das ist eine separate Funktion, die ziemlich einfach ist. Aber ich möchte wissen, ob es möglich ist, über die automatisierte Getter-Funktion selbst zuzugreifen