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

如何从debot调用其他合约的run-local函数

DeBot中调用其他合约run-local方法操作步骤

你需要调用其他合约的只读方法、读取公共变量,不需要上链发送消息、不需要消耗Gas的场景,用run-local完全可以实现,具体操作如下:

1. 前置准备

你需要提前获取以下信息:

  • 目标合约的链上地址,确认该合约已在你使用的网络部署
  • 目标合约的ABI文件,如果你只需要读取公共变量,也可以直接用TVM原生get方法调用,不需要ABI
  • 已初始化完成的TON Client实例(DeBot运行环境默认会内置该实例,不需要单独部署)

2. 核心操作流程

所有run-local调用本质都是先拉取目标合约的最新链上状态,再在本地TVM环境模拟执行方法,不需要向链上发送任何消息,步骤如下:

  • 第一步:从链上拉取目标合约的最新账户BOC(包含合约的最新代码、状态数据)
  • 第二步:调用SDK的tvm.run_local接口,传入账户BOC、要调用的方法名和参数
  • 第三步:解析返回的解码结果,拿到你需要的返回值

3. 代码示例

下面是基于官方TON Client JS SDK的通用实现,在DeBot逻辑中可以直接复用:

// 入参:目标合约地址、合约ABI、调用方法名、方法入参对象
async function runLocalMethod(targetAddress, contractAbi, methodName, inputParams) {
  // 拉取目标合约最新状态
  const accountRes = await client.net.query_collection({
    collection: "accounts",
    filter: { id: { eq: targetAddress } },
    result: "boc"
  });
  const accountBoc = accountRes.result[0].boc;

  // 本地执行调用
  const execRes = await client.tvm.run_local({
    account: accountBoc,
    abi: {
      type: "Contract",
      value: contractAbi
    },
    call_set: {
      function_name: methodName,
      input: inputParams
    },
    signature_id: null
  });

  // 返回解码后的结果
  return execRes.decoded.output;
}

// 调用示例:读取目标合约的public变量owner
const contractOwner = await runLocalMethod(
  "0:你要调用的合约地址",
  你的合约ABI对象,
  "owner", // Solidity合约中定义的public变量默认自动生成同名getter
  {}
);
console.log("合约owner是:", contractOwner);

4. 注意事项

  • 仅支持获取执行结果,不会修改链上状态:如果你调用的方法包含状态修改逻辑,本地执行的修改仅在模拟环境生效,不会同步到链上
  • 每次调用前建议重新拉取最新的账户BOC,避免拿到过期的变量值
  • 如果你调用的是合约原生TVM get方法,可以直接用tvm.run_get接口,不需要传ABI,仅需要传入方法名即可,操作更简便
  • 不需要对调用消息做签名,本地模拟执行不会做签名校验,也不会消耗任何Gas

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:15:03