【问题标题】:Struct containing a (nested) mapping cannot be constructed. in solidity无法构造包含(嵌套)映射的结构。坚固
【发布时间】:2021-10-13 19:43:42
【问题描述】:

我使用的是solidity版本pragma solidity 0.8.6;

我有一个这样的结构:

   struct Request {
    string description;
    uint256 value;
    address recipient;
    bool complete;
    uint256 approvalCount;
    mapping(address => bool) approvals;
}

当我需要为该结构创建实例时,它会显示此错误:

无法构造包含(嵌套)映射的结构

    Request memory newRequest = Request({
        description: description,
        value: value,
        recipient: recipient,
        complete: false,
        approvalCount: 0
    });

当我需要转移时它会显示这个错误:

       request.recipient.transfer(request.value);

“发送”和“转移”仅适用于“应付地址”类型的对象,而不适用于“地址”。

有什么问题吗?我该如何解决这个问题?

【问题讨论】:

标签: solidity smartcontracts


【解决方案1】:

从 Solidity v0.7.0 开始更改(不安全功能)

如果存储中的结构或数组包含映射,则它们的分配将不起作用。以前,在复制过程中会静默跳过映射 操作,容易产生误导和错误。

请参阅 v0.7.0 重大更改: https://docs.soliditylang.org/en/v0.8.9/070-breaking-changes.html

编辑:解决方案:首先将您的结构实例添加到存储中

【讨论】:

    【解决方案2】:

    这是一个故意的限制。见Disallow mappings in memory and copying mappings。问题是映射由于它们的布局而只允许在存储中,并且不能真正与结构一起复制(参见my answer for "How to return an array of structs that has mappings nested within them?")。

    过去可以在memory 中创建一个包含映射的结构,但这只会将映射留空。这种无声的行为很容易导致错误,从 0.8.0 开始,它被明确禁止。

    您的解决方案取决于您想要完成的具体目标。要么制作一个没有映射字段的单独结构以在内存中使用,要么更好地避免将其复制到内存中。

    您可以将newRequest 设为存储变量,并在您发出新请求时覆盖。您也可以将类型更改为Request[],并在创建新类型时使用push() 以保留旧类型。

    【讨论】:

      猜你喜欢
      • 2020-12-29
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多