Buku “Membuat kontrak pintar Solidity untuk blockchain Ethereum. Panduan Praktis


Selama lebih dari setahun saya mengerjakan buku “Membuat kontrak pintar Solidity untuk blockchain Ethereum. Panduan praktis ", dan sekarang pekerjaan ini selesai, dan buku ini diterbitkan dan tersedia dalam Liter .

Saya harap buku saya membantu Anda dengan cepat mulai membuat kontak pintar Solidity dan mendistribusikan aplikasi DApp untuk blockchain Ethereum. Ini terdiri dari 12 pelajaran dengan latihan praktis. Setelah menyelesaikannya, pembaca akan dapat membuat node Ethereum lokal mereka sendiri, menerbitkan kontrak pintar dan memanggil metode mereka, bertukar data antara dunia nyata dan kontrak pintar menggunakan oracle, bekerja dengan jaringan uji debugging Rinkeby.

Buku ini ditujukan kepada semua orang yang tertarik pada teknologi maju di bidang blockchain dan ingin cepat mendapatkan pengetahuan yang memungkinkan mereka untuk terlibat dalam pekerjaan yang menarik dan menjanjikan.

Di bawah ini Anda akan menemukan daftar isi dan bab pertama buku tersebut (fragmen buku juga tersedia di Liter ). Berharap mendapatkan umpan balik, komentar, dan saran. Saya akan mencoba mempertimbangkan semua ini ketika menyiapkan edisi buku berikutnya.

Daftar isi
Pendahuluan
Buku kami ditujukan bagi mereka yang ingin tidak hanya memahami prinsip-prinsip blockchain Ethereum, tetapi juga memperoleh keterampilan praktis dalam membuat aplikasi DApp terdistribusi dalam bahasa pemrograman Solidity untuk jaringan ini.

Buku ini lebih baik tidak hanya untuk dibaca, tetapi untuk bekerja dengannya, menyelesaikan tugas-tugas praktis yang dijelaskan dalam pelajaran. Agar berfungsi, Anda memerlukan komputer lokal, server virtual atau cloud dengan OS Debian atau Ubuntu yang diinstal. Anda juga dapat menggunakan Raspberry Pi untuk menyelesaikan banyak tugas.

Dalam pelajaran pertama, kami akan mempertimbangkan prinsip-prinsip operasi blockchain Ethereum dan terminologi dasar, serta berbicara tentang di mana Anda dapat menggunakan blockchain ini.

Tujuan dari pelajaran kedua adalah untuk membuat node blockchain pribadi Ethereum untuk pekerjaan lebih lanjut sebagai bagian dari kursus ini di Ubuntu dan server Debian. Kami akan mempertimbangkan fitur-fitur untuk menginstal utilitas dasar, seperti geth, yang memastikan operasi simpul blockchain kami, serta segudang daemon gudang data desentralisasi.

Pelajaran ketiga akan mengajarkan Anda cara bereksperimen dengan Ethereum pada komputer mikro Raspberry Pi yang murah. Anda akan menginstal sistem operasi Rasberian (OS) pada Raspberry Pi, utilitas Geth yang menyediakan operasi node blockchain, serta daemon gudang data desentralisasi Swarm.

Pelajaran keempat dikhususkan untuk akun dan unit cryptocurrency di jaringan Ethereum, serta cara mentransfer dana dari satu akun ke akun lain dari konsol Geth. Anda akan belajar cara membuat akun, memulai transaksi pengiriman uang, menerima status transaksi, dan penerimaannya.

Dalam pelajaran kelima, Anda akan berkenalan dengan kontrak pintar di jaringan Ethereum, belajar tentang penerapannya oleh mesin virtual Ethereum.

Anda akan membuat dan menerbitkan kontrak pintar pertama Anda di jaringan pribadi Ethereum dan belajar bagaimana memanggil fungsinya. Anda akan menggunakan lingkungan pengembangan IDE Remix Solidity untuk ini. Selain itu, Anda akan belajar cara menginstal dan menggunakan kompiler batch solc.
Kami juga akan berbicara tentang apa yang disebut dengan antarmuka biner Aplikasi Binary Interface (ABI) dan mengajarkan cara menggunakannya.

Pelajaran keenam dikhususkan untuk pembuatan skrip JavaScript yang berjalan di bawah Node.js dan melakukan operasi dengan kontrak pintar Solidity.

Anda menginstal Node.js di Ubuntu, Debian dan Rasberian OS, menulis skrip untuk menerbitkan kontrak pintar di jaringan lokal Ethereum dan memanggil fungsinya.

Selain itu, Anda akan belajar cara mentransfer dana antara akun biasa menggunakan skrip, serta mentransfernya ke akun kontrak pintar.

Dalam pelajaran ketujuh, Anda akan belajar cara menginstal dan menggunakan lingkungan terintegrasi Truffle, yang populer di kalangan pengembang kontrak pintar Solidity. Anda akan belajar cara membuat skrip JavaScript yang menjalankan fungsi kontrak menggunakan modul truffle-kontrak, dan juga menguji kontrak cerdas Anda dengan Truffle.

Pelajaran kedelapan berkaitan dengan tipe data Solidity. Anda akan menulis kontrak pintar yang berfungsi dengan tipe data seperti bilangan bulat yang ditandatangani dan tidak, angka yang ditandatangani, string, alamat, variabel tipe kompleks, array, enumerasi, struktur dan kamus.

Dalam pelajaran kesembilan, Anda akan selangkah lebih dekat untuk membuat kontrak pintar untuk jaringan inti Ethereum. Anda akan belajar cara menerbitkan kontrak menggunakan Truffle di jaringan pribadi Geth, serta di jaringan pengujian Rinkeby. Men-debug kontrak pintar di jaringan Rinkeby sangat berguna sebelum menerbitkannya di jaringan utama - hampir semuanya nyata, tetapi gratis.

Sebagai bagian dari pelajaran, Anda akan membuat simpul jaringan uji Rinkeby, mengisinya dengan dana, dan menerbitkan kontrak pintar.

Pelajaran 10 berfokus pada pergudangan data terdistribusi Ethereum Swarm. Menggunakan penyimpanan terdistribusi, Anda menghemat penyimpanan data dalam jumlah besar pada blockchain Ethereum.

Sebagai bagian dari pelajaran ini, Anda akan membuat penyimpanan Swarm lokal, melakukan operasi menulis dan membaca file, serta direktori dengan file. Selanjutnya, Anda akan belajar cara bekerja dengan gateway publik Swarm, menulis skrip untuk mengakses Swarm dari Node.js, serta menggunakan modul Perl Net :: Ethereum :: Swarm.

Tujuan pelajaran 11 adalah untuk menguasai kontrak pintar Solidity menggunakan bahasa pemrograman Python populer dan kerangka Web3.py. Anda akan menginstal kerangka kerja ini, menulis skrip untuk mengkompilasi dan mempublikasikan kontrak pintar, serta untuk memanggil fungsinya. Pada saat yang sama, Web3.py akan digunakan dengan sendirinya dan dalam hubungannya dengan lingkungan pengembangan terintegrasi Truffle.

Dalam pelajaran 12, Anda akan belajar cara mentransfer data antara kontrak pintar dan dunia nyata menggunakan nubuat. Ini berguna bagi Anda untuk menerima data dari situs Web, perangkat IoT Internet of Things, berbagai perangkat dan sensor, dan mengirim data dari kontrak pintar ke perangkat ini. Pada bagian praktis dari pelajaran, Anda akan membuat oracle dan kontrak pintar yang menerima nilai tukar USD saat ini untuk rubel dari situs web Bank Sentral Federasi Rusia.

Pelajaran 1. Secara singkat tentang blockchain dan jaringan Ethereum
Tujuan pelajaran: untuk berkenalan dengan prinsip-prinsip blockchain Ethereum, area penerapannya, dan terminologi dasar.
Latihan praktis : tidak disediakan dalam pelajaran ini.

Hampir tidak ada pengembang perangkat lunak saat ini yang belum mendengar apa pun tentang teknologi Blockchain, cryptocurrency (Cryptocurrency atau Crypto Currency), Bitcoin (Bitcoin), penawaran koin awal (ICO, penawaran koin awal), kontrak pintar (Kontrak Cerdas), serta konsep dan istilah lain yang terkait dengan blockchain.

Teknologi Blockchain membuka pasar baru dan menciptakan lapangan kerja bagi para programmer. Jika Anda memahami semua seluk beluk teknologi cryptocurrency dan teknologi kontrak pintar, maka Anda seharusnya tidak memiliki masalah dengan menerapkan pengetahuan ini dalam praktiknya.

Saya harus mengatakan bahwa ada banyak spekulasi seputar cryptocurrency dan blockchains. Kami akan mengesampingkan diskusi tentang perubahan tingkat mata uang kripto, tentang pembuatan piramida, tentang seluk-beluk undang-undang mata uang kripto, dll. Dalam kursus pelatihan kami, kami akan fokus terutama pada aspek teknis penerapan kontrak pintar blockchain Ethereum (Ethereum, ether) dan pengembangan yang disebut Aplikasi Terdistribusi (DApp).

Apa itu blockchain?


Blockchain (Blockchain, Block Chain) adalah rantai blok data yang terhubung dengan cara tertentu. Pada awal rantai adalah blok pertama yang disebut blok genesis atau blok genesis. Diikuti oleh yang kedua, kemudian yang ketiga, dan seterusnya.

Semua blok data ini secara otomatis diduplikasi pada banyak node dari jaringan blockchain. Ini memastikan penyimpanan data blockchain yang terdesentralisasi.
Anda dapat membayangkan sistem blockchain sebagai sejumlah besar node (server fisik atau virtual), jaringan dan mereplikasi semua perubahan dalam rantai blok data. Ini seperti komputer multiserver raksasa, dan simpul-simpul komputer seperti itu (server) dapat tersebar di seluruh dunia. Dan Anda juga dapat menambahkan komputer Anda ke jaringan blockchain.

Database terdistribusi


Blockchain dapat dibayangkan sebagai database terdistribusi yang direplikasi ke semua node dari jaringan blockchain. Secara teori, blockchain akan beroperasi selama setidaknya satu node yang menyimpan semua blok blockchain berfungsi.

Registri Data Terdistribusi


Blockchain dapat dibayangkan sebagai registri terdistribusi data dan operasi (transaksi). Nama lain untuk registri semacam itu adalah buku besar.

Anda dapat menambahkan data ke registri terdistribusi, tetapi Anda tidak dapat mengubah atau menghapusnya. Ketidakmungkinan seperti itu dicapai, khususnya, dengan menggunakan algoritma kriptografi, algoritma khusus untuk menambahkan blok ke rantai, dan penyimpanan data terdesentralisasi.

Ketika menambahkan blok dan melakukan operasi (transaksi), kunci privat dan publik digunakan. Mereka membatasi pengguna blockchain dengan memberi mereka akses hanya ke blok data mereka.

Transaksi


Blockchain menyimpan informasi tentang operasi (transaksi) dalam blok. Pada saat yang sama, transaksi lama yang sudah selesai tidak dapat dibatalkan atau diubah. Transaksi baru disimpan di blok baru yang ditambahkan.

Dengan demikian, seluruh riwayat transaksi dapat dicatat tidak berubah di blockchain. Oleh karena itu, blockchain dapat digunakan, misalnya, untuk menyimpan operasi perbankan dengan aman, informasi hak cipta, riwayat perubahan dalam kepemilikan real estat, dll.

Blockchain Ethereum berisi apa yang disebut status sistem. Saat transaksi selesai, status berubah dari awal ke saat ini. Transaksi ditulis dalam blok.

Blokir publik dan pribadi


Perlu dicatat bahwa semua hal di atas hanya berlaku untuk apa yang disebut jaringan blockchain publik, yang tidak dapat dikendalikan oleh individu individu atau badan hukum, badan negara atau pemerintah.
Apa yang disebut jaringan blockchain pribadi berada di bawah kendali penuh pencipta mereka, dan semuanya mungkin ada di sana, misalnya, penggantian lengkap semua blok rantai.

Aplikasi Praktis Blockchain


Untuk apa blockchain masuk?

Singkatnya, blockchain memungkinkan Anda untuk melakukan transaksi (transaksi) dengan aman antara orang-orang yang tidak saling percaya atau perusahaan. Data yang direkam dalam blockchain (transaksi, data pribadi, dokumen, sertifikat, kontrak, faktur, dll.) Tidak dapat dipalsukan atau diganti setelah perekaman. Oleh karena itu, berdasarkan blockchain, Anda dapat membuat, misalnya, pendaftar terdistribusi dari berbagai jenis dokumen.

Tentu saja, Anda tahu bahwa sistem cryptocurrency dibuat atas dasar blockchains, yang dirancang untuk menggantikan uang kertas biasa. Uang kertas juga disebut uang fiat (dari Fiat Money).
Blockchain menyediakan penyimpanan dan imutabilitas transaksi yang dicatat dalam blok, oleh karena itu ia juga dapat digunakan untuk membuat sistem cryptocurrency. Ini berisi seluruh riwayat transfer dana crypto antara berbagai pengguna (akun), dan operasi apa pun dapat dilacak.

Meskipun transaksi dalam sistem cryptocurrency mungkin anonim, menarik cryptocurrency dan menukarnya dengan uang fiat biasanya mengarah pada pengungkapan identitas pemilik aset cryptocurrency.

Apa yang disebut kontrak pintar, yang merupakan perangkat lunak yang berjalan di jaringan Ethereum, mengotomatiskan proses penyelesaian kesepakatan dan mengendalikan eksekusi mereka. Ini sangat efektif jika pembayaran untuk transaksi dilakukan dengan cryptocurrency Ether.

Blockchain Ethereum dan kontrak pintar Ethereum yang ditulis dalam bahasa pemrograman Solidity dapat digunakan, misalnya, dalam bidang berikut:

  • alternatif untuk notarisisasi dokumen;
  • penyimpanan register real estat dan informasi tentang transaksi dengan real estat;
  • penyimpanan informasi hak cipta tentang kekayaan intelektual (buku, gambar, musik, dll.);
  • penciptaan sistem pemungutan suara independen;
  • keuangan dan perbankan;
  • logistik internasional, melacak pergerakan barang;
  • penyimpanan data pribadi sebagai analog dari sistem kartu identitas;
  • transaksi aman di bidang komersial;
  • penyimpanan hasil pemeriksaan medis, serta riwayat prosedur yang ditentukan

Masalah blockchain


Tapi, tentu saja, tidak semuanya sesederhana kelihatannya!

Ada masalah dengan memverifikasi data sebelum menambahkannya ke blockchain (misalnya, bukan palsu?), Masalah dalam keamanan sistem dan perangkat lunak aplikasi yang digunakan untuk bekerja dengan blockchain, masalah dengan kemampuan untuk menggunakan metode rekayasa sosial untuk mencuri akses ke dompet cryptocurrency, dll. .p.

Sekali lagi, jika ini bukan tentang blockchain publik, yang simpulnya tersebar di seluruh dunia, tetapi tentang blockchain pribadi yang dimiliki oleh seseorang atau organisasi, maka tingkat kepercayaan di sini tidak akan lebih tinggi dari tingkat kepercayaan pada orang ini atau organisasi ini.

Harus juga diingat bahwa data yang direkam pada blockchain menjadi tersedia untuk semua orang. Dalam hal ini, blockchain (terutama yang publik) tidak cocok untuk menyimpan informasi rahasia. Namun, fakta bahwa informasi pada blockchain tidak dapat diubah dapat membantu mencegah atau menyelidiki semua jenis kegiatan penipuan.

Aplikasi Ethereum yang terdesentralisasi akan nyaman jika Anda membayar penggunaannya dengan cryptocurrency. Semakin banyak orang yang memiliki mata uang kripto atau siap untuk membelinya, aplikasi DApp yang lebih populer dan kontrak pintar akan mendapatkan.

Di antara masalah umum dari blockchain yang menghambat aplikasi praktisnya, orang dapat menyebutkan kecepatan terbatas menambahkan blok baru dan biaya transaksi yang relatif tinggi. Tetapi teknologi di bidang ini secara aktif berkembang, dan ada harapan bahwa masalah teknis akan teratasi seiring waktu.

Masalah lain adalah bahwa kontrak pintar Ethereum blockchain bekerja di lingkungan mesin virtual yang terisolasi dan tidak memiliki akses ke data dunia nyata. Secara khusus, program kontrak pintar tidak dapat membaca data dari situs atau perangkat fisik apa pun (sensor, kontak, dll.) Sendiri, juga tidak dapat menampilkan data ke perangkat eksternal apa pun. Kami akan membahas masalah ini dan metode penyelesaiannya dalam pelajaran yang ditujukan untuk apa yang disebut Oracles - perantara informasi kontrak cerdas.

Ada juga batasan hukum. Di beberapa negara, misalnya, dilarang menggunakan cryptocurrency sebagai alat pembayaran, tetapi Anda dapat memilikinya sebagai jenis aset digital, seperti sekuritas. Aset semacam itu dapat dibeli dan dijual di bursa. Bagaimanapun, saat membuat proyek yang bekerja dengan cryptocurrency, Anda perlu membiasakan diri dengan undang-undang negara di mana yurisdiksinya berada di bawah proyek Anda.

Bagaimana rantai blockchain terbentuk


Seperti yang telah kami katakan, blockchain adalah rantai sederhana dari blok data. Pertama, blok pertama dari rantai ini terbentuk, kemudian blok kedua ditambahkan ke dalamnya, dan seterusnya. Diasumsikan bahwa data transaksi disimpan dalam blok, dan ditambahkan ke blok terakhir.

Dalam gbr. 1.1 kami menunjukkan versi paling sederhana dari urutan blok, di mana blok pertama merujuk ke yang berikutnya.


Fig. 1.1. Urutan blok sederhana

Namun dalam perwujudan ini, sangat mudah untuk memalsukan konten dari blok mana pun dalam rantai, karena blok tersebut tidak mengandung informasi apa pun untuk melindungi terhadap perubahan. Mengingat bahwa blockchain dimaksudkan untuk penggunaan orang dan perusahaan di mana tidak ada kepercayaan, kita dapat menyimpulkan bahwa metode ini menyimpan data untuk blockchain tidak cocok.

Mari kita lindungi blok dari yang palsu. Pada tahap pertama, kami akan mencoba melindungi setiap blok dengan checksum (Gbr. 1.2).


Fig. 1.2. Tambahkan perlindungan blok data dengan checksum

Sekarang, seorang penyerang tidak bisa hanya mengubah blok karena mengandung checksum dari data blok. Memeriksa checksum akan menunjukkan bahwa data telah diubah.

Untuk menghitung checksum, Anda dapat menggunakan salah satu fungsi hash, seperti MD-5, SHA-1, SHA-256, dll. Fungsi hash menghitung nilai tertentu (misalnya, sebagai string teks dengan panjang konstan) sebagai hasil dari melakukan operasi ireversibel pada blok data. Operasi tergantung pada jenis fungsi hash.

Bahkan dengan perubahan kecil pada isi blok data, nilai fungsi hash juga akan berubah. Dengan menganalisis nilai fungsi hash, tidak mungkin untuk mengembalikan blok data yang dihitung.

Apakah perlindungan seperti itu cukup? Sayangnya tidak.

Dalam skema ini, checksum (fungsi hash) hanya melindungi blok individu, tetapi tidak seluruh rantai blok. Mengetahui algoritma perhitungan fungsi hash, penyerang dapat dengan mudah mengganti isi blok. Juga, tidak ada yang akan menghentikannya menghapus blok dari rantai atau menambahkan yang baru.

Untuk melindungi seluruh rantai secara keseluruhan, dimungkinkan untuk menyimpan hash data dari blok sebelumnya di setiap blok bersama dengan data (Gbr. 1.3).


Fig. 1.3. Tambahkan hash dari blok sebelumnya ke blok data

Dalam skema ini, untuk mengubah blok, Anda perlu menghitung ulang fungsi hash semua blok berikutnya. Tampaknya, apa masalahnya?

Dalam blockchain nyata, kesulitan buatan juga dibuat untuk menambahkan blok baru - algoritma digunakan yang membutuhkan banyak sumber daya komputasi. Mengingat bahwa untuk membuat perubahan pada suatu blok, bukan hanya satu blok yang perlu dihitung, tetapi semua blok berikutnya, akan sangat sulit untuk melakukan ini.

Ingat juga bahwa data blockchain disimpan (digandakan) pada banyak node jaringan, mis. . , .. .

, .

Ethereum


Ethereum , DApp. , Ethereum (-, smart contracts), Solidity.

2013 , Bitcoin Magazine, 2015 . , , Ethereum - Solidity.


(mining) , « ». , .. Ethereum.

, , (miner).
(), , Nonce, -, . Ethash, Ethereum, Nonce .

Nonce, (PoW, Proof-of-work). , Ethereum, — Ether. 5 Ether, .

, Ethereum , , . , Solidity DApp Ethereum.


, . , , .

. — ( ), . , Ethereum - Solidity. , , ..

, . , , , , - , , .

. . , , .

2. Ubuntu Debian


Geth Swarm Ubuntu
Geth Swarm Debian

Go

Go
Geth Swarm

genesis.json






Geth


3. Raspberry Pi 3
Raspberry Pi 3
Rasberian

SSH
IP

Go
Go

Go
Geth Swarm




4.



geth account

Ethereum
Ethereum


eth.sendTransaction




5.
- Ethereum
-
Ethereum
Remix Solidity IDE



ABI



solc
solc Ubuntu
solc Debian
HelloSol

solc Rasberian


6. - Node.js
Node.js
Ubuntu
Debian
Ganache-cli
Web3
solc
Node.js Rasberian

-




ABI



-
-
Web3 1.0.x





- HelloSol

getBalance call_contract_get_promise.js
-


7. Truffle
Truffle
HelloSol

contracts
migrations
test
truffle-config.js
HelloSol

HelloSol Truffle
HelloSol JavaScript Node.js
truffle-contract
getValue getString
setValue setString

Web3 1.0.x
- HelloSol

Truffle
Solidity
JavaScript


8. Solidity




Alamatnya





mapping


9. Rinkeby
Truffle Geth


Truffle
geth
Truffle
Truffle Rinkeby
Geth Rinkeby


Rinkeby
Rinkeby
Rinkeby
Truffle Rinkeby

Node.js
Truffle Rinkby


10. Ethereum Swarm
Ethereum Swarm
Swarm

Ethereum Swarm
Ethereum Swarm



Swarm
Swarm Node.js
Perl Net::Ethereum::Swarm
Net::Ethereum::Swarm



11. Web3.py Ethereum Python
Web3.py

easysolc
Web3.py



abi


abi JSON



Truffle Web3.py


12.
-




USDRateOracle
-
Web Socket
RateUpdate
RateUpdate
-




Koreksi dan penambahan



Jika Anda menemukan kesalahan atau masalah saat mengerjakan buku yang berkaitan dengan memperbarui versi perangkat lunak yang terkait dengan Ethereum, tuliskan kepada saya. Saya akan mencoba mencari dan menerbitkan solusi di sini.

Fatal: Gagal menulis blok genesis: pemesanan garpu tidak didukung: eip150Block tidak diaktifkan, tetapi eip155Block diaktifkan pada 0
Tambahkan parameter eip150Block ke file genesis.json:
{
"config": {
"chainId": 1999,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0
},
"difficulty": "10",
"gasLimit": "5100000",
"alloc": {}
}

Source: https://habr.com/ru/post/id467347/


All Articles