Blockchain: ki PoC nou ta dwe bati?

Je ou pè e men ou ap grate!

Nan atik anvan yo, nou te fè fas ak teknoloji yo sou ki blòk yo bati (Ki sa nou ta dwe bati yon blockchain?) ak ka ki ka aplike avèk èd yo (Poukisa nou ta dwe bati yon ka?). Li lè pou travay ak men ou! Pou aplike pilòt ak PoC (Prèv Konsèp), mwen prefere sèvi ak nwaj yo, paske... yo ka jwenn aksè nan nenpòt kote nan mond lan epi, souvan, pa gen okenn bezwen gaspiye tan nan enstalasyon fatigan nan anviwònman an, paske Gen konfigirasyon prereglaj. Se konsa, ann fè yon bagay senp, pou egzanp, yon rezo pou transfere pyès monnen ant patisipan yo epi ann modèsman rele li Bitcoin. Pou sa nou pral sèvi ak nwaj IBM ak blòk inivèsèl Hyperledger Fabric la. Premyèman, ann chèche konnen poukisa Hyperledger Fabric yo rele yon blockchain inivèsèl?

Blockchain: ki PoC nou ta dwe bati?

Hyperledger Fabric - yon blockchain inivèsèl

An jeneral, yon sistèm enfòmasyon inivèsèl se:

  • Yon seri serveurs ak yon nwayo lojisyèl ki fè lojik biznis;
  • Entèfas pou entèraksyon ak sistèm nan;
  • Zouti pou anrejistreman, otantifikasyon ak otorizasyon aparèy/moun;
  • Baz done ki estoke done operasyonèl ak achiv:

Blockchain: ki PoC nou ta dwe bati?

Ou ka li vèsyon ofisyèl Hyperledger Fabric nan Online, ak nan ti bout tan, Hyperledger Fabric se yon platfòm opensource ki pèmèt ou bati blockchains prive ak egzekite kontra entelijan abitrè ekri nan lang yo pwogram JS ak Go. Ann gade an detay nan achitekti Hyperledger Fabric ak asire w ke sa a se yon sistèm inivèsèl ki gen sèlman spesifik pou estoke ak anrejistreman done. Espesifik la se ke done yo, tankou nan tout blockchains, yo estoke nan blòk yo mete sou blockchain la sèlman si patisipan yo rive nan yon konsansis epi apre yo fin anrejistre done yo pa ka tou dousman korije oswa efase.

Hyperledger twal Achitekti

Dyagram nan montre achitekti Hyperledger Fabric la:

Blockchain: ki PoC nou ta dwe bati?

Òganizasyon — òganizasyon yo genyen kanmarad, i.e. blockchain egziste akòz sipò òganizasyon yo. Diferan òganizasyon ka fè pati menm chanèl la.

Chèn — yon estrikti lojik ki ini kanmarad yo an gwoup, i.e. se blockchain la espesifye. Hyperledger Fabric ka trete plizyè blockchain ansanm ak diferan lojik biznis.

Founisè Sèvis Manm (MSP) se yon CA (Otorite Sètifika) pou bay idantite ak bay wòl. Pou kreye yon ne, ou bezwen kominike avèk MSP la.

Nœuds kanmarad — verifye tranzaksyon yo, estoke blockchain a, egzekite kontra entelijan epi kominike avèk aplikasyon yo. Kanmarad yo gen yon idantite (sètifika dijital), ki bay pa MSP. Kontrèman ak rezo Bitcoin oswa Etherium, kote tout nœuds gen dwa egal, nan Hyperledger Fabric nœuds jwe diferan wòl:

  • Kanmarad petèt andose kanmarad (EP) epi egzekite kontra entelijan.
  • Komèt kanmarad (CP) - sèlman sove done nan blockchain la epi mete ajou "Eta Mondyal la".
  • Anchor Peer (AP) - si plizyè òganizasyon patisipe nan blockchain a, yo itilize kanmarad jete lank pou kominikasyon ant yo. Chak òganizasyon dwe genyen youn oswa plis kanmarad jete lank. Lè l sèvi avèk AP, nenpòt kamarad nan yon òganizasyon ka jwenn enfòmasyon sou tout kanmarad nan lòt òganizasyon. Yo itilize pou senkronize enfòmasyon ant AP yo pwotokòl tripotay.
  • Lidè Kanmarad — si yon òganizasyon gen plizyè kanmarad, Lè sa a, sèlman lidè nan kanmarad la ap resevwa blòk nan sèvis la kòmande epi ba yo bay rès kanmarad yo. Lidè ka swa espesifye estatik oswa chwazi dinamik pa kanmarad nan òganizasyon an. Pwotokòl tripotay yo itilize tou pou senkronize enfòmasyon sou lidè yo.

Byen — antite ki gen valè epi ki estoke sou blockchain la. Plis espesyalman, sa a se done kle-valè nan fòma JSON. Se done sa yo ki anrejistre nan Blockchain la. Yo gen yon istwa, ki estoke nan blockchain a, ak yon eta aktyèl, ki estoke nan baz done "Eta Mondyal la". Estrikti done yo ranpli abitrèman depann sou travay biznis yo. Pa gen okenn jaden obligatwa, rekòmandasyon an sèlman se ke byen yo dwe gen yon pwopriyetè epi yo dwe gen anpil valè.

Ledger — konsiste de Blockchain la ak baz done eta Pawòl la, ki estoke eta aktyèl la nan byen yo. Eta mondyal itilize LevelDB oswa CouchDB.

Kontra entelijan - lè l sèvi avèk kontra entelijan, lojik biznis nan sistèm nan aplike. Nan Hyperledger Fabric, kontra entelijan yo rele chaincode. Sèvi ak chaincode, byen ak tranzaksyon sou yo espesifye. An tèm teknik, kontra entelijan yo se modil lojisyèl aplike nan lang yo pwogram JS oswa Go.

Politik andòsman — pou chak chaincode, ou ka mete yon politik sou konbyen konfimasyon pou yon tranzaksyon ta dwe espere ak nan men ki moun. Si règleman an pa tabli, lè sa a default se: "tranzaksyon an dwe konfime pa nenpòt manm nan nenpòt òganizasyon nan kanal la." Egzanp politik:

  • Nenpòt administratè òganizasyon an dwe apwouve tranzaksyon an;
  • Nenpòt manm oswa kliyan òganizasyon an dwe konfime;
  • Nenpòt òganizasyon kamarad dwe konfime.

Komande sèvis — pake tranzaksyon yo nan blòk epi voye yo bay kanmarad nan kanal la. Garanti livrezon mesaj bay tout kanmarad sou rezo a. Itilize pou sistèm endistriyèl yo Kafka mesaj koutye, pou devlopman ak tès sèlman.

CallFlow

Blockchain: ki PoC nou ta dwe bati?

  • Aplikasyon an kominike ak Hyperledger Fabric lè l sèvi avèk Go, Node.js oswa Java SDK;
  • Kliyan an kreye yon tranzaksyon tx epi li voye l bay parèy ki sipòte yo;
  • Kanmarad la verifye siyati kliyan an, konplete tranzaksyon an, epi voye siyati andòsman an tounen ba kliyan an. Chaincode egzekite sèlman sou kanmarad andose a, epi rezilta egzekisyon li voye bay tout kanmarad. Algorithm travay sa a rele konsansis PBFT (Pratik Byzantine Fault Tolerant). Diferan de klasik BFT lefèt ke yo voye mesaj la ak konfimasyon espere pa nan tout patisipan yo, men sèlman nan yon seri sèten;
  • Apre kliyan an te resevwa kantite repons ki koresponn ak politik andòsman an, li voye tranzaksyon an nan sèvis Komandasyon an;
  • Sèvis Komandasyon an jenere yon blòk epi voye li bay tout parèy ki komèt yo. Sèvis lòd asire anrejistreman sekans nan blòk, ki elimine sa yo rele fouchèt la Ledger (gade seksyon "fouchèt");
  • Kanmarad yo resevwa yon blòk, tcheke politik andòsman an ankò, ekri blòk la nan blockchain la epi chanje eta a nan DB "Eta Mondyal la".

Moun sa yo. Sa a lakòz yon divizyon wòl ant nœuds yo. Sa asire ke blockchain la évolutive ak an sekirite:

  • Kontra entelijan (chaincode) fè andose kanmarad yo. Sa a asire konfidansyalite nan kontra entelijan, paske tout patisipan yo pa estoke li, men se sèlman lè yo andose kanmarad yo.
  • Kòmann yo ta dwe travay byen vit. Sa a se asire pa lefèt ke Commanding sèlman fòme yon blòk epi voye li nan yon seri fiks nan kanmarad lidè.
  • Kanmarad komèt sèlman magazen blockchain a - kapab genyen anpil nan yo epi yo pa bezwen anpil pouvwa ak operasyon enstantane.

Ou ka jwenn plis detay sou solisyon achitekti Hyperledger Fabric ak poukisa li travay nan fason sa a epi yo pa otreman ka jwenn isit la: Orijin Achitekti oswa isit la: Hyperledger Fabric: Yon sistèm opere distribye pou Blockchains otorize.

Se konsa, Hyperledger Fabric se yon sistèm vrèman inivèsèl ak ki ou kapab:

  • Aplike lojik biznis abitrè lè l sèvi avèk mekanis kontra entelijan;
  • Anrejistre epi resevwa done ki soti nan baz done blòk la nan fòma JSON;
  • Bay ak verifye aksè API lè l sèvi avèk Otorite Sètifika.

Kounye a ke nou konprann yon ti kras sou spesifik yo nan Hyperledger Fabric, an nou finalman fè yon bagay itil!

Deplwaye blockchain

Deklarasyon sou pwoblèm nan

Travay la se aplike rezo Citcoin ak fonksyon sa yo: kreye yon kont, jwenn yon balans, monte kont ou, transfere pyès monnen soti nan yon kont nan yon lòt. Ann trase yon modèl objè, ke nou pral plis aplike nan yon kontra entelijan. Se konsa, nou pral gen kont ki idantifye pa non epi ki gen yon balans, ak yon lis kont. Kont ak yon lis kont yo, an tèm de byen Hyperledger Fabric. An konsekans, yo gen yon istwa ak yon eta aktyèl. Mwen pral eseye trase sa a klèman:

Blockchain: ki PoC nou ta dwe bati?

Chif ki pi wo yo se eta aktyèl la, ki estoke nan baz done "Eta Mondyal la". Anba yo gen figi ki montre istwa ki estoke nan blockchain la. Eta aktyèl la nan byen yo chanje pa tranzaksyon yo. Byen an chanje sèlman kòm yon antye, kidonk kòm yon rezilta nan tranzaksyon an, yo kreye yon nouvo objè, ak valè aktyèl la nan avantaj la ale nan listwa.

IBM Cloud

Nou kreye yon kont nan IBM nwaj. Pou itilize platfòm blockchain la, li dwe modènize nan Pay-As-You-Go. Pwosesis sa a ka pa rapid, paske... IBM mande plis enfòmasyon epi verifye li manyèlman. Sou yon nòt pozitif, mwen ka di ke IBM gen bon materyèl fòmasyon ki pèmèt ou deplwaye Hyperledger Fabric nan nwaj yo. Mwen te renmen seri atik ak egzanp sa yo:

Sa ki anba la yo se Ekran nan platfòm IBM Blockchain. Sa a se pa yon enstriksyon sou kòman yo kreye yon blockchain, men tou senpleman yon demonstrasyon sou sijè ki abòde lan travay la. Se konsa, pou objektif nou yo, nou fè yon sèl Òganizasyon:

Blockchain: ki PoC nou ta dwe bati?

Nou kreye nœuds ladan l: Orderer CA, Org1 CA, Orderer Peer:

Blockchain: ki PoC nou ta dwe bati?

Nou kreye itilizatè:

Blockchain: ki PoC nou ta dwe bati?

Kreye yon chanèl epi rele li citcoin:

Blockchain: ki PoC nou ta dwe bati?

Esansyèlman Channel se yon blockchain, kidonk li kòmanse ak blòk zewo (Blòk Jenèz):

Blockchain: ki PoC nou ta dwe bati?

Ekri yon kontra entelijan

/*
 * 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;

Entwisyon, tout bagay ta dwe klè isit la:

  • Gen plizyè fonksyon (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance) ke pwogram Demo a pral rele lè l sèvi avèk Hyperledger Fabric API.
  • Fonksyon SendFrom ak RefillBalance jenere Evènman ke pwogram Demo a pral resevwa.
  • Yo rele fonksyon enstansye a yon fwa lè yon kontra entelijan enstansye. An reyalite, yo rele li pa sèlman yon fwa, men chak fwa vèsyon an kontra entelijan chanje. Se poutèt sa, inisyalize yon lis ak yon etalaj vid se yon move lide, paske Koulye a, lè nou chanje vèsyon an nan kontra entelijan an, nou pral pèdi lis aktyèl la. Men, se oke, mwen jis aprann).
  • Kont ak yon lis kont yo se estrikti done JSON. JS yo itilize pou manipilasyon done.
  • Ou ka jwenn valè aktyèl la nan yon byen lè l sèvi avèk apèl fonksyon getState, epi mete ajou li lè l sèvi avèk putState.
  • Lè w ap kreye yon Kont, yo rele fonksyon AddAccount, kote yo fè yon konparezon pou kantite maksimòm kont nan blockchain la (maxAccounts = 5). Ak isit la gen yon jamb (ou remake?), ki mennen nan yon ogmantasyon kontinuèl nan kantite kont. Erè sa yo dwe evite)

Apre sa, nou chaje kontra entelijan an nan chanèl la epi enstansye li:

Blockchain: ki PoC nou ta dwe bati?

Ann gade nan tranzaksyon an pou enstale Smart Contract:

Blockchain: ki PoC nou ta dwe bati?

Ann gade detay sou chanèl nou an:

Blockchain: ki PoC nou ta dwe bati?

Kòm yon rezilta, nou jwenn dyagram sa a nan yon rezo blòk nan nwaj IBM la. Dyagram nan montre tou yon pwogram Demo k ap kouri nan nwaj Amazon sou yon sèvè vityèl (plis sou li nan pwochen seksyon an):

Blockchain: ki PoC nou ta dwe bati?

Kreye yon entèfas pou apèl Hyperledger Fabric API

Hyperledger Fabric gen yon API ki ka itilize pou:

  • Kreye chanèl;
  • Koneksyon peer to channel;
  • Enstalasyon ak enstansyasyon nan kontra entelijan nan kanal la;
  • Rele tranzaksyon;
  • Mande enfòmasyon sou blockchain la.

Devlopman aplikasyon

Nan pwogram Demo nou an nou pral sèvi ak API a sèlman pou rele tranzaksyon yo epi mande enfòmasyon, paske Nou te deja konplete etap ki rete yo lè l sèvi avèk platfòm IBM blockchain. Nou ekri yon entèfas lè l sèvi avèk yon pil teknoloji estanda: Express.js + Vue.js + Node.js. Ou ka ekri yon atik separe sou kòman yo kòmanse kreye aplikasyon entènèt modèn. Isit la mwen pral kite yon lyen nan seri konferans yo ke mwen te plis renmen: Full Stack Web App lè l sèvi avèk Vue.js & Express.js. Rezilta a se yon aplikasyon kliyan-sèvè ak yon koòdone grafik abitye nan style Google Design Material. API REST ant kliyan ak sèvè konsiste de plizyè apèl:

  • HyperledgerDemo/v1/init - inisyalize blockchain la;
  • HyperledgerDemo/v1/accounts/list — jwenn yon lis tout kont yo;
  • HyperledgerDemo/v1/account?name=Bob&balance=100 — kreye kont Bob;
  • HyperledgerDemo/v1/info?account=Bob — jwenn enfòmasyon sou kont Bob;
  • HyperledgerDemo/v1/transaction?from=Bob&to=Alice&volume=2 - transfere de pyès monnen soti nan Bob a Alice;
  • HyperledgerDemo/v1/disconnect - fèmen koneksyon an ak blockchain la.

Deskripsyon API a ak egzanp ki enkli nan Sitwèb Postman - yon pwogram ki byen koni pou teste HTTP API.

Demo aplikasyon nan Amazon nwaj

Mwen telechaje aplikasyon an sou Amazon paske... IBM poko kapab ajou kont mwen epi pèmèt mwen kreye sèvè vityèl yo. Ki jan yo ajoute yon Cherry nan domèn nan: www.citcoin.info. Mwen pral kenbe sèvè a limen pou yon ti tan, Lè sa a, fèmen li, paske... santim pou lwaye ap koule, ak pyès monnen citcoin yo poko nan lis sou echanj la) Mwen enkli Ekran nan Demo a nan atik la pou ke lojik la nan travay la klè. Aplikasyon Demo a kapab:

  • Inisyalize blockchain la;
  • Kreye yon kont (men kounye a ou pa ka kreye yon nouvo kont, paske kantite maksimòm kont ki espesifye nan kontra entelijan an te rive nan blockchain la);
  • Resevwa yon lis Kont;
  • Transfere pyès monnen citcoin ant Alice, Bob ak Alex;
  • Resevwa evènman (men kounye a pa gen okenn fason yo montre evènman, kidonk pou senplisite, koòdone a di ke evènman yo pa sipòte);
  • Log aksyon yo.

Premyèman, nou inisyalize blockchain la:

Blockchain: ki PoC nou ta dwe bati?

Apre sa, nou kreye kont nou an, pa pèdi tan ak balans lan:

Blockchain: ki PoC nou ta dwe bati?

Nou jwenn yon lis tout kont ki disponib:

Blockchain: ki PoC nou ta dwe bati?

Nou chwazi moun k ap resevwa a ak moun k ap resevwa, epi nou jwenn balans yo. Si moun k ap voye a ak moun k ap resevwa a se menm bagay la, yo pral ranpli kont li:

Blockchain: ki PoC nou ta dwe bati?

Nan boutèy la nou kontwole ekzekisyon tranzaksyon yo:

Blockchain: ki PoC nou ta dwe bati?

Aktyèlman, sa a tout ak pwogram nan Demo. Anba a ou ka wè tranzaksyon nou an nan blockchain la:

Blockchain: ki PoC nou ta dwe bati?

Ak lis jeneral tranzaksyon yo:

Blockchain: ki PoC nou ta dwe bati?

Avèk sa a, nou te konplete avèk siksè aplikasyon PoC pou kreye rezo Citcoin. Ki lòt bagay yo dwe fè pou Citcoin vin yon rezo konplè pou transfere pyès monnen? Piti:

  • Nan etap kreyasyon kont, aplike jenerasyon yon kle prive / piblik. Kle prive a dwe estoke ak itilizatè kont la, kle piblik la dwe estoke nan blockchain la.
  • Fè yon transfè pyès monnen kote yo itilize yon kle piblik, olye de yon non, pou idantifye itilizatè a.
  • Ankripte tranzaksyon ki soti nan itilizatè a nan sèvè a ak kle prive li.

Konklizyon

Nou te aplike rezo Citcoin ak fonksyon sa yo: ajoute yon kont, jwenn yon balans, monte kont ou, transfere pyès monnen soti nan yon kont nan yon lòt. Se konsa, ki sa li te koute nou bati yon PoC?

  • Ou bezwen etidye blockchain an jeneral ak Hyperledger Fabric an patikilye;
  • Aprann sèvi ak IBM oswa Amazon nwaj;
  • Aprann langaj pwogram JS ak kèk kad entènèt;
  • Si kèk done bezwen estoke pa nan blockchain a, men nan yon baz done separe, Lè sa a, aprann entegre, pou egzanp, ak PostgreSQL;
  • E dènye men pa pi piti - ou pa ka viv nan mond modèn lan san yo pa konnen Linux!)

Natirèlman, li pa syans fize, men ou pral oblije travay di!

Sous sou GitHub

Sous mete sou GitHub. Brèf deskripsyon depo a:
Katalòg «sèvè» — Sèvè Node.js
Katalòg «kliyan» — Kliyan Node.js
Katalòg «blockchain"(valè paramèt ak kle, nan kou, yo pa travay epi yo bay sèlman kòm yon egzanp):

  • kontra - kòd sous kontra entelijan
  • bous - kle itilizatè pou itilize Hyperledger Fabric API.
  • *.cds - vèsyon konpile nan kontra entelijan
  • *.json fichye - egzanp fichye konfigirasyon pou itilize Hyperledger Fabric API

Se sèlman kòmansman an!

Sous: www.habr.com

Add nouvo kòmantè