其他
索引容器:基于帐户的互联网计算机上的分类帐搜索
在互联网计算机上查询没有索引容器的交易有点像每次找书时都要搜索整个图书馆,索引容器相当于添加类别,这样您就知道在物理部分找到斯蒂芬·霍金的书。
如今 ICP 账本面临的挑战是,想要访问 ICP 账户交易历史记录的开发人员需要处理整个 ICP 账本容器才能获取此列表,这既低效又不优雅,或者手动存储和更新该数据,索引容器通过提供易于查询的链上解决方案来解决这个问题。
网络神经系统(NNS),即管理互联网计算机的 DAO,将原生代币(ICP)的交易存储在链上运行的账本(ICP-Ledger)上,这些交易存储为区块链 —— 交易的链表,每个块都存储其父块的哈希值。
用户可以通过查询运行 ICP-Ledger 逻辑的容器来检索区块,如果用户想要查询属于特定帐户的交易,他们必须获取所有区块,然后搜索它们以查找这些交易,就像您必须在整个图书馆中搜索特定作者的书籍一样,而无需目录系统。
为了解决这个不切实际的问题,创建了 ICP-Index 容器并将其添加到 NNS 中,为用户提供基于帐户的搜索端点,该端点返回用户指定的区块范围内任何给定帐户的所有交易。
由于 ICRC-1 分类账与 ICP 分类账非常相似,并且具有类似的问题,因此还创建了 ICRC-1 索引容器,本质上是为了实现相同的目的。
本文稍后将解释 ICP 和 ICRC-1 分类账之间的主要区别,ICRC-1 账本用于 SNS DAO 等主要 ICP 功能以及去中心化比特币双胞胎 ckBTC 的实施,本文将详细介绍这两种类型的索引容器如何工作、它们的区别以及 dapp 如何与它们交互。
索引容器如何工作?
由于交易是在 ICP 或 ICRC-1 分类账上创建的,因此它们存储在区块链中,一旦创建了索引容器,它将开始从部署索引容器的实体所指向的分类账中获取区块。
这种区块的获取将以固定的间隔触发,通常是每隔几秒,这意味着,分类账和索引容器之间总会有一个小的滞后。
索引容器与其分配的分类帐之间的交互是一种单向通信,因此,分类帐不会调用任何索引容器的端点。
相反,索引容器调用分类帐端点,分类帐也是索引容器与之交互的唯一容器,不发生其他容器到容器的通信。
当获取区块时,索引容器会将区块存储在稳定的内存日志中,索引容器还将帐户 ID 与块索引一起以 BTreeMap 格式存储在稳定内存中,这个 BTreeMap 的关键是账户和存储交易的区块的索引,这些块存储在仅附加列表中。
当检索帐户的交易时,此 BTreeMap 用于搜索键并提取与该帐户对应的所有块索引,然后在事务发生的特定索引处访问稳定内存日志,然后它从区块中提取交易并将其提供给用户,这允许对任何需要从索引容器进行帐户交易的实体进行快速搜索和响应。
ICPIndex 和 ICRC-1 Index 容器之间的差异
这两个索引容器之间有两个主要区别,首先,只有一个 ICP-Index 容器用于查询、处理和服务对 ICP-Ledger 上创建的交易数据的请求,它与 NNS 位于同一子网中。
另一方面,ICRC-1 索引容器有多个,每个都连接到特定的 ICRC-1 Ledger,例如,这些可以是用于 SNS DAO 的分类账,也可以是用于记录 ckBTC 交易的分类账。
这些容器与众不同的另一个方面是它们的帐户表示类型根本不同,ICP-Ledgers 使用 AccountIdentifiers,而 ICRC-1 Ledgers 使用 Account 作为各自的用户帐户表示。
链接资源中解释了规格和详细信息,这里的关键要点是这两种帐户表示形式不可互换,AccountIdentifier 本质上是 Account 的哈希版本,用于增强隐私性,这也意味着 AccountIdentifier 无法转换回帐户。
这种差异对索引容器返回的事务的格式有影响,ICP 索引容器返回的交易将包含帐户标识符,而 ICRC-1 索引容器返回的交易将包含帐户,查询这两种索引容器类型的用户在他们寻求处理从索引容器获取的数据时执行的任何任务都必须考虑这一关键差异。
如何与索引容器交互
与索引容器交互的接口可以通过查看当前部署的索引容器之一(ICP-Index、ckBTC-Index)的接口或通过参考实现的 candid 文件来找到:
raw.githubusercontent.com/dfinity/ic/d628aa32d72565c9e5258d033b3c0be194c77b24/rs/rosetta-api/icp_ledger/index/index.did raw.githubusercontent.com/dfinity/ic/d628aa32d72565c9e5258d033b3c0be194c77b24/rs/rosetta-api/icrc1/index-ng/index-ng.did
索引容器不仅可以检索特定帐户的当前余额,还可以获取特定帐户的一系列块或一系列交易,有关如何与容器接口交互的说明,请参阅本指南:
internetcomputer.org/docs/current/references/cli-reference/dfx-canister#dfx-canister-call
更多有用的链接
本地部署 ICP-Ledger:
internetcomputer.org/docs/current/developer-docs/integrations/ledger/ledger-local-setup
部署 ICRC-Ledger:
internetcomputer.org/docs/current/developer-docs/integrations/ledger/deploy-new-token
部署 Candid UI 以通过前端与容器交互:
internetcomputer.org/docs/current/developer-docs/backend/motoko/candid-ui
开始构建:
在 X 上关注互联网计算机的技术发展:@DFINITYDev,加入开发者社区:forum.dfinity.org。
来源:Nikolas Haimerl翻译:Catherine
- 往 期 推 荐 -
受人尊敬的 Dfinity 基金会认可并支持 Zoksh 的开创性方法并提供资金支持
DFINITY 在 2023 年香港金融科技周及 HK Web3 Month Conference 活动一览
DFINITY 与 Roland Berger、NvirWorld 以及 InvoiceMate 达成合作
你关心的 IC 内容
技术进展 | 项目信息 | 全球活动
长按关注 IC 微信公众号
掌握最新资讯
*添加小助手微信 comiocn 进交流社群