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?
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:
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:
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
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.
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:
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:
Kita nggawe simpul ing: Orderer CA, Org1 CA, Orderer Peer:
Kita nggawe pangguna:
Gawe Saluran lan sebutna citcoin:
Ateges Channel minangka pamblokiran, mula diwiwiti kanthi blok nol (block Genesis):
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:
Ayo goleki transaksi kanggo nginstal Smart Contract:
Ayo ndeleng rincian babagan Channel kita:
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):
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/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:
Sabanjure, kita nggawe akun, aja mbuwang wektu kanthi imbangan:
Kita entuk dhaptar kabeh akun sing kasedhiya:
Kita milih pangirim lan panampa, lan entuk saldo. Yen pangirim lan panampa padha, akun kasebut bakal diisi maneh:
Ing log kita ngawasi eksekusi transaksi:
Bener, iku kabeh karo program demo. Ing ngisor iki sampeyan bisa ndeleng transaksi kita ing blockchain:
Lan dhaptar umum transaksi:
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