Solidity
從映射內的鍵返回每個結構值,其中鍵也是另一個映射內的數組的值
我有一個我正在做的項目,我正在努力想辦法按照標題所說的那樣做。我正在尋找最簡單和/或最便宜的方法(明智的),因為我被困住了,所以我願意接受更好的方法來建構我的程式碼。主要思想是使用truffle和metamask創建一個 dApp ,一旦送出被接受,bountyPoster 可以將初始金額發送給接受的 bountyHunter。這是目前對我來說很難的兩個要求:“我能夠查看我已經發布的賞金列表。通過點擊賞金,我可以查看已提出的送出。 ”我最初的想法是將每個新的Bounty 結構連接到它的bountyId,將每個新的送出連接到它送出到的 bountyId,並通過它們對應的 submitId 將每個 bountyId 與總體上的許多送出連接起來。然後找出一種在 getBountySubmissions 函式中返回送出的方法。這就是我現在的位置。
pragma solidity >=0.4.25 <0.6.0; contract BountyHunters { enum SubmissionStates {Accepted, Pending, Rejected} enum BountyStates { Open, Closed } address owner; uint public bountyId; uint public submissionId; mapping(address => uint[]) public myBounties; mapping(uint => Bounty) public newBounties; mapping(uint => uint[]) public mySubmissions; mapping(uint => Submissions) public subs; struct Bounty { uint bountyId; uint bountyAmount; address poster; string description; BountyStates bountyState; } struct Submissions { address bountyHunter; string description; SubmissionStates subState; } constructor() public payable { msg.sender == owner; } modifier onlyOP { require(newBounties[bountyId].poster == msg.sender, "You must be the owner of the post"); _; } modifier onlyNotOP { require(newBounties[bountyId].poster != msg.sender, "You are not allowed to submit to your own bounties."); _; } modifier isOpen { require(newBounties[bountyId].bountyState == BountyStates.Open); _; } function postNewBounty( string memory _description, uint _bountyAmount) public payable returns (bool) { require(_bountyAmount > 0); require(msg.sender.balance >= _bountyAmount); bountyId++; myBounties[msg.sender].push(bountyId) - 1; Bounty memory newBounty = Bounty(bountyId, _bountyAmount, msg.sender, _description, BountyStates.Open); newBounties[bountyId] = newBounty; return true; } function proposeSubmission(uint _bountyId, string memory _description) public onlyNotOP isOpen returns (bool success) { require(bountyId >= 0 && _bountyId <= bountyId); submissionId++; Submissions memory newSubb = Submissions(msg.sender, _description, SubmissionStates.Pending); mySubmissions[_bountyId].push(submissionId) - 1; subs[submissionId] = newSubb; return success; } function getBountySubmissions(uint _bountyId) public view onlyOP returns ( address bountyHunter, string memory description, SubmissionStates subState) { }
}
我應該嘗試遍歷每個 submitId 並從那裡遍歷每個結構,還是有更好的邏輯方法來解決這個問題?我是否必須遍歷契約中的結構,或者當我到達部署階段時有更簡單的方法?任何幫助深表感謝。感謝您的時間。
你不應該訴諸迭代。事實上,你不能。
將這些視為無序集會有所幫助。有一個 crud 模式(創建、檢索、更新、刪除)可以一致地應用於您的各種關注點。關係關注點(相關文章等)本身也是集合。您可以將集合儲存在集合中,因此存在可重複使用的模式。
看看這個庫,如果不清楚,請查看該系列的前幾期。
https://medium.com/robhitchens/solidity-crud-epilogue-e563e794fde
希望能幫助到你。