Comment puis-je obtenir le contenu d'un big_map via l'interface RPC?
1 réponses
- votes
Apartir de 004_PT24M4XI:
Vouspouvez utiliser le BIG_MAP_GET RPC pour obtenir des valeursindividuelles.
Ilexiste également une commande tezos-client
pour cela. (Enpassant -l
Nouspouvons voir comment celafonctionne via le RPC.)
$ Tezos-Client -l Obtenez unegrande valeur de cartepour 1 detype NAT à KT1QU32F8N5RLPOKU5N8ITIGAJ1A3EJDJ5GU
...
> > > > > HTTP://Localehost: 18731/Chaînes/Main/Blocs/Tête/Contexte/Contrats/KT1Qu32F8N5RLPOKU5N8ITIGAJ1A3EJDJ5GU/BIG_MAP_GET
{"Key": {"int": "1"},"Type": {"prim": "NAT"}}
& lt; & lt; & lt; & lt; 2: 200 OK
{"int": "2"}
2
Ilest égalementpossible d'utiliser le Contextebrutbinaire RPC pourexplorertout le contenu de la Big_Map,tout à lafois ouen morceaux. Jen'iraipas dans les détails; Ils sont difficileset semblent hors deportée. Le cheminpertinentest:
/Chaînes/Main/Blocs/Tête/Contexte/Raw/Bytes/Contrats/Index/... Chemin/Vers/Vos .../Big_Map
soyezprudent. Si vousexpérimentez avec context/bytes
en dehors d'uneboîte à sable, Utilisez ? Profondeur=1
à Évitez de surcharger votrenoeud en demandanttout le contexte à lafois.
Leparamètre de requête deprofondeur vouspermet également denumériser le contenu d'untrèsgrand Big_Map,surplusieurs demandes.
Leprotocolene stockepas les clés réelles du Big_MAP dans le contexte. Il stocke uniquement les hachages des clés. Cela signifie que vousne pouvezpas obtenir lesentrées réelles dans le Big_MAP (enparticulier lestouches) sansnonplus:
big_map_diff
avec lestouches réelles ou Entant quepirate,gaspiller unpeu d'espaceen échange de commodité,ilestpossible de stocker la clépanned à l'intérieur de la valeur. Puisnumérisez le contenu avec contexte/brut/octets
peut révéler lestouches.
As of 004_Pt24m4xi:
You can use the big_map_get RPC to get individual values out.
There is also a tezos-client
command for this. (By passing -l
we can see how it works through the RPC.)
$ tezos-client -l get big map value for 1 of type nat in KT1Qu32f8N5RLPoku5n8itiGaJ1a3eJDj5gu
...
>>>>2: http://localhost:18731/chains/main/blocks/head/context/contracts/KT1Qu32f8N5RLPoku5n8itiGaJ1a3eJDj5gu/big_map_get
{ "key": { "int": "1" }, "type": { "prim": "nat" } }
<<<<2: 200 OK
{ "int": "2" }
2
It is also possible to use the binary raw context RPC to explore the entire contents of the big_map, all at once or in pieces. I won't go into the details; they are difficult and seem out of scope. The relevant path is:
/chains/main/blocks/head/context/raw/bytes/contracts/index/...path/to/your/contract.../big_map
Be careful. If you experiment with context/raw/bytes
outside of a sandbox, use ?depth=1
to avoid overloading your node by requesting the entire context at once.
The depth
query parameter also enables you to scan the contents of a very large big_map, over multiple requests.
The protocol does not store the actual keys of the big_map in the context. It only stores the hashes of the keys. This means you cannot obtain the actual entries in the big_map (particularly, the keys) without either:
big_map_diff
with the actual keys, orAs a hack, to waste some space in exchange for convenience, it is possible to store the unhashed key again inside the value. Then scanning the contents with context/raw/bytes
can reveal the keys.
J'essaie de visualiser le contenu d'unbig_map dans le stockage d'un contratintelligent.Cependant,interrogermonnœud Tezosne semblepasfournir cesinformations.Existe-t-il unefaçon d'utiliser l'interface RPCpour obtenir directement les éléments contenus dans unbig_map?