Kā izveidot blokķēdes lietojumprogrammu ar Python

Būdams blockchain izstrādātājs, jūs daudz vairāk nekā vidēji zināt cilvēkus par to, kā lietas darbojas zem pārsega. Jums būs zināmi bloki, jaucējkrāni, mezgli, darījumi, dažādi datu veidi un daudz kas cits. Tomēr, ja jums ir kāda ideja par to, kā ar ikdienas lietotājiem ieviest blokķēdi noteiktā vidē, jūs nedalīsities ar viņiem visu savu gudrību, nemaz nerunājot par to, ka piespiežat viņus uzzināt, kā tiek veikta katra atsevišķa darbība. Mūsdienu lietotāji tiek sabojāti ar vienkāršām un saskarnēm ar izcilām lietotāja saskarnēm, kas nodrošina lielisku lietotāja pieredzi. Ja jūs vēlaties padarīt savu blokķēdes projektu pievilcīgāku, nekā jums vajadzētu, vismaz, lai tas būtu ērti lietojams. Tieši šeit parādās decentralizētas lietojumprogrammas vai dApps.

Decentralizētas lietotnes ir jauna tendence programmatūras izstrādē. Viņi kļuva populāri pēc ICO traku, kas sākās 2017. gadā. Galvenā dApps atšķirīgā iezīme ir tā, ka viņi pilnībā paļaujas uz blokķēdi un tāpēc neviena trešā puse nevar tos kontrolēt vai izslēgt. Turklāt dApps var izmantot arī viedos līgumus, par kuriem mēs iepriekš runājām, lai droši un autonomi veiktu dažādas darbības. Pretējā gadījumā dApps atgādina centralizētas lietotnes un var būt jebkas, sākot no apmaiņas līdz spēlēm. Dažus no tiem varat pārbaudīt no mūsu 10 dApps saraksta šeit.

Lai gan viedajam līgumam un dApp programmēšanai ir dažas īpašas programmēšanas valodas, piemēram, Solidity, Vyper un Simplicity, šim nolūkam var izmantot arī citas valodas. Šīs apmācības vajadzībām mēs izvēlējāmies Python, jo tā ir viena no visplašākajām un daudzpusīgākajām valodām. Šodien mēs parādīsim vienkāršu lietotni, kas izveidota ar Python, palaidīsim to un paskaidrosim, kā tā darbojas. Neatliecīsim to uz vēlāku laiku un ķersimies pie darba!

DApp struktūra un īpašības

Vispirms ieskicēsim, kā dApp vajadzētu izskatīties, un apskatīsim tā elementus. Ir divas galvenās dApp daļas:

  • Priekšējais gals

  • Aizmugure

Priekšējā galā ir viss, kas tiek parādīts lietotājam. Piemēram, ritinot savu Facebook profilu, jūs mijiedarbojaties ar Facebook priekšgalu. Parasti tas tiek rakstīts, izmantojot HTML, CSS un JavaScript, taču ir citi veidi, kā to izdarīt. Aizmugure ir kā automašīnas dzinējs. Neviens, izņemot mehāniku, neskatās uz to, bet tas liek lietām darboties. Kamēr centralizētās lietojumprogrammas izmanto mitināšanas pakalpojumus un dažādas sistēmas, piemēram, Django un NodeJS, decentralizētās tā vietā izmanto blokķēdes. Abos gadījumos komunikācija starp frontendu & aizmugure notiek, izmantojot JSON formatētus ziņojumus.

Mums arī jāņem vērā, ka, tā kā aizmugures uzdevumi notiek blokķēdē, kur viss ir nemaināms, inženierim, kas izveido dApp, jāveic vairākas dziļas projekta pārbaudes, lai nodrošinātu, ka kodā nav ievainojamību. Tas padara dApps veidošanu vairāk līdzīgu aparatūras, nevis programmatūras izgatavošanai, ko var pielāgot lidojuma laikā. No gaišās puses, ja dApp ir ideāli uzrakstīts, tas praktiski nav ielauzams, jo nav galvenā atteices punkta. Otrkārt, dApps kods parasti tiek publicēts kā atvērtā koda. Pretējā gadījumā kopienai būs uzticēšanās problēmas un tā izvairīsies no dažu lietojumprogrammu izmantošanas.

Backend izveidošana

Tagad, kad mēs zinām, ka dApp paļaujas uz blokķēdi, izveidosim to ar Python lokāli. Šī ir drošāka pieeja, lai mācītos un pārbaudītu lietas, jo mēs nevēlamies pārslogot reālu tīklu ar nevajadzīgu kodu. Turklāt šī demonstrācija vairāk vēlas parādīt principus, kā lietas darbojas – reālās pasaules dApps ir daudz sarežģītākas.

Tā kā viss notiks jūsu datorā, blokķēde fiziski atradīsies jūsu cietajā diskā, būtībā padarot to par mezglu. Šim nolūkam izveidojiet mapi kaut kur, kas jums patīk, un sauciet to par projektu. Izveidosim vēl vienu mapi, sauksim to par “blockchain” un cieto kodu – pirmo bloku tur. Izveidojiet teksta failu un atveriet to izvēlētajā koda redaktorā. Mēs izmantosim Atom.

Iniciē ģenēzes bloku

Pirmajā blokā mēs norādīsim, ka maksātājs maksāja saņēmējam tūkstoš monētas. Kā jūs droši vien atceraties no mūsu raksta par jaucējspēku, katra bloka galva tiek jaukta, un katra bloka jaucējkrāsa tiek iekļauta nākamajā, lai pārliecinātos, ka tīkls netiek traucēts. Ģenēzes blokam pirms tā nav bloka, tāpēc būs tukša hash.

Ģenēzes bloķēšanaAttēls ar U.Today

Pēc tam mūsu mapē ar blokķēdi izveidosim failu ar skriptu. Sāciet ar JSON bibliotēkas importēšanu, jo mēs izmantosim šo formatējumu. Turpiniet ar ‘if __name__ == "__galvenais": Paziņojums, kas ļauj pārbaudīt, vai skripts tiks palaists no konsoles. Šis solis jums palīdzēs importēšanas laikā. Lai mūsu vietējā blokķēde darbotos, mums vajadzētu uzrakstīt funkciju, kas izveido jaunus blokus. Turklāt vajadzētu būt funkcijai, lai pārbaudītu, vai blokķēde tika mainīta vai nē.

Jaunu bloku rakstīšana

Kodēsim funkciju, lai ķēdē izveidotu šādus blokus. Lai to izdarītu, mums jānorāda visi datu tipi, kurus mēs ierakstījām ģenēzes blokā. Tad mēs izveidojam paziņojumu ‘ar’ ar funkciju, lai izveidotu jaunu failu, lai kods jaunajos blokos būtu piemērotāks lasīšanai, norādot atkāpi. Kad tas ir izdarīts, mēs varam palaist skriptu un iegūt failu ar mūsu testa bloku.

Jauns testa bloks & amp; SkriptsAttēls ar U.Today

Pārbaudes funkcija darbojas! Tagad mēs to varam paplašināt, lai saņemtu datus, un ierakstīt tos nākamajos blokos. Lai to izdarītu, mēs ievietosim maksājuma saņēmēja, summas, maksātāja un p_hash (iepriekšējā bloka jaucējkrāsa) argumentus funkcijā. T Pēc tam funkcijai ir jāliek funkcijai ierakstīt blokus attiecīgajā mapē. Šim nolūkam importējiet OS darbam ar datora failu sistēmu. Pēc tam funkcijā definēsim direktoriju, kuru mēs izveidojām saviem blokiem, izmantojot ‘os.curdir’. Pēc tam norādiet šo deklarāciju paziņojumā, kas raksta jaunu failu.

Dodoties tālāk, mēs nevaram atstāt testa failu tā, kā tas ir, mēs vēlamies, lai katrs jauns bloks tiktu nosaukts pēc kārtas. Tā kā mūsu ģenēzes bloks ir “0”, nākamajam blokam jābūt 1 un tā tālāk. Šis ir diezgan vienkāršs, mūsu funkcijai vajadzētu būt iespējai analizēt galveno blokķēdes direktoriju. Atrodiet pēdējā bloka jaunāko numuru, palieliniet šo skaitli par vienu un nosauciet nākamo bloku. Lai iegūtu visus blokus, mēs izmantosim OS ‘listdir’ un nodrošināsim tam mūsu blockchain direktorija mainīgo. Paturiet prātā, ka “listdir” nešķiro blokus pēc to nosaukumiem, tāpēc jaunākais fails šajā gadījumā, iespējams, nav tas, kas mums nepieciešams. Tādēļ mums jāizmanto saraksta izpratne, lai atgrieztu visu failu nosaukumu veselos skaitļus un tos kārtotu, izmantojot funkciju “kārtot”. Visbeidzot, iemācīsim mūsu blokķēdei iezīmēt blokus, atdodot pēdējā bloka nosaukumu un palielinot to par vienu. Pārliecinieties, ka etiķete ir pārveidota atpakaļ par virkni un bloka nosaukums ir pievienots funkcijai ar ar.

Funkcija bloku iegūšanaiAttēls ar U.Today

Hašings

Katru reizi, palaižot skriptu, jūs saņemsit jaunu bloku. Tomēr tas joprojām nav blokķēde, jo arī mezgliem vajadzētu būt iespējai pārbaudīt datu integritāti un līdz ar to arī drošību. Katram no blokiem būs hash iepriekšējam. Sāksim ar datu jaukšanu blokos. Pirmkārt, mēs importēsim moduli ‘hashlib’. Pēc tam mēs izveidosim funkciju, kas nolasīs bloka saturu, palaidīs tos caur SHA-256 jaukšanas algoritmu un atgriezīs hash. Lūdzu, ņemiet vērā, ka šeit jānorāda mapes blockchain atrašanās vieta, citādi funkcija blokus neatradīs. Funkcijā, kas izveido blokus, definējiet mainīgo iepriekšējam hash, kas palaidīs mūsu jaukšanas funkciju iepriekšējam blokam. Pārbaudot, mēs varam redzēt, ka jaunajā blokā ir iepriekšējā hash. Varat viegli pārbaudīt jaukšanu, kopējot 1. bloka saturu tiešsaistes SHA256 ģeneratorā un salīdzinot rezultātus.

Sajaukšanas funkcijaAttēls ar U.Today

Bloķēt verifikāciju

Līdz šim mums ir bloķēšanas izveides funkcija un jaukšanas funkcija. Ir pienācis laiks ieviest verifikācijas algoritmu mūsu mezglam. Funkcija, kuru mēs izveidosim, varēs iegūt visu bloku ķēdē esošo failu sarakstu, lasīt iepriekšējā bloka jaucējus, sākot no otrā bloka, vēlreiz ģenerēt katra iepriekšējā bloka jaucēju, salīdzināt tos un atgriezt rezultātu.

Mēs sāksim deklarēt mainīgo, kas saņem visus failus direktorijā ‘blockchain’, mainīgo, kas atdod failu sarakstu, un tādu, kas sakārto blokus pieaugošā secībā. Nākamā lieta, kas mums jādara, ir padarīt funkciju spējīgu atkārtoties pa blokiem un nolasīt iepriekšējo bloku jaucējus. To var izdarīt, izmantojot cilni “par”, kas ielādē visus datus no bloka un atgriež tikai to, kas atbilst “hash”. Tagad, lai vēlreiz izveidotu hash, lai pārbaudītu, vai funkcija saņem. Cilpas “par” iekšpusē mēs atstāsim mainīgo “true_h”, kas palaidīs iepriekšējā bloka jaukšanas funkciju. Pēdējais solis ir jaukumu salīdzināšana, izmantojot paziņojumu ‘ja / vēl’. Rezultāti tiks ierakstīti masīvā, kuru mēs viņiem iestatījām, un viss tiks parādīts konsolē.

Bloķēt verifikācijuAttēls ar U.Today

Pēc dažu atlaišanas atkopšanas mums ir vietēja blokķēde, kas kodēta Python.

Frontendas veidošana

Kaut arī mums ir izdevies ievietot visas nepieciešamās funkcijas zem 60 koda rindiņām, vidusmēra lietotājam tas joprojām izskatās kā ķekars. Tādējādi mums ir jādara tas viegli saprotams un lietojams ar priekšējā saskarni. Šajā apmācībā mēs izmantosim kolbas sistēmu kopā ar HTML, CSS un JavaScript.

Vides uzstādīšana

Projekta galvenajā direktorijā izveidojiet mapi virtuālajai videi, kas darbosies kā aizmugure. Lūdzu, lejupielādējiet, ja iepriekš to neesat izdarījis Python no oficiālās lapas vai izmantojot komandrindu jūsu OS (mēs OSX izmantojam homebrew) un instalējiet to. Dodoties tālāk, instalējiet Virtualenv & Pip, izmantojot atbilstošas ​​komandrindas komandas. Pēc tam palaidiet virtuālo vidi no komandrindas mapē “UI”, un jūs saņemsit jaunu mapi, ja viss tika izdarīts pareizi. Laiks to aktivizēt un kolbu uzstādīt caur PIP.

Venv izveidošana un aktivizēšanaAttēls ar U.Today

Novietosim aizmuguri blakus frontendam. Izgrieziet mapi “blockchain” un skriptu un ielīmējiet tos mapē “app” galvenajā direktorijā. Backend mapē mums jāizveido galvenais skripta fails.

Struktūras izveide

Mūsu galvenajā skriptā mums vispirms vajadzētu importēt kolbu un ievietot saiti uz faila nosaukumu, lai kolba varētu saprast ceļus. Mums vajadzētu arī ievietot standarta paziņojumu, kas pārbauda, ​​vai skripts tiek palaists no konsoles un palaiž mūsu lietojumprogrammu. Pārliecinieties, ka pievienojat “atkļūdot”, lai atļautu kolbu atkārtoti ielādēt ikreiz, kad kaut ko maināt kodā.

Tukša lietotneAttēls ar U.Today

Šajā brīdī palaižot skriptu, jūs varat redzēt, ka localhost: 5000 ir uz augšu, bet parāda 404 kļūdu. Tas ir normāli, jo lietotne joprojām ir tukša. Sāksim to aizpildīt, izveidojot funkciju, kas mūsu mezglā liks apstrādāt lietotāju vaicājumus. Tajā (ievietojot ‘@’ pirms funkcijas) mēs ievietosim indeksa funkciju. Tādējādi tiks izveidota vietējo URL un atbilstošo funkciju struktūra. Funkcija ‘index’ lietotājiem, izmantojot moduli ‘render_template’, parādīs lietotājiem index.html.

Lietotne ar displeja funkcijuAttēls ar U.Today

Tagad mēs varam turpināt izveidot savu HTML struktūru. Būs divi faili, viens vispārīgai informācijai un otrs pirmās lapas lietotāja saskarnei. In base.html mēs importēsim Bootstrap bibliotēku izkārtojuma izveidošanai, izmantojot CSS. Izveidosim centrētu kolonnu un ievietosim bloku saturam tādā formātā, kuru var interpretēt kolbas Jinja.

Pirmā lapa htmlAttēls ar U.Today

UI komponēšana

Mūsu pieteikums būs vienkārša maksājumu sistēma. Būs maksātājs, maksājuma saņēmējs un pārskaitīta naudas summa. Viss tiks veikts, izmantojot blokķēdi, bet lietotājam tas izskatīsies kā parasta lietotne. Pārskaitot naudu internetā, jūs parasti aizpildāt kādu veidlapu un iesniedzat to. Bootstrap ir dažādas formas, kas mums palīdz ar dažiem sākotnējiem iestatījumiem. Jūs varat nokopēt to, no kura mēs izvēlējāmies šeit un nokopējiet kodu savā index.html. Iepriekš uzrakstītajā formā būs tikai divi lauki un izvēles rūtiņa, mēs noņemsim izvēles rūtiņu un pievienosim lauku. Tad mēs pielāgosim pareizās etiķetes, ID, veidus un vietturus. Visbeidzot, mēs indeksam piešķirsim formu. Kad lietotājs ievadīs savu vārdu, summu un skaitītāju, visa informācija kaut kur jāsaglabā un pēc tam jāiekļauj blokā. Šim nolūkam mainīsim ievades laukus, pievienojot vārdus un nosaukumus. Vērtībā tiks izmantota metode “get”, lai izvilktu visu, ko lietotājs ievieto laukā “Maksātājs”. Neaizmirstiet norādīt tukšu virkni, ja lietotājs neko neievada.

VeidlapaAttēls ar U.Today

Atgriezīsimies pie galvenā scenārija. Skriptam jāspēj saprast, vai lietotāja nosūtītais pieprasījums ir POST vai nē. Lai to iespējotu, mēs importēsim pieprasījuma moduli no kolbas un norādīsim metodes mūsu lietotnē. Lietotnē mēs paziņosim mainīgos, kas pieprasīs attiecīgos datus no veidlapas.

Atjaunināta lietotneAttēls ar U.Today

Dodoties tālāk, mums visi savāktie dati būs jānodod jaunam blokam. Tas prasa mums savienot galveno skriptu ar to, kas raksta blokus. Lai to izdarītu apgalvojumā “ja”, kas pārbauda pieprasījuma veidu, mēs ievietosim funkciju “rakstīt” ar argumentiem, kas atbilst mūsu blokos esošajam.

UI saistīšana ar aizmuguriAttēls ar U.Today

Tagad, ja mēs atgriezīsimies savā pārlūkprogrammā un iesniegsim darījumu, mēs savā bloku ķēdes mapē iegūsim jaunu bloku, kurā būs informācija, kuru mēs paziņojām. Tomēr jūs varat redzēt, ka lauki netika atsvaidzināti. Šim nolūkam mums jānovirza lietotājs uz jaunu index.html gadījumu. Neaizmirstiet importēt izmantotos moduļus no kolbas. Voila, pēc atsūtīšanas viss tiek atsvaidzināts.

Notiek novirzīšanaAttēls ar U.Today

Pēdējais pieskāriens mūsu lietotāja saskarnei būs pogu tas liek mūsu mezglam pārbaudīt, vai mūsu bloku ķēdē nav pārkāpumu. Lai to izdarītu, verifikācijai izveidosim citu maršrutu ar tajā esošo funkciju. Pēc tam atgriezīsimies pie mūsu base.html un norādiet vēl divus konteinerus pogai un verifikācijas rezultātus ar augšējām malām, kas definētas kā 5. Ievietojiet bloku arī vienā konteinerā un index.html.

Bloķēt verifikācijaiAttēls ar U.Today

Nākamajam solim mēs izvēlēsimies pogu no Bootstrap bibliotēkas un ievietosim to formā base.html. Veidlapā ievietojiet mūsu funkciju “pārbaudīt” kā darbību un pievienojiet to galvenā skripta funkcijai “pārbaudīt”. Kad tas ir izdarīts, atgriezieties pie galvenā skripta un pārbaudes funkcijā ievietojiet verifikācijas funkciju no skripta, lai izveidotu blokus. Dodieties uz base.html, šeit mēs vēlamies izveidot ‘for’ cilpu katram mainīgajam masīvā ‘results’. Cilpā “par” mēs izveidosim div, kas parādīs verifikācijas rezultātus.

Pārbaude cilpaiAttēls ar U.Today

DApp pārbaude

Tātad jums tas ir. Atgriezieties pārlūkprogrammā un atsvaidziniet lapu. Turpmāk mūsu dApp var ierakstīt darījumus blokķēdē un pārbaudīt, vai kāds no blokiem nav uzlauzts. Lai pārliecinātos, ka viss darbojas, iesniedziet darījumu ar izvēlētajiem datiem un dodieties uz mapi blockchain. Jums tur vajadzētu būt jaunam teksta failam ar norādīto maksātāju, summu un saņēmēju, kā arī iepriekšējā bloka jaucēju.

dApp saskarneAttēls ar U.TodayJauns bloksAttēls ar U.Today

Atgriezieties pārlūkprogrammā, izveidojiet vēl dažus blokus un sāciet verifikācijas procesu. Jūs redzēsiet, ka šajā brīdī visi bloki ir īsti. Ir pienācis laiks uzlauzt mūsu mezglu! Dodieties uz mapi blockchain un nomainiet vienu no blokiem, kurus esat izveidojis pirms jaunākā. Tagad atkal atgriezieties pārlūkprogrammā un vēlreiz pārbaudiet mūsu ķēdi. Kā redzat, mūsu mezgls norāda, ka viens bloks ir bojāts, un mums nevajadzētu uzticēties šī bloku ķēdes datiem.

Viltoti blokiAttēls ar U.Today

Kopsavilkums

Rezumējot, šodien mēs parādījām jums vienkāršu decentralizētu lietojumprogrammu lokāli darbināmā blokķēdē. Lietojumprogrammu būvēšanai decentralizētā veidā ir savas iezīmes, taču tā ir arī līdzīga regulāru lietojumprogrammu veidošanai. Galu galā lietojumprogrammas ir domātas galalietotājam, tāpēc, visticamāk, nav iespējams atrast lielu atšķirību.

Ja domājat par dApps kodēšanu, jums jāzina blokķēdes tehnoloģijas principi un jāsaprot, kā rakstīt gan priekšējai, gan aizmugurējai. Ar tik augstu prasīto zināšanu līmeni labāk izvēlēties ātru un ērtu programmēšanas valodu, piemēram, Python. Izmantojot Python, jūs varēsiet gan izveidot kompaktu kodu, gan palaist vietējo serveri bez problēmām. Pēdējais ir ļoti svarīgs, jo pirms publicēšanas vēlaties veikt visas nepieciešamās drošības pārbaudes, jo blokķēde nav maināma.

Mēs ceram, ka šī apmācība jums ļoti palīdzēja izprast dApps. Izbaudi!