使用solidity讀寫產品
我是 Solidity 的新手,試圖將產品儲存在購買者錢包中並從所有者錢包中檢索資訊。我有一些想法,但不知道哪個最好。
- 將單個產品儲存在隨機地址中
- 將產品存放在所有者地址
- 將產品儲存在所有者地址中的一系列產品中
- 將產品數據作為交易儲存在所有者的錢包中
感謝您是否可以共享範常式式碼。提前致謝。
pragma solidity >=0.4.25 <0.7.0; contract ItemBill{ enum ProductState {Shipped, Store, Owned, Sale} address owner; bytes32 public name; uint public productCount = 0; struct Product { uint id; bytes32 name; bytes32 serlialNo; uint price; address UpdatedBy; bytes10 pro_state; //later change to ProductState } mapping(address => Product[]) OwnerOfProducts; //address[] public ProductAccts; //Array address of products //Product[] prod; //Array of products event ProductCreated ( uint id, bytes32 name, bytes32 serlialNo, uint price, address owner, bytes10 pro_state //later change to ProductState ); constructor() public { owner = msg.sender; } function createProduct(address _OwnerAddress, bytes32 _name, bytes32 _serialNo, uint _price, bytes10 _pro_state) public { // Require a valid name require(_name.length > 0); // Require a valid price require(_price >= 0); // Require a valid serlialNo require(_serialNo.length > 0); //Create new product Product memory p; //assign value to products p.id = productCount++; p.name = _name; p.serlialNo = _serialNo; p.price = _price; p.UpdatedBy = msg.sender; p.pro_state = _pro_state; OwnerOfProducts[_OwnerAddress].push(p); // Trigger an event emit ProductCreated(productCount, _name, _serialNo, _price, msg.sender, _pro_state ); } function getProduct(address _address) view public returns(uint, bytes32, bytes32, uint, address, bytes10) { returns(OwnerOfProducts[_address].id, OwnerOfProducts[_address].name, OwnerOfProducts[_address].serlialNo, OwnerOfProducts[_address].price, OwnerOfProducts[_address].owner, OwnerOfProducts[_address].pro_state); **//Getting ParseError: Expected primary expression. //In Remix** } function getproductcount() view public returns(uint){ returns OwnerOfProducts.length; } }
與往常一樣,這取決於 dApp 應該做什麼。從您的範例實現中,我看到
serialNumber
並推測您所理解的“產品”是一個單獨的項目,而不是一個可以大量存在或有庫存並由許多人同時擁有的庫存項目。但是請仔細考慮並確保後者與您的想法不同。我修復了最後兩個給你帶來麻煩的功能。
function getProduct(address _address, uint index) view public returns(uint, bytes32, bytes32, uint, bytes10) { Product storage p = OwnerOfProducts[_address][index]; return(p.id, p.name, p.serlialNo, p.price, p.pro_state); } function getproductcount(address _address) view public returns(uint){ return OwnerOfProducts[_address].length; }
如上所述,我不確定此資料結構是否適合您想要完成的任務,但資料結構意味著這些功能必須以某種方式實現。
這一點:
mapping(address => Product[]) OwnerOfProducts;
說,對於每個所有者地址,都有一系列產品。
因此,
getProduct
將需要地址和行來檢查。它不會返回所有者的地址,因為呼叫者需要已經知道這一點。他們把它傳進去。
getproductcount
需要知道要計算哪個所有者數組。您真正追求的可能是:
- 產品資訊的主表 - 項目。
- 製造並出售給所有者的物品實例,帶有序列號等。
- 本能地,我會從一個扁平的產品組織開始,我可以用它來發現所有者(地址或訂單的數組),以及我可以用來發現產品的所有者中的一組鍵。
對於初學者項目,您進入了一個相當高級的結構,並且對標準化結構的正確方法知之甚少。一般來說,當函式簽名和過程看起來很尷尬時,通常意味著資料結構並沒有真正映射到真實的宇宙,問題就從那裡開始了。
將單個產品儲存在隨機地址中
有一種方法可以使用 ERC721 將可序列化產品建模為 NFT。在這種情況下,產品 == 地址,但您不應該強迫這種情況發生。只有當它是自然的,否則鍵的地址是一個壞主意。
將產品存放在所有者地址
鑑於下一個問題,這聽起來像是每個所有者一個產品,這可能還不夠。
將產品儲存在所有者地址中的一系列產品中
僅當您可以僅在了解擁有它們的所有者的情況下列舉產品時才可以。
將產品數據作為交易儲存在所有者的錢包中
一切都是交易。大多數將涉及所有者的錢包。有一些針對 gas 進行優化的高級模式,但我認為這裡不適用。作為一般的啟發式方法,任何依賴於合約邏輯的東西都必須在合約狀態佈局中。
作為提示,我將通過刪除合約邏輯不需要的描述性資訊來優化儲存,因為還有其他方法可以以更低的成本儲存它。
希望能幫助到你。