読書ノート『ブロックチェーン実践入門』
はじめに
ブロックチェーンに関する認識がふわっとしてたので体系的に知識を整理したいのでポチりました。
実践書にしたのは実際動かして理解できるようなものを求めていたので。
章立て
ブロックチェーン序論
ブロックチェーンの仕組み
ビットコインの仕組み
イーサリアムの仕組み
ブロックチェーンアプリケーション開発
イーサリアムDAppの構築
1-2章で一般的な話をして、3-4章で代表的な実装の話、5-6章で実践的開発の話をしているようです。
目次は公開されていることが多いのでいつもそれを見て期待の内容か判断してます。
第1章:ブロックチェーン序論
ほんと手に取る段階の人にとっては知ってるがなぐらいの話です。
一応非中央集権的とはなんぞやが細かく定義されていますが興味ある人向け。技術書あるあるだけど序盤は原理的学術的な話なのでふーんぐらいで流し読み。
分散ノードが無矛盾同一データを共同管理しているのが分かってりゃ良いです。
階層構造
アプリケーション層
実行層
セマンティック層
伝播層
コンセンサス層
これだけは大事。
OSI参照モデルのように一般的に定義が確定しているわけではないっぽいけど、少なくともこの本では領域を区切っているのでそれに沿って話が展開します。
第2章:ブロックチェーンの仕組み
基礎技術
暗号技術
ゲーム理論
コンピュータサイエンス
上記の技術の複合で実現されるため各技術に関して説明があります。
個別技術は別の文献でもっとわかりやすく書いてたりするので参考資料程度にみたほうがいい。
暗号技術に関しては公開鍵方式/秘密鍵方式/ハッシュの区別がついて各プロトコル名見てどっちに属するかぐらい覚えていればいいかな。あとデジタル署名技術。
ゲーム理論に関してはナッシュ均衡とビザンチン将軍問題がわかればいいっぽいです。
コンピュータサイエンスに関してはハッシュ使ったチェーン構造がわかればよいかと思います。Gitでも使ってますけど直前オブジェクトのハッシュを含めることで改竄耐性をつけます。
あとブロック内トランザクション検索用にマークルツリーというのが出てきます。
トランザクション記録
新規トランザクションの発行
トランザクションの検証(全ノード)
複数のトランザクションをまとめてブロック生成&提案(1ノード)
提案ブロックのコンセンサスの形成
ブロックチェーン追加(全ノード)
基本メカニズムは此れくらいの解像度でいいです。
コンセンサスアルゴリズム
PoW (Proof of Work)
PoS (Proof of Stake)
PBFT (Practical Byzantine Fault Tolerance)
上記3つが説明されています。
個別の詳細はWeb上の資料のほうがわかりやすいかも。
スケーラビリティ問題
ビザンチン障害耐性のためコンセンサス・アルゴリズムが作られているのでスケーラビリティが課題。
オフチェーン計算やシャーディングがキーワードでそのへんはWEBの最新の情報を参照したほうが良さそう。
第3章:ビットコインの仕組み
代表的な暗号資産。
序盤に貨幣とその価値の根拠に関して書いてつけど経済学の領分なので流し見で。
PoWコンセンサスのアルゴリズムで新規発行分はマイナーの報酬になる。
ネットワーク
TCP/IPを使用
新規ノード参加はDNSシードなどを使ってブートストラップノードに接続する。
ノードにはフルノードとSPVがあり、SPVは簡易な検証を行う。
ブロック構造
マジックナンバー:固定値
ブロックヘッダー:後述
格納トランザクション数
トランザクションリスト
ブロックヘッダ
バージョン
直前のブロックハッシュ
トランザクション検索用のマークルツリーのルート
ブロック作成時のタイムスタンプ
PoWの領域(難易度、生成乱数)
PoWの難易度は2016ブロック生成するのに2週間かかるように調整される。
トランザクション
送金元が発行する。
ビットコインには残高という概念がないので、過去の受領トランザクション集合を提示することで送金可能であるということを示す。
バージョン
入力数
入力情報の集合
出力数
出力情報の集合(自己送金含む)
ロック時間(未使用)
入力情報には以下の情報を含む
トランザクションのハッシュ
トランザクション内の出力インデックス
署名と公開鍵(スクリプト形式)
出力情報には以下の情報を含む
金額
送金先(スクリプト形式)
支払いで使用済みの受領トランザクションはUTXOと呼ばれる。
原理的に二重支払いの阻止ができないので、全ノードが検証をしつつマイニング時に不正レコード排除を行う。
第4章:イーサリアムの仕組み
抽象化層を挟むことで暗号資産のみならずあらゆる取引を記録することができるブロックチェーン・プラットフォーム。
ビットコインの考え方をベースに機能拡張されているので相違点ベースでまとめる
ブロックチェーン構造
ブロックをハッシュ参照チェーン構造でつなげて一貫性を保証するという点はビットコインと全く同じ。
その一方でブロック自体が大幅に拡張され通貨送金以外の情報が扱えるようになっている。
管理データの拡張
トランザクション
レシート
ステート
ブロックボディで管理されているデータで、ビットコインに加えて2つ拡張されている。
トランザクションは通貨送金以外の様々な取引を記録できるように拡張されている。
レシートはガスという手数料をまとめたものである。
ステートは新規の概念である。
ガスと手数料
イーサリアルでは様々な取引を自由に定義して記録できる。
一方でブロックチェーンネットワーク維持のためには演算コストが不可欠で、統一した尺度で報酬を出す必要がある。
ブロック生成の手数料はイーサリアム内通貨ETHで支払われる。
トランザクションの演算コストはガス使用量として評価されて、ガス代という形で発行者がETHを積み立てることになる。
ガス代決定アルゴリズムはDoS攻撃なども考慮していて非常に複雑な模様。
ステート
現在の状態を記録したもの。
おそらくトランザクションを大幅に拡張したために必要になったものと思われる。
ビットコインの場合扱うのは一種類の数値のみののためUXIOとかの概念をつかいつつ取引額を上手いこと足したり引いたりしたら現実的な計算コストの範囲で残高が求められるがイーサリアムの場合はそうは行かないのだろう。
トランザクションを実行した結果どういう状態になったのかが記録されている。またこのステートデータも完全データではなく前ブロックに記録されているステートとの差分だけが記録されているようだ。
ネットワークの完全状態を知ろうとすればブロックのデータをたどって行く必要があるがトランザクションを再計算するよりかは遥かにマシなのだろう。
アカウント
ステートの中に含まれる概念。
いくら自由に定義できるとはいえ一定の秩序が必要でアカウントのデータ構造には規定がある。
アカウントは2種類ある。
外部所有アカウント(EOA):秘密鍵制御の個人アカウント
コントラクトアカウント:コード制御の内部アカウント
以下の情報を含む。
残高
コードハッシュ:コントラクトアカウント用
ストレージルート:ストレージ情報追跡用
ナンス:制御用
コントラクトアカウントはEOAにキックしてもらって特定のコードを実行するためのボットというか仮想ユーザーのようなものっぽい。
その他用語など
DApp(Decentralized Application):ブロックチェーン上で実現される分散型アプリケーションの総称
EVM:スマートコントラクトを実行するための仮想マシン
第5〜6章
具体的なブロックチェーンとの通信方法や、プライベートブロックチェーンの作り方が記載されている。
本質的な話ではないので省略。
まとめ
ビットコインやイーサリアムの基本的な構造がわかりやすく書いてある。
特にイーサリアムがあらゆる取引を記録できるように作られているのは興味深い。
ブロックチェーンというがハッシュ参照でチェーンを作り一貫性を保証するやり方はよく見られる(Gitのコミットログとか)やり方であり目新しさはない。
ブロックチェーン技術の肝は、ゲーム理論を基に巧妙に練られたコンセンサスアルゴリズムであり、それによりデータの唯一性がほぼ担保され、『分散サーバに保証された、ただ一つの一貫したデータセット』を構築することに成功している。
権威サーバーが不在なため、独裁的な変更が非常に困難という意味で非常に意味がある技術であるが、利用シーンといえば非常に難しいとろこに思えた。
良くも悪くも参加サーバの『民主的なコンセンサス』を強要されるので『管理者が管理する』という従前システムの固定観念からは離れなければならない。
プライベートブロックチェーンの利用は、コンセンサスを得てまで分散しないといけない記録はなにかというのはきちんと考えて導入する必要がある。
民間企業はトップダウンの独裁組織であるのだから、きちんと管理者を置いてバックアップを取るだけでも目的が達成されるのではないかなど。
おそらく法的に管理義務の有るデータなどが例には上がってくるだろう。
あと少し用途はずれるが、分散データベースでのデータ不整合解決にもつかえそうなのでマイクロサービスが流行ってる昨今はそっちの用途が主になるかもしれない。
一方でパブリックブロックチェーンは、インターネットの理想を実現したものであると同時に、無政府主義的である意味非常に危険なものである。
純粋にネットワークの参加者の合意だけで契約が成立するならば、国家という最高権威の立場は今後どうなっていくのかというのは今後見ものである。
この記事が参加している募集
この記事が気に入ったらサポートをしてみませんか?