Отправка биткойнов на тот же адрес

Я использую API BitcoinJ для создания своего кошелька. Когда я создаю транзакцию, я указываю адрес сдачи, на который следует отправить сдачу. Например: пусть по адресу А находится 1 биткойн; затем я создаю транзакцию для отправки 0,1 биткойна на адрес B и сдачи (0,9 биткойна) обратно на адрес A.

В кошельке BitcoinJ я вижу, что сдача (0,9 биткойна) не возвращается. Чтобы попытаться исправить это, я создал собственный селектор монет, чтобы явно выбирать неподтвержденные транзакции, которые генерируются мной, но я все еще не вижу сдачу (0,9 биткойна) в своем кошельке.

Это вид транзакции https://www.biteasy.com/testnet/transactions/db66d5058e5773f353447ffa2174a417867e9aa134113f01359576f5e6f2b4c6 .

А это мой кошелек https://www.biteasy.com/testnet/addresses/mnj3589DHMoCyhxDSvWKubjkUoTenmrGkE .

По моему адресу на Biteasy баланс 4BTC, но мой кошелек BitcoinJ показывает только 0.069BTC

Теперь мой вопрос: почему я не могу отправить обратные изменения на тот же адрес, с которого они отправляются?

Ответы (1)

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

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

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

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

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

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

  • Сумма ввода

  • Платеж на адрес 1 (должен быть меньше введенного)

  • Платеж по адресу 2 (должен быть изменен за вычетом комиссии, которую вы хотите заплатить)

Ввод должен быть явно больше, чем сумма платежа 1 и 2, а все, что осталось, неявно является комиссией майнеров.