Solidity

使用循環的 Solidity Maps 內容列表

  • September 24, 2017

我正在 Remix (Solidity) 中開發一個測試場景。我看過一些範常式式碼,但仍不清楚這是如何完成的。我附上了一個範常式式碼(不完整),這將有助於澄清這一點。

對於以下場景,我有兩個問題:

  1. 如何為地圖創建一個循環以列印目前註冊參與者的列表。我正在使用事件來做到這一點。但是我需要一個循環來檢查註冊的參與者。
  2. 當我刪除參與者時。如何處理已註冊鍵的數組。參與者密鑰

謝謝,

pragma solidity ^0.4.11;


contract RaceParticipants {

   struct Participants {

       bytes32 id;
       bytes32 name;
       uint age;
       bool isValue;

   }

   mapping (bytes32 => Participants)  participantsMap;

   bytes32[] participantsKey;


   event LogParticipants (bytes32 id, bytes32 name, uint age);

   function ListRegisteredParticipants () {

       for (.....) {

           LogParticipants (id, name, age);

       }


   }

   function DeleteRegisteredParticipants (bytes32 _id) 
       returns (bool flag) {

       if (participantsMap[_id].isValue) {

           delete participantsMap[_id];

           return true;

       }

       return false;

   }

   function RegisterParticipants (bytes32 _id, bytes32 _name, uint _age) returns (bool flag) {

       if (!participantsMap[_id].isValue) {

           participantsMap[_id].id = _id;
           participantsMap[_id].name = _name;
           participantsMap[_id].age = _age;
           participantsMap[_id].isValue = true;

           participantsKey.push(_id);

           return true;

       }

       return false;

   }

}

這裡需要一些新的想法。歡迎來到乙太坊。;-)

您不能迭代映射中的鍵。本質上,所有鍵都存在。

此外,迭代無界列表是一種反模式。在某個階段,它會因為阻塞 gasLimit 而耗盡 gas。

因此,您希望使用在任何規模的 gas 成本大致相同的小功能。這通常意味著將迭代過程推送給客戶端,並在合約中建構“一次性”邏輯。

注意確保合約狀態始終是“完整的”,以避免競爭條件和其他怪異現象。

在這裡查看 Mapped Struct with Index 與您想要的非常接近:Solidity 是否有解決良好且簡單的儲存模式?

希望能幫助到你。

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