Нецелесообразно сканировать каждую транзакцию в цепочке блоков, чтобы определить баланс учетной записи. По мере роста цепочки блоков это кажется еще более сложным и ресурсоемким. Возможно, все транзакции сгруппированы в то, что мы привыкли называть записью, а именно в запись переменной длины. address..trans1, trans2, etc...transN для последней транзакции.
Биткойн использует так называемую модель UTXO (вывод неизрасходованных транзакций).
В первый раз это не очень интуитивно понятно, потому что отличается от традиционной модели учета, когда вы просто тратите и отправляете на счет.
Подумайте о полных копилках, которые не могут быть заполнены больше, чем они есть, и которые вы должны взломать, прежде чем сможете потратить содержимое:
Каждая копилка/UTXO привязана к адресу. Пользователь Биткойн, конечно, может иметь несколько UTXO, связанных с его адресом. Сумма UTXO дает количество биткойнов, принадлежащих адресу (что является одной из функций кошельков).
Каждый вход транзакции является выходом предыдущей транзакции. Хотя программное обеспечение кошелька создает ощущение, что вы «переводите» биткойны или сатоши, вы не тратите средства со счета, с которого тратите UTXO .
Вы тратите от транзакций, ранее совершенных для вас.
Несколько более интуитивный способ думать о расчетах баланса — думать о том, что вы используете настоящий фиатный кошелек.
Если вы хотите посмотреть, сколько денег у вас физически есть прямо сейчас , вы должны открыть свой бумажник, вынуть все банкноты разного номинала и суммировать их. Это дает вам баланс.
Биткойн делает что-то подобное, где адрес похож на ваш физический кошелек. С одним адресом может быть связано несколько utxos. Баланс для этого адреса представляет собой сумму всех utxos.
Ключевым моментом здесь является то, что биткойн отслеживает только неизрасходованные выходы транзакций. Таким образом, чтобы получить баланс для адреса, ему просто нужно перебрать блокчейн, добавить новые выходы при их создании и удалить старые, когда они будут потрачены. Кроме того, это растянутый процесс. Если вы знаете набор utxo для блока 100, вам не нужно пересчитывать из блока 0, чтобы обновить данные из блока 101. Вы можете просто обновить свой набор из блока 100.
Это снова похоже на то, как мы используем физические кошельки. Никто не отслеживает все банкноты и монеты, которые у него были в прошлом (потраченные выходы транзакций). Они отслеживают только то, что у них есть на данный момент (utxo). Когда происходит новая транзакция (скажем, вы покупаете молоко), вы только обновляете текущее состояние своего кошелька, удаляя примечание и возвращая сдачу. Вам не нужно рассчитывать его с первого раза, когда вы использовали деньги.
Биткойн делает еще один шаг вперед и имеет концепцию учетных записей, которые представляют собой несколько адресов, действующих как один кошелек. Аналогичная аналогия была бы, если бы все в вашем доме объединили деньги из всех своих кошельков, чтобы вы могли потратить их как один. Опять же, баланс аккаунта — это просто сумма баланса адресов в нем.
Редактировать:
Баланс адреса рассчитывается путем сложения всех значений неизрасходованных выходов транзакций (UTXO), которые могут быть потрачены парой ключей, соответствующей этому адресу.
Чтобы ответить на более широкий вопрос: «Почему вы сканируете каждую транзакцию во всей цепочке блоков, чтобы определить свой баланс?»
Биткойн-ядру не нужно знать баланс адреса, чтобы выполнить проверку. Однако он должен иметь возможность сканировать все предыдущие выходные данные транзакций, чтобы проверять новые. Для этого он сканирует сгенерированную индексированную базу данных (по txid) всех транзакций на наличие предыдущих выходных данных, на которые ссылается новая транзакция, и проверяет, соответствует ли подпись предыдущему выводу (UTXO). Обратите внимание, что это требует сканирования только неизрасходованных выходных данных, а не всех транзакций.
Оптимизация этого хранилища данных для расчета баланса путем индексирования по адресу и txid может упростить расчет баланса, но это не обязательно для проверки и будет стоить эффективности проверки транзакции. Лучше оставить это приложению кошелька в угоду сети.
Предыдущий ответ:
В предыдущем ответе объясняется, как индексировать транзакции в биткойн-ядре, что может помочь кошельку или обозревателю блоков более эффективно определять баланс адреса.
Вы можете индексировать транзакции в блокчейне, чтобы упростить поиск. Биткойн-ядро позволяет это с помощью -txindex=1
флага.
Из биткойн-вики :
txindex
| Поддерживать полный индекс транзакции, используемый вызовом rpc getrawtransaction (по умолчанию: 0).
Кайус Джард