IepriekÅ”Äjos rakstos mÄs runÄjÄm par tehnoloÄ£ijÄm, uz kurÄm tiek veidotas blokÄ·Ädes (Ko mums vajadzÄtu izveidot blokÄ·Ädi?) un gadÄ«jumi, kurus var Ä«stenot ar viÅu palÄ«dzÄ«bu (KÄpÄc mums vajadzÄtu veidot lietu?). Ir pienÄcis laiks strÄdÄt ar savÄm rokÄm! Pilotu un PoC (Proof of Concept) ievieÅ”anai es dodu priekÅ”roku mÄkoÅiem, jo... tiem var piekļūt no jebkuras vietas pasaulÄ, un bieži vien nav jÄtÄrÄ laiks nogurdinoÅ”ai vides iekÄrtoÅ”anai, jo Ir iepriekÅ” iestatÄ«tas konfigurÄcijas. TÄtad, izveidosim kaut ko vienkÄrÅ”u, piemÄram, tÄ«klu monÄtu pÄrsÅ«tÄ«Å”anai starp dalÄ«bniekiem un pieticÄ«gi sauksim to par Bitcoin. Å im nolÅ«kam izmantosim IBM mÄkoni un universÄlo blokÄ·Ädes Hyperledger Fabric. PirmkÄrt, izdomÄsim, kÄpÄc Hyperledger Fabric tiek saukts par universÄlu blokÄ·Ädi?
Serveru komplekts un programmatūras kodols, kas veic biznesa loģiku;
Saskarnes mijiedarbÄ«bai ar sistÄmu;
IerÄ«Äu/personu reÄ£istrÄcijas, autentifikÄcijas un autorizÄcijas rÄ«ki;
Datu bÄze, kurÄ glabÄjas operatÄ«vie un arhÄ«va dati:
OficiÄlo versiju par to, kas ir Hyperledger Fabric, var izlasÄ«t vietnÄ TieÅ”saistÄ, un Ä«si sakot, Hyperledger Fabric ir atvÄrtÄ pirmkoda platforma, kas ļauj izveidot privÄtas blokÄ·Ädes un izpildÄ«t patvaļīgus viedos lÄ«gumus, kas rakstÄ«ti JS un Go programmÄÅ”anas valodÄs. SÄ«kÄk apskatÄ«sim Hyperledger Fabric arhitektÅ«ru un pÄrliecinÄsimies, ka Ŕī ir universÄla sistÄma, kurai ir tikai datu uzglabÄÅ”anas un ierakstÄ«Å”anas specifika. KonkrÄtÄ«ba ir tÄda, ka dati, tÄpat kÄ visÄs blokÄ·ÄdÄs, tiek glabÄti blokos, kas tiek ievietoti blokÄ·ÄdÄ tikai tad, ja dalÄ«bnieki panÄk konsensu un pÄc ierakstÄ«Å”anas datus nevar klusi izlabot vai dzÄst.
OrganizÄcijas ā organizÄcijas satur vienaudžus, t.i. blokÄ·Äde pastÄv, pateicoties organizÄciju atbalstam. Viena kanÄla daļa var bÅ«t dažÄdas organizÄcijas.
kanÄls ā loÄ£iska struktÅ«ra, kas apvieno vienaudžus grupÄs, t.i. ir norÄdÄ«ta blokÄ·Äde. Hyperledger Fabric var vienlaicÄ«gi apstrÄdÄt vairÄkas blokÄ·Ädes ar atŔķirÄ«gu biznesa loÄ£iku.
DalÄ«bas pakalpojumu sniedzÄjs (MSP) ir CA (sertifikÄcijas iestÄde) identitÄtes izsniegÅ”anai un lomu pieŔķirÅ”anai. Lai izveidotu mezglu, jums ir jÄsadarbojas ar MSP.
VienÄdranga mezgli ā pÄrbaudÄ«t darÄ«jumus, uzglabÄt blokÄ·Ädi, izpildÄ«t viedos lÄ«gumus un mijiedarboties ar lietojumprogrammÄm. Vienaudžiem ir identitÄte (digitÄlais sertifikÄts), ko izsniedz MSP. AtŔķirÄ«bÄ no Bitcoin vai Etherium tÄ«kla, kur visiem mezgliem ir vienÄdas tiesÄ«bas, Hyperledger Fabric mezgliem ir dažÄdas lomas:
Varbūt līdzinieks atbalstot līdziniekus (EP) un izpildīt viedos līgumus.
ApÅÄmÄ«gs lÄ«dzinieks (CP) - saglabÄjiet datus tikai blokÄ·ÄdÄ un atjauniniet āPasaules stÄvokliā.
Enkura PÄrs (AP) - ja blokÄ·ÄdÄ piedalÄs vairÄkas organizÄcijas, tad saziÅai starp tÄm tiek izmantoti enkura partneri. Katrai organizÄcijai ir jÄbÅ«t vienam vai vairÄkiem enkura partneriem. Izmantojot AP, jebkurÅ” organizÄcijas lÄ«dzinieks var iegÅ«t informÄciju par visiem vienaudžiem citÄs organizÄcijÄs. Izmanto, lai sinhronizÄtu informÄciju starp AP tenku protokols.
LÄ«deris PÄrs ā ja organizÄcijai ir vairÄki lÄ«dzinieki, tad tikai lÄ«dzinieka vadÄ«tÄjs saÅems blokus no PasÅ«tÄ«Å”anas dienesta un izsniegs pÄrÄjiem lÄ«dziniekiem. LÄ«deri var norÄdÄ«t statiski vai dinamiski atlasÄ«t organizÄcijas vienaudži. Tenku protokols tiek izmantots arÄ«, lai sinhronizÄtu informÄciju par lÄ«deriem.
AktÄ«vi ā entÄ«tijas, kurÄm ir vÄrtÄ«ba un kuras tiek glabÄtas blokÄ·ÄdÄ. KonkrÄtÄk, tie ir atslÄgas vÄrtÄ«bas dati JSON formÄtÄ. TieÅ”i Å”ie dati tiek ierakstÄ«ti Blockchain. ViÅiem ir vÄsture, kas tiek saglabÄta blokÄ·ÄdÄ, un paÅ”reizÄjais stÄvoklis, kas tiek saglabÄts datu bÄzÄ āPasaules stÄvoklisā. Datu struktÅ«ras tiek aizpildÄ«tas patvaļīgi atkarÄ«bÄ no biznesa uzdevumiem. ObligÄtie lauki nav aizpildÄ«ti, vienÄ«gais ieteikums ir, ka Ä«paÅ”umiem ir jÄbÅ«t Ä«paÅ”niekam un tiem jÄbÅ«t vÄrtÄ«giem.
virsgrÄmata ā sastÄv no Blockchain un Word stÄvokļa datu bÄzes, kurÄ tiek glabÄts paÅ”reizÄjais aktÄ«vu stÄvoklis. Pasaules valsts izmanto LevelDB vai CouchDB.
Gudrs lÄ«gums ā izmantojot viedos lÄ«gumus, tiek realizÄta sistÄmas biznesa loÄ£ika. ProgrammÄ Hyperledger Fabric viedos lÄ«gumus sauc par Ä·Ädes kodu. Izmantojot Ä·Ädes kodu, tiek norÄdÄ«ti aktÄ«vi un darÄ«jumi ar tiem. TehniskÄ ziÅÄ viedie lÄ«gumi ir programmatÅ«ras moduļi, kas ieviesti JS vai Go programmÄÅ”anas valodÄs.
ApstiprinÄÅ”anas politika ā katram Ä·Ädes kodam var iestatÄ«t politiku, cik darÄ«juma apstiprinÄjumi jÄsagaida un no kÄ. Ja politika nav iestatÄ«ta, noklusÄjuma vÄrtÄ«ba ir: ādarÄ«jums ir jÄapstiprina jebkuram kanÄla organizÄcijas dalÄ«bniekamā. Politiku piemÄri:
PasÅ«tÄ«Å”anas pakalpojums ā iesaiÅo darÄ«jumus blokos un nosÅ«ta tos kanÄla vienaudžiem. GarantÄ ziÅojumu piegÄdi visiem vienaudžiem tÄ«klÄ. Izmanto rÅ«pnieciskÄm sistÄmÄm Kafka ziÅojumu brokeris, izstrÄdei un testÄÅ”anai Viens.
CallFlow
Lietojumprogramma sazinÄs ar Hyperledger Fabric, izmantojot Go, Node.js vai Java SDK;
Klients izveido tx transakciju un nosūta to apstiprinoŔajiem vienaudžiem;
Peer pÄrbauda klienta parakstu, pabeidz darÄ«jumu un nosÅ«ta apstiprinÄjuma parakstu atpakaļ klientam. ĶÄdes kods tiek izpildÄ«ts tikai apstiprinoÅ”ajÄ vienÄdrangÄ, un tÄ izpildes rezultÄts tiek nosÅ«tÄ«ts visiem vienaudžiem. Å o darba algoritmu sauc par PBFT (PraktiskÄ Bizantijas kļūdu izturÄ«gÄ) konsensu. AtŔķiras no klasiskais BFT tas, ka ziÅojums tiek nosÅ«tÄ«ts un apstiprinÄjums tiek gaidÄ«ts nevis no visiem dalÄ«bniekiem, bet tikai no noteikta kopuma;
PÄc tam, kad klients ir saÅÄmis apstiprinÄjuma politikai atbilstoÅ”u atbilžu skaitu, viÅÅ” nosÅ«ta darÄ«jumu PasÅ«tÄ«Å”anas dienestam;
PasÅ«tÄ«Å”anas pakalpojums Ä£enerÄ bloku un nosÅ«ta to visiem apÅemÅ”anÄs partneriem. PasÅ«tÄ«Å”anas pakalpojums nodroÅ”ina secÄ«gu bloku ierakstÄ«Å”anu, kas novÄrÅ” tÄ saukto virsgrÄmatas dakÅ”iÅu (skatÄ«t sadaļu "DakÅ”iÅas");
Vienaudži saÅem bloku, vÄlreiz pÄrbauda apstiprinÄÅ”anas politiku, ieraksta bloku blokÄ·ÄdÄ un maina stÄvokli DB āPasaules stÄvoklisā.
Tie. TÄ rezultÄtÄ tiek sadalÄ«tas lomas starp mezgliem. Tas nodroÅ”ina, ka blokÄ·Äde ir mÄrogojama un droÅ”a:
Viedie lÄ«gumi (Ä·Ädes kods) veic vienaudžu apstiprinÄÅ”anu. Tas nodroÅ”ina viedo lÄ«gumu konfidencialitÄti, jo to neuzglabÄ visi dalÄ«bnieki, bet tikai apstiprinoÅ”i vienaudži.
PasÅ«tÄ«Å”anai vajadzÄtu darboties Ätri. To nodroÅ”ina fakts, ka PasÅ«tÄ«Å”ana veido tikai bloku un nosÅ«ta to fiksÄtai lÄ«deru kopai.
ApÅÄmÄ«gie kolÄÄ£i glabÄ tikai blokÄ·Ädi - to var bÅ«t daudz, un tiem nav nepiecieÅ”ama liela jauda un tÅ«lÄ«tÄja darbÄ«ba.
TÄtad Hyperledger Fabric ir patiesi universÄla sistÄma, ar kuru jÅ«s varat:
ÄŖstenot patvaļīgu biznesa loÄ£iku, izmantojot viedo lÄ«gumu mehÄnismu;
IerakstÄ«t un saÅemt datus no blokÄ·Ädes datu bÄzes JSON formÄtÄ;
PieŔķiriet un pÄrbaudiet API piekļuvi, izmantojot sertifikÄcijas iestÄdi.
Tagad, kad esam mazliet izpratuŔi Hyperledger Fabric specifiku, beidzot darīsim kaut ko noderīgu!
BlokÄ·Ädes izvietoÅ”ana
ProblÄmas paziÅojums
Uzdevums ir ieviest Citcoin tÄ«klu ar Å”ÄdÄm funkcijÄm: izveidot kontu, iegÅ«t bilanci, papildinÄt savu kontu, pÄrskaitÄ«t monÄtas no viena konta uz citu. UzzÄ«mÄsim objekta modeli, kuru tÄlÄk ieviesÄ«sim viedÄ lÄ«gumÄ. TÄtad mums bÅ«s konti, kas ir identificÄti pÄc nosaukumiem un satur atlikumu, kÄ arÄ« kontu saraksts. Konti un kontu saraksts ir Hyperledger Fabric aktÄ«vu izteiksmÄ. AttiecÄ«gi tiem ir vÄsture un paÅ”reizÄjais stÄvoklis. Es mÄÄ£inÄÅ”u to skaidri uzzÄ«mÄt:
AugstÄkie skaitļi ir paÅ”reizÄjais stÄvoklis, kas tiek saglabÄts datu bÄzÄ āPasaules stÄvoklisā. Zem tiem ir skaitļi, kas parÄda vÄsturi, kas tiek glabÄta blokÄ·ÄdÄ. AktÄ«vu paÅ”reizÄjo stÄvokli maina darÄ«jumi. AktÄ«vs mainÄs tikai kopumÄ, tÄpÄc darÄ«juma rezultÄtÄ tiek izveidots jauns objekts, un lÄ«dzekļa paÅ”reizÄjÄ vÄrtÄ«ba ieiet vÄsturÄ.
IBM mÄkonis
MÄs izveidojam kontu IBM mÄkonis. Lai izmantotu blokÄ·Ädes platformu, tÄ ir jÄjaunina uz Pay-As-You-Go. Å is process var nebÅ«t Ätrs, jo... IBM pieprasa papildu informÄciju un pÄrbauda to manuÄli. PozitÄ«vi varu teikt, ka IBM ir labi mÄcÄ«bu materiÄli, kas ļauj izvietot Hyperledger Fabric viÅu mÄkonÄ«. Man patika Å”Ädas rakstu un piemÄru sÄrijas:
TÄlÄk ir sniegti IBM Blockchain platformas ekrÄnuzÅÄmumi. Å Ä« nav instrukcija par blokÄ·Ädes izveidi, bet gan vienkÄrÅ”i uzdevuma apjoma demonstrÄcija. TÄtad mÅ«su mÄrÄ·iem mÄs izveidojam vienu organizÄciju:
MÄs tajÄ izveidojam mezglus: PasÅ«tÄ«tÄjs CA, Org1 CA, Orderer Peer:
MÄs veidojam lietotÄjus:
Izveidojiet kanÄlu un nosauciet to par citcoin:
BÅ«tÄ«bÄ kanÄls ir blokÄ·Äde, tÄpÄc tas sÄkas ar nulles bloku (Genesis bloks):
Gudra līguma rakstīŔana
/*
* 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;
IntuitÄ«vi visam Å”eit jÄbÅ«t skaidram:
Ir vairÄkas funkcijas (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance), kuras demonstrÄcijas programma izsauks, izmantojot Hyperledger Fabric API.
Funkcijas SendFrom un RefillBalance Ä£enerÄ notikumus, ko saÅems demonstrÄcijas programma.
InstantiÄcijas funkcija tiek izsaukta vienreiz, kad tiek izveidots viedlÄ«gums. Faktiski to sauc ne tikai vienu reizi, bet katru reizi, kad mainÄs viedÄ lÄ«guma versija. TÄpÄc saraksta inicializÄcija ar tukÅ”u masÄ«vu ir slikta ideja, jo Tagad, mainot viedÄ lÄ«guma versiju, mÄs zaudÄsim paÅ”reizÄjo sarakstu. Bet tas ir labi, es tikai mÄcos).
Konti un kontu saraksts ir JSON datu struktÅ«ras. JS tiek izmantots datu manipulÄcijÄm.
AktÄ«va paÅ”reizÄjo vÄrtÄ«bu var iegÅ«t, izmantojot funkcijas getState izsaukumu, un atjauninÄt to, izmantojot putState.
Veidojot kontu, tiek izsaukta funkcija AddAccount, kurÄ tiek veikts salÄ«dzinÄjums maksimÄlajam kontu skaitam blokÄ·ÄdÄ (maxAccounts = 5). Un Å”eit ir jamb (vai esat pamanÄ«juÅ”i?), kas noved pie bezgalÄ«gas kontu skaita palielinÄÅ”anÄs. No Å”ÄdÄm kļūdÄm ir jÄizvairÄs)
PÄc tam mÄs ielÄdÄjam viedo lÄ«gumu kanÄlÄ un izveidojam to:
ApskatÄ«sim sÄ«kÄku informÄciju par mÅ«su kanÄlu:
RezultÄtÄ mÄs iegÅ«stam Å”Ädu blokÄ·Ädes tÄ«kla diagrammu IBM mÄkonÄ«. DiagrammÄ parÄdÄ«ta arÄ« demonstrÄcijas programma, kas darbojas Amazon mÄkonÄ« virtuÄlajÄ serverÄ« (vairÄk par to nÄkamajÄ sadaļÄ):
GUI izveide Hyperledger Fabric API izsaukumiem
Hyperledger Fabric ir API, ko var izmantot, lai:
Izveidot kanÄlu;
Savienojumi vienÄdranga kanÄlÄ;
Viedo lÄ«gumu uzstÄdÄ«Å”ana un instantiÄcija kanÄlÄ;
Zvanu darījumi;
PieprasÄ«t informÄciju par blokÄ·Ädi.
Lietojumprogrammu izstrÄde
SavÄ demonstrÄcijas programmÄ API izmantosim tikai, lai izsauktu darÄ«jumus un pieprasÄ«tu informÄciju, jo MÄs jau esam pabeiguÅ”i atlikuÅ”Äs darbÄ«bas, izmantojot IBM blokÄ·Ädes platformu. MÄs rakstÄm GUI, izmantojot standarta tehnoloÄ£iju steku: Express.js + Vue.js + Node.js. Par to, kÄ sÄkt veidot modernas tÄ«mekļa lietojumprogrammas, varat uzrakstÄ«t atseviŔķu rakstu. Å eit atstÄÅ”u saiti uz lekciju ciklu, kas man patika visvairÄk: Full Stack Web App, izmantojot Vue.js un Express.js. RezultÄts ir klienta-servera lietojumprogramma ar pazÄ«stamu grafisko interfeisu Google materiÄla dizaina stilÄ. REST API starp klientu un serveri sastÄv no vairÄkiem izsaukumiem:
HyperledgerDemo/v1/info?account=Bob ā iegÅ«stiet informÄciju par Boba kontu;
HyperledgerDemo/v1/transaction?from=Bob&to=Alice&volume=2 ā pÄrsÅ«tiet divas monÄtas no Boba Alisei;
HyperledgerDemo/v1/disconnect ā aizveriet savienojumu ar blokÄ·Ädi.
API apraksts ar iekļautajiem piemÄriem Pastnieka vietne - plaÅ”i pazÄ«stama programma HTTP API testÄÅ”anai.
Demo lietojumprogramma Amazon mÄkonÄ«
Es augÅ”upielÄdÄju lietojumprogrammu Amazon, jo... IBM joprojÄm nav varÄjis jauninÄt manu kontu un ļaut izveidot virtuÄlos serverus. KÄ domÄnam pievienot Ä·irÅ”u: www.citcoin.info. Es kÄdu laiku paturÄÅ”u serveri ieslÄgtu, tad izslÄgÅ”u, jo... Ä«res centi pil, un citcoin monÄtas vÄl nav kotÄtas biržÄ) RakstÄ iekļauju demonstrÄcijas ekrÄnÅ”ÄviÅus, lai darba loÄ£ika bÅ«tu skaidra. DemonstrÄcijas lietojumprogramma var:
InicializÄjiet blokÄ·Ädi;
Izveidot Kontu (bet tagad nevar izveidot jaunu Kontu, jo blokÄ·ÄdÄ ir sasniegts maksimÄlais viedlÄ«gumÄ norÄdÄ«tais kontu skaits);
SaÅemt kontu sarakstu;
PÄrsÅ«tiet citcoin monÄtas starp Alisi, Bobu un Aleksu;
SaÅem notikumus (taÄu tagad nav iespÄjas parÄdÄ«t notikumus, tÄpÄc vienkÄrŔības labad interfeiss saka, ka pasÄkumi netiek atbalstÄ«ti);
ŽurnÄla darbÄ«bas.
Vispirms inicializÄjam blokÄ·Ädi:
TÄlÄk mÄs izveidojam savu kontu, netÄrÄjot laiku ar bilanci:
MÄs saÅemam visu pieejamo kontu sarakstu:
MÄs izvÄlamies sÅ«tÄ«tÄju un saÅÄmÄju un iegÅ«stam viÅu atlikumus. Ja sÅ«tÄ«tÄjs un saÅÄmÄjs ir viens un tas pats, tad viÅa konts tiks papildinÄts:
ŽurnÄlÄ mÄs uzraugÄm darÄ«jumu izpildi:
PatiesÄ«bÄ tas viss ir ar demonstrÄcijas programmu. ZemÄk varat redzÄt mÅ«su darÄ«jumu blokÄ·ÄdÄ:
Un vispÄrÄjais darÄ«jumu saraksts:
LÄ«dz ar to mÄs esam veiksmÄ«gi pabeiguÅ”i PoC ievieÅ”anu, lai izveidotu Citcoin tÄ«klu. Kas vÄl jÄdara, lai Citcoin kļūtu par pilnvÄrtÄ«gu monÄtu pÄrsÅ«tÄ«Å”anas tÄ«klu? Ä»oti mazs:
Konta izveides posmÄ ieviesiet privÄtÄs/publiskÄs atslÄgas Ä£enerÄÅ”anu. PrivÄtÄ atslÄga ir jÄglabÄ pie konta lietotÄja, publiskÄ atslÄga ir jÄglabÄ blokÄ·ÄdÄ.
Veiciet monÄtu pÄrskaitÄ«jumu, kurÄ lietotÄja identificÄÅ”anai tiek izmantota publiskÄ atslÄga, nevis vÄrds.
Å ifrÄjiet darÄ«jumus, kas tiek nosÅ«tÄ«ti no lietotÄja uz serveri, izmantojot viÅa privÄto atslÄgu.
SecinÄjums
Esam ieviesuÅ”i Citcoin tÄ«klu ar Å”ÄdÄm funkcijÄm: pievienot kontu, iegÅ«t atlikumu, papildinÄt savu kontu, pÄrskaitÄ«t monÄtas no viena konta uz citu. TÄtad, cik mums izmaksÄja PoC izveidoÅ”ana?
Jums ir jÄizpÄta blokÄ·Äde kopumÄ un jo Ä«paÅ”i Hyperledger Fabric;
IemÄcÄ«ties izmantot IBM vai Amazon mÄkoÅus;
ApgÅ«stiet JS programmÄÅ”anas valodu un kÄdu tÄ«mekļa ietvaru;
Ja daži dati ir jÄuzglabÄ nevis blokÄ·ÄdÄ, bet atseviÅ”Ä·Ä datu bÄzÄ, tad iemÄcieties integrÄt, piemÄram, ar PostgreSQL;
Un visbeidzot, bet ne mazÄk svarÄ«gi ā jÅ«s nevarat dzÄ«vot mÅ«sdienu pasaulÄ bez zinÄÅ”anÄm par Linux!)
Protams, tÄ nav raÄ·eÅ”u zinÄtne, bet jums bÅ«s smagi jÄstrÄdÄ!
Avoti vietnÄ GitHub
Uzlikti avoti GitHub. ÄŖss repozitorija apraksts:
Katalogs Ā«serverisĀ» ā Node.js serveris
Katalogs Ā«klientsĀ» ā Node.js klients
Katalogs Ā«blockchain"(parametru vÄrtÄ«bas un atslÄgas, protams, nedarbojas un ir norÄdÄ«tas tikai kÄ piemÄrs):
lÄ«gums ā viedÄ lÄ«guma avota kods
maku ā lietotÄja atslÄgas Hyperledger Fabric API lietoÅ”anai.
*.cds ā viedo lÄ«gumu apkopotÄs versijas
*.json faili ā konfigurÄcijas failu piemÄri Hyperledger Fabric API lietoÅ”anai