Некоторые люди были предположить, что буферы протокола может быть больше, чем пользовательские письменного макете пакета. Я подозреваю, что на самом деле это было бы * меньше * из-за какой-то умного кодирования, используемого в буферах протокола.
Я согласен, что это может быть меньше; не обязательно из-за умное кодирование, а потому, что это позволит нам упасть зарезервированные байты и тому подобные.
Это тоже, хотя контраргумент люди всегда делают к тому, что мы могли бы избавиться от зарезервированных байтов в любом случае. Независимо от того, насколько непрактично это было бы: /
Чтобы решить эту проблему, я думаю, что тест в порядке, я должен кодировать пакет бумажник файл / сеть с использованием буферов протокола и сравнить размер пакетов в текущей схеме. Тем не менее, я понятия не имею, что в пакете, какие данные хранятся в пакете, и в каком формате?
Это будет трудная часть, конечно. Если вы хотите проверить с версией пакета (на самом деле не идеальный, так как он отправляется только один раз в связи), я декодируется, что полностью:
http://bitcointalk.org/index.php?topic=231.msg6250#msg6250Я надеялся, что для пакета сделки или что-то, но я дам ему идти с этим в настоящее время. Я мог бы также проверить с файлом кошелька, если кто-то расшифровал, что?
Приложение:
Хорошо, работа от этого резюме макета версии пакета:
версия
* {0xf9,0xbe, 0xb4,0xd9}
* "версия" (0x00 подложка)
* 4 байта размер сообщения
* 4 байта контрольной суммы
* 8 байт nLocalServices (всегда 1, если! fClient, не знаю, либо, что это значит)
* 8 байт временной метки (не забудьте использовать сетевой порядок байт)
* Удаленный адрес (адрес этого узла думает, что он есть):
о nServices - uint64 (8b), до сих пор загадочны, не знаю, смысл еще
о pchReserved - (12b): некоторые зарезервированное место, по-видимому, для последующего IPv6
О ф - UINT (4b)
о порт - беззнаковое короткое (2b)
* Локальный адрес (адрес этого узла видит вас под):
о nServices - uint64 (8b), до сих пор загадочны, не знаю, смысл еще
о pchReserved - (12b): некоторые зарезервированное место, по-видимому, для последующего IPv6
О ф - UINT (4b)
о порт - беззнаковое короткое (2b)
* 8 байт nLocalHostNonce (необходим для рукопожатия, если я не ошибаюсь)
* Строка подрывной "+0,0" в моем случае
* NBestHeight - Int (4б): по-видимому, последний номер блока
Я создал это определение буфера протокола:
версия сообщения
{
сообщение AddressInfo
{
требуется unint64 nServices;
требуется fixed32 IP;
требуется UInt32 порт;
}
требуется uint32 магия = 2045; // 0xf9 | 0xbe << 1 | 0xb4 << 2 | 0xd9 << 3
требуется uint32 версии;
требуется int64 контрольной суммы;
требуется UInt64 метки времени;
Необходимые nLocalServices uint64;
требуется AddressInfo Remote; // адрес этого узла думает, что он является
необходимый AddressInfo Local; // адрес этого узла видит вас под
требуется fixed64 nLocalHostNonce;
требуется строка SubversionString;
требуется uint32 nBestHeight;
}
Значит ли это выглядеть правильно? Единственные изменения, которые я сделал это, что вдавленные вещи в списке точек пули вложенные типов сообщений, и я полностью сбросил 12 байт зарезервированной ipv6 пространства (так что легко может быть добавлены позже, что точка буферы протокола). Я должен отметить, что я probbaly не выбрал лучшие типы кодирования для всех этих областей, что зависит от значений они, вероятно, для хранения, поэтому на практике пакет, вероятно, будет немного меньше, чем мои тесты показывают,