Solidity je javascript kot jezik, ki se uporablja za kodiranje pametnih pogodb na platformi Ethereum. Zbere se v obliko bajt-kode, ki jo razume virtualni stroj Ethereum (EVM). Je močno natipkan jezik z možnostjo definiranja podatkovnih struktur po meri. Uvod v 1. del Solidity vas bo naučil uporabiti podskupino funkcionalnosti solidity za ustvarjanje predloge pametne pogodbe, ki jo je mogoče ponovno uporabiti za oblikovanje celotnega sklopa pogodb, ki vsebujejo podatke in osnovno logiko, ki deluje za katero koli domeno. To bo večdelna serija, saj bo zajemala osnovno zasnovo pogodb in nekatere s tem povezane pomisleke.

Uvod v trdnost

Uvod v Solidnost: Ustvarjanje okolja

Za izvajanje pametnih pogodb potrebujemo sistem, ki je sposoben prevesti, razviti in poklicati svoje metode. Za vse tri imamo zelo preprosto integrirano aplikacijo, ki temelji na brskalniku tukaj.

To orodje je mogoče uporabiti za povezavo z živim vozliščem ethereuma ali za oblikovanje lažnega okolja. V tem okolju lahko tudi enostavno izvedete nekaj testnih primerov pogodbenih metod. Ne potrebuje nobene namestitve in v celoti temelji na brskalniku. Uporabljal sem ga na chromeu nad ubuntujem, vendar sem prepričan, da enako dobro deluje tudi na drugih platformah. V levem podoknu aplikacije je koda pogodbe, na desni strani pa so možnosti uvajanja in preizkusa. Aplikacija lahko deluje na pogodbenih datotekah iz lastnih sistemov.

Na voljo je izvorna koda pogodbe, o kateri bomo razpravljali tukaj. O nekaterih delih pogodbenega kodeksa bomo govorili v naslednjih delih serije. Kodo in jo prenesite in naložite v Remix za ogled spodnjih razdelkov. Najnovejša neobjavljena različica Solidity je 4.10 zvečer in zanašali se bomo na funkcije, ki jih podpira ta posebna različica.

DataContract (osnovna podatkovna struktura):

Podatkovna pogodba ni običajna terminologija. V dokumentaciji Monax (prejšnja industrija Eris) je opredeljenih več vrst (vzorcev) pametnih pogodb. Vrsta pogodbe »podatki« je preprost koncept, pri katerem se podatki dodajajo, posodabljajo, odstranjujejo in dostopajo. V procesu ustvarjanja podatkovne pogodbe bomo lahko delali s pogodbo ACL (Access Control List), ki jo lahko uporabimo za upravljanje varnosti, ki temelji na vlogah, za vse vrste pogodb, mehanizem dogodkov za beleženje in vračanje podatkov ter nekatere druge funkcije pametne pogodbe.

Če želite ustvariti preprosto podatkovno pogodbo, predpostavimo uporabniško določen niz podatkov na visoki ravni za npr. Stranke

Za poenostavitev sestavimo preprosto stranko, za katero domnevamo, da je fizična oseba:

struct Stranka {

uint id;

ime niza;

uint dateOfBirth;

uint social;

uint status;

}

Stanje podatkov

Strukturo izvajamo s predpostavko, da bo imel vsak podatkovni zapis status. Brisanja in snemanja in prerazporeditve celotne zbirke ni izvedljivo, zato je status atribut, ki ga bomo izkoristili za določitev stanja zapisa. Pogodbe v različnih domenah bodo imele različen status. Kot preprosta predpostavka sledimo 3 statusom (to je z mislijo, da stranka morda čaka na preverjanje, aktivna ali morda izbrisana):

uint konstanta aktivna = 1;

uint konstanta v teku = 2;

uint konstanta izbrisana = 3;

Izbrisani zapis za katero koli referenčno vrsto podatkov v verigi blokov se nikoli ne sme težko izbrisati, zato je primerna praksa oblikovanja, če vsakemu zapisu dodelite status.

Naš cilj je omogočiti zbiranje primerkov struktur strank na verigi blokov in olajšati dostop do določene stranke, seznama strank, ki kličejo, in posodobiti določen primerek stranke. Medsektorska skrb teh ciljev je omogočiti beleženje in izvajanje strategije nadzora dostopa.

Če želite ustvariti zbirko, bomo uporabili konstrukcijo preslikave.

preslikava (uint => Stranka) stranke;

preslikava (uint => Stranka) stranke;

To preslikavanje je predloga za strukturo, podobno zemljevidu, ki ustvari zemljevid vrednosti ključev, pri čemer je ključ nepodpisan int, vrednost pa je primerek stranke. To preslikavanje ima nekaj omejitev, to je, da ni nobenega načina zanke, da bi pridobil vse vrednosti. Do elementov lahko dostopamo samo prek določene logike get:

stranke [ključ];

Zaradi tega bomo morali vzdrževati senčni ključ, da bomo ohranili število elementov v preslikavi in ​​ga pridobili na podlagi števila.

število javnih uint = 0;

Zdaj imamo pripravljeno strukturo podatkov, s katero bomo hranili podatke o strankah.

Pogodba o podatkih (ustvarjanje podatkov):

Če želite ustvariti primerek stranke in ga izključiti, bomo uporabili metodo, ki bo sprejela sestavne podatke.

funkcija ustvari stranko (uint id, ime niza, uint dateOfBirth, uint social) {

kupci [count] = kupec (id, ime, dateOfBirth, družabno, v teku);

štetje ++;

}

Zgornja metoda dodaja podatke v preslikavo in poveča število senčnih tipk. Opozoriti je treba, da za izklop podatkov uporabljamo isti senčni ključ.

Za naključen dostop do podatkov bomo morali posredovati določen ključ, proti kateremu smo podatke izključili.

funkcija getCustomer (indeks uint)

stalni vrnitve (uint id, ime niza, uint dateOfBirth, uint social, uint status)

{

id = kupci [indeks] .id;

ime = kupci [indeks] .ime;

dateOfBirth = stranke [indeks] .dateOfBirth;

social = kupci [indeks] .social;

status = kupci [indeks] .status;

}

Ta metoda je stalna, saj ne spreminja stanja pogodbenih podatkov (to je metoda samo za branje). Torej za klic te metode ne bomo potrebovali plina.

Za dostop do vseh strank bomo morali izkoristiti tipko za štetje v senci. Na odjemalcu bomo morali implementirati zankasto strukturo in znova uporabiti zgornji klic, ki temelji na indeksu. To bo razloženo v obrazložitvi pogodbene stranke.

Za dostop do stranke na podlagi določenega atributa v strukturi bomo morali izvesti brutalno iskanje na osnovi zanke. Obstajajo učinkovitejši načini za njegovo branje z razčlenjevanjem transakcije, ki je bila odgovorna za ustvarjanje teh podatkov.

funkcija getCustomerById (uint id)

stalni vrnitve (uint idRet, ime niza, uint dateOfBirth, uint social, uint status)

{

za (var i = 0; i< štetje; i ++)

{

če (kupci [i] .id == id) {

idRet = kupci [i] .id;

ime = kupci [i] .name;

dateOfBirth = kupci [i] .dateOfBirth;

social = kupci [i] .social;

status = kupci [i] .status;

vrnitev;

}

}

}

To je zelo neučinkovit način za pridobitev stranke iz vrednosti atributa. S to metodo obstajajo tudi druga vprašanja, razen neučinkovitosti. Nizov ni mogoče zlahka ujemati v trdnosti, zato ni mogoče ujemati atributov nizov. Vrne tudi prvo ujemanje, ni mogoče vrniti seznama ujemanj. V naslednjih delih te serije bomo nadaljevali z učinkovitejšimi metodami za dostop do teh podatkov.

Podatkovna pogodba (posodobitev podatkov):

Metoda posodobitve podatkov je preprosto obratna od metode dostopa. Zapomniti si je treba le, da ta metoda povzroči spremembo stanja verige blokov, zato se bodo spremembe odražale šele, ko bo transakcija potrjena. Razpravljali bomo o tem, kako zagotoviti, da bo transakcija potrjena, preden bomo poskusili dostopati do podatkov v kasnejšem delu naše serije.

funkcija updateCustomer (indeks uint, ime niza) {

stranke [indeks] .ime = ime;

}

Smiselno je postaviti nekaj preverjanj vrednosti indeksa (mora biti manjše od števila)

funkcija updateCustomer (indeks uint, ime niza) {

if (indeks > štetje) met;

stranke [indeks] .ime = ime;

}

funkcija updateCustomerStatus (indeks uint, stanje uint) {

if (indeks > štetje) met;

stranke [indeks] .status = status;

}

Za posodabljanje vsakega atributa je treba uporabiti drugačno metodo, tukaj posodabljamo ime. Metodo updateCustomerStatus () je treba obravnavati kot posebno metodo, ki lahko omogoči ali onemogoči zapise.

Možno je dodati isto preverjanje metode dostopa, ki dostopa do indeksnega ključa, vendar ni nujno, saj bo vrnitev nična, če je naveden neveljaven indeks, zato bi moral odjemalec preveriti odgovor in vrniti ustrezne napake. Ker bi bil dostop pogosteje imenovan nabor metod, bi moral biti čim bolj učinkovit.

Testiranje pogodbe:

Če želite preizkusiti pogodbo, pojdite na zavihek okolje na desni plošči (ikona polja).

Na desni strani boste videli pogodbo z možnostjo navedbe naslova (na naslovu) in možnostjo Ustvari. Izberite izbirni gumb javascript VM (privzeto izbrano in pritisnite Ustvari). To bo ustvarilo lokalno okolje v brskalniku, v katerem boste lahko izvajali teste pogodbe in jo odpravljali.

Uvod v Solidity: Ustvarjanje podatkovne pogodbe [1. del]

Uvod v Solidity: Ustvarjanje podatkovne pogodbe [1. del]

To preskusno okolje vam omogoča, da individualno pokličete pogodbene metode in si ogledate rezultate v podatkih.

Za začetek pokličimo metodo create Contract, da v verigo blokov dodamo nekaj podatkov (še ne pravega, ampak lažnega).

Poiščite rdeče označen gumb s klicem metode createCustomer in v besedilno polje poleg njega dodajte parametre, ločene z vejicami, kot če bi to metodo klicali prek odjemalca javascript. Za npr. (Zaradi enostavnosti smo izbrali dateOfBirth časovnega žiga enote, ki se lahko prilega enoti)

Za npr. (Zaradi enostavnosti smo izbrali dateOfBirth časovnega žiga enote, ki se lahko prilega enoti)

101, "Jack", 845078400, 1234567

S tem nastavljenim parametrom kliknite na ustvari stranko in pod klicem boste videli naslednje:

Rezultat: "0x"

Transakcijski stroški: 129390 plina.

Stroški izvedbe: 106454 plina.

To pomeni, da je bil klic metode uspešen, lahko pa ga potrdite s preverjanjem števila strank, tako da pritisnete gumb za štetje (Število klicev metode ()). Ne pozabite, da solidnost izpostavlja svoje javne člane z neposrednim klicem s podpisnikom ().

Klic naj natisne nekaj takega:

"0x00000000000000000000000000000000000000000000000000000000000000000002"

Transakcijski stroški: 21505 plina. (Opozorilo)

Stroški izvedbe: 233 plina.

Dekodirano:

uint256: 1

Ta uint256 ima vrednost 1, ki pomeni, da imate v svojem zapisu enega člana.

Zgornji klic createCustomer lahko zaženete večkrat in preverite rezultat. Pazite, da ni preverjanja dodajanja podvojenih zapisov. To mora preveriti stranka.

Kupca lahko pridobite s pomočjo getCustomer (0), ki temelji na indeksu – ne pozabite, da se indeks začne z 0. Izhod bi moral videti tako:

Vrednost:

"0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"

Transakcijski stroški: 23404 plina. (Opozorilo)

Stroški izvedbe: 2004 plin.

Dekodirano:

uint256 id: 101

ime niza: Jack

uint256 dateOfBirth: 845078400

uint256 social: 1234567

status uint256: 2

Vrnjena vrednost so kodirani podatki, ki se vrnejo. Dekodira in prikaže ter vrednosti parametrov zaporedoma spodaj.

Zdaj imate popolno delovno pogodbo, ki je bila preizkušena glede na nekatere testne podatke.

Obstajajo situacije, ko pogodba ne deluje po pričakovanjih, v tem primeru pa morate odpraviti napake, da ugotovite stanje podatkov o pogodbi med izvajanjem metode in prepoznate težavo. Trenutno ni razhroščevalnika trdnosti. Obstaja soliden IDE – Mix, ki ima zmogljivosti, vendar trenutno ni podprt. Preizkusite ga lahko na lastno odgovornost.

Zdaj pa razporedite svojo pogodbo na pravi primerek ethereuma in jo pokličite s preprostim odjemalcem javascript.

Uvajanje pogodbe:

Oglejte si prejšnji članek o tem, kako nastaviti lokalno vozlišče ethereum z uporabo paritete. Uporabili bomo to zmožnost in domnevali, da imate lokalno delujoč primerek ethereum, ki izpostavlja vrata JSON_RPC na 8545. Predvidevamo tudi, da imate račun ustvarjen in vrnjen na lokaciji računov [0], prav tako mora imeti ta račun dovolj eter razporedite pogodbo in izvedite transakcijske klice s stroški za plin.

IDE remixa vam omogoča, da to pogodbo postavite neposredno iz IDE v primerek ethereum. Za to morate najprej izbrati možnost ponudnika Web3 na zavihku Okolje. Če je okolje trenutno zavzeto, pod pogodbo ne boste videli nobene napake.

Screen_3 (možnost uvedbe pogodbe)

Uvod v Solidity: Ustvarjanje podatkovne pogodbe [1. del]

IDE vam da tri izhode iz postopka zbiranja pogodb, BTW pa se pogodba samodejno sestavi. Prepričajte se, da vidite možnosti, kot so prikazane na zaslonu _3. sicer pomeni, da prevajanje ni uspelo in videli bi napako prevajanja.

Bytecode je koda EVM, ki se ustvari, ko je vaša koda sestavljena. To je niz navodil, ki ga ethereum razume. Drugi je aplikacijski binarni vmesnik ali ABI pogodbene kode. ABI je le seznam podpisov metod, vrst vrnitve, članov itd. Pogodbe v določeni obliki JSON. Ta ABI je potreben, ko pogodbo pokličete iz pravega odjemalca javascript.

Tretja možnost uvajanja Web3 je možnost, ki vam omogoča potiskanje pogodbe neposredno na primerek vozlišča. Preprosto izberite to možnost in na blokchainu se vam vrne vaš pogodbeni naslov .. (Kot sreen_2). Ta pogodbeni naslov je pomemben, saj je potreben v odjemalcu javascript, ki ga boste kmalu ustvarili. V primeru, da s konzole ethereum ne morete razporediti pogodbe neposredno v verigo blokov. Preprosto kopirajte skript v besedilno območje proti možnosti uvajanja web3 in prilepite na konzolo. Videti bi morali izhod ton console.log z napisom »pogodba je minirana«, ki ji sledi naslov v verigi.

Izvajanje pogodbe od prave stranke.

Integriranje pogodbe s kodo aplikacije podjetja. Za to boste ustvarili preprost odjemalec javascript / html, ki se lahko zažene v brskalniku. Tega odjemalca lahko zaženete tudi kot aplikacijo nodejs. To bom nekaj obravnaval v kasnejših delih serije.

Za komunikacijo z blokovno verigo ethereum ethereum izpostavlja nizko raven JSON-RPC vmesnik. Ta vmesnik sprejema transakcije po pogodbi. Je vmesnik zelo nizke ravni, zato je z njim težko neposredno delati. Obstaja okvir javascripta web3.js ki omogoča, da se abstrakcije pogodbene kode na višji ravni omogočijo integraciji aplikacij s pogodbenimi klici.

Če želite omogočiti web3 v okolju, ki ga podpira brskalnik, je treba v kodi strani navesti eno datoteko skripta za interakcijo s pogodbo..

Web3.js je na voljo za prenos s povezav v zgoraj navedeni dokumentaciji. Web3 ustvari ročico za sklepanje primerka na ethereum, da omogoči vse klice metod, ki smo jih izvedli v našem viru trdnosti. Te klice metode je mogoče kodirati, kot da obstaja neposreden sklic na JavaScript v skriptu metode. To omogoča vmesnik JSON-RPC.

Na voljo je predlagan pristop za pridobitev obravnave pogodbe. Prva stvar, ki jo potrebujemo, je izdelati primerek web3 in mu dostaviti pogodbo ABI.

var Web3 = require (‘web3’);

var web3 = nov Web3 ();

web3.setProvider (“<span lang ="zxx"><a href ="http: // localhost: 8545 /">http: // localhost: 8545a>razpon>”);

web3.eth.defaultAccount = web3.eth.accounts [0];

URL ponudnika je vaš lokalni vmesnik JSON_RPC. Privzeta nastavitev računa je denarnica ethereum, ki se bo uporabljala kot račun z računa, ko bomo izvrševali transakcije po pogodbi. Zagotoviti moramo, da je račun odklenjen, če uporabljamo primerek vozlišča geth, saj je račun privzeto zaklenjen vsakih 30 sekund po odklepanju.

Naslednji korak je izdelati načrt pogodbe z dobavo pogodbe ABI so web3.

var customerContract = web3.eth.contract ([ABI JSON]).

Polje ABI JSON je ponavadi dolg niz JSON, zato samo parafraziramo, vendar bi morali kopirati celotno matriko ABI iz območja besedila vmesnika, kot je prikazano na zaslonu3. Ko dobite načrt pogodbe s stranko, ga moramo pripraviti tako, da v verigi podatkov navedemo pravi naslov, na katerem je pogodba..

var customerContractObject = customerContract.at (‘0x76bd9986c5c3e00111c82e16e01e282696d2b3fb’);

Ta naslov bi bil tisti, ki ste ga dobili, ko ste razporedili pogodbo iz uvedbe web3 ali iz konzole ethereum. Ko je ročaj pogodbe povezan nazaj na naslov za razmestitev, lahko izvajate pogodbene metode s pošiljanjem transakcij na naslov. Recimo, da želite dodati zapis stranke, potem ko obrazec html od uporabnika sprejme vnose za vrednosti obrazca, potem bi bila vaša koda html + web3 videti nekako takole:

<html>

<glavo>

<povezava rel = “styleheet” type = “text / css” href = “style.css”>

<type script = ”text / javascript” src = ”/ usr / local / lib / node_modules / web3 / dist / web3.js”><type script = “text / javascript” src = “jquery.js”>skripta>

<type script = “besedilo / javascript”>

var Web3 = require (‘web3’);

var web3 = nov Web3 ();

web3.setProvider (novo web3.providers.HttpProvider ()); // to je privzeto – localhost: 8545

web3.eth.defaultAccount = web3.eth.accounts [0];

var customerContract = web3.eth.contract ([ABI JSON]);

var customerContractObject = customerContract.at (‘0x76bd9986c5c3e00111c82e16e01e282696d2b3fb’);

register funkcij () {

var txn = customerContractObject.createCustomer ($ (‘id’). val (), $ (‘name’). val (), $ (‘dob’). val (), $ (‘social’). val () , {plin: 144840});

console.log (txn);

}

skripta>

glavo>

<telo>

<input type = ”number” name = ”id” id = ”id” placeholder = ”Id stranke” />

<type input = “text” name = “name” id = “name” placeholder = “ime stranke” />

<input type = “date” name = “dob” id = “dob” placeholder = “Stran rojstva” />

<input type = ”number” name = ”social” id = ”social” placeholder = ”številka socialne varnosti kupca” />

<vrsta vnosa = ”button” value = ”Register” onclick = ”register ();” />

telo>

html>

Zgornja koda ne bo delovala, če popravite pot do web3.js in jquery. Tako kot smo metodo imenovali na ročici pogodbe:

var txn = customerContractObject.createCustomer ($ (‘id’). val (), $ (‘name’). val (), $ (‘dob’). val (), $ (‘social’). val () , {plin: 144840});

Mogoče je poklicati vse druge metode. Ocenjeni plin je treba vnesti iz klicev preskusne metode, to je 144840 v moji konfiguraciji. Zgornji klic vrne ID transakcije za transakcijo, ki je ustvarjena v verigi blokov za izvajanje te metode. Ta transakcija je zdaj del verige blokov in nanjo se lahko sklicujemo, kadar želimo revidirati, kdaj, kako in kdo je ustvaril to stranko.

Kot smo videli med kodiranjem pogodbe, obstajata dve vrsti klicev. Takšen, ki posodablja stanje pogodbe, kot so createCustomer, updateCustomer itd. In drugi, ki so samo za branje in so označeni kot konstantni. Prvi vedno vrnejo zgoščevalno oznako ID transakcije, razpršilna oznaka ID transakcije je 64-bajtna identifikacija transakcije, ki jo lahko uporabimo za napotitev nazaj na transakcijo. Če pogodbo izvajamo sinhrono, kot to počnemo tukaj. Slednji vrnejo dejanske vrednosti, ki jih iščejo v vejici, ločeni z vejico. Na primer klic:

var kupec = customerContractObject.getCustomer ($ (‘indeks’). val ());

console.log (kupec)

Zapiše niz vrednosti, kot je ta – 101, "Jack", 845078400, 1234567

V naslednjem delu serije bomo videli, kako so nekateri nefunkcionalni pomisleki in vidiki vgrajeni v pogodbo podoben nadzor dostopa, dnevnike dogodkov in brisanje pogodbe. Razpravljali bomo o delih pogodbe, ki posebej obravnavajo ta vprašanja.

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me