-
Notifications
You must be signed in to change notification settings - Fork 3
/
block.ex
82 lines (70 loc) · 1.95 KB
/
block.ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
defmodule Models.Block do
use Ecto.Schema
import Ecto.Changeset
import Ecto.Query, only: [from: 2]
alias Blacksmith.Repo
schema "blocks" do
belongs_to(:parent, __MODULE__)
field(:number, :integer)
field(:total_burned, :integer)
field(:winner, :binary)
field(:changeset_hash, :binary)
field(:block_hash, :binary)
timestamps()
end
def best_block(query \\ __MODULE__),
do:
from(q in query, order_by: q.total_burned)
|> Ecto.Query.first()
def latest(query \\ __MODULE__, count), do: from(q in query, order_by: q.number, limit: ^count)
def changeset(user, params \\ %{}) do
user
|> cast(params, [:number])
|> validate_required([
:number,
:changeset_hash,
:block_hash,
:winner
])
end
def hash(block), do: Crypto.hash(to_binary(block))
def as_map(%{
parent: parent,
number: number,
block_hash: block_hash,
total_burned: total_burned,
winner: winner,
changeset_hash: changeset_hash
}), do:
%{
parent_hash: (if Ecto.assoc_loaded?(parent), do: (parent.block_hash || <<0::256>>), else: <<0::256>>),
block_hash: block_hash,
total_burned: total_burned || <<0::256>>,
number: number,
winner: winner,
changeset_hash: changeset_hash
}
def as_cbor(block), do: Cbor.encode(as_map(block))
def forge(winner) do
TransactionProcessor.proccess_transactions(1)
TransactionProcessor.wait_until_done()
{:ok, changeset} = Redis.fetch("changeset", <<>>)
parent = best_block() |> Repo.one()
Redis.delete("changeset")
block = %__MODULE__{
parent: parent,
winner: winner,
number: 0,
changeset_hash: Crypto.hash(changeset)
}
block = Map.put(block, :block_hash, hash(block))
Repo.insert(block)
end
defp to_binary(%{
number: number,
winner: winner,
changeset_hash: changeset_hash
}) do
<<number::size(256)>> <> winner <> changeset_hash
end
end