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

Solidity编译报错Stack too deep求助(附投票合约代码)

Solidity编译错误:Stack too deep问题解决(投票合约场景)

错误原因

你遇到的CompilerError: Stack too deep是因为EVM栈深度存在限制(默认最多容纳16个元素),报错的getVoterByElection函数返回7个独立数组,加上函数内部的局部变量,超出了栈的承载能力。


解决方案一:快速编译配置(无需修改代码)

通过启用IR编译和优化器,让编译器自动处理栈空间问题,步骤如下:

  1. 打开项目根目录的hardhat.config.js(或.ts)
  2. 修改Solidity配置块,添加viaIR和优化器设置:
module.exports = {
  solidity: {
    version: "0.8.9",
    settings: {
      optimizer: {
        enabled: true,
        runs: 200, // 优化目标:合约执行200次后的成本最优
      },
      viaIR: true, // 使用中间表示层编译,优化栈管理
    },
  },
};
  1. 重新执行编译命令即可通过。

解决方案二:代码优化(从根源解决,推荐长期维护)

通过合并返回值为结构体,减少栈内变量数量,以getVoterByElection为例:

步骤1:新增返回用的结构体

在合约内(比如Voter结构体后面)添加:

// 用于批量返回选民信息的结构体
struct VoterInfo {
    uint256 voterId;
    string name;
    address voterAddress;
    bool votedStatus;
    uint256 weight;
    uint256 vote;
}

步骤2:修改getVoterByElection函数

替换原函数为以下代码:

function getVoterByElection(uint256 _election_id)
    public
    view
    returns (
        uint256 voterCount,
        VoterInfo[] memory voterInfos
    )
{
    require(
        _election_id > 0 && _election_id <= _electionID.current(),
        "Invalid election ID"
    );

    // 先统计符合条件的选民数量
    uint256 count = 0;
    for (uint256 i = 0; i < voterAddress.length; i++) {
        if (voters[voterAddress[i]].election_id == _election_id) {
            count++;
        }
    }

    // 创建结构体数组并填充数据
    VoterInfo[] memory finalVoterInfos = new VoterInfo[](count);
    count = 0;
    for (uint256 i = 0; i < voterAddress.length; i++) {
        Voter storage voter = voters[voterAddress[i]];
        if (voter.election_id == _election_id) {
            finalVoterInfos[count] = VoterInfo({
                voterId: voter.voter_id,
                name: voter.name,
                voterAddress: voter.voter_address,
                votedStatus: voter.voter_voted,
                weight: voter.voter_weight,
                vote: voter.voter_vote
            });
            count++;
        }
    }

    return (count, finalVoterInfos);
}

优化说明

  • 用单个结构体数组替代7个独立返回数组,大幅减少栈内变量数量
  • 同样的优化逻辑可以复用在getCandidatesByElection和getElections函数上,避免后续出现同类错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:37:17