メインコンテンツまでスキップ

Atomic commit protocol

Atomic commit protocolとは、複数の操作の集合を1つの処理として実行可能にするプロトコルである。代表的なものとしては、Two-phase commitやThree-phase commitなどがある。我々の文脈では、複数のブロックチェーンのトランザクションを1つのトランザクションとして実行するためのプロトコルを指す。

Cross Frameworkでは、現在、Simple commit protocol, Two-phase commit protocolの2種類のプロトコルをサポートしており、トランザクションの作成時に指定が可能である。これらのプロトコルでは、トランザクションで指定される各処理を実行する参加者と参加者が共通の決定を得るためのコーディネートを行うコーディネーターの2つのロールがある。 Simple protocolは、参加者が2つに限られることと参加者のうちの1つがコーディネーターを担う。一方、Two-phase commitは参加者に制約はなく、参加者ではないコーディネーターを利用することも可能である。しかし、Simple protocolと比較するとフロー中のステップ数が多くなっており、完了までの時間が長くなる。これらの各方式の詳細については、Two-phase commit protocol, Simple commit protocolで述べる。また、トランザクションの作成に関する詳細はCross-chain Transactionで述べる。

Two-phase commit protocol

Two-phase commit(2PC)は、Commit要求とCommitの2 phaseのフローをCoordinatorと参加者の間で実行するコミットプロトコルである。

プロトコルは下図のようなフローとなる。XはCoordinator, A, B, Cは各Participant, 矢印はフローの各ステップのリクエストの向きを示している。

Two-phase commitのフロー

  1. Initiate step

    • Initiator chainにMsgInitiateTxが提出され、バリデーション・認証が行われる。注記: この処理はコミットプロトコル共通である。
    • 認証完了後、Initiator chainはCoordinatorとしてMsgInitiateTxに指定された各Participant chainsにPrepareを要求するPacketであるPacketPrepareを送信する
  2. Prepare step

    • 各Participant chainsは、PacketPrepareを受け取ると、ResolvedContractTransactionで指定されるContract関数を実行する。
    • 実行に成功した場合、State storeに対しての変更の保存と並行するトランザクションとの競合を防ぐためのロックを取得する。この操作はState storeにより提供される。最後に、PacketPrepareAcknowledgementStatusに成功を示すPREPARE_RESULT_OKをセットしてCoordinatorに送信する
    • 実行に失敗した場合、State storeに対しての変更操作を破棄して、PacketPrepareAcknowledgementStatusに失敗を示すPREPARE_RESULT_FAILEDをセットしてCoordinatorに送信する。
  3. Confirm step

    • Coordinator chainは、各Participant chainが送信したPacketPrepareAcknowledgementを受け取ると、次のような状態遷移をおこなう。

      (1) 次のAcknowlegementの受信待ち

      (2) 受信したAcknowlegementのStatusPREPARE_RESULT_OKかつ未受信のPacketPrepareAcknowledgementがある場合、(1)に遷移する。すべて受信した場合、各Participant chainにCommit要求をするためにPacketCommitStatusCOMMITをセットして送信し、Commit stepに進む

      (3) 受信したAcknowlegementのStatusPREPARE_RESULT_FAILEDの場合、各Participant chainにAbort要求をするためにPacketCommitStatusABORTをセットして送信し、Commit stepに進む

  4. Commit step

    • 各Participant chainsは、Commit要求があった場合(PacketCommitStatusCOMMIT)、Prepare stepで保存していた変更操作をState storeに適用し、ロックを削除してCoordinator chainに完了済みを示すPacketCommitAcknowledgementを送信する
    • 各Participant chainsは、Abort要求があった場合(PacketCommitStatusABORT)、Prepare stepで保存していた変更操作とロックを削除してCoordinator chainに完了済みを示すPacketCommitAcknowledgementを送信する

Simple commit protocol

Simple commit protocolは、2者間でのAtomic Commit時に非Coordinator側の参加者がロックを避けることができるCommit Protocolである。そのためSimple commit protocolでは、Initiator chainはCoordinatorとParticipantのロールを兼ねる。

Simple commit flow

  1. Initiate step

    • Initiator chainにMsgInitiateTxが提出され、バリデーション・認証が行われる。注記: この処理はコミットプロトコル共通である。
  2. Prepare step(A)

    • AはMsgInitiateTxで指定されたContractTransactionを実行する。
    • 実行に成功した場合、State storeに対しての変更の保存と並行するトランザクションとの競合を防ぐためのロックを取得する。その後、BのContract関数の呼び出し情報を含む、Packet PacketDataCallを作成しBとのChannelに送信する。
    • 実行に失敗した場合、このTransactionの処理をAbortして終了する。
  3. Commit step(B)

    • BはPacketDataCallを受け取り、指定されたContract関数を実行する。
    • 実行に成功した場合、Commitを行う。その後、PacketCallAcknowledgementStatusとしてCOMMIT_OKをセットして、AとのChannelに送信する。
    • 実行に失敗した場合、Abortを行う。その後、PacketCallAcknowledgementStatusとしてCOMMIT_FAILEDをセットして、AとのChannelに送信する。
  4. Commit step(A)

    • AはPacketCallAcknowledgementを受け取り、そのStatusを確認する。
    • StatusCOMMIT_OKの場合、AはPrepare時に保存していたState storeの変更操作をコミットし、ロックを削除する。
    • StatusCOMMIT_FAILEDの場合、AはPrepare時に保存していたState storeの変更操作を破棄し、ロックを削除する。