Hyperledger Irohaを学習するためのリポジトリです。
Hyperledger Irohaを利用して構築したサンプルアプリケーションの概要図は下記の通り。
クライアントアプリは、TypeScript+React.js
APIサーバーは、Express
DBコンテナは、Postgresqlのイメージファイル
Irohaノードコンテナは、Hyperledger Irohaのイメージファイルを利用しています。
この中で利用している公開鍵及び秘密鍵の情報は全て開発用として生成しています。
絶対に本番環境では利用しないようにしてください。
iroha_front_appでは、Reactとサーバー用に設定ファイルを必要とします。
iroha_front_appのフォルダ直下に「.env」ファイルを
iroha_front_app/configフォルダに「local.yaml」ファイルを作成してください。
REACT_APP_API_SERVER_URL=http://localhost:3001
config:
db: 'localhost'
iroha_node: 'localhost'
local_key_dir: '/{gitフォルダまでのパス}/git/iroha/example/'
dev_key_dir: '/{gitフォルダまでのパス}/git/iroha/example/'
hyperledgerプロジェクトで4番目に採択されたブロックチェーン
オリジナルコードについては、ソラミツ株式会社が開発した。
ターミナルからの操作についてはコマンドでの操作となるが、
対話式のインターフェースなのでとても操作しやすい。
- ドメイン
グループ化や区分けを実現するための抽象化する概念のこと - アセット
アカウントが取引や蓄積を行う資産の種類のこと
Hyperledger Iroha上では複数のアセットを取り扱うことが可能 - アカウント
アセットをやりとりすることができる。
アカウントIDは、「アカウント名@ドメイン」と表現される。
Hyperledger Irohaには、53もの権限が存在し、大きく命令タイプと
問い合わせタイプに分類できる。
また、権限設定をまとめたものがロールとなる。
PostgreaSQLのDB内に格納されるブロックチェーン外で保持しなければならない情報のこと。
16個の表が存在し、Hyperledger Irohaで構成されるブロックチェーンの最新の情報を
保持する。
テーブル名 | 役割 |
---|---|
account | アカウントを管理する。 |
account_has_asset | アカウント毎のアセット別の残高を管理する。 |
account_has_grantable_premissions | アカウントに対して付与した権限を管理する。 |
account_has_roles | アカウント毎に設定されたロールを管理する。 |
account_has_signatory | アカウント毎の公開鍵を管理する。 |
asset | アセットを管理する。 |
domain | ドメインを管理する。 |
height_by_account_set | ブロック別に関連するアカウントを管理する。 |
index_by_creator_height | ブロックを作成したアカウントを連番で管理する。 |
peer | Peerの情報を管理する。 |
position_by_account_asset | アセットの転送を管理する。 |
position_by_hash | ブロック毎のハッシュ値を管理する。 |
role | ロールを管理する。 |
role_has_permissions | ロール毎の権利を管理する。 |
signatory | 公開鍵を管理する。 |
tx_status_by_hash | トランザクションの成功/失敗を記録する。 |
{
"blockV1":{
"payload":{
"transactions":[{
"payload":{
"reducedPayload":{
"commands":[{
"addPeer":{
"peer":{
"address":"127.0.0.1:10001","peerKey":"bddd58404d1315e0eb27902c5d7c8eb0602c16238f005773df406bc191308929"
}}
},{
"createRole":{
"roleName":"admin",
"permissions":
[
"can_add_peer",
"can_add_signatory",
"can_create_account",
"can_create_domain",
"can_get_all_acc_ast",
"can_get_all_acc_ast_txs",
"can_get_all_acc_detail",
"can_get_all_acc_txs",
"can_get_all_accounts",
"can_get_all_signatories",
"can_get_all_txs",
"can_get_blocks",
"can_get_roles",
"can_read_assets",
"can_remove_signatory",
"can_set_quorum"
]
}
},{
"createRole":{
"roleName":"user",
"permissions":
[
"can_add_signatory",
"can_get_my_acc_ast",
"can_get_my_acc_ast_txs",
"can_get_my_acc_detail",
"can_get_my_acc_txs",
"can_get_my_account",
"can_get_my_signatories",
"can_get_my_txs",
"can_grant_can_add_my_signatory",
"can_grant_can_remove_my_signatory",
"can_grant_can_set_my_account_detail",
"can_grant_can_set_my_quorum",
"can_grant_can_transfer_my_assets",
"can_receive",
"can_remove_signatory",
"can_set_quorum",
"can_transfer"
]
}
},{
"createRole":{
"roleName":"money_creator",
"permissions":
[
"can_add_asset_qty",
"can_create_asset",
"can_receive",
"can_transfer"
]
}
},{
"createDomain":{
"domainId":"test",
"defaultRole":"user"
}
},{
"createAsset":{
"assetName":"coin",
"domainId":"test",
"precision":2
}
},{
"createAccount":{
"accountName":"admin",
"domainId":"test","publicKey":"313a07e6384776ed95447710d15e59148473ccfc052a681317a72a69f2a49910"
}
},{
"createAccount":{
"accountName":"test",
"domainId":"test","publicKey":"716fe505f69f18511a1b083915aa9ff73ef36e6688199f3959750db38b8f4bfc"
}
},{
"appendRole":{
"accountId":"admin@test",
"roleName":"admin"
}
},{
"appendRole":{
"accountId":"admin@test",
"roleName":"money_creator"
}
}],
"quorum":1
}
}
}
],
"txNumber":1,
"height":"1",
"prevBlockHash":"0000000000000000000000000000000000000000000000000000000000000000"
}
}
}
blockV1: {
payload: {
transactionsList: [
{
payload: {
reducedPayload: {
commandsList: [
{
addAssetQuantity: { assetId: 'ticket#nihon', amount: '30' },
addPeer: undefined,
addSignatory: undefined,
appendRole: undefined,
createAccount: undefined,
createAsset: undefined,
createDomain: undefined,
createRole: undefined,
detachRole: undefined,
grantPermission: undefined,
removeSignatory: undefined,
revokePermission: undefined,
setAccountDetail: undefined,
setAccountQuorum: undefined,
subtractAssetQuantity: undefined,
transferAsset: undefined
}
],
creatorAccountId: 'test110@nihon',
createdTime: 1642920874175,
quorum: 1
},
batch: undefined
},
signaturesList: [
{
publicKey: 'c1a60da19955d66b6c183fb601f3a702c746234ac44818ac9b89d5029a0b73be',
signature: 'fc45206695431b7d6dfe6a84dfc8808a8f1fde8e6b7e6fc79b11e10286b93858622eb837aa8d0d4142899c3210af5e8e4f24abee518c38e4340a23af7ae51603'
}
]
},
{
payload: {
reducedPayload: {
commandsList: [
{
addAssetQuantity: { assetId: 'total#nihon', amount: '150000' },
addPeer: undefined,
addSignatory: undefined,
appendRole: undefined,
createAccount: undefined,
createAsset: undefined,
createDomain: undefined,
createRole: undefined,
detachRole: undefined,
grantPermission: undefined,
removeSignatory: undefined,
revokePermission: undefined,
setAccountDetail: undefined,
setAccountQuorum: undefined,
subtractAssetQuantity: undefined,
transferAsset: undefined
}
],
creatorAccountId: 'test110@nihon',
createdTime: 1642920874178,
quorum: 1
},
batch: undefined
},
signaturesList: [
{
publicKey: 'c1a60da19955d66b6c183fb601f3a702c746234ac44818ac9b89d5029a0b73be',
signature: 'da325146363da11d8bd8fe268f1d4f29834a7797e00a213c799e7fcda0b7e942fa6048c91357fb7c66380a41b0c30d4e737bc7173a91c39243f409965163b301'
}
]
},
{
payload: {
reducedPayload: {
commandsList: [
{
addAssetQuantity: { assetId: 'prepay#nihon', amount: '5000' },
addPeer: undefined,
addSignatory: undefined,
appendRole: undefined,
createAccount: undefined,
createAsset: undefined,
createDomain: undefined,
createRole: undefined,
detachRole: undefined,
grantPermission: undefined,
removeSignatory: undefined,
revokePermission: undefined,
setAccountDetail: undefined,
setAccountQuorum: undefined,
subtractAssetQuantity: undefined,
transferAsset: undefined
}
],
creatorAccountId: 'test110@nihon',
createdTime: 1642920874142,
quorum: 1
},
batch: undefined
},
signaturesList: [
{
publicKey: 'c1a60da19955d66b6c183fb601f3a702c746234ac44818ac9b89d5029a0b73be',
signature: '21c2712e3c7670e8e65016130044d8da99e042574beacc8581cb93776168dd1b9a3e0357e427370e4471a393860b75926f41bd0ff416de22c7d0c0bcf7d1bb06'
}
]
}
],
txNumber: 0,
height: 19,
prevBlockHash: '01ca4a8d5c4b52b39831a01a4a96049991de4bb4231922ec0dcce5ca196dce9b',
createdTime: 1642920874462,
rejectedTransactionsHashesList: []
},
signaturesList: [
{
publicKey: 'bddd58404d1315e0eb27902c5d7c8eb0602c16238f005773df406bc191308929',
signature: '2c0d74d47a4fc3d41954005e30074286d7516cfcb72290ca4bc53267c1a8e160b0747f88c6dd98f5032dafebb3d79fb13c29d3b17c741ff2c96217b457548b06'
},
{
publicKey: '94cc41678114bfb18c8c3e59c223e303410856bda6e34833bb4e14b2daa803dd',
signature: 'cfb6a2c2ccb61ab669728b99f1d4c9b50d89f1326e50866f99e37f8b0d826b1e42321fdea5e7e8cde3375da93da341e56ae10cf993e428a1cc7c7419c55b1801'
},
{
publicKey: '4c5a1ff9494101034a37760eaf53bef3828acfda4f61d7e8f6d3f8fb599e03bb',
signature: '1def05ad11cab2eebe8cc7f828b362096394e731211e327663be1c17523c4279ae300c3cba9f4500badb5c61ccd6bacdc079ca986882f2afba3a8cc2811fb905'
}
]
}
}
docker exec -it iroha /bin/bash
docker exec -it iroha1 /bin/bash
docker exec -it iroha2 /bin/bash
docker exec -it some-postgres /bin/bash
1. スキーマ「iroha_default」でDBにログインする。
psql -U postgres iroha_default
CREATE DATABASE reidai;
CREATE TABLE kaiin_info ( no serial, id VARCHAR(20), name VARCHAR(50), kana VARCHAR(50), addr VARCHAR(100), tel VARCHAR(30), bd VARCHAR(20), ed VARCHAR(20), block bigint, today timestamp DEFAULT now(), password VARCHAR(300), PRIMARY KEY (no));
CREATE TABLE shiharai_info ( no serial, id VARCHAR(20), prepay numeric, ticket numeric, total numeric, shisetsu VARCHAR(50), ninzu int, usetime numeric, job VARCHAR(10), today timestamp DEFAULT now(), PRIMARY KEY (no));
¥q
docker cp ~/git/iroha/example/ 601126ae851d:/opt/iroha_data
irohad --config config.docker --genesis_block genesis.block --keypair_name node0
irohad --config config.docker --genesis_block genesis.block --keypair_name node1
irohad --config config.docker --genesis_block genesis.block --keypair_name node2
-overwrite_ledger true をつけること!
iroha-cliの起動コマンド([email protected]ファイルが存在するディレクトリで打ちこむ)
iroha-cli -account_name admin@test
docker rm iroha iroha1 iroha2 some-postgres some-postgres1 somepostgre2
docker start iroha iroha1 iroha2 some-postgres some-postgres1 somepostgre2
docker stop iroha iroha1 iroha2 some-postgres some-postgres1 somepostgre2
docker volume create blockstore
docker-compose up -d
cd iroha_front_app
npm run build
node server.js
TypeScript + React + express により構築。
expressを利用して構築したWebサーバー
各種必要なAPIを定義している。
superAgentは、JavaScriptのライブラリなので直接読み込もうとすると
怒られる。そのため次のコマンドを打ち込んで翻訳する必要あり
npm install @types/superagent
※その他のモジュールについても必要に応じて@typesをつけてインストールする必要あり。
ALTER TABLE kaiin_info ADD COLUMN password VARCHAR(300);
superAgentの公式ページ
Hyperledger Irohaのjavascriptライブラリのリポジトリ
画面遷移実装サンプル
useContextの解説