Contract-Design

你將如何建構這個智能合約:所有權百分比、ERC777、UI 流程?

  • April 26, 2022

我正在嘗試熟悉設計 Solidity 智能合約的模式。

例如,假設我正在嘗試為其中包含多個餐廳的****購物中心建模。每個餐廳可以有多個所有者擁有該餐廳的股份。擁有超過 50% 所有權的人是餐廳的主要所有者。每家餐廳都有估值。人們使用 MALL 代幣來交易餐廳的所有權。

顯示主要模型實體:包含多人擁有的餐廳的商場

現在假設我有以下使用者界面。

  • (1) “投標人”可以看到餐廳的所有者名單,並可以提出購買餐廳所有者的全部或部分股份的要約。他們可以按市場價值或高於/低於市場價值出價
  • (2) 業主可以看到各種報價並選擇接受/拒絕報價。

2 個使用者界面,用於投標和接受/拒絕投標

使用 ERC20 代幣,您需要先進行允許交易,然後再進行實際交易,所以我認為使用 ERC777 可以簡化工作流程。

“商城”合約可以是“商城”ERC777 代幣的“運營商”。

我認為實際的投標可能發生在鏈下。

當投標被接受時,就是將某些內容寫入區塊鏈的時間(確認所有者願意出售其份額、出售數量和價值的東西)。

否則我覺得它會變得太混亂 - 如果投標人每次投標都必須轉移代幣,那麼所有者可能會故意不回應並佔用投標人的資金。顯然我可以使用某種時間計算。但是,即使有一個視窗讓所有者接受/拒絕,而不會讓我自己的成本太高,也需要一些 UI/機制讓投標人去取回他們的資金減去費用(這不是一個好的使用者體驗! )

因此,簡而言之,我一直在試圖找出編寫此智能合約的最佳方法,而不會使使用者界面過於復雜或對最終使用者造成負擔。我覺得這在 Solidity 世界中很常見,但儘管進行了大量搜尋,但我找不到如何實現這一點的最佳實踐。

我會為每個商場創建一份 ERC1155 契約。ERC1155 允許在單個合約中創建多個代幣,這正是您所需要的。每個令牌都由一個令牌來區分id。我會讓第一個令牌 ( id = 0) 成為商場令牌。創建的所有其他代幣 ( id >= 1) 將是餐廳代幣。

合約必須定義一個SHARE_PRECISION全域變數,該變數將表示創建餐廳時鑄造的餐廳代幣數量。

您必須創建一個createRestaurant函式,它接受一個元組數組(address _address, uint256 _proportion),其中_address是餐廳的股東,並且_proportion是 SHARE_PRECISION 的一部分。呼叫此函式時,所有地址都會收到_proportion一定數量的代幣。合約必須檢查_proportion數組 = 中所有值的總和SHARE_PRECISION

要交易餐廳代幣,executeTrade必須創建一個函式。該函式必須作為參數:

  • 餐廳令牌 ID ( _id)
  • 購買的餐廳代幣數量 ( _amount)
  • 商場代幣成本 ( _cost)
  • 賣家地址 ( _seller)
  • 賣方簽字(_sig

賣家的簽名是通過編碼(_id, _amount, _cost)和簽名生成的_seller。然後這個簽名被鏈下(我想是通過你的應用程序)傳遞給買家。

買方然後呼叫executeTrade()傳遞所有上述參數的函式。最初驗證簽名是否有效,executeTrade()確保_id_amount和都是合法參數。然後合約驗證買方的商城代幣。然後它將商城代幣的數量轉移到. 最後,它將餐廳代幣的數量從買家那裡轉移給買家。_cost``_seller``balance >= _cost``_cost``_seller``_amount``_id``_seller

必須重寫 transferFrom 函式才能:

  • 使所有id >= 1(餐廳代幣)的代幣不可轉讓,除非從createRestaurant()or呼叫executeTrade()

代幣id = 0(商城代幣)將像任何其他 ERC-20 代幣一樣自由轉讓。

所有的投標過程都可以在鏈下處理。一旦餐館老闆接受了投標,他就會簽署一條消息,然後將其發送給買家。然后買方執行交易。考慮到executeTrade()已經驗證了交易,您也可以覆蓋令牌轉移批准,但這需要更深入的解釋。

如果您需要其他幫助,請隨時提出。

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