Základní úvahy o návrhu pro Ethereum ÐApps (2): Jak uspořádat vaše údaje (Struktura VS. Dětská smlouva)

Ukládání dat na blockchain pomocí inteligentní smlouvy
Toto je druhá publikace série, která se zaměřuje na podporu využívání Ethereum pro stavbu DApps. Můžete si zkontrolovat první publikaci této série „Upgradable Smart Contracts“, než budete pokračovat, protože některé nápady jsou propojeny.

Který je nejlepší? Jedna inteligentní smlouva pro všechny entity nebo jedna inteligentní smlouva uzavřená pro každou entitu? Ve skutečnosti byste z mnoha důvodů a ve většině případů měli zvážit uzavření pouze jedné smlouvy, která obsahuje informace o všech vašich entitách stejného typu. Nejdříve však nejprve vezměte následující dva vzorky, abychom ilustrovali dva možné vzory, které tento článek řeší.

Dva návrhy, o kterých diskutujeme

1. návrhový vzorek: Uložte základní data všech členů do jedné smlouvy pomocí „struct“:

Ukázkový projekt, který následuje tento vzor, ​​najdete zde. Což je smlouva o chytré výměně informací o zdraví.

2. návrhový vzorek: Uložte základní data každého člena v jiné implementované verzi smlouvy

Ukázkový kód projektu, který následuje tento vzor, ​​lze najít zde. Je to pro projekt nazvaný sdílení lékařských záznamů.

Který návrhový vzor je nejlepší?

V souvislosti s ukládáním dat pro DApps do blockchainu pomocí inteligentních kontraktů je první navrhovaný návrh, který používá strukturu, lepší. Je to z následujících důvodů:

Když ukládáte data do smluv, používáte smlouvy jako tabulky

Z pohledu designu Smlouvy, které ukládají data, jsou jako tabulky, nikoli objekty. Abychom to vyjasnili, řekněme například o „lidech“ v decentralizovaném systému pronájmu vozidel. Měli byste si myslet, že máte databázi a chcete vytvořit tabulky. Při vytváření tabulky, která bude ukládat data všech lidí, byste měli uvažovat určitým způsobem. A nikdy nebudete vytvářet tabulku pro každou osobu. Podobně by smlouva měla mít na paměti tabulku. A vytvoříte jednu inteligentní smlouvu pro všechny lidi, aby tam ukládali informace uvnitř této smlouvy. Neměli byste nasazovat instanci smlouvy pro každou osobu.

Solidita je smluvní programovací jazyk

Neměli byste myslet na smlouvu jako na přesně objekt v OOP. Naproti tomu, jak navrhuje Ethereum, je Solidita smluvním programovacím jazykem. Neměli byste tedy pouze přizpůsobovat všechny své OOP. Lze však použít některé koncepty OOP, jako je dědičnost. Ale některé další pojmy by se měly lišit; jako způsob, jak navrhujeme komunikaci mezi smlouvami. Ve skutečnosti je to hlavní rozdíl mezi objektově orientovaným programováním a inteligentním programováním.

Nižší náklady (méně plynu)

Dalším hlediskem, které je třeba přidat k konstrukční perspektivě Solidity, jako inteligentního programovacího jazyka smluv, jsou náklady. Pokud půjdete s druhým navrhovaným přístupem, budete potřebovat mnohem více plynu k provozu vašeho systému. Pamatujte, že „plyn“ potřebný k realizaci smlouvy je mnohem více než plyn potřebný pro komunikaci s jinou smlouvou. Kromě toho je plyn potřebný k interakci s jinou smlouvou mnohem větší než plyn potřebný k provedení některých vnitřních operací v rámci stejné smlouvy.

I pro soukromé Ethereum znamená méně plynu stále rychlejší zpracování volání metody. Zejména proto, že volání jiné inteligentní smlouvy bude muset provést další transakci. Vzhledem k tomu, že volání metody bude probíhat ve stejné transakci.

Méně operací při aktualizaci dat

Další úvahou, která by měla přijít na mysl, je provozní režie potřebná pro správu smluv. Pokud se rozhodnete pro druhý přístup, měli byste přemýšlet o tom, kolik bolesti hlavy budete mít, pokud budete například potřebovat změnit sekundárního vlastníka smlouvy; Například v případě, že nastavíte sekundárního vlastníka (může to být také smlouva s více signy), která je spravována vaší organizací, nikoli koncovým uživatelem. Což bude třeba, pokud například koncový uživatel (člen) ztratil svůj soukromý klíč! A vy potřebujete mít tuto funkci pro ukládání dat lidí.

Méně režijních nákladů při implementaci nové logiky kódu

S odkazem na první článek této série, Upgradable Smart Contracts, můžete vidět, jak složité je udržovat upgradovatelnost a nasadit ji v případě potřeby. Chcete-li vidět, jak bolestivé by mohlo být špatné rozhodnutí, představte si, že máte deset milionů zákazníků. A řekněme, že půjdete s druhým navrhovaným designem. Nyní bude mít každý zákazník svou vlastní verzi smlouvy speciálně nasazenou. Jaké jsou náklady na aktualizaci všech těchto deseti milionů, a to i v soukromé síti Ethereum?

Můžete použít více knihoven a / nebo základní smlouvy

Namísto použití různých smluv a komunikace s nimi, přepracovat smlouvy, které obsahují data, na základní smlouvu (nebo knihovnu) používanou odvozenou třídou. Tímto způsobem by struktura, která obsahuje data a související metody čtení, přidávání, aktualizace a mazání, mohla být izolována v jiném souboru.

Pokud se tedy obtěžujete s dlouhým souborem pevnosti, který obsahuje mnoho struktur a jejich přidružené metody dohromady, jednoduše rozdělte každou strukturu s jejím souvisejícím kódem do samostatné základní třídy nebo knihovny a hlavní smlouva zdědí z těchto základních smluv. To je podle mě jeden z hlavních důvodů, proč solidnost umožňuje vícenásobné dědictví.

Příklad některé složité struktury, tržiště:

Zamysleme se nad trhem. Budete například muset zachránit prodejce / kupce, všechny produkty / služby, které prodávají / kupují, a všechny transakce, které mezi nimi probíhají.

Po zohlednění výše uvedených bodů se můžete rozhodnout uspořádat logiku do samostatných tříd a knihoven, abyste zajistili udržovatelnost a snadnou aktualizaci. V takovém případě se můžete rozhodnout uzavřít smlouvy pro každý z následujících subjektů:

  • Lidé: Chcete-li ukládat informace o lidech (protože každý kupující může něco prodat, a proto být prodávajícím, tato smlouva zachrání kupující i prodávající)
  • Produkty: Pro uložení informací o produktech.
  • Transakce: Chcete-li zaznamenávat nákupní a prodejní transakce.
  • Trh: Pro udržení logiky (Tato inteligentní smlouva by mohla zpracovat a zpracovat nákupy)

Upozorňujeme, že údaje o lidech, produktech a transakcích můžete uložit ve stejné tržní smlouvě. Avšak mít jednu inteligentní smlouvu na všechna data a logiku, jak je uvedeno v Upgradeable Smart Contracts, zkomplikuje budoucí aktualizace vašeho systému. Proto, aby byl design modulární, navrhuji uzavřít smlouvu pro People, další pro produkty a další pro Transakce. To je použít jako základní třídy pro inteligentní kontrakt Market. Tímto způsobem budou lidé, produkty a transakce obsahovat data, zatímco trh bude obsahovat vaši obchodní logiku.

Závěr

Výše uvedené body jsou vyžadovány speciálně pro DApps. A to je v případě, kdy chcete ukládat data na blockchain ve solidním stylu dělat věci. I když je však méně pravděpodobné, můžete narazit na situaci, že to nejsou platné důvody pro použití struktur nad dětskými smlouvami. A nemusí platit v jiném kontextu a v různých situacích. Ale výše uvedené jsou pro DApps nejvhodnější.