Можно ли добавить вход транзакции в транзакцию в мемпуле?

Можно ли добавить вход в транзакцию, которая находится в мемпуле?

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

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

Что мешает этому произойти?

Ответы (4)

Краткий ответ: нет, это невозможно.

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

Как правило, когда используются обычные подписи SIGHaSH_ALL, практически все в транзакции подписывается (какие входные монеты используются (и в каком порядке), какие выходные сценарии создаются, какое значение им присваивается, ... все, кроме подписей). себя на самом деле (что и вызывает непроизвольную податливость).

Если входная подпись помечена как ANYONECANPAY, она не подписывает другие используемые входные монеты. Это означает, что вы можете создать транзакцию, означающую «я хочу, чтобы x и y были оплачены, но мне все равно, кто предоставит для этого средства». Если все подписи в транзакции являются ANYONECANPAY, вы можете добавить дополнительные входы (или удалить существующие входы. Однако простое увеличение входных средств просто сожжет их как комиссию.

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

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

Спасибо. Я просматривал код больше часа и до сих пор не вижу, где подписаны выходные данные. Я специально смотрю здесь: github.com/bitcoin/bitcoin/blob/master/src/… … кажется, подписаны только входы? Можете ли вы указать строку кода, которая дает понять, что выходы транзакций также подписаны?
Кроме того, я могу «просто поверить вам», но я не вижу в коде ничего, что препятствует тому типу поведения, о котором я спрашиваю. В частности, что мешает кому-то добавить ввод в незаминированную транзакцию SIGHASH_ALL? Слова «все подписано» не полностью отвечают на мой вопрос, я чувствую, что упускаю что-то важное. Подписаны ли все входы каждым закрытым ключом, который указан в транзакции? Насколько я могу судить, каждый вход подписывается индивидуально, и данные этой подписи хранятся независимо от других входных подписей.
Каждый ввод содержит подпись с использованием ключа, необходимого сценарию вывода, используемого этим вводом. Однако подписываемые данные представляют собой (модифицированную версию) всю транзакцию. Добавление дополнительных входных данных к транзакции сделает недействительными любые входные данные SIGHASH_ALL, так как подписываемые данные изменяются.

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

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

Никакое такое изменение не изменяет основную передачу биткойнов, они изменяют только хэш (идентификатор транзакции или txid) существующей транзакции. Это означает, что такое изменение может запутать вовлеченные стороны, поскольку транзакция подтверждается с неожиданным txid, но они не влияют на то, сколько биткойнов передается с каких входов на какие выходы.

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

Я в замешательстве, вы говорите, что это невозможно, или вы говорите, что это возможно, и это просто сделает первую транзакцию недействительной?
Плохо, второй абзац сбил с толку. Я говорю, что вторая транзакция будет недействительной из-за противоречивых входных данных.
У меня сложилось впечатление, что гибкость транзакций возможна из-за того, что порядок транзакций не соблюдается (до того, как блок будет добыт с этой транзакцией в нем). Возможно ли, чтобы вторая большая транзакция была помещена в блок?
Как только транзакция находится в блоке или даже в пуле памяти майнера, все конфликтующие транзакции становятся недействительными. В блокчейне никогда не бывает дубликатов входных данных. Гибкость транзакций создает два TXID, которые указывают на одну и ту же транзакцию, но только один из них может быть действительным и помещаться в блок. Принимая оба варианта как действительные, биржи теряют деньги.
В моем вопросе конкретно упоминаются транзакции, которые еще не добыты. Вопрос в том, можно ли отредактировать необработанную транзакцию, чтобы добавить входы и выходы до того, как транзакция будет добыта, потому что каждый вход подписывается отдельно. Я не спрашиваю о дублирующихся входах, я спрашиваю, возможно ли добавить входы и выходы в транзакцию, которая еще не была добыта, с надеждой ретранслировать ее в пулы, чтобы она была добыта до " host» транзакция добывается. Я не могу найти в протоколе ничего, что технически предотвратило бы это.

Эти вещи не могут измениться:

Обычно* биткойн-транзакция включает в себя подпись для подтверждения следующих вещей:

  1. Вход
  2. Выход

Вход или выход указывает как адрес, так и количество. Если что-то из этого изменится, потребуется новая подпись, которую может создать только тот, у кого есть закрытый ключ. Изменение ввода или вывода сделает подпись недействительной. Только владелец закрытого ключа может сделать такое изменение, и только он может создать новую подпись. Даже тогда это создаст совершенно новую транзакцию, которую нельзя будет спутать с исходной.

То , что можно изменить до того, как транзакция будет включена в блокчейн, — это идентификатор транзакции. Изменение этого может вызвать путаницу у любого, кто принимает неподтвержденные транзакции, но оно не может изменить ввод или вывод — это просто метка. Для людей, которые принимают только подтвержденные транзакции, транзакция уже будет в блокчейне, где ничего нельзя изменить, поэтому нет возможности для путаницы.

В заключение:

  • Ваша транзакция, которая еще не была включена в блокчейн, защищена от изменения ее ввода или вывода. Ни адреса, ни суммы не могут быть изменены или дополнены.
  • Как только ваша транзакция будет включена в цепочку блоков**, она будет защищена от каких- либо изменений, поэтому вы можете безопасно ссылаться на нее по ее идентификатору транзакции без какой-либо путаницы.

Дополнительная информация

Я стремился к простому объяснению, поэтому я не включил детали транзакций с несколькими входами с разными закрытыми ключами, но то же самое применимо. Никакая третья сторона не может вносить изменения, кроме идентификатора транзакции, который не влияет на то, какая сумма биткойнов переводится или откуда и куда она переводится.

Приведенное выше объяснение относится к стандартным транзакциям. Для совершения транзакции, к которой эти средства защиты не применяются, потребуется либо специальное программное обеспечение, либо глубокое понимание. Для получения дополнительной информации о транзакциях см. следующее:

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

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