Python Levin p2p client
Clone or download
xmrdsc Merge pull request #4 from xmrdsc/fixes
Fixes peer listing and adds verbosity option
Latest commit ea6c182 Dec 14, 2018
Type Name Latest commit message Commit time
Failed to load latest commit information.


The Levin network protocol is an implementation of peer-to-peer (P2P) communications found in a large number of cryptocurrencies, including basically any cryptocurrency that is a descendant from the CryptoNote project.

Example usage:

Ask a node for it's peer list, sorted on last_seen:

python3 18080

>> created packet 'handshake'
>> sent packet 'handshake'
<< received packet 'support_flags'
<< parsed packet 'support_flags'
<< received packet 'handshake'
<< parsed packet 'handshake'


Some notes

A Levin header (33 bytes) looks like this:

  1. u_int64 - A levin signature. 01 21 01 01 01 01 01 01 also known as 'Benders nightmare'.
  2. u_int64 - Payload size as an indicator of how many bytes to read from the network.
  3. bool - Recipient should return data.
  4. u_int32 - The command. e9 03 00 00 - Possible commands: 1001, 1007, etc. See
  5. int32 - Return code.
  6. u_int32 - Flags.
  7. u_int32 - Protocol version. Usually 01

The payload that comes after that is a serialized Boost struct, which can be found in the Monero codebase, e.g: cryptonote_protocol_defs.h. The terminology for a (possible nested collection) of structs is called a Section() in this module.

For the actual serialization from the perspective of Monero, check out portable_storage_to_bin.h

For deserialization look at Reader.read_storage_entry() and

Data is almost always in little-endian byte order, with the exception of keys (strings) for values in serialized structs.

Lastly, this module is presented as 'best effort' and, for example, does not guarantee that all Levin data types are supported.



  • Big thanks to m2049r for his Java implementation of Levin on Monerujo (remote node finder).
  • notmike


© 2018 WTFPL – Do What the Fuck You Want to Public License