diff --git a/lib/bridge.ex b/lib/bridge.ex index 366ceb2..2e104cf 100644 --- a/lib/bridge.ex +++ b/lib/bridge.ex @@ -95,7 +95,7 @@ defmodule BitcoinStream.Bridge do [_topic, payload, _size] = message; # 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 {:ok, block} -> diff --git a/lib/protocol/block.ex b/lib/protocol/block.ex index 5618f24..7ac4a96 100644 --- a/lib/protocol/block.ex +++ b/lib/protocol/block.ex @@ -26,25 +26,32 @@ defstruct [ ] def decode(block_binary) do - bytes = byte_size(block_binary) - hex = Base.encode16(block_binary, case: :lower); - {:ok, raw_block} = Bitcoinex.Block.decode(hex) - id = Bitcoinex.Block.block_id(block_binary) - - {summarised_txns, total_value} = summarise_txns(raw_block.txns) - - {:ok, %__MODULE__{ - version: raw_block.version, - prev_block: raw_block.prev_block, - merkle_root: raw_block.merkle_root, - timestamp: raw_block.timestamp, - bits: raw_block.bits, - bytes: bytes, - txn_count: raw_block.txn_count, - txns: summarised_txns, - value: total_value, - id: id - }} + with bytes <- byte_size(block_binary), + hex <- Base.encode16(block_binary, case: :lower), + {:ok, raw_block} <- Bitcoinex.Block.decode(hex), + id <- Bitcoinex.Block.block_id(block_binary), + {summarised_txns, total_value} <- summarise_txns(raw_block.txns) + do + {:ok, %__MODULE__{ + version: raw_block.version, + prev_block: raw_block.prev_block, + merkle_root: raw_block.merkle_root, + timestamp: raw_block.timestamp, + bits: raw_block.bits, + bytes: bytes, + txn_count: raw_block.txn_count, + txns: summarised_txns, + value: total_value, + 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 defp summarise_txns(txns) do diff --git a/lib/socket_handler.ex b/lib/socket_handler.ex index 4cbbd9e..1818eff 100644 --- a/lib/socket_handler.ex +++ b/lib/socket_handler.ex @@ -15,36 +15,17 @@ defmodule BitcoinStream.SocketHandler do end def load_block() do - case File.read("block.dat") do - {:ok, blockData } -> - case BitcoinBlock.decode(blockData) do - {:ok, block} -> - IO.puts('file decoded ok') - case Jason.encode(%{type: "block", block: block}) do - {: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 - + with {:ok, blockData} <- File.read("block.dat"), + {:ok, block} <- BitcoinBlock.decode(blockData), + {:ok, payload} <- Jason.encode(%{type: "block", block: block}) + do + {:ok, payload} + else {:error, reason} -> - IO.puts("Reading block file failed: #{reason}"); + IO.puts("Block decoding failed: #{reason}"); :error - _ -> - IO.puts("Reading block file failed (unknown reason)") + IO.puts("Block decoding failed: (unknown reason)"); :error end end