Packages
elixium_core
0.3.6
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/utilities.ex
defmodule Elixium.Utilities do
@moduledoc """
Various functions that don't need their own module, since theyre used in multiple
places for different things
"""
def sha_base16(input) do
:sha256
|> :crypto.hash(input)
|> Base.encode16()
end
def sha3_base16(list) when is_list(list) do
list
|> Enum.join()
|> sha3_base16()
end
# Concatintes the list items together to a string, hashes the block header with keccak sha3 algorithm, return the encoded string
def sha3_base16(input) do
:sha3_256
|> :keccakf1600.hash(input)
|> Base.encode16()
end
@doc """
The merkle root lets us represent a large dataset using only one string. We can be confident that
if any of the data changes, the merkle root will be different, which invalidates the dataset
"""
@spec calculate_merkle_root(list) :: String.t()
def calculate_merkle_root(list) do
list
|> Enum.chunk_every(2)
|> Enum.map(&sha_base16(&1))
|> calculate_merkle_root(true)
end
def calculate_merkle_root(list, true) when length(list) == 1, do: hd(list)
def calculate_merkle_root(list, true), do: calculate_merkle_root(list)
def pad(data, block_size) do
to_add = block_size - rem(byte_size(data), block_size)
data <> String.duplicate(<<to_add>>, to_add)
end
def zero_pad(bytes, size) do
String.duplicate(<<0>>, size - byte_size(bytes)) <> bytes
end
end