Sytë friksohen, por duar kërkojnë punë!
Në artikujt e kaluar kemi shqyrtuar teknologjitë mbi të cilat ndodhen blockchain-ët () dhe rastet që mund të realizojmë me ndihmën e tyre (). Ka ardhur koha të punojmë me duar! Për të realizuar pilote dhe PoC (Prova e Konceptit) unë preferoj të përdorë cloud, pasi që ato janë të qasshme nga çdo pikë e botës dhe, shpeshherë, nuk është e nevojshme të humbasim kohë në instalimin e bezdisshëm të ambientit, pasi ka konfigurime të paracaktuara. Pra, le të bëjmë diçka të thjesht, si një rrjet për transferimin e monedhave midis pjesëmarrësve dhe ta quajmë modestisht Sytcoin. Për këtë do të përdorim cloud-in e IBM dhe blockchain-in universal Hyperledger Fabric. Fillimisht, le të shqyrtojmë pse Hyperledger Fabric quhet një blockchain universal?

Hyperledger Fabric â blockchain universal
Në terma të përgjithshëm, një sistem informatik universal është:
- Një grup serverash dhe një bërthamë programore që kryen logjikën e biznesit;
- Interfacet për ndërveprimin me sistemin;
- Mjetet për regjistrimin, autentifikimin dhe autorizimin e pajisjeve / njerëzve;
- Një bazë të dhënash që ruan të dhëna operative dhe arkivore:

Versionin zyrtar, çfarë është Hyperledger Fabric mund ta lexoni në , ndërsa shkurtimisht, Hyperledger Fabric është një platformë open-source që lejon ndërtimin e blockchain-eve të mbyllura dhe ekzekutimin e kontratave inteligjente të shkruara në gjuhët e programimit JS dhe Go. Le të shqyrtojmë me detaje arkitekturën e Hyperledger Fabric dhe të bindemi se kjo është një sistem universal, në të cilin ekziston vetëm specifika e ruajtjes dhe shënimit të të dhënave. Specifika qëndron në faktin se të dhënat, ashtu si në të gjitha blockchain-et, ruhen në blloqe, të cilat futen në blockchain vetëm nëse pjesëmarrësit arrijnë një konsensus dhe pas regjistrimit të dhënat nuk mund të korrigjohen apo të fshihen pa u vënë re.
Arkitektura e Hyperledger Fabric
Në diagram është paraqitur arkitektura e Hyperledger Fabric:

Organizatat â organizatat pĂ«rmbajnĂ« peer, kĂ«shtu qĂ« blockchain ekziston falĂ« mbĂ«shtetjes sĂ« organizatave. Organizatat e ndryshme mund tĂ« hyjnĂ« nĂ« njĂ« channel.
Channel â struktura logjike qĂ« bashkon peer-t nĂ« grupe, kĂ«shtu qĂ« krijohet blockchain. Hyperledger Fabric mund tĂ« pĂ«rpunojĂ« njĂ«kohĂ«sisht disa blockchain-e me logjikĂ« tĂ« ndryshme tĂ« biznesit.
Ofruesi i ShĂ«rbimeve tĂ« AnĂ«tarĂ«sisĂ« (MSP) â Ă«shtĂ« CA (Autoriteti i Certifikimit) pĂ«r lĂ«shimin e identitetit dhe cakimin e roleve. PĂ«r tĂ« krijuar njĂ« nod duhet tĂ« bashkĂ«punoni me MSP.
Peer nodes â kontrollojnĂ« transaksionet, ruajnĂ« bllokçenin, realizojnĂ« kontrata inteligjente dhe ndĂ«rveprojnĂ« me aplikacionet. Peer-at kanĂ« identitet (certifikatĂ« dixhitale), e cila jepet nga MSP. NĂ« ndryshim nga rrjeti Bitcoin apo Ethereum, ku tĂ« gjitha nodet janĂ« tĂ« barabarta, nĂ« Hyperledger Fabric nodet luajnĂ« role tĂ« ndryshme:
- Peer mund të jetë peer i miratuar (EP) dhe realizon kontrata inteligjente.
- Peer i angazhuar (CP) â thjesht ruajnĂ« tĂ« dhĂ«nat nĂ« bllokçen dhe azhurnojnĂ« "Gjendjen e BotĂ«s".
- Peer Ankor (AP) â nĂ«se nĂ« bllokçen marrin pjesĂ« disa organizata, atĂ«herĂ« peer-at ankor pĂ«rdoren pĂ«r lidhjen mes tyre. Ădo organizatĂ« duhet tĂ« ketĂ« njĂ« ose mĂ« shumĂ« peer ankor. Me ndihmĂ«n e AP çdo peer nĂ« organizatĂ« mund tĂ« marrĂ« informacionin pĂ«r tĂ« gjithĂ« peer-at nĂ« organizata tĂ« tjera. PĂ«r sinkronizimin e informacionit mes AP pĂ«rdoret .
- Peer Lider â nĂ«se organizata ka disa peer-a, vetĂ«m peer-i lider do tĂ« marrĂ« blloqet nga shĂ«rbimi i renditjes dhe t'ua japĂ« atyre peer-Ă«ve tĂ« tjerĂ«. Lideri mund tĂ« pĂ«rcaktohet nĂ« mĂ«nyrĂ« statike, por gjithashtu mund tĂ« zgjidhet dinamikisht nga peer-at nĂ« organizatĂ«. PĂ«r sinkronizimin e informacionit mbi liderĂ«t pĂ«rdoret gjithashtu protokolli gossip.
Aktivitetet â entitete me vlerĂ« qĂ« ruajnĂ« nĂ« bllokçen. MĂ« konkretisht, kĂ«to janĂ« tĂ« dhĂ«na çelĂ«s-vlerĂ« nĂ« formatin JSON. KĂ«to tĂ« dhĂ«na regjistrohen nĂ« bllokçen "Blockchain". Ato kanĂ« njĂ« histori, e cila ruhet nĂ« bllokçen dhe njĂ« gjendje aktuale, e cila ruhet nĂ« bazĂ«n e tĂ« dhĂ«nave "Gjendja e BotĂ«s". Strukturat e tĂ« dhĂ«nave mbushen lirisht nĂ« varĂ«si tĂ« detyrave tĂ« biznesit. Nuk ka fusha tĂ« detyrueshme, rekomandimi i vetĂ«m Ă«shtĂ« qĂ« aktivitetet tĂ« kenĂ« njĂ« pronar dhe tĂ« paraqesin vlerĂ«.
Regjistri â pĂ«rbĂ«het nga bllokçeni "Blockchain" dhe baza e tĂ« dhĂ«nave "Gjendja e BotĂ«s", ku ruhet gjendja aktuale e aktiviteteve. Gjendja e BotĂ«s pĂ«rdor LevelDB ose CouchDB.
Kontrata inteligjente â me ndihmĂ«n e kontratave inteligjente realizohet logjika e biznesit tĂ« sistemit. NĂ« Hyperledger Fabric, kontratat inteligjente quhen chaincode. Me anĂ« tĂ« chaincode pĂ«rcaktohen aktivitetet dhe transaksionet mbi to. NĂ«se flasim nĂ« gjuhĂ«n teknike, kontratat inteligjente janĂ« module programi, tĂ« realizuara nĂ« gjuhĂ«t programimi JS ose Go.
Politika e miratimit â pĂ«r çdo chaincode mund tĂ« pĂ«rcaktohen politika se sa dhe nga kush duhet pritur miratimet pĂ«r transaksion. NĂ«se politika nuk Ă«shtĂ« pĂ«rcaktuar, atĂ«herĂ« pĂ«rdoret nga e drejta: âtransaksioni duhet tĂ« miratohet nga çdo anĂ«tar (member) i çdo organizate nĂ« kanalâ. Shembuj tĂ« politikave:
- Transaksioni duhet të konfirmohet nga çdo administrator të organizatës;
- Duhet të konfirmohet nga çdo anëtar ose klient i organizatës;
- Duhet të konfirmohet nga çdo peer i organizatës.
ShĂ«rbimi i porosisĂ« â paketat transaksionet nĂ« blloqe dhe dĂ«rgon peer-Ă«ve nĂ« channel. Garanton dorĂ«zimin e mesazheve pĂ«r tĂ« gjithĂ« peer-Ă«t nĂ« rrjet. PĂ«r sistemet industriale pĂ«rdoret , pĂ«r zhvillim dhe testim .
CallFlow

- Aplikacioni ndërvepron me Hyperledger Fabric, duke përdorur Go, Node.js ose Java SDK;
- Klienti krijon transaksionin tx dhe e dërgon atë te peer-ët e endorsimit;
- Peer-i kontrollon nĂ«nshkrimin e klientit, ekzekuton transaksionin dhe e dĂ«rgon nĂ«nshkrimin e miratimit prapa klientit. Chaincode ekzekutohet vetĂ«m nĂ« peer-Ă«t e endorsimit, dhe rezultati i ekzekutimi tĂ« tij shpĂ«rndahet te tĂ« gjithĂ« peer-Ă«t. Ky algoritĂ«m i punĂ«s quhet â konsensusi PBFT (Practical Byzantine Fault Tolerant). Dallohet nga nĂ« atĂ« qĂ« mesazhi shpĂ«rndahet dhe pritet konfirmimi jo nga tĂ« gjithĂ« pjesĂ«marrĂ«sit, por vetĂ«m nga njĂ« grup tĂ« caktuar;
- Pas marrjes së numrit të përgjigjeve, që i përputhen politikës së miratimit, klienti e dërgon transaksionin te shërbimi i porosisë;
- Shërbimi i porosisë formon bllokun dhe e dërgon atë te të gjithë peer-ët që e miratojnë. Shërbimi i porosisë siguron regjistrimin e rregullt të blloqeve, duke përjashtuar, atë që quhet, fork-i i ledger-it ();
- Peer-ët marrin bllokun, kontrollojnë përsëri politikat e miratimit, regjistrojnë bllokun në blockchain dhe ndryshojnë gjendjen në DB 'World state'.
Pra, ka një ndarje rolesh midis nodave. Kjo siguron që blockchain të jetë i shkallëzueshëm dhe i sigurt:
- Kontratat inteligjente (chaincode) ekzekutohen nga peer-ët e endorsimit. Kjo siguron konfidencialitetin e kontratave inteligjente, pasi ato ruhen jo te të gjithë pjesëmarrësit, por vetëm te peer-ët e endorsimit.
- Porosia duhet të punojë shpejt. Kjo sigurohet nga fakti se Porosia vetëm formon bllokun dhe e dërgon atë te një grup i caktuar liderësh peer-ë.
- Peer-Ă«t qĂ« miratojnĂ« thjesht ruajnĂ« blockchain-in â ata mund tĂ« jenĂ« shumĂ« dhe nuk kĂ«rkojnĂ« kapacitet tĂ« madh dhe punĂ« menjĂ«herĂ«.
Për më shumë informacion mbi zgjidhjet arkitekturore të Hyperledger Fabric dhe pse ai funksionon kështu e jo ndryshe, mund të shihni këtu: ose këtu: .
Pra, Hyperledger Fabric është vërtet një sistem universal, me të cilin mund të:
- Implementoni logjikë të ndryshme biznesi, duke përdorur mekanizmin e kontratave inteligjente;
- Të regjistrosh dhe të marrësh të dhëna nga një bazë të dhënash blockchain në formatin JSON;
- Të ofrosh dhe të verifikosh qasje në API, duke përdorur Autoritetin e Certifikimit.
Tani që kemi kuptuar pak rreth specifikës së Hyperledger Fabric, le të bëjmë diçka të dobishme!
Zhvillimi i blockchain
Formulimi i detyrës
Detyra është të implementojmë një rrjet Citcoin me funksionet e mëposhtme: krijimi i një llogarie, marrja e bilancit, rimbushja e llogarisë, transferimi i monedhave nga një llogari në tjetrën. Do të vizatojmë një model objektor, të cilin më pas do ta realizojmë në një kontratë inteligjente. Pra, do të kemi llogari, të cilat identifikohen me emra (name) dhe përmbajnë bilance (balance), si dhe një listë llogarish. Llogaritë dhe lista e llogarive janë, në terma të Hyperledger Fabric, aset. Prandaj, ato kanë një histori dhe një gjendje aktuale. Do të përpiqem ta ilustroj këtë vizualisht:

Figurat e sipërme përfaqësojnë gjendjen aktuale që ruhet në bazën e të dhënave "World state". Poshtë tyre, figurat tregojnë historinë që ruhet në blockchain. Gjendja aktuale e aseteve ndryshohet nga transaksionet. Aseti ndryshohet vetëm si një e tërë, prandaj në përfundim të ekzekutimit të transaksionit krijohet një objekt i ri, ndërsa vlera aktuale e asetit kalon në histori.
Reketa IBM
Krijojmë një llogari në . Për të përdorur platformën blockchain, duhet ta përmirësojmë atë në Pay-As-You-Go. Ky proces mund të jetë i ngadalshëm, pasi IBM kërkon informacion shtesë dhe e kontrollon atë manualisht. Nga ana pozitive, mund të them se IBM ka materiale të mira mësimore që lejojnë zhvillimin e Hyperledger Fabric në reken e tyre. Më pëlqeu cikli i mëposhtëm i artikujve dhe shembujve:
Më poshtë janë skrinshotet e platformës Blockchain të IBM. Kjo nuk është një udhëzim për krijimin e blockchain, por thjesht një demonstrim i shkallës së detyrës. Pra, për qëllimet tona krijojmë një Organizatë:

Në të krijojmë node: Orderer CA, Org1 CA, Orderer Peer:

Krijojmë përdoruesit:

Krijojmë Channel-in dhe e quajmë citcoin:

Në thelb, Channel-i është një blockchain, prandaj fillon me bllokun zero (Genesis block):

Shkruajmë Smart Contract
/*
* 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;
Intuitivisht, këtu duhet të jetë gjithçka e qartë:
- Ka disa funksione (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance), të cilat do të thërrasë programi demo duke përdorur Hyperledger Fabric API.
- Funksionet SendFrom dhe RefillBalance gjenerojnë ngjarje (Event) që do të marrë programi demo.
- Funksioni instantiate thirret një herë kur instancohet kontrata e mençur. Në të vërtetë, ai thirret jo një herë, por çdo herë kur ndryshohet versioni i kontratës së mençur. Prandaj, inicializimi i listës me një masiv të zbrazët është një ide e keqe, sepse tani, kur të ndryshohet versioni i kontratës së mençur, do të humbim listën aktuale. Por asgjë, unë vetëm po mësoj).
- Account-ët dhe lista e account-eve (accounts) janë struktura të dhënash JSON. Për manipulimin e të dhënave përdoret JS.
- Vlera aktuale e asset-it mund të merret përmes thirrjes së funksionit getState, dhe për ta përditësuar përmes putState.
- Kur krijohet Account thirret funksioni AddAccount, në të cilin bëhet krahasimi për numrin maksimal të account-eve në blockchain (maxAccounts = 5). Dhe këtu ka një gabim (e ndjetë?), i cili çon në rritjen e pafund të numrit të account-eve. Të tilla gabime duhen evituar)
Më pas ngarkojmë kontratën e mençur në Channel dhe e instancon:

Shikojmë transaksionin për vendosjen e Smart Contract:

Shikojmë detajet për Channel-in tonë:

Si rezultat, marrim skemën e mëposhtme të rrjetit blockchain në cloud-in IBM. Në skemë është gjithashtu një program demo, i cili është aktivizuar në cloud-in Amazon në një server virtual (detaje rreth saj do të jenë në seksionin e ardhshëm):

Krijimi i GUI për thirrjet API të Hyperledger Fabric
Hyperledger Fabric ka një API, e cila mund të përdoret për:
- Krijimin e channel-it;
- Lidhjen e peer me channel;
- Instalimin dhe instancimin e kontratave të mençura në channel;
- Thirrjen e transaksioneve;
- Kërkimin e informacionit në blockchain.
Zhvillimi i aplikacionit
Në programin tonë demo do të përdorim API-në vetëm për thirrjen e transaksioneve dhe kërkimin e informacionit, pasi hapat e tjerë i kemi bërë tashmë duke përdorur platformën blockchain të IBM. Shkruajmë GUI, duke përdorur teknologjitë standarde: Express.js + Vue.js + Node.js. Rreth mënyrës se si të filloni të krijoni aplikacione moderne web mund të shkruhet një artikull i veçantë. Këtu do të lë një lidhje për një seri ligjëratash, të cilat më pëlqyen më shumë: . Si rezultat, u krijua një aplikacion klient-server me një ndërfaqe grafike të njohur në stilin Material Design nga Google. REST API midis klientit dhe serverit përbëhet nga disa thirrje:
- HyperledgerDemo/v1/init â tĂ« inicializosh blockchain;
- HyperledgerDemo/v1/accounts/list â tĂ« marrĂ«sh listĂ«n e tĂ« gjithĂ« account-eve;
- HyperledgerDemo/v1/account?name=Bob&balance=100 â tĂ« krijosh account-in Bob;
- HyperledgerDemo/v1/info?account=Bob â tĂ« marrĂ«sh informacion rreth account-it Bob;
- HyperledgerDemo/v1/transaction?from=Bob&to=Alice&volume=2 â tĂ« transferojĂ« dy monedha nga Bob te Alice;
- HyperledgerDemo/v1/disconnect â tĂ« mbyllĂ« lidhjen me blockchain-in.
PĂ«rshkrimi i API me shembuj e kam vendosur nĂ« â njĂ« program i njohur pĂ«r testimin e HTTP API.
Demo aplikacioni në cloud-in Amazon
Aplikacionin e ngarkova në Amazon, pasi IBM ende nuk ka arritur të përmisojë llogarinë time dhe të lejojë krijimin e serverëve virtualë. Si një qershi mbi tortë, vendosa domenin: . Do ta mbaj pak serverin të aktivizuar, pastaj do ta fik, sepse po paguaj qira, dhe monedhat citcoin në bursë ende nuk janë të kotuara) Në artikull po vendos screenshots të demot, në mënyrë që logjika e punës të jetë e qartë. Demo aplikacioni mund:
- Të inicializojë blockchain-in;
- Të krijojë një Account (por tani nuk mund të krijon një Account të ri, pasi numri maksimal i llogarive të përshkruara në kontratën inteligjente është arritur);
- Të marrë një listë të llogarive;
- Të transferojë monedhat citcoin midis Alice, Bob dhe Alex;
- Të marrë ngjarje (por tani ngjarjet nuk mund të shfaqen, kështu që në ndërfaqe për thjeshtësi është shkruar se ngjarjet nuk mbështeten);
- Të regjistrojë veprimet.
Fillimisht e inicializojmë blockchain-in:

Më pas krijojmë llogarinë tonë, pa ndonjë kursim me bilancin:

Marrim një listë të të gjitha llogarive të disponueshme:

Zgjedhim dërguesin dhe marrësin, marrim bilancet e tyre. Nëse dërguesi dhe marrësi janë njëlloj, atëherë do të ndodhë rritja e llogarisë së tij:

NĂ« log ndjekim realizimin e transaksioneve:

Në fakt, me këtë demo programi mbaron. Më pas, mund të shikoni transaksionin tonë në blockchain:

Dhe liste e përgjithshme e transaksioneve:

Me kĂ«tĂ« e pĂ«rfunduam me sukses realizimin e PoC pĂ«r krijimin e rrjetit Citcoin. ĂfarĂ« tjetĂ«r duhet tĂ« bĂ«jmĂ« qĂ« Citcoin tĂ« bĂ«het njĂ« rrjet i plotĂ« pĂ«r transferimin e monedhave? MĂ« pak se sa mendoni:
- GjatĂ« krijimit tĂ« llogarisĂ« tĂ« realizohet gjenerimi i çelĂ«sit privat/publik. ĂelĂ«si privat duhet tĂ« ruhet te pĂ«rdoruesi i llogarisĂ«, çelĂ«si publik nĂ« blockchain.
- Të bëhet transferimi i monedhave, ku identifikimi i përdoruesit përdor çelësin publik dhe jo emrin.
- Të enkriptojmë transaksionet që shkojnë nga përdoruesi në server me çelësin e tij privat.
Përfundim
Kemi realizuar rrjetin Citcoin me funksionet: shto llogari, marrë bilancin, plotësuar llogarinë tënde, transferuar monedha nga një llogari në tjetrën. Pra, çfarë na kostoi ndërtimi i PoC?
- Duhet të studiojmë blockchain-in në përgjithësi dhe Hyperledger Fabric në veçanti;
- Të mësojmë të përdorim cloud-et IBM ose Amazon;
- Mësoni një gjuhë programimi JS dhe ndonjë framework web;
- Nëse ndonjë të dhënë duhet të ruhet jo në blockchain, por në një bazë të veçantë, atëherë mësoni si të integroni, për shembull, me PostgreSQL;
- Dhe e fundit nĂ« listĂ«, por jo nga rĂ«ndĂ«sia â pa dijeninĂ« e Linux-it nuk shkon askund nĂ« botĂ«n moderne!)
Sigurisht, nuk është rocket science, por do t'ju duhet të punoni!
Burimet në GitHub
Burimet i kam vendosur në . Përshkrimi i shkurtër i repositories:
Katalogu "server" â serveri Node.js
Katalogu "client" â klienti Node.js
Katalogu "blockchain" (vlerat e parametrave dhe çelësat, sigurisht, janë të pavlefshme dhe janë dhënë vetëm si shembuj):
- contract â burimi i kontratĂ«s inteligjente
- wallet â çelĂ«sat e pĂ«rdoruesit pĂ«r pĂ«rdorimin e Hyperledger Fabric API.
- *.cds â versionet e kompiluar tĂ« kontratave inteligjente
- *.json skedarĂ«t â shembuj skedarĂ«sh konfigurimi pĂ«r pĂ«rdorimin e Hyperledger Fabric API
ĂshtĂ« vetĂ«m fillimi!
Burimi: habr.com
