如何从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
相关产品推荐
相关产品推荐

