mirror of
https://github.com/luxfi/explorer.git
synced 2026-09-24 00:25:12 +00:00
Make the explorer ONE binary that runs the Rust Blockscout-rs services in-process via FFI — not by rewriting them in Go and not by exec'ing subprocesses. The real Rust service entrypoints run on their own Tokio runtime threads inside the Go binary. - ffi/ — one C-ABI staticlib (crate-type=["staticlib"]) wrapping the service crates by path (../../explorer-rs/<svc>). One staticlib = one Rust std/panic runtime, no duplicate-symbol conflicts. A `service!` macro is the single place that bridges a service: parse Settings JSON, spawn a dedicated OS thread with a multi-thread Tokio runtime, run the service's real entrypoint. Exports lux_explorer_start_<svc>() + lux_explorer_start_all(). Disabled services still export their symbol and return LUX_FFI_ERR_DISABLED so the Go side links identically. sig-provider is wired and proven first (stateless, fastest to build); the other four services' deps/features/service! blocks are written out commented with confirmed entrypoint signatures for mechanical scale-out. - ffi_on.go (//go:build ffi) — cgo preamble (-llux_explorer_ffi + the darwin/linux system libs the Rust graph needs) + extern decls; startFFIServices() launches the services at startup from main(). - ffi_off.go (//go:build !ffi) — no-op fallback so plain `go build ./...` compiles WITHOUT the staticlib present. - Makefile `make single` = cargo build --release in ffi/ then go build -tags ffi. ffi/README.md documents the C ABI, the protoc / protoc-gen-openapiv2 build-tool prereqs, the seeded Cargo.lock, and the one-service-at-a-time scale-out recipe. Verified: default `go build ./...` exits 0; ffi/ staticlib compiles with sig-provider linked (.a 7.9MB shim -> 58MB with service); cgo -tags ffi links it into the binary (symbols present via nm); the single binary boots and logs `[ffi] start sig-provider -> ok (0)` with the service running in-process. go vet clean under both build tags.