You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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的哈希值直接查询:

  1. 获取Table的handle
    调用API获取账户下的Nicknames资源,从中提取Table的handle:
# 替换<你的账户地址>为实际地址
curl https://testnet.aptoslabs.com/v1/accounts/<你的账户地址>/resources/friends::nicknames::Nicknames

返回结果中nickname_to_addr字段的值即为Table的handle(格式类似0x123...)。

  1. 计算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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 08:10:30