Solidity

(Solidity)繼承:如何在基本契約中向結構添加附加屬性?

  • June 16, 2017

這是一個非常簡化的範例,但它當然也擴展到更複雜的合約,我只是還沒有找到一個優雅的解決方案。

contract Group {
   struct Person {
       uint age;
       bytes32 name;
   }
   mapping (address => Person) members;
}

contract RockBand {
   struct Musician {
       uint age;
       bytes32 name;
       bytes32 instrument;
   }
   mapping (address => Musician) members;
}

contract FootballClub {
   struct Player {
       uint age;
       bytes32 name;
       bytes32 position;
   }
   mapping (address => Player) members;
}

現在對我來說,從 Group 中創建一個“庫”並在其他兩個契約中繼承它是有意義的。但是我還沒有找到一種方法來修改子契約中定義的結構。我能想到的最好的是:

contract Group {
   struct Person {
       uint age;
       bytes32 name;
   }
   mapping (address => Person) members;
}

contract RockBand is Group{
   struct MusicianExtra {
       bytes32 instrument;
   }
   mapping (address => MusicianExtra) membersMusicianExtra;
}

contract FootballClub is Group{
   struct PlayerExtra {
       bytes32 position;
   }
   mapping (address => PlayerExtra) membersFootbalExtra;
}

這與上述功能相同,但它需要額外資訊的額外映射。此外,在更大的合約中它會變得混亂和混亂,如果你需要查看兩個映射而不是一個來獲取資訊,它可能效率較低。

我希望社區中的某個人對我有一些見解。

謝謝!:)

我明白你的目標是什麼,以及為什麼要奮鬥。總之,繼承不適用於這種方法。最基本的是結構和映射(等)永遠定義了儲存的佈局,所以它不是可以被子類擴展的東西。相反,子類需要按原樣處理儲存,而不是按它希望的那樣處理。我希望這是有道理的。

有不止一種方法可以解決這個問題,我想你可能有比頭腦中的例子更複雜的東西。這是一個總體構想。

考慮將所有常見元素隔離到 People 中,然後與更專業的類保持關係。有些人是樂隊成員,而樂隊成員總是人。我在 1:1 的基礎上使用單獨的數據儲存契約取得了一些成功。也就是說,每個實體(類)都有一個儲存合約。*在我看來,*儲存應該強制參照完整性。

一些想法和例子:https ://medium.com/@robhitchens/enforcing-referential-integrity-in-ethereum-smart-contracts-a9ab1427ff42

另一種方法是使用鍵/值對的抽象儲存佈局。這是 Consensys 的 uPort 項目採用的。使用鍵/值對的優勢在於擴展文件佈局,使用更多欄位。這裡的一些實驗工作:https ://bitbucket.org/rhitchens2/soliditystoragepatterns/src/ec5997449f4d99a2357c3b134f8794a790660a59/GeneralizedCollection.sol?at=master&fileviewer=file-view-default 。佈局基本上是:record key + field key refersTo value.

這兩種方法可以結合起來形成靈活的文件儲存,具有強制連接和“查找相關”的“肉和土豆”功能。generalizedCollection 解決了在可升級契約場景中升級類似模式的設計細節。

希望能幫助到你。

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