Blockchain: PoC apa yang harus kita bangun?

Matamu takut dan tanganmu gatal!

Pada artikel sebelumnya, kita melihat teknologi yang menjadi dasar pembuatan blockchain (Apa yang harus kita bangun dari blockchain?) dan kasus-kasus yang dapat diimplementasikan dengan bantuan mereka (Mengapa kita harus membangun sebuah kasus?). 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, tidak perlu membuang waktu untuk instalasi lingkungan yang membosankan, karena Ada konfigurasi preset. Jadi, mari kita buat sesuatu yang sederhana, misalnya, jaringan untuk mentransfer koin antar peserta dan sebut saja Bitcoin. Untuk ini kami akan menggunakan cloud IBM dan blockchain universal Hyperledger Fabric. Pertama, mari kita cari tahu mengapa Hyperledger Fabric disebut sebagai blockchain universal?

Blockchain: PoC apa yang harus kita bangun?

Hyperledger Fabric - blockchain universal

Secara umum, sistem informasi universal adalah:

  • Seperangkat server dan inti perangkat lunak yang menjalankan logika bisnis;
  • Antarmuka untuk interaksi dengan sistem;
  • Alat untuk registrasi, otentikasi dan otorisasi perangkat/orang;
  • Basis data yang menyimpan data operasional dan arsip:

Blockchain: PoC apa yang harus kita bangun?

Versi resmi dari Hyperledger Fabric dapat dibaca di Online, dan singkatnya, Hyperledger Fabric adalah platform sumber terbuka yang memungkinkan Anda membangun blockchain pribadi dan mengeksekusi kontrak pintar sewenang-wenang yang ditulis dalam bahasa pemrograman JS dan Go. Mari kita lihat secara detail arsitektur Hyperledger Fabric dan pastikan bahwa ini adalah sistem universal yang hanya memiliki kekhususan untuk menyimpan dan merekam data. Kekhususannya adalah bahwa data, seperti di semua blockchain, disimpan dalam blok yang ditempatkan di blockchain hanya jika peserta mencapai konsensus dan setelah pencatatan data tidak dapat diam-diam dikoreksi atau dihapus.

Arsitektur Kain Hyperledger

Diagram menunjukkan arsitektur Hyperledger Fabric:

Blockchain: PoC apa yang harus kita bangun?

Organisasi — organisasi berisi rekan-rekan, mis. blockchain ada karena dukungan organisasi. Organisasi yang berbeda dapat menjadi bagian dari saluran yang sama.

Saluran — struktur logis yang menyatukan rekan-rekan ke dalam kelompok, mis. blockchain ditentukan. Hyperledger Fabric secara bersamaan dapat memproses beberapa blockchain dengan logika bisnis yang berbeda.

Penyedia Layanan Keanggotaan (MSP) adalah CA (Certificate Authority) untuk menerbitkan identitas dan menetapkan peran. Untuk membuat node, Anda perlu berinteraksi dengan MSP.

Node rekan — memverifikasi transaksi, menyimpan blockchain, menjalankan kontrak pintar, dan berinteraksi dengan aplikasi. Rekan memiliki identitas (sertifikat digital) yang dikeluarkan oleh MSP. Berbeda dengan jaringan Bitcoin atau Etherium, di mana semua node memiliki hak yang sama, node di Hyperledger Fabric memainkan peran berbeda:

  • Rekan mungkin mendukung rekan (EP) dan jalankan kontrak pintar.
  • Melakukan rekan (CP) - hanya menyimpan data di blockchain dan memperbarui “Negara dunia”.
  • Rekan Jangkar (AP) - jika beberapa organisasi berpartisipasi dalam blockchain, maka rekan jangkar digunakan untuk komunikasi di antara mereka. Setiap organisasi harus memiliki satu atau lebih rekan jangkar. Dengan menggunakan AP, setiap rekan dalam suatu organisasi dapat memperoleh informasi tentang semua rekan di organisasi lain. Digunakan untuk menyinkronkan informasi antar AP protokol gosip.
  • Rekan Pemimpin — jika suatu organisasi memiliki beberapa rekan, maka hanya pemimpin rekan yang akan menerima blok dari layanan Pemesanan dan memberikannya kepada rekan lainnya. Pemimpin dapat ditentukan secara statis atau dipilih secara dinamis oleh rekan-rekan dalam organisasi. Protokol gosip juga digunakan untuk menyinkronkan informasi tentang pemimpin.

Aktiva — entitas yang memiliki nilai dan disimpan di blockchain. Lebih khusus lagi, ini adalah data nilai kunci dalam format JSON. Data inilah yang dicatat di Blockchain. Mereka memiliki sejarah, yang disimpan dalam blockchain, dan keadaan saat ini, yang disimpan dalam database “Negara dunia”. Struktur data diisi secara sewenang-wenang bergantung pada tugas bisnis. Tidak ada kolom yang wajib diisi, satu-satunya rekomendasi adalah aset harus memiliki pemilik dan bernilai.

Buku besar — terdiri dari Blockchain dan database status Word, yang menyimpan status aset saat ini. Negara dunia menggunakan LevelDB atau CouchDB.

Kontrak pintar — menggunakan kontrak pintar, logika bisnis sistem diterapkan. Di Hyperledger Fabric, kontrak pintar disebut kode rantai. Menggunakan kode rantai, aset dan transaksi di atasnya ditentukan. Dalam istilah teknis, kontrak pintar adalah modul perangkat lunak yang diimplementasikan dalam bahasa pemrograman JS atau Go.

Kebijakan dukungan — untuk setiap kode rantai, Anda dapat menetapkan kebijakan tentang berapa banyak konfirmasi transaksi yang diharapkan dan dari siapa. Jika kebijakan tidak disetel, maka defaultnya adalah: “transaksi harus dikonfirmasi oleh anggota organisasi mana pun di saluran.” Contoh kebijakan:

  • Transaksi tersebut harus disetujui oleh setiap administrator organisasi;
  • Harus dikonfirmasi oleh setiap anggota atau klien organisasi;
  • Harus dikonfirmasi oleh organisasi sejawat mana pun.

Layanan pemesanan — mengemas transaksi ke dalam blok-blok dan mengirimkannya ke rekan-rekan di saluran. Menjamin pengiriman pesan ke semua rekan di jaringan. Digunakan untuk sistem industri Broker pesan Kafka, untuk pengembangan dan pengujian Solo.

Aliran Panggilan

Blockchain: PoC apa yang harus kita bangun?

  • Aplikasi berkomunikasi dengan Hyperledger Fabric menggunakan Go, Node.js atau Java SDK;
  • Klien membuat transaksi tx dan mengirimkannya ke rekan yang mendukung;
  • Rekan memverifikasi tanda tangan klien, menyelesaikan transaksi, dan mengirimkan tanda tangan pengesahan kembali ke klien. Chaincode dijalankan hanya pada rekan yang mendukung, dan hasil eksekusinya dikirim ke semua rekan. Algoritma kerja ini disebut konsensus PBFT (Practical Byzantine Fault Tolerant). Berbeda dari BFT klasik fakta bahwa pesan terkirim dan konfirmasi diharapkan tidak dari semua peserta, tetapi hanya dari kelompok tertentu;
  • Setelah klien menerima jumlah tanggapan yang sesuai dengan kebijakan pengesahan, ia mengirimkan transaksi ke layanan Pemesanan;
  • Layanan Pemesanan menghasilkan blok dan mengirimkannya ke semua rekan yang melakukan. Layanan pemesanan memastikan pencatatan blok secara berurutan, yang menghilangkan apa yang disebut cabang buku besar (lihat bagian "Garpu");
  • Rekan menerima blok, periksa kembali kebijakan pengesahan, tulis blok ke blockchain dan ubah status di DB “Negara dunia”.

Itu. Hal ini menghasilkan pembagian peran antar node. Hal ini memastikan blockchain dapat diskalakan dan aman:

  • Kontrak pintar (kode rantai) melakukan dukungan rekan-rekan. Hal ini menjamin kerahasiaan kontrak pintar, karena itu tidak disimpan oleh semua peserta, tetapi hanya oleh rekan-rekan yang mendukung.
  • Pemesanan akan bekerja dengan cepat. Hal ini dipastikan dengan fakta bahwa Ordering hanya membentuk sebuah blok dan mengirimkannya ke sekelompok rekan pemimpin yang tetap.
  • Rekan yang berkomitmen hanya menyimpan blockchain - jumlahnya bisa banyak dan tidak memerlukan banyak daya dan pengoperasian instan.

Detail lebih lanjut tentang solusi arsitektur Hyperledger Fabric dan mengapa ia bekerja dengan cara ini dan bukan sebaliknya dapat ditemukan di sini: Asal Usul Arsitektur atau di sini: Hyperledger Fabric: Sistem Operasi Terdistribusi untuk Blockchain yang Diizinkan.

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

  • Menerapkan logika bisnis sewenang-wenang menggunakan mekanisme kontrak pintar;
  • Rekam dan terima data dari database blockchain dalam format JSON;
  • Berikan dan verifikasi akses API menggunakan Certificate Authority.

Sekarang setelah kita memahami sedikit tentang spesifikasi Hyperledger Fabric, mari kita lakukan sesuatu yang bermanfaat!

Menyebarkan blockchain

Pernyataan masalah

Tugasnya adalah mengimplementasikan jaringan Citcoin dengan fungsi berikut: membuat akun, mendapatkan saldo, menambah akun Anda, mentransfer koin dari satu akun ke akun lainnya. Mari menggambar model objek, yang selanjutnya akan kita terapkan dalam kontrak pintar. Jadi, kita akan memiliki akun yang diidentifikasi berdasarkan nama dan berisi saldo, serta daftar akun. Akun dan daftar akun, dalam kaitannya dengan aset Hyperledger Fabric. Oleh karena itu, mereka memiliki sejarah dan keadaan saat ini. Saya akan mencoba menggambarnya dengan jelas:

Blockchain: PoC apa yang harus kita bangun?

Angka teratas adalah keadaan saat ini, yang disimpan dalam database “Negara dunia”. Di bawahnya terdapat gambar yang menunjukkan sejarah yang disimpan dalam blockchain. Keadaan aset saat ini diubah oleh transaksi. Aset hanya berubah secara keseluruhan, sehingga sebagai hasil transaksi, objek baru dibuat, dan nilai aset saat ini masuk ke dalam sejarah.

IBM Cloud

Kami membuat akun di awan IBM. Untuk menggunakan platform blockchain, platform tersebut harus ditingkatkan menjadi Pay-As-You-Go. Proses ini mungkin tidak cepat, karena... IBM meminta informasi tambahan dan memverifikasinya secara manual. Sisi positifnya, saya dapat mengatakan bahwa IBM memiliki materi pelatihan bagus yang memungkinkan Anda menerapkan Hyperledger Fabric di cloud mereka. Saya menyukai rangkaian artikel dan contoh berikut:

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

Blockchain: PoC apa yang harus kita bangun?

Kami membuat node di dalamnya: Orderer CA, Org1 CA, Orderer Peer:

Blockchain: PoC apa yang harus kita bangun?

Kami membuat pengguna:

Blockchain: PoC apa yang harus kita bangun?

Buat Saluran dan beri nama citcoin:

Blockchain: PoC apa yang harus kita bangun?

Pada dasarnya Channel adalah blockchain, jadi dimulai dengan blok nol (blok Genesis):

Blockchain: PoC apa yang harus kita bangun?

Menulis Kontrak 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 Event yang akan diterima oleh program demo.
  • Fungsi instantiate dipanggil satu kali ketika kontrak pintar dibuat. Faktanya, ini dipanggil tidak hanya sekali, tetapi setiap kali versi kontrak pintar berubah. Oleh karena itu, menginisialisasi daftar dengan array kosong adalah ide yang buruk, karena Sekarang, ketika kami mengubah versi kontrak pintar, kami akan kehilangan daftar saat ini. Tapi tidak apa-apa, saya baru belajar).
  • Akun dan daftar akun adalah struktur data JSON. JS digunakan untuk manipulasi data.
  • Anda bisa mendapatkan nilai aset saat ini menggunakan panggilan 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 di sini ada kusen (pernahkah Anda memperhatikannya?), yang menyebabkan peningkatan jumlah akun tanpa henti. Kesalahan seperti itu harus dihindari)

Selanjutnya, kami memuat kontrak pintar ke dalam Saluran dan membuat instance-nya:

Blockchain: PoC apa yang harus kita bangun?

Mari kita lihat transaksi pemasangan Smart Contract:

Blockchain: PoC apa yang harus kita bangun?

Mari kita lihat detail tentang Channel kami:

Blockchain: PoC apa yang harus kita bangun?

Hasilnya, kami mendapatkan diagram jaringan blockchain di cloud IBM berikut ini. Diagram juga menunjukkan program demo yang berjalan di cloud Amazon pada server virtual (lebih lanjut tentang hal ini di bagian berikutnya):

Blockchain: PoC apa yang harus kita bangun?

Membuat GUI untuk panggilan API Hyperledger Fabric

Hyperledger Fabric memiliki API yang dapat digunakan untuk:

  • Buat saluran;
  • Koneksi peer to channel;
  • Instalasi dan instantiasi kontrak pintar di saluran;
  • Memanggil transaksi;
  • Minta informasi di blockchain.

Pengembangan aplikasi

Dalam program demo kami, kami akan menggunakan API hanya untuk memanggil transaksi dan meminta informasi, karena Kami telah menyelesaikan langkah selanjutnya 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 link rangkaian kuliah yang paling saya sukai: Aplikasi Web Full Stack menggunakan Vue.js & Express.js. Hasilnya adalah aplikasi client-server dengan antarmuka grafis familiar dalam gaya Desain Material Google. REST API antara klien dan server terdiri dari beberapa panggilan:

  • HyperledgerDemo/v1/init - menginisialisasi blockchain;
  • HyperledgerDemo/v1/accounts/list — dapatkan daftar semua akun;
  • HyperledgerDemo/v1/account?name=Bob&balance=100 — buat akun Bob;
  • HyperledgerDemo/v1/info?account=Bob — dapatkan informasi tentang akun Bob;
  • HyperledgerDemo/v1/transaction?from=Bob&to=Alice&volume=2 — mentransfer dua koin dari Bob ke Alice;
  • HyperledgerDemo/v1/disconnect - menutup koneksi ke blockchain.

Deskripsi API dengan contoh yang disertakan di dalamnya Situs web tukang pos - program terkenal untuk menguji HTTP API.

Aplikasi demo di cloud Amazon

Saya mengunggah aplikasi ke Amazon karena... IBM masih belum dapat mengupgrade akun saya dan mengizinkan saya membuat server virtual. Cara menambahkan cherry ke domain: www.citcoin.info. Saya akan membiarkan servernya hidup sebentar, lalu mematikannya, karena... sen untuk disewakan menetes, dan koin citcoin belum terdaftar di bursa) Saya menyertakan tangkapan layar demo di artikel agar logika kerjanya jelas. Aplikasi demo dapat:

  • Inisialisasi blockchain;
  • Buat Akun (tetapi sekarang Anda tidak dapat membuat Akun baru, karena jumlah maksimum akun yang ditentukan dalam kontrak pintar telah tercapai di blockchain);
  • Menerima daftar Akun;
  • Transfer koin citcoin antara Alice, Bob dan Alex;
  • Menerima acara (tetapi sekarang tidak ada cara untuk menampilkan acara, jadi untuk kesederhanaan, antarmuka mengatakan bahwa acara tidak didukung);
  • Catat tindakan.

Pertama kita menginisialisasi blockchain:

Blockchain: PoC apa yang harus kita bangun?

Selanjutnya kita buat akun, jangan buang waktu dengan saldo:

Blockchain: PoC apa yang harus kita bangun?

Kami mendapatkan daftar semua akun yang tersedia:

Blockchain: PoC apa yang harus kita bangun?

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

Blockchain: PoC apa yang harus kita bangun?

Di log kami memantau eksekusi transaksi:

Blockchain: PoC apa yang harus kita bangun?

Sebenarnya itu saja dengan program demo. Di bawah ini Anda dapat melihat transaksi kami di blockchain:

Blockchain: PoC apa yang harus kita bangun?

Dan daftar umum transaksinya:

Blockchain: PoC apa yang harus kita bangun?

Dengan ini, kami telah berhasil menyelesaikan implementasi PoC untuk membuat jaringan Citcoin. Apa lagi yang perlu dilakukan agar Citcoin menjadi jaringan lengkap untuk mentransfer koin? Sangat kecil:

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

Kesimpulan

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

  • Anda perlu mempelajari blockchain secara umum dan Hyperledger Fabric pada khususnya;
  • Belajar menggunakan cloud IBM atau Amazon;
  • Pelajari bahasa pemrograman JS dan beberapa kerangka web;
  • Jika beberapa data perlu disimpan bukan di blockchain, tetapi di database terpisah, pelajari cara berintegrasi, misalnya, dengan PostgreSQL;
  • Dan yang tak kalah pentingnya - Anda tidak bisa hidup di dunia modern tanpa pengetahuan tentang Linux!)

Tentu saja, ini bukan ilmu roket, tetapi Anda harus bekerja keras!

о а GitHub

Sumber memakai GitHub. Deskripsi singkat tentang repositori:
Katalog "Server» — Server Node.js
Katalog "klien» — Klien Node.js
Katalog "blockchain"(nilai parameter dan kunci, tentu saja, tidak berfungsi dan hanya diberikan sebagai contoh):

  • kontrak — kode sumber kontrak pintar
  • dompet — kunci pengguna untuk menggunakan Hyperledger Fabric API.
  • *.cds - versi kontrak pintar yang dikompilasi
  • File *.json - contoh file konfigurasi untuk menggunakan Hyperledger Fabric API

Ini hanya permulaan!

Sumber: www.habr.com

Tambah komentar