diff options
author | Alex Auvolat <alex@adnab.me> | 2018-07-04 14:45:01 +0200 |
---|---|---|
committer | Alex Auvolat <alex@adnab.me> | 2018-07-04 14:45:01 +0200 |
commit | d786bbd6e43d88b50085d1ecce6288a617bebbe8 (patch) | |
tree | 886ad2b2c5c9371bb5122b0be8bda56b525e2ea1 /lib/data/merklelist.ex | |
parent | b234a360dafa0a65d797614aad5a4514570784f8 (diff) | |
download | shard-d786bbd6e43d88b50085d1ecce6288a617bebbe8.tar.gz shard-d786bbd6e43d88b50085d1ecce6288a617bebbe8.zip |
Document
Diffstat (limited to 'lib/data/merklelist.ex')
-rw-r--r-- | lib/data/merklelist.ex | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/lib/data/merklelist.ex b/lib/data/merklelist.ex index 42b80fc..727f2a8 100644 --- a/lib/data/merklelist.ex +++ b/lib/data/merklelist.ex @@ -1,26 +1,33 @@ defmodule SData.MerkleList do + @moduledoc """ + A simple Merkle list store. + + Future improvements: + - When messages are inserted other than at the top, all intermediate hashes + change. Keep track of the mapping from old hashes to new hashes so that get + requests can work even for hashes that are not valid anymore. + - group items in "pages" (bigger bundles) + """ + use GenServer - def start_link(cmp) do - GenServer.start_link(__MODULE__, cmp) - end + @doc """ + Start a Merkle List storage process. - defp term_hash(term) do - :crypto.hash(:sha256, (:erlang.term_to_binary term)) - end - @doc """ - Initialize a Merkle List storage. `cmp` is a function that compares stored items and provides a total order. - It must return: - `:after` if the first argument is more recent - `:duplicate` if the two items are the same - `:before` if the first argument is older """ + def start_link(cmp) do + GenServer.start_link(__MODULE__, cmp) + end + def init(cmp) do root_item = :root - root_hash = term_hash root_item + root_hash = SData.term_hash root_item state = %{ root: root_hash, top: root_hash, @@ -32,7 +39,7 @@ defmodule SData.MerkleList do defp state_push(item, state) do new_item = {item, state.top} - new_item_hash = term_hash new_item + new_item_hash = SData.term_hash new_item new_store = Map.put(state.store, new_item_hash, new_item) %{ state | :top => new_item_hash, :store => new_store } end |