東大ブロックチェーン公開講座まとめ
楕円曲線暗号 <Bitcoin>
x,y
が楕円曲線上の点で、公開鍵の生成元となる。p = 2^256
は楕円曲線上の点を元とした有限体の位数であり、mod p
で位数を超えないことで有界, 閉性を保っている。
この生成元に秘密鍵となるスカラー値を乗算する(スカラー倍)ことで公開鍵が導出される。
これはつまり公開鍵が2^256
個存在し、それに対応する秘密鍵も2^256
個存在するということ。
公開鍵は座標, 秘密鍵はスカラー値
Base58Check <Bitcoin>
Base64に対して、見間違えやすい文字l, I, O, 0, +, \
が除かれたBase58にchecksumの機能を追加したエンコーディング方式で、公開鍵からそのアドレスを導出する際に用いられる。
手順は以下
- 公開鍵をpayloadとし、version prefix(ウォレットの用途, bitcoinテストネットか、メインネットかなど)を付加したものを二度SHA256へ通し、その先頭をchecksumとする
- version prefix, 公開鍵, checksumを連結し、Base58Checkを通すことでその公開鍵のアドレスが得られる。
WIP(Wallet Import Format)という秘密鍵のフォーマットもこのBase58Checkを用いており、より判別しやすい文字列としてウォレットをインポートできるように設計されている。
公開鍵の圧縮
公開鍵はトランザクションに含める必要があり、フルノードの圧迫に繋がるので、そのデータが大きいことは好ましくないので、大概の場合は圧縮される。
xからy座標は求めることができる為、方程式のx座標(32bytes)とyが偶数か奇数かのデータ(1byte)のみへ圧縮することができる。
UTXO <Unspent Transaction Output>
これはアドレスを表現する意味論的な部分。
実際のところアカウントのようなエンティティは存在せず、未使用のトランザクション(UTXO)とそのTXへアクセスできるようUnlocking Scriptを施錠できる秘密鍵によってアカウントを表現している。
UTXOは送金の際以下に分割される
- 任意のアドレスへ送金する額
- 送金しない額(お釣り)
- Gas fee
UTXOを使用する際には署名でLocking ScriptとUnlocking Scriptがtrueとなるよう構成し、送信先の公開鍵をLocking Scriptに含めてネットワークにブロードキャストする。Unlocking ScriptとLocking Scriptが無効である場合はノードによって不正と見做され伝搬がなされない。
TXの種類
Unlocking/Locking Scriptは五種類存在する
- 標準的なP2PKH<
OP_CHECKSIG
> - マイニング報酬を受け取るP2PK <
OP_CHECKSIG
> - 支払いとは関係のないデータアウトプット <
OP_RETURN
>- (bitcoinをDB利用: タイムスタンプとファイルのHashによりその時間に存在していたことを証明)
-
OP_RETURN <data>
このデータは80bytesまで
- Multi-Sig用のTX <
CHECKMULTISIG
> - より複雑な処理が可能なP2SH
- SenderがMulti-sigのようなより複雑なLocking Scriptを生成する際に発生するGas feeを回避できる。
- SenderはLocking ScriptをHash化し、Recipientが実際にそのScriptを展開し、そのHashと等価であるか確かめる。
Bitcoin Script
TXデータに含まれる簡単なスクリプトで、左から右へ実行される。
2 3 OP_ADD 5 OP_EQUAL
というように宣言され、この場合は2,3がStackに積まれ、ADDのオペレーションが実行され、その値が5と等価であるか評価される為、trueがこのスクリプトの結果となる。
送信元が作成したLocking Script
OP_DUP OP_HASH160 <recipient public key Hash> OP_EQUALVERIFY OP_CHECKSIG
に対してUnlocking Scriptを連結することで
<recipient signature> <recipient public key> OP_DUP OP_HASH160 <recipient public key Hash> OP_EQUALVERIFY OP_CHECKSIG
となり、実行した際には、
- StackにSigとPkが積まれる
- PkをCopyし、Hash160に通しPk'を生成
- Pk'とLocking Script作成時に挿入されたPk Hashが等価か評価しtrueなら処理を続行する
- Sigを評価し、問題なければ処理を終了する
という手順で実行される。