Solidity
在結構中初始化結構數組
我正在研究“採購訂單”的案例,其中買家將在一個採購訂單(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 應用程序和對像數組。
我還必須能夠檢索特定買家的採購訂單下的所有產品。
改進此程式碼,或者如果此程式碼沒有意義並且可以重寫以實現相同,請隨時這樣做或指導我。
鈦酸
改進此程式碼,或者如果此程式碼沒有意義並且可以重寫以實現相同,請隨時這樣做或指導我。
問題:
- 這不會擴展到更大的採購訂單,因為它包含一個 O(n) 循環。https://blog.b9lab.com/getting-loopy-with-solidity-1d51794622ad
- 資料結構並沒有映射到我對 PO 的想法,即一對多的標題到行項目,以及一對一的行項目到產品。
- 單獨的映射是不可迭代的,因此這意味著無法列舉採購訂單中的產品 - 可能是不可接受的。
考慮:
- 使用 PO Header => LineItem(帶有數量,其他屬性)=> Product 創建資料結構。
- 使用較小的 O(1) 步驟分攤工作,例如創建標題、附加行項目。
- 將訂單項的迭代推送到契約之外。這樣,客戶端可以根據需要啟動許多小型操作,並且永遠不會耗盡gas。
如果您想為添加 Line-Items 提供僅附加過程,則可以使用簡單的數組。如果您希望在送出之前進行 CRUD 操作,請使用帶有索引和刪除的映射結構:Solidity是否有很好解決且簡單的儲存模式?
通過“承諾”,我的意思是最終的 PO 不應被更改,但在創建過程中您有多個步驟,因此您可能需要一個“最終確定”功能來結束 PO 草案的編輯並繼續完成最終文件。
希望能幫助到你。