区块链金融科技【免费下载链接】moneroMonero: the secure, private, untraceable cryptocurrency项目地址https://gitcode.com/gh_mirrors/mo/monero点击查看免费下载Levin 协议是 Monero 节点之间进行点对点通信的底层二进制协议它定义了链上数据同步、交易广播、节点握手等全部 P2P 交互的线上格式on-the-wire format。本文以仓库 docs/LEVIN_PROTOCOL.md 为骨架结合 epee 网络库与 cryptonote 协议层的真实源码实现完整讲解 Levin 报头每个字段的字节布局、五种消息类型的流转规则、以及 10011009 系列命令的语义帮助你从抓包、DPI 识别到自研节点实现都能准确理解 Monero 的 P2P 流量。说明Levin 协议大部分继承自 CryptoNote但 Monero 在 I2P/Tor 匿名网络支持white noise 特性上对其做了扩展。文中协议规范与源码中struct bucket_head2可能略有出入——规范比实现更严格以便为将来扩展留出余地。1. 协议概览与文档定位Monero 的每个 P2P 消息都使用一个固定 33 字节的报头随后紧跟负载。协议文档 docs/LEVIN_PROTOCOL.md 的一个明确目标是清晰标注线上发送的每一个字节从而识别可能在 I2P/Tor 下泄露用户身份的元数据这类问题被发现后会逐一修复未决问题清单见 docs/ANONYMITY_NETWORKS.md。需要特别指出的是该文档目前并未完整列出 Monero 协议发送的所有数据这部分仍在完善中。如果你想深入学习 Monero P2P 流量文档作者建议主动参与补全这一工作。从源码结构看Levin 协议的实现主体位于 epee 网络库contrib/epee/include/net/levin_base.h、contrib/epee/src/levin_base.cpp 与 contrib/epee/include/net/levin_protocol_handler_async.h而具体命令的分发处理则在 src/p2p 与 src/cryptonote_protocol 两个协议层完成。2. 报头Header33 字节的线上格式每个 Monero P2P 消息都以此报头开始。文档给出了逐比特的字节布局图按行、按 8 比特一组解读如下0 1 2 3 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 -------------------------------- | 0x01 | 0x21 | 0x01 | 0x01 | - Signature8 字节 -------------------------------- | 0x01 | 0x01 | 0x01 | 0x01 | -------------------------------- | Length | - 负载长度8 字节小端 | | -------------------------------- | E. Response | Command | - 1 字节 4 字节 -------------------------------- | | Return Code | - 4 字节有符号 -------------------------------- | |Q|S|B|E| Reserved | - 4 字节 Flags -------------------------------- | | 0x01 | 0x00 | 0x00 | - Version4 字节 -------------------------------- | 0x00 | | -------- |该布局与源码中的 bucket_head2 结构体一一对应#pragma pack(push) #pragma pack(1) struct bucket_head2 { uint64_t m_signature; // 8 字节签名 uint64_t m_cb; // 8 字节长度不含报头 uint8_t m_have_to_return_data;// 1 字节 Expect Response uint32_t m_command; // 4 字节命令号 int32_t m_return_code; // 4 字节返回码 uint32_t m_flags; // 4 字节标志位 uint32_t m_protocol_version; // 4 字节协议版本 }; #pragma pack(pop)注意bucket_head2总大小正是 33 字节8814444 33。字段明细如下。2.1 签名Signature识别协议的 8 个魔数字节前 8 字节是协议的签名用于快速识别协议类型例如有人连错端口时立即发现。源码中的定义带有注释Benders nightmare#define LEVIN_SIGNATURE 0x0101010101012101LL //Benders nightmare在 levin_base.cpp 的 make_header 中签名会被转换为小端写入线上字节流bucket_head2 make_header(uint32_t command, uint64_t msg_size, uint32_t flags, bool expect_response) noexcept { bucket_head2 head {0}; head.m_signature SWAP64LE(LEVIN_SIGNATURE); head.m_have_to_return_data expect_response; head.m_cb SWAP64LE(msg_size); head.m_command SWAP32LE(command); head.m_protocol_version SWAP32LE(LEVIN_PROTOCOL_VER_1); head.m_flags SWAP32LE(flags); return head; }隐私提示文档明确强调这 8 字节固定签名使未加密链路可以被深度包检测DPI引擎直接识别为 Monero。社区已讨论过用 SSL 缓解此问题文档同时建议考虑 BIP-151 或 Noise 协议作为备选方案。2.2 长度Length无符号 64 位小端整数长度字段是不包含报头本身的负载字节数。当前实现默认拒绝超过 100 MB十进制的接收消息在握手之前初始上限更严格仅为 256 KiB。这两个阈值定义在 levin_base.h#define LEVIN_INITIAL_MAX_PACKET_SIZE 256*1024 // 256 KiB before handshake #define LEVIN_DEFAULT_MAX_PACKET_SIZE 100000000 //100MB by default after handshake异步协议处理器 levin_protocol_handler_async.h 中即用这两个常量初始化m_initial_max_packet_size与m_max_packet_size。2.3 Expect Response是否需要对方应答值为0不期望对端响应值为非零期望对端响应。有序性约束对端必须以收到请求的相同顺序返回带此标志的响应但两个响应之间可以穿插发送其他消息例如通知。文档还指出一个反直觉的细节cryptonote 协议中有一些命令期望对端响应却不设置此标志。这些响应以 notify通知消息的形式返回因此对端可以任意顺序发送它们。这正是下文命令体系中 2003/2004、2006/2007 这类成对 notify 命令的设计动机。2.4 Command无符号 32 位小端整数命令号是 Monero 自定义的、区分具体业务操作的关键字段。数值 10002000 区间属于 P2Padmin层2000 以上属于 cryptonote 协议层详见第 4 节。2.5 Return Code有符号 32 位小端整数表示对端对上一条被调用命令的返回结果。对于请求消息request该字段固定为0。epee 库定义了一套通用返回码levin_base.h#define LEVIN_OK 0 #define LEVIN_ERROR_CONNECTION -1 #define LEVIN_ERROR_CONNECTION_NOT_FOUND -2 #define LEVIN_ERROR_CONNECTION_DESTROYED -3 #define LEVIN_ERROR_CONNECTION_TIMEDOUT -4 #define LEVIN_ERROR_CONNECTION_NO_DUPLEX_PROTOCOL -5 #define LEVIN_ERROR_CONNECTION_HANDLER_NOT_DEFINED -6 #define LEVIN_ERROR_FORMAT -7命令级的具体返回码含义随命令而定见第 4 节命令说明。2.6 Flags4 个有效位位名称置位含义QRequest消息是请求SResponse消息是响应BBegin这是分片消息的开头EEnd这是分片消息的结尾源码中对应的位掩码常量定义在 levin_base.h#define LEVIN_PACKET_REQUEST 0x00000001 #define LEVIN_PACKET_RESPONSE 0x00000002 #define LEVIN_PACKET_BEGIN 0x00000004 #define LEVIN_PACKET_END 0x000000082.7 Version固定值 1无符号 32 位小端整数固定为1LEVIN_PROTOCOL_VER_1见 levin_base.h。3. 消息流转Message Flow五种消息类型协议消息可划分为五类通知notification、请求request、响应response、分片消息fragmented和哑消息dummy。核心约束是响应必须按对端发出请求的顺序返回但请求之后不必立即跟随响应可以穿插任何其他类型的消息。3.1 通知Notifications单向消息任何时刻都可发送不期望对端应答。约束Q位必须置位S、B、E位必须清零Expect Response字段必须为 0。某些通知必须由另一些通知触发如请求区块后触发返回区块但这不是 levin 消息层本身的职责而是命令层的语义见第 4 节。3.2 请求RequestsMonero admin 协议的基础。约束Q位必须置位S、B、E位必须清零Expect Response字段必须非零对端必须返回相同Command号的响应消息。在 epee 层请求与通知分别通过message_writer的finalize_invoke与finalize_notify生成levin_base.hbyte_slice finalize_invoke(uint32_t command) { return finalize(command, LEVIN_PACKET_REQUEST, 0, true); } byte_slice finalize_notify(uint32_t command) { return finalize(command, LEVIN_PACKET_REQUEST, 0, false); } byte_slice finalize_response(uint32_t command, uint32_t return_code) { return finalize(command, LEVIN_PACKET_RESPONSE, return_code, false); }注意通知与请求都带LEVIN_PACKET_REQUEST标志二者仅通过Expect Response字段finalize_invoke传true区分——与 2.3 节的说明完全一致。3.3 响应Responses只能在对端先发出请求之后发送S位必须置位Q、B、E位必须清零Expect Response字段必须为 0Command字段必须与请求消息中的值相同Return Code语义随命令而定。3.4 分片消息Fragmented分片消息是为 I2P/Tor 的white noise白噪声特性引入的一个交易可以被切分成多个分片发送从而隐藏真实数据何时在传输真实分片与哑消息在线上长度一致难以区分。规则同一时刻只能发送一个分片消息B与E位永远不会同时置位同时置位即哑消息见下重组后的消息内部必须包含一个非分片类型的 levin 报头Q、S位永不置位Expect Response字段恒为 0第一个分片置B位中间分片B、E都不置位最后一个分片置E位。源码实现位于 levin_base.cpp 的 make_fragmented_notify若整条消息小于等于噪声块大小则直接以普通 notify 发送并用零填充补齐否则按payload_space noise_size - sizeof(bucket_head2)切分首片置LEVIN_PACKET_BEGIN末片置LEVIN_PACKET_END并以零字节填充最后一个分片使其与噪声块等长。3.5 哑消息Dummy哑消息即纯噪声B与E位同时置位Q、S位清零Expect Response字段为 0。收到此类消息时接收方可以安全地直接丢弃内容。生成函数为 levin_base.cpp 的 make_noise_notify它构造一个command0、flagsBEGIN|END、负载全零、总长等于目标噪声块大小的消息。白噪声的实际发送时机与调度逻辑位于 src/cryptonote_protocol/levin_notify.cpp 及其头文件 src/cryptonote_protocol/levin_notify.h。4. 命令体系CommandsLevin 是通用传输层业务语义由命令号承载。Monero 的命令分两组P2PAdmin命令与 Cryptonote 协议命令。前者处理连接管理后者处理区块链与交易数据交换。4.1 P2PAdmin命令命令号基准为1000定义于 src/p2p/p2p_protocol_defs.h具体命令通过P2P_COMMANDS_POOL_BASE N派生。文档列出的全部 7 对请求/响应命令如下命令号请求/响应名称用途1001Request / ResponseHandshake节点握手交换版本、网络 ID、peer ID 等1002Request / ResponseTimed Sync定时同步交换本地链高度等信息1003Request / ResponsePing存活探测1004Request / ResponseStat Info节点统计信息1005Request / ResponseNetwork State网络状态连接数等1006Request / ResponsePeer ID查询对端 peer ID1007Request / ResponseSupport Flags查询/交换能力标志如 fluffy blocks 支持这些命令的处理逻辑分布在 src/p2p/net_node.h 与 src/p2p/net_node.inl异步实现中连接建立后的握手流程即在net_node中驱动。4.2 Cryptonote 协议命令命令号基准为2000定义于 src/cryptonote_protocol/cryptonote_protocol_defs.h。重要特征这一层全部是 notify通知型命令——即使语义上是请求/响应如 2003/2004、2006/2007也以通知形式收发因此不受响应顺序约束呼应 2.3 节的说明。命令号类型名称说明2001NotificationNew Block广播新区块2002NotificationNew Transactions广播新交易内存池2003NotificationRequest Get Objects请求获取指定区块/交易对象2004NotificationResponse Get Objects返回请求的对象含未找到的 missed_ids2006NotificationRequest Chain请求链同步携带已知区块 ID 列表2007NotificationResponse Chain Entry返回对端链上的区块条目2008NotificationNew Fluffy Block广播轻量区块fluffy block不含交易体2009NotificationRequest Fluffy Missing TX请求缺失的 fluffy block 交易从 cryptonote_protocol_defs.h 的源码可以看出若干实现细节NOTIFY_REQUEST_CHAIN中的block_ids采用分层锚点策略前 10 个区块 ID 连续之后按 2、4、8、16… 的 2 的幂次间隔取块最后一个始终是创世块见该文件第 280 行注释以便快速定位分叉点NOTIFY_RESPONSE_GET_OBJECTS携带missed_ids对端未能提供的对象哈希列表用于请求方判断哪些对象需要重试或从别处获取NOTIFY_NEW_FLUFFY_BLOCK与NOTIFY_REQUEST_FLUFFY_MISSING_TX配合实现 fluffy blocks区块头与交易哈希先广播接收方发现缺少交易后再按 2009 按需拉取显著降低初始同步带宽。命令分发与各 notify 处理函数handle_notify_new_block、handle_notify_new_transactions、handle_request_get_objects等实现在 src/cryptonote_protocol/cryptonote_protocol_handler.inl 中值得留意的是cryptonote_protocol_handler.inl同时出现在 LEVIN 关键词检索结果中说明该层正是 Levin 命令处理器的核心挂载点。5. 协议处理器的职责划分在实现层面Levin 的传输与业务是解耦的传输层epee levin负责报头解析、分片重组、长度校验、超时与连接管理。核心类为levin_protocol_handler_asynccontrib/epee/include/net/levin_protocol_handler_async.h其接收路径会先积累sizeof(bucket_head2)字节解析报头文件内第 484501 行、584619 行再按长度读取负载命令接口层levin_commands_handlerlevin_base.h定义了invoke处理请求与notify处理通知两个纯虚方法Monero 的cryptonote_protocol_handler与node_server分别实现之业务层P2P 命令由 src/p2p/net_node.inl 处理cryptonote 命令由 src/cryptonote_protocol/cryptonote_protocol_handler.inl 处理。6. 测试与调试工具仓库为 Levin 协议提供了两类可直接利用的工程资产单元测试tests/unit_tests/levin.cpp 覆盖报头构造、分片/噪声消息的生成与解析等核心逻辑是理解字段语义最直接的可运行示例模糊测试tests/fuzz/levin.cpp 对 Levin 消息解析路径做 fuzzing用于验证畸形输入下的健壮性流量日志解析utils/logs/levin-traffic.awk 是 awk 脚本可对节点日志中的 levin 流量记录做离线统计适合实际抓取后分析命令分布。此外由于报头签名固定实践中可以直接用 Wireshark 等工具按01 01 01 01 01 21 01 01LEVIN_SIGNATURE 的小端字节序特征过滤 Monero P2P 流量再按本文第 2 节的字段布局解析命令号、标志位与长度进而对照第 4 节命令表还原业务行为。7. 小结Levin 协议虽然继承自 CryptoNote但 Monero 为其注入了两项关键扩展严格的报头规范33 字节定长报头签名 长度 期望应答 命令 返回码 标志 版本全部多字节字段使用小端序配合 256 KiB握手前/100 MB握手后的长度上限面向匿名网络的消息模型通过 dummyB|E同时置位与 fragmentedB/E分片标记两类消息实现 I2P/Tor 白噪声填充隐藏真实数据传输时机重组后的消息内部仍须包含一个完整的非分片 levin 报头。理解这五类消息notify / request / response / fragmented / dummy的约束以及 10011009 命令的请求-响应或通知-通知配对关系就掌握了 Monero 节点间一切通信的解析钥匙。若需进一步追踪匿名网络下的已知泄露问题可继续阅读 docs/ANONYMITY_NETWORKS.md。赞分享区块链金融科技【免费下载链接】moneroMonero: the secure, private, untraceable cryptocurrency项目地址https://gitcode.com/gh_mirrors/mo/monero点击查看免费下载相关推荐EMQX S3 与 S3Tables 连接器健康检查优化通过限制 Bucket 列表返回数据量加速探测EMQX S3 与 S3Tables 连接器健康检查优化通过限制 Bucket 列表返回数据量加速探测 本文聚焦 EMQX 开源仓库中针对 S3 与 S3Ta后端物联网消息队列通信深入解析DNS协议从EmilHernvall/dnsguide看DNS报文结构深入解析DNS协议从EmilHernvall/dnsguide看DNS报文结构 本文将通过EmilHernvall的DNS指南项目深入解析DNS协议的核心结教程示例工程Wazuh Inventory Sync FlatBuffer 协议解析消息结构、会话流程与 Manager 侧实现Wazuh Inventory Sync FlatBuffer 协议解析消息结构、会话流程与 Manager 侧实现 本文以 Wazuh 仓库中 Invent网络安全IDS日志分析应用安全漏洞扫描创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
YOLOv5交通标志检测实战:从训练调优到部署避坑全攻略 简介:YOLOv5交通标志物检测项目是一份97分的期末大作业,面向计算机相关专业正在完成课程设计、期末大作业以及需要项目实战练习的学生。资源包含完整的YOLOv5检测源码、已经训练好的模型权重以及配套数据集,可直接用于训练、验证和推理交通标… · 2026/9/24 18:50:55
2026降AIGC率实战:10个工具实测与检测原理全解析 这几个月,找我咨询降AIGC率的继续教育学生肉眼可见地变多了。大家的问题也从“什么是AIGC检测”变成了“用哪个工具能降下来”“降完会不会被导师看出来”,甚至有人拿着某平台的检测报告截图,问我为什么改写完一段,标红反而更多了… · 2026/9/24 18:50:55
智能家居选型四大硬指标:协议兼容性、本地化、延迟与生命周期 1. 别再盯着“十大品牌”榜单了:智能家居选型的本质是匹配,不是跟风“智能家居哪个牌子好?”——这问题我每天在社群里看到不下二十遍。刚装完新家的朋友发来截图,上面是某平台“2024智能家电TOP10”榜单,红框标着前三… · 2026/9/24 18:50:55
Word打开显示只读的6大原因与精准修复方案 1. 为什么Word一打开就“锁住”了?这不是Bug,是系统在悄悄告诉你某些事 你双击一个Word文档,界面右上角赫然写着“只读”,编辑光标变成灰色,CtrlS毫无反应——这种瞬间被剥夺编辑权的体验,几乎每个办公族都… · 2026/9/24 19:35:49
WinPE启动盘制作与Windows纯净安装实战指南 1. 这不是“装系统”,是重建你对Windows底层控制权的起点很多人点开这个标题,第一反应是:“我又不是电脑小白,还用得着学PE?”——这话我十年前也说过。直到某天凌晨三点,客户服务器蓝屏报错0x0000007B&… · 2026/9/24 19:35:49
VS Code Python解释器选择与虚拟环境配置完全指南 昨天有个刚转Python的同事跑过来,脸色很不好看:“我在VS Code里明明选了Python 3.11解释器,为什么跑起来还是老版本?装OpenCV也一直报错,网上搜了半天都说是解释器问题,可我选的就是对的啊。”我看了一眼他… · 2026/9/24 19:35:49
VECM向量误差修正模型实战:从协整检验到滚动监控的Python落地指南 简介:这份资源面向宏观经济与金融时间序列分析的学习者和研究者,聚焦向量误差修正模型(VECM)的MATLAB实现,用于处理多变量非平稳数据间的长期均衡与短期调整关系。压缩包共4个文件,均为m脚本,整… · 2026/9/24 19:35:49
ByteBuddy泛型签名陷阱:同名T并非同一个变量 前阵子在一个基于 ByteBuddy 的动态 DAO 框架里做泛型返回类型解析,我踩了一个非常隐蔽的坑。日志里没有任何异常,没有 NPE,也没有 ClassCastException,只有反射拿回来的泛型信息完全不符合预期。更抓狂的是:方法上有个… · 2026/9/24 19:35:43
JupyterLab迁移指南:多文件管理、代码补全与内核管理实践 把 Jupyter Notebook 换成 JupyterLab 这件事,我拖了很久,真上手之后才后悔没早点做。JupyterLab 是 Notebook 官方的下一代工作台,在同一个网页界面里集成了 notebook、代码编辑器、终端和文件管理,专门解决 Notebook 在项目变大… · 2026/9/24 19:35:43
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44