社内通貨システムでQuorumを使ってみた話


概要

ブロックチェーンの調査や社内の課題解決にあたって、社内で流通する通貨を作っている(社内通貨)。社内通貨システムを開発する上で Quorum を利用したので、Quorumを使って開発する上での知見を徒然に共有。


社内通貨での構成


こんな感じにすれば社内システムとも連携していい感じになるんじゃない?という気持ち


Quorum全然自動化できない…とりあえずEC2で手動運用しとくかという気持ち

  • ウォレットをWebアプリとして実装
    • Metamaskは総務のおばちゃんには使えない
    • おばちゃん「あらあら、ニーモニックってなんだい?
  • 秘密鍵はブラウザのローカル・ストレージに保存
    • 絶対に真似してはいけないやつ
  • QuorumのコンセンサスアルゴリズムはRaftを選択

とはいえ、現在はQuorumをコンテナ化したり、初期クラスター構築やクラスターへのノード追加もある程度自動化できた


QuorumのRaft

  • BFTでなくCFT(過半数)
  • RaftのLeader=Minterがブロックを生成、フォークはない
  • ブロックの生成間隔が早い(初期値最低50ms間隔)
  • トランザクションがきた時だけブロックを生成するのでエコ
  • Speculative minting
    • 投機的鋳造(直訳)
    • 新ブロックを取込み中にも無限に新ブロックを生成しキューイング(speculative chain)
    • Leader選挙などで一時的に親ブロックのハッシュ違いブロックが出来たら巻き戻す
  • 早い、安い、脆い
    • Leaderを盲信
    • LeaderのRAFT_ID+nodekeyでブロックハッシュに署名したものがブロックのextraDataに入るようになった

開発時にハマったところ


Raftの時だけ block.timestamp がナノ秒(通常は秒単位)

timestamp: 1522098611952556500,

web3.eth.getBlock 呼び出し時に block.timestamp をNumberにキャストしようとしてエラー(1.0.0-beta.54 までダメ)

Error: Number can only safely store up to 53 bits

beta.55 でやっと解決(Raftの時だけStringで返ってくるので気持ち悪い)
解決したが balanceOf の返り値がString→BigNumberになってたり、
web3.utils.fromWei の引数がBigNumber不可でBN可だったり、意図が分からない
(追記:β期間の途中で開発者がTypeScript大好きっ子に変わったため、全部書き換えられ破滅的変更が加えられたそう)


permissioned-nodes.json を動的に反映するという嘘

--permissioned フラグと permissioned-nodes.json によって参加ノードを固定できる

[
    "enode://[email protected]:30400?discport=0&raftport=50400",
    "enode://[email protected]:30400?discport=0&raftport=50400",
    "enode://[email protected]:30400?discport=0&raftport=50400"
]

ファイル更新により動的に反映とWikiに書いてあったが何も起こらない・・・
static-nodes.jsonpermissioned-nodes.json を更新して admin.addPeer|removePeer するしかなさそう
エンタープライズブロックチェーンのイベントで詳しそうな人に聞いてみたところ「Wikiを読んでるお前が悪い。ソースを読め。」というIT業界あるあるな知見を得た


Truffle@v5のQuorumサポートがコンプリートリー・ブロークンしてた罠

どうりで何もかもうまくいかないと思った
もう古い話だが 5.0.14 で全て修正された模様
スマートコントラクトを全て書き直した模様
あと truffle-config.jstype: quorum を追加すること


今後

急に本気だしたのか v2.3.0 あたりからおもしろそうな機能が追加されてるので試したい
https://github.com/jpmorganchase/quorum/releases

  • BETA RELEASE Smart contract and RBAC based permissions model with support for organisations, sub-organisations, roles, account level access controls and nodes in the network.
  • Quorum Raft upgrade v3.3.13 and add support for Raft Learner nodes
  • DNS support for static nodes