Ethereum の署名の仕様はイエローペーパー
https://ethereum.github.io/yellowpaper/paper.pdf
に記載されています。
n = 115792089237316195423570985008687907852837564279074904382605163141518161494337
Rは点でx座標とy座標を持ちます。
n は secp256k1 の群位数です。
v=27は の値が奇数、v=28は の値が偶数を表します。
の値は の値から復元可能なので、 の値と v=27, v=28 の値から一意に復元できます。
リカバリーIDとして機能する値vが2種類しかないのは、 の値として、
オーバーフロー値 は採用しないようになっているからです。
一方、ビットコイン での署名では、リカバリーIDとして4種類の値を許しています。
の値が の場合、リカバリーIDは0または1、
の値が の場合、リカバリーIDは2または3となります。
1, 3 は が奇数, 0, 2 は が偶数となります。
ビットコインの場合もEthereumと同じLowerS形式( )を採用します。
Rを計算し、そのあとsを計算した時に s が HigherS形式( )になった場合は、
Rの値はそのままで を採用します。s' は を満たします。
s'を採用した場合はリカバリーIDの偶奇を反転させます。
なぜかというとs'を採用するということは'nonce=-nonceを採用した場合と同じで、
の値は変化せず、 の値はマイナスがつき、偶奇が反転しますので、
リカバリーIDを反転させているのです。