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

Everscale Solidity responsible函数使用及callback等待与结果校验方法

Everscale Solidity responsible函数使用与回调校验指南

1. responsible函数基础用法

responsible是Everscale链原生支持的异步跨合约调用修饰符,核心作用是简化跨合约回调逻辑,无需在被调用合约中硬编码回调目标地址。
使用规则如下:

  • 被调用的responsible函数执行完成后,会自动向调用方指定的回调函数返回结果,返回时必须显式指定消息参数,固定搭配flag: 64将剩余gas全部转移给回调消息
  • 调用方调用responsible函数时,必须通过callback: 合约名.回调函数名参数指定回调处理函数
  • 注意事项:
    • 调用时传入的value必须足够覆盖被调用合约执行gas + 回调消息的gas,否则会出现消息 bounced 导致回调失败
    • 回调函数必须显式调用tvm.accept(),否则合约会默认拒收回调消息,状态变更不会生效

你提供的示例合约语法基本正确,仅存在两个笔误,修正后可正常编译:

contract A {
 uint256 a_;
 string b_;

 // 原笔误extenal修正为external
 function foo(uint256 a, string b, address c) external {
  tvm.accept();
  B(c).bar{value: 1 ton, callback: A.callback}(a, b);
 }

 function callback(uint256 a, string b) external {
  tvm.accept();
  a_ = a;
  b_ = b;
 }

 // 需补充Getter方法供SDK读取状态
 function getAB() external view returns (uint256, string) {
    return (a_, b_);
 }
}

contract B {
 // 原笔误exrnal修正为external
 function bar(uint256 a, string b) external responsible returns (uint256, string) {
  return { value: 0, bounce: false, flag: 64 } (a, b);
 }
}

2. SDK侧等待回调完成、校验结果的实现方案

Everscale是异步执行的区块链,跨合约调用分多步消息传递,不能像EVM一样仅等待单交易确认就判定执行完成,需按以下流程操作:

  1. 发送初始交易并记录消息哈希
    调用合约A的foo方法,发送交易后记录SDK返回的本次交易入站消息哈希in_msg_hash,记为hash1
  2. 监听链上消息流追踪执行链路
    订阅目标链的区块/交易事件,按消息哈希链路依次匹配:
    • 首先匹配prev_msg_hash = hash1、目标地址为合约B、调用方法为bar的跨合约消息,记录其消息哈希为hash2,代表合约A已成功发起对B的调用
    • 接着匹配prev_msg_hash = hash2、目标地址为合约A、调用方法为callback的回调消息,记录其消息哈希为hash3,代表合约B已执行完成并返回回调
    • 最后匹配prev_msg_hash = hash3的交易回执,确认回执的exit_code = 0无执行错误,代表合约A的callback函数已执行完成
  3. 校验最终执行结果
    调用合约A的getAB方法读取链上a_、b_的值,和你最初传入foo方法的参数对比,一致则代表写入操作已完成。
    额外安全校验项:可校验回调消息的发起方地址确实为合约B的地址,避免恶意地址调用callback篡改状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 06:27:03