diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2dc66ce..2b61feb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,53 +9,62 @@ on: jobs: build: - runs-on: self-hosted + runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up Zig - uses: korandoru/setup-zig@v1 + uses: mlugg/setup-zig@v2 with: - zig-version: 0.13.0 + version: 0.14.1 - name: Build run: git submodule update --init --recursive && zig build lint: - runs-on: self-hosted + runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up Zig - uses: korandoru/setup-zig@v1 + uses: mlugg/setup-zig@v2 with: - zig-version: 0.13.0 + version: 0.14.1 - name: Lint run: zig fmt --check src/*.zig test: - runs-on: self-hosted + runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up Zig - uses: korandoru/setup-zig@v1 + uses: mlugg/setup-zig@v2 with: - zig-version: 0.13.0 + version: 0.14.1 + + - name: Install cmake + run: | + sudo apt update + sudo apt install -y cmake - name: Test run: git submodule update --init --recursive && zig build test build-aarch64: - runs-on: self-hosted + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - - name: Set up Zig - uses: korandoru/setup-zig@v1 - with: - zig-version: 0.13.0 - - - name: Test - run: git submodule update --init --recursive && zig build -Dtarget="aarch64-linux" + - uses: actions/checkout@v2 + - name: Set up Zig + uses: mlugg/setup-zig@v2 + with: + version: 0.14.1 + + - name: Install cmake + run: | + sudo apt update + sudo apt install -y cmake + + - name: Build + run: git submodule update --init --recursive && zig build -Dtarget="aarch64-linux" -Dforce-evmone=true diff --git a/README.md b/README.md index 5ba54af..a540152 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ An experimental Zig Ethereum client. This repo is very experimental, so you have to do some things once. -We use the [Zig v0.13](https://ziglang.org/download/) compiler version. +We use the [Zig v0.14.0](https://ziglang.org/download/) compiler version. ### Initialize git submodules diff --git a/build.zig b/build.zig index 4bcf22f..692bdbe 100644 --- a/build.zig +++ b/build.zig @@ -1,4 +1,5 @@ const std = @import("std"); +const builtin = @import("builtin"); const LazyPath = std.Build.LazyPath; // extract version string from build.zig.zon. The zon parser hasn't been merged @@ -38,6 +39,8 @@ fn gitRevision(b: *std.Build) []const u8 { // runner. pub fn build(b: *std.Build) !void { const version_file_path = "src/version.zig"; + const use_zevem = b.option(bool, "use-zevem", "Use zevem instead of evmone (default=false if target = host, true otherwise)") orelse false; + const force_evmone = b.option(bool, "force-evmone", "Force evmone even when cross-compiling (uses zig cc as cmake compiler)") orelse false; var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); defer arena.deinit(); @@ -67,8 +70,9 @@ pub fn build(b: *std.Build) !void { // set a preferred release mode, allowing the user to decide how to optimize. const optimize = b.standardOptimizeOption(.{}); - const dep_rlp = b.dependency("zig-rlp", .{ .target = target, .optimize = optimize }); - const depSecp256k1 = b.dependency("zig-eth-secp256k1", .{ .target = target, .optimize = optimize }); + const dep_rlp = b.dependency("rlp", .{ .target = target, .optimize = optimize }); + const zevem = b.dependency("zevem", .{ .target = target, .optimize = optimize }); + const depSecp256k1 = b.dependency("zig_eth_secp256k1", .{ .target = target, .optimize = optimize }); const mod_secp256k1 = depSecp256k1.module("zig-eth-secp256k1"); const httpz = b.dependency("httpz", .{ .target = target, @@ -76,65 +80,21 @@ pub fn build(b: *std.Build) !void { }); const mod_httpz = httpz.module("httpz"); - const ethash = b.addStaticLibrary(.{ - .name = "ethash", - .optimize = optimize, - .target = target, - }); - const cflags = [_][]const u8{ - "-Wall", "-O3", "-fvisibility=hidden", - "-fvisibility-inlines-hidden", "-Wpedantic", "-Werror", - "-Wextra", "-Wshadow", "-Wconversion", - "-Wsign-conversion", "-Wno-unknown-pragmas", "-fno-stack-protector", - "-Wimplicit-fallthrough", "-Wmissing-declarations", "-Wno-attributes", - "-Wextra-semi", "-fno-exceptions", "-fno-rtti", - "-Wno-deprecated", // this one is used to remove a warning about char_trait deprecation - "-Wno-strict-prototypes", // this one is used by glue.c to avoid a warning that does not disappear when the prototype is added. - }; - ethash.addCSourceFiles(.{ .root = b.path(""), .files = &[_][]const u8{"ethash/lib/keccak/keccak.c"}, .flags = &cflags }); - ethash.addIncludePath(b.path("ethash/include")); - ethash.linkLibC(); - ethash.linkLibCpp(); - b.installArtifact(ethash); - - const evmone = b.addStaticLibrary(.{ - .name = "evmone", + const zigcli = b.dependency("zigcli", .{}); + + const lib_mod = b.createModule(.{ + .root_source_file = b.path("src/lib.zig"), .optimize = optimize, .target = target, }); - const cppflags = [_][]const u8{ - "-Wall", "-std=c++20", "-O3", - "-fvisibility=hidden", "-fvisibility-inlines-hidden", "-Wpedantic", - "-Werror", "-Wextra", "-Wshadow", - "-Wconversion", "-Wsign-conversion", "-Wno-unknown-pragmas", - "-fno-stack-protector", "-Wimplicit-fallthrough", "-Wmissing-declarations", - "-Wno-attributes", "-Wextra-semi", "-fno-exceptions", - "-fno-rtti", - "-Wno-deprecated", // this one is used to remove a warning about char_trait deprecation - "-DPROJECT_VERSION=\"0.14.0-dev\"", - }; - evmone.addCSourceFiles(.{ .root = b.path(""), .files = &[_][]const u8{ - "evmone/lib/evmone/advanced_analysis.cpp", - "evmone/lib/evmone/eof.cpp", - "evmone/lib/evmone/advanced_execution.cpp", - "evmone/lib/evmone/instructions_calls.cpp", - "evmone/lib/evmone/advanced_instructions.cpp", - "evmone/lib/evmone/instructions_storage.cpp", - "evmone/lib/evmone/baseline.cpp", - "evmone/lib/evmone/tracing.cpp", - "evmone/lib/evmone/baseline_instruction_table.cpp", - "evmone/lib/evmone/vm.cpp", - }, .flags = &cppflags }); - - evmone.addIncludePath(b.path("evmone/evmc/include")); - evmone.addIncludePath(b.path("evmone/include")); - evmone.addIncludePath(b.path("intx/include")); - evmone.addIncludePath(b.path("ethash/include")); - evmone.linkLibC(); - evmone.linkLibCpp(); - b.installArtifact(evmone); - const zigcli = b.dependency("zigcli", .{}); + const lib = b.addLibrary(.{ + .name = "phant", + .root_module = lib_mod, + }); + // add itself as an import to solve a dependency cycle in tests + lib.root_module.addImport("lib", lib.root_module); + b.installArtifact(lib); const exe = b.addExecutable(.{ .name = "phant", @@ -144,25 +104,89 @@ pub fn build(b: *std.Build) !void { .target = target, .optimize = optimize, }); - exe.addIncludePath(b.path("evmone/include/evmone")); - exe.addIncludePath(b.path("evmone/evmc/include")); - if (target.result.cpu.arch == .x86_64) { - // On x86_64, some functions are missing from the static library, - // so we define dummy functions to make sure that it compiles. - exe.addCSourceFile(.{ - .file = b.path("src/glue.c"), - .flags = &cflags, + const unit_tests = b.addTest(.{ + .root_source_file = b.path("src/tests/lib_tests.zig"), + .target = target, + .optimize = optimize, + }); + + const is_target_host = (builtin.target.os.tag == target.result.os.tag and builtin.target.cpu.arch == target.result.cpu.arch and builtin.target.abi == target.result.abi); + const vm_mod = if (use_zevem or (!is_target_host and !force_evmone)) vm_mod: { + const vm_mod = b.createModule(.{ + .root_source_file = b.path("src/blockchain/vm_zevem.zig"), + .target = target, + .optimize = optimize, }); - } - exe.linkLibrary(ethash); - exe.linkLibrary(evmone); + vm_mod.addImport("zevem", zevem.module("zevem")); + break :vm_mod vm_mod; + } else vm_mod: { + const vm_mod = b.createModule(.{ + .root_source_file = b.path("src/blockchain/vm_evmc.zig"), + .target = target, + .optimize = optimize, + }); + vm_mod.addIncludePath(b.path("evmone/include/evmone")); + vm_mod.addIncludePath(b.path("evmone/evmc/include")); + vm_mod.addLibraryPath(b.path("zig-out/evmone_build/lib")); + lib.linkSystemLibrary("evmone"); + + // use cmake to build evmone for now + const evmone_cmake_config_step = b.addSystemCommand(&.{"cmake"}); + evmone_cmake_config_step.addArgs(&.{ "-S", "evmone", "-B", "zig-out/evmone_build" }); + + if (!is_target_host) { + // Cross-compilation: use zig cc as the C/C++ compiler + const cmake_system_name = switch (target.result.os.tag) { + .linux => "Linux", + .macos => "Darwin", + .windows => "Windows", + else => @tagName(target.result.os.tag), + }; + const cmake_system_processor = switch (target.result.cpu.arch) { + .x86_64 => "x86_64", + .aarch64 => "aarch64", + .arm => "arm", + .riscv64 => "riscv64", + else => @tagName(target.result.cpu.arch), + }; + const zig_target = b.fmt("{s}-{s}-{s}", .{ + @tagName(target.result.cpu.arch), + @tagName(target.result.os.tag), + @tagName(target.result.abi), + }); + + evmone_cmake_config_step.addArgs(&.{ + b.fmt("-DCMAKE_SYSTEM_NAME={s}", .{cmake_system_name}), + b.fmt("-DCMAKE_SYSTEM_PROCESSOR={s}", .{cmake_system_processor}), + b.fmt("-DCMAKE_C_COMPILER_TARGET={s}", .{zig_target}), + b.fmt("-DCMAKE_CXX_COMPILER_TARGET={s}", .{zig_target}), + "-DCMAKE_C_COMPILER=zig", + "-DCMAKE_CXX_COMPILER=zig", + "-DCMAKE_C_COMPILER_ARG1=cc", + "-DCMAKE_CXX_COMPILER_ARG1=c++", + b.fmt("-DCMAKE_C_FLAGS=-target {s}", .{zig_target}), + b.fmt("-DCMAKE_CXX_FLAGS=-target {s}", .{zig_target}), + }); + } + + const evmone_cmake_build_step = b.addSystemCommand(&.{ "cmake", "--build", "zig-out/evmone_build" }); + evmone_cmake_build_step.step.dependOn(&evmone_cmake_config_step.step); + lib.step.dependOn(&evmone_cmake_build_step.step); + exe.step.dependOn(&evmone_cmake_build_step.step); + unit_tests.step.dependOn(&evmone_cmake_build_step.step); + break :vm_mod vm_mod; + }; + vm_mod.addImport("lib", lib_mod); + lib_mod.addImport("vm", vm_mod); exe.linkLibC(); - exe.root_module.addImport("zig-rlp", dep_rlp.module("zig-rlp")); + exe.linkLibrary(lib); + lib_mod.addImport("zig-rlp", dep_rlp.module("zig-rlp")); exe.linkLibrary(depSecp256k1.artifact("secp256k1")); - exe.root_module.addImport("zig-eth-secp256k1", mod_secp256k1); + lib_mod.addImport("zig-eth-secp256k1", mod_secp256k1); exe.root_module.addImport("httpz", mod_httpz); exe.root_module.addImport("simargs", zigcli.module("simargs")); - exe.root_module.addImport("pretty-table", zigcli.module("pretty-table")); + lib_mod.addImport("pretty-table", zigcli.module("pretty-table")); + exe.root_module.addImport("lib", lib_mod); // This declares intent for the executable to be installed into the // standard location when the user invokes the "install" step (the default @@ -192,26 +216,11 @@ pub fn build(b: *std.Build) !void { const run_step = b.step("run", "Run the app"); run_step.dependOn(&run_cmd.step); - // Creates a step for unit testing. This only builds the test executable - // but does not run it. - const unit_tests = b.addTest(.{ - .root_source_file = b.path("src/lib.zig"), - .target = target, - .optimize = optimize, - }); - unit_tests.addIncludePath(b.path("evmone/include/evmone")); - unit_tests.addIncludePath(b.path("evmone/evmc/include")); - if (target.result.cpu.arch == .x86_64) { - // On x86_64, some functions are missing from the static library, - // so we define dummy functions to make sure that it compiles. - unit_tests.addCSourceFile(.{ - .file = b.path("src/glue.c"), - .flags = &cflags, - }); - } - unit_tests.linkLibrary(ethash); - unit_tests.linkLibrary(evmone); + unit_tests.root_module.addImport("lib", lib_mod); + unit_tests.addLibraryPath(b.path("zig-out/evmone_build/lib")); + unit_tests.linkSystemLibrary("evmone"); unit_tests.linkLibC(); + unit_tests.root_module.addImport("vm", vm_mod); unit_tests.root_module.addImport("zig-rlp", dep_rlp.module("zig-rlp")); unit_tests.linkLibrary(depSecp256k1.artifact("secp256k1")); unit_tests.root_module.addImport("zig-eth-secp256k1", mod_secp256k1); diff --git a/build.zig.zon b/build.zig.zon index e9e66ef..49a499b 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -1,22 +1,31 @@ .{ - .name = "phant", + .fingerprint = 0x24619a25c388c236, + .name = .phant, .version = "0.0.1-beta-0", .dependencies = .{ - .@"zig-rlp" = .{ - .url = "https://github.com/gballet/zig-rlp/archive/refs/tags/v0.1.1-beta7.tar.gz", - .hash = "12201b3645a414dffc2bca872a1467b549d0029b9e36c80fcaeb22a06ec27fab9aee", - }, - .@"zig-eth-secp256k1" = .{ - .url = "https://github.com/jsign/zig-eth-secp256k1/archive/95b7f93.tar.gz", - .hash = "1220c0cf921a5311489bdd6eaf2f2b82bc9245ba39c2da346039aa311e28db633828", + .rlp = .{ + .url = "https://github.com/gballet/zig-rlp/archive/v0.1.1-beta-8.tar.gz", + .hash = "rlp-0.1.0-7i0JtBGSAACU44qijBzojQzyn2kLZ-wnIn5qOJxpWnky", }, .httpz = .{ - .url = "https://github.com/karlseguin/http.zig/archive/c224ebb.tar.gz", - .hash = "12206297df84406cd4eed306acef30eb2a1a6a18b6771ebb4920391a3a7299b2e6a7", + .url = "git+https://github.com/karlseguin/http.zig?ref=master#9434eaa607f855da77b80387b0be7f7cf2aaaa63", + .hash = "httpz-0.0.0-PNVzrFy3BgC7H3cLoiB1odzkl37NJdPx-OHG6eRXeQLX", }, .zigcli = .{ - .url = "https://github.com/jiacai2050/zigcli/archive/54d095c.tar.gz", - .hash = "1220e8fb37224ab6ee9c575129594a808643b548596d63dd8b87cb42e22a7eed9f51", + .url = "https://github.com/jiacai2050/zigcli/archive/refs/tags/v0.2.0.tar.gz", + .hash = "zigcli-0.2.0-ORC7jKlzAgDYhWCmfjBE9jWPA7CqMQKlMTT3Rcadfgzv", + }, + .zig_eth_secp256k1 = .{ + .url = "git+https://github.com/gballet/zig-eth-secp256k1?ref=add-freestanding-support#4e7e77f50bd0e852fb6a824b9c2ac2c4f8c91bf9", + .hash = "zig_eth_secp256k1-0.1.0-_U97sBzsDACmwsVCfA9UA3UPr8pK8qaSeLHx97Q_Nnzu", + }, + .zevem = .{ + .url = "https://github.com/gballet/zevem/archive/73b9805.tar.gz", + .hash = "zevem-0.0.0-ur64biZ6AQCSZip8ILCEonv9qtqIHWeymNEbN6ETxfwK", + }, + .curl = .{ + .url = "https://github.com/jiacai2050/zig-curl/archive/refs/tags/v0.3.0.tar.gz", + .hash = "curl-0.3.0-P4tT4ZzSAADueeRzPHnzLFj9lRTJyA3rnOYycH0yu-N4", }, }, .paths = .{""}, diff --git a/src/blockchain/blockchain.zig b/src/blockchain/blockchain.zig index 492ec43..0e70b1b 100644 --- a/src/blockchain/blockchain.zig +++ b/src/blockchain/blockchain.zig @@ -4,11 +4,12 @@ const common = @import("../common/common.zig"); const blocks = @import("../types/block.zig"); const config = @import("../config/config.zig"); const transaction = @import("../types/transaction.zig"); -const vm = @import("vm.zig"); +const vm = @import("vm"); const rlp = @import("zig-rlp"); const signer = @import("../signer/signer.zig"); -const params = @import("params.zig"); -const blockchain_types = @import("types.zig"); +pub const params = @import("params.zig"); +const lib = @import("lib"); +const blockchain_types = lib.blockchain_types; const mpt = @import("../mpt/mpt.zig"); const Allocator = std.mem.Allocator; const AddressSet = common.AddressSet; @@ -20,7 +21,7 @@ const Tx = types.Tx; pub const BlockHeader = types.BlockHeader; const Environment = blockchain_types.Environment; const Message = blockchain_types.Message; -const StateDB = @import("../state/state.zig").StateDB; +const StateDB = lib.state.StateDB; const Hash32 = types.Hash32; const Bytes32 = types.Bytes32; const Address = types.Address; diff --git a/src/blockchain/fork.zig b/src/blockchain/fork.zig index af91e13..5137c4a 100644 --- a/src/blockchain/fork.zig +++ b/src/blockchain/fork.zig @@ -1,4 +1,4 @@ -const lib = @import("../lib.zig"); +const lib = @import("lib"); const Hash32 = lib.types.Hash32; const Fork = @This(); pub const frontier = @import("./forks/frontier.zig"); diff --git a/src/blockchain/forks/frontier.zig b/src/blockchain/forks/frontier.zig index 2ee0524..f476a59 100644 --- a/src/blockchain/forks/frontier.zig +++ b/src/blockchain/forks/frontier.zig @@ -1,6 +1,6 @@ const std = @import("std"); -const Fork = @import("../fork.zig"); -const lib = @import("../../lib.zig"); +const lib = @import("lib"); +const Fork = lib.blockchain.Fork; const Hash32 = lib.types.Hash32; const base_fork_vtable = Fork.VTable{ diff --git a/src/blockchain/forks/prague.zig b/src/blockchain/forks/prague.zig index 612d1b5..ef3c03e 100644 --- a/src/blockchain/forks/prague.zig +++ b/src/blockchain/forks/prague.zig @@ -1,6 +1,6 @@ const std = @import("std"); -const Fork = @import("../fork.zig"); -const lib = @import("../../lib.zig"); +const lib = @import("lib"); +const Fork = lib.fork; const Hash32 = lib.types.Hash32; const StateDB = lib.state.StateDB; const Address = lib.types.Address; diff --git a/src/blockchain/types.zig b/src/blockchain/types.zig index 8c24aa1..1490413 100644 --- a/src/blockchain/types.zig +++ b/src/blockchain/types.zig @@ -1,8 +1,9 @@ -const types = @import("../types/types.zig"); -const config = @import("../config/config.zig"); -const common = @import("../common/common.zig"); -const Fork = @import("fork.zig"); -const StateDB = @import("../state/state.zig").StateDB; +const lib = @import("lib"); +const types = lib.types; +const config = lib.config; +const common = lib.common; +const Fork = lib.blockchain.Fork; +const StateDB = lib.state.StateDB; const Address = types.Address; const Hash32 = types.Hash32; const Bytes32 = types.Bytes32; diff --git a/src/blockchain/vm.zig b/src/blockchain/vm_evmc.zig similarity index 98% rename from src/blockchain/vm.zig rename to src/blockchain/vm_evmc.zig index 8f217c8..e650b44 100644 --- a/src/blockchain/vm.zig +++ b/src/blockchain/vm_evmc.zig @@ -1,11 +1,13 @@ const evmc = @cImport({ @cInclude("evmone.h"); }); +const EVM = @import("zevem").EVM; const std = @import("std"); -const types = @import("../types/types.zig"); -const common = @import("../common/common.zig"); -const params = @import("params.zig"); -const blockchain_types = @import("types.zig"); +const lib = @import("lib"); +const types = lib.types; +const common = lib.common; +const params = lib.blockchain.params; +const blockchain_types = lib.blockchain_types; const Allocator = std.mem.Allocator; const AddressSet = common.AddressSet; const AddressKey = common.AddressKey; @@ -525,7 +527,7 @@ const EVMOneHost = struct { // toEVMCAddress transforms an Address or ?Address into an evmc_address. fn toEVMCAddress(address: anytype) evmc.struct_evmc_address { const addr_typeinfo = @typeInfo(@TypeOf(address)); - if (@TypeOf(address) != Address and addr_typeinfo.Optional.child != Address) { + if (@TypeOf(address) != Address and addr_typeinfo.optional.child != Address) { @compileError("address must be of type Address or ?Address"); } diff --git a/src/blockchain/vm_zevem.zig b/src/blockchain/vm_zevem.zig new file mode 100644 index 0000000..5954e17 --- /dev/null +++ b/src/blockchain/vm_zevem.zig @@ -0,0 +1,65 @@ +const zevem = @import("zevem"); +const std = @import("std"); +const lib = @import("lib"); +const common = lib.common; +const Allocator = std.mem.Allocator; +const Environment = lib.blockchain_types.Environment; +const Message = lib.blockchain_types.Message; + +const empty_hash = common.comptimeHexToBytes("c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"); + +const EnvFuncs = struct { + pub fn getBalance(_: *EnvFuncs) void {} +}; +const EVM = zevem.evm.New(EnvFuncs); + +pub const VM = struct { + const vmlog = std.log.scoped(.vm); + + allocator: Allocator, + env: Environment, + envfuncs: *EnvFuncs, + evm: EVM, + + // init creates a new EVM VM instance. The caller must call deinit() when done. + pub fn init(allocator: Allocator, env: Environment) VM { + const envfuncs = allocator.create(EnvFuncs) catch @panic("error allocating environment function"); + const evm = EVM.init(allocator, envfuncs) catch @panic("error in evm init"); + return .{ + .allocator = allocator, + .env = env, + .evm = evm, + .envfuncs = envfuncs, + }; + } + + // deinit destroys a VM instance. + pub fn deinit(self: *VM) void { + if (self.evm.*.destroy) |destroy| { + destroy(self.evm); + } + self.allocator.destroy(self.envfuncs); + } + + // processMessageCall executes a message call. + pub fn processMessageCall(self: *VM, msg: Message) !MessageCallOutput { + if (msg.target != null) { + try self.env.state.incrementNonce(msg.sender); + } + + try self.evm.execute(self.env.state.getAccount(msg.target.?).code); + return .{ + .gas_left = 0, + .refund_counter = 0, + .success = true, + }; + } +}; + +pub const MessageCallOutput = struct { + success: bool, + gas_left: u64, + refund_counter: u64, + // logs: Union[Tuple[()], Tuple[Log, ...]] TODO + // accounts_to_delete: AddressKeySet, // TODO (delete?) +}; diff --git a/src/common/common.zig b/src/common/common.zig index 95f72f8..6cc9fe8 100644 --- a/src/common/common.zig +++ b/src/common/common.zig @@ -1,5 +1,6 @@ const std = @import("std"); -const types = @import("../types/types.zig"); +const lib = @import("lib"); +const types = lib.types; const hexutils = @import("hexutils.zig"); const rlp = @import("rlp.zig"); const contract = @import("contract.zig"); diff --git a/src/common/contract.zig b/src/common/contract.zig index 4e2aab0..3dd06f7 100644 --- a/src/common/contract.zig +++ b/src/common/contract.zig @@ -1,7 +1,8 @@ const std = @import("std"); +const lib = @import("lib"); const Allocator = std.mem.Allocator; const rlp = @import("zig-rlp"); -const types = @import("../types/types.zig"); +const types = lib.types; const Keccak256 = std.crypto.hash.sha3.Keccak256; // TODO: with careful calculation, we could avoid the allocator. diff --git a/src/engine_api/engine_api.zig b/src/engine_api/engine_api.zig index ef45d21..95eb973 100644 --- a/src/engine_api/engine_api.zig +++ b/src/engine_api/engine_api.zig @@ -1,12 +1,12 @@ const std = @import("std"); +const lib = @import("lib"); const fmt = std.fmt; -const types = @import("../types/types.zig"); -const common = @import("../common/common.zig"); +const types = lib.types; +const common = lib.common; const Allocator = std.mem.Allocator; const Withdrawal = types.Withdrawal; const Tx = types.Tx; const ExecutionPayload = execution_payload.ExecutionPayload; -const lib = @import("../lib.zig"); const Fork = lib.blockchain.Fork; pub const execution_payload = @import("execution_payload.zig"); diff --git a/src/engine_api/execution_payload.zig b/src/engine_api/execution_payload.zig index 8862fef..f4b90f1 100644 --- a/src/engine_api/execution_payload.zig +++ b/src/engine_api/execution_payload.zig @@ -1,7 +1,7 @@ const std = @import("std"); -const types = @import("../types/types.zig"); -const lib = @import("../lib.zig"); -const version = @import("../version.zig"); +const lib = @import("lib"); +const types = lib.types; +const version = lib.version; const Blockchain = lib.blockchain.Blockchain; const state = lib.state; const Allocator = std.mem.Allocator; diff --git a/src/lib.zig b/src/lib.zig index fab1236..3c4fef2 100644 --- a/src/lib.zig +++ b/src/lib.zig @@ -3,22 +3,12 @@ const std = @import("std"); pub const state = @import("state/state.zig"); pub const types = @import("types/types.zig"); pub const blockchain = @import("blockchain/blockchain.zig"); +pub const blockchain_types = @import("blockchain/types.zig"); pub const crypto = @import("crypto/crypto.zig"); pub const signer = @import("signer/signer.zig"); pub const engine_api = @import("engine_api/engine_api.zig"); pub const mpt = @import("mpt/mpt.zig"); pub const config = @import("config/config.zig"); - -test "tests" { - std.testing.log_level = .debug; - - std.testing.refAllDeclsRecursive(@import("blockchain/blockchain.zig")); - std.testing.refAllDeclsRecursive(@import("config/config.zig")); - std.testing.refAllDeclsRecursive(@import("crypto/crypto.zig")); - std.testing.refAllDeclsRecursive(@import("engine_api/engine_api.zig")); - std.testing.refAllDeclsRecursive(@import("tests/spec_tests.zig")); - std.testing.refAllDeclsRecursive(@import("tests/custom_tests.zig")); - std.testing.refAllDeclsRecursive(@import("state/state.zig")); - std.testing.refAllDeclsRecursive(@import("types/types.zig")); - std.testing.refAllDeclsRecursive(@import("mpt/mpt.zig")); -} +pub const common = @import("common/common.zig"); +pub const version = @import("version.zig"); +pub const fork = @import("blockchain/fork.zig"); diff --git a/src/main.zig b/src/main.zig index a1c6bf7..106dc6c 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1,23 +1,23 @@ const std = @import("std"); -const lib = @import("lib.zig"); +const lib = @import("lib"); const ChainConfig = lib.config.ChainConfig; -const types = @import("types/types.zig"); -const crypto = @import("crypto/crypto.zig"); +const types = lib.types; +const crypto = lib.crypto; const ecdsa = crypto.ecdsa; -const AccountState = @import("state/state.zig").AccountState; +const AccountState = lib.state.AccountState; const Address = types.Address; -const VM = @import("blockchain/vm.zig").VM; -const StateDB = @import("state/state.zig").StateDB; +const VM = @import("vm").VM; +const StateDB = lib.state.StateDB; const Block = types.Block; const BlockHeader = types.BlockHeader; const Tx = types.Tx; -const TxSigner = @import("signer/signer.zig").TxSigner; +const TxSigner = lib.signer.TxSigner; const Hash32 = types.Hash32; const httpz = @import("httpz"); -const engine_api = @import("engine_api/engine_api.zig"); +const engine_api = lib.engine_api; const json = std.json; const simargs = @import("simargs"); -const version = @import("version.zig").version; +const version = lib.version.version; const Blockchain = lib.blockchain.Blockchain; const Fork = lib.blockchain.Fork; @@ -97,7 +97,7 @@ pub fn main() !void { // TODO print usage upon failure (requires upstream changes) // TODO generate version from build and add it here - const opts = try simargs.parse(gpa.allocator(), PhantArgs, "", version); + const opts = try simargs.parse(allocator, PhantArgs, "", version); defer opts.deinit(); const port: u16 = if (opts.args.engine_api_port == null) 8551 else opts.args.engine_api_port.?; @@ -140,11 +140,11 @@ pub fn main() !void { }; var blockchain = try Blockchain.init(allocator, config.chainId, &statedb, parent_header, try Fork.frontier.newFrontierFork(allocator)); - var engine_api_server = try httpz.ServerApp(*Blockchain).init(allocator, .{ + var engine_api_server = try httpz.Server(*Blockchain).init(allocator, .{ .port = port, }, &blockchain); - var router = engine_api_server.router(); - router.post("/", engineAPIHandler); + var router = try engine_api_server.router(.{}); + router.post("/", engineAPIHandler, .{}); std.log.info("Listening on {}", .{port}); try engine_api_server.listen(); } diff --git a/src/tests/custom_tests.zig b/src/tests/custom_tests.zig index e2172f9..8ece6f6 100644 --- a/src/tests/custom_tests.zig +++ b/src/tests/custom_tests.zig @@ -1,13 +1,14 @@ const std = @import("std"); -const config = @import("../config/config.zig"); -const common = @import("../common/common.zig"); -const vm = @import("../blockchain/vm.zig"); -const state = @import("../state/state.zig"); -const blockchain = @import("../blockchain/blockchain.zig"); -const blockchain_types = @import("../blockchain/types.zig"); +const lib = @import("lib"); +const config = lib.config; +const common = lib.common; +const vm = @import("vm"); +const state = lib.state; +const blockchain = lib.blockchain; +const blockchain_types = lib.blockchain_types; const Message = blockchain_types.Message; const Environment = blockchain_types.Environment; -const types = @import("../types/types.zig"); +const types = lib.types; const Hash32 = types.Hash32; const Address = types.Address; const StateDB = state.StateDB; diff --git a/src/tests/lib_tests.zig b/src/tests/lib_tests.zig new file mode 100644 index 0000000..e07231b --- /dev/null +++ b/src/tests/lib_tests.zig @@ -0,0 +1,12 @@ +const std = @import("std"); +const lib = @import("lib"); +const custom = @import("./custom_tests.zig"); +const spec = @import("./spec_tests.zig"); + +test "tests" { + std.testing.log_level = .debug; + // XXX this is commented out because of an apparent bug in zig 0.14.1 + // std.testing.refAllDeclsRecursive(lib.state); + std.testing.refAllDeclsRecursive(custom); + std.testing.refAllDeclsRecursive(spec); +} diff --git a/src/tests/spec_tests.zig b/src/tests/spec_tests.zig index e66e1fb..3539b56 100644 --- a/src/tests/spec_tests.zig +++ b/src/tests/spec_tests.zig @@ -1,13 +1,14 @@ const std = @import("std"); +const lib = @import("lib"); const rlp = @import("rlp"); -const config = @import("../config/config.zig"); -const types = @import("../types/types.zig"); -const blockchain = @import("../blockchain/blockchain.zig"); -const vm = @import("../blockchain/vm.zig"); -const ecdsa = @import("../crypto/crypto.zig").ecdsa; -const state = @import("../state/state.zig"); -const common = @import("../common/common.zig"); -const TxSigner = @import("../signer/signer.zig").TxSigner; +const config = lib.config; +const types = lib.types; +const blockchain = lib.blockchain; +const vm = @import("vm"); +const ecdsa = lib.crypto.ecdsa; +const state = lib.state; +const common = lib.common; +const TxSigner = lib.signer.TxSigner; const Allocator = std.mem.Allocator; const Address = types.Address; const Block = types.Block;