はじめに仮想通貨やブロックチェーンの昨今の盛り上がりにより、ブロックチェーンの情報が本やインターネットで簡単に手に入るようになってきました。「ブロックチェーンの理論は大体分かった。面倒な設定なしに、5分ほどで簡単にデモが動かせる、そんなお手軽なブロックチェーンがあればいいのになぁ。」と考えている技術者の方が増えてきているのではないでしょうか。Sawtooth」を紹介したいと思います。ちなみに「Sawtooth」は「ノコギリ」ですが、何故このネーミングになったのかについては調べてもよく分かりませんでした。180を超える企業(*2)が協力して分散型台帳フレームワークのオープンソース開発や実証実験、コミュニティの構築や教育によるエコシステムの拡大に取り組んでいます。Indy(デジタルID)といったプロダクトがオープンソースとしてプロジェクトにホストされており(*5)、特徴や採用している技術、ユースケースがそれぞれ異なります。フレームワーク全体に共通したゴールとしては、スループットやファイナリティなどの問題を解決し、エンタープライズ用途に耐えうるレベルのプロダクトを提供しようとしていることが挙げられます。ビジネスで利用するためには、クローズドで開発されたプロダクトよりもオープンソースで開発されているプロダクトの方が評価しやすく、情報の透明性もあり、コミュニティが充実しているプロダクトだと採用されやすいというケースもあります。プロジェクトにより、分散型台帳やブロックチェーン技術が実ビジネス領域に広く浸透していくことが期待されています。プロジェクトにオープンソースとして提供されました。Architecture)を念頭に設計されており、コンポーネントがそれぞれ部品化されていてプラガブル(置き換え可能)になっているのが特徴です。Mode」が用意されています。*6)によって決められた待ち時間が一番短いノードがリーダーになる、という抽選アルゴリズムです。ようにハッシュキャッシュに対する計算コストを掛ける必要がなく、Intel社が言うには数千台のノードが参加してもスケールするとのことです。独自のコンセンサスアルゴリズムPoETを持つが、これは本来intelが提供するハードウェアを利用して行われるため完全版ではなく、オープンソース版ではシミュレータが用意されている。さまざまなブロックチェーン技術といった制限もあるようです。スコープ範囲外とのこと。実質、コンソーシアム型かプライベート型のどちらかで利用されることが多いと思われます。書かれています(*7)。複数の言語で開発ができるようにパッケージが個別に提供されています。利用イメージの全体図を描いてみました。上で動かす場合の構成図を示しています。図をもう少し詳しくした感じのイメージです。Altoros」の図はかなり細かい部分まで書かれていてすごく良いのですが、説明が少なくてここから正確に理解するはなかなか難しいと思います。Familyモデルに相当する構造体です。呼び出す際のアクションなどを任意に定義できます。作成する際に利用しています。更新するための情報、ヘッダ、署名を含んだデータで、「intkey」デモでは、「キーに対応する数値を登録する」「登録済みのキーに対応する数値を増やす」「登録済みのキーに対応する数値を減らす」といった一つ一つの処理に対応するトランザクションを表します。複数含んでおり、ある程度まとまった処理を表現できます。依存関係がある場合などにうまく活用できそうです。システムが扱う最小単位で、最終的に全ての変更が反映されるか全く反映されないかのいずれかになります。applied.https://sawtooth.hyperledger.org/docs/core/releases/latest/architecture/transactions_and_batches.html#why-batchesということで、ブロックチェーン上のブロックとバッチ(Batch)とトランザクション(Transaction)の関係は以下の図のようになります。ブロックの中に複数のバッチが含まれ、バッチの中に複数のトランザクションが含まれることになります。Stateブロックチェーンとは別に管理されるグローバルな状態を表します。state」に相当します。実行後のそれぞれの状態がネームスペース付きの70桁のアドレスを割り当てられて保管されています。固有のネームスペースを表す領域になっています。中心的な役割を担います。トランザクションのバッチを処理して、ブロックを作成するまでのサイクルを実行します。ビットコインのブロックチェーンで言うところの「フルノード」が近いかもしれません。Processor」などに移譲していることが多いようです(「intkey」でもそのような作りになっています)。言うところのスマートコントラクトか)にトランザクションのデータを渡す役割を担っています。書き換えることができます。開発者が事前に任意のプログラムを書くことができます。family.いわゆるスマートコントラクトです。一つで、よりビジネスロジック(アプリケーション)寄りとのこと。参考:IntkeyTransactionHandlerデモを動かしてみようさて、いよいよデモを動かすときが来ました。サンプルで一番簡単な「intkey」というデモになります。通して数字を登録したり増減させたりすることができるシステムで、ある程度まとまった処理がブロックとしてチェーンに次々に繋がっていくのが体験できます。コンテナを起動するだけでデモを実行できる環境が整います。「intkey」デモを動かしていきます。ちなみに私のローカル環境は以下の通りです。インストールこちらは事前に済ませておいてください。ここは「5分」に加えちゃだめですよ。以下の手順で「sawtooth-core-1.0.0rc5.zip」をダウンロードします。現時点での最新版は「v1.0.0rc5」となっていました。1分しか経っていませんよね?2.コンテナを起動zipファイルを解凍し、以下のコマンドを実行してコンテナを起動します。upしばらくすると、各種コンテナが起動します。2〜3分くらいで全て起動し終わるでしょうか。ps」コマンドを叩いて、コンテナのステータスを確認しましょう。sawtooth-validator-default起動に3分掛かったとして、今のところ計4分ですね。bashと実行し、起動したクライアント(図の「Client」)のコンテナにログインします。ハイ、準備は終了です。4分30秒くらいでセッティングが完了したと思います。処理を実行していきます。documentation」を見ながら進めてもいいのですが、現時点でドキュメントが少し古くて(ドキュメントの対象バージョンが「v0.8.13」になっているため)、ポート番号が間違っている箇所があります。「8080」ポートは最新版では「8008」が正しいので、適宜「8008」に読み替えて進めてください。1つ作成されているのが確認できます。"d16b15f03ff35031f094f5dadf4211ee7bb41c4bb707f0e7d0e015b70b85b8164a326dec294ff02e2aefcf1aa6cdbe3be8eb70d5d63cf322a269feda12b78534"初期状態のステータスを確認することができます。形式で格納されています。シリアライズした文字列が格納されていて、誰でも簡単に復元可能です。BLOCK」には、ブロックチェーンに書き込まれた最後のブロックの「BLOCK_ID」が表示されています。ブロックチェーンの最後のブロックが何であるかが保持されているということが分かります。show」コマンドで詳細を見ることができます。batches.intkey...このコマンドは、複数のトランザクションを含むバッチをいくつか作成し、ローカルに「batches.intkey」というファイルとして書き出してくれます。この時点では、トランザクションやバッチはブロックチェーンには書き込まれません。ローカルファイルにデータを書き込むだけです。うちのランダムな値で足したり引いたりするトランザクションを作成しています。1バッチとしています。個数分作成しています。9},]という値を更新するためのトランザクションをそれぞれランダム個含むバッチを2個作成することになります(分かりやすく模式化して書いたので実際のものとは多少異なります)。44.84783422259765先ほど作成したファイルを読み込んで、バッチを一斉にネットワークに送信します。3」とログが出ているので、バッチを3つ(新規作成1つ+更新2つ)送信したことが分かります。1〜3台のノードが個別にトランザクションを受け取って処理を実行することが予想されます。順序が逆にならないようにスケジューリングされて実行されるはずなので、ご安心を。02850b3d81f14c7c1b9f2aee1274e2...「NUM」が「1」「2」のブロックが合計2つ増えています。クライアントからバッチを3個一斉に送信したのに、最終的には別々のブロックとしてチェーンに固定化されているのがミソと言えばミソでしょう。チェーン内部にタイマーがあり、一定時間ごとにブロックが承認されるようになっているようなのでこのようなことが起こり得るのです。NUMが「1」のブロックの「BATS」が「1」、「TXNS」が「3」となっているのは、ブロックの中にバッチが1個、トランザクションが3個入っていることを示しています。同じように、NUMが「2」のブロックの「BATS」が「2」、「TXNS」が「8」となっているので、ブロックの中にバッチが2個、トランザクションが8個入っていることが推測されます。実際に最後のブロックの中身を以下のコマンドで確認すると、「batches」直下に「(バッチの)header」が2つあるのでバッチが2個、1つ目のバッチの「transactions」直下に「(トランザクションの)header」が1つ、2つ目のバッチの「transactions」直下に「header」が7つあるので合計8個のトランザクションが含まれていることが確認できます。アドレスを表しており、それぞれのトランザクションの処理結果の格納先を指し示しています。値がどうなったかを確認してみます。"2ba9acebbe53f32909c1b341ace92d7d6d467dfd8a7de4deeed7d719f4794eff01a4c258ce3798fa8742f4deba214e11c6a73255acdf4f48205c15c17d3bcbf6"アドレスが「1cf1265008ce...」「1cf12656d2b5...」「1cf126c0efc8...」のレコードが増えています(先頭6桁が同じになっている理由はお分かりですよね)。値になっているはずです。シリアライズされた値をデコードしてみます。12583}確認することができました。Sawtooth」を紹介しました。スマートコントラクトを自由に書けるというところにグッと来たのが、この記事を書こうと思ったきっかけです。登録してしまった今日までの二週間ほどで急ごしらえで勉強した内容を書き殴ったので、間違っているところがいろいろあるかと思います。間違いがありましたら、温かい目で見ると同時に優しく教えていただけるとありがたいです。