post Image
pycoinでビットコインの簡易ウォレットを作ってみた

概要

ビットコインウォレットの基本的な機能を実装したGUIアプリです。
このアプリで実際にビットコインをやり取りすることも可能です。
(動作の保証はできないのでオススメはしません。やるなら少額で…)

コード

https://github.com/momosuke4989/pycoin-demo

作った理由

ビットコインのバイブルであるMastering Bitcoinにpycoinというライブラリが紹介されていたので、pythonとビットコインの勉強がてら作成。
オープンソースカンファレンス2016 Tokyo/FallにてRaspberry Piに3.2インチ液晶のせたやつでデモやってました。
ウィンドウサイズの指定が妙に小さいのはこのためです。

使い方

README参照
key-generate.pyがビットコインアドレスの生成、create-tx.pyがトランザクションの生成となっています。

解説

そもそもビットコインウォレットって何?

一般的なユーザがビットコインを管理するためのアプリをウォレットと呼びます。
主な機能はビットコインの保管と受送信で、次の要素から構成されています。

  • 秘密鍵
  • ビットコインアドレス
  • トランザクションの作成
  • 電子署名の作成

秘密鍵とアドレス

ビットコインの世界では秘密鍵とビットコインアドレス(以下アドレス)という単位で利用者を識別しています。
銀行の世界に置き換えると、秘密鍵は暗証番号、アドレスは口座番号といったところでしょうか。
アドレスの生成には公開鍵暗号(正確には楕円曲線暗号)とハッシュ関数を用いますが、興味深いことに、この作業を管理する組織や団体は存在しません。
秘密鍵が取りうる値の範囲が十分に大きい(10^77)ので、アドレスが衝突する可能性を無視しても実用上問題ないのです。
このため、一人で複数のアドレスを持つことはビットコインの世界では当たり前であり、セキュリティの観点から取引ごとにアドレスを生成するのが望ましい、と言われているのですが、毎回秘密鍵とアドレスを生成するのはかなりの手間で、管理も煩雑になってしまいます。

Hierarchical Deterministic Wallet

この問題を解消すべく提案されたのがHierarchical Deterministic Wallet、通称HDウォレットという仕組みです。
HDウォレットでは一つのマスター鍵から複数の秘密鍵・アドレスを階層的に生成でき、マスター鍵さえあれば階層下にある全アドレスの残高も取得できるため、非常に便利です。

前置きが大分長くなってしまいましたが、key-generate.pyはこの仕組みに基づいて秘密鍵とアドレスを生成するアプリとなっています。

トランザクションと電子署名

ビットコインを誰かに送るには、トランザクションという形で送金情報をビットコインネットワークに送り、承認される必要があります。
しかし、ビットコインの世界ではどのアドレスがいくら持っているか、という情報はすべて公開されているため、例えば赤の他人のアドレスから自分自身へ送金させる、というトランザクションも簡単に作れてしまいます。万一こんなものが承認されたらたまりません。
このような事態を防ぐためには、正当な所有者でなければビットコインを動かせないようにすればよいのですが、ここで登場するのが秘密鍵による電子署名です。
ビットコインでは公開鍵暗号の特徴を活かして、電子署名を所有権の証明に応用しているのです。
なお、秘密鍵はWIF(Wallet Import Format)形式として扱います。圧縮WIF形式というのもありますが詳細は割愛します。
(ちなみに上述のアプリは圧縮WIF形式を採用しています)

create-tx.pyは署名付きトランザクションを生成、ネットワークに送信するまでを行うアプリとなっています。

雑感

実際にこうやって動くものを作ってみると、秘密鍵とアドレスは分離した状態で管理できる、ということが感覚的にわかったりして、勉強になりました。
今回作ったアプリはこのような形で公開することを想定していなかったため、ライセンスを明示していなかったり、色々ツッコミどころはあると思います。(後から追加・変更ってできるんですかね)
ここが変だとか、こうした方がいいとか、アドバイス等あればぜひコメントください。

参考

Mastering Bitcoinの各国語訳PDF置き場
https://www.bitcoinbook.info/translations-of-mastering-bitcoin/

pycoinのgithubリポジトリ
https://github.com/richardkiss/pycoin


『 Bitcoin 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。