сопоставление доступа внутри сопоставления структуры в Solidity ^ 0.5.0

У меня есть контракт, который выглядит так:

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

    mapping(uint256 => Str) public tokenStores;
}

теперь предположим, что мы определили tokenStores как общедоступные и метод получения будет автоматически выделен, возможно ли получить доступ к определенному значению playerTokens с помощью ключа из javascript? Возможный обходной путь в Solidity ^0.5.0 ??

Ответы (2)

Вы не можете использовать геттер from, publicпотому что компилятор (пока) не знает, как сформулировать функцию с вложенными ключами. Я считаю, что это возможно, если вы хотите экспериментальный ABI.

Более безопасный и традиционный обходной путь — просто создать собственный геттер.

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

Надеюсь, поможет.

Как бы вы добавили структуру Str в tokenStores?
??? tokenStore — это сопоставление структур ( Str). Они могут содержать структуру. Вы объявляете структуру обычным способом, а затем приводите член к этому типу.struct A { ... } struct B { A aStruct; } mapping(address = B) private bMap;
bMapявляется отображением Bструктур. Bструктуры содержат Aструктуру.

У вас может быть такая функция в смарт-контракте, чтобы возвращать значения из сопоставления. Вы можете вызвать эту функцию из своего кода javascript, используя web3, чтобы получить то, что вам нужно.

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

    }
да, это отдельная функция, которая довольно проста. Но я хочу знать, возможен ли доступ из самой автоматической функции получения