Получите транзакции вне кошелька, используя биткойн rpc (gettransaction)

Я играю с биткойн-qt. Я хочу перебрать все блоки и все их транзакции.

До сих пор мне удавалось получить список всех транзакций в блоках, которые я хочу. Теперь я хочу получить информацию о транзакции: сумма, подтверждения и так далее.

Однако, когда я использую gettransactionметод API Bitcoin-qt, кажется, что я могу получать транзакции только из своего собственного кошелька.

Например, я не могу сказать, потому что получаю ошибку " Invalid or non-wallet transaction id (code -5)":

gettransaction 0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098

Однако, когда у меня есть TX одной из моих собственных транзакций, я получаю правильный ответ.

Мой код

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

Любая идея о том, как я буду получать информацию о транзакциях за пределами моего кошелька?

Ответы (1)

Включите txindex=1в своем bitcoin.conf (вам потребуется перестроить базу данных, поскольку индекс транзакций обычно не поддерживается, начните использовать -reindexдля этого) и используйте getrawtransactionвызов для запроса информации о любой транзакции (это не будет работать для генезиса ). транзакция блока coinbase, это особый случай).

Обратите внимание, что это даст вам только необработанные данные транзакции (вы можете добавить 1аргумент после вызова, чтобы он был декодирован, а не в шестнадцатеричном представлении), но, например, он не может знать сумму платежа или комиссию.

Просто для ясности: вы вообще не можете получить информацию о сумме платежа или сборах? :-) Потому что это звучит совершенно неправильно (Blockchain.info делает это). Сейчас я переиндексирую блокчейн :-)
Вы можете рассчитать комиссию самостоятельно, вычитая суммы всех выходов из суммы сумм всех входов (которые вам также придется искать через getrawtransaction). Вы, конечно, можете видеть сумму конкретного вывода, но если адрес, на который он отправлен, не является вашим, вы не можете знать, например, что является сдачей, а что платежом. Кошельки предназначены для того, чтобы делать все это за вас, если вы их обойдете, вам придется делать что-то вручную.
Большое спасибо. Я также хочу, чтобы другие люди посмотрели на функцию «decoderawtransaction» -> GREAT. Спасибо еще раз :-)
Я смог использовать bitcoin-cli decoderawtransaction $(bitcoin-cli getrawtransaction txid), чтобы получить детали транзакции. Кажется, что ответ на использование txindex=1устарел?
jangorecki: getrawtransaction всегда работает с транзакциями, которые еще не полностью израсходованы.
этот ответ верен и для лайткойна.
@jangorecki txindex=1нужен для транзакций, не относящихся к вашему кошельку