Определение адресов возврата с помощью bitcoind [дубликат]

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

Рассматриваемая транзакция в blockexplorer: 8bc80f72d9cc6fecda77138e7364f95b48d652db404889deafd48158dc46387e .

А ниже результат bitcoind gettransactionдля того же txid. Разве я не должен увидеть то же самое? Или есть проблема с отправкой между кошельками?

{
"amount" : 0.00000000,
"fee" : -0.00010000,
"confirmations" : 1,
"blockhash" : "0000000000941dab82b8f78596f93832104288c85e7951b5f505b8c1c30dd4ba",
"blockindex" : 1,
"blocktime" : 1377648593,
"txid" : "8bc80f72d9cc6fecda77138e7364f95b48d652db404889deafd48158dc46387e",
"time" : 1377648549,
"timereceived" : 1377648549,
"details" : [
    {
        "account" : "",
        "address" : "n1SrgGXRGjK2gKcvSDRVUDPA1aVKBaG6PQ",
        "category" : "send",
        "amount" : -0.10000000,
        "fee" : -0.00010000
    },
    {
        "account" : "",
        "address" : "mtjmGtkZet4Y7rzQrC8cweuJMYGZFpPw4d",
        "category" : "send",
        "amount" : -0.10000000,
        "fee" : -0.00010000
    },
    {
        "account" : "",
        "address" : "n4N4hQZK1sgHv8z3ikHsuN98vGNhshQZSo",
        "category" : "send",
        "amount" : -0.10000000,
        "fee" : -0.00010000
    },
    {
        "account" : "",
        "address" : "mvw4DVoSL7APFGdHb2RGYebzBKDBankTAM",
        "category" : "send",
        "amount" : -0.99950000,
        "fee" : -0.00010000
    },
    {
        "account" : "account1",
        "address" : "n1SrgGXRGjK2gKcvSDRVUDPA1aVKBaG6PQ",
        "category" : "receive",
        "amount" : 0.10000000
    },
    {
        "account" : "account2",
        "address" : "mtjmGtkZet4Y7rzQrC8cweuJMYGZFpPw4d",
        "category" : "receive",
        "amount" : 0.10000000
    },
    {
        "account" : "account3",
        "address" : "n4N4hQZK1sgHv8z3ikHsuN98vGNhshQZSo",
        "category" : "receive",
        "amount" : 0.10000000
    },
    {
        "account" : "account4",
        "address" : "mvw4DVoSL7APFGdHb2RGYebzBKDBankTAM",
        "category" : "receive",
        "amount" : 0.99950000
    }
]
}

Редактировать: А вот результат объединения getrawtransactionи decoderawtransaction:

{
"txid" : "8bc80f72d9cc6fecda77138e7364f95b48d652db404889deafd48158dc46387e",
"version" : 1,
"locktime" : 0,
"vin" : [
    {
        "txid" : "f96590f6db1e8748f349e93ae5e1e335c57d55df9a26a70f99e7c06b32538f16",
        "vout" : 0,
        "scriptSig" : {
            "asm" : "304502201d7a5a31936d9a4a0ff17f357dda13e87d7459a7663d127da783865858b552c5022100bac9edf373d42c578c92231cc096a620baa174d7bf141c519047b3ca5dc3577101 03f5fd9f5ad8f4a5ac11c9c8e6f6b094129dbc3d8a9f753dc8d415c5c42a5cccfa",
            "hex" : "48304502201d7a5a31936d9a4a0ff17f357dda13e87d7459a7663d127da783865858b552c5022100bac9edf373d42c578c92231cc096a620baa174d7bf141c519047b3ca5dc35771012103f5fd9f5ad8f4a5ac11c9c8e6f6b094129dbc3d8a9f753dc8d415c5c42a5cccfa"
        },
        "sequence" : 4294967295
    }
],
"vout" : [
    {
        "value" : 0.10000000,
        "n" : 0,
        "scriptPubKey" : {
            "asm" : "OP_DUP OP_HASH160 da9c29ba563c33688e8e1d85b84a634a271b5282 OP_EQUALVERIFY OP_CHECKSIG",
            "hex" : "76a914da9c29ba563c33688e8e1d85b84a634a271b528288ac",
            "reqSigs" : 1,
            "type" : "pubkeyhash",
            "addresses" : [
                "n1SrgGXRGjK2gKcvSDRVUDPA1aVKBaG6PQ"
            ]
        }
    },
    {
        "value" : 0.10000000,
        "n" : 1,
        "scriptPubKey" : {
            "asm" : "OP_DUP OP_HASH160 9105d7f92fd467f0035cd4b5b58bea1167647618 OP_EQUALVERIFY OP_CHECKSIG",
            "hex" : "76a9149105d7f92fd467f0035cd4b5b58bea116764761888ac",
            "reqSigs" : 1,
            "type" : "pubkeyhash",
            "addresses" : [
                "mtjmGtkZet4Y7rzQrC8cweuJMYGZFpPw4d"
            ]
        }
    },
    {
        "value" : 0.10000000,
        "n" : 2,
        "scriptPubKey" : {
            "asm" : "OP_DUP OP_HASH160 fa9c7e784bfae5e3d330cba28b73c804da71f213 OP_EQUALVERIFY OP_CHECKSIG",
            "hex" : "76a914fa9c7e784bfae5e3d330cba28b73c804da71f21388ac",
            "reqSigs" : 1,
            "type" : "pubkeyhash",
            "addresses" : [
                "n4N4hQZK1sgHv8z3ikHsuN98vGNhshQZSo"
            ]
        }
    },
    {
        "value" : 0.99950000,
        "n" : 3,
        "scriptPubKey" : {
            "asm" : "OP_DUP OP_HASH160 a918d01415a09ee82034f1dce3217741dcdf5849 OP_EQUALVERIFY OP_CHECKSIG",
            "hex" : "76a914a918d01415a09ee82034f1dce3217741dcdf584988ac",
            "reqSigs" : 1,
            "type" : "pubkeyhash",
            "addresses" : [
                "mvw4DVoSL7APFGdHb2RGYebzBKDBankTAM"
            ]
        }
    }
]
}

Вот ссылка, в которой говорится, что единственный способ - определить выходной индекс предыдущей транзакции: https://bitcoin.stackexchange.com/a/12472/3413 .

Если это верно, то для определения адреса «возврата» конкретной транзакции вам нужно будет запустить следующий псевдокод?:

txhex = getrawtransaction(targettxhash)
txjson = decoderawtransaction(txhex)
foreach txinput in txjson.vin:
  txhexprev = getrawtransaction(txinput.txid)
  txjsonprev = decoderawtransaction(txhexprev)
  foreach txprevoutput in txjsonprev.vout:
    txrefundarray[] += {'address':txprevoutput.scriptPubKey.addresses[0], 'amount':txprevout.value} // 0th address only doesn't support multi-sig
Возможно, вы захотите прочитать этот вопрос: Можно ли отменить транзакцию биткойнов с принимающей стороны?

Ответы (3)

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

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

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

Я хочу автоматически определить входы и связанные адреса для данной транзакции с биткойнами. «Спросить об этом у клиента» выходит далеко за рамки моего вопроса.
Вы просили способ определить исходный адрес транзакции, чтобы сделать возмещение. Биткойн на уровне протокола не имеет ни исходных адресов, ни надежного способа определения адресов возврата. Пока протокол оплаты не станет общедоступным, единственный способ сделать это — обратиться к клиенту. Да, у транзакций есть входы, и потребляемые ими выходы могут быть назначены идентифицируемым адресам, и это можно определить, как вы утверждаете. Хотя это не ответ на ваш вопрос.
Я ценю ваш вклад, однако я не ищу теоретического обсуждения на уровне протокола. Многие сайты используют систему, похожую на возврат, основанную на «входах», и это был ответ, который я искал.
Хорошо, тогда единственный правильный ответ - "его не существует". Адресов для возврата в настоящее время не существует, и использование предыдущих адресов для этого требует предположений о программном обеспечении получателя, наносит ущерб масштабируемости экосистемы и ее конфиденциальности в целом. На ваш вопрос нет ответа. Я знаю, что многие сайты не следуют этому правилу, но они мешают экосистеме перерасти некоторые предположения, которые сегодня могут быть верны.
Я не хочу принимать ответ «его не существует» в качестве предлога для того, чтобы что-то не строить. Похоже, что разработчики не заинтересованы в добавлении простых функций, таких как «расходы с», в биткойн, поэтому людям приходится делать предположения и создавать их извне.
Над ним работают, и он называется платежным протоколом, который будет присутствовать в версии 0.9. Дело в том, что он принадлежит не протоколу P2P, а верхнему уровню, который позволяет согласовывать транзакции между отправителем и получателем до того, как они будут переданы в сеть. Блокчейн — это дорогостоящая глобальная вещь в обслуживании, и он лишь незначительно функционирует как протокол связи. Нет причин помещать в него данные, которые являются частной информацией между отправителем и получателем.
@PieterWuille Не должно быть семантической разницы между двумя понятиями «адрес возврата» и «транзакция, отправленная с». Можно определить «транзакцию, отправленную от» , и, следовательно, можно сделать автоматический возврат средств (обычно). Если веб-кошелек не может направить платеж, это ИХ проблема. Биткойн-адрес представляет собой хэш открытого ключа, используемого для подтверждения права собственности. Если веб-кошелек нарушает принцип владения, значит, биткойн не реализован должным образом.
@user3338098 user3338098 Не обращая внимания на то, что это ужасная практика для конфиденциальности, она даже не всегда работает. Например, в транзакции CoinJoin некоторые входные данные будут поступать от одного отправителя, а некоторые — от другого. Конечно, у вас может быть договоренность с отправителем о том, что возмещение может быть сделано, но в целом вы не должны предполагать, что получатель примет транзакцию в качестве платежа без явного указания адреса для отправки.
@PieterWuille Я понимаю, что это не работает постоянно (из-за веб-провайдеров) и снижает конфиденциальность. Можем ли мы согласиться с тем, что в исходном официальном документе о биткойнах говорится coins made from digital signatures, which provides strong control of ownershipи что веб-провайдеры, вероятно, нарушают этот принцип владения, повторно используя закрытые ключи для разных пользователей.
@user3338098 user3338098 Даже если вы предполагаете это, как вы будете действовать в случае, когда несколько владельцев совместно создают одну транзакцию (где разные входные данные могут быть связаны с разными пользователями)? Это очень поощряемая практика.
@PieterWuille Если кто-то оплатил продукт (который предупредил об автоматических возвратах на входы транзакции) с помощью транзакции CoinJoin, этот клиент ** буквально ** отказался от каких-либо прав собственности на свой платеж возврата, по своему выбору использовать CoinJoin транзакция для осуществления платежа. В любом случае такие транзакции могут быть обнаружены (все входы и выходы довольно легко обнаружить), а автоматические возвраты остановлены для ручной обработки (с очевидной комиссией за обработку, вычтенной из их возмещения! Хотя я бы предпочел назвать это идиотской платой за взаимодействие). .)

Кто-то написал фрагмент python , который пытается определить «входные адреса» конкретной транзакции, используя выходные данные предыдущей транзакции в качестве работоспособного, но не на 100% ненадежного решения. Это выполнило то, что мне нужно.

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

getrawtransactionпокажет вам транзакцию в блокчейне, а не влияние на ваш кошелек (однако для этого требуется настройка txindex=1). Однако это все равно не даст вам адрес возврата (см. Мой ответ).