Packages
elixium_core
0.3.14
0.6.3
0.6.2
0.6.1
0.6.0
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.19
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.1
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.4
0.1.3
The core package for the Elixium blockchain, containing all the modules needed to run the chain
Current section
Files
Jump to
Current section
Files
lib/base58.ex
defmodule Base58 do
@alphabet '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
@moduledoc """
Provides functionality for encoding and decoding in Base58
"""
@doc """
Encode a binary of arbitrary size into Base58 string
"""
@spec encode(binary) :: String.t()
def encode(data, hash \\ "")
def encode(data, hash) when is_binary(data) do
# We encode the zeros here explicitly since any leading zeros would
# be stripped by the decode_unsigned/1 function and we would lose
# potentially valuable data
encode_zeros(data) <> encode(:binary.decode_unsigned(data), hash)
end
def encode(0, hash), do: hash
def encode(data, hash) do
character = <<Enum.at(@alphabet, rem(data, 58))>>
data
|> div(58)
|> encode(character <> hash)
end
# Encodes zeros explicitly
defp encode_zeros(data) do
<<Enum.at(@alphabet, 0)>>
|> String.duplicate(leading_zeros(data))
end
# Returns a number representing how many leading zeros this data has
defp leading_zeros(data) do
data
|> :binary.bin_to_list()
|> Enum.find_index(&(&1 != 0))
end
@doc """
Decode a Base58 encoded string into its binary representation
"""
@spec decode(String.t()) :: binary
def decode(dec, acc \\ 0)
def decode("", acc), do: :binary.encode_unsigned(acc)
def decode(<<char::utf8, rest::binary>>, acc) do
decode(rest, (acc * 58) + Enum.find_index(@alphabet, &(&1 == char)))
end
end