問題
EOS のステートデータ、つまり、マルチインデックステーブルのデータは、いつ更新されるのかは気になってきたので、少し調べてみました。
下記の記事を参考して整理しました。
EOS ソース解析 read only モードとは(原创| EOS 源码解析 什么是 read only 模式)
EOS DApp ハッキング解析トランザクション拒否によるなりすまし攻撃(原创| EOS DApp 攻击解析之利用交易未上链进行欺骗攻击)
結論
上記2つの記事を参考して、結論を先に出しますと
- dapp から API ノードにアクション(トランザクション)を送信すると、APIノードがトランザクションを実行して、API ノードのステートデータを更新して、pending として記録しておく
- API ノードが BP ノードからそのトランザクションを含めるブロックを受信すると、一旦 pending のトランザクションをロールバック(ステートデータもロールバックされる)してから、トランザクションを再度実行して、ステートデータを更新する
図に整理してみました。
ノードの実行モード
- 特に設定してない場合は、
SPECULATIVE
モードに設定される- このモードの場合は、上記の動きで処理される
- 記事1で紹介された
READ_ONLY
モードでは- dapp 側から
push transaction
を受信しても処理せず無視する - そのため、ステートデータの更新は、
BP
からのブロックブロードキャストを受けた時だけステートデータを更新する
- dapp 側から
まとめ
EOS のステートデータはブロックチェーンに乗ってないので、更新タイミングがよく分かりませんでした。
既にお分かりかもしれませんが、上記のフローの中では、ステートデータの更新タイミングがズレているところがあるので、それによって dapp
が被害されてしまうことは、既に出てしまいました。
別の記事で詳細をまとめる予定です。