Current section
Files
Jump to
Current section
Files
lib/ledger.ex
defmodule UltraDark.Ledger do
alias UltraDark.Blockchain.Block
alias UltraDark.Store
require Exleveldb
@store_dir ".chaindata"
def initialize do
Store.initialize(@store_dir)
end
@doc """
Add a block to leveldb, indexing it by its hash (this is the most likely piece of data to be unique)
"""
def append_block(block) do
fn ref -> Exleveldb.put(ref, String.to_atom(block.hash), :erlang.term_to_binary(block)) end
|> Store.transact(@store_dir)
end
@doc """
Given a block hash, return its contents
"""
@spec retrieve_block(String.t()) :: Block
def retrieve_block(hash) do
fn ref ->
{:ok, block} = Exleveldb.get(ref, String.to_atom(hash))
:erlang.binary_to_term(block)
end
|> Store.transact(@store_dir)
end
@doc """
Return the whole chain from leveldb
"""
def retrieve_chain do
fn ref ->
ref
|> Exleveldb.map(fn {_, block} -> :erlang.binary_to_term(block) end)
|> Enum.sort_by(& &1.index, &>=/2)
end
|> Store.transact(@store_dir)
end
def is_empty? do
Store.is_empty?(@store_dir)
end
end