bitcoin rpc api createrawtransaction con python devuelve -3: matriz de tipo esperado, objeto obtenido

experimentando con JSON RPC API usando bitcoinrpc.authproxy para python.

hasta ahora funciona en todos los casos, acepto cuando intento crear una transacción sin procesar. en algún lugar del camino estoy pasando parámetros en un formato incorrecto.

Creé métodos auxiliares para crear mis entradas/salidas así:

def getTransactionJsonInput(self, sourcetransaction) -> str: 
    return {"txid": sourcetransaction['txid'] ,"vout":sourcetransaction['vout']}

def getTransactionJsonOutput(self, new_address, amount, returnaddress, returnamount) -> str: 
    return {
        new_address: amount,
        returnaddress: returnamount
    }

y cuando imprimo mi llamada a createrawtransaction parece ser correcta

    print('TRANSACTION inputs', [input], type([input]))
    print('TRANSACTION outputs', output, type(output))
    return svc.createrawtransaction(input, output)

Entradas de TRANSACCIÓN [{'txid': 'sourcetransactionid', 'vout': 1}] <clase 'lista'>

Salidas de TRANSACCIÓN {'dirección de destino': 0.012, 'cambio de dirección': 2.56559703} <clase 'dict'>

error:

bitcoinrpc.authproxy.JSONRPCException: -3: matriz de tipo esperada, objeto obtenido

solución

gracias a @ m1xolyd1an me guiaron en la dirección correcta. Todo lo que faltaba en mi implementación era agregar [] alrededor de las entradas. ¡Los agregué en la declaración impresa pero no en la llamada real!

antes

return svc.createrawtransaction(input, output)

después

return svc.createrawtransaction([input], output)

nuevo resultado:

new transaction: 0200000001005134d493cb536a5000b491b0b6dbca6c5187eec67ffb8769fdedac9ec25db40100000000ffffffff02804f12000000000017a914190150e1a961a2509b1d48c4d6cf6b644454cd968757ca4a0f0000000017a91496711dceda7240a6c492b2fabc5d44ab5d4bd19e8700000000

Creo que deberías usar comillas dobles en entradas como [{"txid":"id", "vout":n}]
@AbhishekSinha intenté eso inicialmente, pero luego fue '"xxxx"' también el error fue el mismo

Respuestas (1)

Le está proporcionando un Objeto en JSON, no una matriz como dice el error.

 return {"txid": sourcetransaction['txid'] ,"vout":sourcetransaction['vout']}

Intentaría crearlo a partir de un diccionario y luego agregarlo a una lista en lugar de crearlo a partir de una cadena, algo como:

>>> inputs = {}   #create the dictionary
>>> inputs["txid"]=sourcetransaction['txid']  #add the value to the dictionary key 'txid'
>>> inputs["vout"]=sourcetransaction['vout']  #add nout value to key 'vout'  

>>> inputs
{'txid': 'a9d4599e15b53f3eb531608ddb31f48c695c3d0b3538a6bda871e8b34f2f430c', 'vout': 0}

>>> inputsList=[inputs] #add dictionary input to list 
>>> inputsList
[{'txid': 'a9d4599e15b53f3eb531608ddb31f48c695c3d0b3538a6bda871e8b34f2f430c', 'vout': 0}]

También se señaló en el ejemplo de la fuente :

def createrawtransaction(self, inputs, outputs):
    """
    Creates a raw transaction spending given inputs
    (a list of dictionaries, each containing a transaction id and an output number),
    sending to given address(es).
    Returns hex-encoded raw transaction.
    Example usage:
    >>> conn.createrawtransaction(
            [{"txid": "a9d4599e15b53f3eb531608ddb31f48c695c3d0b3538a6bda871e8b34f2f430c",
              "vout": 0}],
            {"mkZBYBiq6DNoQEKakpMJegyDbw2YiNQnHT":50})
    Arguments:
    - *inputs* -- A list of {"txid": txid, "vout": n} dictionaries.
    - *outputs* -- A dictionary mapping (public) addresses to the amount
                   they are to be paid.
    """
    return self.proxy.createrawtransaction(inputs, outputs)
¡gracias! sí, pensé que todavía no tenía ni idea de cómo funciona la tipificación de python... :) Intentándolo de esta manera
¡gracias! parece que la cadena todavía está bien, simplemente olvidé incluir la entrada de [] al llamar a la API real