Ich rufe seit einiger Zeit die HTTP-Methode getrawtransaction
auf, um Rohtransaktionen abzurufen. Bis vor kurzem bekam ich das time
Feld bei jeder Transaktion. Allerdings ist mir in den letzten Tagen aufgefallen, dass dieses Feld bei einigen Transaktionen nicht mehr vorhanden ist. Was ist mit diesem Feld passiert?
Hier ist ein Beispiel, das das time
Feld/den Wert hat:/usr/local/bin/bitcoin-cli getrawtransaction b6a26cc6d1573473724ad3bd49b16a33a69a738f4d1eb9e5992e39ec0be086a9 1
{
"result":{
"hex":"01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4b03e8d0030551fdc4495efabe6d6d7a81d2b72c3811f3a24b5a5d4431f46d284993aa067a25ec6abdb030209eacb8010000000000000000454d432055533200d0298378097f0000a19d0000ffffffff01b11d0096000000001976a914740ecaf436d5867903c722d783fc994c25a29b1588ac00000000",
"txid":"b6a26cc6d1573473724ad3bd49b16a33a69a738f4d1eb9e5992e39ec0be086a9",
"hash":"b6a26cc6d1573473724ad3bd49b16a33a69a738f4d1eb9e5992e39ec0be086a9",
"size":160,
"vsize":160,
"version":1,
"locktime":0,
"vin":[
{
"coinbase":"03e8d0030551fdc4495efabe6d6d7a81d2b72c3811f3a24b5a5d4431f46d284993aa067a25ec6abdb030209eacb8010000000000000000454d432055533200d0298378097f0000a19d0000",
"sequence":4294967295
}
],
"vout":[
{
"value":25.16590001,
"n":0,
"scriptPubKey":{
"asm":"OP_DUP OP_HASH160 740ecaf436d5867903c722d783fc994c25a29b15 OP_EQUALVERIFY OP_CHECKSIG",
"hex":"76a914740ecaf436d5867903c722d783fc994c25a29b1588ac",
"reqSigs":1,
"type":"pubkeyhash",
"addresses":[
"1Baf75Ferj6A7AoN565gCQj9kGWbDMHfN9"
]
}
}
],
"blockhash":"000000000000003d8ec00e2cbaf8090697b1598abe1e209960e55f0884d6044e",
"confirmations":10,
"time":1375585378,
"blocktime":1375585378
},
"id":"bitcoin"
}
Hier ist ein Beispiel, das das time
Feld/den Wert nicht hat: /usr/local/bin/bitcoin-cli getrawtransaction 0a5c687bafb7f5008028efc4dcdd510c15be86347b0607e5bf461f211ecbaf78 1
.
{
"result": {
"hex": "010000000153af347ad5e3c28296b7fc833a02612dbf9a5b76752133b18fd51a532803556c010000006a473044022052622e673e12298315553671df71c4795a5baffb5992ae2b90a95f84539a8d9302200c81def7655facab2f3860345a9b35fe157e2b08b27721f7af49c5ec80483d9a012103628a2f0c158be42a1c8ce37dfffd9951dd3c8bf9ca13e592b864e46784cc9ebffeffffff0292cf032f070000001976a914df01a3394df97f114943a8e37ada789ea6d7bef788ac00e1f505000000001976a9141e5e089913ff694d2f3f3b8ed1ec1e24bdc311c488ac1f020700",
"txid": "0a5c687bafb7f5008028efc4dcdd510c15be86347b0607e5bf461f211ecbaf78",
"hash": "0a5c687bafb7f5008028efc4dcdd510c15be86347b0607e5bf461f211ecbaf78",
"size": 225,
"vsize": 225,
"version": 1,
"locktime": 459295,
"vin": [
{
"txid": "6c550328531ad58fb1332175765b9abf2d61023a83fcb79682c2e3d57a34af53",
"vout": 1,
"scriptSig": {
"asm": "3044022052622e673e12298315553671df71c4795a5baffb5992ae2b90a95f84539a8d9302200c81def7655facab2f3860345a9b35fe157e2b08b27721f7af49c5ec80483d9a[ALL] 03628a2f0c158be42a1c8ce37dfffd9951dd3c8bf9ca13e592b864e46784cc9ebf",
"hex": "473044022052622e673e12298315553671df71c4795a5baffb5992ae2b90a95f84539a8d9302200c81def7655facab2f3860345a9b35fe157e2b08b27721f7af49c5ec80483d9a012103628a2f0c158be42a1c8ce37dfffd9951dd3c8bf9ca13e592b864e46784cc9ebf"
},
"sequence": 4294967294
}
],
"vout": [
{
"value": 308.5354997,
"n": 0,
"scriptPubKey": {
"asm": "OP_DUP OP_HASH160 df01a3394df97f114943a8e37ada789ea6d7bef7 OP_EQUALVERIFY OP_CHECKSIG",
"hex": "76a914df01a3394df97f114943a8e37ada789ea6d7bef788ac",
"reqSigs": 1,
"type": "pubkeyhash",
"addresses": [
"1ML9eZVM3NTLvM25w4eYfWLQC9gHwRuBJb"
]
}
},
{
"value": 1,
"n": 1,
"scriptPubKey": {
"asm": "OP_DUP OP_HASH160 1e5e089913ff694d2f3f3b8ed1ec1e24bdc311c4 OP_EQUALVERIFY OP_CHECKSIG",
"hex": "76a9141e5e089913ff694d2f3f3b8ed1ec1e24bdc311c488ac",
"reqSigs": 1,
"type": "pubkeyhash",
"addresses": [
"13mZvKjZ3TtzfL7z4EqsG5sMNWayzjNHtY"
]
}
}
]
},
"error": null,
"id": "bitcoin"
}
Mir ist aufgefallen, dass dies bei neueren und eingehenden Bitcoin-Transaktionen der Fall ist, aber nicht bei älteren. Ein wesentlicher Unterschied zwischen den beiden JSON-Ausgaben besteht darin, dass die Transaktion mit time
und blocktime
Feld/Wert auch über confirmations
und verfügt blockhash
. Ich bekomme diese Bitcoin-Transaktionen so, dass ich den zmq
Port abhöre und sobald der Hash einer Transaktion durchkommt, rufe ich dann die HTTP-Methode getrawtransaction
auf, um den Hash zu decodieren. Ich stelle fest, dass, wenn ich eine Weile warte oder weiter versuche anzurufen getrawtransaction
(z. B. die Aufwärtspfeiltaste + Enter mehrmals über einen Zeitraum von einigen Sekunden drücken), die zurückgegebene JSON-Transaktion schließlich das time
Feld/den Wert ausgefüllt hat.
Ich spekuliere an dieser Stelle, dass diese Transaktionen, die nichts time
mit ihnen zu tun haben, unbestätigt sind? Ist dieses Verständnis richtig?
Wenn ich richtig verstehe, dass einige Transaktionen nicht time
mit ihnen verbunden sind, weil sie unbestätigt sind, werden sie dann, wenn sie bestätigt werden, über das Netzwerk (z. B. über zmq) erneut gesendet, damit ich eine weitere Chance habe, sie zu erhalten?
Bitte beachten Sie, dass ich nicht versuche, Daten zu erstellen oder zu manipulieren, sondern nur eingehende neue Transaktionen abhöre und sie parse. Eine meiner Logiken dreht sich um das time
Feld, und da ich festgestellt habe, dass nicht alle Transaktionen dieses Feld haben, "bricht" dieser Code (da davon ausgegangen wird, dass alle decodierten Transaktionen ein solches Feld / einen solchen Wert haben).
Ich spekuliere an dieser Stelle, dass diese Transaktionen, denen keine Zeit zugeordnet ist, unbestätigt sind? Ist dieses Verständnis richtig?
Ja. Die Bitcoin.org-Entwicklerreferenz erklärt:
Der Grund dafür ist, dass die Transaktion selbst kein Zeitfeld enthält, sodass die einzigen Zeiten, die verwendet werden können, entweder (1) wann der Knoten die Transaktion zum ersten Mal erhalten hat oder (2) das Zeitfeld aus einem Block, der die Transaktion enthält .
Bitcoin Core verfolgt zwar #1, zeigt es aber nicht in der getrawtransaction
RPC-Ausgabe an. Wenn Sie es brauchen, können Sie es vom getrawmempool
RPC bekommen (versuchen Sie, diesen RPC mit dem Parameter aufzurufen true
). Beachten Sie, dass sich die Zeit ändern kann, wenn eine Transaktion aus dem Mempool entfernt (aufgrund von Alter oder niedrigen Gebühren) und später wieder hinzugefügt wird.
Pieter Wuille
getmempoolentry <txid>
seit 0.13.0 verwenden, denke ich.