//tips
//pythonでのブロックチェーン記述
Pipでpythonにモジュールを組み込もうとしたところ
zsh: command not found: pip
のエラーが発生。
そのそもpipの仕組み自体がないようなのでそちらからまず入れる。
pip install base58で失敗したのでpip3 install base58でトライしたらダウンロードできた。
サンプルプトグラムから公開鍵と秘密鍵を生成していく。
//モジュールのインポート
import base58
import ecdsa
import filelock
import json
//ecdsaモジュール機能で秘密鍵と公開鍵を作成
//ecdsaモジュールのSigningKeyクラスのgenerateメソッドを使用。
//ecdsa.SECP256k1は楕円曲線の種類。
private_key = ecdsa.SigningKey.generate(curve=ecdsa.SECP256k1)
//get_verifying_key()メソッドの使用で公開鍵作成。
public_key = private_key.get_verifying_key()
//変数の文字列変換
private_key = private_key.to_string()
public_key = public_key.to_string()
//秘密鍵の長さと内容の表示
print('private key len:', len(private_key))
print('private key hex:', private_key.hex())
//公開鍵の長さと内容の表示。内容はhexメソッドで16進法に変換
print('public key len:', len(public_key))
print('public key hex:', public_key.hex())
//b58encodeメソッドを使いBase58型に変換。異なるデータ構造を持つバイト列で結果を返すので文字列に直している。
//バイト列を直すには文字コードを指定する必要があり、asciiをこの場合は指定している。
private_b58 = base58.b58encode(private_key).decode('ascii')
public_b58 = base58.b58encode(public_key).decode('ascii')
print('private key base58:', private_b58)
print('public key base58:', public_b58)
//with文でファイル操作を指示する。
//JSONオブジェクトをPythonで扱うときは辞書型を使う。
with filelock.FileLock('key.lock', timeout=10):
try:
with open('key.txt', 'r') as file:
key_list = json.load(file)
except:
key_list = []
//appendでリストへの追加
key_list.append({
'private': private_b58,
'public' : public_b58
})
with open('key.txt', 'w') as file:
json.dump(key_list, file, indent=2)
これをlauncher経由で実行。launcherを開きfileからopenでファイルを選択する。すると、下記の内容が表示された。
private key len: 32
private key hex: 3295fb0f827a21876f01922877792221439807e3a08b9eb717d91468048ef9d3
public key len: 64
public key hex: 710071514c58814485bca8821131cf32b4aa4de202085b2df20d86517d9d87740d4b2d4ffcaad0a66b2eb810a599a0622f0a1178c246ea0aeb40168f43709e9a
private key base58: 4QU2fA8PE6NU95bDu2DiRP7pJ7p4Pwq3dSs1eAByeGLa
public key base58: 3G3B1MkMwVEDNwE1Vx5j99peMbABmVFheGgSG1NV3h762z8gZV5NGczQaXnTpqfvTkSW1VbAMFhr8eEbZ7hmCYB3
key.lockとkey.txtファイルが新たにフォルダに作成されており、key.txtファイルの中にはjson形式でbase58のkeyがそれぞれ格納されているのを確認できた。
[
{
"private": "4QU2fA8PE6NU95bDu2DiRP7pJ7p4Pwq3dSs1eAByeGLa",
"public": "3G3B1MkMwVEDNwE1Vx5j99peMbABmVFheGgSG1NV3h762z8gZV5NGczQaXnTpqfvTkSW1VbAMFhr8eEbZ7hmCYB3"
}
]
モジュールの機能を使うことでかなり簡易に作れることがわかった。
電子署名の方も確認する。
先程のスクリプトでさらに出力先用の公開鍵も作成する。再度先のプログラムを実行することで、key.txtファイルの中に下記のような二組の鍵を確認できるようになった。
[
{
"private": "4QU2fA8PE6NU95bDu2DiRP7pJ7p4Pwq3dSs1eAByeGLa",
"public": "3G3B1MkMwVEDNwE1Vx5j99peMbABmVFheGgSG1NV3h762z8gZV5NGczQaXnTpqfvTkSW1VbAMFhr8eEbZ7hmCYB3"
},
{
"private": "EXXZifNcoZ5Vxm6N8Z7pxeUzdT4DEkB46MR9PT9EcNK1",
"public": "35xdAyr3JdPqvK8UGum8HhWouEwxgyyiLgLMYeSnKdvmJhw4YeAXDj74PFDWGttgHxdATb41SPVh9eEYzhVjoKE7"
}
]
ターミナルでsign.pyスクリプトに先の鍵を読み込ませようとしているのだがうまくいかない。
cd Desktop
cd mycoin
pwd で現在地確認。
ls で目的地に自分のスクリプトがあるか確認。
python sign.py 入力秘密鍵 入力公開鍵 出力公開鍵
の順にインプットしている。
python sign.py 4QU2fA8PE6NU95bDu2DiRP7pJ7p4Pwq3dSs1eAByeGLa 3G3B1MkMwVEDNwE1Vx5j99peMbABmVFheGgSG1NV3h762z8gZV5NGczQaXnTpqfvTkSW1VbAMFhr8eEbZ7hmCYB3 35xdAyr3JdPqvK8UGum8HhWouEwxgyyiLgLMYeSnKdvmJhw4YeAXDj74PFDWGttgHxdATb41SPVh9eEYzhVjoKE7
そうすると下記のようにエラーが発生。
Traceback (most recent call last):
File "sign.py", line 1, in <module>
import base58
ImportError: No module named base58
ターミナルにpip3 show base58を入力。
Name: base58
Version: 2.1.0
Summary: Base58 and Base58Check implementation.
Home-page: https://github.com/keis/base58
Author: David Keijser
Author-email: keijser@gmail.com
License: MIT
Location: /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages
Requires:
Required-by:
ModuleNotFoundError(エラーメッセージはno module named <モジュール名>)は、importキーワードで指定したモジュールが存在しない場合に発生するエラー。
しょうがないのでmacでのpythonの使い方を探す。
色々見ているとpython3でターミナルコマンドを入力すればいいのではないかと気がつき入力したらこれで実行できた。
ターミナルの結果として以下を取得することができた。
key hex: 3295fb0f827a21876f01922877792221439807e3a08b9eb717d91468048ef9d3
in hex: 710071514c58814485bca8821131cf32b4aa4de202085b2df20d86517d9d87740d4b2d4ffcaad0a66b2eb810a599a0622f0a1178c246ea0aeb40168f43709e9a
out hex: 684f7b460f23c5c10761c78e6855b408958cd0723eb3f387b2651c98ed137774884a05f165b261a3484c149cba7bc42c07c6d61c936c1ece7ac30d9a74f1ba50
hash len: 32
hash hex: f9bd6229db4ea03d0daad6b9514d1cdd7840e03a8c64db023a1c3d7e037244eb
sig len: 64
sig hex: e93001c3ed87aca3f7ac0c54985420df7527bdc90df3d11a02ea0cb4653803b87674ffcad46af3a5bef64d0fae6d43ef77d83d16f650f6f616fe21595d760b7b
Sign.pyはBase58形式の鍵を16進数表記に直して再表示するもので、ここで入力と出力の公開鍵からトランザクションハッシュを出し、それに対して秘密鍵を用いて電子署名を行なっている。
このハッシュは送信元と受け取り手の公開鍵から生成されている点は注意しておく。送信元だけではない。
電子署名を行なったトランザクションはtrans.txtに保存し、マイニングプログラムで読み込めるようにしておく。
下記がtrans.txtである。
[
{
"in": "710071514c58814485bca8821131cf32b4aa4de202085b2df20d86517d9d87740d4b2d4ffcaad0a66b2eb810a599a0622f0a1178c246ea0aeb40168f43709e9a",
"out": "684f7b460f23c5c10761c78e6855b408958cd0723eb3f387b2651c98ed137774884a05f165b261a3484c149cba7bc42c07c6d61c936c1ece7ac30d9a74f1ba50",
"sig": "e93001c3ed87aca3f7ac0c54985420df7527bdc90df3d11a02ea0cb4653803b87674ffcad46af3a5bef64d0fae6d43ef77d83d16f650f6f616fe21595d760b7b"
}
]
上記の処理を行なったsign.pyの内容を確認していく。