[![Module Version](](
[![Hex Docs](](
[![Total Download](](
[![Last Updated](](

Elixir implementation of Ethereum's RLP (Recursive Length Prefix) encoding.

The encoding's specification can be found in [the yellow paper]( or in the [ethereum wiki](

## Installation

The easiest way to add ExRLP to your project is by [using Mix](

Add `:ex_rlp` as a dependency to your project's `mix.exs`:

defp deps do
    {:ex_rlp, "~> 0.5.4"}

And run:

$ mix deps.get

## Basic Usage

Use `ExRLP.encode/1` method to encode an item to RLP representation. An item can be non-negative integer, binary or list. List can contain integers, binaries or lists.

iex> "dog" |> ExRLP.encode(encoding: :hex)

iex> "dog" |> ExRLP.encode(encoding: :binary)
<<0x83, 0x64, 0x6f, 0x67>>

iex> 1000 |> ExRLP.encode(encoding: :hex)

# Default encoding is binary
iex> 1000 |> ExRLP.encode
<<0x82, 0x03, 0xe8>>

iex> [ [ [], [] ], [] ] |> ExRLP.encode(encoding: :hex)

Use `ExRLP.decode/1` method to decode a RLP encoded data. All items except lists are decoded as binaries so additional deserialization is needed if initially an item of another type was encoded.

iex> "83646f67" |> ExRLP.decode(encoding: :hex)

iex> "8203e8" |> ExRLP.decode(encoding: :hex) |> :binary.decode_unsigned

iex> "c4c2c0c0c0" |> ExRLP.decode(encoding: :hex)
[[[], []], []]

More examples can be found in test files.

## Protocols

You can define protocols for encoding/decoding custom data types.

defmodule ExRLP.LogEntry do
  defstruct address: nil, topics: [], data: nil

  @type t :: %__MODULE__{
          address: EVM.address(),
          topics: [integer()],
          data: binary()

  @spec new(binary, [integer()], binary()) :: t()
  def new(address, topics, data) do
      address: address,
      topics: topics,
      data: data

  def to_list(log) do
    [log.address, log.topics,]

defimpl ExRLP.Encode, for: ExRLP.LogEntry do
  alias ExRLP.{Encode, LogEntry}

  @spec encode(LogEntry.t(), keyword()) :: binary()
  def encode(log, options \\ []) do
    |> LogEntry.to_list()
    |> Encode.encode(options)

## Contributing

1. [Fork it!](
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create new Pull Request

## Author

Ayrat Badykov (@ayrat555)

## Copyright and License

Copyright (c) 2017 Geoffrey Hayes, Ayrat Badykov, Mason Forest

ExRLP is released under the MIT License. See the [](./ file
for further details.