Fix block file, error handling

This commit is contained in:
Mononaut 2021-03-30 17:24:44 -06:00
parent e293307975
commit aa2ba1c03c
3 changed files with 35 additions and 47 deletions

View File

@ -95,7 +95,7 @@ defmodule BitcoinStream.Bridge do
[_topic, payload, _size] = message; [_topic, payload, _size] = message;
# keep last block on disk for preloading # keep last block on disk for preloading
:ok = File.write("block.dat", payload, [:append, :binary]) :ok = File.write("block.dat", payload, [:binary])
case BitcoinBlock.decode(payload) do case BitcoinBlock.decode(payload) do
{:ok, block} -> {:ok, block} ->

View File

@ -26,25 +26,32 @@ defstruct [
] ]
def decode(block_binary) do def decode(block_binary) do
bytes = byte_size(block_binary) with bytes <- byte_size(block_binary),
hex = Base.encode16(block_binary, case: :lower); hex <- Base.encode16(block_binary, case: :lower),
{:ok, raw_block} = Bitcoinex.Block.decode(hex) {:ok, raw_block} <- Bitcoinex.Block.decode(hex),
id = Bitcoinex.Block.block_id(block_binary) id <- Bitcoinex.Block.block_id(block_binary),
{summarised_txns, total_value} <- summarise_txns(raw_block.txns)
{summarised_txns, total_value} = summarise_txns(raw_block.txns) do
{:ok, %__MODULE__{
{:ok, %__MODULE__{ version: raw_block.version,
version: raw_block.version, prev_block: raw_block.prev_block,
prev_block: raw_block.prev_block, merkle_root: raw_block.merkle_root,
merkle_root: raw_block.merkle_root, timestamp: raw_block.timestamp,
timestamp: raw_block.timestamp, bits: raw_block.bits,
bits: raw_block.bits, bytes: bytes,
bytes: bytes, txn_count: raw_block.txn_count,
txn_count: raw_block.txn_count, txns: summarised_txns,
txns: summarised_txns, value: total_value,
value: total_value, id: id
id: id }}
}} else
{:error, reason} ->
IO.puts("Error decoding data for BitcoinBlock: #{reason}")
:error
_ ->
IO.puts("Error decoding data for BitcoinBlock: (unknown reason)")
:error
end
end end
defp summarise_txns(txns) do defp summarise_txns(txns) do

View File

@ -15,36 +15,17 @@ defmodule BitcoinStream.SocketHandler do
end end
def load_block() do def load_block() do
case File.read("block.dat") do with {:ok, blockData} <- File.read("block.dat"),
{:ok, blockData } -> {:ok, block} <- BitcoinBlock.decode(blockData),
case BitcoinBlock.decode(blockData) do {:ok, payload} <- Jason.encode(%{type: "block", block: block})
{:ok, block} -> do
IO.puts('file decoded ok') {:ok, payload}
case Jason.encode(%{type: "block", block: block}) do else
{:ok, payload} ->
IO.puts("block encoded ok");
{ :ok, payload };
{:error, reason} ->
IO.puts("Error json encoding block: #{reason}");
:error
_ ->
IO.puts("json encoding failed: (unknown reason)")
:error
end
{:error, reason} ->
IO.puts("Block decoding failed: #{reason}");
:error
_ ->
IO.puts("Block decoding failed: (unknown reason)")
:error
end
{:error, reason} -> {:error, reason} ->
IO.puts("Reading block file failed: #{reason}"); IO.puts("Block decoding failed: #{reason}");
:error :error
_ -> _ ->
IO.puts("Reading block file failed (unknown reason)") IO.puts("Block decoding failed: (unknown reason)");
:error :error
end end
end end