DApp 儲存交易以外的數據?
出於說明的目的,假設我想創建一個去中心化版本的 Yelp。
一種集中的方法是在 Mysql 數據庫中擁有一個
restaurants
表和一個reviews
表。對於 DApp,儲存非事務性數據的最佳實踐是什麼?我目前的想法是有一個
Restaurant.sol
契約和一個Review.sol
契約,每個契約都有一個從作為鍵的記錄 ID 到作為值的記錄對象的映射。每次添加餐廳時,我們都會呼叫addRecord()
in 中的方法Restaurant
,將新的餐廳數據添加到其目前映射中。(類似的流程Review
)這種將契約處理為 RDBMS 表的方法是否穩健?還是我錯過了什麼?
合約映射中可以儲存的數據量有什麼限制?
編輯:據我了解,更改
Restaurant
契約的映射將花費乙太幣。那麼這意味著添加到“數據庫”中的每條新記錄都需要花錢嗎?在不需要使用者付費的情況下執行應用程序的經濟可行方式是什麼?請指教。
首先,您不想將契約視為類似於表格。每個合約可以保存多個資訊映射。您可以有一個 ReviewSystem.sol,它同時具有餐廳和評論的映射,並且根據您之前建議的內容,您可以擁有將記錄添加到儲存在合約中的映射的方法
addRestaurant()
。addReview()
也就是說,合約沒有很好的標準化關係數據機制。在關係數據庫中,如果您有“餐廳”記錄,您可以查詢與某家餐廳相關的所有評論,並且借助索引和查詢規劃器的強大功能,可以非常快速地獲取該資訊。在乙太坊中,您的選擇更加有限。如果您沒有索引,則必須掃描系統中的每條評論,以查看它是否與相關餐廳有關。如果您確實有索引,則會增加將記錄寫入契約的成本。您還可以對數據進行非規範化以加快查找速度,但同樣要以增加契約儲存為代價。
一種選擇是將您的一些資訊保持在鏈外。例如,您可以使用從“評論”到“餐廳”的指針來保留您的餐廳和契約評論。另外,您可能有一個傳統的數據庫來索引從評論到餐廳的關係。當有人通過您的 DApp 添加評論時,契約會儲存規範資訊,而單獨的數據庫會保留資訊的副本。當有人想要查找與某家餐廳相關的評論時,他們可能會查詢一個由數據庫支持的 API,該 API 可以快速返回評論的 ID,並且他們可以自己從區塊鏈中獲取評論。在這種情況下,所有關鍵資訊都可以在鏈上獲得,並且可以從合約狀態重構鏈下索引。要了解如何跟踪鏈下合約事件,事件和日誌。
正如您在編輯中指出的那樣,您保存到契約中的每條資訊都會消耗氣體,而氣體又會消耗乙太幣。執行像 Yelp 這樣擁有數十萬家企業和數千字評論的服務可能會非常昂貴。您可以通過在鏈下儲存更多資訊來減輕一些成本。鏈上的評論可能由星級和書面評論的雜湊組成,然後從鏈下來源(例如我們之前討論的數據庫)或另一個去中心化系統(例如 ipfs)中檢索評論文本。
但總的來說,我認為乙太坊區塊鍊是你儲存不想信任第三方管理的資訊的地方。諸如 ERC20 代幣、ENS 和分佈式交易所之類的東西是一個很好的案例,因為否則很難在中心化實體中建立信任。雖然擁有去中心化審查服務之類的東西會很好,但契約儲存的成本加上信任第三方管理該資訊的風險相對較低,使其對區塊鏈的吸引力降低。