Blockchain: apa yang harus kita bangun PoC?

Mata takut, dan tangan gatal!

Pada artikel sebelumnya, kami menemukan teknologi yang digunakan untuk membangun blockchain (Untuk apa kita membangun blockchain? ) Dan case yang dapat diimplementasikan dengan bantuan mereka (Untuk apa kita membuat case? ). Saatnya bekerja dengan tangan Anda! Untuk implementasi pilot dan PoC (Proof of Concept), saya lebih suka menggunakan cloud, karena mereka dapat diakses dari mana saja di dunia dan, seringkali, Anda tidak perlu menghabiskan waktu untuk pemasangan lingkungan yang membosankan, karena Ada konfigurasi yang telah ditentukan. Jadi, mari kita lakukan sesuatu yang sederhana, misalnya, jaringan untuk mentransfer koin antara peserta dan menyebutnya sebagai Citcoin sederhana. Untuk ini, kami akan menggunakan cloud IBM dan universal blockchain Hyperledger Fabric. Pertama, mari kita lihat mengapa Hyperledger Fabric disebut blockchain universal.

gambar

Hyperledger Fabric - blockchain universal


Secara umum, sistem informasi universal adalah:

  • Seperangkat server dan inti perangkat lunak yang melakukan logika bisnis;
  • Antarmuka untuk berinteraksi dengan sistem;
  • Sarana untuk pendaftaran, otentikasi, dan otorisasi perangkat / orang;
  • Database menyimpan data operasional dan arsip:

gambar

Versi resmi dari apa Hyperledger Fabric dapat dibaca di situs , dan singkatnya, Hyperledger Fabric adalah platform opensource yang memungkinkan Anda untuk membangun blockchains tertutup dan menjalankan kontrak pintar sewenang-wenang yang ditulis dalam bahasa pemrograman JS dan Go. Mari kita lihat arsitektur Hyperledger Fabric secara terperinci dan pastikan itu adalah sistem universal yang hanya memiliki kekhususan menyimpan dan merekam data. Kekhususan adalah bahwa data, seperti di semua blockchain, disimpan dalam blok yang ditempatkan di blockchain hanya jika peserta mencapai konsensus dan setelah merekam data tidak dapat diam-diam dikoreksi atau dihapus.

Arsitektur Kain Hyperledger


Diagram menunjukkan arsitektur Fabric Hyperledger:

gambar

Organisasi - organisasi mengandung teman sebaya, mis. blockchain ada karena dukungan organisasi. Organisasi yang berbeda dapat menjadi anggota saluran yang sama.

Saluran - struktur logis yang menyatukan rekan-rekan ke dalam kelompok, mis. Blockchain sudah diatur. Hyperledger Fabric dapat secara bersamaan memproses beberapa blockchains dengan logika bisnis yang berbeda.

Penyedia Layanan Keanggotaan (MSP) adalah CA (Otoritas Sertifikat) untuk mengeluarkan identitas dan menugaskan peran. Untuk membuat simpul, Anda perlu berinteraksi dengan MSP.

Peer node - memverifikasi transaksi, menyimpan blockchain, menjalankan kontrak pintar dan berinteraksi dengan aplikasi. Peer memiliki identitas (sertifikat digital) yang mengeluarkan MSP. Berbeda dengan jaringan Bitcoin atau Etherium, di mana semua node sama, di Hyperledger Fabric node memainkan peran yang berbeda:

  • Peer dapat mendukung rekan (EP) dan menjalankan kontrak pintar.
  • Committing peer (CP) - hanya menyimpan data di blockchain dan memperbarui "Negara dunia".
  • Anchor Peer (AP) - jika beberapa organisasi berpartisipasi dalam blockchain, maka anchor peer digunakan untuk berkomunikasi di antara mereka. Setiap organisasi harus memiliki satu atau lebih sejawat. Dengan bantuan AP, rekan kerja mana pun dalam organisasi dapat memperoleh informasi tentang semua rekan di organisasi lain. Protokol gosip digunakan untuk menyinkronkan informasi antara AP.
  • Leader Peer - jika organisasi memiliki beberapa rekan, maka hanya pemimpin rekan yang akan menerima blok dari layanan Pemesanan dan memberikannya kepada rekan-rekan lainnya. Seorang pemimpin dapat ditetapkan secara statis atau dipilih secara dinamis oleh rekan-rekan dalam suatu organisasi. Protokol gosip juga digunakan untuk menyinkronkan informasi pemimpin.

Aset adalah entitas nilai yang disimpan di blockchain. Lebih khusus lagi, ini adalah data nilai kunci dalam format JSON. Ini adalah data yang dicatat di Blockchain. Mereka memiliki kisah yang disimpan di blockchain dan status saat ini, yang disimpan dalam basis data keadaan dunia. Struktur data diisi secara acak tergantung pada tugas bisnis. Tidak ada bidang wajib, satu-satunya rekomendasi adalah bahwa aset harus memiliki pemilik dan bernilai.

Buku Besar - terdiri dari blockchain "Blockchain" dan basis data "Word state", yang menyimpan status aset saat ini. Negara dunia menggunakan LevelDB atau CouchDB.

Kontrak pintar - menggunakan kontrak pintar, logika bisnis dari sistem diimplementasikan. Dalam Hyperledger Fabric, kontrak pintar disebut chaincode. Dengan bantuan chaincode, aset dan transaksi ditetapkan. Berbicara dalam bahasa teknis, kontrak pintar adalah modul perangkat lunak yang diimplementasikan dalam bahasa pemrograman JS atau Go.

Kebijakan pengesahan - untuk setiap kode rantai, Anda dapat menentukan berapa banyak kebijakan dan dari siapa Anda ingin konfirmasi untuk transaksi. Jika kebijakan tidak disetel, maka secara default digunakan: "transaksi harus dikonfirmasikan oleh anggota organisasi mana pun di saluran". Contoh kebijakan:

  • Setiap administrator organisasi harus mengkonfirmasi transaksi;
  • Setiap anggota atau klien organisasi harus mengkonfirmasi;
  • Harus mengkonfirmasi organisasi rekan mana pun.

Layanan pemesanan - mengemas transaksi ke dalam blok dan mengirim rekan ke saluran. Menjamin pengiriman pesan ke semua rekan di jaringan. Untuk sistem industri, broker pesan Kafka digunakan untuk mengembangkan dan menguji Solo .

Callflow


gambar

  • Aplikasi berinteraksi dengan Hyperledger Fabric menggunakan Go, Node.js atau Java SDK;
  • Klien membuat transaksi tx dan mengirimkannya ke endorsing peer;
  • Peer memverifikasi tanda tangan klien, menyelesaikan transaksi, dan mengirimkan tanda tangan pengesahan kembali ke klien. Chaincode dieksekusi hanya pada peer endorsing, dan hasil eksekusinya dikirim ke semua rekan. Algoritma kerja ini disebut - PBFT (Practical Byzantine Fault Tolerant) konsensus. Ini berbeda dari BFT klasik di mana pesan dikirim dan konfirmasi tidak diharapkan dari semua peserta, tetapi hanya dari set tertentu;
  • Setelah klien menerima jumlah tanggapan yang sesuai dengan kebijakan pengesahan, klien mengirim transaksi ke layanan Pemesanan;
  • Memesan layanan membentuk blok dan mengirimkannya ke semua rekan yang melakukan. Layanan pemesanan menyediakan penulisan blok secara berurutan, yang mengecualikan apa yang disebut garpu buku besar ( lihat bagian " Garpu " );
  • Peer menerima blok, periksa kembali kebijakan pengesahan, tulis blok ke blockchain dan ubah status di DB "World state".

Yaitu ternyata pemisahan peran antara node. Ini memberikan skalabilitas dan keamanan blockchain:

  • Kontrak pintar (chaincode) melakukan peer endorsing. Ini memastikan kerahasiaan kontrak pintar, seperti itu tidak disimpan oleh semua peserta, tetapi hanya pada rekan-rekan yang mendukung.
  • Pemesanan harus bekerja cepat. Ini dipastikan oleh fakta bahwa Pemesanan hanya membentuk blok dan mengirimkannya ke sekumpulan rekan pemimpin tetap.
  • Rekan sebaya yang berkomitmen hanya menyimpan blockchain - mungkin ada banyak dari mereka dan mereka tidak memerlukan banyak tenaga dan kerja instan.

Untuk informasi lebih lanjut tentang solusi arsitektur Hyperledger Fabric dan mengapa ia bekerja dengan cara ini, lihat di sini: Arsitektur Asal atau di sini: Hyperledger Fabric: Sistem Operasi Terdistribusi untuk Blockchains yang Diizinkan .

Jadi, Hyperledger Fabric adalah sistem yang benar-benar universal yang dengannya Anda dapat:

  • Menerapkan logika bisnis yang sewenang-wenang menggunakan mekanisme kontrak pintar;
  • Tulis dan terima data dari database blockchain dalam format JSON;
  • Berikan dan verifikasi akses ke API menggunakan Otoritas Sertifikat.

Sekarang setelah kami mengetahui secara spesifik dari Kain Hyperledger, mari kita lakukan sesuatu yang bermanfaat!

Luaskan Blockchain


Pernyataan masalah


Tugasnya adalah mengimplementasikan jaringan Citcoin dengan fungsi-fungsi berikut: membuat akun, mendapatkan saldo, mengisi kembali akun, mentransfer koin dari satu akun ke akun lainnya. Mari kita menggambar model objek, yang selanjutnya akan kita terapkan dalam kontrak pintar. Jadi, kami akan memiliki akun yang diidentifikasi dengan nama dan berisi saldo dan daftar akun. Akun dan daftar akun dalam hal aset Fabric Hyperledger. Dengan demikian, mereka memiliki riwayat dan status saat ini. Saya akan mencoba menggambarnya dengan jelas:

gambar

Angka-angka atas adalah keadaan saat ini, yang disimpan dalam basis data Negara Dunia. Di bawah mereka adalah gambar yang menunjukkan cerita yang disimpan di blockchain. Keadaan aset saat ini diubah oleh transaksi. Aset hanya berubah secara keseluruhan, oleh karena itu, sebagai hasil dari transaksi, objek baru dibuat, dan nilai saat ini dari aset masuk ke dalam sejarah.

IBM Cloud


Kami membuat akun di cloud IBM . Untuk menggunakan platform blockchain, Anda perlu memutakhirkannya ke Pay-As-You-Go. Proses ini mungkin tidak cepat, karena IBM meminta informasi tambahan dan memverifikasinya secara manual. Dari sisi positif, saya dapat mengatakan bahwa IBM memiliki materi pelatihan yang baik yang memungkinkan Anda untuk menggunakan Hyperledger Fabric di cloud mereka. Saya menyukai serangkaian artikel dan contoh berikut:


Berikut ini adalah screenshot dari platform IBM Blockchain. Ini bukan instruksi untuk membuat blockchain, tetapi hanya demonstrasi ruang lingkup tugas. Jadi, untuk tujuan kami, kami membuat satu Organisasi:

gambar

Di dalamnya kita membuat node: Orderer CA, Org1 CA, Orderer Peer:

gambar

Kami memulai pengguna:

gambar

Buat Saluran dan sebut itu citcoin:

gambar

Intinya, Saluran adalah blockchain, jadi itu dimulai dengan blok nol (blok Genesis):

gambar

Menulis Kontrak yang Cerdas


/* * Citcoin smart-contract v1.5 for Hyperledger Fabric * (c) Alexey Sushkov, 2019 */ 'use strict'; const { Contract } = require('fabric-contract-api'); const maxAccounts = 5; class CitcoinEvents extends Contract { async instantiate(ctx) { console.info('instantiate'); let emptyList = []; await ctx.stub.putState('accounts', Buffer.from(JSON.stringify(emptyList))); } // Get all accounts async GetAccounts(ctx) { // Get account list: let accounts = '{}' let accountsData = await ctx.stub.getState('accounts'); if (accountsData) { accounts = JSON.parse(accountsData.toString()); } else { throw new Error('accounts not found'); } return accountsData.toString() } // add a account object to the blockchain state identifited by their name async AddAccount(ctx, name, balance) { // this is account data: let account = { name: name, balance: Number(balance), type: 'account', }; // create account: await ctx.stub.putState(name, Buffer.from(JSON.stringify(account))); // Add account to list: let accountsData = await ctx.stub.getState('accounts'); if (accountsData) { let accounts = JSON.parse(accountsData.toString()); if (accounts.length < maxAccounts) { accounts.push(name); await ctx.stub.putState('accounts', Buffer.from(JSON.stringify(accounts))); } else { throw new Error('Max accounts number reached'); } } else { throw new Error('accounts not found'); } // return object return JSON.stringify(account); } // Sends money from Account to Account async SendFrom(ctx, fromAccount, toAccount, value) { // get Account from let fromData = await ctx.stub.getState(fromAccount); let from; if (fromData) { from = JSON.parse(fromData.toString()); if (from.type !== 'account') { throw new Error('wrong from type'); } } else { throw new Error('Accout from not found'); } // get Account to let toData = await ctx.stub.getState(toAccount); let to; if (toData) { to = JSON.parse(toData.toString()); if (to.type !== 'account') { throw new Error('wrong to type'); } } else { throw new Error('Accout to not found'); } // update the balances if ((from.balance - Number(value)) >= 0 ) { from.balance -= Number(value); to.balance += Number(value); } else { throw new Error('From Account: not enought balance'); } await ctx.stub.putState(from.name, Buffer.from(JSON.stringify(from))); await ctx.stub.putState(to.name, Buffer.from(JSON.stringify(to))); // define and set Event let Event = { type: "SendFrom", from: from.name, to: to.name, balanceFrom: from.balance, balanceTo: to.balance, value: value }; await ctx.stub.setEvent('SendFrom', Buffer.from(JSON.stringify(Event))); // return to object return JSON.stringify(from); } // get the state from key async GetState(ctx, key) { let data = await ctx.stub.getState(key); let jsonData = JSON.parse(data.toString()); return JSON.stringify(jsonData); } // GetBalance async GetBalance(ctx, accountName) { let data = await ctx.stub.getState(accountName); let jsonData = JSON.parse(data.toString()); return JSON.stringify(jsonData); } // Refill own balance async RefillBalance(ctx, toAccount, value) { // get Account to let toData = await ctx.stub.getState(toAccount); let to; if (toData) { to = JSON.parse(toData.toString()); if (to.type !== 'account') { throw new Error('wrong to type'); } } else { throw new Error('Accout to not found'); } // update the balance to.balance += Number(value); await ctx.stub.putState(to.name, Buffer.from(JSON.stringify(to))); // define and set Event let Event = { type: "RefillBalance", to: to.name, balanceTo: to.balance, value: value }; await ctx.stub.setEvent('RefillBalance', Buffer.from(JSON.stringify(Event))); // return to object return JSON.stringify(from); } } module.exports = CitcoinEvents; 

Secara intuitif, semuanya harus jelas di sini:

  • Ada beberapa fungsi (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance) yang akan dipanggil oleh program demo menggunakan Hyperledger Fabric API.
  • Fungsi SendFrom dan RefillBalance menghasilkan acara (Acara) yang akan diterima oleh program demo.
  • Function instantiate - dipanggil satu kali selama instantiation dari kontrak pintar. Bahkan, ini disebut bukan sekali, tetapi setiap kali versi kontrak pintar diubah. Oleh karena itu, menginisialisasi daftar dengan array kosong adalah ide yang buruk, karena Sekarang, ketika mengubah versi kontrak pintar, kita akan kehilangan daftar saat ini. Tapi tidak ada, saya hanya belajar).
  • Akun dan daftar akun (akun) adalah struktur data JSON. Untuk manipulasi data, JS digunakan.
  • Anda bisa mendapatkan nilai aset saat ini dengan memanggil fungsi getState, dan memperbaruinya menggunakan putState.
  • Saat membuat Akun, fungsi AddAccount dipanggil, di mana perbandingan dibuat untuk jumlah maksimum akun di blockchain (maxAccounts = 5). Dan ada jamb (perhatikan?), Yang mengarah pada peningkatan jumlah akun yang tak terbatas. Kesalahan seperti itu harus dihindari)

Selanjutnya, unggah kontrak pintar ke Saluran dan instal:

gambar

Kami melihat transaksi untuk menginstal Kontrak Cerdas:

gambar

Kami melihat detail tentang Saluran kami:

gambar

Hasilnya, kami mendapatkan diagram jaringan blockchain berikut di cloud IBM. Ada juga program demo yang berjalan di cloud Amazon pada server virtual (lihat bagian selanjutnya untuk detail):

gambar

Membuat GUI untuk Panggilan API Fabric Hyperledger


Hyperledger Fabric memiliki API yang dapat digunakan untuk:

  • Saluran kreasi;
  • Koneksi sebaya ke saluran;
  • Pemasangan dan instantiasi kontrak pintar di saluran;
  • Panggilan transaksi;
  • Minta informasi tentang blockchain.

Pengembangan aplikasi


Dalam program demo kami, kami akan menggunakan API hanya untuk memohon transaksi dan meminta informasi, karena Kami telah mengambil langkah-langkah yang tersisa menggunakan platform blockchain IBM. Kami menulis GUI menggunakan tumpukan teknologi standar: Express.js + Vue.js + Node.js. Anda dapat menulis artikel terpisah tentang cara mulai membuat aplikasi web modern. Di sini saya akan meninggalkan tautan ke seri kuliah yang paling saya sukai: Aplikasi Web Stack Lengkap menggunakan Vue.js & Express.js . Hasilnya adalah aplikasi klien-server dengan antarmuka grafis yang akrab dalam gaya Desain Bahan dari Google. API REST antara klien dan server terdiri dari beberapa panggilan:

  • HyperledgerDemo / v1 / init - menginisialisasi blockchain;
  • HyperledgerDemo / v1 / accounts / list - dapatkan daftar semua akun
  • HyperledgerDemo / v1 / akun? Name = Bob & balance = 100 - buat akun Bob;
  • HyperledgerDemo / v1 / info? Akun = Bob - dapatkan informasi tentang akun Bob;
  • HyperledgerDemo / v1 / transaction? Dari = Bob & ke = Alice & volume = 2 - transfer dua koin dari Bob ke Alice;
  • HyperledgerDemo / v1 / disconnect - tutup koneksi ke blockchain.

Saya memasukkan deskripsi API dengan contoh-contoh di situs web Postman , sebuah program terkenal untuk menguji HTTP API.

Aplikasi Demo Cloud Amazon


Aplikasi itu diunggah ke Amazon, karena IBM sejauh ini gagal memutakhirkan akun saya dan mengizinkan pembuatan server virtual. Bagaimana cherry melampirkan domain: www.citcoin.info . Saya akan membiarkan server dinyalakan sebentar, lalu mematikannya, karena sen untuk disewakan menetes, dan koin citcoin belum dikutip di bursa) Saya menaruh screenshot demo di artikel sehingga logika kerjanya jelas. Aplikasi demo dapat:

  • Inisialisasi blockchain;
  • Buat Akun (tapi sekarang jangan buat Akun baru, karena jumlah maksimum akun yang ditentukan dalam kontrak pintar telah tercapai di blockchain);
  • Dapatkan daftar Akun;
  • Transfer koin citcoin antara Alice, Bob dan Alex;
  • Terima acara (tetapi sekarang tidak ada cara untuk menampilkan acara, oleh karena itu, untuk kesederhanaan, antarmuka mengatakan bahwa acara tidak didukung);
  • Tindakan log.

Pertama, inisialisasi blockchain:

gambar

Selanjutnya, mulai akun Anda, jangan remehkan dengan saldo:

gambar

Kami mendapatkan daftar semua akun yang tersedia:

gambar

Kami memilih pengirim dan penerima, kami mendapatkan saldo mereka. Jika pengirim dan penerima sama, maka akun mereka akan diisi ulang:

gambar

Dalam log, kami memantau pelaksanaan transaksi:

gambar

Sebenarnya, dengan program demo, itu saja. Selanjutnya, Anda dapat melihat transaksi kami di blockchain:

gambar

Dan daftar transaksi umum:

gambar

Dengan ini, kami berhasil menyelesaikan implementasi PoC untuk membuat jaringan Citcoin. Apa lagi yang perlu dilakukan agar Citcoin menjadi jaringan transfer koin yang lengkap? Sedikit saja:

  • Pada tahap membuat akun, terapkan pembuatan kunci privat / publik. Kunci pribadi harus disimpan di pengguna akun, publik di blockchain.
  • Lakukan transfer koin yang menggunakan kunci publik untuk mengidentifikasi pengguna, bukan nama.
  • Enkripsi transaksi pergi dari pengguna ke server dengan kunci pribadinya.

Kesimpulan


Kami telah mengimplementasikan jaringan Citcoin dengan fungsi: menambah akun, mendapatkan saldo, mengisi kembali akun Anda, mentransfer koin dari satu akun ke akun lainnya. Jadi, berapa biaya yang harus dikeluarkan untuk membangun PoC?

  • Kita perlu mempelajari blockchain secara umum dan Hyperledger Fabric pada khususnya;
  • Pelajari cara menggunakan cloud IBM atau Amazon;
  • Pelajari bahasa pemrograman JS dan beberapa kerangka kerja web;
  • Jika beberapa data perlu disimpan bukan di blockchain, tetapi di database terpisah, maka pelajari cara mengintegrasikan, misalnya, dengan PostgreSQL;
  • Dan last but not least - tanpa pengetahuan Linux di dunia modern, di mana saja!)

Tentu saja, bukan ilmu roket, tetapi Anda harus berkeringat!

Sumber GitHub


Dia meletakkan kode sumber di GitHub . Deskripsi singkat tentang repositori:
Direktori " server " - server Node.js
Direktori " klien " - klien Node.js
Direktori " blockchain " (nilai parameter dan kunci, tentu saja, tidak beroperasi dan hanya diberikan sebagai contoh):

  • kontrak - sumber dari kontrak pintar
  • wallet - kunci pengguna untuk menggunakan Hyperledger Fabric API.
  • * .cds - versi kompilasi kontrak pintar
  • * .json file - contoh file konfigurasi untuk menggunakan Hyperledger Fabric API

Itu baru permulaan!

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


All Articles