※この記事は「Index Canisters: Account-based search for ledgers on the Internet Computer」を引用/翻訳したものです。
インデックス キャニスターは、アカウント ベースのトランザクション クエリを導入することで、インターネット コンピュータ上の元帳を強化します。これにより、ユーザーと dapp は元帳トランザクション ログの履歴をすばやくクエリし、特定のアカウントが関与したトランザクションを取得できます。
インターネット コンピュータでインデックス キャニスターを使用せずにトランザクションを照会することは、本を探すたびに図書館全体を検索するようなものです。インデックス キャニスターはカテゴリを追加することと同じで、スティーブン ホーキングの本は物理学セクションで見つけられることがわかります。
ICP 台帳の現在の課題は、ICP アカウントの取引履歴にアクセスしたい開発者が、このリストを取得するために ICP 台帳キャニスター全体を処理する必要があることです。これは非効率的で洗練されていません。あるいは、手動でデータを保存して更新する必要があります。インデックス キャニスターは、簡単にクエリできるオンチェーン ソリューションを提供することで、この問題に対処します。
Network Nervous System (NNS) は、インターネットを管理する DAO です。コンピュータは、ネイティブ トークン (ICP) のトランザクションを、チェーン上で実行される台帳 ( ICP-Ledger ) に保存します。これらのトランザクションは、ブロックチェーン (各ブロックに親ブロックのハッシュが格納されているトランザクションのリンク リスト) として保存されます。ユーザーは、 ICP-Ledger ロジックを実行するキャニスターを照会することで、ブロックを取得できます。ユーザーが特定のアカウントに属するトランザクションを照会する場合、すべてのブロックをフェッチしてから、ブロックを検索してこれらのトランザクションを見つける必要があります。これは、カタログ システムなしで特定の著者の本を図書館全体で検索するのとほぼ同じです。この非実用性を解決するために、ICP-Index キャニスターが作成され、NNS に追加されました。これにより、ユーザーが指定したブロック範囲内のすべてのアカウントのトランザクションを返すアカウント ベースの検索エンドポイントがユーザーに提供されます。
ICRC-1 元帳は ICP 元帳と非常によく似ており、同様の問題を抱えているため、ICRC-1 インデックス キャニスターも基本的に同じ目的を果たすために作成されました。ICP 元帳と ICRC-1 元帳の主な違いについては、この記事の後半で説明します。ICRC-1 元帳は、SNS DAO などの ICP の主な機能や、分散型ビットコイン ツインであるckBTCの実装で使用されています。この記事では、これら 2 種類のインデックス キャニスターの仕組み、違い、dapp がそれらと対話する方法について詳しく説明します。
インデックスキャニスターはどのように機能しますか?
ICP または ICRC-1 台帳でトランザクションが作成されると、そのトランザクションはブロックチェーンに保存されます。インデックス キャニスターが作成されるとすぐに、インデックス キャニスターをデプロイしたエンティティによって指定された台帳からブロックの取得が開始されます。このブロックの取得は、一定の間隔 (通常は数秒ごと) でトリガーされます。つまり、台帳とインデックス キャニスターの間には常にわずかな遅延があります。インデックス キャニスターと割り当てられた台帳間のやり取りは、一方向の通信です。そのため、台帳はインデックス キャニスターのエンドポイントを呼び出しません。代わりに、インデックス キャニスターが台帳のエンドポイントを呼び出します。また、台帳はインデックス キャニスターがやり取りする唯一のキャニスターです。キャニスター間のその他の通信は行われません。
ブロックをフェッチすると、インデックス キャニスターはブロックを安定したメモリ ログに保存します。インデックス キャニスターは、アカウント ID とブロックのインデックスをBTreeMap 形式で安定したメモリに保存します。この BTreeMap のキーは、トランザクションが保存されているアカウントとブロックのインデックスです。ブロックは追加専用リストに保存されます。
アカウントのトランザクションを取得する際、この BTreeMap はキーを検索し、アカウントに対応するすべてのブロック インデックスを抽出するために使用されます。その後、トランザクションが発生した特定のインデックスで安定したメモリ ログにアクセスします。その後、ブロックからトランザクションを抽出し、ユーザーに提供します。これにより、インデックス キャニスターからアカウントのトランザクションを必要とするすべてのエンティティの検索と応答時間が高速になります。
ICPIndexとICRC-1 Indexキャニスターの違い
2 つのインデックス キャニスターには、2 つの大きな違いがあります。まず、ICP 元帳で作成されたトランザクション データのクエリ、処理、およびリクエストに対応する ICP インデックス キャニスターは 1 つだけです。これは NNS と同じサブネット上に存在します。一方、ICRC-1 インデックス キャニスターは複数あり、それぞれが特定の ICRC-1 元帳に接続されています。これらは、たとえば SNS DAO に使用される元帳や、ckBTC トランザクションを記録するために使用される元帳である可能性があります。
これらのキャニスターを区別するもう 1 つの側面は、アカウント表現のタイプが根本的に異なることです。ICP 台帳はAccountIdentifiersを使用し、ICRC-1 台帳はAccount をそれぞれのユーザー アカウント表現として使用します。仕様と詳細については、リンクされたリソースで説明されています。ここで重要なのは、これら 2 つのアカウント表現は互換性がないということです。AccountIdentifier は、基本的にプライバシーを向上させるための Account のハッシュ バージョンです。これは、AccountIdentifier を Account に戻すことができないことも意味します。この違いは、インデックス キャニスターの返されるトランザクションの形式に影響します。ICP インデックス キャニスターによって返されるトランザクションには AccountIdentifiers が含まれますが、ICRC-1 インデックス キャニスターによって返されるトランザクションには Accounts が含まれます。両方のインデックス キャニスター タイプをクエリするユーザーは、インデックス キャニスターから取得したデータを使用して実行しようとするタスクで、この重要な違いを考慮する必要があります。
インデックスキャニスターの操作方法
インデックス キャニスターと対話するためのインターフェイスは、現在デプロイされているインデックス キャニスター ( ICP-Index、ckBTC-Index )のいずれかのインターフェイスを調べるか、リファレンス実装の candid ファイルを通じて見つけることができます。
・https://raw.githubusercontent.com/dfinity/ic/ d628aa32d72565c9e5258d033b3c0be194c77b24 /rs/rosetta-api/icp_ledger/index/index.did
インデックス キャニスターを使用すると、特定のアカウントの現在の残高を取得できるだけでなく、特定のアカウントのブロックの範囲またはトランザクションの範囲を取得することもできます。キャニスター インターフェイスの操作方法については、このガイドを参照してください。
その他の便利なリンク
Comentários