Jak vytvořit blockchainovou aplikaci s Pythonem

Jako vývojář blockchainu budete vědět více než průměrní lidé o tom, jak věci fungují pod kapotou. Budete obeznámeni s bloky, hashy, uzly, transakcemi, různými datovými typy a mnoha dalšími. Pokud však máte nějakou představu o tom, jak implementovat blockchain v konkrétním prostředí s příležitostnými uživateli, nebudete s nimi sdílet veškerou svou moudrost, natož aby jste je nutili, aby se naučili, jak se jednotlivé operace provádějí. Současní uživatelé jsou snadno rozmazlováni a rozhraní s vynikajícími uživatelskými rozhraními zajišťují skvělý uživatelský zážitek. Pokud chcete, aby byl váš projekt blockchain přitažlivější, než byste měli, měli byste jej alespoň snadno používat. To je místo, kde vstupují do hry decentralizované aplikace nebo dApps.

Decentralizované aplikace jsou novým trendem ve vývoji softwaru. Populární se staly po šílenství ICO, které začalo v roce 2017. Hlavní charakteristickou vlastností dApps je to, že se plně spoléhají na blockchain, a proto je nemůže ovládat ani zavírat žádná třetí strana. Kromě toho může dApps také využívat inteligentní smlouvy, o nichž jsme hovořili dříve, k bezpečnému a autonomnímu provádění různých operací. Jinak se dApps podobají centralizovaným aplikacím a může to být cokoli, od výměn po hry. Některé z nich můžete zkontrolovat z našeho seznamu 10 dApps zde.

Ačkoli existují některé specializované programovací jazyky pro inteligentní kontraktování a programování dApp, jako je Solidity, Vyper a Simplicity, lze pro tento účel použít i jiné jazyky. Pro účely tohoto tutoriálu jsme si vybrali Python jako jeden z nejkomplexnějších a nejuniverzálnějších jazyků. Dnes vám ukážeme jednoduchou aplikaci vytvořenou pomocí Pythonu, spustíme ji a vysvětlíme, jak to funguje. Už to neodkládejme a pusťme se do práce!

Struktura a vlastnosti dApp

Nejprve si představme, jak by dApp měl vypadat a projít si jeho prvky. Existují dvě hlavní části aplikace dApp:

  • Přední část

  • Zadní konec

Rozhraní frontend obsahuje vše, co se uživateli zobrazí. Například při procházení profilem na Facebooku komunikujete s frontendem Facebooku. Obvykle se píše pomocí HTML, CSS a JavaScript, ale existují i ​​jiné způsoby, jak to udělat. Zadní část je jako motor automobilu. Nikdo, kromě mechaniky, se na to nedívá, ale díky tomu věci fungují. Zatímco centralizované aplikace používají hostingové služby a různé rámce jako Django a NodeJS, decentralizované používají místo toho blockchainy. V obou případech komunikace mezi frontendem & backend probíhá prostřednictvím zpráv ve formátu JSON.

Měli bychom také poznamenat, že protože back-endové úlohy se dějí na blockchainu, kde je vše neměnné, inženýr vytvářející dApp by měl provádět několik hloubkových kontrol svého projektu, aby zajistil, že v kódu nebudou žádné chyby zabezpečení. Díky tomu vypadá budování dApps spíše jako výroba hardwaru než softwaru, který lze vylepšovat za běhu. Na druhou stranu, pokud je dApp napsán dokonale, je prakticky neuskutečnitelný, protože neexistuje žádný centrální bod selhání. Za druhé, kód pro dApps je obvykle publikován jako open-source. Jinak bude mít komunita problémy s důvěrou a vyhne se používání některých aplikací.

Vytváření backendu

Nyní, když víme, že dApp spoléhá na blockchain, vytvořme si ho lokálně s Pythonem. Jedná se o bezpečnější přístup k učení a testování věcí, protože nechceme zahltit skutečnou síť zbytečným kódem. Tato demonstrace je navíc nakloněna ukázat vám principy fungování věcí – dApps v reálném světě jsou mnohem složitější.

Protože se všechno stane na vašem počítači, bude blockchain fyzicky umístěn na vašem pevném disku, což z něj v podstatě udělá uzel. Za tímto účelem vytvořte složku, kam se vám líbí, a nazvěte ji „Projekt“. Ve složce vytvořme další, nazvěme ji „blockchain“ a napevno si zde vytvoříme první blok. Vytvořte textový soubor a otevřete jej v editoru kódu podle vašeho výběru. Budeme používat Atom.

Inicializace bloku geneze

V prvním bloku uvedeme, že plátce zaplatil příjemci tisíc mincí. Jak si pravděpodobně pamatujete z našeho článku o hašovací síle, hlava každého bloku je hašována a hash každého bloku je zahrnut do dalšího, aby bylo zajištěno, že nedošlo k neoprávněné manipulaci se sítí. Blok Genesis před sebou blok nemá, takže bude prázdný hash.

Genesis blokObrázek U.Today

Dále do naší složky s blockchainem vytvoříme soubor se skriptem. Začněte importem knihovny JSON, protože budeme používat toto formátování. Pokračujte „pokud __name__ == "__hlavní__": ‚Prohlášení umožňující ověření, zda bude skript spuštěn z konzoly nebo ne. Tento krok vám pomůže při importu. Aby náš místní blockchain fungoval, měli bychom napsat funkci, která vytváří nové bloky. Kromě toho by měla existovat funkce pro kontrolu, zda byl blockchain změněn nebo ne.

Psaní nových bloků

Pojďme kódovat funkci, abychom vytvořili následující bloky v řetězci. Abychom to mohli udělat, musíme specifikovat všechny datové typy, které jsme napsali v bloku genesis. Poté vytvoříme příkaz „with“ s funkcí, která vytvoří nový soubor, aby byl kód v nových blocích vhodnější pro čtení, určete odsazení. Jakmile je hotovo, můžeme spustit skript a získat soubor s naším testovacím blokem.

Nový testovací blok & amp; SkriptObrázek U.Today

Testovací funkce funguje! Nyní jej můžeme rozšířit o příjem dat a zapisovat je do dalších bloků. Abychom to mohli udělat, vložíme do funkce argumenty příjemce, částka, plátce a p_hash (hash předchozího bloku). T Poté musíme funkci nechat zapsat bloky do příslušné složky. Za tímto účelem importujte operační systém pro práci se souborovým systémem počítače. Poté ve funkci definujeme adresář, který jsme vytvořili pro naše bloky pomocí „os.curdir“. Dále zadejte toto prohlášení ve výpisu, který zapisuje nový soubor.

Jdeme dále, nemůžeme nechat testovací soubor označený tak, jak je, chceme, aby každý nový blok byl pojmenován postupně. Protože náš blok geneze je „0“, další blok by měl být 1 a tak dále. Tenhle je poměrně jednoduchý, naše funkce by měla být schopna analyzovat hlavní blockchainový adresář. Najděte nejnovější číslo nejnovějšího bloku, zvyšte toto číslo o jeden a pojmenujte další blok. K získání všech bloků použijeme ‚listdir ‘OS a poskytneme mu naši adresářovou proměnnou blockchain. Pamatujte, že „listdir“ netřídí bloky podle jejich jmen, takže nejnovější soubor, v tomto případě, nemusí být to, co potřebujeme. Proto musíme použít porozumění seznamu k vrácení celých čísel pro všechny názvy souborů a jejich třídění pomocí funkce „seřazeno“. Nakonec naučíme náš blockchain označovat bloky vrácením názvu posledního bloku a jeho zvýšením o jeden. Ujistěte se, že štítek převedete zpět na řetězec a přidáte název bloku do funkce „s“.

Funkce pro získávání blokůObrázek U.Today

Hashing

Nyní pokaždé, když spustíte skript, získáte nový blok. Stále to však není blockchain, protože uzly by také měly být schopné kontrolovat integritu, a tedy i bezpečnost dat. Každý z bloků bude mít hash předchozího. Začněme hašováním dat v blocích. Nejprve importujeme modul „hashlib“. Poté vytvoříme funkci, která přečte obsah bloku, provede je pomocí hashovacího algoritmu SHA-256 a vrátí hash. Měli byste zde zadat umístění složky „blockchain“, jinak funkce bloky nenajde. Ve funkci, která vytváří bloky, definujte proměnnou pro předchozí hash, která spustí naši hashovací funkci pro předchozí blok. Když to testujeme, vidíme, že nový blok obsahuje hash předchozího. Můžete snadno ověřit hash zkopírováním obsahu bloku číslo 1 do online generátoru SHA256 a porovnat výsledky.

Hashovací funkceObrázek U.Today

Ověření bloku

Zatím máme funkci vytváření bloků a hashovací funkci. Je čas zavést ověřovací algoritmus pro náš uzel. Funkce, kterou vytvoříme, bude schopna získat seznam všech souborů v blockchainu, přečíst hashe předchozího bloku počínaje od druhého bloku, znovu vygenerovat hash každého předchozího bloku, porovnat je a vrátit výsledek.

Začneme deklarováním proměnné, která získá všechny soubory v adresáři „blockchain“, proměnné, která vrací seznam souborů, a proměnné, která bude řadit bloky ve vzestupném pořadí. Další věcí, kterou bychom měli udělat, je umožnit funkci iterovat přes bloky a číst hashe předchozích bloků. To lze provést pomocí smyčky „pro“, která načte všechna data z bloku a vrátí pouze to, co odpovídá „hash“. Nyní k opětovnému vytvoření hodnoty hash, aby se ověřilo, zda ji funkce přijímá. Uvnitř smyčky „pro“ necháme proměnnou „true_h“, která spustí hashovací funkci pro předchozí blok. Posledním krokem je porovnání hashů pomocí příkazu „if / else“. Výsledky budou zapsány do pole, které pro ně nastavíme, a vše se zobrazí v konzole.

Ověření blokuObrázek U.Today

Po vyčištění některých propouštění máme v Pythonu kódovaný lokální blockchain.

Budování frontendu

I když se nám podařilo umístit všechny potřebné funkce pod 60 řádků kódu, pro průměrného uživatele by to stále vypadalo jako hromada nesmyslů. Proto musíme usnadnit pochopení a použití s ​​rozhraním front-end. V tomto kurzu budeme používat rámec Flask spolu s HTML, CSS a JavaScript.

Nastavení prostředí

V hlavním adresáři projektu vytvořte složku pro virtuální prostředí, která bude fungovat jako backend. Pokud jste tak dosud neučinili, stáhněte si jej Krajta z oficiální stránky nebo pomocí příkazového řádku ve vašem OS (v OSX používáme homebrew) a nainstalujte jej. Jděte dále a nainstalujte Virtualenv & Pipujte pomocí příslušných příkazů příkazového řádku. Poté spusťte virtuální prostředí z příkazového řádku ve složce „UI“. Pokud bylo vše provedeno správně, získáte novou složku. Je čas ji aktivovat a nainstalovat banku přes Pip.

Vytváření a aktivace venvObrázek U.Today

Položme náš zadní konec vedle frontendu. Vyřízněte složku „blockchain“ a skript a vložte je do složky „aplikace“ v hlavním adresáři. V rámci back-endové složky musíme vytvořit hlavní soubor skriptu.

Vytvoření struktury

V našem hlavním skriptu bychom měli nejprve importovat Flask a umístit odkaz na název souboru, aby Flask umožnil porozumět cestám. Měli bychom také dát standardní příkaz, který kontroluje, zda je skript spuštěn z konzoly a běží naše aplikace. Nezapomeňte přidat „debug“, abyste umožnili opětovné načtení baňky pokaždé, když v kódu něco změníte.

Prázdná aplikaceObrázek U.Today

Pokud v tomto okamžiku spustíte skript, uvidíte, že localhost: 5000 je nahoře, ale zobrazí chybu 404. To je normální, protože aplikace je stále prázdná. Začněme jej vyplňovat vytvořením funkce, která umožní, aby náš uzel zpracovával dotazy uživatelů. Do ní (umístěním znaku @ před funkci) vložíme funkci indexu. Tím se vytvoří struktura místních URL a odpovídajících funkcí. Funkce „index“ zobrazí uživatelům index.html prostřednictvím modulu „render_template“.

Aplikace s funkcí displejeObrázek U.Today

Nyní můžeme pokračovat ve vytváření struktury HTML. K dispozici budou dva soubory, jeden pro obecné informace a druhý pro uživatelské rozhraní první stránky. V base.html importujeme knihovnu Bootstrap pro vytváření rozložení pomocí CSS. Vytvořme centrovaný sloup a vložíme tam blok obsahu ve formátu, který lze interpretovat Flajnovou Jinjou.

První stránka v htmlObrázek U.Today

Skládání uživatelského rozhraní

Naše aplikace bude jednoduchý platební systém. Bude proveden plátce, příjemce a částka převedených peněz. Všechno se bude dělat přes blockchain, ale pro uživatele to bude vypadat jako běžná aplikace. Při převodu peněz na internetu obvykle vyplníte nějaký formulář a odešlete jej. Bootstrap má různé formy, které nám pomáhají s některými předvolbami. Můžete kopírovat ten, z kterého jsme vybrali tady a zkopírujte kód do svého index.html. V předem napsané podobě budou pouze dvě pole a zaškrtávací políčko, zaškrtávací políčko odstraníme a přidáme pole. Poté upravíme správné štítky, ID, typy a zástupné symboly. Nakonec naši indexovou funkci přiřadíme formuláři. Když uživatel zadá své jméno, částku a agenta, musí být všechny informace někde uloženy a poté zahrnuty do bloku. Za tímto účelem upravíme naše vstupní pole přidáním „názvu“ a „hodnoty“. Hodnota použije metodu „get“ k extrahování všeho, co uživatel vloží do pole „Payer“. Nezapomeňte zadat prázdný řetězec v případě, že uživatel nic nezadá.

FormulářObrázek U.Today

Vraťme se k našemu hlavnímu skriptu. Skript by měl být schopen pochopit, zda je požadavek odeslaný uživatelem POST nebo ne. Aby to bylo možné provést, naimportujeme modul požadavku z baňky a určíme metody v naší aplikaci. V rámci aplikace deklarujeme proměnné, které budou požadovat příslušná data z formuláře.

Aktualizovaná aplikaceObrázek U.Today

Jdeme dále, budeme muset předat všechna shromážděná data do nového bloku. To vyžaduje, abychom připojili hlavní skript ke skriptu, který píše bloky. K tomu v rámci příkazu „if“, který kontroluje typ požadavku, vložíme funkci „write“ s argumenty odpovídajícími tomu, co máme v našich blocích.

Propojení uživatelského rozhraní s back-endemObrázek U.Today

Nyní, když se vrátíme do našeho prohlížeče a odešleme transakci, dostaneme do naší blockchain složky nový blok, který bude obsahovat informace, které jsme sdělili. Vidíte však, že pole se neobnovila. Z tohoto důvodu musíme uživatele přesměrovat na novou instanci index.html. Nezapomeňte importovat moduly, které používáme, z Flasku. Voila, vše se obnoví po odeslání.

PřesměrováníObrázek U.Today

Konečným dotekem našeho uživatelského rozhraní bude a knoflík díky čemuž náš uzel kontroluje případná narušení zabezpečení v našem blockchainu. K tomu vytvoříme další směrování pro ověření s funkcí uvnitř. Dále se vraťme k našemu base.html a určíme další dva kontejnery pro tlačítko a výsledky ověření s horními okraji definovanými jako 5. Vložte blok do jednoho kontejneru a také do index.html.

Blok pro ověřeníObrázek U.Today

V dalším kroku zvolíme tlačítko z knihovny Bootstrap a umístíme jej do base.html ve formě. Ve formuláři vložte naši funkci „ověřit“ jako akci a připojte ji k funkci „zkontrolovat“ v hlavním skriptu. Jakmile je hotovo, vraťte se do hlavního skriptu a vložte funkci ověřování ze skriptu pro vytváření bloků do funkce kontroly. Přejít na base.html, zde chceme vytvořit smyčku „pro“ pro každou proměnnou v poli „výsledky“. Ve smyčce „pro“ vytvoříme div, který bude zobrazovat výsledky ověření.

Ověření smyčkyObrázek U.Today

Testování dApp

Takže tady to máte. Vraťte se do svého prohlížeče a obnovte stránku. Od této chvíle může naše dApp zaznamenávat transakce na blockchain a ověřovat, zda některý z bloků nebyl hacknut. Abyste se ujistili, že vše funguje, odešlete transakci s údaji podle vašeho výběru a přejděte do složky blockchain. Měli byste tam mít nový textový soubor s plátcem, částkou a příjemcem, kterého jste zadali, a hash z předchozího bloku.

Rozhraní dAppObrázek U.TodayNový blokObrázek U.Today

Vraťte se do prohlížeče, udělejte další bloky a spusťte proces ověření. Uvidíte, že v tomto okamžiku jsou všechny bloky pravé. Je čas hacknout náš uzel! Přejděte do složky blockchain a změňte jeden z bloků, které jste vytvořili před nejnovější. Nyní zpět do prohlížeče a znovu ověřte náš řetězec. Jak vidíte, náš uzel signalizuje, že jeden blok je poškozen, a neměli bychom důvěřovat datům tohoto blockchainu.

Falešné blokyObrázek U.Today

souhrn

Abychom to shrnuli, dnes jsme vám ukázali jednoduchou decentralizovanou aplikaci na místně provozovaném blockchainu. Vytváření aplikací decentralizovaným způsobem má své funkce, ale je to podobné jako vytváření běžných aplikací. Koneckonců, aplikace jsou určeny pro koncového uživatele, takže na první pohled by člověk pravděpodobně nenašel velký rozdíl.

Pokud hledáte kódování dApps, musíte znát principy technologie blockchain a pochopit, jak psát pro frontend i backend. S takovou pokročilou úrovní znalostí je lepší zvolit si rychlý a snadný programovací jazyk, jako je Python. S Pythonem budete moci vytvořit kompaktní kód i spustit místní server bez potíží. Ta druhá je velmi důležitá, protože chcete před publikováním provést všechny nezbytné bezpečnostní kontroly, protože blockchain je neměnný.

Doufáme, že vám tento výukový program hodně pomohl získat přehled o dApps. Užívat si!