Я не говорил, что блок делится. Я понимаю так, что у нас появляется дополнительный
блок данных- сегвит-блок. Ведь основной блок как был до 1мб, так и остается.
А дополнительный может занимать до 3мб.
Я еще раз повторяю - нет двух блоков в сегвите. Есть один блок лежащий на диске
в blk-файле как массив данных и размером он может быть больше 1 мегабайта.
И еще раз повторяю - как именно ваш клиент хранит этот блок на диске никого не касается.
Вопрос в том - если у вас этот блок спросит "старый клиент" - вы ему "на лету" сконвертируете
этот блок в "старый формат", вырезав из каждой транзакции её сегвит-часть и отдадите что
получилось. И старый клиет останестя доволен - с его точки зрения это будет валидный
блок размером меньше мегабайта.
Если у вас попросит этот же блок, с этим же идентификатором новый клиент - вы ему отдадите
блок "как он есть". И новый клиент тоже проверит транзакции в блоке и будет доволен.
Если вы ошибетесь, и старому клиенту отдадите новый блок - тот вас не поймет и разорвет соединение.
Если вы новому клиенту отдадите старый формат блока - новый клиент немного расстроится и
спустит этот блок в унитаз и будет просить у кого-то другого.
Но начнем с азов. Может, где-то ошибаюсь.
Пластичность транзакции- это, когда берется валидная транзакция, в ней
меняются некоторые данные, она остается при этом валидной.
По смыслу она не меняется, входы и выходы остаются такими же.
Но, так как байты были поменяны, TXID становится другим.
Абсолютно верно.
Пластичные транзакции могут быть только вне блокчейна. В блокчейн попадает только одна из них.
Так и есть.
Чтобы решить эту проблему, надо убрать данные, которые можно менять.
Это попытались уже исправить, возможности изменений уменьшили.
Но теория гласит, что в общем случае, решить проблему невозможно.
Тут заблуждаетесь.
Да, пластичность транзакции возникает из-за того, что некоторые вещи в транзакции можно
поменять. Например, в математике число 1 можно записать множеством разных способов.
1 или 01 или 001 или 0001 и даже 000000000000000001 - это все равно 1
Один из способов побороть пластичность было решение "минимальной длины" - то есть все
обычные числа которые используются в транзакции записываются строго одним способом.
Если нода встречает транзакцию в которой число записано неоптимальным способом - есть
два пути - проигнорировать такую транзакцию или самостоятельно привести транзакцию к
оптимальному виду не теряя при этом её валидности.
Второй вариант пластичности транзакций который наделал много шума благодаря вашему
покорному слуге и из-за которого погорел гокс - это пластичность самой ECDSA-подписи.
Подпись - это по сути два 256-битных числа, которые обычно называют R и S для
удобства. Так вот, если в подписи поменять значение S на минус S - то подпись остается
верной, а транзакция валидной, но меняет свой txid
Решение было принято простое - ноды перестали майнить транзакции с "отрицательным" S
и этого варианта пластичности уже год как нет. Это не было принято как софт-форк, а
только как полиси, то есть майнеры имеют право майнить транзакции и с отрицательным S
но никто это не делает.
Есть еще несколько вариантов пластичности транзакций. И все эти проблемы де-факто
были решены. То, что сейчас сегвит позиционируется как окончательное решение этой проблемы
верно, но
проблемы этой на сегодняшний момент не существует. То есть это решено
в общем случае или может быть решено простым софт-форком, который и так де-факто принят.
Теперь, что касается сегвит-транзакции. Все-таки, она состоит из двух частей,
первая записывается в основной блок, вторая часть в сегвит-блок.
Ну хорошо. Если вам так удобнее себе представлять, давайте считать, что ваш
клиент записывает эти две части раздельно. Право же, это неважно.
Но так как данные, которые можно было менять, перешли во вторую часть, то в
первой части нельзя ничего менять. Поэтому нельзя сделать пластичную транзакцию,
чтобы поменялся TXID. Так как TXID считается только по той части, которая попадает
в основной блок.
Верно с одним замечанием - во второй части тоже
ничего нельзя менять. не всегда и не
всё можно менять. Там находится (для стандартной сегвит-транзакции) ваш публичный ключ
и ваша подпись. При изменении хоть одного байта в публичном ключе подпись становится
невалидной. При изменении хоть одного байта в подписи - подпись тоже становится невалидной.
Ага, вспоминаем что число S в подписи можно поменять на противоположное? Ну, даже, допустим
мы поменяем S - что от этого изменится в мире? Ни-че-го кроме байтиков на вашем диске.
Я точно не помню, но по-моему клиент по-прежнему считает валидным значением только
положительное значение S. Но если от встретит отрицательное - то может спокойно заменить
его даже в блоке. От этого ни транзакция, ни блок не пострадают.
Вопрос был, можно ли поменять вторую, сегвит-часть транзакции, чтобы при этом
вся транзакция в целом оставалась валидной.
Смотря какая там транзакция и что вы собираетесь там менять.
Если теория утверждает, что проблема пластичности не решается, то ответ должен быть МОЖНО.
Вы не можете там просто любые байты на любые другие байты поменять.
Ибо зачем тогда сегвит часть нужна если она по сути не используется?
Если вы что-то поменяете в сегвит-части транзакции, которая не включена еще в блок, то
- TXID не поменяется
- входы не поменяются
- выходы не поменяются
- а вот верификацию транзакция скорее всего не пройдет