nearprotocol - 如何将状态更新存储在链下数据库中?
问题描述
我想将所有区块链数据存储在链下数据库中。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,才能知道哪里有变化?
解决方案
我想将所有区块链数据存储在链下数据库中。
如果是这样,我建议您查看Indexer Framework,它允许您获取块流并处理它们。我们用它来构建钱包索引器(跟踪每个添加和删除的访问密钥,并将它们存储到 Postgres 中)和资源管理器索引器(跟踪每个块、块、交易、收据、执行结果、状态更改、帐户、和访问密钥,并将所有这些存储在 Postgres 中)
什么是 m::39?
NEAR 协议中的合约可以访问键值存储(状态),因此在最低级别,您使用键值操作进行操作(AssemblyScript 的 NEAR SDK使用和操作定义存储类,而 Rust 的 NEAR SDK 具有和调用保存数据)。get
set
storage_read
storage_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)
推荐阅读
- java - 用java对csv文件中唯一的货币货币求和
- tomcat - 在 server.xml 中加密密钥库密码
- node.js - 使用其他路径的节点 JS 服务器代理不起作用
- c# - 我是否正确理解端口和适配器/六角架构?
- jira - Jira 搜索 - 工单 ID 以“”和其他过滤器开头
- python - Python:FileNotFoundError:[Errno 2] 没有这样的文件或目录:当目录确实存在时
- java - 如何防止使用任意方法,例如 String.lastIndexOf()
- kubernetes - 大使 API 网关不提供服务
- python - 为python程序生成突变体
- text - 如何将表示原始数字的字符串(例如 130000.1293)操作为格式化字符串(例如 130,000.13)?