Как найти ошибку 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 декодеру нужно заранее знать ожидаемый тип.

Источники