Reality Keys(事実に関する認証局サービス)を使ってみる (2/3)
はじめに
今回は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人です。以下流れになります。
- Aliceの公開鍵を作成(makekeysコマンド)
- Bobの公開鍵を作成(makekeysコマンド)
- 1と2で作成した公開鍵に対してビットコインを送金
- AliceがP2SHアドレスを作成して署名する
- 4のトランザクションに対して、Bobが署名する
- 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>
まとめ
今回はここまでにして、続きは次回書きます。
参考
edmundedgar/realitykeys-examples
Pybitcointools Multisig Tutorial
Module name for import seems to be 'bitcoin' not 'pybitcointools' #18