首页 > 解决方案 > 如何将状态更新存储在链下数据库中?

问题描述

我想将所有区块链数据存储在链下数据库中。rpc 有一个名为EXPERIMENTAL_changes的函数,有人告诉我,我可以通过这个方法的 http 轮询来做到这一点,但我不知道如何使用它。

http post https://rpc.testnet.near.org jsonrpc=2.0 id=dontcare method=EXPERIMENTAL_changes \ params:='{ "changes_type": "data_changes", "account_ids": ["guest-book.testnet"], "key_prefix_base64": "", "block_id": 19450732 }'

例如这里的结果给出:

"change": { "account_id": "guest-book.testnet", "key_base64": "bTo6Mzk=", "value_base64": "eyJwcmVtaXVtIjpmYWxzZSwic2VuZGVyIjoiZmhyLnRlc3RuZXQiLCJ0ZXh0IjoiSGkifQ==" }

什么是 key_base64?
将其解码为字符串给出 m::39 m::39
是什么?
例如,我在 rust 结构中有以下状态数据。

pub struct Demo {
    user_profile_map: TreeMap<u128, User>,
    user_products_map: TreeMap<u128, UnorderedSet<u128>>, // (user_id, set<product_id>)
    product_reviews_map: TreeMap<u128, UnorderedSet<u128>>, // (product_id, set<review_id>)
    product_check_bounty: LookupMap<u128, Vector<u64>>
}

如何知道这些变量有什么变化?

我是否必须检查部署合约时的每个区块 ID,才能知道哪里有变化?

标签: nearprotocol

解决方案


我想将所有区块链数据存储在链下数据库中。

如果是这样,我建议您查看Indexer Framework,它允许您获取块流并处理它们。我们用它来构建钱包索引器(跟踪每个添加和删除的访问密钥,并将它们存储到 Postgres 中)和资源管理器索引器(跟踪每个块、块、交易、收据、执行结果、状态更改、帐户、和访问密钥,并将所有这些存储在 Postgres 中)

什么是 m::39?

NEAR 协议中的合约可以访问键值存储(状态),因此在最低级别,您使用键值操作进行操作(AssemblyScript 的 NEAR SDK使用和操作定义存储类,而 Rust 的 NEAR SDK 具有和调用保存数据)。getsetstorage_readstorage_write

留言簿示例使用称为 的高级抽象PersistentVector,它自动从/向 NEAR 键值存储(状态)读取和写入其记录。如您所见

export const messages = new PersistentVector<PostedMessage>("m");

留言簿定义了要存储在存储中的消息,m前缀为m::39,这基本上意味着它messages[39]存储在键值存储中。

什么是 key_base64?

正如键值存储所暗示的那样,数据是通过键来存储和访问的,并且键可以是二进制的,因此使用base64编码使JSON-RPC API用户也可以查询那些二进制键(没有办法您可以在 JSON 中传递原始二进制 blob)。

如何知道这些变量有什么变化?我是否必须检查部署合约时的每个区块 ID,才能知道哪里有变化?

正确,您需要关注每个块,并检查更改。这就是为什么我们构建了 Indexer Framework 以便在此基础上启用社区构建服务(我们选择构建应用程序 Indexer for Wallet 和 Indexer for Explorer,但其他人可能决定构建 GraphQL 服务,例如 TheGraph)


推荐阅读