Solidity

如何解決“TypeError:公共狀態變數不允許使用內部或遞歸類型”?堅固性

  • September 16, 2022

我為使用者在solidity 中的賭注提供了以下映射。

mapping(address => AllUserStakedTimestamp) internal allUserStakes;

struct AllUserStakedTimestamp {
   bool[] _wasUnstaked;
   bool[] _autoRenewal;
   uint[] _amountStaked;
   uint[] _timeOfStake;
   uint[] _timesOfRelease;
   uint[] _optionReleaseSelected; // 0-1-2
   uint[] _epochDuration;
   uint[] _rewardPerCycle;
   uint[] _finalStakeReward;
}

我現在已經寫完合約,需要從前端/web3.js 中取回一些這樣的數據,但是現在才意識到我會遇到這個錯誤:

TypeError: Internal or recursive type is not allowed for public state variables.
--> 11 - NewPublic.sol:72:5:72 | mapping(address => AllUserStakedTimestamp) public allUserStakes;

我怎樣才能在不出現此錯誤的情況下使數據“公開”,因為該結構已被許多其他可靠功能使用,並且修改它或將其拆分為更小的部分將需要從一開始就完全重寫功能和錯誤搜尋.

有什麼建議嗎?

mapping(address => AllUserStakedTimestamp) public allUserStakes;

struct AllUserStakedTimestamp {
   bool[] _wasUnstaked;
   bool[] _autoRenewal;
   uint[] _amountStaked;
   uint[] _timeOfStake;
   uint[] _timesOfRelease;
   uint[] _optionReleaseSelected; // 0-1-2
   uint[] _epochDuration;
   uint[] _rewardPerCycle;
   uint[] _finalStakeReward;
}

那會做的。在那裡你必須公開而不是內部。

只要知道solidity中有四種類型的函式可見性:

  • 上市
  • 私人的
  • 內部的
  • 外部的。

Public:該函式可以被合約內部和合約外部的任何人呼叫。

Private:該功能僅在合約內部可用。當您分配此可見性時,該功能甚至無法繼承。

內部:就像私有一樣,但它支持繼承。您可以繼承該功能。

External : 函式只能被合約外部訪問。如果函式可見性是外部的,這意味著它在內部是不可訪問的。

您可以在此處閱讀有關功能可見性的更多資訊。

告訴我它是否有幫助!

找到解決方案,而不是重寫整個資料結構,我可以創建一個公共函式來檢索數據,如下所示:

function checkStakeByIndex(uint _stakeIndexNo) public view returns(
   string memory,                                                          // - 0 legend below:
   bool,                                                                   // - 1 WU  - was unstaked
   bool,                                                                   // - 2 AR  - automatic renewal
   uint,                                                                   // - 3 AS  - amount staked
   uint,                                                                   // - 4 TOS - time of stake
   uint                                                                    // - 5 TOR - time of release                                                                    // - 7 ED - epoch duration
   ){return(
   "1 - WU | 2 - AR | 3 - AS | 4 - TOS | 5 - TOR :",                       // - 0 legend below:
   allUserStakes[msg.sender]._wasUnstaked[_stakeIndexNo],                  // - 1 WU  - was unstaked
   allUserStakes[msg.sender]._autoRenewal[_stakeIndexNo],                  // - 2 AR  - automatic renewal
   allUserStakes[msg.sender]._amountStaked[_stakeIndexNo],                 // - 3 AS  - amount staked
   allUserStakes[msg.sender]._timeOfStake[_stakeIndexNo],                  // - 4 TOS - time of stake
   allUserStakes[msg.sender]._timesOfRelease[_stakeIndexNo]);              // - 5 TOR - time of release                 
   }

這不是最漂亮但比更改所有程式碼以及從該資料結構繼承的所有其他內容更好。

引用自:https://ethereum.stackexchange.com/questions/135749