javascriptを使用してスマートコントラクトからデータを取得する方法は?
2 回答
- 投票
-
- 2020-01-25
現在のバビロンプロトコルと今後のカルタゴの時点で、RPCは、RPCに提供する既知のキーの値を取得する機能のみを提供します.ただし、このシナリオでも、保存した読み取り可能なキーではなく、そのキーのハッシュを提供する必要があります.これは、内部での表現方法です.
この回答では、RPCの呼び出し方法について説明しています RPCは、「すべてのキーを取得する」または「すべての値を取得する」手段を提供しません.これを実現するには、非実用的な量の解析を行う必要があるため、ほとんどの作業を行うためにインデクサーまたはライブラリのいずれかを使用することをお勧めします.
単一キー検索の場合、Taquitoライブラリでは次のことができます.
const contract = await Tezos.contract.at("KT1...") const storage = await contract.storage() const bigMapDetail = await storage.namedbigmap.get("readable lookup key")
タキートとビッグマップの詳細については、 https:/をご覧ください./medium.com/tezoscommons/new-taquito-release-now-with-bigmaps-7d7352351af4
すべての値を取得するために、tzStatsインデクサーは使いやすいAPIを提供します(すぐに他のインデクサーもこれを追加する可能性があります).大きなマップを使用してコントラクトからすべての値を取得するためのTzStats呼び出しの例:
curl "https://api.tzstats.com/explorer/bigmap/17/values"
tzStatsビッグマップのサポートの詳細については、 https://tzstats.com/をご覧ください.blog/tezos-smart-contract-apis/
インデクサーに依存したくない場合は、PyTezos "big_map_get"を使用して、手間のかかる作業を行うこともできます. https://baking-bad.github.io/pytezos/
As of the current Babylon protocol and the upcoming Carthage, the RPC only provides you the ability to retrieve the value for a known key that you provide to the RPC. But even in this scenario you need to provide not the readable key you stored, but a hash of that key as that is how it is represented internally. This answer describes how to call the RPC
The RPC does not provide a means to "get all keys" or to "get all values". To accomplish this you must do an impractical amount of parsing so it is recommended that you use either an indexer or a library to do most of the work for you.
For single key lookup, Taquito library allows you to do the following:
const contract = await Tezos.contract.at("KT1...") const storage = await contract.storage() const bigMapDetail = await storage.namedbigmap.get("readable lookup key")
Read more on Taquito and big maps at https://medium.com/tezoscommons/new-taquito-release-now-with-bigmaps-7d7352351af4
To get all the values, the tzStats indexer provides an easy to use API (soon other indexers are likely to add this as well). Example TzStats call to get all the values out of a contract with a big map:
curl "https://api.tzstats.com/explorer/bigmap/17/values"
Read more on tzStats big map support at https://tzstats.com/blog/tezos-smart-contract-apis/
You can also use PyTezos "big_map_get" to do some of the heavy lifting for you if you don't want to rely on an indexer. https://baking-bad.github.io/pytezos/
-
これをありがとう.tzstatsの使用は私の場合に適していますが、jsonを取得しようとするとCORSエラーがスローされます.`$ .getJSON(https://api.babylonnet.tzstats.com/explorer/contract/{kt}/storage..`関数を実装する方法はありますか?`?callback=? `を追加すると、これを機能させます.Thanks for this. Using tzstats suits my case but it is throwing a CORS error when I try to retrieve the json. Is there a way to implement the `$.getJSON(https://api.babylonnet.tzstats.com/explorer/contract/{kt}/storage..` function? Appending `?callback=?` doesn't seem to get this to work.
- 0
- 2020-01-28
- macourtney7
-
ブラウザベースのスクリプトから呼び出す場合は、使用しているサーバーエンドポイントのプロバイダーによって、呼び出し元ドメインをCORSのホワイトリストに登録する必要があります[email protected]でアレックスにメッセージを送るif you are going to call it from a browser based script you will need to get your calling domain whitelisted for CORS by the provider of the server endpoint you are using. Message Alex at [email protected]
- 0
- 2020-01-28
- cousinit
-
アレックスが2番目の答えを提供したと思います.うまくいけば、彼はすぐに応答します.プロトタイプを完成させるために、[cors-anywhere](https://github.com/Rob--W/cors-anywhere/)でリクエストをプロキシしています.I believe Alex provided the second answer, hopefully he will respond soon. I am proxying requests with [cors-anywhere](https://github.com/Rob--W/cors-anywhere/) to complete the prototype.
- 0
- 2020-01-28
- macourtney7
-
JSONPを実装する予定はありません.CORSヘッダーをサポートするインデクサーの独自のコピーをすぐに実行するか、パブリックAPIでホワイトリストに登録するようにリクエストを送信できます.We have no plans to implement JSONP. You can run your own copy of our indexer which supports CORS headers out of the box or send me a request to get whitelisted on our public API.
- 0
- 2020-01-29
- Alexander Eichhorn
-
- 2020-01-25
TzStatsではすべての過去のビッグマップデータのインデックスを維持しています.ビッグマップ呼び出しで現在のすべてのキーと値をフェッチするには
https://api.tzstats.com/explorer/bigmap/:id/values
ビッグマップが非常に大きい場合は、
limit
およびoffset
パラメーター(デフォルトは100エントリ、最大は500)を使用して結果をページングできます.詳細と例については、ビッグマップドキュメントをご覧ください.Tezos RPCの使用を希望する場合は、
この回答をお読みください.現在、RPCは呼び出しごとに1つのビッグマップキーのみをフェッチするため、キーのスクリプト式ハッシュを知っている必要があります. We maintain an index of all historic bigmap data at TzStats. To fetch all current keys and values in a bigmap call
https://api.tzstats.com/explorer/bigmap/:id/values
If your bigmap is very large you can page through the result with
limit
andoffset
parameters (default is 100 entries, max is 500). See our bigmap docu for more details and examples.If you prefer using the Tezos RPC read this answer. Right now the RPC fetches a single bigmap key per call only and you need to know the script expression hash of your key.
-
こんにちはアレックス、私は単一のリクエストですべてのビッグマップ値を返したいです.コントラクトのデプロイ後、完全なビッグマップは `../explorer/contract/{hash}/storage`を使用して表示されますが、更新後はビッグマップIDのみが表示されます.`../explorer/bigmap/{id}/values`を試しましたが、20個のエントリが生成されます.**すべて**のキー/値(32のみ)を取得するにはどうすればよいですか?どうもありがとう.Hi Alex, I wish to return all bigmap values in a single request. After contract deployment the full bigmap is shown using `../explorer/contract/{hash}/storage` but after an update it shows only the bigmap id. I tried `../explorer/bigmap/{id}/values` but this produces 20 entries. How would I fetch **all** key/values (only 32)? Many thanks.
- 0
- 2020-01-30
- macourtney7
-
デフォルト(20エントリ)からupに `limit`パラメータを追加しました.I appended the `limit` parameter to up from default (20 entries).
- 0
- 2020-01-30
- macourtney7
-
あなたはそれを自分で見つけました、良いです.`../explorer/bigmap/{id}/values`エンドポイントは、` ../explorer`の下にある他のすべてのリストエンドポイントと同様に、 `offset`と` limit`を使用したページングをサポートします.最大制限は100です.1つの重要な問題は、2つのページ呼び出しの間で、チェーンが前進または再編成される可能性があることです.安定したページング(新しいブロックの影響を受けない)を行うには、追加のパラメーター `block={hash| height}`を使用して、呼び出しを履歴の特定のポイントに効果的にロックします.利点は、呼び出し間でチェーンが再編成された場合に409エラーが発生するため、前のすべてのページが古くなっていることがわかることです.You found it yourself, good. The `../explorer/bigmap/{id}/values` endpoint like all other listing endpoints under `../explorer` support paging using `offset` and `limit`. Max limit is 100. One important issue is that between two paged calls the chain can advance or reorganize. For stable paging (not-influenced by new blocks) use an additional parameter `block={hash|height}` which effectively locks your call to a specific point in history. Benefit is that if the chain reorged between calls you get a 409 error, so you know all previous pages are stale.
- 1
- 2020-02-02
- Alexander Eichhorn
デプロイされたスマートコントラクトから取得したいデータを保存しました.
ストレージ構造はSmartPyを使用して定義されました:
この投稿の答えは順調に進んでいるようです正しい行ですが、無効になっています.可能であれば、ソリューションはJSONオブジェクトも返す必要があります.これが望ましいためです.
sp.big_map
と3つのsp.address
コンテナに保存されているデータを取得したいと思います.bmap
には固定の32項目があり、better-などのエクスプローラーからアクセスできます. call.devどんな助けでも大歓迎です!