Solidity是否存在Java static关键字等效实现 实现跨合约状态共享
问题原因
返回值为0的核心逻辑是:Solidity 合约继承不会在多个子合约间共享状态存储。
当你独立部署CallerOne和CallerTwo时,两个合约会各自拥有一份独立的p变量存储副本:
- 调用
CallerOne.change1()修改的是CallerOne合约自身存储槽位里的p - 调用
CallerTwo.Get2()读取的是CallerTwo合约自身存储槽位里的p
两份存储完全隔离,互不影响。Solidity 本身不存在面向类的静态变量设计,所有状态变量都绑定到所属的合约实例,不同合约实例的存储天然独立。你之前尝试引入接口仍然失败,本质也是没有让两个合约指向同一份共享存储。
解决方案
要实现跨合约读写同一份p值,标准做法是将共享状态抽离为单独部署的存储合约,所有需要操作该状态的合约都指向这同一个已部署的存储合约实例交互。
修正后代码
// 共享存储合约,仅需部署1次 contract SharedMaster { uint p; function changep() public { p = 1; } // 读取方法添加view标识,调用时不消耗链上gas function getP() public view returns(uint) { return p; } } contract CallerOne { SharedMaster public immutable sharedMaster; // 部署时传入SharedMaster的链上地址 constructor(address _sharedMaster) { sharedMaster = SharedMaster(_sharedMaster); } function change1() public { sharedMaster.changep(); } function Get1() public view returns(uint) { return sharedMaster.getP(); } } contract CallerTwo { SharedMaster public immutable sharedMaster; // 部署时传入和CallerOne完全一致的SharedMaster地址 constructor(address _sharedMaster) { sharedMaster = SharedMaster(_sharedMaster); } function Get2() public view returns(uint) { return sharedMaster.getP(); } }
操作流程
- 第一步:部署
SharedMaster合约,记录部署后的合约地址 - 第二步:部署
CallerOne,构造函数参数填入刚才记录的SharedMaster地址 - 第三步:部署
CallerTwo,构造函数参数填入和第二步完全相同的SharedMaster地址 - 依次调用
CallerOne.change1()、CallerTwo.Get2(),即可得到预期返回值1
内容的提问来源于stack exchange,提问作者VibhuM
相关产品推荐
相关产品推荐

