diff --git a/apps/ex_wire/config/config.exs b/apps/ex_wire/config/config.exs index a07eb315b..c071c19cd 100644 --- a/apps/ex_wire/config/config.exs +++ b/apps/ex_wire/config/config.exs @@ -26,8 +26,8 @@ mana_version = config :ex_wire, p2p_version: 0x04, - protocol_version: 63, - caps: [{"eth", 62}, {"eth", 63}, {"par", 1}], + protocol_version: 62, + caps: [{"eth", 62}, {"par", 1}], # TODO: This should be set and stored in a file private_key: :random, bootnodes: :from_chain, diff --git a/apps/ex_wire/lib/ex_wire/dev_p2p/session.ex b/apps/ex_wire/lib/ex_wire/dev_p2p/session.ex index 9fa719010..bccd4c300 100644 --- a/apps/ex_wire/lib/ex_wire/dev_p2p/session.ex +++ b/apps/ex_wire/lib/ex_wire/dev_p2p/session.ex @@ -65,7 +65,7 @@ defmodule ExWire.DEVp2p.Session do """ @spec disconnect(t) :: t def disconnect(session = %__MODULE__{}) do - %{session | hello_sent: nil, hello_received: nil, packet_id_map: PacketIdMap.default_map()} + %{session | hello_sent: nil, hello_received: nil, packet_id_map: nil} end @doc """ @@ -100,6 +100,6 @@ defmodule ExWire.DEVp2p.Session do """ @spec compatible_capabilities?(t) :: boolean() def compatible_capabilities?(%__MODULE__{packet_id_map: packet_id_map}) do - packet_id_map != PacketIdMap.default_map() + Map.has_key?(packet_id_map.ids_to_modules, 0x10) end end diff --git a/apps/ex_wire/lib/ex_wire/packet/capability/eth.ex b/apps/ex_wire/lib/ex_wire/packet/capability/eth.ex index e5dcaaf79..daddeb6bf 100644 --- a/apps/ex_wire/lib/ex_wire/packet/capability/eth.ex +++ b/apps/ex_wire/lib/ex_wire/packet/capability/eth.ex @@ -16,7 +16,16 @@ defmodule ExWire.Packet.Capability.Eth do Eth.BlockHeaders, Eth.GetBlockBodies, Eth.BlockBodies, - Eth.NewBlock + Eth.NewBlock, + :reserved, + :reserved, + :reserved, + :reserved, + :reserved, + :reserved, + :reserved, + :reserved, + :reserved ] } diff --git a/apps/ex_wire/lib/ex_wire/packet/capability/eth/new_block.ex b/apps/ex_wire/lib/ex_wire/packet/capability/eth/new_block.ex index 6e580dbb9..6fa636812 100644 --- a/apps/ex_wire/lib/ex_wire/packet/capability/eth/new_block.ex +++ b/apps/ex_wire/lib/ex_wire/packet/capability/eth/new_block.ex @@ -15,14 +15,13 @@ defmodule ExWire.Packet.Capability.Eth.NewBlock do alias Block.Header alias Blockchain.Block - alias ExWire.Packet.Capability.Eth.Transactions + alias Blockchain.Transaction @behaviour ExWire.Packet - # TODO: fill in Transactions typespec when that packet is figured out @type t :: %__MODULE__{ header: Header.t(), - transactions: [any()], + transactions: [Transaction.t()], uncles: [Block.t()], total_difficulty: integer() | nil } @@ -53,8 +52,8 @@ defmodule ExWire.Packet.Capability.Eth.NewBlock do [ [ Header.serialize(packet.header), - Transactions.serialize(%Transactions{transactions: packet.transactions}), - packet.uncles |> Block.serialize() |> Enum.to_list() + Enum.map(packet.transactions, &Transaction.serialize/1), + Enum.map(packet.uncles, &Header.serialize/1) ], packet.total_difficulty ] @@ -70,16 +69,16 @@ defmodule ExWire.Packet.Capability.Eth.NewBlock do [ [ header, - transactions, - uncles + transaction_rlp, + uncles_rlp ], total_difficulty ] = rlp %__MODULE__{ header: Header.deserialize(header), - transactions: Transactions.deserialize(transactions).transactions, - uncles: uncles |> Block.deserialize() |> Enum.to_list(), + transactions: Enum.map(transaction_rlp, &Transaction.deserialize/1), + uncles: Enum.map(uncles_rlp, &Header.deserialize/1), total_difficulty: total_difficulty |> :binary.decode_unsigned() } end diff --git a/apps/ex_wire/lib/ex_wire/packet/capability/mana.ex b/apps/ex_wire/lib/ex_wire/packet/capability/mana.ex index 4c968d44b..b9089a3d2 100644 --- a/apps/ex_wire/lib/ex_wire/packet/capability/mana.ex +++ b/apps/ex_wire/lib/ex_wire/packet/capability/mana.ex @@ -1,9 +1,11 @@ defmodule ExWire.Packet.Capability.Mana do alias ExWire.Packet.Capability alias ExWire.Packet.Capability.Eth + alias ExWire.Packet.Capability.Par @our_capabilities_map %{ - Eth.get_name() => Eth + Eth.get_name() => Eth, + Par.get_name() => Par } @our_capabilities @our_capabilities_map diff --git a/apps/ex_wire/lib/ex_wire/packet/capability/par.ex b/apps/ex_wire/lib/ex_wire/packet/capability/par.ex index 8cd0da994..c505fa8b9 100644 --- a/apps/ex_wire/lib/ex_wire/packet/capability/par.ex +++ b/apps/ex_wire/lib/ex_wire/packet/capability/par.ex @@ -1,6 +1,7 @@ defmodule ExWire.Packet.Capability.Par do alias ExWire.Config alias ExWire.Packet.Capability + alias ExWire.Packet.Capability.Eth alias ExWire.Packet.Capability.Par @behaviour Capability @@ -10,10 +11,26 @@ defmodule ExWire.Packet.Capability.Par do @version_to_packet_types %{ 1 => [ Par.WarpStatus, + Eth.NewBlockHashes, + Eth.Transactions, + Eth.GetBlockHeaders, + Eth.BlockHeaders, + Eth.GetBlockBodies, + Eth.BlockBodies, + Eth.NewBlock, Par.GetSnapshotManifest, Par.SnapshotManifest, Par.GetSnapshotData, - Par.SnapshotData + Par.SnapshotData, + :reserved, + :reserved, + :reserved, + :reserved, + :reserved, + :reserved, + :reserved, + :reserved, + :reserved ] } diff --git a/apps/ex_wire/lib/ex_wire/packet/packet_id_map.ex b/apps/ex_wire/lib/ex_wire/packet/packet_id_map.ex index fdea5c22f..40bde637a 100644 --- a/apps/ex_wire/lib/ex_wire/packet/packet_id_map.ex +++ b/apps/ex_wire/lib/ex_wire/packet/packet_id_map.ex @@ -48,7 +48,7 @@ defmodule ExWire.Packet.PacketIdMap do |> Enum.filter(fn cap -> Capability.are_we_capable?(cap, Mana.get_our_capabilities_map()) end) - |> Enum.sort(fn {name1, _v1}, {name2, _v2} -> name1 < name2 end) + |> Enum.sort(fn %Capability{name: name1}, %Capability{name: name2} -> name1 < name2 end) |> Enum.map(fn cap -> Capability.get_packets_for_capability(cap, Mana.get_our_capabilities_map()) end) @@ -116,8 +116,13 @@ defmodule ExWire.Packet.PacketIdMap do defp build_capability_ids_to_modules_map(capability_packet_types, {base_id, starting_map}) do capability_packet_types |> Enum.reduce({base_id, starting_map}, fn packet_type, {next_base_id, updated_map} -> - packet_id = base_id + apply(packet_type, :message_id_offset, []) - {Kernel.max(next_base_id, packet_id + 1), Map.put(updated_map, packet_id, packet_type)} + if packet_type == :reserved do + {next_base_id + 1, updated_map} + else + packet_id = base_id + apply(packet_type, :message_id_offset, []) + + {Kernel.max(next_base_id, packet_id + 1), Map.put(updated_map, packet_id, packet_type)} + end end) end end diff --git a/apps/ex_wire/test/ex_wire/packet/capability/eth/new_block_test.exs b/apps/ex_wire/test/ex_wire/packet/capability/eth/new_block_test.exs new file mode 100644 index 000000000..d7d44839b --- /dev/null +++ b/apps/ex_wire/test/ex_wire/packet/capability/eth/new_block_test.exs @@ -0,0 +1,5 @@ +defmodule ExWire.Packet.Capability.Eth.NewBlockTest do + use ExUnit.Case, async: true + alias ExWire.Packet.Capability.Eth.NewBlock + doctest NewBlock +end