Python3でビットコインアドレスを生成してみる

https://qiita.com/kaz1shuu2/items/921dcbebb7fbea14f085で投稿されているのをそのままやるだけになります。果たしてうまくいくのか・・・

構築場所

今回はコマンドで実行するだけになりますので、ユーザーのホームディレクトリ直下にaddress.pyというpythonファイルを作成して実行するようにします

環境

サーバーの環境は以下の通りです
・CebtOS7
・Python3.6
・インストール場所
・pip 18.0

Pythonのバージョンはデフォルトで2系ですがCentOS7のPythonを2系から3系に変えてみるで3系に変えている前提となります。

必要なモジュールのインストール

僕がそのままコード書いて試したらモジュールがないよーと怒られてしまったので、まず必要なモジュールをインストールします

ecdsaのインストール

[macan@localhost ~]$ sudo pip install ecdsa
[macan@localhost ~]$ pip show ecdsa
Name: ecdsa
Version: 0.13
Summary: ECDSA cryptographic signature library (pure python)
Home-page: http://github.com/warner/python-ecdsa
Author: Brian Warner
Author-email: warner-pyecdsa@lothar.com
License: MIT
Location: /usr/lib/python3.6/site-packages
Requires: 
Required-by: 
[macan@localhost ~]$ 

Locationの位置がインストール先になります。モジュールは同じディレクトリにないといけないので移動させます

[macan@localhost ~]$ sudo cp -R /usr/lib/python3.6/site-packages/ecdsa ~
[macan@localhost ~]$ sudo chown -R macan:macan ecdsa

ホームディレクトリ直下にコピーして所有者を変えております

base58.pyのインストール

[macan@localhost ~]$ sudo pip install base58
[macan@localhost ~]$ pip show base58
Name: base58
Version: 1.0.2
Summary: Base58 and Base58Check implementation
Home-page: https://github.com/keis/base58
Author: David Keijser
Author-email: keijser@gmail.com
License: MIT
Location: /usr/lib/python3.6/site-packages
Requires:
Required-by:
[macan@localhost ~]$

Locationの位置がインストール先になります。モジュールは同じディレクトリにないといけないので移動させます

[macan@localhost ~]$ sudo cp -R /usr/lib/python3.6/site-packages/base58.py ~
[macan@localhost ~]$ sudo chown -R macan:macan base58.py

必要なモジュールがインストールできました。

コードを書いてみる

キータにあるコードを書いていきます

# coding: utf-8
import secrets
import ecdsa
import hashlib
import base58
class Generator():
   def __init__(self):
       p = 2**256-2**32-2**9-2**8-2**7-2**6-2**4-1
       privkey  = self.new_privkey(p)
       pubkey = self.new_pubkey(privkey)
       address = self.new_address(bytes.fromhex("00"), pubkey)
   def new_privkey(self, p):
       privkey = secrets.randbelow(p)
       privkey = format(privkey, 'x')
       print("秘密鍵 = " + privkey)
       return privkey
   #公開鍵
   def new_pubkey(self, privkey):
       bin_privkey = bytes.fromhex(privkey)
       signing_key = ecdsa.SigningKey.from_string(bin_privkey, curve = ecdsa.SECP256k1)
       verifying_key = signing_key.get_verifying_key()
       pubkey = bytes.fromhex("04") + verifying_key.to_string()
       pubkey = pubkey.hex()
       print("公開鍵 = " + pubkey)
       return pubkey
   #アドレス
   def new_address(self, version, pubkey):
       ba = bytes.fromhex(pubkey)
       digest = hashlib.sha256(ba).digest()
       new_digest = hashlib.new('ripemd160')
       new_digest.update(digest)
       pubkey_hash = new_digest.digest()
       pre_address = version + pubkey_hash
       address = hashlib.sha256(pre_address).digest()
       address = hashlib.sha256(address).digest()
       checksum = address[:4]
       address = pre_address + checksum
       address = base58.b58encode(address)
       address = address.decode()
       print("アドレス = " + address + "\n")
       return address
address = Generator()
[macan@localhost ~]$

とにかく書くのが大事なので、コピペでもいいですが書く事をお勧めします。本当に動くの?と思うかもしれないので、その場合は一度コピペして動いたら今度は書いてみるというのがいいかもしれません。

動くかチェック

ブラウザチェックをするわけではないので、そのまま実行します

[macan@localhost ~]$ python address.py
秘密鍵 = cf294eb16ad87f5bb6a51f1812ac87759aa6fcdd17b156a6469eb48d661f88a3
公開鍵 = 0496bfcfdb3ea2677254119fe608b4bbf9e71f7228cbfbdfc967774089f83a89a42574189b355c174b4bc4d184f9cd88af726064b634a429a7e4f18143fd1448c7
アドレス = 17Hb6zTwvjQRgnBqbrjzTHi12tepBmNiGW

動きました。これで完成です

お役に立ちましたか?

投げ銭をいただけるともっと頑張れます!
・note
・仮想通貨(bitflyer)
のどちらでも構いません
ビットコインアドレスは以下になります
3LHnADwZwUbic2L45EnVJEykiG6KfbqrwS

この記事が気に入ったらサポートをしてみませんか?