首页 > 解决方案 > 访问嵌套映射solidity

问题描述

注意:几天前我在使用solidity 0.7.0时问过这个问题。现在我使用的是 solc 0.8.0。使用新的 ABI V2 编码,这应该是可能的。但是,我仍然卡住了。

NOTE2:我知道我可以写一个 getter 来获得特定的评论。但是,我知道 gas 成本,我需要一次性获得所有评级来计算平均值,所以我认为这是不可行的。

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

    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

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

标签: solidityweb3web3js

解决方案


您的reviews映射是在您的Restaurant结构中定义的,这就是您无法访问它的原因,您需要先访问重新启动程序才能访问其评论。

例如:

const restaurantCount = await review.methods.restaurantCount().call()
const restaurant = await review.methods.restaurants(2).call()

for(let i = 0; i > restaurant.reviewCount; i++){
     let reviewObj = restaurant.reviews[i];
     console.log(reviewObj);
};

推荐阅读