Solidity跨合约访问问题:Fetch合约无法获取SimpleStorage的storeData值
问题原因及解决方案
核心问题
你的Fetch合约中,demo = new newSymbol.SimpleStorage()这行代码是创建了一个全新的SimpleStorage合约实例,和你手动部署、并调用set赋值的那个SimpleStorage合约是完全独立的两个合约,它们的状态变量storeData互不共享,自然无法获取到你手动赋值的那个值。
解决方案
方案1:关联已部署的SimpleStorage合约
修改Fetch合约,让它在部署时接收你已经部署好的SimpleStorage合约地址,直接关联到该实例,而不是创建新实例:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import * as newSymbol from "contracts/Hello.sol"; contract Fetch { newSymbol.SimpleStorage public demo; // 构造函数传入已部署的SimpleStorage合约地址 constructor(address _simpleStorageAddr) { demo = newSymbol.SimpleStorage(_simpleStorageAddr); } function getStoreData() public view returns(uint) { return demo.get(); } }
部署步骤:
- 先部署
Hello.sol中的SimpleStorage合约,调用其set函数为storeData赋值; - 部署
Fetch合约时,将刚才部署的SimpleStorage合约地址填入构造函数参数; - 调用
Fetch的getStoreData,即可获取到已赋值的storeData值。
方案2:让Fetch管理自身创建的SimpleStorage实例
如果你希望Fetch自己创建并管理SimpleStorage实例,需要在Fetch中添加调用set的函数,或者在构造函数中初始化值:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import * as newSymbol from "contracts/Hello.sol"; contract Fetch { newSymbol.SimpleStorage public demo = new newSymbol.SimpleStorage(); // 添加调用SimpleStorage set函数的方法 function setStoreData(uint x) public { demo.set(x); } function getStoreData() public view returns(uint) { return demo.get(); } }
使用步骤:
- 部署
Fetch合约; - 调用
Fetch的setStoreData函数为内部的SimpleStorage实例赋值; - 调用
getStoreData即可获取到对应的值。
补充说明
在Remix虚拟机或Sepolia测试网中,每一次合约部署都会生成一个独立的合约地址,不同地址的合约状态完全隔离。你之前的操作相当于部署了三个合约:手动部署的SimpleStorage、Fetch合约、以及Fetch内部创建的新SimpleStorage,这三个合约相互独立,状态不共享。
内容的提问来源于stack exchange,提问作者Pramod Mallick
相关产品推荐
相关产品推荐

