Blockchain: naon PoC anu kedah urang ngawangun?

Panon kuring sieun, tapi leungeun kuring gatal!

Dina artikel saméméhna, urang nempo téknologi nu blockchains diwangun dina (Naon anu urang kedah ngawangun blockchain?) jeung kasus nu bisa dilaksanakeun kalawan bantuan maranéhanana (Sabaraha biaya urang ngawangun pasualan?). Geus waktuna pikeun meunangkeun hands-on! Pikeun pilot sareng PoCs (Buktina Konsep), kuring langkung resep ngagunakeun awan, sabab tiasa diaksés ti mana waé di dunya sareng sering ngaleungitkeun kabutuhan pangaturan lingkungan anu pikasieuneun, sabab aya konfigurasi anu tos dikonpigurasikeun. Ku kituna, hayu urang ngawangun hal basajan, kawas jaringan pikeun nransferkeun koin antara pamilon, sarta hayu urang sebut wae Citcoin. Kami bakal nganggo awan IBM sareng blockchain Hyperledger Fabric universal. Mimiti, hayu urang ngartos naha Hyperledger Fabric disebut blockchain universal.

Blockchain: naon PoC anu kedah urang ngawangun?

Hyperledger Fabric - a blockchain universal

Sacara umum, sistem inpormasi universal nyaéta:

  • Sakumpulan server sareng inti parangkat lunak anu ngalaksanakeun logika bisnis;
  • Interfaces pikeun interaksi jeung sistem;
  • Sarana pikeun pendaptaran, auténtikasi sareng otorisasi alat/jalma;
  • Database anu nyimpen data operasional sareng arsip:

Blockchain: naon PoC anu kedah urang ngawangun?

Versi resmi naon Hyperledger Fabric tiasa dibaca websitePondokna, Hyperledger Fabric mangrupikeun platform open-source anu ngamungkinkeun pangwangunan blokir swasta sareng palaksanaan kontrak pinter khusus anu ditulis dina JavaScript sareng Go. Hayu urang nempo leuwih deukeut arsitéktur Hyperledger Fabric tur tingal yén éta téh sistem universal, kalawan ngan sarat husus pikeun nyimpen jeung ngarékam data. Sarat ieu nya éta, sakumaha kalayan sagala blockchains, data disimpen dina blok, nu ngan ditambahkeun kana blockchain lamun pamilon ngahontal konsensus, sarta sakali ditulis, data teu bisa undetected atawa dihapus.

Arsitéktur lawon Hyperledger

Diagram nunjukkeun arsitéktur Kain Hyperledger:

Blockchain: naon PoC anu kedah urang ngawangun?

organisasi - organisasi ngandung peers, hartina blockchain aya berkat rojongan organisasi. Organisasi anu béda tiasa janten bagian tina hiji saluran.

Saluran - struktur logis nu unites peers kana grup, sahingga nangtukeun blockchain a. Hyperledger Fabric tiasa sakaligus ngolah sababaraha blokchain kalayan logika bisnis anu béda.

Panyadia Layanan Kaanggotaan (MSP) - mangrupakeun CA (Otoritas Sertipikat) pikeun ngaluarkeun identitas na assigning kalungguhan. Pikeun nyieun titik, anjeun kedah berinteraksi sareng MSP.

Peer node - pariksa transaksi, nyimpen blockchain, ngaéksekusi kontrak pinter, sarta berinteraksi sareng aplikasi. Peers gaduh identitas (sertipikat digital) anu dikaluarkeun ku MSP. Beda sareng jaringan Bitcoin atanapi Ethereum, dimana sadaya titik sami, dina titik Hyperledger Fabric maénkeun peran anu béda:

  • tara bisa endorsing sasama (EP) sareng ngalaksanakeun kontrak pinter.
  • Komitmen tara (CP) - ukur nyimpen data dina blockchain jeung ngamutahirkeun "kaayaan Dunya".
  • Jangkar Peer (AP) - Lamun sababaraha organisasi ilubiung dina blockchain a, peers jangkar dipaké pikeun komunikasi antara aranjeunna. Unggal organisasi kudu boga hiji atawa leuwih anchor peers. Ngagunakeun AP, sagala peer dina organisasi bisa ménta inpo ngeunaan sakabéh peers di organisasi séjén. Pikeun nyingkronkeun inpormasi antara AP, jaringan peer-to-peer dianggo. Protokol gosip.
  • Pamimpin Peer Lamun hiji organisasi boga sababaraha peers, ngan pamimpin peer bakal nampa blok ti Service Mesen tur ngadistribusikaeun ka peers séjén. Pamimpin tiasa ditugaskeun sacara statis atanapi dipilih sacara dinamis ku peers dina organisasi. Protokol gosip ogé dianggo pikeun nyinkronkeun inpormasi ngeunaan pamimpin.

banda - éntitas tina nilai disimpen dina blockchain nu. Leuwih husus, ieu data konci-nilai dina format JSON. Data ieu kacatet dina "Blockchain". Aranjeunna gaduh sajarah, anu disimpen dina blockchain, sareng kaayaan ayeuna, anu disimpen dina pangkalan data "World State". Struktur data dieusi sawenang-wenang gumantung kana kabutuhan bisnis. Henteu aya widang anu diperyogikeun; hijina rekomendasi nyaeta aset kudu boga boga tur ngagambarkeun nilai.

Ledger — diwangun ku blockchain sareng database World State, anu nyimpen kaayaan aset ayeuna. Nagara Dunya ngagunakeun LevelDB atanapi CouchDB.

Kontrak pinter - Kontrak pinter ngalaksanakeun logika bisnis sistem. Dina Hyperledger Fabric, kontrak pinter disebut chaincode. Chaincode dipaké pikeun nangtukeun aset jeung transaksi ngalibetkeun aranjeunna. Sacara téknis, kontrak pinter mangrupikeun modul parangkat lunak anu dilaksanakeun dina JS atanapi Go.

Kawijakan endorsement - Pikeun unggal chaincode, anjeun tiasa nyetél kawijakan pikeun sabaraha sareng ti saha anu nyangka konfirmasi pikeun transaksi. Upami teu aya kabijakan anu disetél, standarna nyaéta "A transaksi kedah dikonfirmasi ku anggota mana waé organisasi dina saluran éta." Conto kawijakan:

  • Transaksi kudu dikonfirmasi ku sagala administrator organisasi;
  • Kedah dikonfirmasi ku anggota atanapi klien organisasi;
  • Kedah diverifikasi ku organisasi peer mana waé.

Jasa pesenan - ngarangkep transaksi kana blok sareng ngirimkeunana ka peers dina saluran. Ngajamin pangiriman pesen ka sadaya peers dina jaringan. Pikeun sistem industri, éta dianggo. calo pesen Kafka, pikeun ngembangkeun sarta nguji Solo.

CallFlow

Blockchain: naon PoC anu kedah urang ngawangun?

  • Aplikasi berinteraksi sareng Hyperledger Fabric nganggo Go, Node.js, atanapi Java SDK;
  • Klién nyiptakeun transaksi tx sareng ngirimkeunana ka endorsing peers;
  • Peer marios tandatangan klien, ngalaksanakeun transaksi, sareng ngirimkeun tandatangan dukungan deui ka klien. Chaincode dieksekusi ngan dina peer endorsing, sarta hasilna disiarkeun ka sadaya peers. Algoritma ieu disebut konsensus PBFT (Practical Byzantine Fault Tolerant). Ieu béda ti BFT Palasik kanyataan yén pesen anu dikirim jeung konfirmasi diperkirakeun teu sadaya pamilon, tapi ngan ti set tangtu;
  • Saatos klien nampi jumlah réspon anu saluyu sareng kabijakan endorsement, éta ngirim transaksi ka jasa Mesen;
  • Ladenan pesenan ngabentuk blok sareng ngirimkeun ka sadaya peer anu komitmen. Ladenan pesenan mastikeun yén blok ditulis sacara berurutan, anu ngaleungitkeun anu disebut garpu ledger (tingali bagian "Forks".);
  • Peers nampi blok, pariksa kawijakan endorsement deui, nulis blok kana blockchain, sarta ngarobah kaayaan dina "kaayaan Dunya" DB.

Ieu ngakibatkeun division tina peran antara titik. Ieu mastikeun skalabilitas sareng kaamanan blockchain:

  • Kontrak pinter (chaincode) dilaksanakeun ku endorsing peers. Ieu ensures karusiahan kontrak pinter, sakumaha kode nu disimpen ukur ku endorsing peers, teu ku sakabeh pamilon.
  • Mesen kudu gancang. Ieu ensured ku kanyataan yén Mesen ukur dibangkitkeun blok jeung ngirimkeunana ka set tetep tina peers pamimpin.
  • Peer komitmen ngan ukur nyimpen blockchain-tiasa seueur di antarana sareng aranjeunna henteu peryogi seueur kakuatan atanapi operasi instan.

Anjeun tiasa langkung jéntré ngeunaan kaputusan arsitéktur Hyperledger Fabric sareng naha éta tiasa dianggo di dieu: Asal-usul Arsitéktur atanapi di dieu: Kain Hyperledger: Sistem Operasi Distribusi pikeun Blockchains Diidinan.

Janten, Hyperledger Fabric mangrupikeun sistem anu universal anu ngamungkinkeun anjeun:

  • Nerapkeun logika bisnis khusus nganggo mékanisme kontrak pinter;
  • Tulis sareng nimba data tina database blockchain dina format JSON;
  • Ngabulkeun sareng pariksa aksés API nganggo Otoritas Sertipikat.

Ayeuna urang parantos nutupan sakedik spésifik Hyperledger Fabric, hayu urang tungtungna ngalakukeun anu mangpaat!

Nyebarkeun blockchain

Ngarumuskeun masalah

Tujuanana nyaéta pikeun nerapkeun jaringan Citcoin kalayan fungsi-fungsi ieu: nyiptakeun akun, kéngingkeun kasaimbangan, top up akun, sareng mindahkeun koin tina hiji akun ka akun anu sanés. Hayu urang ngagambar modél obyék, anu teras urang laksanakeun dina kontrak pinter. Janten, urang bakal gaduh akun, diidentipikasi ku nami sareng ngandung kasaimbangan, sareng daptar akun. Akun sareng daptar akun mangrupikeun aset dina istilah Hyperledger Fabric. Sasuai, aranjeunna gaduh sajarah sareng kaayaan ayeuna. Kuring bakal nyobian ngagambarkeun ieu sacara visual:

Blockchain: naon PoC anu kedah urang ngawangun?

Angka luhur ngagambarkeun kaayaan ayeuna disimpen dina database "World State". Di handap ieu aya inohong némbongkeun sajarah disimpen dina blockchain nu. Kaayaan aset ayeuna dirobih ku transaksi. Aset ngan ukur robih sacara gembleng, janten ngalaksanakeun transaksi nyiptakeun objék énggal, sareng nilai aset ayeuna leungit tina sajarah.

IBM Awan

Jieun akun di awan IBMPikeun ngagunakeun platform blockchain, anjeun kedah ningkatkeun ka Pay-As-You-Go. Proses ieu tiasa nyéépkeun waktos, sabab IBM nyuhunkeun inpormasi tambahan sareng pariksa sacara manual. Dina sisi positif, abdi tiasa disebutkeun yen IBM boga bahan latihan alus pikeun deploying Hyperledger lawon dina awan maranéhna. Kuring resep kana séri artikel sareng conto di handap ieu:

Di handap ieu screenshot tina platform IBM Blockchain. Ieu sanés pituduh pikeun nyiptakeun blockchain, tapi demonstrasi lingkup tugas. Pikeun tujuan urang, urang bakal nyiptakeun Organisasi tunggal:

Blockchain: naon PoC anu kedah urang ngawangun?

Di dinya urang nyieun titik: Orderer CA, Org1 CA, Orderer Peer:

Blockchain: naon PoC anu kedah urang ngawangun?

Kami nyiptakeun pangguna:

Blockchain: naon PoC anu kedah urang ngawangun?

Hayu urang ngadamel Saluran sareng namikeun éta citcoin:

Blockchain: naon PoC anu kedah urang ngawangun?

Saluran dasarna mangrupikeun blokchain, janten éta dimimitian dina blok enol (block Genesis):

Blockchain: naon PoC anu kedah urang ngawangun?

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;

Sacara intuitif, sadayana di dieu kedah jelas:

  • Aya sababaraha fungsi (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance) yén program demo bakal nelepon nganggo Hyperledger Fabric API.
  • Fungsi SendFrom sareng RefillBalance ngahasilkeun acara anu bakal ditampi ku program demo.
  • Fungsi instantiate disebut sakali nalika kontrak pinter ieu instantiated. Nyatana, éta sanés ngan ukur sakali, tapi unggal waktos versi kontrak pinter robih. Ku alatan éta, initializing daptar kalawan array kosong mangrupakeun ide goréng, sabab urang bakal leungit daptar ayeuna iraha wae versi kontrak pinter robah. Tapi henteu kunanaon, abdi nuju diajar.
  • Akun sareng daptar akun mangrupikeun struktur data JSON. JavaScript dipaké pikeun manipulasi data.
  • Anjeun tiasa kéngingkeun nilai ayeuna tina hiji aset ku nelepon fungsi getState, sareng ngapdetna nganggo putState.
  • Nalika hiji Akun dijieun, fungsi AddAccount disebut, nu compares jumlah maksimum akun dina blockchain nu (maxAccounts = 5). Aya bug di dieu (perhatikeun?) Anu nyababkeun paningkatan jumlah akun anu henteu terbatas. Kasalahan sapertos kitu kedah dihindari.

Salajengna, urang unggah kontrak pinter ka Saluran sareng instan:

Blockchain: naon PoC anu kedah urang ngawangun?

Hayu urang tingali transaksi pikeun masang Smart Contract:

Blockchain: naon PoC anu kedah urang ngawangun?

Pariksa langkung rinci ngeunaan Channel kami:

Blockchain: naon PoC anu kedah urang ngawangun?

Diagram jaringan blockchain anu dihasilkeun dina awan IBM nyaéta kieu. Diagram ogé kalebet program demo anu dijalankeun dina server virtual dina awan Amazon (langkung seueur ngeunaan ieu dina bagian salajengna):

Blockchain: naon PoC anu kedah urang ngawangun?

Nyiptakeun GUI pikeun Telepon Hyperledger Fabric API

Hyperledger Fabric gaduh API anu tiasa dianggo pikeun:

  • Nyiptakeun saluran;
  • Sambungan peer to channel;
  • Masang sareng instantiating kontrak pinter dina saluran;
  • transaksi nelepon;
  • Nyuhunkeun inpormasi dina blockchain.

Pangwangunan aplikasi

Dina program demo kami, kami ngan ukur nganggo API pikeun ngamimitian transaksi sareng nyuhunkeun inpormasi, sabab kami parantos réngsé léngkah-léngkah anu sanés nganggo platform blockchain IBM. Ieu gé nulis GUI maké tumpukan téhnologi baku: Express.js + Vue.js + Node.js. Tulisan anu misah tiasa ditulis ngeunaan cara ngamimitian nyiptakeun aplikasi wéb modern. Ieu tautan kana séri ceramah anu paling kuring resep: Full Stack Web App maké Vue.js & Express.jsHasilna nyaéta aplikasi klien-server kalayan antarmuka grafis anu akrab dina gaya Desain Bahan Google. API REST antara klien sareng server diwangun ku sababaraha telepon:

  • HyperledgerDemo/v1/init - ngamimitian blokcheyn;
  • HyperledgerDemo/v1/accounts/list — kéngingkeun daptar sadaya akun;
  • HyperledgerDemo/v1/account?name=Bob&balance=100 — nyieun akun Bob;
  • HyperledgerDemo/v1/info?account=Bob — meunangkeun informasi ngeunaan akun Bob;
  • HyperledgerDemo/v1/transaction?from=Bob&to=Alice&volume=2 — mindahkeun dua koin ti Bob ka Alice;
  • HyperledgerDemo/v1/disconnect — nutup sambungan kana blockchain nu.

Katerangan ngeunaan API sareng conto dipasang dina ramatloka tukang pos - program dipikawanoh lega pikeun nguji HTTP API.

Aplikasi demo dina awan Amazon

Kuring unggah aplikasi ka Amazon sabab IBM masih teu bisa ningkatkeun akun abdi tur ngidinan kuring nyieun server virtual. Kuring nambahan domain salaku céri di luhur: www.citcoin.infoKuring gé tetep server ngajalankeun bari, teras mareuman eta, sakumaha nyewa keur trickling di, sarta Citcoin teu didaptarkeun dina bursa acan. Kuring kaasup screenshot demo dina artikel jadi logika jelas. Aplikasi demo tiasa:

  • Initialize blockchain nu;
  • Jieun Akun (tapi ayeuna teu mungkin nyieun Akun anyar, saprak blockchain geus ngahontal jumlah maksimum akun dieusian dina kontrak pinter);
  • Meunang daptar Akun;
  • Mindahkeun koin citcoin antara Alice, Bob jeung Alex;
  • Nampi acara (tapi ayeuna teu aya deui jalan pikeun nampilkeun acara, janten pikeun kesederhanaan antarmuka nyatakeun yén acara henteu didukung);
  • Log lampah.

Mimiti, hayu urang ngamimitian blockchain:

Blockchain: naon PoC anu kedah urang ngawangun?

Salajengna, jieun akun anjeun sareng ulah miceunan waktos sareng kasaimbangan:

Blockchain: naon PoC anu kedah urang ngawangun?

Kami nampi daptar sadaya akun anu sayogi:

Blockchain: naon PoC anu kedah urang ngawangun?

Pilih pangirim sareng panarima sareng kéngingkeun saldona. Upami pangirim sareng panarima sami, akunna bakal ditambah:

Blockchain: naon PoC anu kedah urang ngawangun?

Urang ngawas palaksanaan transaksi dina log:

Blockchain: naon PoC anu kedah urang ngawangun?

Éta sadayana pikeun program demo. Salajengna, anjeun tiasa ningali transaksi kami dina blockchain:

Blockchain: naon PoC anu kedah urang ngawangun?

Sareng daptar umum transaksi:

Blockchain: naon PoC anu kedah urang ngawangun?

Kami parantos suksés ngalengkepan jaringan Citcoin PoC. Naon deui anu kedah dilakukeun pikeun ngajantenkeun Citcoin jaringan anu lengkep pikeun mindahkeun koin? Ngan saeutik:

  • Dina tahap nyieun akun, laksanakeun generasi konci swasta/umum. Konci swasta kudu disimpen ku pamaké akun, sarta konci publik kudu disimpen dina blockchain nu.
  • Jieun mindahkeun koin anu ngagunakeun konci umum, tinimbang ngaran, pikeun ngaidentipikasi pamaké.
  • Encrypt transaksi bade ti pamaké ka server jeung konci swasta-Na.

kacindekan

Kami ngalaksanakeun jaringan Citcoin kalayan fitur-fitur ieu: tambahkeun akun, kéngingkeun kasaimbangan anjeun, top up akun anjeun, sareng mindahkeun koin tina hiji akun ka anu sanés. Janten, naon biaya kami pikeun ngawangun PoC?

  • Perlu diajar blockchain sacara umum sareng Hyperledger Fabric khususna;
  • Diajar kumaha ngagunakeun awan IBM atanapi Amazon;
  • Diajar basa pamrograman JS sareng sababaraha kerangka wéb;
  • Upami sababaraha data kedah disimpen sanés dina blockchain, tapi dina database anu misah, teras diajar ngahijikeun sareng, contona, PostgreSQL;
  • Sareng anu terakhir, anjeun moal tiasa kamana waé di dunya modéren tanpa terang Linux!

Éta sanés élmu rokét, tapi anjeun kedah kerja keras!

Sumber dina GitHub

Kuring nempatkeun sumberna GitHubKaterangan ringkes ngeunaan gudang:
Katalog «server"- server Node.js
Katalog «langganan"- klien Node.js
Katalog «blockchain» (Nilai parameter sareng konci, tangtosna, henteu tiasa dianggo sareng dipasihkeun pikeun conto waé):

  • kontrak - kode sumber kontrak pinter
  • dompet - konci pamaké pikeun ngagunakeun Hyperledger Fabric API.
  • *.cds — vérsi kontrak pinter anu disusun
  • * .json file - conto file konfigurasi pikeun ngagunakeun Hyperledger Fabric API

Ieu ngan mimiti!

sumber: www.habr.com

Tambahkeun komentar