Bitcoin Forum

Local => Кодеры => Topic started by: msnya on March 10, 2020, 08:40:11 PM



Title: Алгоритм расчета баланса BTC адреса
Post by: msnya on March 10, 2020, 08:40:11 PM
Здравствуйте!
Хочу написать приложение которое рассчитывало бы баланс любого(не только того от которого есть приватный ключ) BTC адреса без использования сторонних сервисов.
Есть полная нода и доступ к RPC из Python.
Подскажите пожалуйста, какой должен быть алгоритм вычисления баланса заданного адреса?
Есть ли варианты или существует только единственный способ?



Title: Re: Алгоритм расчета баланса BTC адреса
Post by: A-Bolt on March 10, 2020, 09:40:34 PM
Подскажите пожалуйста, какой должен быть алгоритм вычисления баланса заданного адреса?

Code:
bitcoin-cli scantxoutset "start" "[\"addr(171KH93nrksmH5r89eGiyGM5R7RJh2g3nE)\"]"


Title: Re: Алгоритм расчета баланса BTC адреса
Post by: kzv on March 11, 2020, 09:38:14 AM
Я обычно делаю так
Code:
importaddress
getbalance


Title: Re: Алгоритм расчета баланса BTC адреса
Post by: msnya on March 11, 2020, 07:16:35 PM
Подскажите пожалуйста, какой должен быть алгоритм вычисления баланса заданного адреса?

Code:
bitcoin-cli scantxoutset "start" "[\"addr(171KH93nrksmH5r89eGiyGM5R7RJh2g3nE)\"]"

Спасибо! Работает!

Я обычно делаю так
Code:
importaddress
getbalance
Поробовал
Code:
importaddress
не прокатило, закончилось на:
Code:
error: Could not connect to the server 127.0.0.1:8332 (error code 0 - "timeout reached")
И соответственно,
Code:
getbalance
Должен показать баланс кошелька, который состоит из суммы балансов всех адресов?
То есть не только того адреса который был импортирован, но и тех которые были сгенерированы кошельком ранее?

Также в описании процедуры importaddress сказано что:
Quote
Requires a new wallet backup.

Note: This call can take over an hour to complete if rescan is true, during that time, other rpc calls may report that the imported address exists but related transactions are still missing, leading to temporarily incorrect/bogus balances and unspent outputs until rescan completes.
Нужен бэкап? Как это понимать?


Title: Re: Алгоритм расчета баланса BTC адреса
Post by: A-Bolt on March 11, 2020, 09:03:22 PM
Code:
importaddress
не прокатило, закончилось на:
Code:
error: Could not connect to the server 127.0.0.1:8332 (error code 0 - "timeout reached")

Возможно, команда в конце концов выполнилась и адрес таки импортировался, просто соединение разорвалось по тайм-ауту раньше окончания выполнения команды. При выполнении importaddress сканируется весь блокчейн для восстановления всей истории транзакций по этому адресу и получения итогового баланса, поэтому так долго всё это происходит.

Команда scantxoutset выполняется быстрее, поскольку сканируется не база блокчейна, а база UTXO - непотраченных выходов транзакций, которая намного меньше. Но зато scantxoutset не позволяет получить историю транзакций.

И соответственно,
Code:
getbalance
Должен показать баланс кошелька, который состоит из суммы балансов всех адресов?
То есть не только того адреса который был импортирован, но и тех которые были сгенерированы кошельком ранее?

Верно. Покажет суммарный баланс по всем адресам, хранящимся в wallet.dat.

Также в описании процедуры importaddress сказано что:
Quote
Requires a new wallet backup.
Нужен бэкап? Как это понимать?

Когда вы импортируете в wallet.dat адрес или приватный ключ, то в бэкапе этот адрес сам по себе ведь не появится, нужно сделать актуальныю копию уже со свежеимпортированным адресом.


Title: Re: Алгоритм расчета баланса BTC адреса
Post by: kzv on March 12, 2020, 05:57:20 AM
importaddress можно вызвать с параметром false, тогда рескан блокчейна не происходит. Я так понимаю, что в этом случае тоже только utxo сканируется?
Баланс по адресу потом можно посчитать командой
listunspent



Title: Re: Алгоритм расчета баланса BTC адреса
Post by: msnya on March 12, 2020, 04:03:18 PM
Quote
Quote from: msnya on March 11, 2020, 07:16:35 PM
Code:
importaddress
не прокатило, закончилось на:
Code:
error: Could not connect to the server 127.0.0.1:8332 (error code 0 - "timeout reached")

Возможно, команда в конце концов выполнилась и адрес таки импортировался, просто соединение разорвалось по тайм-ауту раньше окончания выполнения команды. При выполнении importaddress сканируется весь блокчейн для восстановления всей истории транзакций по этому адресу и получения итогового баланса, поэтому так долго всё это происходит.
Действительно выполнилась! Баланс импортированного таким образом адреса получилось проверить:
Code:
bitcoin-cli listreceivedbyaddress 0 true true "addres"

Когда вы импортируете в wallet.dat адрес или приватный ключ, то в бэкапе этот адрес сам по себе ведь не появится, нужно сделать актуальныю копию уже со свежеимпортированным адресом.
Сделал, но зачем в бэкапе нужен адрес без Приватного ключа - не очень понятно.

importaddress можно вызвать с параметром false, тогда рескан блокчейна не происходит. Я так понимаю, что в этом случае тоже только utxo сканируется?
Баланс по адресу потом можно посчитать командой
listunspent
После имопрта importaddress с параметром false, попробовал listreceivedbyaddress - отображает баланс не правильный.

А вот еще возник у меня вопрос, не совсем по теме. Не знаю, может поправить название темы, не открывать же новую для этого вопроса?
Мониторинг МемПула. Предположим есть адрес "35hK24tcLEWcgNA4JxpvbkNkoAcDGqQPsP", и я хочу узнать когда он станет фигурировать в качестве входа или выхода транзакции из МемПула.
Как лучше реализовать такой мониторинг?


Title: Re: Алгоритм расчета баланса BTC адреса
Post by: kzv on March 12, 2020, 04:48:34 PM
Вообще listreceivedbyaddress должен показывать сколько получено на адрес, а не остаток на адресе. Остаток надо считать суммированием непотраченных выходов которые получаются командой listunspent


Title: Re: Алгоритм расчета баланса BTC адреса
Post by: msnya on March 12, 2020, 06:01:44 PM
importaddress можно вызвать с параметром false, тогда рескан блокчейна не происходит. Я так понимаю, что в этом случае тоже только utxo сканируется?
Баланс по адресу потом можно посчитать командой
listunspent


Чет у меня не прокатывает...
После импорта без индексации делаю вот так:
Code:
bitcoin-cli -rpcuser=rpcuser -rpcpassword=rpcpassword listunspent 1 9999999 "[\"1KUr81aewyTFUfnq4ZrpePZqXixd59ToNn\"]" true
и получаю пустой массив.
В чем может быть ошибка?

Так, по дрогу адресу получается выполнить listunspent, буду разбираться в чем разница...


Title: Re: Алгоритм расчета баланса BTC адреса
Post by: kzv on March 12, 2020, 06:41:47 PM
А блокчейн полностью скачан или в пруне?


Title: Re: Алгоритм расчета баланса BTC адреса
Post by: msnya on March 12, 2020, 07:02:29 PM
А блокчейн полностью скачан или в пруне?
Code:
"pruned": false,
отвечает на
Code:
bitcoin-cli getblockchaininfo


Title: Re: Алгоритм расчета баланса BTC адреса
Post by: kzv on March 12, 2020, 07:12:46 PM
А блокчейн полностью скачан или в пруне?
Code:
"pruned": false,
отвечает на
Code:
bitcoin-cli getblockchaininfo


Значит importaddress с параметром false не сканирует utxo. Нужно с параметром true вызывать  :(