Logo
    Logo

    Search

    R3-Solana連携

    Blockchainトレンド

    Corda活用事例

    Corda技術

    おすすめ記事

    記事を探す

    その他

    お客様サポート

    SBI R3 Japan HP

    お問い合わせ

    Corda5 データアーカイブの深淵 NotaryとTimewindowの切っても切れない関係

    公開日
    Mar 28, 2024
    カテゴリ
    Corda技術を知る
    タグ
    ⛓️UTXO⭐Corda5👁️‍🗨️Notary🧑‍💻CorDapp開発➕BC基盤比較
    筆者
    生永
    image
    icon
    この記事で学べること

    ブロックチェーンの弱点と言われるデータ量の増大。Cordaにこの弱点は存在しません。データ量増大を回避する仕組みであるアーカイブに関する新機能、Notaryのデータアーカイブについて解説しています。

    ⚠️
    技術の概要を説明することが目的の資料になります。実装と完全に一致していない可能性があります。
    ⚠️
    事例/画像など、こちらの記事を多く引用しています。
    Notaries in Corda 5: Archiving | Corda

    Corda's architecture enables double-spend prevention even in the absence of state data and supports safe archiving of state data.

    corda.net

    Notaries in Corda 5: Archiving | Corda
    icon
    目次
    • はじめに
    • NotaryとTimewindowの仕様変更
    • Cordaにおけるデータアーカイブ
    • Notaryとアーカイブ
    • シナリオ準備
    • シナリオ① Corda4(Notaryアーカイブせず)
    • シナリオ② Corda4(Notaryの情報を誤ってアーカイブした場合)
    • シナリオ③ Corda5の場合(Notaryのアーカイブをしていない状況)
    • シナリオ④ Corda5の場合(Notaryのアーカイブした場合)
    • 真正性を保つ最後の砦=Timewindow
    • シナリオ⑤ ノードA(悪意有り)がTX-1を複製
    • Timewindow登場
    • シナリオ再検討
    • シナリオ⑤’−1 TX-1を複製(Notaryのアーカイブ前)
    • シナリオ⑤’-3 TX-1を複製(Timewindowの制限時間後にNotaryをアーカイブ)
    • シナリオ⑤’-2 TX-1を複製(ちょっとだけTimewindowのデータを変える)
    • シナリオ⑤まとめ
    • まとめ

    はじめに

    こちらの記事では、Notaryのデータアーカイブの実現にあたって必要な技術課題を紹介し、それをCorda5でどのように解決したかを説明いたします。Corda5のNotaryとTimewindowの仕様については簡単にしか紹介いたしません。それぞれのご紹介については別記事(Notary解説記事、Timewindow解説記事)をご参照ください。

    NotaryとTimewindowの仕様変更

    Corda5のNotaryは、Corda4から比べると、だいぶ複雑になりました。この仕様変更により、Notaryはアプリケーションネットワークに存在するすべてのStateの存在を認識しています。

    Corda4⇨5 Notaryの管理範囲の変化
    Corda4⇨5 Notaryの管理範囲の変化
    Corda5- Non Validating Notaryのレスポンス
    Corda5- Non Validating Notaryのレスポンス
    Corda4- Non Validating Notaryのレスポンス
    Corda4- Non Validating Notaryのレスポンス

    Timewindowもまた仕様が変更されています。こちらは必須設定項目となり、また設定可能パターンが減っています。アプリケーション構築に一手間追加されたような印象です。

    Corda5 Timewindowの設定可能パターン
    Corda5 Timewindowの設定可能パターン
    Corda4 Timewindowの設定可能パターン
    Corda4 Timewindowの設定可能パターン

    さて、このような(細かい)仕様変更を行なった理由をこれから説明しましょう。データアーカイブという非機能要件をより高いレベルで実現するために必要な変更です。

    Cordaにおけるデータアーカイブ

    Cordaの著しい特徴の一つに、ネットワーク全体での改竄耐性を持ちつつ、不要になったデータの削除が可能であるというものがあります。

    💡
    データ削除機能のことをアーカイブとR3では読んでいます。これはCordaがブロック構築を取引単位で行うことにより実現可能になっており、他のBC基盤と大きく異なる点です。Corda4ですでに実現しているノードのデータアーカイブ機能の詳細については、Corda4のアーカイブサービスに関するドキュメントや、日本語のブログ記事をご覧ください。

    アーカイブ機能は、データストレージの容量節約に役立ちます。Corda4のアーカイブ機能は主に実データを保持する各ノードに焦点を当てていました。その一方、取引データのハッシュ値のみを管理するNotaryは、原則アーカイブサービスのスコープ外で、過去データを全て保持することを想定していました。Notaryの持つデータ量はノードと比べると小さなものです。一般的なTransactionのサイズは通常数十キロバイトに対して、Notaryが持つ1Transactionあたりのデータは大体数十バイト。サイズはざっくり1000分の1程度になります。その為、ストレージ容量という観点ではアーカイブできないことの影響は小さかったのです。

    💡
    TransactionのサイズはStateの持つ情報や、スマートコントラクトのサイズによって大きく変動しますし、1Transactionに、幾つStateが含まれるのかや、消費されるStateの個数などは設計によって大きく変わります。ここで示したサイズ感はあくまで議論の為の目安です。

    ただし、ストレージ容量とは異なる観点でアーカイブの必要性は出てくる可能性がありました。それは、Notaryの検索性能という問題です。Notaryは2重支払いチェックを行うにあたって、必ずDBの全数チェックが走ります。もちろん検索対象がハッシュ値(十分にランダム化された固定サイズ文字列)なので、不均質な性能劣化が発生する余地はほぼないものの、過去データが膨大になればなるほどその検索には負荷がかかります。この問題を見越して、Corda5では、Notaryのアーカイブもできるようにアーキテクチャが変更されました。

    Notaryとアーカイブ

    さて、まずはアーカイブ機能とNotaryの関係について詳しくみていきます。

    一つの例を参考に検討します。

    image

     この例は、Aさん宛にStatble Coin(十ドル)が発行され、Aさんはその十ドルでそのままBさんへのなんらかの支払いをこなったというものになります。ここで二つのTransactionが存在しますが、このうち最初に作ったTransactionをアーカイブしたいとしましょう。しかし、アーカイブした後もこの十ドルを使って2重支払いさせたくは(当然ながら)ありません。

     ここから先は、「Aさん」が悪意を持ったノードオーナーだとして検討していきます。さまざまなパターンでアーカイブ(データの削除)を行なった場合に、Aさんが果たして二重支払いを行えるのか(Bさんに支払ったはずの十ドルで、Cさんという別の人にも支払いができる?)という点を検討します。

    image

    シナリオ準備

    Aさんが「悪意のある人」だとは、当然ながらBさん、Cさん、それからNotaryの管理者は知りません。また、Aさん、Bさん、Cさん、そしてNotaryはそれぞれ異なる情報を持っています。そこで、まずはどんな情報を持っているのかを確認しましょう。わかりやすくする為に、二つのTransactionにTX-1とTX-2と名前をつけておきます。(Notaryは情報の中身は知らず、TX-1とTX-2をTransaction Hashとして認識します)

    また、比較のために、Corda4とCorda5のNotaryが何を知っているのかも同時に考えてみましょう。Aさんは、Bさんに十ドル払い終わったタイミングです。

    • AさんはBさんに十ドル払ってます。この情報はAさんもBさんも確認済みです。
    • Bさんは、ブロックチェーンの特性を活かしてTX-2の検証及びそのひとつ前の取引であるTX-1のスマートコントラクト検証も実施済みです。
    • Cさんはこの取引に関わっていないので、なにも知りません。
    • Corda4の場合だと、Notaryは、消費済みなのはTX-1-0というStateだけなので、このStateだけを知っている(=消費済)状態です。
    • Corda5の場合だと、Notaryは、TX-1-0を消費済として知っていて、他にTX-2-0が未消費であることも知っていることになります。
    image

    シナリオ① Corda4(Notaryアーカイブせず)

     さて、Corda4におけるアーカイブは、ノードのデータが対象でした。まずはノードのデータをアーカイブした場合に二重消費を起こせないかどうかを確認しましょう。 ノードBはデータをアーカイブしています。一方、ノードAは悪意を持っているのでアーカイブしたフリをして、削除したと言ったデータを元に全く別のトランザクションを(Cに支払いをする)構築し、ネットワークに流します。

    すると、この取引(図のTX-3)は、ノードAとノードCのチェックは通過するものの、Corda4のNotaryが拒否することがわかります。

    image

    シナリオ② Corda4(Notaryの情報を誤ってアーカイブした場合)

     では、Corda4が対応していない「Notaryのアーカイブ」を誤って行なった場合どうなるか考えてみましょう。上の図においてC4Notaryが知っている情報をアーカイブ(システムから削除)すると何が起きるでしょうか?

    当然ながら、Corda4のNotaryはTX-1-0のStateを自分のデータベースに持たない状態になります。(Bとの取引を知らない)ノードCは、ノードAとの取引情報(TX-3及びTX-1)を確認しますが、そこに怪しい点はありません。NotaryもTX-2のことを(アーカイブして)忘れているので、ノードAが悪意を持って構築したTX-3は、このネットワークの中で認められてしまうことになります。

    こうした状況を避けるためには、Corda4のNotaryはアーカイブすることができませんでした。

    image

    シナリオ③ Corda5の場合(Notaryのアーカイブをしていない状況)

    image
    image

    さて、シナリオは同じです。ノードBはデータをアーカイブしています。一方、ノードAは悪意を持っているのでアーカイブしたフリをして、削除したと言ったデータを元に全く別のトランザクションを(Cに支払いをする)構築し、ネットワークに流そうとしているという状況です。シナリオ①と同様、この取引(図のTX-3)は、ノードAとノードCのチェックは通過するものの、Notaryが拒否することがわかります。 この時、C5Notaryの内部は以下のような状況になります。

    シナリオ④ Corda5の場合(Notaryのアーカイブした場合)

    シナリオ④-1 アーカイブ直後

    まずは、Notaryのアーカイブ(及びノードBのアーカイブ)した直後の状況を見てみましょう。この時、NotaryはTX-1-0をアーカイブすることを想定します。(どのStateをアーカイブできるかについての検討は最後に行います)

    Corda4と異なり、Corda5のNotaryはアプリケーションネットワークに含まれるすべてのStateの状況(内容を知らないまま)を管理しているという整理をしています。その為、Corda5のNotaryがアーカイブしたStateは、ネットワークに存在しない、という理解になります。詳しくみていきましょう。

    image
    image

    シナリオ④-2 ノードA(悪意有り)がTX-3を構築

    さて、この状況で悪意を持ったノードAがTX-3を構築したとします。このTX-3は果たしてNotaryのチェックを通るのでしょうか?

    image

    結論から言えば通りません。こちらの表をご覧ください。この表の見方はCorda5のNotaryの解説記事をご覧いただければと思いますが、簡単にいうと、Stateの登録・更新依頼に対して、Notaryがどのような反応をするかについて説明した表になります。

    Corda5Notaryのレスポンス
    Corda5Notaryのレスポンス

    こちらに、今回問題となっているTX-1-0(最初に発行した十ドル)を当てはめるとどうなるかというと、以下の図のようになります。すなわち、アーカイブ前は”消費済State”だったものが、アーカイブ後は”Notaryの知らないState”になります。

    Corda5 Notaryのアーカイブによる状態変化
    Corda5 Notaryのアーカイブによる状態変化

    さて、アーカイブ後にTX-3をNotaryに流した場合何が起きるのでしょうか?TX-3の中で、TX-1-0をInput Stateとして登録をかけます。アーカイブ後なので、Notaryの反応は「❌エラー(未登録)」となり、Notaryの署名に失敗します。結果として、アーカイブ後もTX-3はネットワークで承認されないということになります。

    Notary アーカイブ後も悪意をもったTransactionの排除が可能
    Notary アーカイブ後も悪意をもったTransactionの排除が可能

    さて、これで安心。かというともう一つだけ塞がなければならない抜け穴があります。これが最後のシナリオです。

    真正性を保つ最後の砦=Timewindow

    Corda5 Notaryのアーカイブによる状態変化
    Corda5 Notaryのアーカイブによる状態変化

    上の表を見てお気づきになった方もいらっしゃるのではないでしょうか?アーカイブ後のTX-1-0は、Notaryにとって未知のStateになります。なので、TX-1-0を「未消費のState」として登録すれば2重消費ができるのではないか?という問題です。つまり、TX-1をもうひとつ新しく登録する(TX-4)という抜け道があるのではないか?というお話になります。

    シナリオ⑤ ノードA(悪意有り)がTX-1を複製

    このシナリオを図にしたのが下の図になります。

    image

    さて、詳しく見ていきましょう。

    シナリオ⑤−1TX-1を複製(Notaryのアーカイブ前)

    まずはアーカイブ前の状態を確認しましょう。

    TX-1には必ず相手がいるはずです。Stable Coinの発行であれば、当然ながらStable Coinの発行体がこのTransactionには署名するはず。しかし、このTX-1の情報を全て持っているノードAは、Stable Coinの発行体が認知することなく、このTransactionは構築可能です。(単なるデータコピーです)しかし、当然このTransactionはNotaryによって否定されます。この状況を示したのが以下の図になります。

    Issue Transactionの拒否
    Issue Transactionの拒否
    Isssuer Transactionの拒否
    Isssuer Transactionの拒否

    シナリオ⑤-2 TX-1を複製(ちょっとだけデータを変える)

    もちろん、TX-1から少しだけデータの中身を変えたTX-4を作ることが可能です。しかし、Transactionの内容を少しでも変えると、Transaction Hashが変わってしまいます。このTransactionは署名検証に失敗するので、次に受け取るノードCが受け取りを拒否します。 よって、このデータを用いて取引を行うことができません。

    💡
    Transactionを受け取るノードCは過去のTransactionの署名を常に確認します。これをバックチェーン検証と言います

    シナリオ⑤-3 TX-1を複製(Notaryのアーカイブ後)

    お気付きの読者もいらっしゃると思います。さて、Notaryでアーカイブするとこの問題はどのように変化するでしょう?アーカイブされると、すでに登録されたTX-1は存在しないので、新しい登録として、TX-4は受け入れられてしまいます。このシナリオについて考えると、Notaryのアーカイブは不可能ということになってしまします。

    image

    ここで登場するのがTimewindowになります。

    Timewindow登場

    Timewindowがなんなのか、またそのCorda5での仕様については、別記事をご覧いただくとして、ここではこのケースにおいてTimewindowがどのような役割を果たしているのかを見ていきます。Timewindowとは、あるTransactionのNotaryへの登録に関しての時間制約を設ける役割を果たしています。Corda5では、Timewindowを特定時間より前という形で必ず設定しなければいけません。(下図参照)

    この制約には他にも理由がありますが、一番重要な理由はNotaryアーカイブの実現に必須の機能だからということになります。詳しく説明していきましょう。

    Corda5 Timewindowの設定可能パターン
    Corda5 Timewindowの設定可能パターン

    Corda5のTransactionは、必ずNotaryが署名可能な時間の最大値が設定されます。(上の図の①であっても、②であっても、特定時間を過ぎるとNGとするという制約がかかることが見て取れるかと思います)

    先ほどの例に戻りましょう。TX-1にも、当然TimeWindowが設定されています。これまで表現していませんでしたが、明示的に書くとすると以下のよう表現ができると思います。この時刻情報はTransactionの一部の情報として記録されています。

    Timewindowを表現したTransaction
    Timewindowを表現したTransaction

    また、NotaryにTimewindowの情報は渡されます。(これはCorda4でもCorda5でも同じです)

    Notaryに渡される情報
    Notaryに渡される情報

    Corda5のNotaryはこの情報をDBで管理します。なので、これまで提示していたNotaryのDBには、実はもう1列列があって、以下のような情報を管理しています。

    image

    ということで、先ほどのシナリオに戻りましょう。

    3つのシナリオがありました。

    シナリオ⑤−1 TX-1を複製(Notaryのアーカイブ前)

    シナリオ⑤-2 TX-1を複製(ちょっとだけデータを変える)

    シナリオ⑤-3 TX-1を複製(Notaryのアーカイブ後)

    この三つのシナリオに、Timewindowを組み合わせるとどうなるのか考えます。

    シナリオ再検討

    シナリオ⑤’−1 TX-1を複製(Notaryのアーカイブ前)

    Notaryのアーカイブ前にTransactionの複製を作ると当然ながらNotaryはそのTransactionを否定します。

    image

    シナリオ⑤’-3 TX-1を複製(Timewindowの制限時間後にNotaryをアーカイブ)

    しかし、アーカイブされた場合を考えると、TX-1の複製が登録できてしまうという課題がありました。しかしアーカイブするタイミングを、Timewindowで指定された時間以降に実施するとどうなるでしょう?この時、新規登録されるTX-4は、Timewindow制約に違反することから、Notaryは登録を拒否します。

    image
    アーカイブのタイミングをTimewindowの設定時間以降に実施すれば、安全にアーカイブ可能
    アーカイブのタイミングをTimewindowの設定時間以降に実施すれば、安全にアーカイブ可能

    シナリオ⑤’-2 TX-1を複製(ちょっとだけTimewindowのデータを変える)

    もちろん、Timewindowの設定を変更したTransactionを構築することでこの制約は回避可能ですが、Transactionに含まれるデータであるTimewindowは、その値を変えるとTransaction Hashの値を変えてしまいます。オリジナルのシナリオ⑤-2と同じく、こうするとStable Coinの発行体の署名検証が通らなくなるため、このTransactionは有効なものではないということになります。

    シナリオ⑤まとめ

    このように、アーカイブのタイミングをNotary側で適切にコントロールすると、先ほど見られたアーカイブ時の問題点をクリアすることができます。これで、Notary側は二重消費の問題に関して懸念を持つことなく、安全にアーカイブできることがわかりました。

    まとめ

    Corda5で実装予定のアーカイブ機能の解説を行いました。改めて全体像を確認しましょう。

    4️⃣
    <Corda4の場合>

    1) Corda4は消費済みStateだけをNotary登録可能

    2)Notaryが(誤って)アーカイブした際に、NW上の未消費の所在が分からなくなり、二重支払いが可能になってしまう。

    3)そのため、Corda4ではNotaryのアーカイブはできない

    5️⃣
    <Corda5の場合>

    1) Corda5は未消費Stateも含めて、全てのStateをNotaryに登録する。

    2) その為、アーカイブしたStateはネットワーク上に存在しないStateになるため、アーカイブ後も二重消費できない状態になる。

    3)しかし、発行&アーカイブ済のStateを再登録すると、悪用可能という問題が残る。

    🆘
    <Timewindowの役割>

    1) Corda5では、TimeWindowを必ず付与しなければ成らない仕様に(全てのTransactionには実行可能な時刻の上限値を設定する必要がある)

    2) その為、発行&アーカイブ済みのStateの再発行は、特定の時刻を超えると不可能になる。

    3) よって、Notaryはこの時刻を超えた後であれば、安全にアーカイブ可能。

    4) Time Windowの値を変更したTransactionは異なるTransaction Hashを持つので、悪用はやはり不可能

    Corda5では、Corda4と同レベルのアーカイブサービスとしてまだ実装できていませんが、Notaryもアーカイブ可能になっていること、またその為にNotaryとTimewindowの仕様に変更が入っている点をご理解いただけたのではないかと思います。

    また、本記事をご覧いただく中で、Stable Coin発行体にとって、Notaryの持つ重要性も見えてきたのではないかと思います。ここで示したStable Coinはあくまでユースケースサンプルではありますが、リアルなStable Coinのユースケースにおいて、Notaryを発行体が管理することを想定した場合に有用なNotaryの別実装もございます(Contract Validating Notary)こちらについてもまた今後別の記事で解説いたしますのでご覧ください。

    📬
    最後までお読みいただきありがとうございます。当社へのご質問・ご要望がございましたら、📪SBI R3 Japan お問い合わせフォーム📪よりお気軽にお問い合わせください!

    <ご質問・ご要望の例>

    • Corda Portalの記事について質問したい
    • ブロックチェーンを活用した新規事業を相談したい
    • 企業でのブロックチェーン活用方法を教えて欲しい 等々
    📢
    また、厳選されたCordaに関する最新情報をお伝えるするメールマガジンやX、当社主催のイベントコミュニティを運営しております。ぜひご登録ください。
    • Cordaメールマガジンに登録
    • X(旧Twitter)をフォロー
    • 弊社イベントコミュニティ(Connpass)に参加
    ✍️
    Written by 生永 雄輔 (Yusuke Ikunaga)
    image

    SBI R3 Japan エンジニアリング部長

    書籍出してます:https://amzn.asia/d/c0V31Vd 

    趣味:サッカー、ガンプラ、ドライブ、キャンプ

    →筆者の記事一覧

    Logo

    © copyright SBI R3 Japan 2025

    GitHubYouTubeXFacebookLinkedIn