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は