ビットコインにおける「マルチシグ」とは3. ・楕円曲線の場合、 r と s という2つの値を合わせて「デジタル署名」と言います。
・生成アルゴリズム:(楕円曲線の方程式は基本的に大文字=点、小文字=整数を表します。)
- r = Rx
= kG mod p
- s = k-1
(z + dr) mod n
-G, p, n は定数、 z は署名したいメッセージのハッシュ、 d は秘密鍵(整数)
-k が秘密鍵のような乱数で全ての取引ごとに新しく生成する必要があります。
・この2つの値と公開鍵(Q)を使って確認したい場合は下記のように確認します。
- w = s-1
mod n
- u1
= zw mod n
- u2
= rw mod n
- R = u1
G + u2
Q
- Rx
== r ならば OK、 違えば NG
デジタル署名とは
4. ・scriptPubkey - Outputとも呼ばれ、ビットコインを開放するための条件を課すパズルのようなもの。
・scriptSig - Inputとも呼ばれ、ビットコインを施錠する scriptPubkeyの解答を提出するもの。
ビットコインをもらうと、 scriptPubkeyがブロックチェーンに入ります。
ビットコインを送ると、 scriptSigがブロックチェーンに入ります。
なのに承認する時は実行する順番が逆
scriptSig ⇒ scriptPubkey で実行されます。
例:
scriptSig:
①OP_PUSHDATA 304402201e815830e3cdc6854643a96d0784863263a6c81907e3e156b8177bb0e58c1622
02206dd641de7908b832bc907d849f08901db02e46376f50d048183bc9b1e7578ab601
②OP_PUSHDATA 02d7697f67f07afc87e7bb19bdcd08607c7f87fbe934bb83a0af2245fc2725fe66
scriptPubkey:
③OP_DUP ④OP_HASH160 ⑤OP_PUSHDATA f8a60ea80148db1dd98a463151d315eb816d1035
⑥OP_EQUALVERIFY ⑦OP_CHECKSIG
スクリプトとは
9. Raw Output vs. P2SH
・1つの署名だと公開鍵がハッシュに守られる。
・でもマルチシグになると、公開鍵を全て晒さないといけなかった。
解決法:「scriptPubkeyは後で出すから、このハッシュだけ持っといて。」
それがPay To Script Hash = スクリプトのハッシュに対して支払う = P2SH
Raw Output:
<OP_0> <SIG_A> <SIG_C> <OP_2> <PUBKEY_A> <PUBKEY_B> <PUBKEY_C> <OP_3> <OP_CHECKMULTISIG>
P2SH:
<OP_0> <SIG_A> <SIG_C> <redeemScript> <OP_HASH160> <redeemScriptHash> <OP_EQUAL>
scriptSig scriptPubkey
scriptPubkeyscriptSig
10. 署名時の取引の扱い
・01000000 // バージョン
02 // 入力の数
c16ea48590……. // 参照先の取引ID(ハッシュ)
00000000 // 参照先の出力索引
ここ P2SH: <redeemscript> Raw Output: <scriptPubkey>
ffffffff // Sequence
48590c16ea……. // 参照先の取引ID(ハッシュ)
05000000 // 参照先の出力索引
00 // 現在署名中じゃないためOP_0を1個
ffffffff // Sequence
01 // 出力の数
6aa5090a00000000 // satoshis単位のビットコイン送金額
17a91436347564bb1c2c57a9221ca667191f0b125ff1f487 // scriptPubkey
00000000 // nLockTime
01000000 // SIG_HASH タイプ