Reality Keys(事実に関する認証局サービス)を使ってみる (2/3)

f:id:yzono:20150202001023j:plain

はじめに

今回はReality Keysから受け取った公開鍵を利用してP2SHトランザクションを作成するところについて書きます。

(2016/2/6 追記) この記事に書いてあるセットアップ手順は一部問題があります。詳しくは以下記事を参照ください。

目次

  • Pay to script hash(P2SH)とは
  • P2SHアドレス作成の流れ
  • realitykeysdemo.pyセットアップ
  • Aliceの公開鍵を作成(makekeysコマンド)

Pay to script hash(P2SH)とは

Pay to script hashによると以下のように定義されています(僕の日本語約が変なので直接サイトを見た方が良いです..)

Pay to script hash (P2SH)はBIP16で標準化されています。通常のビットコインのアドレスは公開鍵のハッシュ(1から始まる)ですが、P2SHはスクリプトのハッシュです(3から始まる)。P2SH経由の送金には、スクリプトの検証がTRUEになるようなスクリプトハッシュとデータが必要になります。

P2SHアドレスに対してビットコインを送金する時に、送金者は通常の送金と同じように3から始まるP2SH addressに対して送金できます。受け取り側はビットコインを消費するために何人かのデジタル署名が必要になります。

P2SHアドレスはトランザクションスクリプトから生成されます。通常のビットコインアドレスとの比較は以下のとおりです。

// 通常
A = RIPEMD160(SHA256(public key)) ※1

// P2SHアドレス
script hash = RIPEMD160(SHA256(script))

※1 Aはハッシュ済公開鍵(20bytes)。ビットコインアドレスはこの値にVersion PrefixとChecksum Suffixが付与された文字列。

ほとんどのP2SHアドレスはマルチシグネチャスクリプトをハッシュしているため、P2SHアドレスとマルチシグアドレスはnearly equalです。

P2SHアドレス作成の流れ

Reality Keys開発者Edgarが実装したrealitykeysdemo.pyを使ってP2SHアドレスを作成します。

登場人物はAliceとBobの2人です。以下流れになります。

  1. Aliceの公開鍵を作成(makekeysコマンド)
  2. Bobの公開鍵を作成(makekeysコマンド)
  3. 1と2で作成した公開鍵に対してビットコインを送金
  4. AliceがP2SHアドレスを作成して署名する
  5. 4のトランザクションに対して、Bobが署名する
  6. 5のトランザクションをブロードキャストする

1つずつ詳しく見ていきます。利用する「事実の証明」は既に結果が出ている以下を使います。

1 Bitcoin to be at least 1000 US Dollar on Jan. 10, 2014

「2014年1月9日のBTCの終値が$1,000を超えているか」という問いに対して、「NO」という事実が証明されて、NOの公開鍵の対応する秘密鍵が発行されています。

1 Bitcoin to be at least 1000 US Dollar on Jan. 10, 2014

[NO]
Private key: L4owdtHyHQEW6y3C6p1nojnURma8XpECVX3Qhy4eynSyVUwXCsc5 
Public key: 036d4f24332e9c49861591558f074a112f9718e47383c394106325ac5b65b9cd30

[YES]
Public key: 03ea19d70a96a072a1881a6177ab47144168f19f9648675eb189e35e4bde4b16cd

realitykeysdemo.pyセットアップ

realitykeysdemo.pyはpybitcointoolsを利用しているため、まずpybitcointoolsをインストールする必要があります。尚、pythonはバージョン2で実行する必要があります。

pybitcointoolsインストール

$ mkdir /home/xcp/realitykeys/ 
$ cd /home/xcp/realitykeys/
$ wget https://github.com/vbuterin/pybitcointools/archive/master.zip
$ unzip master.zip
$ rm master.zip
$ cd pybitcointools-master/
$ sudo python ./setup.py install

動作確認(mnemonic wordsから秘密鍵、公開鍵作成)

$ python
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from bitcoin import *
>>> priv = sha256('some big long brainwallet password')
>>> priv
'57c617d9b4e1f7af6ec97ca2ff57e94a28279a7eedd4d12a99fa11170e94f5a4'
>>> pub = privtopub(priv)
>>> pub
'0420f34c2786b4bae593e22596631b025f3ff46e200fc1d4b52ef49bbdc2ed00b26c584b7e32523fb01be2294a1f8a5eb0cf71a203cc034ced46ea92a8df16c6e9'

realitykeysdemo.pyインストール

$ wget https://raw.githubusercontent.com/edmundedgar/realitykeys-examples/master/realitykeysdemo.py
$ chmod +x realitykeysdemo.py

スクリプトが古いので以下2行を修正してください。

#from pybitcointools import * # https://github.com/vbuterin/pybitcointools
from bitcoin import *

#import simplejson
import json as simplejson

1. Aliceの公開鍵を作成(makekeysコマンド)

$ python ./realitykeysdemo.py makekeys
Your public key is:
040190c6e169d2aaadb45cae2964db48d48c16b42a9cf963aceda3644068a73f3d23a33a4efd87f2e73e9482bb7425a8500a2ca19124f1c2930df2aa5e726ff119
Please send this to the other party.

Your temporary address is:
1ERnz7DafLYP4GX3brhPGMq4mq1Mmyc3Pu
Please make payment to this address first.

Next step: Exchange keys, pay your stake to 1ERnz7DafLYP4GX3brhPGMq4mq1Mmyc3Pu, have them pay their stake to their address, then one of you runs:
If you are yes:
./realitykeysdemo.py setup <reality_key_id> 040190c6e169d2aaadb45cae2964db48d48c16b42a9cf963aceda3644068a73f3d23a33a4efd87f2e73e9482bb7425a8500a2ca19124f1c2930df2aa5e726ff119 <your_stake_in_satoshis> <their_public_key> <their_stake_in_satoshis>
If you are no:
./realitykeysdemo.py setup <reality_key_id> <their_public_key> <their_stake_in_satoshis>  040190c6e169d2aaadb45cae2964db48d48c16b42a9cf963aceda3644068a73f3d23a33a4efd87f2e73e9482bb7425a8500a2ca19124f1c2930df2aa5e726ff119 <your_stake_in_satoshis>

まとめ

今回はここまでにして、続きは次回書きます。

参考

Pay to script hash

bip-0016

edmundedgar/realitykeys-examples

Pybitcointools Multisig Tutorial

Module name for import seems to be 'bitcoin' not 'pybitcointools' #18

2to3を使ってコードをPython 3に移植する

TypeError: can't concat bytes to str, trying to use python3

登場! Python 3.0 - 2系との違いを比較