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

Мне интересно, как вычисляется баланс кошелька. В принципе, из того, что я читал, я предполагаю, что вы оглядываетесь на все транзакции, в которых задействованы все ключевые пары данного кошелька. Добавление всех остатков транзакций (отрицание остатка транзакции при исходящей транзакции) должно соответствовать балансу кошелька, правильно?

A) Доступен ли код Python, который вычисляет баланс данного кошелька? Я не ищу полноценного программного обеспечения для кошельков, это всего лишь минималистический (академический) пример кода Python.

B) При использовании веб-службы, например. https://blockchain.info/q/addressbalance/$addr, как я могу получить адрес $addr для запроса из данного кошелька? Любой код Python?

22 голоса | спросил marcus 4 MaramTue, 04 Mar 2014 01:01:12 +04002014-03-04T01:01:12+04:0001 2014, 01:01:12

1 ответ


22

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

Входы & Выходы

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

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

Сохранение транзакций

Все подтвержденные транзакции становятся частью цепочки. Клиенты проверяют транзакции и блоки; к блок-цепочке добавляются только действительные транзакции и блоки. Для целей проверки транзакций и вычислений доступных балансов необходима только часть блокчин, и эта часть называется UTXO (Unspent Transaction Output Set) . Это подмножество JUST неизрасходованных выходов. Поскольку все будущие транзакции будут ссылаться на неизрасходованные выходы, поскольку их входы необходимы только для неизрасходованных выходов для проверки новой транзакции и вычисления баланса (что является еще одним способом сказать общую стоимость выходов, которые «могут» использоваться в новых транзакциях).

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

Неподтвержденные транзакции не являются частью цепочки (или UTXO). Клиенты сохраняют неупорядоченный список всех неподтвержденных транзакций, о которых они знают. Этот список называется пулом памяти .

Вычисление балансов

Создание UTXO упрощает расчеты. UTXO содержит все неизрасходованные выходы, однако ваш клиент может тратить только подмножество этих выходов, которые соответствуют открытым ключам, для которых у него есть закрытый ключ («ваши ключи»). Это подмножество не имеет официального имени, однако вызов RPC для вывода этого списка listunspent , поэтому я назову его набором listunspent.

Кошелек использует набор listunspent и пул памяти для определения текущего баланса. В действительности кошельки вычисляют это в «реальном времени», когда происходят изменения в пуле памяти или UTXO (т. Е. Когда клиент узнает о новых блоках или транзакциях, он записывает их, а затем вносит изменения в свой зарегистрированный баланс, если таковой имеется). Для краткости я просто покажу, как получить «моментальный снимок» текущего баланса. Существует подтвержденный баланс и неподтвержденный баланс, клиенты часто показывают баланс с уменьшенным током, чтобы упростить работу пользователей.

Подтвержденный баланс

Подтвержденный баланс представляет собой сумму значения набора «listunspent». Пример: listunspent (выходы в UTXO, у которого есть ключи для клиента) имеет 20 выходов и в сочетании они имеют общуюзначение 1.2 BTC, так что подтвержденный баланс равен 1.2 BTC.

Баланс с пониженным подтверждением

Клиент обычно не показывает «настоящий» подтвержденный баланс, потому что пользователи больше интересуются тем, что у них есть, чтобы тратить. Транзакции в пуле памяти, у которых есть входы, которые ссылаются на выходы в наборе listunspent, технически еще не уменьшили подтвержденный баланс. В большинстве случаев они в конечном итоге подтвердят, что клиенты будут удалять эти результаты при вычислении «подтвержденного» баланса. «Подтвержденный» баланс в большинстве кошельков на самом деле является уменьшенным подтвержденным балансом. Это делается для того, чтобы отвлечься от того, как Биткойн действительно работает. Если бы это было не так, подтвержденный баланс не уменьшился бы до тех пор, пока транзакция не была подтверждена, что может показаться запутанным для пользователя (у них есть 100 БТД, потратьте 1, он по-прежнему показывает 100 BTC). Клиент может разбить это на «подтвержденный баланс», «зарезервирован для неподтвержденных транзакций» и «доступный баланс».

Неподтвержденный баланс

Неподтвержденный tx "to" клиент еще не будет в UTXO. Однако он будет в пуле памяти. Сумма всех выходов (с которыми клиент имеет ключи) в пуле памяти - это ожидающий баланс. Те tx либо будут подтверждены (tx и вывод удаляются из пула памяти и добавляются в UTXO), либо они будут удалены.

Обработка изменения

Из-за того, как биткойн обрабатывает «изменение» (выходы могут быть частично израсходованы, поэтому неиспользуемая часть отправляется обратно пользователю) упрощенный пример выше, если точность будет сбивать с толку пользователю. Большинство кошельков «обманывают» и включают неподтвержденные изменения в балансе с сокращенным подтверждением. Это не требование, но не скрытие этого аспекта от пользователей может привести к неожиданному поведению. Представьте клиента с уменьшенным подтвержденным балансом 100 BTC и ожидающим балансом 0 BTC. Пользователь «тратит» 1 BTC, однако выходы ссылаются в новом tx всего 5 BTC. Это означает, что новые выходы на самом деле являются 1 BTC + 4 BTC «change». Если балансы не были изменены, чтобы «скрыть» изменение, после траты пользователь увидит подтвержденный баланс 95 BTC и ожидающий баланс 4 BTC.

ответил DeathAndTaxes 4 MarpmTue, 04 Mar 2014 17:23:35 +04002014-03-04T17:23:35+04:0005 2014, 17:23:35

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132