Pebble Coding

プログラマーの作業メモ

Ethereum の署名とBitcoin の署名

Ethereum の署名の仕様はイエローペーパー
https://ethereum.github.io/yellowpaper/paper.pdf
に記載されています。

 0 \lt R_x \lt n
 0 \lt s \lt n / 2 + 1
 v \in {27, 28}
n = 115792089237316195423570985008687907852837564279074904382605163141518161494337

Rは点でx座標とy座標を持ちます。
n は secp256k1 の群位数です。

v=27は R_y の値が奇数、v=28は R_y の値が偶数を表します。
 R_y の値は  R_x の値から復元可能なので、 R_x の値と v=27, v=28 の値から一意に復元できます。

リカバリーIDとして機能する値vが2種類しかないのは、 R_x の値として、
オーバーフロー値  n \lt {R_{x}} ^ {overflow} \lt p は採用しないようになっているからです。

一方、ビットコイン での署名では、リカバリーIDとして4種類の値を許しています。
 R_x の値が  0 \lt R_{x} \lt n の場合、リカバリーIDは0または1、
 R_x の値が  n \lt {R_{x}} ^ {overflow} \lt p の場合、リカバリーIDは2または3となります。
1, 3 は R_y が奇数, 0, 2 は R_y が偶数となります。

ビットコインの場合もEthereumと同じLowerS形式(  0 \lt s \lt n / 2 + 1 )を採用します。
Rを計算し、そのあとsを計算した時に s が HigherS形式(  n / 2 + 1 \lt  s \lt n )になった場合は、
Rの値はそのままで  s' = n - s を採用します。s' は  0 \lt s' \lt n / 2 + 1を満たします。
s'を採用した場合はリカバリーIDの偶奇を反転させます。
なぜかというとs'を採用するということは'nonce=-nonceを採用した場合と同じで、
 R_x の値は変化せず、 R_y の値はマイナスがつき、偶奇が反転しますので、
リカバリーIDを反転させているのです。