bitcoin rpc api createrawtransaction with python gibt -3 zurück: Erwartetes Typ-Array, erhaltenes Objekt

Experimentieren mit der JSON-RPC-API unter Verwendung von bitcoinrpc.authproxy für Python.

Bisher funktioniert es in allen Fällen. Akzeptieren Sie, wenn ich versuche, eine Rohtransaktion zu erstellen. Irgendwo auf dem Weg werden Parameter im falschen Format übergeben.

Ich habe Hilfsmethoden erstellt, um meine Eingaben/Ausgaben wie folgt zu erstellen:

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
    }

und wenn ich meinen Aufruf an createrawtransaction drucke, scheint es korrekt zu sein

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

TRANSACTION gibt [{'txid': 'sourcetransactionid', 'vout': 1}] <class 'list'> ein

TRANSACTION gibt {'destinationaddress': 0.012, 'changeaddress': 2.56559703} <class 'dict'> aus

Fehler:

bitcoinrpc.authproxy.JSONRPCException: -3: Array vom Typ erwartet, Objekt erhalten

Lösung

Dank @m1xolyd1an wurde ich in die richtige Richtung gelenkt. Alles, was in meiner Implementierung fehlte, war das Hinzufügen von [] um Eingaben herum. Ich habe sie in der Druckanweisung hinzugefügt, aber nicht im eigentlichen Anruf!

Vor

return svc.createrawtransaction(input, output)

nach

return svc.createrawtransaction([input], output)

neues Ergebnis:

new transaction: 0200000001005134d493cb536a5000b491b0b6dbca6c5187eec67ffb8769fdedac9ec25db40100000000ffffffff02804f12000000000017a914190150e1a961a2509b1d48c4d6cf6b644454cd968757ca4a0f0000000017a91496711dceda7240a6c492b2fabc5d44ab5d4bd19e8700000000

Ich denke, Sie sollten doppelte Anführungszeichen in Eingaben wie [{"txid":"id", "vout":n}] verwenden.
@AbhishekSinha Ich habe das anfangs versucht, aber dann war es '"xxxx"', auch der Fehler war derselbe

Antworten (1)

Sie stellen ihm ein Objekt in JSON bereit, kein Array, genau wie die Fehlerzustände.

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

Ich würde versuchen, es aus einem Wörterbuch zu erstellen und es dann einer Liste hinzuzufügen, anstatt es aus einer Zeichenfolge zu erstellen, etwa so:

>>> 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}]

Auch im Beispiel aus der Quelle vermerkt :

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)
Danke! Ja, ich dachte, ich bin immer noch ahnungslos, wie Python-Eingabe funktioniert. :) Ich versuche es auf diese Weise
Danke! Sieht so aus, als ob die Zeichenfolge immer noch in Ordnung ist, ich habe nur vergessen, [] um die Eingabe herum einzufügen, wenn ich die eigentliche API aufrufe