Можно ли добавить вход в транзакцию, которая находится в мемпуле?
Например, если кто-то платит 1 BTC своему другу, я могу получить необработанные шестнадцатеричные данные этой транзакции из мемпула до того, как она будет добыта.
Затем я могу подписать неизрасходованную транзакцию (скажем, 3 BTC) своим закрытым ключом, перечислить ее в качестве входных данных и получить для этого необработанные шестнадцатеричные данные. Затем я могу добавить вывод 3 BTC на чужой адрес (кому я хочу заплатить) и ретранслировать эту новую транзакцию в сеть.
Что мешает этому произойти?
Краткий ответ: нет, это невозможно.
Более длинный ответ: некоторые транзакции позволяют изменять используемые входы (входы ANYONECANPAY). Также возможно иметь входы, которые не подписывают создаваемые выходы (SIGHASH_NONE). Однако транзакция, в которой все входы относятся к этому типу, бесполезна, так как любой может изменить выходы, чтобы вместо этого кредитовать себя.
Как правило, когда используются обычные подписи SIGHaSH_ALL, практически все в транзакции подписывается (какие входные монеты используются (и в каком порядке), какие выходные сценарии создаются, какое значение им присваивается, ... все, кроме подписей). себя на самом деле (что и вызывает непроизвольную податливость).
Если входная подпись помечена как ANYONECANPAY, она не подписывает другие используемые входные монеты. Это означает, что вы можете создать транзакцию, означающую «я хочу, чтобы x и y были оплачены, но мне все равно, кто предоставит для этого средства». Если все подписи в транзакции являются ANYONECANPAY, вы можете добавить дополнительные входы (или удалить существующие входы. Однако простое увеличение входных средств просто сожжет их как комиссию.
С другой стороны, есть SIGHASH_NONE, что делает подпись не подписывающей выходные данные транзакции. Может показаться, что это разрешает то, что вы хотите, но в случае, если каждая подпись имеет значение SIGHASH_NONE, транзакция совершенно небезопасна, поскольку любой может заменить, куда идут выходные данные.
Таким образом, даже если их комбинация теоретически позволит то, что вы предлагаете, это не верно для типичных действий, и на самом деле это будет совершенно небезопасно.
Невозможно добавить дополнительные входные данные (или выходные данные) к чужим транзакциям, не заставив их подписать новую транзакцию, потому что их подпись действительна только для заданных базовых входных и выходных данных.
Возможный источник путаницы заключается в том, что другие аспекты транзакции действительно податливы (их можно изменить до тех пор, пока они не будут завершены путем включения в блокчейн в процессе майнинга). Например, существует тривиальное преобразование формирования новой действительной подписи из существующей действительной подписи, которая, по сути, берет от нее отрицательное значение, а также могут быть добавлены начальные нули. В некотором смысле это унаследованная проблема, потому что подписи до Биткойна рассматривались как имеющие значение для подтверждения подлинности других данных, а не как уникальные сами по себе, так что в неожиданном случае обнаружения этих нестандартных форматов для подписи, отказ от их принятия был разумным выбором.
Никакое такое изменение не изменяет основную передачу биткойнов, они изменяют только хэш (идентификатор транзакции или txid) существующей транзакции. Это означает, что такое изменение может запутать вовлеченные стороны, поскольку транзакция подтверждается с неожиданным txid, но они не влияют на то, сколько биткойнов передается с каких входов на какие выходы.
Вы не можете, это создаст совершенно другую транзакцию, а другая будет признана недействительной, как только одна дойдет до майнера и дойдет до блока.
Обычно* биткойн-транзакция включает в себя подпись для подтверждения следующих вещей:
Вход или выход указывает как адрес, так и количество. Если что-то из этого изменится, потребуется новая подпись, которую может создать только тот, у кого есть закрытый ключ. Изменение ввода или вывода сделает подпись недействительной. Только владелец закрытого ключа может сделать такое изменение, и только он может создать новую подпись. Даже тогда это создаст совершенно новую транзакцию, которую нельзя будет спутать с исходной.
То , что можно изменить до того, как транзакция будет включена в блокчейн, — это идентификатор транзакции. Изменение этого может вызвать путаницу у любого, кто принимает неподтвержденные транзакции, но оно не может изменить ввод или вывод — это просто метка. Для людей, которые принимают только подтвержденные транзакции, транзакция уже будет в блокчейне, где ничего нельзя изменить, поэтому нет возможности для путаницы.
Я стремился к простому объяснению, поэтому я не включил детали транзакций с несколькими входами с разными закрытыми ключами, но то же самое применимо. Никакая третья сторона не может вносить изменения, кроме идентификатора транзакции, который не влияет на то, какая сумма биткойнов переводится или откуда и куда она переводится.
Приведенное выше объяснение относится к стандартным транзакциям. Для совершения транзакции, к которой эти средства защиты не применяются, потребуется либо специальное программное обеспечение, либо глубокое понимание. Для получения дополнительной информации о транзакциях см. следующее:
* Хотя можно преднамеренно создать транзакцию, которая не указывает входы, или даже транзакцию, которая не указывает выходы, я предполагаю, что вопрос касается обычного процесса создания транзакции от указанных входов к указанным выходам. ).
** Под «включенными в цепочку блоков» я имею в виду включенные с тем количеством подтверждений, которое вы считаете достаточным для ваших целей. Если транзакция имеет только одно подтверждение, то все еще возможно, что блок, в который она была включена, позже станет осиротевшим. С каждым дополнительным подтверждением риск этого значительно снижается.
бвпкс
бвпкс
Питер Уилле