Erhalten Sie Nicht-Wallet-Transaktionen mit Bitcoin RPC (gettransaction)

Ich spiele mit Bitcoin-qt herum. Ich möchte alle Blöcke und alle ihre Transaktionen iterieren.

Bisher war ich in der Lage, eine Liste aller TX in den Blöcken zu erhalten, die ich haben möchte. Jetzt möchte ich Informationen über die Transaktion erhalten: Betrag, Bestätigungen und so weiter.

Wenn ich jedoch die gettransactionMethode der Bitcoin-qt-API verwende, kann ich anscheinend nur Transaktionen aus meiner eigenen Brieftasche erhalten.

Zum Beispiel kann ich nicht sagen, weil ich den Fehler " Invalid or non-wallet transaction id (code -5)" bekomme:

gettransaction 0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098

Wenn ich jedoch eine TX einer meiner eigenen Transaktionen habe, erhalte ich eine korrekte Antwort.

Mein Code

public void AddBtcTransaction(string hash)
        {
            List<string> parameters = new List<string>();
            parameters.Add(hash);

            var data = RequestServer("gettransaction", parameters);
            int i = 0;
        }

        public string RequestServer(string methodName, List<string> parameters)
        {
            string respVal = string.Empty;

            var rawRequest = GetRawRequest();
            JObject joe = new JObject();
            joe.Add(new JProperty("jsonrpc", "1.0"));
            joe.Add(new JProperty("id", "1"));
            joe.Add(new JProperty("method", methodName));

            JArray props = new JArray();
            foreach (var parameter in parameters)
            {
                props.Add(parameter);
            }

            joe.Add(new JProperty("params", props));

            // serialize json for the request
            string s = JsonConvert.SerializeObject(joe);
            byte[] byteArray = Encoding.UTF8.GetBytes(s);
            rawRequest.ContentLength = byteArray.Length;
            Stream dataStream = rawRequest.GetRequestStream();
            dataStream.Write(byteArray, 0, byteArray.Length);
            dataStream.Close();

            StreamReader streamReader = null;
            try
            {
                WebResponse webResponse = rawRequest.GetResponse();

                streamReader = new StreamReader(webResponse.GetResponseStream(), true);

                respVal = streamReader.ReadToEnd();
                var data = JsonConvert.DeserializeObject(respVal).ToString();
                return data;
            }
            catch (Exception exp)
            {

            }
            finally
            {
                if (streamReader != null)
                {
                    streamReader.Close();        
                }

            }
            return string.Empty;
        }

        private HttpWebRequest GetRawRequest()
        {

            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(ServerIp);
            webRequest.Credentials = new NetworkCredential(UserName, Password);
            /// important, otherwise the service can't desirialse your request properly
            webRequest.ContentType = "application/json-rpc";
            webRequest.Method = "POST";

            return webRequest;
        }

Irgendeine Idee, wie ich Informationen über Transaktionen außerhalb meiner Brieftasche erhalten würde?

Antworten (1)

Aktivieren Sie in Ihrer bitcoin.conf txindex=1(Sie müssen die Datenbank neu erstellen, da der Transaktionsindex normalerweise nicht gepflegt wird, beginnen -reindexSie damit, dies zu tun) und verwenden Sie den getrawtransactionAufruf, um Informationen über jede Transaktion anzufordern (es funktioniert nicht für die Genesis Coinbase-Transaktion des Blocks ist jedoch ein Sonderfall).

Beachten Sie, dass dies Ihnen nur rohe Transaktionsdaten liefert (Sie können 1nach dem Aufruf ein Argument hinzufügen, um es statt in hexadezimaler Notation dekodieren zu lassen), aber es kann beispielsweise den Zahlungsbetrag oder die Gebühren nicht kennen.

Nur um das klarzustellen: Sie können überhaupt keine Informationen über Zahlungsbetrag oder Gebühren erhalten? :-) Weil das ziemlich falsch klingt (Blockchain.info macht das). Ich indiziere die Blockchain jetzt neu :-)
Sie können die Gebühr selbst berechnen, indem Sie die Beträge aller Ausgaben von der Summe der Beträge aller Eingaben abziehen (die Sie auch über getrawtransaction nachschlagen müssen). Sie können natürlich den Betrag einer bestimmten Ausgabe sehen, aber wenn die Adresse nicht Ihre ist, können Sie beispielsweise nicht wissen, was Wechselgeld und was die Zahlung ist. Wallets sind so konzipiert, dass sie all das für Sie erledigen. Wenn Sie sie umgehen, müssen Sie die Dinge manuell erledigen.
Danke vielmals. Ich möchte auch, dass andere Leute sich "Decoderawtransaction" -> GROSSE Funktion ansehen. Danke noch einmal :-)
Ich konnte verwenden bitcoin-cli decoderawtransaction $(bitcoin-cli getrawtransaction txid), um Transaktionsdetails zu erhalten. Scheint, dass die zu verwendende Antwort txindex=1veraltet ist?
jangorecki: getrawtransaction funktioniert immer auf Transaktionen, die noch nicht vollständig ausgegeben sind.
Diese Antwort ist auch für Litecoin richtig.
@jangorecki txindex=1wird für Transaktionen benötigt, die nicht für Ihr Wallet relevant sind