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

如何在Sui Move中调用仅知字节码的无源码链上模块?

在Sui Move中调用无源码链上模块的方法

在Sui Move里,不需要像Solidity那样定义独立的接口合约,只需要在你的模块里声明和目标函数完全匹配的函数签名(包括参数、返回值、可见性),再结合目标模块的链上地址,就能直接调用该函数。

具体操作步骤

  1. 解析目标函数的完整签名:从链上字节码里找出目标函数的模块地址、函数名、参数类型、返回值类型,还有函数的可见性(比如public、entry这类)。
  2. 在你的模块里声明匹配的函数签名:只写函数的声明部分,不需要实现代码。
  3. 通过模块地址调用目标函数:用@<模块地址>::<模块名>::<函数名>的格式,配合call关键字或者直接调用的方式执行。

示例代码

假设链上有个模块(地址是0x123,模块名叫info_feed),里面有个public函数info,签名是fun info(): u64,还支持接收SUI(对应Solidity里的payable)。

你的调用模块可以这么写:

module your_package::consumer {
    use sui::coin::{Self, Coin};
    use sui::sui::SUI;

    // 声明和目标模块完全匹配的函数签名,不用写实现
    fun info(): u64;

    // 示例:调用目标模块的info函数,同时转入1个SUI
    public entry fun call_feed(target_module_addr: address) {
        // 准备要转入的SUI代币
        let coin = coin::take<SUI>(1);
        // 通过模块地址调用目标函数,把coin作为支付参数传递
        call<@target_module_addr::info_feed::info>(coin);
        // 如果函数有返回值,可以直接接收:
        // let result = call<@target_module_addr::info_feed::info>(coin);
    }

    // 自定义函数:查询当前地址的SUI余额
    public fun left(ctx: &mut TxContext): u64 {
        coin::balance<SUI>(ctx)
    }
}

注意事项

  • 函数签名必须完全一致:参数的顺序、类型,返回值类型,甚至函数的可见性(比如目标是entry函数,你的声明也要对应)都得和链上模块的函数完全匹配,不然调用会失败。
  • 支付逻辑的处理:如果目标函数需要接收SUI或其他代币,调用时要直接传递对应的Coin对象,Move里没有Solidity那种value()语法,支付是通过参数传递实现的。
  • 模块地址不能错:调用时必须指定目标模块的正确链上地址,格式是@<地址>::<模块名>::<函数名>,通过call泛型函数来完成跨模块调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:52:56