想象一下,我有一个移动模块,看起来像这样。
Move.toml
[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
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初始化到我的帐户,然后添加了一个条目:
aptos move publishaptos move run --function-id 81e2e2499407693c81fe65c86405ca70df529438339d9da7a6fc2520142b591e::nicknames::initializeaptos move run --function-id 81e2e2499407693c81fe65c86405ca70df529438339d9da7a6fc2520142b591e::nicknames::add --args string:dport address:81e2e2499407693c81fe65c86405ca70df529438339d9da7a6fc2520142b591e既然我的表上有一些数据,我将如何读取dport键的值。我想我能用这个API吗?
发布于 2022-11-02 23:20:04
你是对的,你可以使用API来做这个!首先,让我们得到一些关于你的桌子的信息。
让我们看看您从上面的移动模块部署到您的帐户的资源。首先,让我们构造struct标记(也就是资源ID /句柄),如下所示:
<account_address>::<module>::<struct_name>就你而言:
0x81e2e2499407693c81fe65c86405ca70df529438339d9da7a6fc2520142b591e::nicknames::Nicknames因为Aptos区块链中的每个帐户只能有一个资源,所以我们可以使用它来唯一地标识帐户中的资源。使用它,我们就可以得到表句柄。表句柄是指向特定表的全局唯一ID (所以,不只是在帐户范围内)。我们需要它来进行任何进一步的查询,所以让我们首先得到:
$ 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.0x64fa842ed2c9da130f0419875e6c101aeea263882fadee3257b13f1bb4d7d41d.使用这个句柄,我们现在可以查询API:
$ 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"解释上述情况:
key_type的数据是表中键的类型。从0x1::string::String.value_type的原始声明中可以看出,这是nickname_to_addr值的类型。它的类型是address,这是一种特殊类型,没有部署在任何特定的模块上(因此缺少address是我们在表中查询的关键。如果假设表中使用的键更复杂,比如一个结构,而不是一个字符串那样的单个值,那么您可以在请求中将该结构表示为JSON。
{
"key_type": "0x1::string::String",
"value_type": "address",
"key": {
"first_name": "Ash",
"last_name": "Ketchum",
}
}这就是您现在可以使用API所做的工作的范围。也就是说,给你的阅读值提前知道关键。如果您想做以下事情,则需要查询索引器:
我稍后会给你写一个关于如何做这件事的答复。
https://stackoverflow.com/questions/74296605
复制相似问题