Почему RLP был выбран в качестве алгоритма кодирования протокола низкого уровня?

Это специальное решение? Почему РЛП? Он специально подходит для чего-то?

См. обоснование дизайна: github.com/ethereum/wiki/wiki/Design-Rationale#rlp .
@dbryson Да, я думал точно так же, как и вы, когда я печатал ответ, и не уверен, как это можно объяснить лучше, чем этот источник.

Ответы (1)

RLP был выбран из-за (1) простоты реализации и (2) гарантированной абсолютной согласованности с точностью до байта.

Источник — Эфириум Вики:

RLP задуман как очень минималистичный формат сериализации; его единственная цель - хранить вложенные массивы байтов. В отличие от protobuf, BSON и других существующих решений, RLP не пытается определить какие-либо конкретные типы данных, такие как логические значения, числа с плавающей запятой, двойные числа или даже целые числа; вместо этого он просто существует для хранения структуры в виде вложенных массивов и оставляет на усмотрение протокола определение значения массивов. Карты ключ/значение также явно не поддерживаются; полуофициальное предложение по поддержке карт ключ/значение состоит в том, чтобы представлять такие карты как [[k1, v1], [k2, v2], ...], где k1, k2... сортируются с использованием стандартного порядка строк.

Альтернативой RLP было бы использование существующего алгоритма, такого как protobuf или BSON; однако мы предпочитаем RLP из-за (1) простоты реализации и (2) гарантированной абсолютной согласованности с точностью до байта. Карты ключ/значение во многих языках не имеют явного порядка, а форматы с плавающей запятой имеют много особых случаев, что потенциально может привести к тому, что одни и те же данные будут иметь разные кодировки и, следовательно, разные хэши. Разрабатывая протокол собственными силами, мы можем быть уверены, что он разработан с учетом этих целей (это общий принцип, применимый и к другим частям кода, например к виртуальной машине). Обратите внимание, что bencode, используемый BitTorrent, мог предоставить приемлемую альтернативу RLP, хотя использование в нем десятичного кодирования длины делает его немного неоптимальным по сравнению с двоичным RLP.

Спасибо всем, я не знал о документе с обоснованием дизайна.
Кстати. Я часто вижу фразу «RLP был выбран », но я не вижу ничего, что указывало бы на то, что RLP существовал за пределами Ethereum. Правильно ли я говорю, что RLP был разработан для Ethereum и специфичен для Ethereum? Спецификация Yellow paper фактически распознает положительные целые числа как часть спецификации RLP, поэтому она не зависит от типа данных и предъявляет особые требования к их кодированию.