Kuinka pelastaa Ethereum Dapp -käyttäjät maksamasta kaasua liiketoimista

Ja sen sijaan sinä dapp-omistajana maksat siitä

Yksi Ethereum dapp -sovelluksen kitkapisteistä on se, että käyttäjien on maksettava kaasua (txn-maksu) saadakseen liiketoimensa kirjatuksi blockchainiin. Minulla on esimerkiksi yksinkertainen äänestysdapp, jonka avulla kuka tahansa voi äänestää ehdokkaita ja äänet tallennetaan lohkoketjuun. Käyttäjän, joka haluaa tallentaa äänensä lohkoketjussa, on maksettava kauppa / kaasumaksu. Tämä ei ole ihanteellista, koska dapp-omistajana odotat sovelluksesi käyttäjiltä eetteriä maksamaan kaasusta, kun he haluavat vain suorittaa yksinkertaisen toiminnan, jolla ei ole mitään tekemistä rahan siirron kanssa. Mutta jos tapahtuma on suoritettava blockchainilla, ei ole muuta vaihtoehtoa kuin maksaa maksu. Entä jos käyttäjillä olisi tapa hoitaa tapahtumia turvallisesti (äänestää esimerkissämme ehdokasta) ja antaa jonkun muun (mahdollisesti sopimuksen omistaja) tallentaa tapahtuma blockchainiin ja maksaa siitä?

Tämän John Backuksen tweetin ansiosta, jolla oli juuri tarpeeksi tietoa auttamaan minua toteuttamaan tällainen ratkaisu äänestyskappaleeseeni.

Koko työskentelykoodi on täällä: https://github.com/maheshmurthy/ethereum_voting_dapp/tree/master/chapter4

Demosovellus on täällä: https://www.zastrin.com/voting-dapp-without-paying-gas.html

Halusin jakaa yksityiskohtia siitä, kuinka toteutin tämän ratkaisun yksinkertaiselle dappilleni, jotta useammat ihmiset voisivat ottaa tämän tekniikan käyttöön omissa dappissaan ja toivottavasti parantaa sitä. Tämä viesti kattaa seuraavat:

  1. Erittäin korkea yleiskatsaus julkisen avaimen salaukseen ja digitaalisiin allekirjoituksiin, jotka ovat avaimet ratkaisun ymmärtämiseen
  2. Ratkaisun yksityiskohdat ja uusi sovellusvirta
  3. Toteutusta koskevat yksityiskohdat (käyttöliittymä js ja Solidity-sopimuksen koodi)
  4. Keskustele mahdollisista ongelmista ja parannuksista

Digitaaliset allekirjoitukset

Jotta tämä ratkaisu olisi järkevä, tarvitset perustiedot siitä, kuinka digitaaliset allekirjoitukset toimivat salauksessa. Ohita tämä osa vapaasti, jos tiedät julkisen avaimen salauksen. Yritän selittää julkisten / yksityisten avainten ja digitaalisten allekirjoitusten käsitteen erittäin korkealla tasolla, mutta suosittelen oppimaan yksityiskohtaisemmin - wikipedia on hyvä paikka aloittaa.

Julkisen avaimen salaus on salausjärjestelmä, jossa sinulla on 2 avainta - julkinen avain (Pu) ja yksityinen avain (Pr). Annat julkisen avaimesi koko maailmalle ja pidät yksityisen avaimen itsellesi. Esimerkki: Ethereum-osoite on julkinen avain (se on todella johdettu julkisesta avaimesta, mutta ajatellaan tätä harjoitusta varten vain julkisena avaimena) ja yksityinen avaimesi tallennetaan joko selaimeesi tai puhelimeesi / tietokoneeseen. Kuten tiedät, joku lähettää sinulle eetterin, hänen on vain tiedettävä julkinen (tilisi) osoitteesi. Vain sinä voit käyttää omistamasi varoja, koska olet ainoa, joka tietää yksityisen avaimesi.

Julkisen avaimen salaustekniikassa on algoritmeja, joiden avulla voit salata, purkaa, allekirjoittaa ja tarkistaa viestejä avainparillasi.

Katsotaanpa, mitä viestin allekirjoittaminen ja todentaminen tarkoittaa esimerkin avulla. Oletetaan, että käyttäjällä Kim on pari julkista / yksityistä avainta

Pu = “0x44ac12c1e3dfd8edaf83b6f65918229d5279a6f5”

Pr = “dbc226043e390cf39280e5edfd418d7ad61931c76509270867d300f110c46506”

Allekirjoittaaksesi viestin Kim suorittaa funktion merkin (“Vote for Alice”, Pr), joka antaa aakkosnumeerisen merkkijonon

allekirjoitus = 0x9127112de0033555c7f6508d963d484965a953844dfcff092712102c236467a25af57edc53b63880ea39af8ce7334f6d77a8206e805305e7c6ad919d12bfae5c1b

Tämä on viestin ”Vote for Alice” digitaalinen allekirjoitus, jonka Kim allekirjoitti yksityisellä avaimellaan Pr.

Nyt kuka tahansa voi vahvistaa, että Kim on allekirjoittanut viestin ”Äänestä Alicea” suorittamalla vahvistustoiminnon, varmista (“Äänestä Alicea”, allekirjoitus), joka lähettää “0x44ac12c1e3dfd8edaf83b6f65918229d5279a6f5”. Jos huomaat, että kyseessä on Kim: n julkinen avain Pu (muista, kaikki tietävät, että se on Kim: n julkinen avain), mikä tarkoittaa, että Kim on ehdottomasti allekirjoittanut viestin. Jos peität allekirjoitusta tai viestiä (sanomalla jopa yhden merkin muuttaminen), vahvistusalgoritmi tuottaa täysin erilaisen julkisen avaimen ja tiedät, että viesti on peukaloitu, koska julkinen avain on erilainen kuin Pu.

Ratkaisun yksityiskohdat

Jos ymmärrät digitaaliset allekirjoitukset, ratkaisu on erittäin vähäinen. Katsotaanpa, kuinka sitä voidaan käyttää äänestyssovelluksessamme pelastaaksesi käyttäjät maksamaan kaasumaksu vaarantamatta heidän äänensä. Alla on kaikki dapp-käyttäjät ja heidän suorittamansa toiminnot.

  1. Äänestäjä ilmoittaa aikovansa äänestää ehdokasta allekirjoittamalla viestin heidän yksityisellä avaimellaan. He eivät lähetä kauppaa blockchainiin, joten txn-maksua ei makseta. Yllä olevan kaavion viestijono on vain ketjun ulkopuolella oleva sijainti, johon kaikki äänestystiedot tallennetaan.
  2. Jokainen, joka haluaa maksaa txn-maksun (yleensä sopimuksen omistaja), ottaa allekirjoituksen, ehdokkaan nimen ja äänestäjän tiliosoitteen ja toimittaa ne lohkoketjuun.
  3. Älykäs sopimus käyttää varmistustoimintoa julkisen avaimen (Ethereum-tilin osoitteen) johtamiseen ehdokkaan nimen ja allekirjoituksen perusteella. Jos johdettu julkinen avain vastaa viestin allekirjoittaneen käyttäjän osoitetta, se tallentaa äänestyksen tai muuten epäonnistuu tapahtuma.

Toteutuksen yksityiskohdat

Tarkastellaan nyt todellista toteutusta ja kuinka kaikki kappaleet sopivat yhteen.

Vaihe 1: Allekirjoita viesti

Ensimmäinen askel on allekirjoittaa viesti äänestäjänä. Allekirjoitamme viestimme eth_signTypedData-toiminnolla. Tämä toiminto on otettu käyttöön Metamaskissa, mikä tekee viestien allekirjoittamisesta todella helpon. Löydät lisätietoja ja keskustelua tästä ehdotuksesta täältä: https://github.com/ethereum/EIPs/pull/712. Löydät alla olevan viestin allekirjoituskoodin.

Yksi todella tärkeä huomioitava asia on, että eth_signTypedData hajauttaa viestin sisäisesti ja hajautettu viesti on se, mikä allekirjoitetaan. Täältä löydät lisätietoja hajauttamisesta viittaamalla typedSignatureHash-toimintoon.

Vaihe 2: Lähetä allekirjoitettu äänestys blockchainiin

Koska tämä on vain esittelysovellus, emme säilytä allekirjoitusta ja muita tietoja missään. Se näkyy suoraan sivulla viestin allekirjoittamisen jälkeen. Kuka tahansa voi ottaa nämä tiedot ja lähettää blockchainiin. Tässä on koodi, joka antaa äänestyksen ryhmäketjuun:

Vaihe 3: Varmista äänestystiedot älykkäässä sopimuksessa

Varmistamme nyt älykkäässä sopimuksessa, että toimitetut äänestystiedot ovat oikeita, ja kirjaamme äänestyksen.

Zeppelinillä on kätevä kirjasto nimeltään ECRecovery, jonka avulla varmennamme allekirjoitetun viestin. BalsoForCandidate-toiminto tarkistaa allekirjoitetun viestin (palautustoiminto) ja päivittää äänimäärän, jos varmistus onnistuu.

Jos muistat, mainitsin aiemmin, että eth_signTypedData hajauttaa viestin (“Äänestä Alicea”) ennen sen allekirjoittamista? Vakavuuden palauttamistoiminnolla ei ole tietoa eth_signTypedData-sivustossa käytetystä hajautustoiminnosta, joten se ei voi vahvistaa viestiä "Äänestä Alicea". Sen on luotava ”Vote for Alice” -viestin hash ja vahvistettava se. Sen sijaan, että luodaan hashia sopimuksen sisällä, esitäytetään kaikki viestit etukäteen ja välitetään eteenpäin rakentajassa, jotta se on helppo etsiä varmennettaessa. Hakemiston luomiseen tarkoitettu koodi on alla olevassa siirtotiedostossa

Se on kaikki tarvitsemasi koodi saadaksesi uusi sovellus toimimaan!

Loin nopean esittelyn osoittaaksesi, kuinka tämä sovellus toimii

Koko työskentelykoodi on täällä: https://github.com/maheshmurthy/ethereum_voting_dapp/tree/master/chapter4

Demosovellus on täällä: https://www.zastrin.com/voting-dapp-without-paying-gas.html

Mahdolliset käsiteltävät kysymykset

Todellista dappia rakennettaessa tätä tekniikkaa on harkittava muutamia asioita. Jotkut niistä on lueteltu alla:

  1. Missä allekirjoitetut viestit tallennetaan? Voit käyttää jonkinlaista jonotusjärjestelmää näiden viestien tallentamiseen.
  2. Mikä on tae siitä, että allekirjoitettu viesti lopulta lähetetään blockchainiin?
  3. Kaikkien viestien hash-tallennus lohkoketjussa ei ole ihanteellista, mikä on paras ratkaisu siihen?

Jos sinulla on ajatuksia näiden ongelmien ratkaisemiseksi tai jos ratkaisussa on puutteita, jätä kommentti!

Huomaa: Ilmeisesti eth_signTypedData API ei ole edelleenkään vakaa, ja sen on toteuttanut vain metamaski. Varo tätä, jos aiot käyttää tätä tekniikkaa mainnetissä / tuotannossa.

Lisälukema

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

Kiitos Chris Whinfrey ja Febin John James tämän artikkelin luonnosten tarkastelusta.

Lisätietoja

Jos olet kiinnostunut oppimaan rakentamaan Ethereumin hajautettuja sovelluksia, minulla on muutamia mielenkiintoisia kursseja osoitteessa www.zastrin.com

Jos haluat saada ilmoituksen, kun kirjoitan lisää opetusohjelmia, voit tilata täältä.