Мурунку макалаларда биз блокчейндер курулган технологиялар менен сүйлөштүк (Блокчейнди эмне куруу керек?) жана алардын жардамы менен ишке ашырылышы мүмкүн болгон учурлар (Эмне үчүн биз ишти курушубуз керек?). Колуңуз менен иштөөгө убакыт келди! Учкучтарды жана PoC (Түшүнүктүн далили) ишке ашыруу үчүн мен булуттарды колдонууну туура көрөм, анткени... аларга дүйнөнүн каалаган жеринен кирүүгө болот жана көбүнчө айлана-чөйрөнү тажатма орнотууга убакыт коротуунун кереги жок, анткени Алдын ала коюлган конфигурациялар бар. Ошентип, келгиле, жөнөкөй бир нерсе кылалы, мисалы, катышуучулардын ортосунда монеталарды өткөрүү тармагын жана аны Bitcoin деп атайлы. Бул үчүн биз IBM булутун жана универсалдуу блокчейн Hyperledger Fabric колдонобуз. Биринчиден, Hyperledger Fabric эмне үчүн универсалдуу блокчейн деп аталарын аныктап көрөлү?
Hyperledger Fabric - универсалдуу блокчейн
Жалпысынан алганда, универсалдуу маалымат системасы болуп төмөнкүлөр саналат:
Серверлердин топтому жана бизнес логикасын аткарган программалык өзөк;
Система менен өз ара аракеттенүү үчүн интерфейстер;
Түзмөктөрдү/адамдарды каттоо, аутентификациялоо жана авторизациялоо үчүн аспаптар;
Операциялык жана архивдик маалыматтарды сактоочу маалымат базасы:
Hyperledger Fabric дегендин расмий версиясын бул жерден окуса болот сайты, жана кыскача айтканда, Hyperledger Fabric бул ачык булак платформасы, ал сизге жеке блокчейндерди курууга жана JS жана Go программалоо тилдеринде жазылган акылдуу келишимдерди аткарууга мүмкүндүк берет. Келгиле, Hyperledger Fabric архитектурасын майда-чүйдөсүнө чейин карап көрөлү жана бул маалыматтарды сактоо жана жазуу үчүн гана өзгөчөлүктөргө ээ болгон универсалдуу система экенине ынаналы. Өзгөчөлүгү, маалыматтар, бардык блокчейндердегидей, катышуучулар консенсуска жеткенде гана блокчейнге жайгаштырылуучу блоктордо сакталат жана маалыматтарды жаздыргандан кийин тынч оңдоо же жок кылуу мүмкүн эмес.
Organizations — уюмдар курдаштарды камтыйт, б.а. blockchain уюмдардын колдоосу менен бар. Ар кандай уюмдар бир эле каналдын бир бөлүгү болушу мүмкүн.
канал — курбуларды топторго бириктирген логикалык структура, б.а. блокчейн көрсөтүлгөн. Hyperledger Fabric бир эле учурда ар кандай бизнес логикасы менен бир нече блокчейндерди иштете алат.
Мүчөлүк кызматтарын камсыздоочу (MSP) инсандыкты берүү жана ролдорду ыйгаруу үчүн CA (Сертификат органы) болуп саналат. Түйүн түзүү үчүн MSP менен иштешүү керек.
Тең түйүндөр — транзакцияларды текшерүү, блокчейнди сактоо, акылдуу келишимдерди аткаруу жана тиркемелер менен иштешүү. Теңдештер MSP тарабынан берилген инсандык (санариптик сертификат) бар. Бардык түйүндөр бирдей укукка ээ болгон Bitcoin же Etherium тармагынан айырмаланып, Hyperledger Fabric түйүндөрүндө ар кандай роль ойнойт:
Мүмкүн теңтуш колдогон теңтуш (EP) жана акылдуу келишимдерди аткарыңыз.
Колдоочу (CP) - блокчейндеги маалыматтарды гана сактап, "Дүйнөлүк абалды" жаңыртыңыз.
Anchor Peer (AP) - эгерде блокчейнге бир нече уюмдар катышса, анда алардын ортосундагы байланыш үчүн анкердик кесиптештер колдонулат. Ар бир уюм бир же бир нече казык курбулары болушу керек. AP колдонуу менен, уюмдагы каалаган тең башка уюмдардагы бардык теңтуштар жөнүндө маалымат ала алат. AP ортосунда маалыматты синхрондоштуруу үчүн колдонулат ушак протоколу.
Лидер теңтуш — эгерде уюмдун бир нече теңтуштары болсо, анда теңтуштун лидери гана Заказ берүү кызматынан блокторду алып, калган курбуларына берет. Лидер статикалык түрдө көрсөтүлүшү мүмкүн же уюмдагы теңтуштар тарабынан динамикалык түрдө тандалышы мүмкүн. Ушак протоколу лидерлер тууралуу маалыматты синхрондоштуруу үчүн да колдонулат.
каражаттар — баалуулугу бар жана блокчейнде сакталган объекттер. Тагыраак айтканда, бул JSON форматындагы ачкыч-маани маалыматтары. Бул Блокчейнге жазылган маалыматтар. Алардын тарыхы бар, ал блокчейнде сакталат жана "Дүйнөлүк мамлекет" маалымат базасында сакталган учурдагы абал. Маалымат структуралары бизнес милдеттерине жараша ээнбаштык менен толтурулат. Милдеттүү талаалар жок, бир гана сунуш - активдердин ээси жана баалуу болушу керек.
китеп — активдердин учурдагы абалын сактаган Blockchain жана Word мамлекеттик маалымат базасынан турат. Дүйнөлүк мамлекет LevelDB же CouchDB колдонот.
Акылдуу келишим — акылдуу контракттарды колдонуу менен системанын бизнес логикасы ишке ашырылат. Hyperledger Fabric'те акылдуу келишимдер чынжыр код деп аталат. Chaincode колдонуп, активдер жана алар боюнча бүтүмдөр көрсөтүлөт. Техникалык жактан айтканда, акылдуу келишимдер JS же Go программалоо тилдеринде ишке ашырылган программалык модулдар.
Колдоо саясаты — ар бир чынжыр код үчүн транзакция үчүн канча ырастоону жана кимден күтүү керектиги боюнча саясатты орното аласыз. Эгер саясат коюлбаса, демейки: "транзакцияны каналдагы каалаган уюмдун мүчөсү ырасташы керек." Саясаттардын мисалдары:
бүтүм уюмдун каалаган администратору тарабынан бекитилиши керек;
Уюмдун каалаган мүчөсү же кардары тарабынан ырасталууга тийиш;
Кандайдыр бир кесиптеш уюм тарабынан ырасталууга тийиш.
Заказ берүү кызматы — транзакцияларды блокторго топтоп, аларды каналдагы теңтуштарга жөнөтөт. Тармактагы бардык курбуларына билдирүүлөрдү жеткирүүгө кепилдик берет. өнөр жай системалары үчүн колдонулат Кафка билдирүү брокери, иштеп чыгуу жана сыноо үчүн Solo.
CallFlow
Колдонмо Hyperledger Fabric менен Go, Node.js же Java SDK аркылуу байланышат;
кардар tx транзакциясын түзүп, аны индоссациялоочу курдаштарга жөнөтөт;
Peer кардардын кол тамгасын текшерет, транзакцияны аяктайт жана индоссамент кол тамгасын кайра кардарга жөнөтөт. Chaincode индоссант боюнча гана аткарылат жана анын аткарылышынын натыйжасы бардык теңдештерге жөнөтүлөт. Иштин бул алгоритми PBFT (Практикалык Византиялык катачылыкка чыдамдуу) консенсус деп аталат. дан айырмаланат классикалык BFT билдирүү жөнөтүлгөн жана ырастоо бардык катышуучулардан эмес, белгилүү бир топтомдон гана күтүлгөнү;
Кардар индоссамент саясатына ылайык келген жооптордун санын алгандан кийин, ал транзакцияны Заказ берүү кызматына жөнөтөт;
Буйрутма кызматы блокту жаратат жана аны бардык жоопкерчиликтүү кесиптештерине жөнөтөт. Буйрутма берүү кызматы блоктордун ырааттуу жазылышын камсыздайт, бул бухгалтердик айры деп аталган нерсени жок кылат ("Айрылар" бөлүмүн караңыз);
Теңдештер блокту алышат, индоссамент саясатын кайра текшерип, блокту блокчейнге жазып, "Дүйнөлүк абал" МБдагы абалын өзгөртүшөт.
Ошол. Бул түйүндөрдүн ортосундагы ролдордун бөлүнүшүнө алып келет. Бул блокчейндин масштабдуу жана коопсуз болушун камсыздайт:
Акылдуу келишимдер (чынжыр коду) теңтуштарды жактырышат. Бул акылдуу келишимдердин купуялуулугун камсыз кылат, анткени ал бардык катышуучулар тарабынан сакталган эмес, бирок бир гана индоссанттар тарабынан.
Заказ тез иштеши керек. Бул Ordering блокту гана түзүп, аны лидерлердин белгиленген топтомуна жөнөтүшү менен камсыз кылынат.
Милдеттүү курбулар блокчейнди гана сакташат - алардын көбү болушу мүмкүн жана алар көп күчтү жана тез иштөөнү талап кылбайт.
Ошентип, Hyperledger Fabric - бул чыныгы универсалдуу система, анын жардамы менен сиз:
акылдуу келишим механизмин колдонуу менен ээнбаш бизнес логикасын ишке ашыруу;
JSON форматында блокчейн базасынан маалыматтарды жазыңыз жана алыңыз;
Сертификат органы аркылуу API мүмкүнчүлүгүн бериңиз жана ырастаңыз.
Эми биз Hyperledger Fabricтин өзгөчөлүктөрү жөнүндө бир аз түшүнгөнүбүздөн кийин, акырында пайдалуу бир нерсе кылалы!
Блокчейнди жайылтуу
Тапшырманын коюлушу
Милдет Citcoin тармагын төмөнкү функциялар менен ишке ашыруу болуп саналат: эсеп түзүү, балансты алуу, эсепти толуктоо, бир эсептен экинчисине тыйындарды которуу. Келгиле, объектинин моделин тарталы, аны биз андан ары акылдуу келишимде ишке ашырабыз. Ошентип, бизде аттары менен аныкталган жана балансты жана эсептердин тизмесин камтыган эсептер болот. Эсептер жана эсептердин тизмеси, Hyperledger Fabric активдери боюнча. Ошого жараша алардын тарыхы жана азыркы абалы бар. Мен муну так тартууга аракет кылам:
Жогорку көрсөткүчтөр "Дүйнөлүк мамлекет" маалымат базасында сакталган учурдагы абал. Алардын астында блокчейнде сакталган тарыхты көрсөткөн сандар бар. Активдердин учурдагы абалы транзакциялар менен өзгөртүлөт. Актив бүтүндөй гана өзгөрөт, андыктан транзакциянын натыйжасында жаңы объект түзүлүп, активдин учурдагы наркы тарыхка кирет.
IBM Cloud
Биз каттоо эсебин түзөбүз IBM булуту. Блокчейн платформасын колдонуу үчүн аны төлөгөнгө чейин жаңыртуу керек. Бул процесс тез болбошу мүмкүн, анткени... IBM кошумча маалыматты сурайт жана аны кол менен текшерет. Позитивдүү түрдө, мен IBMде Hyperledger Fabricти булутуна жайгаштырууга мүмкүндүк берген жакшы окуу материалдары бар деп айта алам. Мага төмөнкү макалалар жана мисалдар абдан жакты:
Төмөндө IBM Blockchain платформасынын скриншоттору. Бул блокчейнди кантип түзүү боюнча көрсөтмө эмес, жөн гана тапшырманын көлөмүн көрсөтүү. Ошентип, биздин максаттар үчүн биз бир уюмду түзөбүз:
Биз анда түйүндөр түзөбүз: Orderer CA, Org1 CA, Orderer Peer:
Биз колдонуучуларды түзөбүз:
Канал түзүп, аны citcoin деп атаңыз:
Негизи Канал бул блокчейн, ошондуктан ал блок нөлдөн башталат (Башталыш блогу):
Акылдуу келишим жазуу
/*
* 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;
Интуитивдик түрдө, бул жерде баары ачык-айкын болушу керек:
Демо программасы Hyperledger Fabric API аркылуу чакыра турган бир нече функциялар (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance) бар.
SendFrom жана RefillBalance функциялары демо программасы ала турган Окуяларды жаратат.
Instantiate функциясы акылдуу келишим түзүлгөндө бир жолу чакырылат. Чынында, ал бир эле жолу эмес, акылдуу келишим версиясы өзгөргөн сайын аталат. Ошондуктан, бош массив менен тизмени инициализациялоо жаман идея, анткени Эми, биз акылдуу келишимдин версиясын өзгөрткөндө, биз учурдагы тизмени жоготобуз. Бирок баары жакшы, мен жаңы эле үйрөнүп жатам).
Каттоо эсептери жана эсептердин тизмеси JSON маалымат структуралары. JS маалыматтарды манипуляциялоо үчүн колдонулат.
Активдин учурдагы маанисин getState функциясынын чакырыгы аркылуу ала аласыз жана аны putState аркылуу жаңырта аласыз.
Каттоо эсебин түзүүдө AddAccount функциясы чакырылат, мында блокчейндеги эсептердин максималдуу санына салыштыруу жүргүзүлөт (maxAccounts = 5). Жана бул жерде бир жамбы бар (сиз байкадыңызбы?), бул эсептердин санынын чексиз көбөйүшүнө алып келет. Мындай каталарды болтурбоо керек)
Андан кийин, биз Каналга акылдуу келишимди жүктөйбүз жана аны түзөбүз:
Smart Contract орнотуу транзакциясын карап көрөлү:
Каналыбыз тууралуу толук маалыматты карап көрөлү:
Натыйжада, биз IBM булутундагы блокчейн тармагынын төмөнкү диаграммасын алабыз. Диаграмма ошондой эле виртуалдык серверде Amazon булутунда иштеген демо программасын көрсөтөт (бул тууралуу кийинки бөлүмдө):
Hyperledger Fabric API чалуулары үчүн GUI түзүү
Hyperledger Fabric төмөнкү үчүн колдонула турган API'ге ээ:
Канал түзүү;
Каналга туташуулар;
Каналда акылдуу келишимдерди орнотуу жана инстанциялоо;
Чалуу транзакциялары;
Блокчейн боюнча маалымат сураңыз.
Колдонмо иштеп чыгуу
Биздин демо программада биз API'ди транзакцияларды чакыруу жана маалыматты талап кылуу үчүн гана колдонобуз, анткени Биз калган кадамдарды IBM blockchain платформасын колдонуп бүттүк. Биз стандарттык технология стекинин жардамы менен GUI жазабыз: Express.js + Vue.js + Node.js. Заманбап веб тиркемелерди түзүүнү кантип баштоо керектиги жөнүндө өзүнчө макала жаза аласыз. Бул жерде мен эң жактырган лекциялар сериясына шилтеме калтырам: Vue.js & Express.js аркылуу Full Stack Web App. Натыйжада Google'дун Материалдык Дизайн стилиндеги тааныш графикалык интерфейси бар кардар-сервер колдонмосу. Кардар менен сервердин ортосундагы REST API бир нече чалуулардан турат:
HyperledgerDemo/v1/info?account=Bob — Боб аккаунту жөнүндө маалымат алуу;
HyperledgerDemo/v1/transaction?from=Bob&to=Alice&volume=2 - Бобдон Алисага эки тыйын которуу;
HyperledgerDemo/v1/disconnect - блокчейн менен байланышты жабуу.
камтылган мисалдар менен API сүрөттөлүшү Почтачы сайты - HTTP API сыноо үчүн белгилүү программа.
Amazon булутундагы демо колдонмо
Мен тиркемени Amazonга жүктөдүм, анткени... IBM дагы эле менин каттоо эсебимди жаңыртып, виртуалдык серверлерди түзүүгө уруксат бере алган жок. Доменге алчаны кантип кошуу керек: www.citcoin.info. Мен серверди бир азга иштетем, анан өчүрөм, анткени... ижарага цент тамчылап жатат, ал эми циткоин монеталары биржада али сатыла элек) Иштин логикасы түшүнүктүү болушу үчүн мен макалага демонстрациянын скриншотторун кошуп жатам. Демо колдонмо болот:
Блокчейнди инициализациялоо;
Каттоо эсебин түзүү (бирок азыр сиз жаңы Аккаунт түзө албайсыз, анткени блокчейнде акылдуу келишимде көрсөтүлгөн эсептердин максималдуу санына жетти);
Эсептердин тизмесин алуу;
Элис, Боб жана Алекстин ортосунда citcoin тыйындарын которуу;
Окуяларды кабыл алуу (бирок азыр окуяларды көрсөтүүнүн жолу жок, ошондуктан жөнөкөйлүк үчүн интерфейсте окуялар колдоого алынбайт деп айтылат);
Аракеттер журналы.
Алгач биз блокчейнди инициализациялайбыз:
Андан кийин, биз эсебибизди түзөбүз, баланс менен убакытты текке кетирбеңиз:
Биз бардык жеткиликтүү эсептердин тизмесин алабыз:
Биз жөнөтүүчүнү жана алуучуну тандап, алардын балансын алабыз. Эгерде жөнөтүүчү менен алуучу бирдей болсо, анда анын эсеби толукталат:
Журналда биз транзакциялардын аткарылышын көзөмөлдөйбүз:
Чынында, мунун баары демо программасы менен. Төмөндө сиз биздин блокчейндеги транзакциябызды көрө аласыз:
Ал эми бүтүмдөрдүн жалпы тизмеси:
Муну менен биз Citcoin тармагын түзүү үчүн PoC ишке ашырууну ийгиликтүү аяктадык. Citcoin монеталарды которуунун толук кандуу тармагына айлануусу үчүн дагы эмне кылуу керек? Абдан аз:
Эсеп түзүү стадиясында жеке/ачык ачкычтын генерациясын ишке ашырыңыз. Купуя ачкыч аккаунттун колдонуучусунда сакталышы керек, ачык ачкыч блокчейнде сакталышы керек.
Колдонуучуну идентификациялоо үчүн аты эмес, ачык ачкыч колдонулган монета которууну жасаңыз.
Колдонуучудан серверге өтүүчү транзакцияларды анын купуя ачкычы менен шифрлаңыз.
жыйынтыктоо
Биз Citcoin тармагын төмөнкү функциялар менен ишке ашырдык: эсеп кошуу, балансты алуу, эсебиңизди толуктоо, бир эсептен экинчисине тыйындарды которуу. Ошентип, PoC куруу бизге эмнеге кетти?
Сиз жалпысынан blockchain жана өзгөчө Hyperledger Fabric изилдөө керек;
IBM же Amazon булуттарын колдонууну үйрөнүңүз;
JS программалоо тилин жана кээ бир веб алкактарын үйрөнүңүз;
Эгер кээ бир маалыматтар блокчейнде эмес, өзүнчө маалымат базасында сакталышы керек болсо, анда, мисалы, PostgreSQL менен интеграциялоону үйрөнүңүз;
Акыркысы, бирок эң аз дегенде - Linux билимсиз заманбап дүйнөдө жашай албайсыз!)
Албетте, бул ракета илими эмес, бирок сиз көп иштешиңиз керек!
GitHubдагы булактар
Булактарды коюшту GitHub. Репозиторийдин кыскача баяндамасы:
Каталог «Server» — Node.js сервери
Каталог «керектөөчү» — Node.js кардары
Каталог «blockchain"(параметр маанилери жана ачкычтар, албетте, иштебейт жана мисал катары гана берилген):
келишим — акылдуу келишимдин баштапкы коду
капчык — Hyperledger Fabric API колдонуу үчүн колдонуучу ачкычтары.
*.cds - акылдуу келишимдердин түзүлгөн версиялары
*.json файлдары - Hyperledger Fabric API колдонуу үчүн конфигурация файлдарынын мисалдары