pycoin学習ノート(5)ローカル対取引署名(p 2 pkh)

4083 ワード

注:本編のすべての実験はビットコインテストネットワーク(testnet)の下で行われた.
今回の実験では,第三者財布の署名機能を利用しない取引に対してローカル署名を行った.
今回のシーンでは、mh 4 x 1 pgjqLmjVUJxfdj 3 qV 8 BJaYARLdh 9の0.2 btcを2 N 113 Ujyc 6 Pj 7 kvnZMyZNpAtAfj 9 EzoHStQに移動します.
開始コード:
from pycoin.ecdsa import generator_secp256k1, public_pair_for_secret_exponent
from pycoin.encoding import wif_to_secret_exponent, public_pair_to_sec
from pycoin.tx.Tx import Tx
from pycoin.tx.pay_to import build_hash160_lookup
from pycoin.tx.tx_utils import create_tx


exponent = wif_to_secret_exponent("KyBuY4RgVcvGfyqhv3DmET5UpYT3rA74nR3uY7cCA1JLXbDiSgsS")

mh 4 xx 1 pgjqLmjVUJxfdj 3 qV 8 BJaYARLdh 9の秘密鍵を初期化します.△これは非常に機密的なもので、決してネットに露出してはいけませんが、testnetなので、どうでもいいです.
src_tx_hex = "01000000000101d56e1e4579ac2b407c105eb02d9749a73defd082837229dc290260d199f8283501000000171600148c943eca5ee4d2fef125ba53efc267b1f012a7abffffffff02002d3101000000001976a9141105fb9ff85657afb12a5c814776346b23db3a6688ac3e62fb040000000017a9143d7b2397ebb714da591028219b1162d6f21b4037870247304402204069d19f33b5b3b2bbfd8808059b73fccb288d9bd7273eae9178c24232d0ab360220723dd5d2f16a63ff3794e4a8c5381a616c6f5266b4427dd9808674a51a914dc4012103edaad325dd4297b31a5953aec10e6a0240f404ba4a4eb72f51be2a4b7ae8c02100000000"
src_tx = Tx.from_hex(src_tx_hex)
spendable = src_tx.tx_outs_as_spendable()[0]

間もなく費やされる取引を初期化します.
to_address = "2N113Ujyc6Pj7kvnZMyZNpAtAfj9EzoHStQ"
unsigned_new_tx = create_tx([spendable],[(to_address, 19990000)])
unsigned_new_tx_hex = unsigned_new_tx.as_hex()
print(unsigned_new_tx_hex)
#01000000013fe9b07e927cd99ec70c92cdb083a3cb133253c1106064b14727ff68a284be150000000000ffffffff01f00531010000000017a914551268f89b61451ad1bd9912d8277b31e17764d18700000000

署名されるべき取引を作成し、0.2 btcを2 N 113 Ujyc 6 Pj 7 kvnZMyZNpAtAfj 9 EzoHStQに転送します.ここは実際には0.1999 btcで、少なくなった0.0001 btcは実は鉱夫への苦労費です.
rom bitcoinrpc.authproxy import AuthServiceProxy
conn = AuthServiceProxy("http://%s:%[email protected]:18332"%("fftest","fftest123"))
print(conn.decoderawtransaction(unsigned_new_tx_hex))
#{'txid': '80436f3af55c5940e6ff7babd98699b3a7b0f4a698b3eb61c3a9a561510e5ba3', 'hash': '80436f3af55c5940e6ff7babd98699b3a7b0f4a698b3eb61c3a9a561510e5ba3', 'version': 1, 'size': 83, 'vsize': 83, 'locktime': 0, 'vin': [{'txid': '15be84a268ff2747b1646010c1533213cba383b0cd920cc79ed97c927eb0e93f', 'vout': 0, 'scriptSig': {'asm': '', 'hex': ''}, 'sequence': 4294967295}], 'vout': [{'value': Decimal('0.19990000'), 'n': 0, 'scriptPubKey': {'asm': 'OP_HASH160 551268f89b61451ad1bd9912d8277b31e17764d1 OP_EQUAL', 'hex': 'a914551268f89b61451ad1bd9912d8277b31e17764d187', 'reqSigs': 1, 'type': 'scripthash', 'addresses': ['2N113Ujyc6Pj7kvnZMyZNpAtAfj9EzoHStQ']}}]}

jsonrpcで新しい取引を表示します.この手順は重要ではありません.
solver = build_hash160_lookup([exponent])
signed_new_tx = unsigned_new_tx.sign(solver)
print(signed_new_tx.bad_signature_count())
#0
signed_new_tx_hex = signed_new_tx.as_hex()
print(signed_new_tx_hex)
#01000000013fe9b07e927cd99ec70c92cdb083a3cb133253c1106064b14727ff68a284be15000000006a47304402201216e53509fccdd6d71a6a4f5ac029921cc3ef49196f64aeddc97660e8149755022039eb50609def923b09e43c9f5d08649a1349249afafc4cae918e350f8ac1f3370121027d3bac55298238844b087f727c63965f728bda4955c778c7609053646f03977dffffffff01f00531010000000017a914551268f89b61451ad1bd9912d8277b31e17764d18700000000

ここで最も重要な署名ステップに着き、まず秘密鍵の辞書を構築し、signを直接呼び出して署名し、署名後の取引を得る.複雑なものはすべてpycoinにカプセル化され、さらにpycoinの実現ソースコードをよく研究する必要がある.
txid = conn.sendrawtransaction(signed_new_tx_hex)
print(txid)
#dae85dc12e57d42bb6a7d8d3627fbff628751cfa44eb96c9edd467a1d82014b2

ビットコインネットワークにブロードキャスト:https://test-insight.bitpay.com/tx/dae85dc12e57d42bb6a7d8d3627fbff628751cfa44eb96c9edd467a1d82014b2