cordaの遡及的検証についてコードリーディング
古いですが、ver3.1を見ました。
気になり
- txの遡及的検証は、誰に対してどう不足データをとりにいくのか
サマリー
もっていない依存Txとattachementは、全て愚直にotherSideに取りに行く
(otherSide = txの元の送り手。つまり1人)
得たTxは愚直に1つ1つverifyし、保存する
なおここでプライバシーの問題が発生する
流れ
ReceiveTransactionFlowが呼ぶ、
ResolveTransactionsFlow.call を起点にみる。 (Txもらう側のフロー)
1. 受け取ったtxのinputのtxHashesについて、 val newTxns = downloadDependencies(txHashes) (othersideから、幅優先で各txを遡及的に取得)
2. fetchMissingAttachments で、持っていないattachmenetについてotherSideに取りに行く
3. 各txを依存関係に基づいてトポロジカルソート。1つ1つ順番にコントラクト検証し、保存する。(この途中で死んでも整合性は問題ない)
downloadDependencies
以下を、知らないものがなくなるまで再帰的に行う。
1. 各txのinputs hashのうち、持っていないものについて以下を行う
FetchDataFlow.call により、Txデータ取得 (FlowSessingImpl.sendAndReceive => FlowStateMachineImpl.sendAndReceive)
2. とってきたtxのinput hashをまたqueueに積み、1を行う
(余談)ver3.1のときは max 5000回 再帰する制限だった。把握が難しい定数、みずほを思い出した
なおここで面白い問題がコメントされている
(1) 相手にもっていないTxを取りにいくかどうかで、これまでそのTxに関わったか判明してしまい、プライバシーに問題がある
(2) identityが途中でかわったときに、遡及的検証時では結果が異なってしまう