Contract-Development

從合約工廠查詢多個派生合約

  • April 6, 2018

假設一個合約工廠用於生成多個子合約,每個子合約都包含相關數據。合約因子儲存派生合約的所有地址以及每個合約的唯一名稱。是否有一種簡單、有效的方法來查詢所有子契約的資訊?

例如,假設子契約代表人;是否可以編寫一個查詢來返回所有具有特定年齡、姓名和出生地點的子契約(其中這些屬性是子契約上的成員變數)。這實際上是對所有子合約執行 SQL 查詢。

顯然,天真的解決方案是從工廠內的地圖中迭代所有子契約。這無論如何都不理想。或者,可以建構一個鏈下解決方案,其中連結表與關聯的合約地址脫鏈。這個解決方案確實不理想,因為我想保留一個鏈上解決方案。這也導致了鏈上數據的重複,使區塊鏈變得多餘。

簡單來說:如果合約地址已知,有沒有辦法建立一個有效的查詢結構來搜尋合約。這聽起來很像關係數據庫,但在鏈上執行。IPFS 在這種情況下無濟於事,因為您實際上遇到了相同的查詢問題;如何有效地在所有記錄中搜尋條目中的特定子資訊。

當我剛接觸solidity 時,我曾想過類似的方法,即創建一個工廠並為每個實體創建一個新契約。這效率不高,而且會以多種方式讓您感到痛苦。

  1. 當您需要升級(修復錯誤或更改某些行為)這些子契約對象時會發生什麼?
  2. 它不像數據庫那樣工作,查詢它們中的每一個都將是非常低效和緩慢的過程

隨著時間的推移,我逐漸意識到,使用公共區塊鏈解決此類案例並不是最好的(我在 Hyperledger Fabric 中看到了類似的可能)。但如果你仍然想這樣做,你可以考慮以下:

  1. 創建一個單獨的“數據容器”契約來保存您更新業務契約時不受影響的所有對象
  2. 作為一個想法,數據容器只能儲存鍵/值,這樣新屬性就不需要您將來更改數據契約。該契約被引用為商業契約中的數據庫。
  3. 無論您可能需要什麼聚合(計數、總和),您都可以在將值儲存在數據合約中時預先計算並儲存它們。(效率不是很高,但仍然比按需迭代更好)
  4. 請記住,在合約中迭代數組是不安全的並且非常昂貴。

理想情況下,公共區塊鏈應該只用於證明某些數據/狀態的真實性。其餘的此類業務查詢和分析可以使用包含相同數據的私有儲存來完成。

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