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, 矢印はフローの各ステップのリクエストの向きを示している。
Initiate step
- Initiator chainに
MsgInitiateTx
が提出され、バリデーション・認証が行われる。注記: この処理はコミットプロトコル共通である。 - 認証完了後、Initiator chainはCoordinatorとして
MsgInitiateTx
に指定された各Participant chainsにPrepare
を要求するPacketであるPacketPrepare
を送信する
- Initiator chainに
Prepare step
- 各Participant chainsは、
PacketPrepare
を受け取ると、ResolvedContractTransaction
で指定されるContract関数を実行する。 - 実行に成功した場合、State storeに対しての変更の保存と並行するトランザクションとの競合を防ぐためのロックを取得する。この操作はState storeにより提供される。最後に、
PacketPrepareAcknowledgement
のStatus
に成功を示すPREPARE_RESULT_OK
をセットしてCoordinatorに送信する - 実行に失敗した場合、State storeに対しての変更操作を破棄して、
PacketPrepareAcknowledgement
のStatus
に失敗を示すPREPARE_RESULT_FAILED
をセットしてCoordinatorに送信する。
- 各Participant chainsは、
Confirm step
Coordinator chainは、各Participant chainが送信した
PacketPrepareAcknowledgement
を受け取ると、次のような状態遷移をおこなう。(1) 次のAcknowlegementの受信待ち
(2) 受信したAcknowlegementの
Status
がPREPARE_RESULT_OK
かつ未受信のPacketPrepareAcknowledgement
がある場合、(1)に遷移する。すべて受信した場合、各Participant chainにCommit要求をするためにPacketCommit
のStatus
にCOMMIT
をセットして送信し、Commit stepに進む(3) 受信したAcknowlegementの
Status
がPREPARE_RESULT_FAILED
の場合、各Participant chainにAbort要求をするためにPacketCommit
のStatus
にABORT
をセットして送信し、Commit stepに進む
Commit step
- 各Participant chainsは、Commit要求があった場合(
PacketCommit
のStatus
がCOMMIT
)、Prepare stepで保存していた変更操作をState storeに適用し、ロックを削除してCoordinator chainに完了済みを示すPacketCommitAcknowledgement
を送信する - 各Participant chainsは、Abort要求があった場合(
PacketCommit
のStatus
がABORT
)、Prepare stepで保存していた変更操作とロックを削除してCoordinator chainに完了済みを示すPacketCommitAcknowledgement
を送信する
- 各Participant chainsは、Commit要求があった場合(
Simple commit protocol
Simple commit protocolは、2者間でのAtomic Commit時に非Coordinator側の参加者がロックを避けることができるCommit Protocolである。そのためSimple commit protocolでは、Initiator chainはCoordinatorとParticipantのロールを兼ねる。
Initiate step
- Initiator chainに
MsgInitiateTx
が提出され、バリデーション・認証が行われる。注記: この処理はコミットプロトコル共通である。
- Initiator chainに
Prepare step(A)
- Aは
MsgInitiateTx
で指定されたContractTransaction
を実行する。 - 実行に成功した場合、State storeに対しての変更の保存と並行するトランザクションとの競合を防ぐためのロックを取得する。その後、BのContract関数の呼び出し情報を含む、Packet
PacketDataCall
を作成しBとのChannelに送信する。 - 実行に失敗した場合、このTransactionの処理をAbortして終了する。
- Aは
Commit step(B)
- Bは
PacketDataCall
を受け取り、指定されたContract関数を実行する。 - 実行に成功した場合、Commitを行う。その後、
PacketCallAcknowledgement
にStatus
としてCOMMIT_OK
をセットして、AとのChannelに送信する。 - 実行に失敗した場合、Abortを行う。その後、
PacketCallAcknowledgement
にStatus
としてCOMMIT_FAILED
をセットして、AとのChannelに送信する。
- Bは
Commit step(A)
- Aは
PacketCallAcknowledgement
を受け取り、そのStatus
を確認する。 Status
がCOMMIT_OK
の場合、AはPrepare時に保存していたState storeの変更操作をコミットし、ロックを削除する。Status
がCOMMIT_FAILED
の場合、AはPrepare時に保存していたState storeの変更操作を破棄し、ロックを削除する。
- Aは