【问题标题】:How to store the updates of state in an offchain database?如何将状态更新存储在链下数据库中?
【发布时间】:2021-03-05 11:11:36
【问题描述】:

我想将所有区块链数据存储在链下数据库中。 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


    【解决方案1】:

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

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

    什么是 m::39?

    NEAR 协议中的合约可以访问键值存储(状态),因此在最低级别,您使用键值操作进行操作(NEAR SDK for AssemblyScript 定义了 Storage 类与 get 和 @987654329 @ 操作,NEAR SDK for Rust 有 storage_readstorage_write 调用来保存数据)。

    Guest Book 示例使用称为 PersistentVector 的高级抽象,它自动从 NEAR 键值存储(状态)读取和写入其记录。 As you can see:

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

    Guest Book 定义了要存储在存储中的消息以m 为前缀,所以你看到m::39,这基本上意味着它是存储在键值存储中的messages[39]

    什么是key_base64?

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

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

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

    【讨论】:

    • EXPERIMENTAL_changes 需要单个 block_id,如果我们可以查询 block_id 范围之间的所有更改,例如(25671799-25672572)
    • @AmiyaBehera 恐怕超出了我们想要通过 JSON RPC 暴露的范围;考虑到网络高负载期间的边缘情况(单个块中至少有 10 个分片的 1k 事务意味着我们已经讨论了单个块中的 1k * 10 * 2 更改 [2 是发送者和接收者帐户被触及]),我们可以轻松达到极限。因此,我们建议您将 Indexer 用于这些目的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    相关资源
    最近更新 更多