如何通过API读取Aptos链上Move模块Table中指定key的值?
问题描述
我在Aptos Testnet上部署了一个Move模块,模块维护了一个绑定昵称与钱包地址的Table,并且已经完成账户初始化,添加了一条nickname: dport的条目。现在需要通过API读取这个key对应的地址值。
我的模块代码如下:
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); } }
已执行的部署与初始化命令:
aptos move publish
aptos move run --function-id 81e2e2499407693c81fe65c86405ca70df529438339d9da7a6fc2520142b591e::nicknames::initialize
aptos move run --function-id 81e2e2499407693c81fe65c86405ca70df529438339d9da7a6fc2520142b591e::nicknames::add --args string:dport address:81e2e2499407693c81fe65c86405ca70df529438339d9da7a6fc2520142b591e
解决方法
方法一:添加视图函数(推荐)
Aptos官方推荐通过视图函数读取链上状态,逻辑更直观且符合规范。需修改nicknames.move模块,添加以下公开视图函数:
// 在模块中新增该函数 public fun get_nickname_addr(account_addr: address, nickname: String): address acquires Nicknames { assert!(exists<Nicknames>(account_addr), error::not_found(ENOT_INITIALIZED)); let nickname_to_addr = &borrow_global<Nicknames>(account_addr).nickname_to_addr; table::borrow(nickname_to_addr, nickname) }
重新发布模块后,即可通过Aptos的view API调用该函数查询:
# 替换<你的账户地址>为初始化Nicknames的实际账户地址 curl -X POST https://testnet.aptoslabs.com/v1/view \ -H "Content-Type: application/json" \ -d '{ "function": "81e2e2499407693c81fe65c86405ca70df529438339d9da7a6fc2520142b591e::nicknames::get_nickname_addr", "arguments": ["<你的账户地址>", "dport"] }'
方法二:直接查询Table(无需修改模块)
如果不想修改现有模块,可通过Table的handle和key的哈希值直接查询:
- 获取Table的handle
调用API获取账户下的Nicknames资源,从中提取Table的handle:
# 替换<你的账户地址>为实际地址 curl https://testnet.aptoslabs.com/v1/accounts/<你的账户地址>/resources/friends::nicknames::Nicknames
返回结果中nickname_to_addr字段的值即为Table的handle(格式类似0x123...)。
- 计算key的哈希值
Aptos的Table对String类型key使用std::hash::hash计算哈希,可通过Aptos CLI快速获取:
aptos move hash --type string --value "dport"
得到哈希值(格式类似0xabc...)后,执行以下API查询条目:
# 替换<Table handle>和<key哈希值>为实际值 curl https://testnet.aptoslabs.com/v1/tables/<Table handle>/items/<key哈希值>
返回结果中的value字段即为dport对应的地址值。
内容的提问来源于stack exchange,提问作者Daniel Porteous
相关产品推荐
相关产品推荐

