概要
マイナンバーを用いた本人確認のためのRSA検証用のプレコンパイルコントラクトをRustで実装する
設計
プレコンパイルの形式に習い,使用可能ガスと,data, versionを入力として受け取り,残ったガスとデータを出力として返す.
fn rsa(
gas: U256,
data: &[u8],
version: VersionId,
) -> Result<(U256, Vec<u8>), (U256, Option<Vec<u8>>)>;
入力データ
- Signature [0..256 bytes] 256バイト
- Modulus [256..512 bytes] 256バイト
- Message [512..544] 32バイト
- Exponent [544..] 可変長
出力データ
出力データはプレコンパイルコントラクトのbn254_pairingに基づいて,検証成功なら1バイト(32バイト: 0x000 ... 0001)で,失敗なら(32バイト: 0x000 ... 0000)とする.
どちらもOk(_, Vec::)とする.
適切なガス
適切なガスを求めるために,以下の決定プロセスを提案する
-
既存プレコンパイルのベンチマーク計測
Rustの強力なベンチマークツール(criterion クレートなど)を使用して、Leviathanに実装済み、または実装予定の既存プレコンパイルの実行時間を計測します。
-
回帰分析による関数の導出
計測した「CPUの実行時間(ミリ秒/マイクロ秒)」をX軸、「イエローペーパーで定義されたガスコスト」をY軸にプロットし、線形回帰などで Gas=a×CPU Time+b のような係数を求めます。
-
RSA-2048検証ロジックの計測と当てはめ
チェック機構
・ガスは十分か:失敗した場合はOOGで例外停止
・入力データは適切か(>544) : 失敗した場合は例外停止
→bn_pairingが不適切なデータの場合は例外停止しているから
概要
マイナンバーを用いた本人確認のためのRSA検証用のプレコンパイルコントラクトをRustで実装する
設計
プレコンパイルの形式に習い,使用可能ガスと,data, versionを入力として受け取り,残ったガスとデータを出力として返す.
入力データ
出力データ
出力データはプレコンパイルコントラクトのbn254_pairingに基づいて,検証成功なら1バイト(32バイト: 0x000 ... 0001)で,失敗なら(32バイト: 0x000 ... 0000)とする.
どちらもOk(_, Vec::)とする.
適切なガス
適切なガスを求めるために,以下の決定プロセスを提案する
既存プレコンパイルのベンチマーク計測
Rustの強力なベンチマークツール(criterion クレートなど)を使用して、Leviathanに実装済み、または実装予定の既存プレコンパイルの実行時間を計測します。
回帰分析による関数の導出
計測した「CPUの実行時間(ミリ秒/マイクロ秒)」をX軸、「イエローペーパーで定義されたガスコスト」をY軸にプロットし、線形回帰などで Gas=a×CPU Time+b のような係数を求めます。
RSA-2048検証ロジックの計測と当てはめ
チェック機構
・ガスは十分か:失敗した場合はOOGで例外停止
・入力データは適切か(>544) : 失敗した場合は例外停止
→bn_pairingが不適切なデータの場合は例外停止しているから