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

能否用address(this)调用合约?Solidity合约自身作为调用方实现方法

在Solidity中让函数调用方为合约自身地址的实现方案

是否可行?

可行。通过合约外部调用自身函数的方式,就能让被调用函数的msg.sender变为合约自身地址address(this)。

代码示例

以下是Solidity实现示例:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SelfCallDemo {
    // 外部函数,返回当前调用方地址
    function getCaller() external view returns (address) {
        return msg.sender;
    }

    // 调用自身的getCaller函数,此时getCaller的msg.sender为合约自身
    function callAsSelf() external view returns (address) {
        // 使用this.发起外部调用,触发EVM更新msg.sender为合约地址
        return this.getCaller();
    }
}
  • 当外部用户调用callAsSelf()时,callAsSelf()通过this.getCaller()发起对自身的外部调用,此时getCaller()函数的msg.sender会被EVM设置为address(this)。
  • 注意:如果是直接内部调用(比如getCaller()),msg.sender会保持为外部调用者的地址,因为内部调用属于同一执行上下文,不会触发EVM的调用上下文切换。

是特性限制还是语言约束?

这是EVM(以太坊虚拟机)的特性,而非Solidity的约束。msg.sender的值由EVM根据当前调用的发起者决定:

  • 外部用户发起调用时,msg.sender是用户地址;
  • 合约发起外部调用(哪怕是调用自身)时,msg.sender是发起调用的合约地址。

其他区块链语言的实现

只要底层虚拟机支持合约/程序发起对自身的外部调用,就能实现类似需求:

  • Vyper(以太坊生态):和Solidity基于同一EVM,实现逻辑一致
    # SPDX-License-Identifier: MIT
    pragma vyper ^0.3.7;
    
    @external
    def get_caller() -> address:
        return msg.sender
    
    @external
    def call_as_self() -> address:
        return self.get_caller()
    
  • Solana(Rust):Solana的执行模型与EVM不同,但可以通过程序发起对自身的调用,并指定程序地址为调用身份,实现类似效果(具体实现需结合Solana的程序签名机制)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:17:11