ืืขืื ืืื ืฉืื ืืคืืืืช ืืืืืืื ืฉืื ืืืจืืืช!
ืืืืืจืื ืงืืืืื ืขืกืงื ื ืืืื ืืืืืืืช ืฉืขืืืื ืื ืืืื ืืืืงืฆ'ืืื (
Hyperledger Fabric - ืืืืงืฆ'ืืื ืืื ืืืจืกืื
ืืืืคื ืืืื, ืืขืจืืช ืืืืข ืืื ืืืจืกืืืช ืืื:
- ืงืืืฆื ืฉื ืฉืจืชืื ืืืืื ืชืืื ื ืืืืฆืขืช ืืืืืงื ืขืกืงืืช;
- ืืืฉืงืื ืืืื ืืจืืงืฆืื ืขื ืืืขืจืืช;
- ืืืื ืืจืืฉืื, ืืืืืช ืืืจืฉืื ืฉื ืืืฉืืจืื/ืื ืฉืื;
- ืืกื ื ืชืื ืื ืืืืืกื ื ืชืื ืื ืชืคืขืืืืื ืืืจืืืื ืืื:
ื ืืชื ืืงืจืื ืืช ืืืจืกื ืืจืฉืืืช ืฉื ืื ืื Hyperledger Fabric ื
Hyperledger Fabric Architecture
ืืชืจืฉืื ืืฆืื ืืช ืืจืืืืงืืืจืช ื-Hyperledger Fabric:
ืืจืืื ืื - ืืจืืื ืื ืืืืืื ืขืืืชืื, ืืืืืจ. blockchain ืงืืื ืขืงื ืชืืืื ืฉื ืืจืืื ืื. ืืจืืื ืื ืฉืื ืื ืืืืืื ืืืืืช ืืืง ืืืืชื ืขืจืืฅ.
ืขืจืืฅ - ืืื ื ืืืื ืืืืื ืขืืืชืื ืืงืืืฆืืช, ืืืืืจ. ืืืืืงืฆ'ืืื ืืฆืืื. Hyperledger Fabric ืืืื ืืขืื ืื ืืื ืืช ืืกืคืจ ืืืืงืฆ'ืืื ืขื ืืืืืื ืขืกืงื ืฉืื ื.
ืกืคืง ืฉืืจืืชื ืืืจืืช (MSP) ืืื CA (ืจืฉืืช ืืืฉืืจืื) ืืื ืคืงืช ืืืืช ืืืงืฆืืช ืชืคืงืืืื. ืืื ืืืฆืืจ ืฆืืืช, ืขืืื ืืืฆืืจ ืืื ืืจืืงืฆืื ืขื ื-MSP.
ืฆืืชืื ืขืืืชืื - ืืืืืช ืขืกืงืืืช, ืืืกื ืืช ืืืืืงืฆ'ืืื, ืืฆืข ืืืืื ืืืืื ืืืื ืืจืืงืฆืื ืขื ืืืฉืืืื. ืืขืืืชืื ืืฉ ืืืืช (ืชืขืืื ืืืืืืืืช), ืืืื ืคืงืช ืขื ืืื ื-MSP. ืื ืืืื ืืจืฉืช ืืืืืงืืื ืื ืืืชืจืืื, ืฉืื ืืื ืืฆืืชืื ืืฉ ืืืืืืช ืฉืืืช, ื-Hyperledger Fabric ืฆืืชืื ืืืืืื ืชืคืงืืืื ืฉืื ืื:
- ืขืืืช ืืืื ืืืืง ืขืืืช (EP) ืืืืฆืข ืืืืื ืืืืื.
- ืขืืืช ืืชืืืื (CP) - ืฉืืืจ ื ืชืื ืื ืจืง ืืืืืงืฆ'ืืื ืืขืืื ืืช "ืืฆื ืืขืืื".
- ืขืืื ืคืืจ (AP) - ืื ืืกืคืจ ืืจืืื ืื ืืฉืชืชืคืื ืืืืืงืฆ'ืืื, ืืื ืืฉืชืืฉืื ื-Anchor ืขืืืชืื ืืชืงืฉืืจืช ืืื ืืื. ืืื ืืจืืื ืืืื ืืืืืช ืขืืืช ืขืืื ืืื ืื ืืืชืจ. ืืืืฆืขืืช AP, ืื ืขืืืช ืืืจืืื ืืืื ืืงืื ืืืืข ืขื ืื ืขืืืชืื ืืืจืืื ืื ืืืจืื. ืืฉืืฉ ืืกื ืืจืื ืืืืข ืืื ื ืงืืืืช ืืืฉื
ืคืจืืืืงืื ืจืืืืืช . - ืื ืืื ืคืืจ - ืื ืืืจืืื ืืฉ ืืื ืขืืืชืื, ืื ืจืง ืื ืืื ืืขืืืช ืืงืื ืืืืงืื ืืฉืืจืืช ืืืืื ื ืืืืกืืจ ืืืชื ืืฉืืจ ืืขืืืชืื. ื ืืชื ืืฆืืื ืืช ืืื ืืื ืืืืคื ืกืืื ืื ืืืืืจ ืืืืคื ืืื ืื ืขื ืืื ืขืืืชืื ืืืจืืื. ืคืจืืืืงืื ืืจืืืืืช ืืฉืืฉ ืื ืืกื ืืจืื ืืืืข ืขื ืื ืืืืื.
ื ืืกืื - ืืฉืืืืช ืฉืืฉ ืืื ืขืจื ืืืืืืกื ืืช ืืืืืงืฆ'ืืื. ืืืชืจ ืืืืง, ืืืืืจ ืื ืชืื ื ืืคืชื-ืขืจื ืืคืืจืื JSON. ืื ืชืื ืื ืืืื ืืชืืขืืื ืืืืืงืฆ'ืืื. ืืฉ ืืื ืืืกืืืจืื, ืืฉืจ ืืืืืกื ืช ืืืืืงืฆ'ืืื, ืืืฆื ื ืืืื, ืืฉืจ ืืืืืกื ืืืกื ืื ืชืื ืื "ืืฆื ืขืืืื". ืืื ื ื ืชืื ืื ืืชืืืืื ืืืืคื ืฉืจืืจืืชื ืืืชืื ืืืฉืืืืช ืืขืกืงืืืช. ืืื ืฉืืืช ืืืื, ืืืืืฆื ืืืืืื ืืื ืฉื ืืกืื ืืืืืื ืืืืืช ืืขืื ืขืจื ืืืขืื ืขืจื.
ืคื ืงืก - ืืืจืื ืืืกืืก ืื ืชืื ืื ืฉื Blockchain ืืืกื ืื ืชืื ืื ืฉื Word, ืืืืืกื ืืช ืืืฆื ืื ืืืื ืฉื ืื ืืกืื. ืืืืื ื ืืขืืืืืช ืืฉืชืืฉืช ื-LevelDB ืื ื-CouchDB.
ืืืื ืืื - ืืืืฆืขืืช ืืืืื ืืืืื, ืืืืืืื ืืขืกืงื ืฉื ืืืขืจืืช ืืืืฉื. ื-Hyperledger Fabric, ืืืืื ืืืืื ื ืงืจืืื chaincode. ืืืืฆืขืืช ืงืื ืฉืจืฉืจืช, ืืฆืืื ืื ื ืืกืื ืืขืกืงืืืช ืืขืืืื. ืืืื ืืื ืืื ืืื, ืืืืื ืืืืื ืื ืืืืืื ืชืืื ื ืืืืืฉืืื ืืฉืคืืช ืืชืื ืืช JS ืื Go.
ืืืื ืืืช ืืืฉืืจืื - ืขืืืจ ืื ืงืื ืฉืจืฉืจืช, ืืชื ืืืื ืืืืืืจ ืืืื ืืืช ืืืื ืืื ืืืฉืืจืื ืืขืกืงื ืืฉ ืืฆืคืืช ืืืื. ืื ืืืืื ืืืช ืื ืืืืืจืช, ืืจืืจืช ืืืืื ืืื: "ืืขืกืงื ืืืืืช ืืืืืช ืืืืฉืจืช ืขื ืืื ืื ืืืจ ืืืจืืื ืืืฉืื ืืขืจืืฅ." ืืืืืืืช ืืคืืืืกืืช:
- ืืขืกืงื ืืืืืช ืืืืืช ืืืืฉืจืช ืขื ืืื ืื ืื ืื ืืืจืืื;
- ืืืื ืืืืืช ืืืืฉืจ ืขื ืืื ืื ืืืจ ืื ืืงืื ืืืจืืื;
- ืืืื ืืืืืช ืืืืฉืจ ืขื ืืื ืื ืืจืืื ืขืืืชืื.
ืฉืืจืืช ืืืื ื - ืืืจื ืขืกืงืืืช ืืืืืงืื ืืฉืืื ืืืชื ืืขืืืชืื ืืขืจืืฅ. ืืืืื ืืฉืืื ืืืืขืืช ืืื ืืขืืืชืื ืืจืฉืช. ืืฉืืฉ ืืืขืจืืืช ืชืขืฉืืืชืืืช
CallFlow
- ืืืืฉืื ืืชืงืฉืจ ืขื Hyperledger Fabric ืืืืฆืขืืช Go, Node.js ืื Java SDK;
- ืืืงืื ืืืฆืจ ืขืกืงืช TX ืืฉืืื ืืืชื ืืขืืืชืื ืชืืืืื;
- ืขืืืช ืืืืช ืืช ืืชืืืช ืืืงืื, ืืฉืืื ืืช ืืขืกืงื ืืฉืืื ืืช ืืชืืืช ืืืืฉืืจ ืืืืจื ืืืงืื. Chaincode ืืืืฆืข ืจืง ืขื ืขืืืช ืืืืฉืจ, ืืืชืืฆืื ืฉื ืืืฆืืขื ื ืฉืืืช ืืื ืืขืืืชืื. ืืืืืจืืชื ืขืืืื ืื ื ืงืจื ืงืื ืฆื ืืืก PBFT (Practical Byzantine Fault Tolerant). ืฉืื ื ื
BFT ืงืืืกื ืืขืืืื ืฉืืืืืขื ื ืฉืืืช ืืืืฉืืจ ืฆืคืื ืื ืืื ืืืฉืชืชืคืื, ืืื ืจืง ืืกื ืืกืืื; - ืืืืจ ืฉืืืงืื ืงืืื ืืช ืืกืคืจ ืืชืืืืืช ืืชืืืืืช ืืช ืืืื ืืืช ืืืืฉืืจืื, ืืื ืฉืืื ืืช ืืขืกืงื ืืฉืืจืืช ืืืืื ื;
- ืฉืืจืืช ืืืืื ื ืืืฆืจ ืืืืง ืืฉืืื ืืืชื ืืื ืืขืืืชืื ืืืชืืืืืื. ืฉืืจืืช ืืืืื ื ืืืืื ืจืืฉืื ืจืฆืืฃ ืฉื ืืืืงืื, ืื ืฉืืืื ืืช ืื ืฉื ืงืจื ืืืื ืืฉืืื ืืช ืืฉืืื ืืช (
ืจืื ืกืขืืฃ "ืืืืืืช" ); - ืขืืืชืื ืืงืืืื ืืกืืื, ืืืืงืื ืฉืื ืืช ืืืื ืืืช ืืืืฉืืจืื, ืืืชืืื ืืช ืืืืืง ืืืืืงืฆ'ืืื ืืืฉื ืื ืืช ืืืฆื ื-DB "ืืฆื ืขืืืื".
ืึธืึตื. ืื ืืืื ืืืืืงืช ืชืคืงืืืื ืืื ืืฆืืชืื. ืื ืืืืื ืฉื-blockchain ื ืืชื ืืืจืืื ืืืืืืื:
- ืืืืื ืืืืื (chaincode) ืืืฆืขืื ืืืฉืืจ ืขืืืชืื. ืื ืืืืื ืืช ืืกืืืืืช ืฉื ืืืืื ืืืืื, ืื ืื ืื ืืืืืกื ืขื ืืื ืื ืืืฉืชืชืคืื, ืืื ืจืง ืขื ืืื ืืืฉืืจ ืขืืืชืื.
- ืืืืื ื ืืืืจื ืืขืืื ืืืืืจืืช. ืื ืืืืื ืขื ืืื ืืขืืืื ืฉืกืืจ ืืืฆืจ ืจืง ืืืืง ืืฉืืื ืืืชื ืืงืืืฆื ืงืืืขื ืฉื ืขืืืชืื ืืืืืืื.
- ืขืืืชืื ืืชืืืืืื ืืืืกื ืื ืจืง ืืช ืืืืืงืฆ'ืืื - ืืืืืื ืืืืืช ืจืืื ืืื ืืื ืื ืืืจืฉืื ืืจืื ืืื ืืชืคืขืื ืืืืื.
ืคืจืืื ื ืืกืคืื ืขื ืืคืชืจืื ืืช ืืืจืืืืงืืื ืืื ืฉื Hyperledger Fabric ืืืืืข ืืื ืขืืื ืื ืืื ืืืจืช ื ืืชื ืืืฆืื ืืื:
ืื, Hyperledger Fabric ืืื ืืขืจืืช ืืื ืืืจืกืืืช ืืืืช ืฉืืืชื ืืชื ืืืื:
- ืืืืขืช ืืืืืื ืขืกืงื ืฉืจืืจืืชื ืืืืฆืขืืช ืื ืื ืื ืืืืื ืืืื;
- ืืงืื ืืงืื ื ืชืื ืื ืืืกื ืื ืชืื ืื ืฉื blockchain ืืคืืจืื JSON;
- ืืขื ืง ืืืืช ืืืฉืช API ืืืืฆืขืืช ืจืฉืืช ืืืืฉืืจืื.
ืขืืฉืื, ืืฉืืื ื ืงืฆืช ืขื ืืคืจืืื ืฉื Hyperledger Fabric, ืืืื ืกืืฃ ืกืืฃ ื ืขืฉื ืืฉืื ืฉืืืืฉื!
ืคืจืืกืช ืืืืงืฆ'ืืื
ืืฆืืจืช ืืืขืื
ืืืฉืืื ืืื ืืืืฉื ืืช ืจืฉืช Citcoin ืขื ืืคืื ืงืฆืืืช ืืืืืช: ืืฆืืจืช ืืฉืืื, ืงืืืช ืืชืจื, ืืืขืื ื ืืืฉืืื, ืืขืืจืช ืืืืขืืช ืืืฉืืื ืืื ืืืืจ. ื ืฆืืืจ ืืืื ืืืืืืงื, ืืืชื ื ืืฉืื ืืืืฉื ืืืืื ืืื. ืื ืืืื ืื ื ืืฉืืื ืืช ืฉืืืืืื ืืฉืืืช ืืืืืืื ืืชืจื ืืจืฉืืืช ืืฉืืื ืืช. ืืฉืืื ืืช ืืจืฉืืืช ืืฉืืื ืืช ืื, ืืืื ืืื ืฉื ื ืืกื Hyperledger Fabric. ืืืชืื, ืืฉ ืืื ืืืกืืืจืื ืืืฆื ื ืืืื. ืื ื ืื ืกื ืืฆืืืจ ืืช ืื ืืฆืืจื ืืจืืจื:
ืื ืชืื ืื ืืขืืืื ืื ืื ืืืฆื ืื ืืืื, ืืืืืืกื ืืืกื ืื ืชืื ืื "ืืฆื ืขืืืื". ืืชืืชืืื ืืืคืืขืืช ืืืืืืช ืืืฆืืืืช ืืช ืืืืกืืืจืื ืืืืืืกื ืช ืืืืืงืฆ'ืืื. ืืืฆื ืื ืืืื ืฉื ืื ืืกืื ืืฉืชื ื ืขื ืืื ืขืกืงืืืช. ืื ืืก ืืฉืชื ื ืจืง ืืืืืื, ืื ืฉืืชืืฆืื ืืืขืกืงื, ื ืืฆืจ ืืืืืืงื ืืืฉ, ืืืขืจื ืื ืืืื ืฉื ืื ืืก ื ืื ืก ืืืืกืืืจืื.
ืขื ื IBM
ืื ื ืืืฆืจืื ืืฉืืื ื
ืฆืืจ ืจืฉืช ืืืืงืฆ'ืืื ืืกืืกืืช ืืืืฆืขืืช ืคืืืคืืจืืช ืืืืืงืฆ'ืืื ืฆืืจ ืืืฆืข ืืืื ืืื ืืืืงืฆ'ืืื ืคืืื ืืืจืืขืื ืืคืืืคืืจืืช Blockchain
ืืืื ืฆืืืืื ืืกื ืฉื ืคืืืคืืจืืช IBM Blockchain. ืื ืื ืืืจืื ืืืฆื ืืืฆืืจ ืืืืงืฆ'ืืื, ืืื ืคืฉืื ืืืืื ืฉื ืืืงืฃ ืืืฉืืื. ืื, ืืืืจืืชืื ื, ืื ื ืืืฆืจืื ืืจืืื ืืื:
ืื ื ืืืฆืจืื ืื ืฆืืชืื: ืืกืืจ CA, Org1 CA, ืขืืืช ืืืืื:
ืื ื ืืืฆืจืื ืืฉืชืืฉืื:
ืฆืืจ ืขืจืืฅ ืืงืจื ืื 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;
ืืืืคื ืืื ืืืืืืืื, ืืื ืฆืจืื ืืืืืช ืืจืืจ ืืื:
- ืืฉื ื ืืกืคืจ ืคืื ืงืฆืืืช (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance) ืฉืชืืื ืืช ืืืืืื ืชืงืจื ืืืืฆืขืืช ื- Hyperledger Fabric API.
- ืืคืื ืงืฆืืืช SendFrom ื-RefillBalance ืืืฆืจืืช ืืืจืืขืื ืฉืชืืื ืืช ืืืืืื ืชืงืื.
- ืคืื ืงืฆืืืช ืืืื ืกืืฆืื ื ืงืจืืช ืคืขื ืืืช ืืืฉืจ ืืืื ืืื ืืืืื. ืืืขืฉื, ืื ื ืงืจื ืื ืจืง ืคืขื ืืืช, ืืื ืืื ืคืขื ืืฉืชื ื ืืจืกืช ืืืืื ืืืื. ืืื, ืืชืืื ืจืฉืืื ืขื ืืขืจื ืจืืง ืืื ืจืขืืื ืจืข, ืื ืืขืช, ืืืฉืจ ื ืฉื ื ืืช ืืจืกืช ืืืืื ืืืื, ื ืืื ืืช ืืจืฉืืื ืื ืืืืืช. ืืื ืื ืืกืืจ, ืื ื ืจืง ืืืื).
- ืืฉืืื ืืช ืืจืฉืืืช ืืฉืืื ืืช ืื ืืื ื ื ืชืื ืื ืฉื JSON. JS ืืฉืืฉ ืืื ืืคืืืฆืื ืฉื ื ืชืื ืื.
- ืืชื ืืืื ืืงืื ืืช ืืขืจื ืื ืืืื ืฉื ื ืืก ืืืืฆืขืืช ืงืจืืืช ืืคืื ืงืฆืื getState, ืืืขืืื ืืืชื ืืืืฆืขืืช putState.
- ืืขืช ืืฆืืจืช ืืฉืืื, ื ืงืจืืช ืืคืื ืงืฆืื AddAccount, ืฉืื ืืชืืฆืขืช ืืฉืืืื ืืืกืคืจ ืืืงืกืืืื ืฉื ืืฉืืื ืืช ืืืืืงืฆ'ืืื (maxAccounts = 5). ืืื ื ืืฉ ืืฉืงืืฃ (ืฉืืชื ืื?), ืฉืืืื ืืขืืืื ืืื ืกืืคืืช ืืืกืคืจ ืืืฉืืื ืืช. ืืฉ ืืืืื ืข ืืืขืืืืช ืืืื)
ืืืืจ ืืื, ืื ื ืืืขื ืื ืืช ืืืืื ืืืื ืืขืจืืฅ ืืืฆืืืื ืืืชื:
ืืืื ื ืกืชืื ืขื ืืขืกืงื ืืืชืงื ืช ืืืื ืืื:
ืืืื ื ืกืชืื ืขื ืืคืจืืื ืขื ืืขืจืืฅ ืฉืื ื:
ืืชืืฆืื ืืื, ืื ื ืืงืืืื ืืช ืืืืืืจืื ืืืื ืฉื ืจืฉืช ืืืืงืฆ'ืืื ืืขื ื IBM. ืืชืจืฉืื ืืฆืื ืื ืชืืื ืืช ืืืืื ืืคืืขืืช ืืขื ื ืืืืื ืขื ืฉืจืช ืืืจืืืืื (ืขืื ืขื ืื ืืกืขืืฃ ืืื):
ืืฆืืจืช GUI ืขืืืจ ืงืจืืืืช Hyperledger Fabric API
ื-Hyperledger Fabric ืืฉ API ืฉื ืืชื ืืืฉืชืืฉ ืื ืืื:
- ืฆืืจ ืขืจืืฅ;
- ืืืืืจืื ืืฉืืืื ืืขืจืืฅ;
- ืืชืงื ื ืืืืคืข ืฉื ืืืืื ืืืืื ืืขืจืืฅ;
- ืขืกืงืืืช ืฉืืืืช;
- ืืงืฉ ืืืืข ืขื ืืืืืงืฆ'ืืื.
ืคืืชืื ืืคืืืงืฆืืืช
ืืชืืื ืืช ืืืืืื ืฉืื ื ื ืฉืชืืฉ ื-API ืจืง ืืื ืืืชืงืฉืจ ืืขืกืงืืืช ืืืืงืฉ ืืืืข, ืืืืืื ืืช ืฉืืจ ืืฉืืืื ืืืจ ืืฉืืื ื ืืืืฆืขืืช ืคืืืคืืจืืช ืืืืืงืฆ'ืืื ืฉื IBM. ืื ื ืืืชืืื GUI ืืืืฆืขืืช ืืืกื ืืช ืืื ืืืืืื ืกืื ืืจืืืช: Express.js + Vue.js + Node.js. ืืชื ืืืื ืืืชืื ืืืืจ ื ืคืจื ืขื ืืื ืืืชืืื ืืืฆืืจ ืืืฉืืื ืืื ืืจื ื ืืืืจื ืืื. ืืื ืืฉืืืจ ืงืืฉืืจ ืืกืืจืช ืืืจืฆืืืช ืฉืืื ืืืืชื:
- HyperledgerDemo/v1/init - ืืชืืื ืืืืืงืฆ'ืืื;
- HyperledgerDemo/v1/accounts/list โ ืงืื ืจืฉืืื ืฉื ืื ืืืฉืืื ืืช;
- HyperledgerDemo/v1/account?name=Bob&balance=100 โ ืฆืืจ ืืฉืืื Bob;
- HyperledgerDemo/v1/info?account=Bob โ ืงืื ืืืืข ืขื ืืฉืืื Bob;
- HyperledgerDemo/v1/transaction?from=Bob&to=Alice&volume=2 โ ืืขืืจ ืฉื ื ืืืืขืืช ืืืื ืืืืืก;
- HyperledgerDemo/v1/disconnect - ืกืืืจ ืืช ืืืืืืจ ืืืืืงืฆ'ืืื.
ืชืืืืจ ืฉื ื-API ืขื ืืืืืืืช ืืืืืืืช ื
ืืคืืืงืฆืืืช ืืืืื ืืขื ื ืืืืื
ืืขืืืชื ืืช ืืืคืืืงืฆืื ืืืืืื ืื... IBM ืขืืืื ืื ืืฆืืืื ืืฉืืจื ืืช ืืืฉืืื ืฉืื ืืืืคืฉืจ ืื ืืืฆืืจ ืฉืจืชืื ืืืจืืืืืืื. ืืืฆื ืืืืกืืฃ ืืืืืื ืืืืืืื:
- ืืชืืื ืืืืืงืฆ'ืืื;
- ืฆืืจ ืืฉืืื (ืื ืืขืช ืืื ื ืืืื ืืืฆืืจ ืืฉืืื ืืืฉ, ืืืืืื ืฉืืืกืคืจ ืืืจืื ืฉื ืืฉืืื ืืช ืฉืฆืืื ืืืืื ืืืื ืืืฉื ืืืืืงืฆ'ืืื);
- ืงืื ืจืฉืืื ืฉื ืืฉืืื ืืช;
- ืืขืืจ ืืืืขืืช citcoin ืืื ืืืืก, ืืื ืืืืืก;
- ืงืื ืืืจืืขืื (ืืื ืขืืฉืื ืืื ืืจื ืืืฆืื ืืืจืืขืื, ืื ืืฉื ืืคืฉืืืช ืืืืฉืง ืืืืจ ืฉืืืจืืขืื ืืื ื ื ืชืืืื);
- ืืืื ืคืขืืืืช.
ืจืืฉืืช ืื ื ืืืชืืืื ืืช ืืืืืงืฆ'ืืื:
ืืืืจ ืืื, ืื ื ืืืฆืจืื ืืช ืืืฉืืื ืฉืื ื, ืื ืชืืืื ืืื ืขื ืืืชืจื:
ืื ื ืืงืืืื ืจืฉืืื ืฉื ืื ืืืฉืืื ืืช ืืืืื ืื:
ืื ื ืืืืจืื ืืช ืืฉืืื ืืื ืืขื, ืืืงืืืื ืืช ืืืชืจืืช ืฉืืื. ืื ืืฉืืื ืืื ืืขื ืืืื, ืืืฉืืื ืฉืื ืืชืืืฉ:
ืืืืื ืื ื ืขืืงืืื ืืืจ ืืืฆืืข ืืขืกืงืืืช:
ืืืขืฉื, ืื ืืื ืขื ืชืืื ืืช ืืืืืื. ืืืื ืชืืืื ืืจืืืช ืืช ืืขืกืงื ืฉืื ื ืืืืืงืฆ'ืืื:
ืืืจืฉืืื ืืืืืืช ืฉื ืืขืกืงืืืช:
ืขื ืื, ืืฉืืื ื ืืืฆืืื ืืช ืืืืฉืื ืฉื PoC ืืืฆืืจืช ืจืฉืช Citcoin. ืื ืขืื ืฆืจืื ืืขืฉืืช ืืื ืฉ-Citcoin ืชืืคืื ืืจืฉืช ืืืื ืืืขืืจืช ืืืืขืืช? ืืขื ืืืื:
- ืืฉืื ืืฆืืจืช ืืืฉืืื ืืฉ ืืืืฉื ืืฆืืจืช ืืคืชื ืคืจืื/ืฆืืืืจื. ืืืคืชื ืืคืจืื ืืืื ืืืืืช ืืืืืกื ืืฆื ืืฉืชืืฉ ืืืฉืืื, ืืืคืชื ืืฆืืืืจื ืืืื ืืืืืช ืืืืืกื ืืืืืงืฆ'ืืื.
- ืืฆืข ืืขืืจืช ืืืืข ืฉืื ืืคืชื ืฆืืืืจื, ืืื ืฉื, ืืฉืืฉ ืืืืืื ืืืฉืชืืฉ.
- ืืฆืคืื ืขืกืงืืืช ืืขืืืจืืช ืืืืฉืชืืฉ ืืฉืจืช ืืืืฆืขืืช ืืืคืชื ืืคืจืื ืฉืื.
ืืกืงื ื
ืืืืขื ื ืืช ืจืฉืช Citcoin ืขื ืืคืื ืงืฆืืืช ืืืืืช: ืืืกืคืช ืืฉืืื, ืงืืืช ืืชืจื, ืืืขืื ื ืืืฉืืื, ืืขืืจืช ืืืืขืืช ืืืฉืืื ืืื ืืืฉื ืื. ืื ืื ืขืื ืื ื ืืื ืืช PoC?
- ืืชื ืฆืจืื ืืืืื ืืืืงืฆ'ืืื ืืืื ื-Hyperledger Fabric ืืคืจื;
- ืืื ืืืฉืชืืฉ ืืขื ื ืื ืฉื IBM ืื ืืืืื;
- ืืื ืืช ืฉืคืช ืืชืื ืืช JS ืืืกืืจืช ืืื ืืจื ื ืืืฉืื;
- ืื ื ืชืื ืื ืืกืืืืื ืฆืจืืืื ืืืืืช ืืืืืกื ืื ืื ืืืืืงืฆ'ืืื, ืืื ืืืกื ื ืชืื ืื ื ืคืจื, ืื ืืื ืืฉืื, ืืืฉื, ืขื PostgreSQL;
- ืืืืจืื ืืืื - ืืชื ืื ืืืื ืืืืืช ืืขืืื ืืืืืจื ื ืืื ืืืข ืืืื ืืงืก!)
ืืืืื, ืื ืื ืืืข ืืืืื, ืืื ืชืฆืืจื ืืขืืื ืงืฉื!
ืืงืืจืืช ื-GitHub
ืืงืืจืืช ืฉืื ืขื
ืงืืืื ยซืฉืจืชยป โ ืฉืจืช Node.js
ืงืืืื ยซืืงืืืืชยป โ ืืงืื Node.js
ืงืืืื ยซblockchain"(ืขืจืื ืคืจืืืจืื ืืืคืชืืืช, ืืืืื, ืืื ื ืคืืขืืื ืื ืืชื ืื ืจืง ืืืืืื):
- ืืืื - ืงืื ืืงืืจ ืืืื ืืื
- ืืจื ืง - ืืคืชืืืช ืืฉืชืืฉ ืืฉืืืืฉ ื- Hyperledger Fabric API.
- *.cds - ืืจืกืืืช ืืืืืจ ืฉื ืืืืื ืืืืื
- ืงืืฆื *.json - ืืืืืืืช ืืงืืืฆื ืชืฆืืจื ืืฉืืืืฉ ื- Hyperledger Fabric API
ืื ืจืง ืืืชืืื!
ืืงืืจ: www.habr.com