I'm trying to make a bitcoin transaction using the BlockCypher API and I'm getting an error when I try to sign the transaction.
This function creates an unsigned transaction:
def buildTransaction(fromAddress, toAddress, value = -1, feePreference = "low"):
# 'feePreference' Can be high, medium or low.
# 'value' in this transaction output, in satoshis.
# 'value' will be set to -1 to sweep all value from input address
data = {
'inputs': [{
"addresses": [fromAddress],
}],
'outputs': [{
"addresses": [toAddress],
"value": value
}],
"preference": feePreference
}
data = json.dumps(data)
print(data)
return blockcypherAPI.request('/txs/new', 'POST', data).json()
The function return object:
{
"tx": {
"addresses": [
"CEztKBAYNoUEEaPYbkyFeXC5v8Jz9RoZH9",
"C1rGdt7QEPGiwPMFhNKNhHmyoWpa5X92pn"
],
"block_height": -1,
"confidence": 0,
"confirmations": 0,
"double_spend": False,
"fees": 142700,
"hash": "afceb017a0d280a746ad5ed5c18228e302ebc2aa71ec768454b9a768f73c24c1",
"inputs": [
{
"addresses": [
"CEztKBAYNoUEEaPYbkyFeXC5v8Jz9RoZH9"
],
"age": 163376,
"output_index": 0,
"output_value": 23455,
"prev_hash": "457a538479fb50f3e060702594ef92962c2570d592b8e7c089d7b13fc9b5b3dc",
"script": "",
"script_type": "",
"sequence": 4294967295
},
...,
],
"lock_time": 0,
"outputs": [
{
"addresses": [
"C1rGdt7QEPGiwPMFhNKNhHmyoWpa5X92pn"
],
"script": "76a9145fb1af31edd2aa5a2bbaa24f6043d6ec31f7e63288ac",
"script_type": "pay-to-pubkey-hash",
"value": 1000000
},
...,
],
"preference": "high",
"received": "2015-10-21T19:11:35.774722671Z",
"relayed_by": "207.38.134.25, 127.0.0.1",
"size": 775,
"vsize": 775,
"total": 3773210,
"ver": 1,
"vin_sz": 17,
"vout_sz": 2
},
"tosign": ['798097d46807966f214079ae99a4989b6b320befc0212f88779437962b2f2585']
}
The problem starts in this function:
I need to use my private key to sign the data provided in the tosign array from what the previous function returned.
I am currently using the BlockCypher library to sign the transaction
def signature(unsigned_tx, privKey):
privkey_list = [privKey]
pubkey_list = [unsigned_tx['tx']['inputs'][0]['addresses'][0]]
#print(pubkey_list)
return make_tx_signatures(txs_to_sign=unsigned_tx['tosign'], privkey_list=privkey_list, pubkey_list=pubkey_list)
The function returns the following error:
Traceback (most recent call last):
File "/Users/user/PycharmProjects/blockcypherAPI/transaction.py", line 44, in <module>
print(transaction(fromAddress= "CEztKBAYNoUEEaPYbkyFeXC5v8Jz9RoZH9", fromPriv= "{PK}", toAddress= "C1rGdt7QEPGiwPMFhNKNhHmyoWpa5X92pn", value= -1))
File "/Users/user/PycharmProjects/blockcypherAPI/transaction.py", line 41, in transaction
sign = signature(unsignedTX, fromPriv)
File "/Users/user/PycharmProjects/blockcypherAPI/transaction.py", line 35, in signature
return make_tx_signatures(txs_to_sign=unsigned_tx['tosign'], privkey_list=privkey_list, pubkey_list=pubkey_list)
File "/Users/user/PycharmProjects/blockcypherAPI/venv/lib/python3.10/site-packages/blockcypher/api.py", line 1596, in make_tx_signatures
assert ecdsa_raw_verify(tx_to_sign, der_decode_sig(sig), pubkey_list[cnt]), err_msg
File "/Users/user/PycharmProjects/blockcypherAPI/venv/lib/python3.10/site-packages/bitcoin/main.py", line 507, in ecdsa_raw_verify
x, y = fast_add(fast_multiply(G, u1), fast_multiply(decode_pubkey(pub), u2))
File "/Users/user/PycharmProjects/blockcypherAPI/venv/lib/python3.10/site-packages/bitcoin/main.py", line 193, in decode_pubkey
if not formt: formt = get_pubkey_format(pub)
File "/Users/user/PycharmProjects/blockcypherAPI/venv/lib/python3.10/site-packages/bitcoin/main.py", line 174, in get_pubkey_format
else: raise Exception("Pubkey not in recognized format")
Exception: Pubkey not in recognized format
In addition, I would like to understand how to perform the signature independently without the blockCypher library
Thanks for the help!