diff --git a/src/engine_api/engine_api.zig b/src/engine_api/engine_api.zig index 03c1c5d..b9ed86c 100644 --- a/src/engine_api/engine_api.zig +++ b/src/engine_api/engine_api.zig @@ -56,6 +56,7 @@ const AllPossibleExecutionParams = struct { .withdrawals = null, .blobGasUsed = null, .excessBlobGas = null, + .allocator = allocator, }; _ = try common.prefixedhex2hash(ret.parentHash[0..], self.parentHash); @@ -97,6 +98,6 @@ test "deserialize sample engine_newPayloadV2" { try expect(std.mem.eql(u8, payload.value.method, "engine_newPayloadV2")); const execution_payload_json = payload.value.params[0]; - const ep = try execution_payload_json.to_execution_payload(std.testing.allocator); + var ep = try execution_payload_json.to_execution_payload(std.testing.allocator); try execution_payload.newPayloadV2Handler(&ep, std.testing.allocator); } diff --git a/src/engine_api/execution_payload.zig b/src/engine_api/execution_payload.zig index f43c3dd..0ac3271 100644 --- a/src/engine_api/execution_payload.zig +++ b/src/engine_api/execution_payload.zig @@ -1,5 +1,6 @@ const std = @import("std"); const types = @import("../types/types.zig"); +const Allocator = std.mem.Allocator; pub const ExecutionPayload = struct { parentHash: types.Hash32, @@ -22,6 +23,8 @@ pub const ExecutionPayload = struct { excessBlobGas: ?u64, // executionWitness : ?types.ExecutionWitness, + allocator: Allocator, + pub fn to_block(self: *const ExecutionPayload) types.Block { return types.Block{ .header = types.BlockHeader{ @@ -50,9 +53,15 @@ pub const ExecutionPayload = struct { // .withdrawals = self.withdrawals, }; } + + pub fn deinit(self: *ExecutionPayload, allocator: std.mem.Allocator) void { + if (self.extraData.len > 0) { + allocator.free(self.extraData); + } + } }; -pub fn newPayloadV2Handler(params: *const ExecutionPayload, allocator: std.mem.Allocator) !void { +pub fn newPayloadV2Handler(params: *ExecutionPayload, allocator: std.mem.Allocator) !void { // TODO reconstruct the proof from the (currently undefined) execution witness // and verify it. Then execute the block and return the result. // vm.run_block(params.to_block(), params.transactions); @@ -61,5 +70,6 @@ pub fn newPayloadV2Handler(params: *const ExecutionPayload, allocator: std.mem.A std.log.info("newPayloadV2Handler: {any}", .{params}); var block = params.to_block(); - block.deinit(allocator); + std.debug.print("block number={}\n", .{block.header.block_number}); + params.deinit(allocator); } diff --git a/src/main.zig b/src/main.zig index 6a8c4a8..d9b2a9e 100644 --- a/src/main.zig +++ b/src/main.zig @@ -26,7 +26,7 @@ fn engineAPIHandler(r: zap.SimpleRequest) void { if (std.mem.eql(u8, payload.value.method, "engine_newPayloadV2")) { const execution_payload_json = payload.value.params[0]; - const execution_payload = execution_payload_json.to_execution_payload(allocator) catch |err| { + var execution_payload = execution_payload_json.to_execution_payload(allocator) catch |err| { std.log.warn("error parsing execution payload: {}", .{err}); r.setStatus(.bad_request); return; diff --git a/src/types/block.zig b/src/types/block.zig index ad3f6de..a114617 100644 --- a/src/types/block.zig +++ b/src/types/block.zig @@ -17,12 +17,6 @@ pub const Block = struct { // TODO: consider strict checking of returned deserialized length vs rlp_bytes.len. return block; } - - pub fn deinit(self: *Block, allocator: std.mem.Allocator) void { - if (self.header.extra_data.len > 0) { - allocator.free(self.header.extra_data); - } - } }; pub const empty_uncle_hash: types.Hash32 = [_]u8{ 29, 204, 77, 232, 222, 199, 93, 122, 171, 133, 181, 103, 182, 204, 212, 26, 211, 18, 69, 27, 148, 138, 116, 19, 240, 161, 66, 253, 64, 212, 147, 71 };