Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
* [#4032](https://github.com/sei-protocol/sei-chain/pull/4032) fix(config): the default `telemetry.prometheus-retention-time` drops from `7200` to `0`, so neither app.toml-generation pipeline (`seid init`, or the file a node writes for itself on any other subcommand) starts the Prometheus metrics sink unless an operator sets a positive retention. Freshly generated nodes keep the bounded in-memory telemetry sink used by SIGUSR1 dumps. Existing `app.toml` files are unchanged.
* [#4021](https://github.com/sei-protocol/sei-chain/pull/4021) feat(grpc): per-IP rate-limit admission for the gRPC plane, off by default behind `[grpc] rate-limiting-enabled` (new `ip-rate-limit-rps` / `ip-rate-limit-burst` / `trusted-proxy-cidrs`, defaults 10 rps / 20 burst / trust no proxy). Native gRPC (:9090) is admitted by a tap handler and gRPC-Web (:9091) by HTTP middleware, both before the request is protobuf-decoded, so a throttled caller cannot spend the decoder; streams pay one token to establish and one per inbound message. Both planes draw from the same per-IP buckets. Over-budget callers get `ResourceExhausted` on :9090 and HTTP 429 on :9091, counted by `rpc_rate_limit_rejected_total{plane="grpc", method_namespace}`.
* [#4078](https://github.com/sei-protocol/sei-chain/pull/4078) feat(grpc): bound concurrent in-flight RPCs and open connections per IP on the gRPC query plane. New `[grpc] max-connections-per-ip` and `[grpc-web] max-connections-per-ip` (default 0, unlimited) optionally cap one address's share of the global connection budget on :9090 and :9091, regardless of `rate-limiting-enabled`. New `[grpc] max-in-flight-per-ip` (default 100) caps concurrent RPCs per address when `rate-limiting-enabled = true`: the slot is taken at the HTTP/2 HEADERS frame and returned when the RPC ends. Both planes draw from the same per-IP pool. Concurrency rejections return `ResourceExhausted` on :9090 and HTTP 429 on :9091, counted by `rpc_inflight_rejected_total{plane, method_namespace}`; refused connections are counted by `rpc_connection_rejected_total{plane}`.
* [#4117](https://github.com/sei-protocol/sei-chain/pull/4117) chore(giga): remove the unused evmone/evmc execution path from the Giga executor. The Giga executor's production path already ran on go-ethereum's native interpreter; evmone was only reachable through a best-effort VM init that nothing consumed. Release images no longer ship `libevmone.*.so`/`.dylib` under `/usr/lib`, and the `SEI_EVMONE_LIB_DIR` operator override is removed.

### Upgrade guide
* [#4032](https://github.com/sei-protocol/sei-chain/pull/4032) **The Prometheus telemetry sink is off by default.** A node whose `app.toml` is generated by this release gets `prometheus-retention-time = 0`, which leaves the sink uncreated even though `telemetry.enabled` stays `true`. `GET /metrics?format=prometheus` on the app API server (:1317) then returns `prometheus metrics are not enabled`, and the `seid` process exports no application Prometheus series. **Operators who scrape application metrics should set a positive `[telemetry] prometheus-retention-time` in `app.toml` (the previous default was `7200`) before generating a new configuration file.** Nodes that already have `prometheus-retention-time` written in `app.toml` are unaffected.
Expand Down
4 changes: 0 additions & 4 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,6 @@ RUN --mount=type=cache,target=/go/pkg/mod \

COPY . .

# Install the platform evmone shared library next to the other native libraries
# so the Giga executor can load it from a fixed, trusted absolute path (/usr/lib)
# at runtime instead of relying on the dynamic linker's search path.
RUN cp giga/executor/lib/libevmone.0.12.0_linux_${TARGETARCH}.so /go/lib/
ENV CGO_ENABLED=1
ARG SEI_CHAIN_REF=""
ARG GO_BUILD_TAGS=""
Expand Down
7 changes: 0 additions & 7 deletions app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,6 @@ import (
evmrpcconfig "github.com/sei-protocol/sei-chain/evmrpc/config"
gigaexecutor "github.com/sei-protocol/sei-chain/giga/executor"
gigaconfig "github.com/sei-protocol/sei-chain/giga/executor/config"
gigalib "github.com/sei-protocol/sei-chain/giga/executor/lib"
gigaprecompiles "github.com/sei-protocol/sei-chain/giga/executor/precompiles"
gigautils "github.com/sei-protocol/sei-chain/giga/executor/utils"
"github.com/sei-protocol/sei-chain/precompiles"
Expand Down Expand Up @@ -758,12 +757,6 @@ func New(
app.GigaOCCEnabled = gigaExecutorConfig.OCCEnabled
tmtypes.SkipLastResultsHashValidation.Store(gigaExecutorConfig.Enabled)
if gigaExecutorConfig.Enabled {
// evmone is loaded best-effort
if evmoneVM, err := gigalib.InitEvmoneVM(); err == nil {
app.GigaEvmKeeper.EvmoneVM = evmoneVM
} else {
logger.Debug("failed to load evmone VM", "error", err)
}
// evm_giga_mixed_tests.sh matches these ENABLED/DISABLED strings to guard node roles; keep them in sync.
if gigaExecutorConfig.OCCEnabled {
logger.Info("benchmark: Giga Executor with OCC is ENABLED - using new EVM execution path with parallel execution")
Expand Down
8 changes: 0 additions & 8 deletions app/test_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import (
"testing"
"time"

gigalib "github.com/sei-protocol/sei-chain/giga/executor/lib"
"github.com/sei-protocol/sei-chain/sei-cosmos/client"
slashingtypes "github.com/sei-protocol/sei-chain/sei-cosmos/x/slashing/types"
"github.com/sei-protocol/sei-chain/sei-cosmos/x/staking"
Expand Down Expand Up @@ -167,13 +166,6 @@ func NewGigaTestWrapperWithRegularStore(t *testing.T, tm time.Time, valPub crypt
// Configure GigaBankKeeper to use regular KVStore instead of GigaKVStore
wrapper.App.GigaBankKeeper.UseRegularStore = true

// Initialize evmone VM if not already initialized (best effort)
if wrapper.App.GigaEvmKeeper.EvmoneVM == nil {
if evmoneVM, err := gigalib.InitEvmoneVM(); err == nil {
wrapper.App.GigaEvmKeeper.EvmoneVM = evmoneVM
}
}

return wrapper
}

Expand Down
4 changes: 0 additions & 4 deletions giga/deps/xevm/keeper/keeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import (
"sort"
"sync"

"github.com/ethereum/evmc/v12/bindings/go/evmc"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/consensus"
"github.com/ethereum/go-ethereum/core"
Expand Down Expand Up @@ -81,9 +80,6 @@ type Keeper struct {
latestCustomPrecompiles map[common.Address]vm.PrecompiledContract
latestUpgrade string

// EvmoneVM holds the loaded evmone VM instance for the Giga executor
EvmoneVM *evmc.VM

// UseRegularStore when true causes PrefixStore to use ctx.KVStore instead of ctx.GigaKVStore.
// This is for debugging/testing to isolate Giga executor logic from GigaKVStore layer.
UseRegularStore bool
Expand Down
12 changes: 0 additions & 12 deletions giga/executor/executor.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package executor
import (
"math/big"

"github.com/ethereum/evmc/v12/bindings/go/evmc"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/types"
Expand All @@ -16,17 +15,6 @@ type Executor struct {
evm *vm.EVM
}

func NewEvmoneExecutor(evmoneVM *evmc.VM, blockCtx vm.BlockContext, stateDB vm.StateDB, chainConfig *params.ChainConfig, config vm.Config, customPrecompiles map[common.Address]vm.PrecompiledContract) *Executor {
evm := vm.NewEVM(blockCtx, stateDB, chainConfig, config, customPrecompiles)
// Pre-compute HostContext config from chain config (avoids per-SSTORE overhead)
hostConfig := internal.NewHostContextConfig(chainConfig)
hostContext := internal.NewHostContext(evmoneVM, evm, hostConfig)
evm.EVMInterpreter = internal.NewEVMInterpreter(hostContext, evm)
return &Executor{
evm: evm,
}
}

func NewGethExecutor(blockCtx vm.BlockContext, stateDB vm.StateDB, chainConfig *params.ChainConfig, config vm.Config, customPrecompiles map[common.Address]vm.PrecompiledContract) *Executor {
evm := vm.NewEVM(blockCtx, stateDB, chainConfig, config, customPrecompiles)
return &Executor{
Expand Down
Loading
Loading