1

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!

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.