Solidity
使用循環的 Solidity Maps 內容列表
我正在 Remix (Solidity) 中開發一個測試場景。我看過一些範常式式碼,但仍不清楚這是如何完成的。我附上了一個範常式式碼(不完整),這將有助於澄清這一點。
對於以下場景,我有兩個問題:
- 如何為地圖創建一個循環以列印目前註冊參與者的列表。我正在使用事件來做到這一點。但是我需要一個循環來檢查註冊的參與者。
- 當我刪除參與者時。如何處理已註冊鍵的數組。參與者密鑰
謝謝,
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 是否有解決良好且簡單的儲存模式?
希望能幫助到你。