У меня есть контракт, который выглядит так:
contract a {
struct Str {
uint256 totalTokens;
mapping(address => uint256) playerTokens;
}
mapping(uint256 => Str) public tokenStores;
}
теперь предположим, что мы определили tokenStores как общедоступные и метод получения будет автоматически выделен, возможно ли получить доступ к определенному значению playerTokens с помощью ключа из javascript? Возможный обходной путь в Solidity ^0.5.0 ??
Вы не можете использовать геттер 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]);
}
}
Надеюсь, поможет.
У вас может быть такая функция в смарт-контракте, чтобы возвращать значения из сопоставления. Вы можете вызвать эту функцию из своего кода javascript, используя web3, чтобы получить то, что вам нужно.
function getPlayerTokens(uint _tokenStoresId, address playerAdd)
public
view
returns(uint)
{
Str storage s = tokenStores[_tokenStoresId];
return s.playerTokens[playerAdd];
}
Летать
Роб Хитченс
Str
). Они могут содержать структуру. Вы объявляете структуру обычным способом, а затем приводите член к этому типу.struct A { ... } struct B { A aStruct; } mapping(address = B) private bMap;
Роб Хитченс
bMap
является отображениемB
структур.B
структуры содержатA
структуру.