Obtenga transacciones que no sean de billetera usando bitcoin rpc (gettransaction)

Estoy jugando con Bitcoin-qt. Quiero iterar todos los bloques y todas sus transacciones.

Hasta ahora he podido obtener una lista de todos los tx en los bloques que quiero. Ahora quiero obtener información sobre la transacción: monto, confirmaciones, etc.

Sin embargo, cuando uso el gettransactionmétodo de la API de Bitcoin-qt, parece que solo puedo obtener transacciones de mi propia billetera.

Por ejemplo, no puedo decirlo porque me sale el error " Invalid or non-wallet transaction id (code -5)":

gettransaction 0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098

Sin embargo, cuando tengo un TX de una de mis propias transacciones, obtengo una respuesta correcta.

Mi código

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

¿Alguna idea sobre cómo obtendría información sobre transacciones fuera de mi billetera?

Respuestas (1)

Habilite txindex=1en su bitcoin.conf (deberá reconstruir la base de datos ya que el índice de transacciones normalmente no se mantiene, comience a usar -reindexpara hacerlo) y use la getrawtransactionllamada para solicitar información sobre cualquier transacción (no funcionará para el génesis Sin embargo, la transacción de coinbase del bloque es un caso especial).

Tenga en cuenta que esto solo le proporcionará datos de transacción sin procesar (puede agregar un 1argumento después de la llamada para decodificarlo en lugar de en notación hexadecimal), pero no puede conocer el monto del pago o las tarifas, por ejemplo.

Para que quede claro: ¿No puede obtener información sobre el monto del pago o las tarifas, en absoluto? :-) Porque eso suena bastante mal (Blockchain.info hace esto). Estoy reindexando la cadena de bloques ahora :-)
Puede calcular la tarifa usted mismo restando las cantidades de todas las salidas de la suma de las cantidades de todas las entradas (que también tendrá que buscar a través de getrawtransaction). Por supuesto, puede ver la cantidad de una salida en particular, pero a menos que la dirección sea la suya, no puede saber, por ejemplo, cuál es el cambio y cuál es el pago. Las billeteras están diseñadas para hacer todo eso por usted, si las omite, debe hacer las cosas manualmente.
Muchas gracias. También quiero que otras personas vean "decoderrawtransaction" -> GRAN función. Gracias de nuevo :-)
Pude usar bitcoin-cli decoderawtransaction $(bitcoin-cli getrawtransaction txid)para obtener los detalles de la transacción. ¿ Parece que la respuesta para usar txindex=1está desactualizada?
jangorecki: getrawtransaction siempre funciona en transacciones que aún no se han gastado por completo.
esta respuesta también es correcta para litecoin.
Se necesita @jangorecki txindex=1para transacciones que no son pertinentes para su billetera