From 3a752812c4c65a7e2740449c8e30a2d221c47fc1 Mon Sep 17 00:00:00 2001 From: Gerson2102 Date: Wed, 25 Sep 2024 16:53:14 -0600 Subject: [PATCH 1/3] Adding filter clear message --- src/network/protocol/messages/filterclear.zig | 57 +++++++++++++++++++ src/network/protocol/messages/lib.zig | 8 +++ src/network/wire/lib.zig | 2 + 3 files changed, 67 insertions(+) create mode 100644 src/network/protocol/messages/filterclear.zig diff --git a/src/network/protocol/messages/filterclear.zig b/src/network/protocol/messages/filterclear.zig new file mode 100644 index 0000000..533298e --- /dev/null +++ b/src/network/protocol/messages/filterclear.zig @@ -0,0 +1,57 @@ + +const std = @import("std"); +const native_endian = @import("builtin").target.cpu.arch.endian(); +const protocol = @import("../lib.zig"); + +/// FilterClear represents the "filterclear" message +/// +/// https://developer.bitcoin.org/reference/p2p_networking.html#filterclear +pub const FilterClearMessage = struct { + // FilterClear message do not contain any payload, thus there is no field + + pub inline fn name() *const [12]u8 { + return protocol.CommandNames.FILTERCLEAR ++ [_]u8{0} ** 5; + } + + pub fn checksum(self: FilterClearMessage) [4]u8 { + _ = self; + // If payload is empty, the checksum is always 0x5df6e0e2 (SHA256(SHA256(""))) + return [4]u8{ 0x5d, 0xf6, 0xe0, 0xe2 }; + } + + /// Serialize a message as bytes and return them. + pub fn serialize(self: *const FilterClearMessage, allocator: std.mem.Allocator) ![]u8 { + _ = self; + _ = allocator; + return &.{}; + } + + pub fn deserializeReader(allocator: std.mem.Allocator, r: anytype) !FilterClearMessage { + _ = allocator; + _ = r; + return FilterClearMessage{}; + } + + pub fn hintSerializedLen(self: FilterClearMessage) usize { + _ = self; + return 0; + } + +}; + +// TESTS + +test "ok_full_flow_FilterClearMessage" { + const allocator = std.testing.allocator; + + { + const msg = FilterClearMessage{}; + + const payload = try msg.serialize(allocator); + defer allocator.free(payload); + const deserialized_msg = try FilterClearMessage.deserializeReader(allocator, payload); + _ = deserialized_msg; + + try std.testing.expect(payload.len == 0); + } +} diff --git a/src/network/protocol/messages/lib.zig b/src/network/protocol/messages/lib.zig index 70a33fa..dbe7520 100644 --- a/src/network/protocol/messages/lib.zig +++ b/src/network/protocol/messages/lib.zig @@ -7,6 +7,7 @@ pub const GetblocksMessage = @import("getblocks.zig").GetblocksMessage; pub const PingMessage = @import("ping.zig").PingMessage; pub const PongMessage = @import("pong.zig").PongMessage; pub const FeeFilterMessage = @import("feefilter.zig").FeeFilterMessage; +pub const FilterClearMessage = @import("filterclear.zig").FilterClearMessage; pub const MessageTypes = enum { version, @@ -17,6 +18,7 @@ pub const MessageTypes = enum { ping, pong, feefilter, + filterclear, }; pub const Message = union(MessageTypes) { @@ -28,6 +30,7 @@ pub const Message = union(MessageTypes) { ping: PingMessage, pong: PongMessage, feefilter: FeeFilterMessage, + filterclear: FilterClearMessage, pub fn name(self: Message) *const [12]u8 { return switch (self) { @@ -39,6 +42,7 @@ pub const Message = union(MessageTypes) { .ping => |m| @TypeOf(m).name(), .pong => |m| @TypeOf(m).name(), .feefilter => |m| @TypeOf(m).name(), + .filterclear => |m| @TypeOf(m).name(), }; } @@ -52,8 +56,10 @@ pub const Message = union(MessageTypes) { .ping => {}, .pong => {}, .feefilter => {}, + .filterclear => {}, } } + pub fn checksum(self: Message) [4]u8 { return switch (self) { .version => |m| m.checksum(), @@ -64,6 +70,7 @@ pub const Message = union(MessageTypes) { .ping => |m| m.checksum(), .pong => |m| m.checksum(), .feefilter => |m| m.checksum(), + .filterclear => |m| m.checksum(), }; } @@ -77,6 +84,7 @@ pub const Message = union(MessageTypes) { .ping => |m| m.hintSerializedLen(), .pong => |m| m.hintSerializedLen(), .feefilter => |m| m.hintSerializedLen(), + .filterclear => |m| m.hintSerializedLen(), }; } }; diff --git a/src/network/wire/lib.zig b/src/network/wire/lib.zig index 3eb52ba..7388a89 100644 --- a/src/network/wire/lib.zig +++ b/src/network/wire/lib.zig @@ -122,6 +122,8 @@ pub fn receiveMessage( protocol.messages.Message{ .ping = try protocol.messages.PingMessage.deserializeReader(allocator, r) } else if (std.mem.eql(u8, &command, protocol.messages.PongMessage.name())) protocol.messages.Message{ .pong = try protocol.messages.PongMessage.deserializeReader(allocator, r) } + else if (std.mem.eql(u8, &command, protocol.messages.FilterClearMessage.name())) + protocol.messages.Message{ .filterclear = try protocol.messages.FilterClearMessage.deserializeReader(allocator, r) } else { try r.skipBytes(payload_len, .{}); // Purge the wire return error.UnknownMessage; From 7dfd46d72ec85377d6e63e0a065e3bf1d0a31ade Mon Sep 17 00:00:00 2001 From: Gerson2102 Date: Thu, 26 Sep 2024 10:00:24 -0600 Subject: [PATCH 2/3] Addressing PR comments --- src/network/protocol/messages/filterclear.zig | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/network/protocol/messages/filterclear.zig b/src/network/protocol/messages/filterclear.zig index 533298e..e943e2c 100644 --- a/src/network/protocol/messages/filterclear.zig +++ b/src/network/protocol/messages/filterclear.zig @@ -1,6 +1,4 @@ - const std = @import("std"); -const native_endian = @import("builtin").target.cpu.arch.endian(); const protocol = @import("../lib.zig"); /// FilterClear represents the "filterclear" message @@ -36,7 +34,6 @@ pub const FilterClearMessage = struct { _ = self; return 0; } - }; // TESTS From 2b498baac7ed03f3aed07c2caf2c92b69b6f58a7 Mon Sep 17 00:00:00 2001 From: Gerson2102 Date: Fri, 27 Sep 2024 07:46:00 -0600 Subject: [PATCH 3/3] Deleting unnecessary append to filterclear --- src/network/protocol/messages/filterclear.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/protocol/messages/filterclear.zig b/src/network/protocol/messages/filterclear.zig index e943e2c..c537a32 100644 --- a/src/network/protocol/messages/filterclear.zig +++ b/src/network/protocol/messages/filterclear.zig @@ -8,7 +8,7 @@ pub const FilterClearMessage = struct { // FilterClear message do not contain any payload, thus there is no field pub inline fn name() *const [12]u8 { - return protocol.CommandNames.FILTERCLEAR ++ [_]u8{0} ** 5; + return protocol.CommandNames.FILTERCLEAR; } pub fn checksum(self: FilterClearMessage) [4]u8 {