首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >给定一个键,如何通过API从表中读取值?

给定一个键,如何通过API从表中读取值?
EN

Stack Overflow用户
提问于 2022-11-02 23:20:04
回答 1查看 77关注 0票数 0

想象一下,我有一个移动模块,看起来像这样。

Move.toml

代码语言:javascript
复制
[package]
name = 'friends'
version = '1.0.0'

[dependencies.AptosFramework]
git = 'https://github.com/aptos-labs/aptos-core.git'
rev = 'testnet'
subdir = 'aptos-move/framework/aptos-framework'

[addresses]
friends = "81e2e2499407693c81fe65c86405ca70df529438339d9da7a6fc2520142b591e"

sources/nicknames.move

代码语言:javascript
复制
module friends::nicknames {
    use std::error;
    use std::signer;
    use std::string::String;
    use aptos_std::table::{Self, Table};

    const ENOT_INITIALIZED: u64 = 0;

    struct Nicknames has key {
        // A map of friends' nicknames to wallet addresses.
        nickname_to_addr: Table<String, address>
    }

    /// Initialize Inner to the caller's account.
    public entry fun initialize(account: &signer) {
        let nicknames = Nicknames {
            nickname_to_addr: table::new(),
        };
        move_to(account, nicknames);
    }

    /// Initialize Inner to the caller's account.
    public entry fun add(account: &signer, nickname: String, friend_addr: address) acquires Nicknames {
        let signer_addr = signer::address_of(account);
        assert!(exists<Nicknames>(signer_addr), error::not_found(ENOT_INITIALIZED));
        let nickname_to_addr = &mut borrow_global_mut<Nicknames>(signer_addr).nickname_to_addr;
        table::add(nickname_to_addr, nickname, friend_addr);
    }
}

然后,我将模块(到testnet)发布,将Nicknames初始化到我的帐户,然后添加了一个条目:

代码语言:javascript
复制
aptos move publish
代码语言:javascript
复制
aptos move run --function-id 81e2e2499407693c81fe65c86405ca70df529438339d9da7a6fc2520142b591e::nicknames::initialize
代码语言:javascript
复制
aptos move run --function-id 81e2e2499407693c81fe65c86405ca70df529438339d9da7a6fc2520142b591e::nicknames::add --args string:dport address:81e2e2499407693c81fe65c86405ca70df529438339d9da7a6fc2520142b591e

既然我的表上有一些数据,我将如何读取dport键的值。我想我能用这个API吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-02 23:20:04

你是对的,你可以使用API来做这个!首先,让我们得到一些关于你的桌子的信息。

让我们看看您从上面的移动模块部署到您的帐户的资源。首先,让我们构造struct标记(也就是资源ID /句柄),如下所示:

代码语言:javascript
复制
<account_address>::<module>::<struct_name>

就你而言:

代码语言:javascript
复制
0x81e2e2499407693c81fe65c86405ca70df529438339d9da7a6fc2520142b591e::nicknames::Nicknames

因为Aptos区块链中的每个帐户只能有一个资源,所以我们可以使用它来唯一地标识帐户中的资源。使用它,我们就可以得到表句柄。表句柄是指向特定表的全局唯一ID (所以,不只是在帐户范围内)。我们需要它来进行任何进一步的查询,所以让我们首先得到:

代码语言:javascript
复制
$ curl https://fullnode.testnet.aptoslabs.com/v1/accounts/0x81e2e2499407693c81fe65c86405ca70df529438339d9da7a6fc2520142b591e/resource/0x81e2e2499407693c81fe65c86405ca70df529438339d9da7a6fc2520142b591e::nicknames::Nicknames | jq .
{
  "type": "0x81e2e2499407693c81fe65c86405ca70df529438339d9da7a6fc2520142b591e::nicknames::Nicknames",
  "data": {
    "nickname_to_addr": {
      "handle": "0x64fa842ed2c9da130f0419875e6c101aeea263882fadee3257b13f1bb4d7d41d"
    }
  }
}

解释上述情况:

  • 点击https://fullnode.testnet.aptoslabs.com/v1/accounts/0x81e2e2499407693c81fe65c86405ca70df529438339d9da7a6fc2520142b591e/resource/<name>可以让我们在一个账户上获得一个特定的资源。
  • ,我们然后特别请求0x81e2e2499407693c81fe65c86405ca70df529438339d9da7a6fc2520142b591e::nicknames::Nicknames。这里的两个地址碰巧是相同的,但这只是因为我们使用相同的帐户,另一个例子可能是0x1::aptos_coin::AptosCoin.
  • We可以看到那里的句柄,0x64fa842ed2c9da130f0419875e6c101aeea263882fadee3257b13f1bb4d7d41d.

使用这个句柄,我们现在可以查询API:

代码语言:javascript
复制
$ cat query.json
{
  "key_type": "0x1::string::String",
  "value_type": "address",
  "key": "dport"
}

$ curl -H 'Content-Type: application/json' --data-binary "@query.json" https://fullnode.testnet.aptoslabs.com/v1/tables/0x64fa842ed2c9da130f0419875e6c101aeea263882fadee3257b13f1bb4d7d41d/item
"0x81e2e2499407693c81fe65c86405ca70df529438339d9da7a6fc2520142b591e"

解释上述情况:

  • 通过API从表中获取项的请求是POST请求。来自此file.
  • key_type的数据是表中键的类型。从0x1::string::String.
  • value_type的原始声明中可以看出,这是nickname_to_addr值的类型。它的类型是address,这是一种特殊类型,没有部署在任何特定的模块上(因此缺少address是我们在表中查询的关键。

如果假设表中使用的键更复杂,比如一个结构,而不是一个字符串那样的单个值,那么您可以在请求中将该结构表示为JSON。

代码语言:javascript
复制
{
  "key_type": "0x1::string::String",
  "value_type": "address",
  "key": {
    "first_name": "Ash",
    "last_name": "Ketchum",
  }
}

这就是您现在可以使用API所做的工作的范围。也就是说,给你的阅读值提前知道关键。如果您想做以下事情,则需要查询索引器:

  • 遍历表中的所有键。
  • 获得整个表,包括键和值。

我稍后会给你写一个关于如何做这件事的答复。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74296605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档