To'liq stack Salom Jahon ovoz berish Ethereum Dapp qo'llanmasi - 1 qism

[Qo'llanma oxirgi kutubxonalardan foydalanish uchun 2019 yil fevral oyida yangilandi]

Bu darsliklarning 3 qismidan iborat 1 qism. Siz bu erda 2 va 3 qismlarga kirishingiz mumkin.

Oldingi postimda Ethereum platformasining yuqori darajadagi arxitekturasini veb-ilovaga taqqoslab tushuntirdim. Dasturchi sifatida har qanday yangi texnologiyani o'rganishning eng yaxshi usuli bu sho'ng'in qilish va o'yinchoq ilovalarini yaratishdir. Ushbu postda oddiy "Salom Dunyo!" Dasturini yarataylik, u Ovoz berish dasturi.

Ilova juda sodda, uning maqsadi - bir nechta nomzodlarni kiritish, kimdir nomzodlarga ovoz berish va har bir nomzod olgan ovozlarning umumiy sonini ko'rsatish. Maqsad shunchaki dasturni kodlash emas, balki uni kompilyatsiya qilish, o'rnatish va o'zaro ishlash jarayonini o'rganishdir.

Men ushbu dasturni yaratish uchun biron bir dpp ramkalarini ishlatishdan ataylab qochdim, chunki ramkalar juda ko'p tafsilotlarni ajratib turadi va siz tizim ichki qismini tushunolmaysiz. Bundan tashqari, ramkadan foydalanganda, siz ko'taradigan ramkaning barcha og'irliklari uchun ko'proq minnatdor bo'lasiz!

Ko'p jihatdan, ushbu maqola oldingi xabarning davomi. Agar siz Ethereum dunyosi bilan tanish bo'lsangiz, davom etishdan oldin uni o'qishni maslahat beraman.

Ushbu mashqning maqsadi:

  1. Rivojlanish muhitini sozlang.
  2. Shartnomani tuzish, uni tuzish va uni sizning rivojlanish muhitingizda joylashtirish jarayonini o'rganing.
  3. "Nodejs" konsoli orqali blockchain-dagi shartnoma bilan o'zaro aloqada bo'ling.
  4. Ovozlarni sanash va sahifada nomzodlarga ovoz berish uchun oddiy veb-sahifa orqali shartnoma bilan o'zaro aloqada bo'ling.

Butun dasturni o'rnatish va yaratish ubuntu 16.04 xenial-ning yangi o'rnatilishida amalga oshirildi. Ilovani makoslarda ham o'rnatdim va sinovdan o'tkazdim.

Men qanday qilib biz yaratmoqchi bo'lgan ushbu ilovani vizual ravishda tasavvur qilaman.

1. Rivojlanish muhitini sozlash

Jonli blockchainga qarshi dasturni ishlab chiqish o‘rniga biz ganache deb nomlangan xotira blokchainidan foydalanamiz (uni blockchain simulyatori deb o‘ylang). Qo'llanmaning 2-qismida biz haqiqiy blockchain bilan o'zaro aloqada bo'lamiz. Quyida ganache, web3js-ni o'rnatish va Linux operatsion tizimida sinov blokchainini ishga tushirish bo'yicha qadamlar. Xuddi shu ko'rsatmalar makoslarda ham ishlaydi. Derazalar uchun ko'rsatmalarga amal qilishingiz mumkin (rahmat Prateesh!).

mahesh @ zastrin: ~ $ np -v
6.1.0
mahesh @ zastrin: ~ $ tugun -v
v10.4.0
mahesh @ zastrin: ~ $ mkdir -p ethereum_voting_dapp / bob1 /
mahesh @ zastrin: ~ $ cd ethereum_voting_dapp / 1-bo'limda
mahesh @ zastrin: ~ / ethereum_voting_dapp / bo'limda1 $ npm ganache-cli o'rnatish web3@1.0.0-beta.37
mahesh @ zastrin: ~ / ethereum_voting_dapp / bo'limda1 $ node_modules / .bin / ganache-cli
Chiqish quyidagi kabi ko'rinishi kerak
Ganache CLI v6.3.0 (ganache-yadro: 2.4.0)
Mavjud hisoblar
==================
(0) 0x66d1dda957bc7a087324130c89547ce579cee563 (~ 100 ETH)
(1) 0xf98e7d03f312c8329d01ef0642b74e77740cc203 (~ 100 ETH)
(2) 0x71d4ee31cd935d17a2b00b7d8873651d6aefbf73 (~ 100 ETH)
(3) 0x2fdaa99748e6224e03e3e5a1a9a89abd906df671 (~ 100 ETH)
(4) 0xfb32d320a858747453ac1b4e23c849fecd6ebf33 (~ 100 ETH)
(5) 0x2c00cd8a488a8ae569553dfe90bf90d65af97630 (~ 100 ETH)
(6) 0xa4099d0d4a0e7ce5bf26c3f4078a001daf5cedff (~ 100 ETH)
(7) 0xa53c14d56683bdc775c19540679b0809bbf95a2b (~ 100 ETH)
(8) 0x3ba642d43a2a24a0160fa22c358cf697aa4a627f (~ 100 ETH)
(9) 0x81c43af78fdb4a2c8078ec37875e9616e3c5a3e4 (~ 100 ETH)
Xususiy kalitlar
==================
(0) 0xee670c7915b5e73b6f5c82da3919701f19ed1f72a1d4f31007836930623f4a57.
(1) 0xf40063c41978799ff6fa4b85d678b0f42ed6c774c35fa883a289fdc7fa0b65cb
(2) 0x5228a5e30d1be11885cd7d44d4a47b1dfa22db4033cd758a1c3677a3a0cb5383.
(3) 0x3520c609b830538bd8c5d05c8f53338322411deb477308c5543f20a420fea5ec
(4) 0xa7728cbc1eee41d696cb1d252157fc66ab1726ff751f2132c387726b5c901c35.
(5) 0xe459627dc49d59da76c393b40c36c674c8307ec52c24794a33ddc773f3c229fc
(6) 0xa65715e3bdc8236420491de88486ff301a19b624b006811a89742e74120eac50.
(7) 0xc95ab6498d506f45b4b8ab2b04967d51e05af41059334df91d63097cb3254a3b.
(8) 0xf0619031f2ba4319aae691ce34fe8cce136640fb715b70d5baa045c2d58f1b80
(9) 0x39a85154d16a1eba4a9f8514f187bcb6c8b867b790035afa9f92bf2731aebc5b
HD Hamyon
==================
Mnemonic: kechirim so'rashdan tashqari onlayn kit kit pishloq o'yini to'piqlari birgalikda kartoshkadan dam olishadi
HD HD asosi: m / 44 '/ 60' / 0 '/ 0 / {account_index}

Ganache-cli avtomatik ravishda o'ynash uchun 10 ta sinov hisobini yaratishiga e'tibor bering. Ushbu hisoblar 100 (soxta) eterlar bilan oldindan yuklanadi.

2. Oddiy ovoz berish shartnomasi

Shartnomamizni yozish uchun biz qattiqlik dasturlash tilidan foydalanmoqchimiz. Agar siz ob'ektga yo'naltirilgan dasturlash bilan tanish bo'lsangiz, qattiqlik shartnomalarini yozishni o'rganish shabada bo'lishi kerak. Nomzodlar qatorini boshlaydigan konstruktor bilan Ovoz berish deb nomlangan shartnoma tuzamiz. Biz ikkita usulni yozamiz, bittasi nomzod olgan ovozlarning umumiy miqdorini qaytarish uchun va boshqa usulda nomzod uchun ovozlarni ko'paytirish usulini yozamiz.

Eslatma: Siz shartnomani blockchain-ga joylashtirganingizda konstruktor bir marta va faqat bir marta chaqiriladi. Sizning kodingizning har bir joylashishi eski kodning o'rnini bosadigan veb-dunyoda farqli o'laroq, blockchain-da o'rnatilgan kod o'zgarmasdir. Ya'ni, agar siz shartnomangizni yangilasangiz va uni qayta joylashtirsangiz, eski shartnoma baribir blokchain ichida saqlanadi va unda saqlangan barcha ma'lumotlar saqlanib qoladi, yangi tarqatish shartnomaning yangi namunasini yaratadi.

Quyida ovoz berish shartnomasining kodi inkor qilingan izoh bilan:

Yuqoridagi kodni Ethereum_voting_dapp / Chapter1 katalogidagi Voting.sol nomli faylga nusxa ko'chiring. Endi kodni tuzamiz va uni ganache blockchain-ga joylashtiramiz.

Qattiqlik kodini tuzish uchun biz avval solc deb nomlangan npm modulni o'rnatamiz. Shunda shartnoma tuzishda kompilyatordan foydalaning

mahesh @ zastrin: ~ / ethereum_voting_dapp / bo'limda1 $ npm solc@0.5.3 o'rnatish
mahesh @ zastrin: ~ / ethereum_voting_dapp / bo'limda1 $ node_modules / .bin / solcjs --bin --abi Ovoz berish.sol
mahesh @ zastrin: ~ / ethereum_voting_dapp / bob1 $ ls
Ovoz berish.sol Ovoz berish_sol_Voting.abi Ovoz berish_sol_Voting.bin

Yuqoridagi buyruqdan foydalanib kodni muvaffaqiyatli kompilyatsiya qilganingizda, kompilyator tushunish uchun muhim bo'lgan ikkita faylni chiqaradi:

  1. Voting_sol_Voting.bin: Bu Voting.sol-da boshlang'ich kodni kompilyatsiya qilish paytida olingan baytekod. Bu blockchain-ga joylashtiriladigan kod.
  2. Voting_sol_Voting.abi: Bu kontrakt foydalanuvchisida shartnomada qanday usullar mavjudligini aytib beradigan interfeys yoki shablon (abi deb ataladi). Kelajakda shartnoma bilan o'zaro aloqada bo'lishingiz kerak bo'lganida, sizga ushbu abi ta'rifi kerak bo'ladi. ABI haqida ko'proq ma'lumotni bu erda o'qishingiz mumkin

Oldingi maqoladan eslang, web3js - bu RPC orqali blockchain bilan o'zaro aloqada bo'lishga imkon beradigan kutubxona. Biz ushbu kutubxonadan ilovamizni tarqatish va u bilan ishlash uchun foydalanamiz.

Birinchidan, tugun konsoliga kirish va web3 ob'ektini ishga tushirish uchun terminalingizdagi "tugun" buyrug'ini ishga tushiring. Quyidagi kod parchalarini tugun konsolida kiritish kerak.

mahesh @ zastrin: ~ / ethereum_voting_dapp / bo'limda1 $ tugun
> Web3 = talab qilish ('web3')
> veb3 = yangi Web3 ("http: // localhost: 8545")

Web3 obyekti ishga tushirilishi va blockchain bilan bog‘lanishiga ishonch hosil qilish uchun blockchain-dagi barcha hisoblarni so‘rashga ruxsat bering. Quyidagi kabi natijani ko'rishingiz kerak:

> web3.eth.getAccounts (console.log)
['0x9c02f5c68e02390a3ab81f63341edc1ba5dbb39e',
'0x7d920be073e92a590dc47e4ccea2f28db3f218cc',
'0xf8a9c7c65c4d1c0c21b06c06ee5da80bd8f074a9',
'0x9d8ee8c3d4f8b1e08803da274bdaff80c2204fc6',
'0x26bb5d139aa7bdb1380af0e1e8f98147ef4c406a',
'0x622e557aad13c36459fac83240f25ae91882127c',
'0xbf8b1630d5640e272f33653e83092ce33d302fd2',
'0xe37a3157cb3081ea7a96ba9f9e942c72cf7ad87b',
'0x175dae81345f36775db285d368f0b1d49f61b2f8',
'0xc26bda5f3370bdd46e7c84bdb909aead4d8f35f3']

Shartnomani tuzish uchun baytekod va abi fayl tizimidan quyidagi qatorga yuklang

> bytecode = fs.readFileSync ('Ovoz berish_sol_Voting.bin'). toString ()
> abi = JSON.parse (fs.readFileSync ('Ovoz berish_sol_Voting.abi'). toString ())

Keling, shartnomani tarqataylik. Avval siz blockchain-da shartnomalarni o'rnatish va ishga tushirish uchun foydalaniladigan shartnoma ob'ekti (deployContract) yaratasiz.

> demissionsContract = yangi web3.eth.Contract (abi)
> listOfCandidates = ['Rama', 'Nik', 'Jose']
> joylashtirilganContract.deploy ({
  ma'lumotlar: baytekod,
  argumentlar: [listOfCandidates.map (name => web3.utils.asciiToHex (name))]
yuborish ({
  dan: '0xfb3 kabi 10 ta hisob qaydnomalarining 1-ni kiriting ....',
  gaz: 1500000,
  gaz narxi: web3.utils.toWei ('0.00003', 'efir')
keyin) (keyin (newContractInstance) => {
  joylashtirilganContract.options.address = newContractInstance.options.address
  konsol.log (yangiContractInstance.options.address)
});

Web3 tarqatish funktsiyasidan foydalanib, shartnomani blockchain-ga yuborish uchun yuboramiz. Funktsiyalarni tarqatish va yuborish uchun biz qanday dalillar keltiramiz:

  1. ma'lumotlar: Bu biz blockchain-ga joylashtirgan bytecode-ni tuzgan.
  2. argumentlar: Bular biz shartnoma tuzuvchisiga beradigan dalillar. Bizning holatlarimizda biz nomzodlar qatoridan o'tamiz. E'tibor bering, biz baytni32-ga aniq konvertatsiya qilishimiz kerak, shuning uchun biz har bir nomzod nomiga web3.utils.asciiToHex deb nomlaymiz (xarita funktsiyasidan foydalangan holda).
  3. dan: blockchain shartnomani kim ishlatganligini kuzatishi kerak. Bunday holda, biz ushbu shartnomaning egasi bo'lish uchun (uni blockchain-ga joylashtiradigan) web3.eth.getAccounts-ga qo'ng'iroq qilishdan qaytadigan birinchi hisobni olamiz. Esda tutingki, web3.eth.getAccounts sinov blokchainini ishga tushirganda yaratilgan 10 ta test hisoblarining ganache-dan iborat qatorini qaytaradi. Jonli blockchain-da siz shunchaki har qanday hisob qaydnomasidan foydalana olmaysiz. Amalga oshirishdan oldin siz ushbu hisob qaydnomasiga egalik qilishingiz va uni qulfdan chiqarishingiz kerak. Hisob qaydnomasini yaratishda sizdan parol so'raladi va aynan shu qayd yozuviga egaligingizni tasdiqlash uchun foydalanasiz. Ganache qulaylik uchun sukut bo'yicha barcha 10 hisobni blokdan chiqaradi.
  4. gaz: blockchain bilan o'zaro aloqada bo'lish uchun pul kerak. Ushbu pul sizning kodingizni blockchain-ga kiritish uchun barcha ishlarni bajaradigan konchilarga tushadi. Kodni blockchain-ga kiritish uchun qancha pul to'lashga tayyor ekanligingizni belgilashingiz kerak va buni 'gaz' qiymatini belgilash orqali amalga oshirishingiz kerak. Hisobingizdagi eter qoldig'i gaz sotib olishga sarflanadi. Gazning narxi tarmoq tomonidan belgilanadi.
  5. gaz narx: Har bir gaz birligi u bilan bog'liq narxga ega. Bu gaz narxlari sohasida o'rnatiladi.

Endi biz shartnomani o'rnatdik va shartnoma bilan o'zaro ta'sir qilish uchun foydalanishimiz mumkin bo'lgan shartnoma namunasi (yuqoridagi o'zgaruvchan kontrakt). Blokchainda joylashtirilgan yuz minglab shartnomalar mavjud. Xo'sh, qanday qilib shartnomani o'sha blockchainda aniqlaysiz? Javob: joylashtirilganContract.options.address. Shartnoma bilan ishlashga to'g'ri kelganida, sizga ilgari aytib o'tilgan manzil va Abi ta'rifi kerak.

3. Nodejs konsolida shartnoma bilan o'zaro aloqada bo'ling

> joylashtirilganContract.methods.totalVotesFor (web3.utils.asciiToHex ('Rama')). qo'ng'iroq (konsol.log)
> demissionsContract.methods.voteForCandidate (web3.utils.asciiToHex ('Rama')). yuborish (({: Hisobingizdagi manzilingiz '} dan) va keyin ((f) => console.log (f))
> joylashtirilganContract.methods.totalVotesFor (web3.utils.asciiToHex ('Rama')). qo'ng'iroq (konsol.log)

Sizning tuguningiz konsolida yuqoridagi buyruqlarni sinab ko'ring va siz ovozlar sonini oshirishni ko'rishingiz kerak. Har safar nomzodga ovoz berganingizda, siz tranzaksiya identifikatorini qaytarasiz: masalan: '0xdedc7ae544c3dde74ab5a0b07422c5a51b5240603d31074f5b75c0ebc786bf53' yuqoridagi). Ushbu o‘tkazma identifikatori ushbu o‘tkazmaning amalga oshirilganligidan dalolat beradi va siz kelajakda istalgan vaqtda unga qayta murojaat qilishingiz mumkin. Ushbu bitim o'zgarmasdir. Ushbu o'zgarmaslik Ethereum kabi blockchainlarning katta afzalliklaridan biridir. Kelgusi darslarda biz ushbu o'zgarmaslikni qo'llaydigan dasturlarni yaratamiz.

4. Blokchainga ulanish va ovoz berish uchun veb-sahifa

Endi ishning ko'p qismi bajarildi, endi biz bajarishimiz kerak bo'lgan narsa oddiy nomzodlar nomli html faylini yaratish va ovoz berish buyruqlarini (biz nodejs konsolida sinab ko'rgan va sinab ko'rgan) js faylida. Quyida html kodi va js faylini topishingiz mumkin. Ikkalasini ethereum_voting_dapp / Chapter1 katalogiga tashlang va brauzeringizda index.html-ni oching.

Agar esingizda bo'lsa, oldinroq biz har qanday shartnoma bilan aloqada bo'lish uchun abi va manzilni talab qilishimizni aytdik. Siz yuqorida index.js faylida kontrakt bilan qanday ishlashini ko'rishingiz mumkin.

brauzeringizda index.html-ni oching va siz shunga o'xshash narsani ko'rishingiz kerak.

Agar siz matn maydoniga nomzodning nomini kiritib ovoz berishingiz va ovozlarni hisoblash sonini ko'rishingiz mumkin bo'lsa, siz birinchi arizangizni muvaffaqiyatli yaratdingiz! Tabriklaymiz! Xulosa qilish uchun siz o'zingizning muhitingizni o'rnatdingiz, oddiy shartnomani kodladingiz, shartnomani tuzdingiz va blockchain-ga joylashtirdingiz va u bilan nodejs konsolida va keyin veb-sahifa orqali o'zaro aloqada bo'ldingiz. Agar sizda yo'q bo'lsa, endi o'zingizni orqangizga silash uchun yaxshi vaqt bo'lar edi :)

2-qismida biz ushbu shartnomani butun dunyo ko'rishi va nomzodga ovoz berishi uchun ommaviy sinov tarmog'iga joylashtiramiz. Bundan tashqari, biz yanada murakkablashadi va rivojlanish uchun truffle ramkasini ishlatamiz (va butun jarayonni boshqarish uchun nodejs konsolidan foydalanish shart emas). Ushbu qo'llanma Ethereum platformasida markazlashtirilmagan dasturni ishlab chiqarishni boshlash haqida amaliy g'oyani olishga yordam berdi deb umid qilaman.

Har doimgidek Rain Rupert Reverga ushbu xabarni to'g'rilaganliklari / tahrirlagani uchun minnatdorchilik bildiraman.

Agar siz dasturni ishlashi bilan bog'liq muammolarga duch kelsangiz, meni twitter @zastrinlab yoki mahesh@zastrin.com elektron pochta manziliga bepul yuboring.

Agar sizga ushbu qo'llanma yoqqan bo'lsa, sizga ko'proq qiziqarli www.zastrin.com veb-saytidagi haqiqiy loyihalarga asoslangan kurslar yoqishi mumkin

Agar ko'proq darsliklar yozganim haqida xabardor bo'lishni xohlasangiz, bu erda obuna bo'lishingiz mumkin.