Solidity

從映射內的鍵返回每個結構值,其中鍵也是另一個映射內的數組的值

  • April 13, 2019

我有一個我正在做的項目,我正在努力想辦法按照標題所說的那樣做。我正在尋找最簡單和/或最便宜的方法(明智的),因為我被困住了,所以我願意接受更好的方法來建構我的程式碼。主要思想是使用trufflemetamask創建一個 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

希望能幫助到你。

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