Почему префикс IPFS в ENS contenthash занимает два байта

Шлюз сайта удаляет первый байт из записи contenthash и передаёт остаток декодеру CID. Все ссылки ломаются, хотя другой клиент ENS открывает сайт.

Разберите код протокола перед идентификатором

Префикс записан как беззнаковое число переменной длины. В укороченном примере байты e3 01 кодируют номер протокола 0xe3, а следующие 01 70 начинают CID. Код показывает только этот двухбайтный случай. В рабочем обработчике используйте декодер varint с проверкой границ и смещайтесь на фактически прочитанное число байтов.

const bytes = Uint8Array.from([0xe3, 0x01, 0x01, 0x70]);
const protocol = (bytes[0] & 0x7f) | ((bytes[1] & 0x7f) << 7);
console.log(protocol.toString(16), bytes.slice(2));

Выберите обработчик по номеру протокола

Для IPFS передайте оставшиеся байты библиотеке CID, проверьте корректность идентификатора и затем стройте URL шлюза. Пример намеренно обрывается до конца CID и не указывает на настоящий файл. Для другого протокола формат нагрузки может отличаться. Сохраняйте исходную запись, чтобы в сообщении об ошибке отличать неизвестный протокол от повреждённого CID.

eips.ethereum.org ERC-1577 contenthash