Blockchain: menene PoC ya kamata mu gina?

Глаза боятся, а руки чешутся!

В прошлых статьях мы разобрались с технологиями, на которых строятся блокчейны (Me ya kamata mu gina blockchain?) и кейсами, которые можно с их помощью реализовать (Что нам стоит кейс построить?). Lokaci ya yi da za a yi aiki da hannuwanku! Don aiwatar da matukan jirgi da PoC (Hujjar Ra'ayi), Na fi son yin amfani da gajimare, saboda ... ana iya samun su daga ko'ina cikin duniya kuma, sau da yawa, ba a buƙatar ɓata lokaci a kan shigar da muhalli mai wahala, saboda Akwai saitunan saiti. Don haka, bari mu yi wani abu mai sauƙi, alal misali, hanyar sadarwa don canja wurin tsabar kudi tsakanin mahalarta kuma bari mu kira shi Bitcoin cikin ladabi. Don wannan za mu yi amfani da gajimare na IBM da na duniya blockchain Hyperledger Fabric. Da farko, bari mu gano dalilin da yasa ake kira Hyperledger Fabric blockchain na duniya?

Blockchain: menene PoC ya kamata mu gina?

Hyperledger Fabric - blockchain na duniya

Gabaɗaya magana, tsarin bayanan duniya shine:

  • Набор серверов и программное ядро, выполняющее бизнес логику;
  • Hanyoyin sadarwa don hulɗa tare da tsarin;
  • Kayan aiki don rajista, tantancewa da izini na na'urori/mutane;
  • Adana bayanan aiki da bayanan adana bayanai:

Blockchain: menene PoC ya kamata mu gina?

Официальную версию, что такое Hyperledger Fabric можно почитать на shafin, а если коротко, то Hyperledger Fabric — это opensource платформа, позволяющая строить закрытые блокчейны и выполнять произвольные смарт-контракты, написанные на языках программирования JS и Go. Посмотрим детально на архитектуру Hyperledger Fabric и убедимcя, что это универсальная система, в которой только есть специфика по хранению и записи данных. Специфика заключается в том, что данные, как и во всех блокчейнах, хранятся в блоках, которые помещаются в блокчейн только, если участники пришли к консенсусу и после записи данные невозможно незаметно исправить или удалить.

Архитектура Hyperledger Fabric

На схеме представлена архитектура Hyperledger Fabric:

Blockchain: menene PoC ya kamata mu gina?

Organizations — организации содержат peer-ы, т.о. блокчейн существует за счет поддержки организациями. Разные организации могут входить в один channel.

Channel — логическая структура, объединяющая peer-ы в группы, т.о. задается блокчейн. Hyperledger Fabric может одновременно обрабатывать несколько блокчейнов с разной бизнес логикой.

Membership Services Provider (MSP) CA ne (Hukumar Takaddun shaida) don ba da ainihi da ba da ayyuka. Don ƙirƙirar kumburi, kuna buƙatar yin hulɗa tare da MSP.

Peer nodes — проверяют транзакции, хранят блокчейн, выполняют смарт-контракты и взаимодействуют с приложениями. У peer-ов есть identity (цифровой сертификат), который выдает MSP. В отличии от сети Bitcoin или Etherium, где все ноды равноправны, в Hyperledger Fabric ноды играют разные роли:

  • Peer может быть endorsing peer (EP) da aiwatar da kwangiloli masu wayo.
  • Committing peer (CP) — только сохраняют данные в блокчейне и актуализируют «World state».
  • Anchor Peer (AP) - idan kungiyoyi da yawa sun shiga cikin blockchain, to ana amfani da takwarorinsu na anga don sadarwa a tsakanin su. Dole ne kowace ƙungiya ta sami takwarorinsu ɗaya ko fiye. Yin amfani da AP, kowane ɗan'uwa a cikin ƙungiya zai iya samun bayanai game da duk takwarorinsu a wasu ƙungiyoyi. Ana amfani da su don daidaita bayanai tsakanin APs ka'idar tsegumi.
  • Leader Peer — если организация имеет несколько peer-ов, то только лидер peer будет получать блоки из Ordering service и отдавать их остальным peer-ам. Лидер может как задаваться статически, так и выбираться динамически peer-ами в организации. Для синхронизации информации о лидерах также используется gossip протокол.

Kadarorin — сущности, имеющие ценность, которые хранятся в блокчейне. Более конкретно — это key-value данные в формате JSON. Именно эти данные и записываются в блокчейн «Blockchain». У них есть история, которая хранится в блокчейне и текущее состояние, которое хранится в базе данных «World state». Структуры данных наполняются произвольно в зависимости от бизнес задач. Нет никаких обязательных полей, единственная рекомендация — asset-ы должны иметь владельца и представлять ценность.

Ledger — состоит из блокчейна «Blockchain» и базы данных «Word state», в которой хранится текущее состояние asset-ов. World state использует LevelDB или CouchDB.

Smart kwangila — с помощью смарт-контрактов реализуется бизнес логика системы. В Hyperledger Fabric смарт-контракты называются chaincode. С помощью chaincode задаются asset-ы и транзакции над ними. Если говорить техническим языком, то смарт-контракты — это программные модули, реализованные на языках программирования JS или Go.

Manufar amincewa — для каждого chaincode можно задать политики сколько и от кого необходимо ожидать подтверждений для транзакции. Если политика не задана, то по умолчанию используется: “транзакцию должен подтвердить любой член (member) любой организации в channel”. Примеры политик:

  • Транзакцию должен подтвердить любой администратор организации;
  • Dole ne kowane memba ko abokin ciniki na ƙungiyar ya tabbatar da shi;
  • Dole ne kowace ƙungiyar takwaro ta tabbatar da ita.

Sabis na oda — упаковывает транзакции в блоки и отправляет peer-ам в channel. Гарантирует доставку сообщений всем peer-ам в сети. Для промышленных систем используется Dillalin sakon Kafka, don haɓakawa da gwaji solo.

CallFlow

Blockchain: menene PoC ya kamata mu gina?

  • Приложение взаимодействует с Hyperledger Fabric, используя Go, Node.js или Java SDK;
  • Abokin ciniki ya ƙirƙira ma'amalar tx kuma ya aika da shi zuwa ga abokan hulɗa;
  • Peer yana tabbatar da sa hannun abokin ciniki, ya kammala ciniki, kuma ya aika sa hannun amincewa baya ga abokin ciniki. Ana aiwatar da Chaincode ne kawai akan takwarorinsu masu amincewa, kuma ana aika sakamakon aiwatar da shi ga duk takwarorinsu. Ana kiran wannan algorithm na aikin PBFT (Practical Byzantine Fault Tolerant) yarjejeniya. Ya bambanta da классического BFT тем, что сообщение рассылается и ожидается подтверждение не от всех участников, а только от определенного набора;
  • После того как клиент получил число ответов, соответствующее endorsement policy, он посылает транзакцию на Ordering service;
  • Sabis ɗin oda yana haifar da toshe kuma yana aika shi zuwa ga duk abokan aiki. Sabis na yin oda yana tabbatar da rikodin jerin abubuwan tubalan, wanda ke kawar da abin da ake kira cokali mai yatsa (duba sashin "Forks");
  • Takwarorinsu suna karɓar toshe, sake duba manufofin amincewa, rubuta toshe zuwa blockchain kuma canza jihar a cikin “Duniya jihar” DB.

Т.е. получается разделение ролей между нодами. Это обеспечивает масштабировать и безопасность блокчейна:

  • Kwangiloli masu wayo (chaincode) suna aiwatar da ƙwararrun takwarorinsu. Wannan yana tabbatar da sirrin kwangilar wayo, saboda Ba duk mahalarta ba su adana shi, amma ta hanyar amincewa da takwarorinsu kawai.
  • Yin oda yakamata yayi aiki da sauri. Ana tabbatar da wannan ta gaskiyar cewa Yin oda kawai yana samar da toshe kuma yana aika shi zuwa ƙayyadadden tsarin takwarorinsa na jagora.
  • Committing peers только хранят блокчейн — их может быть много и они не требуют большой мощности и мгновенной работы.

Подробнее архитектурные решения Hyperledger Fabric и почему он работает так, а не иначе можно посмотреть тут: Asalin Architecture ko a nan: Hyperledger Fabric: A Distributed Operating System for Permissioned Blockchains.

Итак, Hyperledger Fabric — это действительно универсальная система, с помощью которой можно:

  • Реализовывать произвольную бизнес-логику, используя механизм смарт-контрактов;
  • Yi rikodin kuma karɓar bayanai daga bayanan blockchain a cikin tsarin JSON;
  • Bada kuma tabbatar da samun damar API ta amfani da Ikon Takaddun shaida.

Теперь, когда мы немного разобрались со спецификой Hyperledger Fabric, давайте наконец сделаем что-нибудь полезное!

Разворачиваем блокчейн

Tsara matsalar

Ayyukan shine aiwatar da hanyar sadarwar Citcoin tare da ayyuka masu zuwa: ƙirƙira asusu, samun ma'auni, cika asusun ku, canja wurin tsabar kudi daga asusun ɗaya zuwa wani. Bari mu zana samfurin abu, wanda za mu ƙara aiwatar da shi a cikin kwangilar basira. Don haka, za mu sami asusun da aka gano da sunaye kuma suna ɗauke da ma'auni, da jerin asusun. Asusu da jerin asusu sune, dangane da kadarorin Fabric na Hyperledger. Saboda haka, suna da tarihi da halin yanzu. Zan yi ƙoƙarin zana wannan a fili:

Blockchain: menene PoC ya kamata mu gina?

Верхние фигуры — это текущее состояние, которое хранится в базе «World state». Под ними фигуры, показывающие историю, которая хранится в блокчейне. Текущее состояние asset-ов изменяется транзакциями. Asset изменяется только целиком, поэтому в результате выполнения транзакции создается новый объект, а текущее значение asset-а уходит в историю.

Облако IBM

Заводим учетную запись в IBM girgije. Don amfani da dandalin blockchain, dole ne a haɓaka shi zuwa Pay-As-You-Go. Wannan tsari bazai yi sauri ba, saboda ... IBM yana buƙatar ƙarin bayani kuma yana tabbatar da shi da hannu. A tabbataccen bayanin kula, zan iya cewa IBM yana da kyawawan kayan horarwa waɗanda ke ba ku damar tura Fabric Hyperledger a cikin girgijen su. Ina son jerin labarai da misalai masu zuwa:

Далее приведены скриншоты Blockchain платформы IBM. Это не инструкция по созданию блокчейна, а просто демонстрация объема задачи. Итак, для наших целей делаем одну Organization:

Blockchain: menene PoC ya kamata mu gina?

Mun ƙirƙiri nodes a cikinsa: Orderer CA, Org1 CA, Abokin Hulɗa:

Blockchain: menene PoC ya kamata mu gina?

Muna ƙirƙirar masu amfani:

Blockchain: menene PoC ya kamata mu gina?

Создаем Channel и называем его citcoin:

Blockchain: menene PoC ya kamata mu gina?

Ainihin Channel shine blockchain, don haka yana farawa da toshe sifili (Tsarin Farawa):

Blockchain: menene PoC ya kamata mu gina?

Пишем 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;

A hankali, komai ya kamata ya bayyana a nan:

  • Akwai ayyuka da yawa (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance) wanda shirin demo zai kira ta amfani da Hyperledger Fabric API.
  • Ayyukan SendFrom da RefillBalance suna haifar da abubuwan da shirin demo zai karɓa.
  • Функция instantiate — вызывается один раз при инстанциировании смарт-контракта. На самом деле, она вызывается не один раз, а каждый раз при изменении версии смарт-контракта. Поэтому инициализация списка пустым массивом — это плохая идея, т.к. теперь при смене версии смарт-контракта мы будем терять текущий список. Но ничего, я же только учусь).
  • Account-ы и список account-ов (accounts) — это JSON структуры данных. Для манипуляций с данными используется JS.
  • Получить текущее значение asset-а можно с помощью вызова функции getState, а обновить с помощью putState.
  • При создании Account вызывается функция AddAccount, в которой производится сравнение на максимальное число account-в в блокчейне (maxAccounts = 5). И тут есть косяк (заметили?), который приводит к бесконечному росту числа account-ов. Таких ошибок надо избегать)

Далее загружаем смарт-контракт в Channel и инстанциируем его:

Blockchain: menene PoC ya kamata mu gina?

Смотрим транзакцию на установку Smart Contract:

Blockchain: menene PoC ya kamata mu gina?

Ga cikakken bayani akan Channel namu:

Blockchain: menene PoC ya kamata mu gina?

Sakamakon haka, muna samun zane mai zuwa na cibiyar sadarwar blockchain a cikin girgijen IBM. Hakanan zane yana nuna shirin demo yana gudana a cikin girgijen Amazon akan sabar kama-da-wane (ƙari game da shi a sashe na gaba):

Blockchain: menene PoC ya kamata mu gina?

Ƙirƙirar GUI don kiran Hyperledger Fabric API

У Hyperledger Fabric есть API, которое может использоваться для:

  • Создания channel;
  • Haɗin haɗin kai ga tashar;
  • Установка и инстанциирование смарт-конкрактов в channel;
  • Вызов транзакций;
  • Запрос информации в блокчейне.

Ci gaban aikace-aikacen

A cikin shirin demo za mu yi amfani da API kawai don kiran ma'amaloli da neman bayanai, saboda Mun riga mun kammala sauran matakan ta amfani da dandalin IBM blockchain. Muna rubuta GUI ta amfani da daidaitaccen tarin fasaha: Express.js + Vue.js + Node.js. Kuna iya rubuta labarin daban kan yadda ake fara ƙirƙirar aikace-aikacen gidan yanar gizo na zamani. Anan zan bar hanyar haɗi zuwa jerin laccoci waɗanda na fi so: Cikakken Tarin Yanar Gizo App ta amfani da Vue.js & Express.js. Sakamakon shine aikace-aikacen uwar garken abokin ciniki tare da sanannen ƙirar hoto a cikin Salon Zane na Google. API ɗin REST tsakanin abokin ciniki da uwar garken ya ƙunshi kira da yawa:

  • HyperledgerDemo/v1/init — инициализировать блокчейн;
  • HyperledgerDemo/v1/asusu/jeri - sami jerin duk asusun;
  • HyperledgerDemo/v1/account?name=Bob&balance=100 — создать Bob account;
  • HyperledgerDemo/v1/info?account=Bob — sami bayanai game da asusun Bob;
  • HyperledgerDemo/v1/transaction?from=Bob&to=Alice&volume=2 — перевести две монеты от Bob к Alice;
  • HyperledgerDemo/v1/disconnect - rufe haɗin zuwa blockchain.

Bayanin API tare da misalan da aka haɗa a ciki Gidan gidan yanar gizo - sanannen shiri don gwada HTTP API.

Aikace-aikacen Demo a cikin girgijen Amazon

Na loda aikace-aikacen zuwa Amazon saboda ... IBM har yanzu bai sami damar haɓaka asusuna ba kuma ya ba ni damar ƙirƙirar sabar mai kama-da-wane. Yadda ake ƙara ceri zuwa yankin: www.citcoin.info. Поддержу немного сервер включенным, потом выключу, т.к. центы за аренду капают, а монеты citcoin на бирже еще не котируются) В статью помещаю скриншоты демо, чтобы была понятна логика работы. Демо приложение может:

  • Fara blockchain;
  • Ƙirƙiri Asusun (amma yanzu ba za ku iya ƙirƙirar sabon Asusu ba, saboda an kai matsakaicin adadin asusun da aka ƙayyade a cikin kwangilar wayo a cikin blockchain);
  • Karɓi lissafin Lissafi;
  • Переводить монеты citcoin между Alice, Bob и Alex;
  • Получать события (но сейчас события никак не показать, поэтому в интерфейсе для простоты написано, что события не поддерживаются);
  • Логировать действия.

Da farko mun fara blockchain:

Blockchain: menene PoC ya kamata mu gina?

Далее заводим свой account, не мелочимся с балансом:

Blockchain: menene PoC ya kamata mu gina?

Получаем список всех доступных account-ов:

Blockchain: menene PoC ya kamata mu gina?

Muna zaɓar mai aikawa da mai karɓa, kuma muna samun ma'auni. Idan mai aikawa da mai karɓa ɗaya ne, to za a cika asusunsa:

Blockchain: menene PoC ya kamata mu gina?

В логе следим за выполнением транзакций:

Blockchain: menene PoC ya kamata mu gina?

A gaskiya, wannan ke nan tare da shirin demo. A ƙasa zaku iya ganin kasuwancin mu a cikin blockchain:

Blockchain: menene PoC ya kamata mu gina?

И общий список транзакций:

Blockchain: menene PoC ya kamata mu gina?

Tare da wannan, mun sami nasarar kammala aiwatar da PoC don ƙirƙirar cibiyar sadarwar Citcoin. Menene kuma ya kamata a yi don Citcoin ya zama cikakkiyar hanyar sadarwa don canja wurin tsabar kudi? Kadan sosai:

  • A matakin ƙirƙirar asusun, aiwatar da ƙirƙirar maɓalli na sirri / jama'a. Dole ne a adana maɓalli na sirri tare da mai amfani da asusun, maɓallin jama'a dole ne a adana shi a cikin blockchain.
  • Yi hanyar canja wurin tsabar kudin da ake amfani da maɓallin jama'a, maimakon suna, don gano mai amfani.
  • Rufe ma'amalar da ke gudana daga mai amfani zuwa uwar garken tare da maɓallin keɓaɓɓen sa.

ƙarshe

Мы реализовали сеть Citcoin с функциями: добавить account, получить баланс, пополнить свой счет, перевести монеты с одного счета на другой. Итак, что нам стоило PoC построить?

  • Kuna buƙatar yin nazarin blockchain gabaɗaya da Hyperledger Fabric musamman;
  • Научиться пользоваться облаками IBM или Amazon;
  • Koyi harshen shirye-shirye na JS da wasu tsarin yanar gizo;
  • Если какие-то данные нужно хранить не в блокчейне, а в отдельной базе, то научиться интегрироваться, например, с PostgreSQL;
  • Kuma ƙarshe amma ba kalla ba - ba za ku iya rayuwa a duniyar zamani ba tare da sanin Linux ba!)

Tabbas, ba kimiyyar roka ba ce, amma dole ne ku yi aiki tuƙuru!

Sources akan GitHub

Sources saka GitHub. Takaitaccen bayanin ma'ajiyar:
Katalogi"uwar garken» - uwar garken Node.js
Katalogi"abokin ciniki» - Node.js abokin ciniki
Katalogi"blockchain"(Dabi'u da maɓallai, ba shakka, ba sa aiki kuma ana ba su kawai a matsayin misali):

  • contract — исходник смарт-контракта
  • wallet — ключи юзера для использования Hyperledger Fabric API.
  • *.cds - harhada nau'ikan kwangiloli masu wayo
  • *.json файлы — примеры файлов конфигурации для использования Hyperledger Fabric API

Mafari ne kawai!

source: www.habr.com

Add a comment