Packages
elixium_core
0.1.3
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/blockchain.ex
defmodule Elixium.Blockchain do
alias Elixium.Blockchain.Block
alias Elixium.Ledger
alias Elixium.UtxoStore
@target_blocktime 120
@diff_rebalance_offset 10_080
@moduledoc """
Wrapper functions for interacting with the blockchain on a high level
"""
@doc """
Creates a List with a genesis block in it or returns the existing blockchain
"""
def initialize do
if Ledger.empty?() do
add_block([], Block.initialize())
else
Ledger.retrieve_chain()
end
end
@doc """
Adds the latest block to the beginning of the blockchain
"""
@spec add_block(list, Block) :: list
def add_block(chain, block) do
chain = [block | chain]
Ledger.append_block(block)
UtxoStore.update_with_transactions(block.transactions)
chain
end
def recalculate_difficulty(chain) do
beginning_index = min(length(chain) - 1, @diff_rebalance_offset - 1)
last = List.first(chain)
first = Enum.at(chain, beginning_index)
diff =
with {:ok, last_time, _} <- DateTime.from_iso8601(last.timestamp),
{:ok, first_time, _} <- DateTime.from_iso8601(first.timestamp) do
diff = DateTime.diff(last_time, first_time, :microseconds) / 1_000_000
avg_secs_per_block = diff / @diff_rebalance_offset
speed_ratio = @target_blocktime / avg_secs_per_block
:math.log(speed_ratio) / :math.log(16)
end
diff
end
def diff_rebalance_offset, do: @diff_rebalance_offset
end