トランザクション管理
このガイドは、Aptosブロックチェーン上で拡張出来るトランザクション管理ハーネスの構築方法について解説します。
背景
Aptosでは、トランザクションとアカウントベースのシーケンスNo.を提供する署名か承認のエンティティーの観点からトランザクションはアカウントにマッピングされます。Aptosネットワークが新しいトランザクションを受信すると、以下に関したいくつかのルールへ従います。
- アカウントから送信されたトラン ザクションは、アカウントによって適切に承認される必要が有ります。
- 最新の台帳更新が定義する現在時刻は、トランザクションの期限タイムスタンプより前である必要が有ります。
- トランザクションのシーケンス番号は、アカウントのオンチェーンのシーケンスNo.以上である必要が有ります。
最初のノードがトランザクションを受け入れると、そのトランザクションは追加のルールによってそのシステムを通過します。トランザクションシーケンスNo.が現在のオンチェーンシーケンスNo.よりも大きい場合、パスの全てのノードがオンチェーン状態と現在のシーケンスNo.間のシーケンスNo.でトランザクションを確認出来ている場合のみ、合意方向へ進行出来ます。
例 :
アリスは現在のオンチェーンシーケンスNo.が5のアカウントを所有しています。
アリスはボブのノードへシーケンスNo.6のトランザクションを提出します。
ノードを受け入れるボブはトランザクションを受け入れますが、ボブは5を見ていないためそれを進行しません。
進行させるためには、アリスがボブへトランザクションNo.5を送信するか、5がコミットされた事の合意をボブが知らされる必要があ有ります。後者ではアリスは他のノードを介してトランザクションを送信しました。
これ以外で2つの原則が残っています。
- 単一アカウントはブロックチェーンへ送信されるコミットされていないトランザクションを最大100保持出来ます。それ以上の場合はトランザクションは拒否されます。これはアリスが最初の100をノードボブへ送信し、次の100をノードキャロルへ送信した場合、黙 って起こる可能性が有ります。それら両方のノードが共通の流れを共有するなら、その流れはボブ経由で送信したアリスの100を受け入れますが、キャロル経由で送信したアリスの100は黙って拒否されます。
- 複数のノードへの異なるトランザクションの送信は結果として、先行する全てのトランザクションがコミットされた事を”送信された”が知るまで、トランザクションが送信したノードから進行しないゆっくりとした解決となります。例えば、アリスがボブ経由で最初の50を送信し、次にキャロル経由で50を送信する場合。
トランザクションマネージャーの構築
トランザクションのニュアンスを理解したので、堅牢なトランザクション マネージャーの構築について深堀りしましょう。これは以下のコアコンポーネントで構成されます。
- シーケンスNo.ジェネレーターは単一アカウントが使用可能なシーケンスNo.を管理し割り当てます。
- アプリケーションかユーザーからのペイロードを受け取り、シーケンスNo.ジェネレーターからのシーケンスNo.を受け取り、アカウントキーへアクセスして実行可能な署名済トランザクションへ3ピースを組み合わせるトランザクションマネージャー。これはトランザクションをブロックチェーンへプッシュする役割も有ります。
- オンチェーンワーカー、リーダーハーネ スは複数のアカウントが単一の共有アカウントの署名者を共有出来る様にします。
現在、このフレームワークは、ネットワークが実質的なキューを構築しない、遅延が殆ど無い送信が実行、コミットされたトランザクションだと仮定します。高い需要に対応するには以下のコンポーネントでこの作業を拡張する必要が有ります。
- トランザクションが優先してブロックチェーンへコミットする様、
base_gas_unit
価格を最適化します。 - トランザクション処理レートが期限タイマーを適切に設定される様処理します。
- トランザクションの失敗の扱いは無視するか送信し直すかのどちらかです。
注意:アカウントはトランザクションマネージャーの単一インスタンスが管理する必要が有ります。でなければ、トランザクションマネージャーの各インスタンスはメモリ内の状態が古くなり、シーケンスNo.が重複する可能性があります。