//tips
//pythonでのブロックチェーン記述
Sign.pyの内容を確認する。
//必要モジュールのインポート
import base58
import ecdsa
import filelock
import hashlib //ハッシュ関数SHA-256を使うために必要
import json
import sys
//下記部分がターミナルでの指示を可能にする部分(コマンドライン引数)
//コマンドの後に、空白で区切ってコマンドライン引数を指定する
//前回は公開鍵・秘密鍵部分を引数に使用した。
if len(sys.argv) != 4:
print('usage:', sys.argv[0], 'in-private in-public out-public')
exit()
コマンドラインの引数の個数はsys.argvとlen関数を組み合わせた
len(sys.argv)で取得することができ、
sys.argv[番号]とすると、指定した番号の引数を取得することができる。
ここではコマンドラインの引数が4個以外かどうかを判定し、
4個以外の場合に処理を実行させている。
先に下記コマンドで実行したが
Photon3 sign.py 入力秘密鍵 入力公開鍵 出力公開鍵
この場合sign.pyが引数番号0に当たる。
もし、4個以外の引数の場合は
usage: sign.py in-private in-public put-public
というsign.pyの使用法に関する記述がされる。
tx_key = base58.b58decode(sys.argv[1])
tx_in = base58.b58decode(sys.argv[2])
tx_out = base58.b58decode(sys.argv[3])
各変数に引数の鍵をBase58形式からバイト列に変換し、変数に格納。
変換した鍵をhexメソッドで16進数に表記を変換して表示。
print('key hex:', tx_key.hex())
print('in hex:', tx_in.hex())
print('out hex:', tx_out.hex())
SHA-256を使用し、トランザクションハッシュを作成。
sha = hashlib.sha256() //SHA256オブジェクト作成
sha.update(tx_in) //変数を使用しハッシュを更新
sha.update(tx_out) //変数を使用しハッシュを更新
hash = sha.digest()/ /結果のハッシュをhashに代入
このhashの長さと16進数表記で中身の記載を.hex()で行なっている
print('hash len:', len(hash))
print('hash hex:', hash.hex())
このトランザクションハッシュに対して、秘密鍵を用いて署名する必要があるので、
EcdsaモジュールのSigningKeyクラスのfrom_stringメソッドを使って、
秘密鍵の文字列から秘密鍵のオブジェクトを作り、変数keyに代入。
key = ecdsa.SigningKey.from_string(tx_key, curve=ecdsa.SECP256k1)
このkeyを使用して、signメソッドを呼び、hash(トランザクションハッシュ)に対して署名する。
sig = key.sign(hash)
署名内容表示。
print('sig len:', len(sig))
print('sig hex:', sig.hex())
署名というデータを作成する点で物理的な署名とは異なる。
トランザクションをtrans.txtに出力していく。
まずはロックファイルを作成。
with filelock.FileLock('trans.lock', timeout=10):
次に、trans.txtを読み込み、変数tx_listに代入。読み込めなかった場合には空のリストを代入。
try:
with open('trans.txt', 'r') as file:
tx_list = json.load(file)
except:
tx_list = []
tx_listにはトランザクションのリスト入っているので、そちらに新たに追加する形を取る。入力公開鍵と出力公開鍵、そして新たに作成した署名データが含まれることになる。.hexで16進数表記で格納する。
tx_list.append({
'in': tx_in.hex(),
'out': tx_out.hex(),
'sig': sig.hex()
})
新しいトランザクションを追加したリストをファイルに書き込む。
with open('trans.txt', 'w') as file:
json.dump(tx_list, file, indent=2)
Pythonでのファイルの読み書きはopen()を使用し、open(..., "w") にした場合、第一引数のファイルへの書き込みを行うことができる。ここでは書き込みを支持した後、json形式での書き込みを支持している。
Withはブロック処理を表し、終了のclose関数を使う必要がなく、コードを短縮できるよう。