Solidity

使用solidity讀寫產品

  • January 27, 2020

我是 Solidity 的新手,試圖將產品儲存在購買者錢包中並從所有者錢包中檢索資訊。我有一些想法,但不知道哪個最好。

  1. 將單個產品儲存在隨機地址中
  2. 將產品存放在所有者地址
  3. 將產品儲存在所有者地址中的一系列產品中
  4. 將產品數據作為交易儲存在所有者的錢包中

感謝您是否可以共享範常式式碼。提前致謝。

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需要知道要計算哪個所有者數組。

您真正追求的可能是:

  1. 產品資訊的主表 - 項目。
  2. 製造並出售給所有者的物品實例,帶有序列號等。
  3. 本能地,我會從一個扁平的產品組織開始,我可以用它來發現所有者(地址或訂單的數組),以及我可以用來發現產品的所有者中的一組鍵。

對於初學者項目,您進入了一個相當高級的結構,並且對標準化結構的正確方法知之甚少。一般來說,當函式簽名和過程看起來很尷尬時,通常意味著資料結構並沒有真正映射到真實的宇宙,問題就從那裡開始了。

將單個產品儲存在隨機地址中

有一種方法可以使用 ERC721 將可序列化產品建模為 NFT。在這種情況下,產品 == 地址,但您不應該強迫這種情況發生。只有當它是自然的,否則鍵的地址是一個壞主意。

將產品存放在所有者地址

鑑於下一個問題,這聽起來像是每個所有者一個產品,這可能還不夠。

將產品儲存在所有者地址中的一系列產品中

僅當您可以僅在了解擁有它們的所有者的情況下列舉產品時才可以。

將產品數據作為交易儲存在所有者的錢包中

一切都是交易。大多數將涉及所有者的錢包。有一些針對 gas 進行優化的高級模式,但我認為這裡不適用。作為一般的啟發式方法,任何依賴於合約邏輯的東西都必須在合約狀態佈局中。

作為提示,我將通過刪除合約邏輯不需要的描述性資訊來優化儲存,因為還有其他方法可以以更低的成本儲存它。

希望能幫助到你。

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