Corda Time-windows
・はじめに
今回の記事は「Time-windows」についてです。Time-windows(以下、「タイムウィンドウ」と表記)はTransactionのコミット可能な時間帯を指定することができる機能です。KeyConceptの1つでありながら、概要は知っているが実装方法や使い方はよく知らないという方も多いのではないかと思います。したがって本記事では実装方法などを紹介していきます。
・概要
タイムウィンドウはアタッチメントと同様にTransactionに含めることで利用することができ、タイムウィンドウが含まれている場合、タイムウィンドウに設定した時間枠でのみコミットできます。
Notaryはタイムスタンプ機関であり、タイムウィンドウ外でのTransactionをコミットすることを拒否します。Notaryは二重支払い防止以外にも現在の時間が 、設定されたタイムウィンドウ内かどうかを確認します。タイムウィンドウを用いることで、例えば取引を9時~15時までとして、15時以降は拒否するなどが可能です。
・タイムウィンドウの時間指定方法
タイムウィンドウでの時間指定には設定ファイルなどに記述する必要はなく、コード上で設定します。具体的にはTransactionBuilderのsetTimeWindowで設定します。このパラメータにタイムウィンドウの情報を渡します。パラメータの渡し方として以下2種類の方法があります。
(1) 直接設定する。
(2) タイムウィンドウオブジェクトを生成し、設定する。
(1)は時刻と時間を渡し、その時刻の±時間がタイムウィンドウとして設定されます。様々なパターンのタイムウィンドウを設定するには、(2)のタイムウィンドウオブジェクトを作成する必要があります。
▼タイムウィンドウオブジェクト生成方法
TimeWindowクラスから対象のメソッドを呼び出して、戻り値としてタイムウィンドウオブジェクトを受け取ります。対象メソッドは以下の通りです。
※大文字アルファベットは時刻、小文字アルファベットは時間を表します。
・TimeWindow.between(A, B)
これは時刻AからBまでの間にコミットが可能ということ表すタイムウィンドウオブジェクトを返します。
・TimeWindow.fromOnly(A)
これは時刻Aからであればコミット可能ということを表すタイムウィンドウオブジェクトを返します。
・TimeWindow.untilOnly(B)
これは時刻Bまでであればコミット可能ということを表すタイムウィンドウオブジェクトを返します。
・TimeWindow.fromStartAndDuration(A,a)
これは時刻Aから時刻A+a時間までであればコミット可能ということを表すタイムウィンドウオブジェクトを返します。
・TimeWindow.withTolerance(A,a)
これは時刻A-a時間から時刻A+a時間までであればコミット可能ということを表すタイムウィンドウオブジェクトを返します。
(1)の直接設定するパターンでは、内部的にTimeWindow.withToleranceを呼び出しています。
以上がタイムウィンドウオブジェクトの生成方法です。
・記録されるTable
Stateを発行する(inputなし、outputあり)場合、Notaryの署名は必要ありませんでしたがタイムウィンドウが含まれている場合、Notaryの署名が必要になります。Stateを発行時にタイムウィンドウが含まれている場合はコミット時にNODE_NOTARY_COMMITTED_TXSとNODE_NOTARY_REQUEST_LOGにレコードが追加されます。Stateの更新や削除する(inputあり)場合では二重支払いの公証が入るため NODE_NOTARY_COMMITTED_STATESのテーブルにもレコードが記録されます。
・タイムウィンドウを利用する要件
タイムウィンドウは全てのTransactionに一括で適用されるものではなく、Transactionごとに設定できるため 柔軟に対応することができます。
ある契約に有効期限を設ける場合やある時間以降(以内)に決済を可能にする要件や時間外取引を禁止にする要件などで利用することができます。
・考察とまとめ
気をつけるべきことはタイムウィンドウの時間内にTransactionが生成されないといけないということではなく、この時間内にNotaryが署名しなければならないということです。まず、Transactionにタイムウィンドウが含まれている場合、そのTransactionにNotaryの署名が求められます。Notaryの認識する現在時刻がタイムウィンドウの時間枠内である場合、Notaryは署名を行います。時間枠外の場合、署名をせずにこれを拒否します。
ノードがTransactionを生成してNotaryが公証するまでに複数のStepがある場合やノード間の通信が混雑してしまっている場合には、想定している時刻と大幅にずれる可能性があります。また、各ノードとNotaryは自動では時刻同期をとっておらず、時刻がずれている可能性があることにも注意が必要です。
実装においては、Stateに日付や時刻のプロパティを持たせてContractでTransactionに含まれているタイムウィンドウと検証を行い、有効期限の制限をより強固にすることも可能です。例えば、図6のようなタイムウィンドウ外でTransactionが生成されることを認めないならば、これをContractで検証を行うことも可能です。
・おわりに
タイムウィンドウについて紹介しましたがとても簡単に実装できます。実装よりも要件として、どれくらいの時間枠を設けるかの方が難しいかもしれません。
今回は以上になります。
お問い合わせ: bc_prom@ml.tis.co.jp
記:TIS Blockchain Promotion Office (Hikaru Suzuki)
Thanks to Kiyotaka Yamasaki , Hideki Nakachi and Naoko Kanto.