Как сдача работает в биткойн-транзакциях?

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

Это немного затрудняет отслеживание вашего баланса в обозревателе блоков (особенно потому, что новый адрес получателя нигде не отображается в биткойн-клиенте).

Должен ли он так работать, или это конкретная деталь реализации клиентского ПО?

Кроме того, вам нужно ждать подтверждения сдачи, прежде чем вы сможете потратить ее снова?

У меня такая же проблема. У меня есть вопрос: определяет ли спецификация ( github.com/bitcoin/bips/blob/master/bip-0032.mediawiki ) то, что должно произойти? Или это зависит от кошелька, чтобы сделать лучшее предположение о том, что делать? И, во-вторых, если кошелькам разрешено делать все, что они хотят, как приложение может пройти по всем адресам, которые могут использоваться каким-то другим кошельком для перевода средств? Это кажется почти невозможным, потому что кажется, что кошелек может делать все, что захочет. Он может спрятать ваши средства в каком-то непонятном месте, если не будет следовать каким-либо соглашениям.

Ответы (3)

Во-первых, давайте проясним разницу между учетными записями и адресами.

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

«Адреса» используются для получения биткойнов в транзакциях. Монеты отправляются на адрес. Клиент связывает каждый адрес со счетом и добавляет полученные средства на этот счет. Это сделано просто для удобства, чтобы люди могли косвенно отслеживать, на какой адрес были отправлены средства. Но вы можете иметь любое количество адресов, связанных с одной и той же учетной записью.

Изменения происходят из-за того, как тратятся биткойны. Чтобы потратить определенное количество биткойнов, вы должны вывести биткойны из выходов транзакций на счета, которые вы контролируете. Обратите внимание, что в части расходов не имеет значения, какой это адрес или с какой учетной записью связан этот адрес. Когда вы тратите биткойны с определенного счета, это просто означает, что вы списываете с этого счета сумму, которую отправляете. Это не означает, что средства поступают с адресов, связанных с этой учетной записью. Помните, что связь между адресами и учетными записями предназначена только для получения , а не для отправки. (Например, когда вы тратите деньги на продукты, у вас нет конкретных счетов за продукты. У вас просто есть сумма в бюджете.)

Таким образом, когда вы получаете результаты транзакций, вы формируете кучу биткойнов, достаточно большую для количества, которое вы пытаетесь отправить. Обычно это не будет точно, так как вы должны получить весь результат. Таким образом, избыток образует «изменение».

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

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

Информация в ответе Дэвида верна, но она может не отвечать на фактический вопрос - неясно, касается ли вопрос изменений в целом или конкретно отправки изменений на новый адрес.

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

Причина этого в том, что выход, когда он используется в качестве входа, должен быть потрачен полностью. Скажем, кто-то отправляет вам 10 BTC, эти 10 BTC — это один выход. Вы не можете потратить часть этой монеты, точно так же, как вы не можете отрезать часть физической монеты и сохранить ее ценность.

Причина этого в том, что вывод на самом деле является скриптом, и чтобы провести вывод, вы просто транслируете решение этому скрипту. Этот выход целиком становится входом — и если вы не включите сдачу, вся разница между входом и выходом пойдет на комиссию за транзакцию.

Что зависит от клиента, так это то, как обрабатывать это изменение: клиент Satoshi отправляет его на новый адрес, в то время как другие клиенты могут просто отправить изменение обратно на один из выходных адресов.

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

Должен ли он так работать, или это конкретная деталь реализации клиентского ПО?

Да, это реализовано самим протоколом Биткойн , но рекомендуется не использовать адреса повторно. Поскольку мы имеем дело с псевдоанонимной криптовалютой, имеет смысл повышать «анонимность», чем больше мы можем сделать.
Однако вы можете заставить свой кошелек отправлять «сдачу» на статический и постоянный адрес, не создавая новый адрес сдачи каждый раз, когда вы совершаете транзакцию. Это значительно уменьшит вашу конфиденциальность, и история транзакций не будет «запутана», как это должно быть .

Кроме того, вам нужно ждать подтверждения сдачи, прежде чем вы сможете потратить ее снова?

Нет, вы также можете потратить разменные монеты с 0 подтверждениями.

За исключением монет coinbase (т.е. недавно добытых монет, для созревания которых требуется 100 блоков), вы можете тратить монеты с 0 подтверждениями из кошельков командной строки и многих других. Это разрешено самим протоколом, но многие клиенты могут не разрешать пользователям транслировать txs до тех пор, пока входы не получат хотя бы 1 подтверждение или даже больше.

ПОМНИТЕ, что расходование монет с нулевым подтверждением из ненадежного источника может привести к удалению транзакций из сетевого мемпула из-за возможной атаки «псевдодвойного расходования». В случае траты собственной сдачи с 0 подтверждениями вы доверяете себе как первоначальному отправителю, так что это не проблема (если исходная транзакция, которая сгенерировала монеты «сдачи», не имела 0 подтверждений от ненадежного отправителя).