Как вернуть определенное количество биткойнов на адрес?

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

Как бы вы это сделали? Есть ли у биткойна возможность отправлять и получать монеты через один и тот же адрес, или мне нужно будет запросить обратный адрес и каким-то образом связать адрес отправленной суммы с обратным адресом?

Ответы (3)

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

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

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

Кроме того, вам не следует внедрять какую-либо криптографию самостоятельно, если вы еще не являетесь экспертом высшего уровня, слишком много всего может пойти не так. Я бы рекомендовал использовать правильный API.

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

Ради всего святого, не делай этого. Учитывать:

Алиса хочет отправить вам 1 биткойн. Она просит поставщика своего кошелька отправить вам 1 биткойн. Ее провайдер кошелька отправляет вам биткойны, которые он получил от Боба, когда он пополнил свой кошелек.

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

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

В конечном итоге Алиса может задаться вопросом, почему она не получила свои биткойны. Если она свяжется с вами, вы сообщите ей идентификатор транзакции. Она подумает: «Хм, это не мой адрес. Но он должен принадлежать провайдеру моего кошелька. Значит, у них должны быть биткойны. Когда я объясню им, что они мои, они должны зачислить их мне».

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

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

Так нет ли способа сделать то, что я пытаюсь сделать? Даже если я попрошу конкретный обратный адрес у пользователя?
Ничего страшного, если вы спросите у пользователя конкретный обратный адрес. Это то, что делает ShapeShift.
@DavidSchwartz Вы говорите: «Это не имеет никакого смысла», но почему это не имеет смысла? Каждая сторона делает предположения, и я говорю, что поставщик кошелька потратил деньги, которых не должен был ... очень очевидное предположение для всех вовлеченных сторон, кроме поставщика кошелька, так что делает предположения поставщиков кошельков (imo недействительными) более обоснованными, чем все остальные другие предположения? Почему провайдер кошелька должен использовать систему шифрования с открытым ключом, как если бы это была система с симметричным ключом (например, нарушая доверенное частное владение закрытыми ключами, которым ему было доверено управлять) и не быть обвиненным?
@user3338098 user3338098 Я просто объясняю, что это не работает, потому что система биткойнов никогда не создавалась для такой работы. Это не имеет смысла, потому что на самом деле биткойны не возвращаются нужной стороне и потому что нет причин ожидать, что это произойдет. Нет никакого нарушения доверенного частного владения закрытыми ключами — провайдер владеет закрытыми ключами, а открытые ключи являются общедоступными.
@DavidSchwartz, there is no reason to expect it to do soпочему? ядро биткойна не предоставляет заявлений об ожидаемом поведении или семантике, они только предоставляют справочную базу кода. В исходном техническом документе говорится, coins made from digital signatures, which provides strong control of ownershipчто контроль не передается от пользователя к пользователю ... в нем также говорится, что a new key pair should be usedон говорит, что должен , а не должен ... Без централизованного органа, определяющего, какая точка зрения является действительной и канонической, они должны оба быть действительным. Так почему моя точка зрения неверна?
Это все равно, что сказать, что control of ownershipвсе в руках веб-провайдеров, и поэтому нет никаких гарантий, кто получит деньги, веб-провайдер может украсть все деньги для себя, поэтому не следует ожидать использования ЛЮБОГО платежного адреса на основе веб-провайдера. отправить деньги пользователю, которого вы ожидаете...
@ user3338098 Мой ответ объясняет, как ваша точка зрения приводит к неверным выводам. Вышеприведенное заявление о веб-провайдерах верно, и именно поэтому мы не отправляем деньги случайным образом в места, которые веб-провайдеры сообщают нам, чтобы не было доказательств того, что конкретный получатель специально просил нас отправить деньги в место, которое мы получили от определенного веб-провайдера. Именно таких доказательств у нас нет в случае биткойна.
@DavidSchwartz That evidence is specifically what we don't have, тогда что такое «404371705fa9bd789a2fcd52d2c580b65d35549d» в OP_DUP OP_HASH160 404371705fa9bd789a2fcd52d2c580b65d35549d OP_EQUALVERIFY OP_CHECKSIGфайле . Криптографически подписанные доказательства. scriptPubKeyscriptSig
@DavidSchwartz Your statement above about web providers is right, но я приводил абсурдный аргумент ( the web-provider could steal all the money for themselves [...] should not be expected to send money to the user you expect it to...), единственным выводом которого было бы то, что никто никогда не должен использовать веб-провайдера (за исключением отмывания денег / мазохистских пожертвований через веб-провайдера). Это противоречило бы самой предпосылке для кошельков на основе веб-провайдера.
@DavidSchwartz позволяет сделать это проще: Боб не вносит биткойны, а вносит наличные деньги на свой счет, и веб-провайдер вместо перевода этой суммы на его биткойн-адрес, как ожидалось (IMO), вместо этого выделит его средства из «объединенный биткойн-адрес сообщества», и это то, из чего в конечном итоге тратят Алиса и Боб. Это нарушает принцип собственности и пока не обсуждалось в нашем разговоре, но если бы это было так, то я бы согласился, что доказательств не было, но я бы также сказал, что веб-провайдер был не в той ИМО.
@user3338098 user3338098 Я не понимаю, какой «принцип собственности», по вашему мнению, он нарушает. Если я должен вам деньги, для меня вполне естественно приказать кому-то, кто должен мне денег, выплатить эти деньги вам. Для вас совершенно нормально не получать деньги напрямую от человека, который вам их должен. Именно по этой причине существуют финансовые посредники, и большинство людей, использующих биткойн, делают это через посредников, потому что правильно соблюдать условия самообслуживания сложно.

Как бы вы это сделали?

Я бы предоставил свой более-менее "публичный" адрес. Тогда люди могли бы отправлять сатоши на этот адрес. Как только транзакция с Satoshis будет подтверждена, я проанализирую транзакцию, потому что она содержит scriptsig и pubkey (из которых мы можем получить адрес отправки). Так что я бы сохранил это и, когда придет время, отправил бы обратно на этот адрес. Проблема здесь: это снижает конфиденциальность. Не рекомендуется повторно использовать адреса.

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

да, вы можете настроить/запрограммировать свою транзакцию таким образом, чтобы адреса использовались повторно. Нужно иметь достаточные навыки, хотя :-)

или мне нужно будет запросить обратный адрес и каким-то образом связать адрес отправленной суммы с обратным адресом?

имхо, это лучший и желаемый способ, потому что он сохраняет конфиденциальность. Также вам не нужно привязывать сумму к адресу — это может стать небезопасным (два человека отправляют одинаковую сумму — как отличить?). Как и раньше, транзакцию можно просмотреть, извлечь sig и pubkey и связать исходный pub key (и его адрес) с новым адресом.
О транзакциях и их содержимом: https://bitcoin.org/en/developer-reference#raw-transaction-format , а также очень полезно: http://chimera.labs.oreilly.com/books/1234000001802/ch02.html# _bitcoin_transactions (и, возможно, миллион других :-)

Конфиденциальность — не единственная проблема. Какая отправляющая транзакция является coinjoin? Вы рискуете отправить обратно не тому человеку. И даже если нет, вы не должны ожидать, что программное обеспечение отправителя будет ожидать платежа на адрес, который он, возможно, никогда не выдавал явно в качестве адреса платежа (это могло быть даже изменение, не зная, кому его зачислить).
вот почему нам нужно больше PWKU (Pieter Wuille Knowledge Units) в области блокчейна :-)