Cara Membangun Blockchain Cryptocurrency Sederhana Di Node.js
Diterbitkan: 2022-03-10smashingCoin
, menggunakan konsep kelas JavaScript dan Node.js. Cobalah — ini lebih sederhana dari yang Anda pikirkan!Kebangkitan cryptocurrency yang belum pernah terjadi sebelumnya, dan teknologi blockchain yang mendasarinya, telah mengejutkan dunia — dari awal yang sederhana menjadi konsep akademis lebih dari satu dekade lalu hingga peningkatan adopsi saat ini di berbagai industri.
Teknologi blockchain menerima banyak perhatian karena kemampuannya untuk meningkatkan keamanan di lingkungan yang tidak dapat dipercaya, menegakkan desentralisasi, dan membuat proses menjadi efisien.
Secara tradisional, Python telah menjadi bahasa pemrograman de facto untuk pengembangan blockchain. Namun, dengan proliferasi teknologi luar biasa ini, opsi pengembangan juga meningkat — dan Node.js tidak ketinggalan.
Dalam tutorial ini, saya akan berbicara tentang cara membangun blockchain cryptocurrency sederhana di Node.js. Ini tidak akan terlalu mewah, tetapi cukup untuk membantu Anda memahami cara kerja blockchain.
Saya akan menyebut cryptocurrency sederhana ini smashingCoin
.
Jika Anda adalah pengembang JavaScript yang ingin terjun ke bidang cryptocurrency yang sedang berkembang, artikel ini akan membekali Anda dengan keterampilan yang diperlukan untuk memulai. Atau, jika Anda ingin tahu tentang cara kerja di dunia cryptocurrency, maka tutorial ini dapat membantu menjawab beberapa pertanyaan Anda.
Bacaan yang disarankan : Memahami Integritas Subsumberdaya oleh Drew McLellan
Prasyarat
Untuk mengikuti tutorial ini dengan sukses, Anda harus memiliki yang berikut ini:
- Node.js diinstal pada mesin Anda. Anda dapat mengunduhnya dari sini;
- Editor kode, seperti Visual Studio Code, Sublime Text, atau lainnya.
Mari kita mulai…
Apa Itu Blockchain?
Blockchain adalah teknologi yang menggerakkan mata uang digital, seperti Bitcoin dan Ethereum. Ini adalah teknologi buku besar publik terdistribusi inovatif yang menyimpan daftar catatan yang terus bertambah, yang disebut sebagai blok, yang terhubung dengan aman menggunakan kriptografi.
Istilah blockchain mendapatkan namanya karena cara menyimpan data transaksi, yaitu dalam blok yang terhubung satu sama lain untuk membuat rantai . Ukuran blockchain tumbuh dengan peningkatan jumlah transaksi yang dilakukan.
Setiap data transaksi yang valid masuk ke jaringan blockchain, yang diatur oleh aturan peer-to-peer yang ditetapkan oleh para peserta. Misalnya, data ini dapat berisi "nilai" blok seperti dalam mata uang digital, catatan transaksi (seperti saat pihak bertukar barang dan jasa), atau hak istimewa seperti saat rantai mencatat informasi kepemilikan.
Selain data transaksi, setiap blok mungkin berisi hash kriptografinya sendiri (pengidentifikasi unik atau jejak digital), nilai nonce sendiri (nomor acak arbitrer yang digunakan sekali dalam perhitungan kriptografi), hash dari blok sebelumnya, dan stempel waktu terbaru. transaksi yang diautentikasi.
Karena setiap blok baru harus mengarah ke blok sebelumnya, jika sebuah blok dimasukkan ke dalam rantai tanpa mengandung hash yang tepat dari blok terakhir, itu bisa membuat seluruh blockchain tidak valid. Properti kekekalan ini adalah kunci keamanan blockchain.
Selanjutnya, berbagai jenis protokol konsensus sering diterapkan untuk menjaga keaslian blockchain. Konsensus memastikan bahwa semua peserta menyetujui transaksi yang divalidasi jaringan.
Misalnya, protokol konsensus yang umum digunakan adalah bukti kerja, yang bertujuan untuk mengidentifikasi angka yang menemukan solusi untuk masalah matematika yang rumit setelah menyelesaikan sejumlah pekerjaan komputasi.
Ide utama dari proof work adalah bahwa setiap peserta dalam jaringan blockchain harus menemukan nomor ini sulit untuk diidentifikasi tetapi mudah diverifikasi. Akibatnya, ini mencegah spamming dan merusak struktur blockchain.
Dalam kasus sebagian besar cryptocurrency, menambahkan blok baru ke blockchain membutuhkan penyelesaian persamaan matematika yang kompleks, yang semakin sulit seiring waktu seiring pertumbuhan blockchain. Akibatnya, setiap orang yang membuktikan bahwa mereka telah menyelesaikan pekerjaan dengan memecahkan masalah ini akan diberi kompensasi dengan mata uang digital, dalam proses yang disebut sebagai "penambangan".
Cara Membuat Blok
Sekarang, setelah memperkenalkan teknologi blockchain dan cara kerjanya, mari kita lihat bagaimana kita dapat menerapkan konsep dalam membuat blok. Seperti disebutkan sebelumnya, blok adalah apa yang saling terkait satu sama lain untuk membentuk blockchain.
Untuk membuat mata uang smashingCoin
, saya akan menggunakan kelas JavaScript, yang diperkenalkan di ES6.
Siap?
Biar tangan kita kotor...
Berikut adalah kode untuk kelas CryptoBlock
:
const SHA256 = require('crypto-js/sha256'); class CryptoBlock{ constructor(index, timestamp, data, precedingHash=" "){ this.index = index; this.timestamp = timestamp; this.data = data; this.precedingHash = precedingHash; this.hash = this.computeHash(); } computeHash(){ return SHA256(this.index + this.precedingHash + this.timestamp + JSON.stringify(this.data)).toString(); } }
Seperti yang Anda lihat pada kode di atas, saya membuat kelas CryptoBlock
dan menambahkan metode constructor()
ke dalamnya — sama seperti yang dilakukan di kelas JavaScript lainnya. Kemudian, untuk menginisialisasi propertinya, saya menetapkan parameter berikut ke metode constructor
:
index | Ini adalah nomor unik yang melacak posisi setiap blok di seluruh blockchain. |
timestamp | Itu menyimpan catatan waktu terjadinya setiap transaksi selesai. |
data | Ini memberikan data tentang transaksi yang diselesaikan, seperti detail pengirim, detail penerima, dan jumlah yang ditransaksikan. |
precedingHash | Ini menunjuk ke hash dari blok sebelumnya di blockchain, sesuatu yang penting dalam menjaga integritas blockchain. |
Selanjutnya, saya menggunakan metode computeHash
untuk menghitung hash blok berdasarkan propertinya, seperti yang diberikan pada data di atas.
Seperti yang Anda lihat, saya mengimpor perpustakaan JavaScript crypto-js dan menggunakan modul crypto-js/sha256
untuk menghitung hash setiap blok. Karena modul mengembalikan objek angka, saya menggunakan metode toString()
untuk mengubahnya menjadi string.
Untuk menambahkan perpustakaan crypto-js ke proyek Anda, buka terminal dan jalankan perintah berikut untuk menginstalnya menggunakan npm
:
npm install --save crypto-js
Setelah menjalankan perintah di atas, direktori modul node, yang berisi perpustakaan dan file penting lainnya, akan ditambahkan ke folder proyek Anda.
Cara Membuat Blockchain
Seperti yang dijelaskan sebelumnya, teknologi blockchain didasarkan pada konsep bahwa semua blok dirantai satu sama lain. Jadi, mari buat kelas CryptoBlockchain
yang akan bertanggung jawab untuk menangani operasi seluruh rantai. Di sinilah karet akan bertemu jalan.
Kelas CryptoBlockchain
akan mempertahankan operasi blockchain menggunakan metode pembantu yang menyelesaikan tugas yang berbeda, seperti membuat blok baru dan menambahkannya ke rantai.
Berikut adalah kode untuk kelas CryptoBlockchain
:
class CryptoBlockchain{ constructor(){ this.blockchain = [this.startGenesisBlock()]; } startGenesisBlock(){ return new CryptoBlock(0, "01/01/2020", "Initial Block in the Chain", "0"); } obtainLatestBlock(){ return this.blockchain[this.blockchain.length - 1]; } addNewBlock(newBlock){ newBlock.precedingHash = this.obtainLatestBlock().hash; newBlock.hash = newBlock.computeHash(); this.blockchain.push(newBlock); } }
Biarkan saya berbicara tentang peran masing-masing metode pembantu yang membentuk kelas CryptoBlockchain
.
1. Metode Konstruktor
Metode ini menginstansiasi blockchain. Di dalam konstruktor, saya membuat properti blockchain
, yang mengacu pada array blok. Perhatikan bahwa saya meneruskan metode startGenesisBlock()
, yang membuat blok awal dalam rantai.
2. Membuat Blok Genesis
Dalam blockchain, blok genesis mengacu pada blok pertama yang dibuat di jaringan. Setiap kali sebuah blok terintegrasi dengan sisa rantai, itu harus merujuk ke blok sebelumnya.
Sebaliknya, dalam kasus blok awal ini, tidak ada blok sebelumnya untuk ditunjuk. Oleh karena itu, blok genesis biasanya di-hardcode ke dalam blockchain. Dengan cara ini, blok berikutnya dapat dibuat di atasnya. Biasanya memiliki indeks 0.
Saya menggunakan metode startGenesisBlock()
untuk membuat blok genesis. Perhatikan bahwa saya membuatnya menggunakan kelas CryptoBlock
yang telah dibuat sebelumnya dan meneruskan parameter index
, timestamp
, data
, dan precedingHash
.
3. Mendapatkan Blok Terbaru
Mendapatkan blok terbaru di blockchain membantu memastikan hash dari blok saat ini menunjuk ke hash dari blok sebelumnya — sehingga menjaga integritas rantai.
Saya menggunakan metode obtainLatestBlock()
untuk mengambilnya.
4. Menambahkan Blok Baru
Saya menggunakan metode addNewBlock()
untuk menambahkan blok baru ke rantai. Untuk mencapai hal ini, saya mengatur hash sebelumnya dari blok baru agar sama dengan hash dari blok terakhir dalam rantai — sehingga memastikan rantai tersebut tahan kerusakan.
Karena properti blok baru berubah dengan setiap perhitungan baru, penting untuk menghitung hash kriptografiknya lagi. Setelah memperbarui hashnya, blok baru didorong ke dalam array blockchain.
Pada kenyataannya, menambahkan blok baru ke blockchain tidak semudah itu karena beberapa pemeriksaan yang telah dilakukan. Meskipun demikian, untuk cryptocurrency sederhana ini, cukup untuk menunjukkan cara kerja blockchain sebenarnya.
Menguji Blockchain
Sekarang, mari kita uji blockchain sederhana kita dan lihat apakah itu berhasil.
Berikut kodenya:
let smashingCoin = new CryptoBlockchain(); smashingCoin.addNewBlock(new CryptoBlock(1, "01/06/2020", {sender: "Iris Ljesnjanin", recipient: "Cosima Mielke", quantity: 50})); smashingCoin.addNewBlock(new CryptoBlock(2, "01/07/2020", {sender: "Vitaly Friedman", recipient: "Ricardo Gimenes", quantity: 100}) ); console.log(JSON.stringify(smashingCoin, null, 4));
Seperti yang Anda lihat pada kode di atas, saya membuat instance baru dari kelas CryptoBlockchain
dan menamakannya sebagai smashingCoin
. Kemudian, saya menambahkan dua blok ke dalam blockchain menggunakan beberapa nilai arbitrer. Pada parameter data
, saya menggunakan objek dan menambahkan detail pengirim, detail penerima, dan jumlah yang ditransaksikan.
Jika saya menjalankan kode di terminal, inilah output yang saya dapatkan:
Seperti itulah tampilan smashingCoin
! Ini adalah objek yang berisi properti blockchain
, yang merupakan array yang berisi semua blok dalam rantai. Seperti yang Anda lihat pada gambar di atas, setiap blok merujuk pada hash dari blok sebelumnya. Misalnya, blok kedua mereferensikan hash dari blok pertama. Setelah menguji dan melihat bahwa blockchain kami berfungsi, mari tambahkan lebih banyak fungsi untuk meningkatkan fitur smashingCoin
.
Cara Memverifikasi Integritas Blockchain
Seperti yang disebutkan sebelumnya, karakteristik utama dari blockchain adalah bahwa sekali blok telah ditambahkan ke rantai, itu tidak dapat diubah tanpa membatalkan integritas sisa rantai.
Oleh karena itu, untuk memverifikasi integritas blockchain, saya akan menambahkan metode checkChainValidity()
ke kelas CryptoBlockchain
.
Hash sangat penting untuk memastikan validitas dan keamanan blockchain karena setiap perubahan dalam konten blok akan menghasilkan produksi hash yang sama sekali baru, dan membuat blockchain tidak valid.
Dengan demikian, metode checkChainValidity()
akan menggunakan pernyataan if
untuk memverifikasi apakah hash dari setiap blok telah diubah. Mulai dari blok pertama yang dibuat, itu akan mengulang seluruh blockchain dan memeriksa validitasnya. Perhatikan bahwa karena blok genesis di-hardcode, itu tidak akan diperiksa.
Juga, metode ini akan memverifikasi apakah hash dari masing-masing dua blok berurutan menunjuk satu sama lain. Jika integritas blockchain belum dikompromikan, itu mengembalikan true; jika tidak, jika ada anomali, ia mengembalikan false.
Berikut kodenya:
checkChainValidity(){ for(let i = 1; i < this.blockchain.length; i++){ const currentBlock = this.blockchain[i]; const precedingBlock= this.blockchain[i-1]; if(currentBlock.hash !== currentBlock.computeHash()){ return false; } if(currentBlock.precedingHash !== precedingBlock.hash) return false; } return true; }
Cara Menambahkan Bukti Kerja
Seperti yang disebutkan sebelumnya, bukti kerja adalah konsep yang diterapkan untuk meningkatkan kesulitan yang diperlukan dalam menambang atau menambahkan blok baru ke blockchain.
Dalam kasus smashingCoin
, saya akan menggunakan algoritme sederhana yang mencegah orang membuat blok baru dengan mudah atau mengirim spam ke blockchain.
Jadi, di kelas CryptoBlock
, saya akan menambahkan metode lain yang disebut proofOfWork().
Pada dasarnya, algoritme sederhana ini mengidentifikasi angka, diteruskan sebagai properti difficulty
, sehingga hash dari setiap blok berisi nol di depan yang sesuai dengan tingkat difficulty
ini.
Memastikan hash setiap blok dimulai dengan jumlah nol seperti yang diatur dalam tingkat difficulty
membutuhkan banyak daya komputasi. Semakin tinggi tingkat kesulitan, semakin banyak waktu yang dibutuhkan untuk menambang blok baru.
Selanjutnya, saya akan menambahkan nilai nonce
acak ke setiap blok hash sehingga, saat pengulangan berlangsung, batasan tingkat kesulitan masih dapat dipenuhi.
Berikut kodenya:
proofOfWork(difficulty){ while(this.hash.substring(0, difficulty) !==Array(difficulty + 1).join("0")){ this.nonce++; this.hash = this.computeHash(); } }
Dan, inilah metode computeHash()
yang diperbarui dengan variabel nonce
yang disertakan:
computeHash(){ return SHA256(this.index + this.precedingHash + this.timestamp + JSON.stringify(this.data)+this.nonce).toString(); }
Selain itu, untuk menerapkan mekanisme proof of work dalam pembuatan blok baru, saya akan menyertakannya dalam metode addNewBlock()
:
addNewBlock(newBlock){ newBlock.precedingHash = this.obtainLatestBlock().hash; //newBlock.hash = newBlock.computeHash(); newBlock.proofOfWork(this.difficulty); this.blockchain.push(newBlock); }
Membungkus
Berikut adalah keseluruhan kode untuk membangun cryptocurrency smashingCoin
menggunakan Node.js:
const SHA256 = require("crypto-js/sha256"); class CryptoBlock { constructor(index, timestamp, data, precedingHash = " ") { this.index = index; this.timestamp = timestamp; this.data = data; this.precedingHash = precedingHash; this.hash = this.computeHash(); this.nonce = 0; } computeHash() { return SHA256( this.index + this.precedingHash + this.timestamp + JSON.stringify(this.data) + this.nonce ).toString(); } proofOfWork(difficulty) { while ( this.hash.substring(0, difficulty) !== Array(difficulty + 1).join("0") ) { this.nonce++; this.hash = this.computeHash(); } } } class CryptoBlockchain { constructor() { this.blockchain = [this.startGenesisBlock()]; this.difficulty = 4; } startGenesisBlock() { return new CryptoBlock(0, "01/01/2020", "Initial Block in the Chain", "0"); } obtainLatestBlock() { return this.blockchain[this.blockchain.length - 1]; } addNewBlock(newBlock) { newBlock.precedingHash = this.obtainLatestBlock().hash; //newBlock.hash = newBlock.computeHash(); newBlock.proofOfWork(this.difficulty); this.blockchain.push(newBlock); } checkChainValidity() { for (let i = 1; i < this.blockchain.length; i++) { const currentBlock = this.blockchain[i]; const precedingBlock = this.blockchain[i - 1]; if (currentBlock.hash !== currentBlock.computeHash()) { return false; } if (currentBlock.precedingHash !== precedingBlock.hash) return false; } return true; } } let smashingCoin = new CryptoBlockchain(); console.log("smashingCoin mining in progress...."); smashingCoin.addNewBlock( new CryptoBlock(1, "01/06/2020", { sender: "Iris Ljesnjanin", recipient: "Cosima Mielke", quantity: 50 }) ); smashingCoin.addNewBlock( new CryptoBlock(2, "01/07/2020", { sender: "Vitaly Friedman", recipient: "Ricardo Gimenes", quantity: 100 }) ); console.log(JSON.stringify(smashingCoin, null, 4));
Jika saya menjalankan kode di terminal, inilah output yang saya dapatkan:
Seperti yang Anda lihat pada gambar di atas, hash sekarang dimulai dengan empat nol, yang sesuai dengan tingkat kesulitan yang ditetapkan dalam mekanisme bukti kerja.
Kesimpulan
Itu dia! Begitulah cara Anda dapat membangun blockchain cryptocurrency sederhana menggunakan Node.js.
Tentu saja, cryptocurrency smashingCoin
masih jauh dari sempurna. Faktanya, jika Anda merilisnya tanpa melakukan lebih banyak peningkatan, itu tidak mungkin memenuhi permintaan pasar saat ini untuk mata uang digital yang aman, andal, dan intuitif — menjadikan Anda satu-satunya yang menggunakannya!
Meskipun demikian, saya harap tutorial ini telah membekali Anda dengan beberapa keterampilan dasar untuk membuat kaki Anda basah di dunia kripto yang mendebarkan.
Jika Anda memiliki komentar atau pertanyaan, silakan posting di bawah ini.
Sumber Daya Lebih Lanjut
- “Blockchain 101,” CoinDesk
- “Bitcoin: Sistem Uang Elektronik Peer-to-Peer,” Satoshi Nakamoto, Bitcoin.org