Solidity

在結構中初始化結構數組

  • August 12, 2020

我正在研究“採購訂單”的案例,其中買家將在一個採購訂單(PO)下列出/訂購多個產品。

1 PO : N 產品

struct Product{
   bytes32 product_code;
   bytes32 product_name;
   uint quantity;
   uint unit_price;  
}

struct PurchaseOrder{
   bytes32 po_number;
   string po_creation_date;
   // next line is the question
   mapping( bytes32 => Product[]) products;  // or Products[] products
}

//mapping to store Purchase Orders
mapping(uint => PurchaseOrder) purchaseOrders;

uint po_number = 100;

function createPO(string memory po_creation_date,bytes32[] memory products) public returns(bool){

   require(msg.sender == buyerAddress);
   po_number++;
   purchaseOrders[po_number].po_creation_date = po_creation_date;

   for (uint256 i = 0; i < products.length; i++) {
       bytes32[] memory arr=new bytes32[](products.length);
       arr[0]= products[i];
       //bytes32 product_code = arr[0].product_code;
       purchaseOrders[po_number].products[product_code].push(Product(arr)); // how do i need to proceed ??
   }

}

參數字節32$$ $$記憶體產品 來自 nodejs 應用程序和對像數組。

我還必須能夠檢索特定買家的採購訂單下的所有產品。

改進此程式碼,或者如果此程式碼沒有意義並且可以重寫以實現相同,請隨時這樣做或指導我。

鈦酸

改進此程式碼,或者如果此程式碼沒有意義並且可以重寫以實現相同,請隨時這樣做或指導我。

問題:

  1. 這不會擴展到更大的採購訂單,因為它包含一個 O(n) 循環。https://blog.b9lab.com/getting-loopy-with-solidity-1d51794622ad
  2. 資料結構並沒有映射到我對 PO 的想法,即一對多的標題到行項目,以及一對一的行項目到產品。
  3. 單獨的映射是不可迭代的,因此這意味著無法列舉採購訂單中的產品 - 可能是不可接受的。

考慮:

  1. 使用 PO Header => LineItem(帶有數量,其他屬性)=> Product 創建資料結構。
  2. 使用較小的 O(1) 步驟分攤工作,例如創建標題、附加行項目。
  3. 將訂單項的迭代推送到契約之外。這樣,客戶端可以根據需要啟動許多小型操作,並且永遠不會耗盡gas。

如果您想為添加 Line-Items 提供僅附加過程,則可以使用簡單的數組。如果您希望在送出之前進行 CRUD 操作,請使用帶有索引和刪除的映射結構:Solidity是否有很好解決且簡單的儲存模式?

通過“承諾”,我的意思是最終的 PO 不應被更改,但在創建過程中您有多個步驟,因此您可能需要一個“最終確定”功能來結束 PO 草案的編輯並繼續完成最終文件。

希望能幫助到你。

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