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
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)
Abhishek Sinha
Alma sónica