Как найти ошибку SCALE-декодера на длине 64
Вектор может правильно декодироваться во всех коротких тестах и сломаться ровно при 64 элементах. На этой границе меняется режим компактного префикса длины SCALE.
Воспроизведите границу эталонным кодеком
В Rust-проекте с parity-scale-codec выполните проверки кодирования. Два младших бита компактной записи определяют режим. При 63 длина занимает один байт, при 64 — два. Третья проверка показывает обычную запись того же числа в u32 фиксированной ширины.
use parity_scale_codec::{Compact, Encode};
fn main() {
assert_eq!(Compact(63u32).encode(), vec![0xfc]);
assert_eq!(Compact(64u32).encode(), vec![0x01, 0x01]);
assert_eq!(64u32.encode(), vec![0x40, 0, 0, 0]);
}
После префикса учитывайте тип элементов
Vec<u16> из 64 элементов начинается с 01 01, после чего следуют 128 байт содержимого. Если обработчик съел один байт длины, каждый элемент будет прочитан со смещением. У фиксированного массива из 64 значений u16 другая схема без префикса длины вектора.
Добавьте тестовые данные с обеих сторон границ поддерживаемых режимов и сверяйте число прочитанных байтов. Для SCALE декодеру нужно заранее знать ожидаемый тип.