Kuidas päästa oma Ethereum Dapp'i kasutajad tehingute eest gaasi eest tasumisest

Selle asemel maksate selle eest teie kui dapp-omanik

Üks Ethereumi dappide kasutuselevõtu hõõrdepunkte on see, et kasutajad peavad maksma gaasi (txn-tasu), et oma tehingud plokiahelasse salvestada. Näiteks on mul lihtne hääletamise dapp, mis laseb kõigil kandidaatide poolt hääletada ja hääled salvestatakse plokiahelas. Kasutaja, kes soovib oma hääle blokeeringus lindistada, peab maksma tehingu / gaasitasu. See pole ideaalne, kuna dappide omanikuna eeldate, et teie rakenduse kasutajad peavad eetris gaasi eest maksma, kui nad kõik tahavad teha, on see lihtsa toimingu tegemine, millel pole raha ülekandmisega mingit pistmist. Kuid kui tehing tuleb teostada plokiahelas, pole muud võimalust kui lõivu maksmine. Mis siis, kui kasutajatel oleks võimalus tehinguid turvaliselt teostada (meie näites hääletada kandidaadi poolt) ja lasta kellelgi teisel (potentsiaalselt lepinguomanikul) tehing lukuahelas registreerida ja selle eest maksta?

Tänu sellele John Backuse säutsule, millel oli lihtsalt piisavalt teavet, mis aitas mul rakendada sellist lahendust minu hääletamise dapp jaoks.

Kogu töökood on siin: https://github.com/maheshmurthy/ethereum_voting_dapp/tree/master/chapter4

Demorakendus on siin: https://www.zastrin.com/voting-dapp-without-paying-gas.html

Tahtsin jagada üksikasju selle kohta, kuidas ma selle lihtsa dappide jaoks selle lahenduse rakendasin, et rohkem inimesi saaksid seda tehnikat oma dappides kasutusele võtta ja saaksid seda loodetavasti paremaks muuta. See postitus hõlmab järgmist:

  1. Väga kõrgel tasemel ülevaade avaliku võtme krüptograafiast ja digitaalallkirjadest, mis on selle lahenduse mõistmisel võtmetähtsusega
  2. Lahenduse üksikasjad ja uus rakendusvoog
  3. Rakenduse üksikasjad (kasutajaliidese ja Solidity lepingu kood)
  4. Arutage võimalikke probleeme ja täiustusi

Digitaalallkirjad

Selle lahenduse mõistmiseks on vaja põhiteadmisi selle kohta, kuidas digitaalallkirjad krüptograafias töötavad. Võite selle jaotise vabalt vahele jätta, kui teate avaliku võtme krüptograafiat. Püüan avalike / privaatvõtmete ja digitaalallkirjade mõistet selgitada väga kõrgel tasemel, kuid soovitan tungivalt lähemalt õppida - vikipeedia on hea koht alustamiseks.

Avaliku võtme krüptograafia on krüptograafiline süsteem, kus teil on 2 võtit - avalik võti (Pu) ja privaatne võti (Pr). Te annate oma avaliku võtme kogu maailmale ja hoiate privaatse võtme enda eest. Näide: teie Ethereumi aadress on avalik võti (see on tegelikult tuletatud avalikust võtmest, kuid mõelgem selle ülesande jaoks ainult avalikku võtit) ja teie privaatvõti salvestatakse kas teie brauserisse või telefoni / arvutisse. Nagu teate, peab keegi, kes teile eetrit saadab, lihtsalt teadma teie avalikku (konto) aadressi. Kuid ainult teie pääsete omale kuuluvatele fondidele juurde, kuna olete ainus, kes teab teie privaatvõtit.

Avaliku võtme krüptograafias on algoritmid, mis võimaldavad teil oma võtmepaari abil kirju krüptida, dekrüpteerida, allkirjastada ja kontrollida.

Vaatame, mida näite kaudu sõnumi allkirjastamine ja kinnitamine tähendab. Oletame, et kasutajal Kimil on paar avalikku / privaatvõtit

Pu = “0x44ac12c1e3dfd8edaf83b6f65918229d5279a6f5”

Pr = “dbc226043e390cf39280e5edfd418d7ad61931c76509270867d300f110c46506”

Sõnumi allkirjastamiseks käivitab Kim funktsioonimärgi (“Vote for Alice”, Pr), mis väljastab tähtnumbrilise stringi

signatuur = 0x9127112de0033555c7f6508d963d484965a953844dfcff092712102c236467a25af57edc53b63880ea39af8ce7334f6d77a8206e805305e7c6ad919d12bfae5c1b

See on digitaalallkiri sõnumile "Vote for Alice", mille Kim allkirjastas oma privaatvõtme Pr abil.

Nüüd saab igaüks kinnitada, et Kim allkirjastas teate „Vote for Alice”, kinnitades funktsiooni, kinnitades („Vote for Alice”, allkiri), mis väljastab „0x44ac12c1e3dfd8edaf83b6f65918229d5279a6f5”. Kui märkate, et see väljund on Kimi avalik võti Pu (pidage meeles, kõik teavad, et see on Kimi avalik võti), mis tähendab, et sõnumile kirjutas kindlasti alla Kim. Kui muudate allkirja või sõnumit (muutes isegi ühe tähemärgi), väljastab kontrollimisalgoritm täiesti erineva avaliku võtme ja teate, et sõnumit on rikutud, kuna avalik võti erineb Pu-st.

Lahenduse üksikasjad

Digitaalallkirjadest aru saades on lahendus äärmiselt triviaalne. Vaatame, kuidas seda saab kasutada meie hääletamisrakenduses, et säästa kasutajaid gaasitasu maksmisest ilma oma häält kahjustamata. Allpool näete kõiki DAPP-i kasutajaid ja nende tehtud toiminguid.

  1. Valija teatab oma kavatsusest kandidaadi poolt hääletada, kirjutades alla privaatse võtme abil sõnumi. Nad ei esita oma tehingut plokiahelasse, seega ei maksta txn-tasu. Ülaltoodud diagrammi sõnumijärjekord on lihtsalt ahelaväline koht, kuhu on salvestatud kõik hääletuse üksikasjad.
  2. Igaüks, kes on nõus maksma xx tasu (tavaliselt lepingu omanik), võtab allkirja, kandidaadi nime ja valija konto aadressi ning edastab need plokiahelasse.
  3. Nutikas leping kasutab kontrollfunktsiooni avaliku võtme (Ethereumi konto aadress) tuletamiseks kandidaadi nime ja allkirja alusel. Kui tuletatud avalik võti ühtib sõnumile alla kirjutanud kasutaja aadressiga, registreerib see hääletuse või ebaõnnestub tehing.

Rakendamise üksikasjad

Vaatame nüüd tegelikku teostust ja seda, kuidas kõik tükid omavahel kokku sobivad.

1. samm: allkirjastage sõnum

Esimene samm on sõnumi allkirjastamine valijana. Oma sõnumi allkirjastamiseks kasutame funktsiooni eth_signTypedData. See funktsioon on rakendatud Metamaskis, mis teeb sõnumite allkirjastamise tõesti lihtsaks. Lisateavet ja arutelu selle ettepaneku kohta leiate siit: https://github.com/ethereum/EIPs/pull/712. Allpool leiate teate allkirjastamiseks kasutatava koodi.

Üks väga oluline asi, mida tuleb tähele panna, on sisemiselt eth_signTypedData sõnumi räsimine ja räsitud teade on see, mis allkirjastatakse. Räsimise kohta lisateabe saamiseks võite siin viidata funktsioonile typedSignatureHash.

2. samm: edastage allkirjastatud hääletus plokiahelasse

Kuna see on vaid demorakendus, ei hoita me allkirja ega muid üksikasju kuskil. Pärast kirja allkirjastamist kuvatakse see otse lehel. Igaüks saab neid üksikasju võtta ja plokiahelasse edastada. Siin on kood, mis edastab hääletuse plokiahelale:

3. samm: kontrollige nutika lepingu hääletuse üksikasju

Nüüd kontrollime nutilises lepingus, kas esitatud hääletuse teave on kehtiv, ja registreerime hääletuse.

Zeppelinil on käepärane teek nimega ECRecovery, mida kasutame allkirjastatud teate kinnitamiseks. Funktsioon balsoForCandidate kontrollib allkirjastatud sõnumit (funktsioon taastada) ja värskendab häältelugemist, kui kinnitamine õnnestub.

Kui mäletate, siis mainisin juba varem, et eth_signTypedData räsib enne allkirjastamist sõnumi (“Vote for Alice”)? Usaldusväärsuse taastamise funktsioonil pole teadmisi eth_signTypedData-s kasutatava räsimisfunktsiooni kohta ja seetõttu ei saa ta kinnitada sõnumit „Hääleta Alice'i”. See peab genereerima sõnumi “Vote for Alice” räsi ja seejärel kontrollima. Selle asemel, et lepingus räsi genereerida, eeltähendame kõik sõnumid eelnevalt ja edastame selle konstruktoris, nii et seda on kontrollimisel lihtne otsida. Räsi genereerimise kood on allpool asuvas migratsioonifailis

See on kõik kood, mida vajate, et uus rakendus töötaks!

Lõin kiire demo, et näidata, kuidas see rakendus töötab

Kogu töökood on siin: https://github.com/maheshmurthy/ethereum_voting_dapp/tree/master/chapter4

Demorakendus on siin: https://www.zastrin.com/voting-dapp-without-paying-gas.html

Võimalikud probleemid, millega tuleb tegeleda

Selle tehnika abil tõelise dappi ehitamisel tuleb arvestada mõne probleemiga. Mõned neist on loetletud allpool:

  1. Kuhu allkirjastatud kirju hoitakse? Nende teadete salvestamiseks võite kasutada mingisugust järjekorrasüsteemi.
  2. Mis on garantii, et allkirjastatud teade edastatakse lõpuks plokiahelale?
  3. Kõigi sõnumite räsi salvestamine plokiahelas pole ideaalne, mis on selle jaoks parim lahendus?

Kui teil on mõtteid, kuidas neid probleeme lahendada, või kui näete selles lahenduses vigu, jätke kommentaar!

Märkus. Ilmselt pole eth_signTypedData API endiselt stabiilne ja seda on rakendanud ainult metamask. Kui kavatsete seda tehnikat kasutada magneti tootmisel / tootmisel, siis olge ettevaatlik.

Lisalugemist

https://en.wikipedia.org/wiki/Public-key_cryptography

https://en.wikipedia.org/wiki/Digital_signature

https://github.com/danfinlay/js-eth-personal-sign-examples/

https://danfinlay.github.io/js-eth-personal-sign-examples/

https://github.com/ethereum/EIPs/pull/712

Tänu Chris Whinfrey ja Febin John James selle artikli mustandite ülevaatamise eest.

Lisateave

Kui olete huvitatud Ethereumi detsentraliseeritud rakenduste ehitamise õppimisest, on mul paar huvitavat kursust veebisaidil www.zastrin.com

Kui soovite saada rohkem õpetuste kirjutamisel märku, saate siin tellida.