Blockchain: PoC apa sing kudu kita bangun?

Mripatmu wedi lan tanganmu gatel!

Ing artikel sadurunge, kita mbahas babagan teknologi sing dibangun blockchain (Apa kita kudu mbangun blockchain?) lan kasus sing bisa ditindakake kanthi bantuan (Napa kita kudu mbangun kasus?). Iku wektu kanggo bisa karo tangan! Kanggo ngetrapake pilot lan PoC (Proof of Concept), aku luwih seneng nggunakake awan, amarga ... bisa diakses saka ngendi wae ing donya lan, asring, ora perlu mbuwang wektu kanggo instalasi lingkungan sing mboseni, amarga Ana konfigurasi prasetel. Dadi, ayo nggawe sing gampang, umpamane, jaringan kanggo nransfer dhuwit recehan ing antarane peserta lan ayo diarani Bitcoin. Kanggo iki, kita bakal nggunakake awan IBM lan universal blockchain Hyperledger Fabric. Pisanan, ayo ngerteni kenapa Hyperledger Fabric diarani blockchain universal?

Blockchain: PoC apa sing kudu kita bangun?

Kain Hyperledger - pamblokiran universal

Umumé, sistem informasi universal yaiku:

  • Sakumpulan server lan inti piranti lunak sing nindakake logika bisnis;
  • Antarmuka kanggo interaksi karo sistem;
  • Piranti kanggo registrasi, otentikasi lan wewenang piranti/wong;
  • Database nyimpen data operasional lan arsip:

Blockchain: PoC apa sing kudu kita bangun?

Versi resmi saka Hyperledger Fabric bisa diwaca ing situs, lan cendhak, Hyperledger Fabric minangka platform opensource sing ngidini sampeyan mbangun pamblokiran pribadi lan nglakokake kontrak pinter sewenang-wenang sing ditulis ing basa pemrograman JS lan Go. Ayo dideleng kanthi rinci babagan arsitektur Hyperledger Fabric lan priksa manawa iki minangka sistem universal sing mung duwe spesifik kanggo nyimpen lan ngrekam data. Kekhususan kasebut yaiku data, kaya ing kabeh pamblokiran, disimpen ing blok sing diselehake ing pamblokiran mung yen peserta tekan konsensus lan sawise ngrekam data kasebut ora bisa didandani utawa dibusak kanthi tenang.

Arsitektur Kain Hyperledger

Diagram nuduhake arsitektur Kain Hyperledger:

Blockchain: PoC apa sing kudu kita bangun?

Organizations - organisasi ngemot peer, i.e. blockchain ana amarga dhukungan saka organisasi. Organisasi sing beda bisa dadi bagean saka saluran sing padha.

Saluran - struktur logis sing nyawiji kanca-kanca menyang kelompok, i.e. pamblokiran kasebut ditemtokake. Hyperledger Fabric bisa bebarengan ngolah pirang-pirang blokchain kanthi logika bisnis sing beda.

Penyedia Layanan Keanggotaan (MSP) iku CA (Otoritas Sertifikat) kanggo nerbitake identitas lan nemtokake peran. Kanggo nggawe simpul, sampeyan kudu sesambungan karo MSP.

Node peer - verifikasi transaksi, nyimpen blockchain, nglakokaké kontrak pinter lan sesambungan karo aplikasi. Peers duwe identitas (sertifikat digital), sing diterbitake dening MSP. Ora kaya jaringan Bitcoin utawa Etherium, ing ngendi kabeh node duwe hak sing padha, ing Hyperledger Fabric node nduweni peran sing beda:

  • Peer mbok endorsing peer (EP) lan nglakokake kontrak cerdas.
  • Komitmen peer (CP) - mung nyimpen data ing blockchain lan nganyari "negara Donya".
  • Jangkar Peer (AP) - yen sawetara organisasi melu blockchain, banjur anchor peer digunakake kanggo komunikasi antarane wong-wong mau. Saben organisasi kudu duwe siji utawa luwih kanca jangkar. Nggunakake AP, sembarang kanca ing organisasi bisa njupuk informasi babagan kabeh kanca ing organisasi liyane. Digunakake kanggo nyinkronake informasi antarane AP protokol gosip.
  • Pimpinan Peer - yen organisasi duwe sawetara peer, mung pimpinan peer sing bakal nampa blok saka layanan Pesenan lan menehi menyang kanca liyane. Pimpinan bisa ditemtokake sacara statis utawa dipilih kanthi dinamis dening kanca-kanca ing organisasi. Protokol gosip uga digunakake kanggo nyinkronake informasi babagan pimpinan.

aset - entitas sing nduweni nilai lan disimpen ing pamblokiran. Luwih khusus, iki minangka data nilai kunci ing format JSON. Iki data sing dicathet ing Blockchain. Dheweke duwe sejarah, sing disimpen ing pamblokiran, lan negara saiki, sing disimpen ing database "negara Donya". Struktur data diisi kanthi sewenang-wenang gumantung saka tugas bisnis. Ora ana lapangan sing dibutuhake, mung rekomendasi yaiku aset kudu duwe pemilik lan larang regane.

Ledger - kasusun saka Blockchain lan database negara Word, sing nyimpen status aset saiki. Negara donya nggunakake LevelDB utawa CouchDB.

Kontrak cerdas - nggunakake kontrak pinter, logika bisnis sistem dileksanakake. Ing Hyperledger Fabric, kontrak pinter diarani chaincode. Nggunakake chaincode, aset lan transaksi kasebut ditemtokake. Ing istilah teknis, kontrak cerdas minangka modul piranti lunak sing diimplementasikake ing basa pemrograman JS utawa Go.

Kawicaksanan endorsement - kanggo saben chaincode, sampeyan bisa nyetel kawicaksanan carane akeh konfirmasi kanggo transaksi kudu samesthine lan saka sapa. Yen kabijakan kasebut ora disetel, mula standar yaiku: "transaksi kasebut kudu dikonfirmasi dening anggota organisasi apa wae ing saluran kasebut." Tuladha kawicaksanan:

  • Transaksi kasebut kudu disetujoni dening administrator organisasi;
  • Kudu dikonfirmasi dening anggota utawa klien organisasi;
  • Kudu dikonfirmasi dening organisasi peer.

Layanan pesenan - ngemas transaksi menyang blok lan dikirim menyang kanca-kanca ing saluran kasebut. Njamin pangiriman pesen menyang kabeh kanca ing jaringan. Digunakake kanggo sistem industri Broker pesen Kafka, kanggo pangembangan lan testing Solo.

CallFlow

Blockchain: PoC apa sing kudu kita bangun?

  • Aplikasi komunikasi karo Hyperledger Fabric nggunakake Go, Node.js utawa Java SDK;
  • Klien nggawe transaksi tx lan dikirim menyang kanca sing nyengkuyung;
  • Peer verifikasi teken klien, ngrampungake transaksi, lan ngirim teken endorsement bali menyang klien. Chaincode dieksekusi mung ing peer sing ndhukung, lan asil eksekusi dikirim menyang kabeh kanca. Algoritma kerja iki diarani konsensus PBFT (Practical Byzantine Fault Tolerant). Beda karo klasik BFT kasunyatan sing pesen dikirim lan konfirmasi samesthine ora saka kabeh peserta, nanging mung saka pesawat tartamtu;
  • Sawise klien nampa jumlah tanggapan sing cocog karo kabijakan endorsement, dheweke ngirim transaksi menyang layanan Pesenan;
  • Layanan Pesenan ngasilake blok lan dikirim menyang kabeh kanca sing nindakake. Layanan pesenan njamin ngrekam urutan blok, sing ngilangi garpu ledger sing diarani (deleng bagean "Forks");
  • Peers nampa pemblokiran, mriksa kabijakan endorsement maneh, nulis pemblokiran kanggo blockchain lan ngganti negara ing "World state" DB.

Sing. Iki nyebabake divisi peran antarane node. Iki njamin pamblokiran bisa skalabel lan aman:

  • Kontrak cerdas (chaincode) nindakake endorsing peer. Iki njamin rahasia kontrak pinter, amarga iku ora disimpen dening kabeh peserta, nanging mung dening endorsing ora pati cetho.
  • Pesenan kudu cepet. Iki dijangkepi amarga pesenan mung nggawe blok lan dikirim menyang klompok pimpinan pimpinan sing tetep.
  • Tumindak kanca-kanca mung nyimpen pamblokiran - bisa uga akeh lan ora mbutuhake tenaga lan operasi cepet.

Rincian liyane babagan solusi arsitektur Hyperledger Fabric lan ngapa bisa digunakake kanthi cara iki lan ora bisa ditemokake ing kene: Asal-Usul Arsitektur utawa kene: Kain Hyperledger: Sistem Operasi Distribusi kanggo Blockchain sing Diidini.

Dadi, Hyperledger Fabric minangka sistem universal sing bisa digunakake:

  • Ngleksanakake logika bisnis sewenang-wenang nggunakake mekanisme kontrak pinter;
  • Rekam lan tampa data saka database blockchain ing format JSON;
  • Grant lan verifikasi akses API nggunakake Certificate Authority.

Saiki kita ngerti sethithik babagan spesifik Kain Hyperledger, ayo pungkasane nindakake perkara sing migunani!

Nganggo pamblokiran

Formulasi masalah

Tugas kanggo ngleksanakake jaringan Citcoin kanthi fungsi ing ngisor iki: nggawe akun, entuk imbangan, nambah akun, transfer dhuwit recehan saka siji akun menyang akun liyane. Ayo nggambar model obyek, sing bakal ditindakake ing kontrak cerdas. Dadi, kita bakal duwe akun sing diidentifikasi kanthi jeneng lan ngemot saldo, lan dhaptar akun. Akun lan dhaptar akun, ing syarat-syarat aset Hyperledger Fabric. Dadi, dheweke duwe sejarah lan kahanan saiki. Aku bakal nyoba nggambar iki kanthi jelas:

Blockchain: PoC apa sing kudu kita bangun?

Tokoh ndhuwur iku negara saiki, kang disimpen ing database "negara Donya". Ing ngisor iki ana tokoh sing nuduhake sejarah sing disimpen ing pamblokiran. Status aset saiki diganti dening transaksi. Aset owah-owahan mung minangka sakabehe, supaya minangka asil saka transaksi, obyek anyar digawe, lan Nilai saiki aset dadi menyang sajarah.

IBM Cloud

Kita nggawe akun ing awan IBM. Kanggo nggunakake platform blockchain, kudu diupgrade dadi Pay-As-You-Go. Proses iki bisa uga ora cepet, amarga ... IBM njaluk informasi tambahan lan verifikasi kanthi manual. Ing cathetan positif, aku bisa ngomong yen IBM duwe bahan latihan sing apik sing ngidini sampeyan masang Hyperledger Fabric ing awan. Aku seneng seri artikel lan conto ing ngisor iki:

Ing ngisor iki minangka gambar saka platform IBM Blockchain. Iki dudu instruksi babagan carane nggawe blockchain, nanging mung demonstrasi ruang lingkup tugas kasebut. Dadi, kanggo tujuan kita, kita nggawe siji Organisasi:

Blockchain: PoC apa sing kudu kita bangun?

Kita nggawe simpul ing: Orderer CA, Org1 CA, Orderer Peer:

Blockchain: PoC apa sing kudu kita bangun?

Kita nggawe pangguna:

Blockchain: PoC apa sing kudu kita bangun?

Gawe Saluran lan sebutna citcoin:

Blockchain: PoC apa sing kudu kita bangun?

Ateges Channel minangka pamblokiran, mula diwiwiti kanthi blok nol (block Genesis):

Blockchain: PoC apa sing kudu kita bangun?

Nulis Kontrak Smart

/*
 * 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 intuisi, kabeh kudu jelas ing kene:

  • Ana sawetara fungsi (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance) sing bakal diarani program demo nggunakake Hyperledger Fabric API.
  • Fungsi SendFrom lan RefillBalance ngasilake Acara sing bakal ditampa program demo.
  • Fungsi instantiate disebut sapisan nalika kontrak pinter instantiated. Nyatane, diarani ora mung sapisan, nanging saben-saben versi kontrak cerdas diganti. Mulane, initializing dhaftar karo array kosong iku idea ala, amarga Saiki, nalika ngganti versi kontrak pinter, kita bakal kelangan dhaptar saiki. Nanging ora apa-apa, aku mung sinau).
  • Akun lan dhaptar akun minangka struktur data JSON. JS digunakake kanggo manipulasi data.
  • Sampeyan bisa entuk nilai aset saiki nggunakake panggilan fungsi getState, lan nganyari nggunakake putState.
  • Nalika nggawe Akun, fungsi AddAccount diarani, ing ngendi perbandingan digawe kanggo jumlah maksimum akun ing pamblokiran (maxAccounts = 5). Lan ing kene ana jamb (sampeyan wis ngeweruhi?), Kang ndadékaké kanggo nambah telas ing nomer akun. Kesalahan kasebut kudu dihindari)

Sabanjure, kita mbukak kontrak pinter menyang Saluran lan instantiate:

Blockchain: PoC apa sing kudu kita bangun?

Ayo goleki transaksi kanggo nginstal Smart Contract:

Blockchain: PoC apa sing kudu kita bangun?

Ayo ndeleng rincian babagan Channel kita:

Blockchain: PoC apa sing kudu kita bangun?

Akibaté, kita entuk diagram ing ngisor iki saka jaringan pamblokiran ing awan IBM. Diagram kasebut uga nuduhake program demo sing mlaku ing awan Amazon ing server virtual (liyane babagan ing bagean sabanjure):

Blockchain: PoC apa sing kudu kita bangun?

Nggawe GUI kanggo Hyperledger Fabric API telpon

Kain Hyperledger duwe API sing bisa digunakake kanggo:

  • Nggawe saluran;
  • Sambungan peer to channel;
  • Instalasi lan instantiation saka kontrak pinter ing saluran;
  • Transaksi telpon;
  • Nyuwun informasi babagan blockchain.

Pangembangan aplikasi

Ing program demo kita bakal nggunakake API mung kanggo nelpon transaksi lan njaluk informasi, amarga Kita wis ngrampungake langkah-langkah sing isih ana nggunakake platform blockchain IBM. Kita nulis GUI nggunakake tumpukan teknologi standar: Express.js + Vue.js + Node.js. Sampeyan bisa nulis artikel kapisah babagan carane miwiti nggawe aplikasi web modern. Ing kene aku bakal ninggalake link menyang seri ceramah sing paling disenengi: Full Stack Web App nggunakake Vue.js & Express.js. Asil kasebut minangka aplikasi klien-server kanthi antarmuka grafis sing akrab ing gaya Desain Material Google. API REST antarane klien lan server kasusun saka sawetara telpon:

  • HyperledgerDemo/v1/init - miwiti pamblokiran;
  • HyperledgerDemo/v1/accounts/list — entuk dhaptar kabeh akun;
  • HyperledgerDemo/v1/account?name=Bob&balance=100 — nggawe akun Bob;
  • HyperledgerDemo/v1/info?account=Bob — entuk informasi babagan akun Bob;
  • HyperledgerDemo/v1/transaction?from=Bob&to=Alice&volume=2 — transfer loro dhuwit recehan saka Bob kanggo Alice;
  • HyperledgerDemo/v1/disconnect - nutup sambungan menyang blockchain.

Katrangan saka API karo conto klebu ing Situs web tukang pos - program kondhang kanggo nguji HTTP API.

Aplikasi demo ing awan Amazon

Aku upload aplikasi menyang Amazon amarga ... IBM isih durung bisa nganyarke akunku lan ngidini aku nggawe server virtual. Cara nambah cherry menyang domain: www.citcoin.info. Aku bakal tetep server kanggo sawetara wektu, banjur mateni, amarga ... sen kanggo nyewa netes, lan dhuwit recehan citcoin durung kadhaptar ing bursa saham) Aku kalebu gambar demo ing artikel kasebut supaya logika karya kasebut jelas. Aplikasi demo bisa:

  • Miwiti pamblokiran;
  • Nggawe Akun (nanging saiki sampeyan ora bisa nggawe Akun anyar, amarga jumlah maksimum akun sing ditemtokake ing kontrak pinter wis tekan ing blockchain);
  • Nampa dhaptar Akun;
  • Transfer dhuwit recehan citcoin antarane Alice, Bob lan Alex;
  • Nampa acara (nanging saiki ora ana cara kanggo nuduhake acara, supaya gampang, antarmuka ujar manawa acara ora didhukung);
  • Tumindak log.

Kaping pisanan, kita miwiti blockchain:

Blockchain: PoC apa sing kudu kita bangun?

Sabanjure, kita nggawe akun, aja mbuwang wektu kanthi imbangan:

Blockchain: PoC apa sing kudu kita bangun?

Kita entuk dhaptar kabeh akun sing kasedhiya:

Blockchain: PoC apa sing kudu kita bangun?

Kita milih pangirim lan panampa, lan entuk saldo. Yen pangirim lan panampa padha, akun kasebut bakal diisi maneh:

Blockchain: PoC apa sing kudu kita bangun?

Ing log kita ngawasi eksekusi transaksi:

Blockchain: PoC apa sing kudu kita bangun?

Bener, iku kabeh karo program demo. Ing ngisor iki sampeyan bisa ndeleng transaksi kita ing blockchain:

Blockchain: PoC apa sing kudu kita bangun?

Lan dhaptar umum transaksi:

Blockchain: PoC apa sing kudu kita bangun?

Kanthi iki, kita wis sukses ngrampungake implementasi PoC kanggo nggawe jaringan Citcoin. Apa maneh sing kudu ditindakake kanggo Citcoin dadi jaringan lengkap kanggo nransfer dhuwit recehan? sithik banget:

  • Ing tataran nggawe akun, ngleksanakake generasi kunci pribadi / umum. Kunci pribadi kudu disimpen karo pangguna akun, kunci umum kudu disimpen ing blokchain.
  • Nggawe transfer duwit receh ing ngendi kunci umum, tinimbang jeneng, digunakake kanggo ngenali pangguna.
  • Enkripsi transaksi saka pangguna menyang server nganggo kunci pribadine.

kesimpulan

Kita wis ngetrapake jaringan Citcoin kanthi fungsi ing ngisor iki: nambah akun, entuk imbangan, nambah akun, transfer dhuwit recehan saka siji akun menyang akun liyane. Dadi, apa biaya kanggo mbangun PoC?

  • Sampeyan kudu sinau blockchain ing umum lan Hyperledger Fabric khusus;
  • Sinau nggunakake awan IBM utawa Amazon;
  • Sinau basa pemrograman JS lan sawetara kerangka web;
  • Yen sawetara data kudu disimpen ora ing pamblokiran, nanging ing basis data sing kapisah, banjur sinau kanggo nggabungake, contone, karo PostgreSQL;
  • Lan pungkasan, nanging paling ora - sampeyan ora bisa urip ing jagad modern tanpa kawruh babagan Linux!)

Mesthi, iku dudu ilmu roket, nanging sampeyan kudu kerja keras!

Sumber ing GitHub

Sumber dipasang GitHub. Deskripsi singkat repositori:
Katalog "server» — Server Node.js
Katalog "klien»- Klien Node.js
Katalog "blockchain"(Nilai parameter lan tombol, mesthi, ora bisa digunakake lan mung diwenehi conto):

  • kontrak - kode sumber kontrak pinter
  • dompet - tombol pangguna kanggo nggunakake Hyperledger Fabric API.
  • *.cds - versi kompilasi saka kontrak pinter
  • * .json file - conto file konfigurasi kanggo nggunakake Hyperledger Fabric API

Iku mung wiwitan!

Source: www.habr.com

Add a comment