Почему gettransaction сообщает мне только адрес получения?

Как для транзакций «отправить», так и для «получить» команда gettransactionдает мне имя учетной записи и адрес получателя, игнорируя адрес отправки. Почему я должен заботиться о получении адреса в транзакции «получения»? Я хочу знать адрес отправки , конечно...

  • "получить" --> отправить адрес, получить учетную запись
  • "отправить" --> отправить аккаунт, получить адрес

Почему это не работает, что мне не хватает и как я могу получить адрес отправки в транзакции получения?

редактировать : я хотел бы подчеркнуть вопрос о том, почему он ведет себя таким образом? как в этом комментарии: «Я не понимаю: если я ввожу txid в blockchain.info, он сообщает мне адрес отправителя, поскольку он, очевидно, присутствует в блокчейне… так что это просто выбор bitcoindне говорить мне? "

edit : отправка чего-либо обратно на адрес from полностью выходит за рамки вопроса, поэтому это не имеет значения, если они могут не захотеть получить что-либо там.

Ответы (2)

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

Предполагая , что транзакция на самом деле является стандартной транзакцией, сценарий фактически раскрывает отправителя транзакции. Согласно стандартному описанию транзакции в спецификации протокола , транзакция должна сначала доказать право собственности на выход, чтобы потребовать его и потратить в новой транзакции. Транзакция , которая дала отправителю средства, указывает хэш открытого ключа, на который должны быть отправлены средства. В данном случае это выходной скрипт 1 транзакции f8c71a9f7...:

OP_DUP OP_HASH160 496650cdb4b6275ca4478c0ce98cb6f7224bb1e7 OP_EQUALVERIFY OP_CHECKSIG

Обратите внимание на 496650cdb4b6275ca4478c0ce98cb6f7224bb1e7там. Это хэш открытого ключа. Чтобы запросить этот вывод, а затем отправить его вам, отправитель должен предоставить как открытый ключ, так и действительную подпись. Итак, давайте взглянем на скрипт, заявивший об этом выводе:

304402205e81e8ed0b1f7cf6d1d415961859d3b95f5e5c353af303b6cef1e3efa6c3349702202fa9fdd6914abd0e9606c78899e7f3010cafdad211645cf459ae18b3b827b2c101 0365e0beb9a0c1497f3667067aeb8f3ea9dc4c9d5696cee7f19eae49f9457a5cfb

Поскольку это стандартная транзакция, она будет соответствовать формату <sig> <pubKey>, поэтому открытый ключ имеет значение 0365e0beb9a0c1497f3667067aeb8f3ea9dc4c9d5696cee7f19eae49f9457a5cfb. Чтобы убедиться в этом, мы проверяем, совпадают ли хэши (код Python впереди):

script = "304402205e81e8ed0b1f7cf6d1d415961859d3b95f5e5c353af303b6cef1e3efa6c3349702202fa9fdd6914abd0e9606c78899e7f3010cafdad211645cf459ae18b3b827b2c101 0365e0beb9a0c1497f3667067aeb8f3ea9dc4c9d5696cee7f19eae49f9457a5cfb".split()
h = hashlib.sha256(script[1].decode("hex")).digest()
ripe160 =  hashlib.new('ripemd160')
ripe160.update(h)
d = ripe160.digest()
print d.encode("hex")

Это должно привести 496650cdb4b6275ca4478c0ce98cb6f7224bb1e7к хэшу, который мы видели в выходном сценарии заявленного аута, который, наконец, был отправлен вам. Обратите внимание, что для расчета этого нам не нужно было извлекать транзакцию, f8c71a9f7...а просто полагались на информацию, которую вы могли получить из полученной транзакции. Теперь, поскольку адрес — это не более чем хэш открытого ключа, мы можем просто построить адрес из информации, которую мы собрали до сих пор (уже имея хэш, мы начинаем с шага 4 в построении адреса ):

#Prepend the Mainnet prefix
address = ('\x00' + d)
#Calculate checksum
checksum = hashlib.sha256(hashlib.sha256(address).digest()).digest()[:4]
# Build the raw address
address += checksum
# Encode the address in base58
encoded_address = b58encode(address)
print encoded_address

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

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

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

Что касается того, как...

Я нашел эти три темы:

Я не понимаю: если я ввожу txid в blockchain.info, он сообщает мне адрес отправителя, поскольку он, очевидно, присутствует в блокчейне... так что это просто выбор bitcoindне говорить мне?
Это не выбор: биткойн-транзакции не имеют адреса «от». Что у них есть, так это входы, и каждый вход относится к выходу предыдущей транзакции. Каждый из этих предыдущих выходов может иметь или не иметь идентифицируемый адрес, на который он отправлял вещи. Было бы и неэффективно искать его, и неправильно полагаться на него. Он дает вам адрес, принадлежащий кому-то, кто ранее контролировал эти выходы (которые могут отличаться от отправителя, например, для электронных кошельков), и кто, возможно, не собирается ничего там получать.
@PieterWuille Я не понимаю: как blockchain.info сообщает мне входной адрес, насколько он точен? (отправка чего-либо выходит за рамки вопроса)
Они дают вам адрес (если есть), которому принадлежали использованные предыдущие выходы. Это не является частью самой транзакции, и для ее выяснения необходимо просмотреть все предыдущие транзакции, выходные данные которых были потрачены этой транзакцией. Это, безусловно, выполнимо, но неэффективно, это не часть транзакции, которую вы ищете (что и получает getrawtransaction), и это усиливает неверное представление о том, что биткойн-транзакции имеют адрес отправителя.