Blockchain: naon PoC anu kedah urang ngawangun?

Panon anjeun sieun jeung leungeun anjeun gatel!

Dina artikel saméméhna, urang diurus téknologi nu blockchains diwangun (Naon anu urang kedah ngawangun blockchain?) jeung kasus nu bisa dilaksanakeun kalawan bantuan maranéhanana (Naha urang kedah ngawangun pasualan?). Waktosna damel sareng panangan anjeun! Pikeun ngalaksanakeun pilot sareng PoC (Bukti Konsep), kuring langkung resep ngagunakeun awan, sabab ... aranjeunna tiasa diaksés ti mana waé di dunya sareng, sering, henteu kedah miceunan waktos dina pamasangan lingkungan anu pikasieuneun, sabab Aya konfigurasi prasetél. Janten, hayu urang ngadamel anu saderhana, contona, jaringan pikeun nransferkeun koin antara pamilon sareng hayu urang sebut waé Bitcoin. Pikeun ieu kami bakal nganggo awan IBM sareng universal blockchain Hyperledger Fabric. Mimiti, hayu urang terang 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;
  • Alat pikeun pendaptaran, auténtikasi sareng otorisasi alat/jalma;
  • Database nyimpen data operasional sareng arsip:

Blockchain: naon PoC anu kedah urang ngawangun?

Versi resmi naon Hyperledger Fabric tiasa dibaca website, sarta pondokna, Hyperledger Fabric nyaéta platform opensource nu ngidinan Anjeun pikeun ngawangun blockchains swasta sarta ngaéksekusi kontrak pinter sawenang ditulis dina JS na Go basa programming. Hayu urang tingali sacara rinci arsitektur Hyperledger Fabric sareng pastikeun yén ieu mangrupikeun sistem universal anu ngan ukur gaduh spésifik pikeun nyimpen sareng ngarékam data. Spésifisitasna nyaéta yén data, sapertos dina sadaya blokchain, disimpen dina blok anu disimpen dina blokchain ngan upami pamilon ngahontal konsensus sareng saatos ngarékam data henteu tiasa dilereskeun atanapi dihapus.

Arsitéktur lawon Hyperledger

Diagram nunjukkeun arsitéktur Kain Hyperledger:

Blockchain: naon PoC anu kedah urang ngawangun?

organisasi - organisasi ngandung peers, i.e. blockchain aya kusabab dukungan organisasi. Organisasi anu béda tiasa janten bagian tina saluran anu sami.

Saluran - struktur logis nu unites peers kana grup, i.e. blockchain nu dieusian. 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 jeung interaksi jeung aplikasi. Peers gaduh identitas (sertipikat digital), anu dikaluarkeun ku MSP. Beda sareng jaringan Bitcoin atanapi Etherium, dimana sadaya titik gaduh hak anu sami, dina titik Hyperledger Fabric maénkeun peran anu béda:

  • tara meureun endorsing sasama (EP) sareng ngalaksanakeun kontrak pinter.
  • Komitmen tara (CP) - ngan nyimpen data dina blockchain jeung ngapdet "kaayaan Dunya".
  • Jangkar Peer (AP) - lamun sababaraha organisasi ilubiung dina blockchain, teras jangkar peers dipaké pikeun komunikasi antara aranjeunna. Unggal organisasi kudu boga hiji atawa leuwih anchor peers. Ngagunakeun AP, sagala peer dina hiji organisasi bisa ménta informasi ngeunaan sakabéh peers di organisasi séjén. Dipaké pikeun nyinkronkeun inpormasi antara AP protokol gosip.
  • Pamimpin Peer - upami organisasi ngagaduhan sababaraha peer, maka ngan ukur pamimpin peer anu bakal nampi blok tina jasa Pemesanan sareng masihan ka sesa peer. Pamingpin tiasa ditangtukeun sacara statik atanapi dipilih sacara dinamis ku peers dina organisasi. Protokol gosip ogé dianggo pikeun nyinkronkeun inpormasi ngeunaan pamimpin.

banda - éntitas anu gaduh nilai sareng disimpen dina blockchain. Leuwih husus, ieu data konci-nilai dina format JSON. Éta data ieu anu kacatet dina Blockchain. Aranjeunna gaduh sajarah, anu disimpen dina blockchain, sareng kaayaan ayeuna, anu disimpen dina database "kaayaan Dunya". Struktur data dieusi sawenang-wenang gumantung kana tugas bisnis. Henteu aya widang anu diperyogikeun, hiji-hijina rekomendasi nyaéta yén aset kedah gaduh pamilik sareng berharga.

Ledger — diwangun ku Blockchain sareng database kaayaan Kecap, anu nyimpen kaayaan aset ayeuna. Kaayaan dunya nganggo LevelDB atanapi CouchDB.

Kontrak pinter - ngagunakeun kontrak pinter, logika bisnis sistem dilaksanakeun. Dina Hyperledger Fabric, kontrak pinter disebut chaincode. Ngagunakeun chaincode, aset jeung transaksi leuwih aranjeunna dieusian. Dina istilah téknis, kontrak pinter mangrupikeun modul parangkat lunak anu dilaksanakeun dina basa pamrograman JS atanapi Go.

Kawijakan endorsement - pikeun tiap chaincode, Anjeun tiasa nyetel kawijakan dina sabaraha confirmations pikeun urus kudu diperkirakeun jeung saha. Upami kabijakan henteu diatur, maka standarna nyaéta: "transaksi kedah dikonfirmasi ku anggota organisasi mana waé dina saluran éta." Conto kawijakan:

  • Transaksi kedah disatujuan ku pangurus organisasi mana waé;
  • Kedah dikonfirmasi ku anggota atanapi klien organisasi;
  • Kudu dikonfirmasi ku organisasi peer mana wae.

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

CallFlow

Blockchain: naon PoC anu kedah urang ngawangun?

  • Aplikasi komunikasi sareng Hyperledger Fabric nganggo Go, Node.js atanapi Java SDK;
  • Klién nyiptakeun transaksi tx sareng ngirimkeun ka peers anu ngadukung;
  • Peer marios tandatangan klien, ngalengkepan transaksi, sareng ngirimkeun tandatangan dukungan deui ka klien. Chaincode dieksekusi ngan dina peer endorsing, sarta hasil palaksanaan na dikirim ka sadaya peers. Algoritma gawé ieu disebut konsensus PBFT (Practical Byzantine Fault Tolerant). Beda jeung 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, anjeunna ngirim transaksi ka jasa Mesen;
  • Ladenan Pesenan ngahasilkeun blok sareng ngirimkeunana ka sadaya peer anu ngalakukeun. Ladenan pesenan mastikeun rékaman sekuen blok, anu ngaleungitkeun anu disebut garpu ledger (tingali bagian "Forks");
  • Peers nampi blok, pariksa deui kawijakan endorsement, nulis blok kana blockchain sarta ngarobah kaayaan dina "kaayaan Dunya" DB.

Jelema. Ieu ngakibatkeun division tina peran antara titik. Ieu mastikeun blockchain tiasa skala sareng aman:

  • kontrak pinter (chaincode) nedunan endorsing peers. Ieu ensures karusiahan kontrak pinter, sabab teu disimpen ku sakabeh pamilon, tapi ngan ku endorsing sasama.
  • Mesen kedah dianggo gancang. Ieu dipastikeun ku kanyataan yén Mesen ngan ukur ngabentuk blok sareng ngirimkeunana ka sakumpulan pamimpin anu tetep.
  • Peer komitmen ngan ukur nyimpen blockchain - tiasa seueur di antarana sareng aranjeunna henteu peryogi seueur kakuatan sareng operasi instan.

Rincian langkung seueur ngeunaan solusi arsitéktur Hyperledger Fabric sareng naha éta tiasa dianggo ku cara ieu sareng sanés tiasa dipendakan 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 anjeun tiasa:

  • Nerapkeun logika bisnis sawenang-wenang ngagunakeun mékanisme kontrak pinter;
  • Rékam sareng nampi data tina database blockchain dina format JSON;
  • Ngabulkeun sareng pariksa aksés API nganggo Otoritas Sertipikat.

Ayeuna urang ngartos sakedik ngeunaan spésifikasi Hyperledger Fabric, hayu urang tungtungna ngalakukeun anu mangpaat!

Nyebarkeun blockchain

Ngarumuskeun masalah

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

Blockchain: naon PoC anu kedah urang ngawangun?

Inohong luhur nyaéta kaayaan ayeuna, anu disimpen dina database "kaayaan Dunya". Di handap ieu aya inohong némbongkeun sajarah nu disimpen dina blockchain nu. Kaayaan aset ayeuna dirobih ku transaksi. Aset robah ngan sakabéhna, jadi salaku hasil tina urus, hiji objek anyar dijieun, sarta nilai ayeuna asset mana kana sajarah.

IBM Awan

Urang nyieun hiji akun di awan IBM. Pikeun ngagunakeun platform blockchain, éta kedah ditingkatkeun kana Pay-As-You-Go. Prosés ieu bisa jadi teu gancang, sabab ... IBM nyuhunkeun inpormasi tambahan sareng pariksa sacara manual. Dina catetan positif, abdi tiasa disebutkeun yen IBM boga bahan latihan alus nu ngidinan Anjeun pikeun nyebarkeun Hyperledger lawon dina awan maranéhna. Kuring resep séri artikel sareng conto di handap ieu:

Di handap ieu mangrupakeun Potret layar tina platform IBM Blockchain. Ieu sanés instruksi ngeunaan cara nyieun blokcheyn, tapi ngan ukur demonstrasi ruang lingkup tugas. Janten, pikeun tujuan urang, urang ngadamel hiji Organisasi:

Blockchain: naon PoC anu kedah urang ngawangun?

Urang nyieun titik di dinya: Orderer CA, Org1 CA, Orderer Peer:

Blockchain: naon PoC anu kedah urang ngawangun?

Kami nyiptakeun pangguna:

Blockchain: naon PoC anu kedah urang ngawangun?

Jieun Saluran sareng nyauran éta citcoin:

Blockchain: naon PoC anu kedah urang ngawangun?

Intina Channel nyaéta blockchain, ku kituna dimimitian ku 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 kedah jelas di dieu:

  • Aya sababaraha fungsi (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance) yén program demo bakal nelepon nganggo Hyperledger Fabric API.
  • Fungsi SendFrom sareng RefillBalance ngahasilkeun Kajadian anu bakal ditampi ku program demo.
  • Fungsi instantiate disebut sakali nalika kontrak pinter instantiated. Kanyataanna, disebutna teu ngan sakali, tapi unggal waktos versi kontrak pinter robah. Ku alatan éta, initializing daptar kalawan Asép Sunandar Sunarya kosong mangrupakeun ide goréng, sabab Ayeuna, nalika urang ngarobah versi kontrak pinter, urang bakal leungit daptar ayeuna. Tapi henteu kunanaon, kuring ngan ukur diajar).
  • Akun sareng daptar akun mangrupikeun struktur data JSON. JS dipaké pikeun manipulasi data.
  • Anjeun tiasa kéngingkeun nilai ayeuna tina hiji aset nganggo panggero fungsi getState, sareng ngapdetna nganggo putState.
  • Nalika nyieun hiji Akun, fungsi AddAccount disebut, nu ngabandingkeun dijieun pikeun jumlah maksimum akun dina blockchain nu (maxAccounts = 5). Sareng di dieu aya jamb (naha anjeun perhatikeun?), Anu nyababkeun kanaékan anu henteu terbatas dina jumlah akun. Kasalahan sapertos kitu kedah dihindari)

Salajengna, urang ngamuat kontrak pinter kana Saluran sareng instantiate:

Blockchain: naon PoC anu kedah urang ngawangun?

Hayu urang tingali transaksi pikeun masang Smart Contract:

Blockchain: naon PoC anu kedah urang ngawangun?

Hayu urang tingali detil ngeunaan Channel kami:

Blockchain: naon PoC anu kedah urang ngawangun?

Hasilna, urang meunang diagram handap tina jaringan blockchain dina awan IBM. Diagram ogé nunjukkeun program demo anu dijalankeun dina awan Amazon dina server virtual (langkung seueur ngeunaan éta 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:

  • Jieun saluran;
  • Sambungan peer to channel;
  • Pamasangan sareng instantiasi kontrak pinter dina saluran;
  • transaksi nelepon;
  • Nyuhunkeun inpormasi ngeunaan blockchain.

Pangwangunan aplikasi

Dina program demo kami bakal ngagunakeun API ngan pikeun nelepon transaksi sarta menta informasi, sabab Kami parantos réngsé léngkah sésana nganggo platform blockchain IBM. Urang nulis GUI maké tumpukan téhnologi baku: Express.js + Vue.js + Node.js. Anjeun tiasa nyerat artikel anu misah ngeunaan cara ngamimitian nyieun aplikasi wéb modern. Di dieu kuring bakal ngantunkeun tautan kana séri ceramah anu paling kuring resep: Full Stack Web App maké Vue.js & Express.js. Hasilna 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 - initialize blockchain nu;
  • 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 anu kalebet dina ramatloka tukang pos - program well-dipikawanoh pikeun nguji HTTP API.

Aplikasi demo dina awan Amazon

Kuring unggah aplikasi ka Amazon kusabab ... IBM masih henteu tiasa ningkatkeun akun kuring sareng ngamungkinkeun kuring nyiptakeun server virtual. Kumaha cara nambihan céri kana domain: www.citcoin.info. Kuring gé tetep server on sakeudeung, teras mareuman, sabab... cents pikeun nyewa nu muterna, sarta koin citcoin teu acan didaptarkeun di bursa saham) Kuring kaasup Potret layar tina demo dina artikel supados logika karya jelas. Aplikasi demo tiasa:

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

Mimiti urang ngamimitian blockchain:

Blockchain: naon PoC anu kedah urang ngawangun?

Salajengna, urang nyieun akun urang, ulah runtah waktu jeung kasaimbangan:

Blockchain: naon PoC anu kedah urang ngawangun?

Kami nampi daptar sadaya akun anu sayogi:

Blockchain: naon PoC anu kedah urang ngawangun?

Urang milih pangirim jeung panarima, sarta meunangkeun balances maranéhanana. Upami pangirim sareng panarima sami, akunna bakal dieusi deui:

Blockchain: naon PoC anu kedah urang ngawangun?

Dina log urang ngawas palaksanaan transaksi:

Blockchain: naon PoC anu kedah urang ngawangun?

Sabenerna, éta sadayana sareng program demo. Di handap ieu 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?

Kalayan ieu, kami parantos suksés ngalengkepan palaksanaan PoC pikeun nyiptakeun jaringan Citcoin. Naon deui anu kedah dilakukeun pikeun Citcoin janten jaringan anu lengkep pikeun mindahkeun koin? saeutik pisan:

  • Dina tahap nyieun akun, laksanakeun generasi konci pribadi / publik. Konci pribadi kedah disimpen sareng pangguna akun, konci umum kedah disimpen dina blokchain.
  • Jieun mindahkeun koin nu hiji konci umum, tinimbang ngaran, dipaké pikeun ngaidentipikasi pamaké.
  • Encrypt transaksi bade ti pamaké ka server jeung konci swasta-Na.

kacindekan

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

  • Anjeun kedah diajar blockchain sacara umum sareng Hyperledger Fabric khususna;
  • Diajar nganggo 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, contona, sareng PostgreSQL;
  • Sareng anu terakhir tapi henteu sakedik - anjeun moal tiasa hirup di dunya modéren tanpa pangaweruh ngeunaan Linux!)

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

Sumber dina GitHub

Sumber dipasang GitHub. Katerangan ringkes ngeunaan gudang:
Katalog «server» — server Node.js
Katalog «langganan» — klien Node.js
Katalog «blockchain"(Nilai parameter sareng konci, tangtosna, henteu tiasa dianggo sareng ngan ukur dipasihkeun sabagé conto):

  • kontrak - kode sumber kontrak pinter
  • dompet - konci pamaké pikeun ngagunakeun Hyperledger Fabric API.
  • *.cds - versi disusun tina kontrak pinter
  • * .json file - conto file konfigurasi pikeun ngagunakeun Hyperledger Fabric API

Ieu ngan mimiti!

sumber: www.habr.com

Tambahkeun komentar