首页 > 解决方案 > Solidity - “编译器错误:堆栈太深”

问题描述

想知道是否有人可以帮助我解决我在稳固合同中遇到的错误。

我得到错误“堆栈太深”。我理解错误背后的含义,但是我无法修复它。

此处发生错误(第 3 行):

function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tMarketing, uint256 tBurn) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, tMarketing, tBurn, _getRate());
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity, tMarketing, tBurn);
    }

标签: blockchainsoliditysmartcontracts

解决方案


正如文档提到的:

EVM 不是寄存器机,而是堆栈机,因此所有计算都在称为堆栈的区域上执行。它的最大大小为 1024 个元素并包含 256 位的字。

通过以下方式对堆栈的访问仅限于顶端:可以将最顶端的 16 个元素之一复制到堆栈的顶部,或者将最顶端的元素与它下面的 16 个元素之一交换。

所有其他操作从堆栈中获取最顶部的两个(或一个或多个,取决于操作)元素并将结果压入堆栈。

当然,可以将堆栈元素移动到存储器或内存中,但不可能在不首先移除堆栈顶部的情况下仅访问堆栈中更深的任意元素。

数字 16 和最后一部分很重要。

这基本上意味着 ETH 机器有一个“使用的局部变量不超过 16 个”的限制。

此外,16 也不是一个严格的限制,它可以更小,这取决于你对变量做了什么,这个限制也是由于 EVM 只能达到堆栈的特定深度以及局部变量存储在 Solidity 的堆栈中。

我建议重构您的代码并将其拆分为两个函数,并从调用者对每个数据块进行顺序查询,或者将变量压缩为结构。


推荐阅读