【问题标题】:Access mapping of mapping of structs in web3.jsweb3.js中结构映射的访问映射
【发布时间】:2021-04-18 20:03:48
【问题描述】:

假设我有这个数据结构布局:

    struct ReviewStruct {
        string rating;
        ...
    }

    struct Restaurant {
        ...
        uint reviewCount;
        mapping(uint => ReviewStruct) reviews;
    }

    uint public restaurantCount = 0;
    mapping(uint => Restaurant) public restaurants;

然后,当我尝试访问我的 JS 应用程序中的内容时,它可以工作,但如果我尝试访问实际评论则不行:

const restaurantCount = await review.methods.restaurantCount().call() // works
const restaurant = await review.methods.restaurants(2).call() // works
const reviewObj = await review.methods.restaurants(2).reviews(0).call() // throws an error

如何访问映射内部的映射(两者都与结构相关)?

【问题讨论】:

    标签: ethereum solidity web3


    【解决方案1】:

    在旧的 ABI v1 编码中,公共函数不能返回结构,包括为您的映射自动生成的。这根本不可能。您需要创建自己的访问器函数,将字段值作为元组(值列表)返回或使用supports ABI v2 encoding 的工具链。

    此外,我不确定是否会为映射的映射自动生成访问器函数,因此无论如何您都可能最终编写自己的函数。

    【讨论】:

    • 您好,我已按照您的回答升级到 solc 0.8.0,但该行仍然无法正常工作。例如,您能否就如何获取restaurants[2].reviews[3] 提供一些指导? (考虑到上面已经在我的 web3js 代码中工作的示例)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    相关资源
    最近更新 更多