24:30 по-моему здесь неправильно объяснена строчка extcodecopy(address(), add(footer, 0x20), 0x4d, 0x60). К footer прибавляется 0х20 не для того, чтобы получить в итоге 0х80 (вызывая в assembly footer, мы получаем ячейку памяти, откуда эта переменная начинается, то есть 0х80), а чтобы пропустить и не перезаписывать первый слот этой переменной (0х80-0хA0), в котором хранится длина footer (0x60), так как для хранения динамических типов первый слот солидити резервирует под длину переменной. Соответственно мы не перезаписываем 0х60, а делаем так, что footer на уровне памяти (в ячейках 0х80...0х80+0х80) содержит | 0x60 | 0x... | 0x... | 0x... |
@IlyaBodrovKrukowski Жыл бұрын
Кстати, видимо, вы правы. Я не до конца этот момент проработал, а стоило бы. В идеале, надо глянуть дебаггер, что там происходит поточнее и разобраться наверняка, но этот комментарий я закреплю
@IlyaBodrovKrukowski Жыл бұрын
Да, в общем ещё раз подумал и понял, что так и есть. 0x60 - общая длина всех трёх полей, так что да, она конечно же нужна. Изначально я вообще не хотел эту строку так подробно разбирать, на монтаже всё-таки надиктовал пять минут ещё и, конечно, надо бы это проверить, а не рендерить сразу. Спасибо за замечание