为啥会出现错误:“InternalCompilerError:请求的静态内存负载超过 32 个字节”?

Posted

技术标签:

【中文标题】为啥会出现错误:“InternalCompilerError:请求的静态内存负载超过 32 个字节”?【英文标题】:Why the error: "InternalCompilerError: Static memory load of more than 32 bytes requested"?为什么会出现错误:“InternalCompilerError:请求的静态内存负载超过 32 个字节”? 【发布时间】:2018-06-18 00:48:52 【问题描述】:

使用 Remix (https://remix.ethereum.org/) 并使用 struct。编译器是0.4.19+commit.c4cbbb05。 “优化”未选中。

pragma solidity ^0.4.4;

contract Test 
    struct FooBar 
        uint8 foo;
        uint16 bar;
    

    FooBar public fooBar;

    function getFooBar() public view returns(FooBar) 
        return fooBar;
    

    function setFooBar(FooBar value) public 
        fooBar = value;
    

它显示错误:“InternalCompilerError: Static memory load of more than 32 bytes requested.”

不知道为什么。在我看来,结构 FooBar 只有 3 个字节大。我的两个函数都读取/写入单个FooBar。我在这里错过了什么?

更新

对代码进行了一些重构,使其更清晰:

pragma solidity ^0.4.4;

contract Test 
    struct FooBar 
        uint8 foo;
        uint16 bar;
    

    FooBar public fooBar;

    // InternalCompilerError: Static memory load of more than 32 bytes requested.
    function setFooBar1(FooBar value) public 
        fooBar = value;
    

    // No such error.
    function setFooBar2(uint8 foo, uint16 bar) public 
        fooBar.foo = foo;
        fooBar.bar = bar;
    

显然直接传递结构体会导致编译错误,而传递单个字段则不会。想知道有什么区别。

【问题讨论】:

我对这个环境一无所知,但“内部编译器错误”通常意味着它所说的:编译器内部出现错误时:一个错误。您的程序可能正确也可能不正确。 【参考方案1】:

这似乎是一个可靠的错误 - 请参阅:

https://github.com/ethereum/solidity/issues/3361

和:

https://github.com/ethereum/solidity/issues/3069

现在还有一个用于以太坊的 Stack Exchange:

https://ethereum.stackexchange.com/

【讨论】:

谢谢@ligi。第一个问题(3361)似乎正是我在这里面临的问题。所以,谢谢你的指点。适当地注意到了论坛。 :) 虽然您的回答并没有解决问题(即使编译错误消失),但我仍然将其标记为已回答,因为它指向一个更好的页面,其中提出了相同的问题并将希望得到解决。

以上是关于为啥会出现错误:“InternalCompilerError:请求的静态内存负载超过 32 个字节”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥即使没有错误,表单也会出现错误消息?

为啥 GoogleSignInAccount 会出现此错误?

数组定义错误:为啥会出现此错误?

Android:为啥会出现这个错误?

为啥删除 UITableView 行时会出现错误?

有人可以解释为啥会出现这个错误吗?