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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:31:22