Как для транзакций «отправить», так и для «получить» команда gettransaction
дает мне имя учетной записи и адрес получателя, игнорируя адрес отправки. Почему я должен заботиться о получении адреса в транзакции «получения»? Я хочу знать адрес отправки , конечно...
Почему это не работает, что мне не хватает и как я могу получить адрес отправки в транзакции получения?
редактировать : я хотел бы подчеркнуть вопрос о том, почему он ведет себя таким образом? как в этом комментарии: «Я не понимаю: если я ввожу txid в blockchain.info, он сообщает мне адрес отправителя, поскольку он, очевидно, присутствует в блокчейне… так что это просто выбор bitcoind
не говорить мне? "
edit : отправка чего-либо обратно на адрес from полностью выходит за рамки вопроса, поэтому это не имеет значения, если они могут не захотеть получить что-либо там.
Я собирался ответить на другой вопрос , который тем временем был закрыт как дубликат, но я буду использовать описанный там случай в качестве примера, чтобы ответить на этот вопрос.
Предполагая , что транзакция на самом деле является стандартной транзакцией, сценарий фактически раскрывает отправителя транзакции. Согласно стандартному описанию транзакции в спецификации протокола , транзакция должна сначала доказать право собственности на выход, чтобы потребовать его и потратить в новой транзакции. Транзакция , которая дала отправителю средства, указывает хэш открытого ключа, на который должны быть отправлены средства. В данном случае это выходной скрипт 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
который является адресом, который отправил биткойны в транзакции, которую мы просматривали все время. Итак, вы видите, что информация, которую вы искали, все это время была в транзакции, но довольно скрыта. Таким образом, учитывая входящую транзакцию (или на самом деле исходящую), вы можете восстановить, кто был отправителем (или получателем). Обратите внимание, что это позволяет восстановить отправителя каждого отдельного ввода, который может быть несколькими адресами. Простое предположение, что любой из адресов, подписывающих входные данные, является отправителем транзакции, может привести или не привести к желаемому семантическому результату.
Я думаю, это из-за предполагаемой модели безопасности — вы генерируете адрес для клиента, который отправляет ему биткойны.
Предоставление людям возможности выяснить адрес отправки может привести к тому, что люди создадут один биткойн-адрес, а затем попросят клиентов ввести свой адрес отправки.
Что касается того, как...
Я нашел эти три темы:
о0'.
bitcoind
не говорить мне?Питер Уилле
о0'.
Питер Уилле