Open5

東大ブロックチェーン公開講座まとめ

0xKoh0xKoh

楕円曲線暗号 <Bitcoin>

y^2 \mod p= (x^3 + 7)\mod p

x,yが楕円曲線上の点で、公開鍵の生成元となる。p = 2^256は楕円曲線上の点を元とした有限体の位数であり、mod pで位数を超えないことで有界, 閉性を保っている。

この生成元に秘密鍵となるスカラー値を乗算する(スカラー倍)ことで公開鍵が導出される。

これはつまり公開鍵が2^256個存在し、それに対応する秘密鍵も2^256個存在するということ。

公開鍵は座標, 秘密鍵はスカラー値

0xKoh0xKoh

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)のみへ圧縮することができる。

0xKoh0xKoh

UTXO <Unspent Transaction Output>

これはアドレスを表現する意味論的な部分。
実際のところアカウントのようなエンティティは存在せず、未使用のトランザクション(UTXO)とそのTXへアクセスできるようUnlocking Scriptを施錠できる秘密鍵によってアカウントを表現している。

UTXOは送金の際以下に分割される

  • 任意のアドレスへ送金する額
  • 送金しない額(お釣り)
  • Gas fee

UTXOを使用する際には署名でLocking ScriptとUnlocking Scriptがtrueとなるよう構成し、送信先の公開鍵をLocking Scriptに含めてネットワークにブロードキャストする。Unlocking ScriptとLocking Scriptが無効である場合はノードによって不正と見做され伝搬がなされない。

0xKoh0xKoh

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と等価であるか確かめる。
0xKoh0xKoh

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を評価し、問題なければ処理を終了する

という手順で実行される。