Как рассчитывается баланс адреса?

Нецелесообразно сканировать каждую транзакцию в цепочке блоков, чтобы определить баланс учетной записи. По мере роста цепочки блоков это кажется еще более сложным и ресурсоемким. Возможно, все транзакции сгруппированы в то, что мы привыкли называть записью, а именно в запись переменной длины. address..trans1, trans2, etc...transN для последней транзакции.

Обратите внимание, что для биткойнов «адрес» и «учетная запись» — это разные вещи — о каком из них вы говорите?

Ответы (3)

Биткойн использует так называемую модель UTXO (вывод неизрасходованных транзакций).
В первый раз это не очень интуитивно понятно, потому что отличается от традиционной модели учета, когда вы просто тратите и отправляете на счет.
Подумайте о полных копилках, которые не могут быть заполнены больше, чем они есть, и которые вы должны взломать, прежде чем сможете потратить содержимое:

  1. У Боба 1 копилка, он хочет заплатить Алисе половиной содержимого копилки.
  2. Он разбивает свою копилку.
  3. Он берет половину и отдает Алисе, которая кладет все это в новую копилку, принадлежащую ей.
  4. Вы кладете оставшуюся половину в новую копилку меньшего размера, принадлежащую вам и ожидающую, когда ее взломают.

Каждая копилка/UTXO привязана к адресу. Пользователь Биткойн, конечно, может иметь несколько UTXO, связанных с его адресом. Сумма UTXO дает количество биткойнов, принадлежащих адресу (что является одной из функций кошельков).
Каждый вход транзакции является выходом предыдущей транзакции. Хотя программное обеспечение кошелька создает ощущение, что вы «переводите» биткойны или сатоши, вы не тратите средства со счета, с которого тратите UTXO .
Вы тратите от транзакций, ранее совершенных для вас.

Несколько более интуитивный способ думать о расчетах баланса — думать о том, что вы используете настоящий фиатный кошелек.

Если вы хотите посмотреть, сколько денег у вас физически есть прямо сейчас , вы должны открыть свой бумажник, вынуть все банкноты разного номинала и суммировать их. Это дает вам баланс.

Биткойн делает что-то подобное, где адрес похож на ваш физический кошелек. С одним адресом может быть связано несколько utxos. Баланс для этого адреса представляет собой сумму всех utxos.

Ключевым моментом здесь является то, что биткойн отслеживает только неизрасходованные выходы транзакций. Таким образом, чтобы получить баланс для адреса, ему просто нужно перебрать блокчейн, добавить новые выходы при их создании и удалить старые, когда они будут потрачены. Кроме того, это растянутый процесс. Если вы знаете набор utxo для блока 100, вам не нужно пересчитывать из блока 0, чтобы обновить данные из блока 101. Вы можете просто обновить свой набор из блока 100.

Это снова похоже на то, как мы используем физические кошельки. Никто не отслеживает все банкноты и монеты, которые у него были в прошлом (потраченные выходы транзакций). Они отслеживают только то, что у них есть на данный момент (utxo). Когда происходит новая транзакция (скажем, вы покупаете молоко), вы только обновляете текущее состояние своего кошелька, удаляя примечание и возвращая сдачу. Вам не нужно рассчитывать его с первого раза, когда вы использовали деньги.

Биткойн делает еще один шаг вперед и имеет концепцию учетных записей, которые представляют собой несколько адресов, действующих как один кошелек. Аналогичная аналогия была бы, если бы все в вашем доме объединили деньги из всех своих кошельков, чтобы вы могли потратить их как один. Опять же, баланс аккаунта — это просто сумма баланса адресов в нем.

Редактировать:

Расчет баланса адреса

Баланс адреса рассчитывается путем сложения всех значений неизрасходованных выходов транзакций (UTXO), которые могут быть потрачены парой ключей, соответствующей этому адресу.

Структура хранения

Чтобы ответить на более широкий вопрос: «Почему вы сканируете каждую транзакцию во всей цепочке блоков, чтобы определить свой баланс?»

Биткойн-ядру не нужно знать баланс адреса, чтобы выполнить проверку. Однако он должен иметь возможность сканировать все предыдущие выходные данные транзакций, чтобы проверять новые. Для этого он сканирует сгенерированную индексированную базу данных (по txid) всех транзакций на наличие предыдущих выходных данных, на которые ссылается новая транзакция, и проверяет, соответствует ли подпись предыдущему выводу (UTXO). Обратите внимание, что это требует сканирования только неизрасходованных выходных данных, а не всех транзакций.

Оптимизация этого хранилища данных для расчета баланса путем индексирования по адресу и txid может упростить расчет баланса, но это не обязательно для проверки и будет стоить эффективности проверки транзакции. Лучше оставить это приложению кошелька в угоду сети.

Предыдущий ответ:

В предыдущем ответе объясняется, как индексировать транзакции в биткойн-ядре, что может помочь кошельку или обозревателю блоков более эффективно определять баланс адреса.

Вы можете индексировать транзакции в блокчейне, чтобы упростить поиск. Биткойн-ядро позволяет это с помощью -txindex=1флага.

Из биткойн-вики :

txindex| Поддерживать полный индекс транзакции, используемый вызовом rpc getrawtransaction (по умолчанию: 0).

Это не имеет ничего общего с остатками адресов.
Согласен, заголовок не соответствует вопросу. Вопрос больше говорит о практичности сканирования всех транзакций и о том, как это можно сделать.
И ответ не имеет к этому никакого отношения, потому что txindex даже не используется для проверки.
Да, это имеет смысл, вопрос более высокого уровня
Просто обновил ответ, чтобы лучше ответить на вопрос.
В любой момент времени во время проверки не используется индекс txids (или какой-либо другой индекс).
Значит, этот ответ относится к другому индексу utxo? биткойн.stackexchange.com/a/29782/60443
Bitcoin Core поддерживает базу данных всех неизрасходованных транзакций. Это не индекс, так как он не индексируется ни во что другое. Доступ к исходным транзакциям или блокам, которые создали расходуемые выходы, не осуществляется. Это просто добавление новых выходов в базу данных и удаление израсходованных.