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

Solidity安全:合约间调用场景下fallback函数的触发时机疑问

合约调用中Fallback函数的触发时机问题

当合约A的代码执行到向合约B发送交易(且该交易符合触发fallback函数的条件)的语句时,合约B的fallback函数会立即同步执行,完全不需要等到区块确认。

以太坊的合约调用是原子性的同步执行流程:

  • 合约A发起的调用会作为当前执行上下文的一部分,直接触发合约B的fallback函数执行
  • 整个调用过程(包括合约A的调用逻辑、合约B的fallback执行)都在同一个交易的执行周期内完成
  • 只有当整个调用链(A到B的fallback)执行完成且没有异常时,这笔交易才会被打包进区块等待确认;如果执行过程中出现异常,整个交易都会回滚,不会被打包

举个简单的Solidity代码示例辅助理解:

// 合约B
contract B {
    event FallbackCalled(address sender);
    
    fallback() external payable {
        emit FallbackCalled(msg.sender);
        // 这里的逻辑会在合约A调用时立即执行
    }
}

// 合约A
contract A {
    B public bContract;
    
    constructor(address _bAddr) {
        bContract = B(_bAddr);
    }
    
    function callB() external {
        // 调用合约B中不存在的函数,触发fallback
        (bool success, ) = address(bContract).call(abi.encodeWithSignature("nonExistentFunction()"));
        // 当执行到上面这行代码时,合约B的fallback已经执行完成(或者因为异常失败)
        require(success, "Call failed");
    }
}

在合约A的callB函数执行到call语句时,合约B的fallback函数会被立即触发并执行,整个过程是同步的,所有状态变更(比如事件发射、变量修改)都会在同一个交易执行流程中完成,区块确认只是确认这笔交易已被网络认可并记录,和fallback函数的触发时机没有关系。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:15:15