能否用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
相关产品推荐
相关产品推荐

