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

Move语言批量读取多地址资源的合约视图函数实现求助

批量读取多地址资源的Move合约实现及替代方案

Move合约View函数实现示例

要实现批量读取,你需要先定义承载地址-资源配对的结构体,再在View函数中遍历配对、读取资源并返回结果。以下是适配Aptos生态的完整示例(其他Move链逻辑类似,仅需调整资源读取的标准库方法):

module firstapp_addr::firstapp {
    use std::address;
    use std::vector;
    use std::string;
    // 导入Aptos账户模块用于读取资源,其他链替换对应模块
    use aptos_framework::account;

    // 存储地址与资源类型的配对
    struct AddressResourcePair has drop, store {
        addr: address,
        resource_type: vector<u8>, // 资源类型的UTF-8字节数组,如"0x1::coin::Coin<0x1::aptos_coin::AptosCoin>"
    }

    // 存储单条资源的读取结果
    struct ResourceResult has drop, store {
        addr: address,
        resource_type: vector<u8>,
        data: vector<u8>,       // 序列化后的资源数据
        error_msg: vector<u8>,  // 错误信息(资源不存在/无权限时填充)
    }

    #[view]
    public fun get_resources(mut pairs: vector<AddressResourcePair>): vector<ResourceResult> {
        let results = vector::empty();
        let len = vector::length(&pairs);
        let mut idx = 0;

        while idx < len {
            // 从向量末尾取出元素,优化遍历效率
            let pair = vector::pop_back(&mut pairs);
            let addr = pair.addr;
            let res_type = pair.resource_type;

            // 尝试读取资源,处理成功/失败场景
            let result = match account::get_resource(&addr, &res_type) {
                Ok(data) => ResourceResult {
                    addr,
                    resource_type: res_type,
                    data,
                    error_msg: vector::empty(),
                },
                Err(err) => ResourceResult {
                    addr,
                    resource_type: res_type,
                    data: vector::empty(),
                    error_msg: string::utf8(err),
                }
            };

            vector::push_back(&mut results, result);
            idx = idx + 1;
        }

        results
    }
}

关键说明

  1. 资源类型表示:Move中没有原生字符串类型,所以用vector<u8>存储资源类型的UTF-8编码,需传入完整的资源类型路径(如0x1::coin::Coin<0x1::aptos_coin::AptosCoin>)。
  2. 资源读取逻辑:示例使用Aptos标准库的account::get_resource方法,该方法支持通过资源类型字符串读取任意公开资源;其他Move链需替换为对应链的资源读取API。
  3. 错误处理:通过match捕获读取失败的情况,将错误信息转为字节数组返回,避免合约执行中断。

非合约的批量获取方案

如果不想编写Move合约,还可以通过以下方式提升效率:

  • 并行客户端请求:在客户端发起并行API请求(如JavaScript中用Promise.all),替代串行请求,可大幅缩短总耗时。
  • 链原生批量API:部分Move链提供批量查询接口,比如Aptos的POST /v1/accounts/resources支持批量传入多个地址,一次性返回所有资源;或通过GraphQL接口构造批量查询。
  • 索引服务查询:使用链上数据索引服务(如Aptos Indexer),这类服务将链上数据同步到关系型数据库,支持通过单次SQL/GraphQL查询获取多地址的目标资源。

内容的提问来源于stack exchange,提问作者KunLun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 03:11:16