Contract-Development

Dapp 架構

  • December 16, 2020

我一直在開發一個 dApp,使用者可以在其中創建比賽並設置比賽的屬性,如比賽開始日期、結束日期、玩家數量、入場費等。可以有 N 個並行執行的比賽。每個玩家每 5 分鐘會有一次第三方 API 呼叫,計算每個玩家的一些分數。

比賽將在定義的結束日期自動結束,獲勝者由第三方 API 呼叫計算的分數決定。任何人都可以參加比賽。所以,我們有比賽數據和球員數據。

我不確定相同的契約結構。我是否必須保留合約上的所有數據,或者我可以將一些數據從區塊鏈中取出,以及呼叫第三方 API 並在合約結束日期呼叫合約?多個比賽會在同一個契約上執行,還是我需要為每個比賽重新部署契約?

任何幫助,將不勝感激。謝謝

我不想提供太多細節,因為我認為稍微努力一下,你可以自己寫出來。只是給出一些提示。歡迎其他人提出建議,更好的建模方法等。

一個好的方法可能是創建一個名為 Contest 的結構(在智能合約 ContestHost 中定義),它具有與合約相關的內在屬性(名稱、描述、entryFee、startblock、endblock、參賽者數組、目前質押的乙太幣、 isActive 等)。由於沒有內置日期等概念,您可以考慮用 startBlock 和 targetBlock 概念替換它。查看下面的 AuctionHouse 範例以更好地理解這一點。

這個 struct Contest 將被一個合約(比如 ContestHost)使用,該合約有一個 Contests 數組以及 Contest 和一些特定屬性之間的映射(以使其有效地訪問每個比賽)。

該合約應具有開始比賽的功能(返回唯一的 uint id),通過發送乙太幣和地址來參加比賽,並保持每次比賽的總賭注。

最後,您可以查看這些連結以獲得更好的想法。

拍賣行:https ://github.com/dob/auctionhouse/blob/master/contracts/AuctionHouse.sol

未來延遲執行的事務調度:這有助於在 targetBlock 執行“ContestClose”事務。https://www.ethereum-alarm-clock.com/

隨機數生成(有人說很慢,但保證是隨機的):https ://github.com/randao/randao

安全支付的提款模式:https ://solidity.readthedocs.io/en/v0.4.24/common-patterns.html#withdrawal-from-contracts

更新:另外,你提到可能有一個鏈下第三方 API 函式,你需要每 5 分鐘呼叫一次,以更新每個玩家的狀態。您應該考慮使用側鏈來託管您的整個智能合約(例如Matic Network,它是一種權益證明側鏈,與乙太坊主網 100​​% 兼容,並且只需要對已部署的網路進行一行更改提供者)。

成本可以顯著降低(大約 100 倍),因此這可以使其非常經濟,一旦 ETH2.0 功能齊全(或者考慮到用於 Solidity 程式碼的 Cardano 側鏈可能很快就會出現),您就可以移動它到相關的主網上。

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