From 32f79775d16c841ed424c8595e313407caf014c4 Mon Sep 17 00:00:00 2001 From: 18aaddy Date: Thu, 19 Sep 2024 22:04:37 +0530 Subject: [PATCH 1/3] Updated --- cli/main.go | 221 +++++++++++++++++++++++++++++++++++++++++++++++ client/client.go | 2 + config/config.go | 4 +- go.mod | 11 ++- go.sum | 133 ++++++++++++++++++++++++++-- 5 files changed, 360 insertions(+), 11 deletions(-) create mode 100644 cli/main.go create mode 100644 client/client.go diff --git a/cli/main.go b/cli/main.go new file mode 100644 index 0000000..95492f9 --- /dev/null +++ b/cli/main.go @@ -0,0 +1,221 @@ +package cli + +import ( + "fmt" + // "net" + "os" + "os/signal" + "path/filepath" + "strings" + "sync" + "syscall" + "encoding/hex" + + "github.com/spf13/pflag" + "github.com/spf13/viper" + "go.uber.org/zap" + + "github.com/BlocSoc-iitr/selene/config" +) + +// type Config struct { +// Network string +// RpcBindIP net.IP +// RpcPort uint16 +// Checkpoint string +// ExecutionRPC string +// ConsensusRPC string +// DataDir string +// Fallback string +// LoadExternalFallback bool +// StrictCheckpointAge bool +// } + +type Client struct { + // Add necessary fields +} + +func main() { + logger, _ := zap.NewProduction() + defer logger.Sync() + + sugar := logger.Sugar() + + config, err := getConfig() + if err != nil { + sugar.Errorf("Failed to get config: %v", err) + os.Exit(1) + } + + client, err := newClient(config) + if err != nil { + sugar.Errorf("Failed to create client: %v", err) + os.Exit(1) + } + + if err := client.start(); err != nil { + sugar.Errorf("Failed to start client: %v", err) + os.Exit(1) + } + + registerShutdownHandler(client, sugar) + + // Wait indefinitely + select {} +} + +func registerShutdownHandler(client *Client, logger *zap.SugaredLogger) { + var shutdownCounter int + var mu sync.Mutex + + c := make(chan os.Signal, 1) + signal.Notify(c, os.Interrupt, syscall.SIGTERM) + + go func() { + for sig := range c { + _ = sig + mu.Lock() + shutdownCounter++ + counter := shutdownCounter + mu.Unlock() + + if counter == 3 { + logger.Info("Forced shutdown") + os.Exit(0) + } + + logger.Infof("Shutting down... press ctrl-c %d more times to force quit", 3-counter) + + if counter == 1 { + go func() { + client.shutdown() + os.Exit(0) + }() + } + } + }() +} + +func getConfig() (*config.Config, error) { + cli := &Cli{} + + // Set up command-line flags + pflag.StringVar(cli.ConsensusRpc, "consensus-rpc", "", "Consensus RPC URL") + pflag.StringVar(cli.ExecutionRpc, "execution-rpc", "", "Execution RPC URL") + + var rpcBindIp string + pflag.StringVar(&rpcBindIp, "rpc-bind-ip", "", "RPC bind IP") + + var rpcPort uint16 + pflag.Uint16Var(&rpcPort, "rpc-port", 0, "RPC port") + + var checkpointStr string + pflag.StringVar(&checkpointStr, "checkpoint", "", "Checkpoint (32 byte hex)") + + var dataDir string + pflag.StringVar(&dataDir, "data-dir", "", "Data directory") + + var fallback string + pflag.StringVar(&fallback, "fallback", "", "Fallback URL") + + pflag.BoolVar(&cli.LoadExternalFallback, "load-external-fallback", false, "Load external fallback") + pflag.BoolVar(&cli.StrictCheckpointAge, "strict-checkpoint-age", false, "Strict checkpoint age") + + var databaseType string + pflag.StringVar(&databaseType, "database-type", "", "Database type") + + pflag.Parse() + + // Bind flags to viper + viper.BindPFlags(pflag.CommandLine) + + // Set up environment variables + viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_")) + viper.AutomaticEnv() + + // Set default values + if dataDir == "" { + home, err := os.UserHomeDir() + if err != nil { + return nil, fmt.Errorf("failed to get user home directory: %v", err) + } + dataDir = filepath.Join(home, ".selene") + } + cli.DataDir = &dataDir + + // Process the checkpoint + if checkpointStr != "" { + checkpointBytes, err := hex.DecodeString(checkpointStr) + if err != nil { + return nil, fmt.Errorf("invalid checkpoint hex string: %v", err) + } + if len(checkpointBytes) != 32 { + return nil, fmt.Errorf("checkpoint must be exactly 32 bytes") + } + var checkpoint [32]byte + copy(checkpoint[:], checkpointBytes) + cli.Checkpoint = &checkpoint + } + + // Set pointers for optional fields + if rpcBindIp != "" { + cli.RpcBindIp = &rpcBindIp + } + if rpcPort != 0 { + cli.RpcPort = &rpcPort + } + if fallback != "" { + cli.Fallback = &fallback + } + + cliConfig := cli.asCliConfig() + homeDir, _ := os.UserHomeDir() + configPath := filepath.Join(homeDir, ".selene", "selene.toml") + var finalConfig config.Config + + finalConfig.FromFile(&configPath, &cli.Network, &cliConfig) + + return &finalConfig, nil +} + +type Cli struct { + Network string + RpcBindIp *string + RpcPort *uint16 + Checkpoint *[32]byte + ExecutionRpc *string + ConsensusRpc *string + DataDir *string + Fallback *string + LoadExternalFallback bool + StrictCheckpointAge bool +} + +func (c *Cli) asCliConfig() config.CliConfig { + checkpoint := c.Checkpoint[:] + return config.CliConfig{ + Checkpoint: &checkpoint, + ExecutionRpc: c.ExecutionRpc, + ConsensusRpc: c.ConsensusRpc, + DataDir: c.DataDir, + RpcBindIp: c.RpcBindIp, + RpcPort: c.RpcPort, + Fallback: c.Fallback, + LoadExternalFallback: &c.LoadExternalFallback, + StrictCheckpointAge: &c.StrictCheckpointAge, + } +} + +func newClient(config *config.Config) (*Client, error) { + // Implement client creation logic + return &Client{}, nil +} + +func (c *Client) start() error { + // Implement client start logic + return nil +} + +func (c *Client) shutdown() { + // Implement client shutdown logic +} \ No newline at end of file diff --git a/client/client.go b/client/client.go new file mode 100644 index 0000000..f2a0299 --- /dev/null +++ b/client/client.go @@ -0,0 +1,2 @@ +package client + diff --git a/config/config.go b/config/config.go index 9cb8052..f8ad0af 100644 --- a/config/config.go +++ b/config/config.go @@ -26,7 +26,7 @@ type Config struct { } // only if we are using CLI -func (c Config) from_file(configPath *string, network *string, cliConfig *CliConfig) Config { +func (c Config) FromFile(configPath *string, network *string, cliConfig *CliConfig) Config { n := Network(*network) baseConfig, err := n.BaseConfig(*network) if err != nil { @@ -118,7 +118,7 @@ func (c Config) from_file(configPath *string, network *string, cliConfig *CliCon } return finalConfig } -func (c Config) to_base_config() BaseConfig { +func (c Config) ToBaseConfig() BaseConfig { return BaseConfig{ RpcBindIp: func() string { if c.RpcBindIp != nil { diff --git a/go.mod b/go.mod index d3224ef..8f4cc49 100644 --- a/go.mod +++ b/go.mod @@ -3,18 +3,22 @@ module github.com/BlocSoc-iitr/selene go 1.22.3 require ( + github.com/avast/retry-go v3.0.0+incompatible + github.com/consensys/gnark-crypto v0.12.1 github.com/ethereum/go-ethereum v1.14.8 github.com/holiman/uint256 v1.3.1 github.com/pkg/errors v0.9.1 + github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.19.0 + github.com/wealdtech/go-merkletree v1.0.0 + go.uber.org/zap v1.21.0 + gopkg.in/yaml.v2 v2.4.0 ) require ( - github.com/avast/retry-go v3.0.0+incompatible // indirect github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect @@ -37,6 +41,8 @@ require ( github.com/supranational/blst v0.3.11 // indirect github.com/ugorji/go/codec v1.2.12 // indirect github.com/wealdtech/go-merkletree v1.0.0 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + github.com/supranational/blst v0.3.11 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.9.0 // indirect golang.org/x/crypto v0.22.0 // indirect @@ -45,7 +51,6 @@ require ( golang.org/x/sys v0.20.0 // indirect golang.org/x/text v0.14.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/go.sum b/go.sum index 602c81c..4e8d914 100644 --- a/go.sum +++ b/go.sum @@ -1,21 +1,48 @@ +github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= +github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= +github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= +github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHSxpiH9JdtuBj0= github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= -github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= -github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v1.1.1 h1:XnKU22oiCLy2Xn8vp1re67cXg4SAasg/WDt1NtcRFaw= +github.com/cockroachdb/pebble v1.1.1/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= @@ -23,31 +50,83 @@ github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHE github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.14.8 h1:NgOWvXS+lauK+zFukEvi85UmmsS/OkV0N23UZ1VTIig= github.com/ethereum/go-ethereum v1.14.8/go.mod h1:TJhyuDq0JDppAkFXgqjwpdlQApywnu/m10kFPxh8vvs= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= +github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/holiman/uint256 v1.3.1 h1:JfTzmih28bittyHM8z360dCjIA9dbPIBlcTI6lmctQs= github.com/holiman/uint256 v1.3.1/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= +github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v1.12.0 h1:C+UIj/QWtmqY13Arb8kwMt5j34/0Z2iKamrJ+ryC0Gg= +github.com/prometheus/client_golang v1.12.0/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a h1:CmF68hwI0XsOQ5UwlBopMi2Ow4Pbg32akc4KIVCOm+Y= +github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= @@ -63,6 +142,7 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= @@ -74,32 +154,73 @@ github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbe github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/wealdtech/go-merkletree v1.0.0 h1:DsF1xMzj5rK3pSQM6mPv8jlyJyHXhFxpnA2bwEjMMBY= github.com/wealdtech/go-merkletree v1.0.0/go.mod h1:cdil512d/8ZC7Kx3bfrDvGMQXB25NTKbsm0rFrmDax4= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= -golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= -golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= +go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= From 999cf2f5c141e4f167c8789cfb9f5c1119d5d8dc Mon Sep 17 00:00:00 2001 From: 18aaddy Date: Tue, 24 Sep 2024 12:42:39 +0530 Subject: [PATCH 2/3] Revert "Updated" This reverts commit 32f79775d16c841ed424c8595e313407caf014c4. --- cli/main.go | 221 ----------------------------------------------- client/client.go | 2 - config/config.go | 4 +- go.mod | 11 +-- go.sum | 133 ++-------------------------- 5 files changed, 11 insertions(+), 360 deletions(-) delete mode 100644 cli/main.go delete mode 100644 client/client.go diff --git a/cli/main.go b/cli/main.go deleted file mode 100644 index 95492f9..0000000 --- a/cli/main.go +++ /dev/null @@ -1,221 +0,0 @@ -package cli - -import ( - "fmt" - // "net" - "os" - "os/signal" - "path/filepath" - "strings" - "sync" - "syscall" - "encoding/hex" - - "github.com/spf13/pflag" - "github.com/spf13/viper" - "go.uber.org/zap" - - "github.com/BlocSoc-iitr/selene/config" -) - -// type Config struct { -// Network string -// RpcBindIP net.IP -// RpcPort uint16 -// Checkpoint string -// ExecutionRPC string -// ConsensusRPC string -// DataDir string -// Fallback string -// LoadExternalFallback bool -// StrictCheckpointAge bool -// } - -type Client struct { - // Add necessary fields -} - -func main() { - logger, _ := zap.NewProduction() - defer logger.Sync() - - sugar := logger.Sugar() - - config, err := getConfig() - if err != nil { - sugar.Errorf("Failed to get config: %v", err) - os.Exit(1) - } - - client, err := newClient(config) - if err != nil { - sugar.Errorf("Failed to create client: %v", err) - os.Exit(1) - } - - if err := client.start(); err != nil { - sugar.Errorf("Failed to start client: %v", err) - os.Exit(1) - } - - registerShutdownHandler(client, sugar) - - // Wait indefinitely - select {} -} - -func registerShutdownHandler(client *Client, logger *zap.SugaredLogger) { - var shutdownCounter int - var mu sync.Mutex - - c := make(chan os.Signal, 1) - signal.Notify(c, os.Interrupt, syscall.SIGTERM) - - go func() { - for sig := range c { - _ = sig - mu.Lock() - shutdownCounter++ - counter := shutdownCounter - mu.Unlock() - - if counter == 3 { - logger.Info("Forced shutdown") - os.Exit(0) - } - - logger.Infof("Shutting down... press ctrl-c %d more times to force quit", 3-counter) - - if counter == 1 { - go func() { - client.shutdown() - os.Exit(0) - }() - } - } - }() -} - -func getConfig() (*config.Config, error) { - cli := &Cli{} - - // Set up command-line flags - pflag.StringVar(cli.ConsensusRpc, "consensus-rpc", "", "Consensus RPC URL") - pflag.StringVar(cli.ExecutionRpc, "execution-rpc", "", "Execution RPC URL") - - var rpcBindIp string - pflag.StringVar(&rpcBindIp, "rpc-bind-ip", "", "RPC bind IP") - - var rpcPort uint16 - pflag.Uint16Var(&rpcPort, "rpc-port", 0, "RPC port") - - var checkpointStr string - pflag.StringVar(&checkpointStr, "checkpoint", "", "Checkpoint (32 byte hex)") - - var dataDir string - pflag.StringVar(&dataDir, "data-dir", "", "Data directory") - - var fallback string - pflag.StringVar(&fallback, "fallback", "", "Fallback URL") - - pflag.BoolVar(&cli.LoadExternalFallback, "load-external-fallback", false, "Load external fallback") - pflag.BoolVar(&cli.StrictCheckpointAge, "strict-checkpoint-age", false, "Strict checkpoint age") - - var databaseType string - pflag.StringVar(&databaseType, "database-type", "", "Database type") - - pflag.Parse() - - // Bind flags to viper - viper.BindPFlags(pflag.CommandLine) - - // Set up environment variables - viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_")) - viper.AutomaticEnv() - - // Set default values - if dataDir == "" { - home, err := os.UserHomeDir() - if err != nil { - return nil, fmt.Errorf("failed to get user home directory: %v", err) - } - dataDir = filepath.Join(home, ".selene") - } - cli.DataDir = &dataDir - - // Process the checkpoint - if checkpointStr != "" { - checkpointBytes, err := hex.DecodeString(checkpointStr) - if err != nil { - return nil, fmt.Errorf("invalid checkpoint hex string: %v", err) - } - if len(checkpointBytes) != 32 { - return nil, fmt.Errorf("checkpoint must be exactly 32 bytes") - } - var checkpoint [32]byte - copy(checkpoint[:], checkpointBytes) - cli.Checkpoint = &checkpoint - } - - // Set pointers for optional fields - if rpcBindIp != "" { - cli.RpcBindIp = &rpcBindIp - } - if rpcPort != 0 { - cli.RpcPort = &rpcPort - } - if fallback != "" { - cli.Fallback = &fallback - } - - cliConfig := cli.asCliConfig() - homeDir, _ := os.UserHomeDir() - configPath := filepath.Join(homeDir, ".selene", "selene.toml") - var finalConfig config.Config - - finalConfig.FromFile(&configPath, &cli.Network, &cliConfig) - - return &finalConfig, nil -} - -type Cli struct { - Network string - RpcBindIp *string - RpcPort *uint16 - Checkpoint *[32]byte - ExecutionRpc *string - ConsensusRpc *string - DataDir *string - Fallback *string - LoadExternalFallback bool - StrictCheckpointAge bool -} - -func (c *Cli) asCliConfig() config.CliConfig { - checkpoint := c.Checkpoint[:] - return config.CliConfig{ - Checkpoint: &checkpoint, - ExecutionRpc: c.ExecutionRpc, - ConsensusRpc: c.ConsensusRpc, - DataDir: c.DataDir, - RpcBindIp: c.RpcBindIp, - RpcPort: c.RpcPort, - Fallback: c.Fallback, - LoadExternalFallback: &c.LoadExternalFallback, - StrictCheckpointAge: &c.StrictCheckpointAge, - } -} - -func newClient(config *config.Config) (*Client, error) { - // Implement client creation logic - return &Client{}, nil -} - -func (c *Client) start() error { - // Implement client start logic - return nil -} - -func (c *Client) shutdown() { - // Implement client shutdown logic -} \ No newline at end of file diff --git a/client/client.go b/client/client.go deleted file mode 100644 index f2a0299..0000000 --- a/client/client.go +++ /dev/null @@ -1,2 +0,0 @@ -package client - diff --git a/config/config.go b/config/config.go index f8ad0af..9cb8052 100644 --- a/config/config.go +++ b/config/config.go @@ -26,7 +26,7 @@ type Config struct { } // only if we are using CLI -func (c Config) FromFile(configPath *string, network *string, cliConfig *CliConfig) Config { +func (c Config) from_file(configPath *string, network *string, cliConfig *CliConfig) Config { n := Network(*network) baseConfig, err := n.BaseConfig(*network) if err != nil { @@ -118,7 +118,7 @@ func (c Config) FromFile(configPath *string, network *string, cliConfig *CliConf } return finalConfig } -func (c Config) ToBaseConfig() BaseConfig { +func (c Config) to_base_config() BaseConfig { return BaseConfig{ RpcBindIp: func() string { if c.RpcBindIp != nil { diff --git a/go.mod b/go.mod index 8f4cc49..d3224ef 100644 --- a/go.mod +++ b/go.mod @@ -3,22 +3,18 @@ module github.com/BlocSoc-iitr/selene go 1.22.3 require ( - github.com/avast/retry-go v3.0.0+incompatible - github.com/consensys/gnark-crypto v0.12.1 github.com/ethereum/go-ethereum v1.14.8 github.com/holiman/uint256 v1.3.1 github.com/pkg/errors v0.9.1 - github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.19.0 - github.com/wealdtech/go-merkletree v1.0.0 - go.uber.org/zap v1.21.0 - gopkg.in/yaml.v2 v2.4.0 ) require ( + github.com/avast/retry-go v3.0.0+incompatible // indirect github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect @@ -41,8 +37,6 @@ require ( github.com/supranational/blst v0.3.11 // indirect github.com/ugorji/go/codec v1.2.12 // indirect github.com/wealdtech/go-merkletree v1.0.0 // indirect - github.com/subosito/gotenv v1.6.0 // indirect - github.com/supranational/blst v0.3.11 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.9.0 // indirect golang.org/x/crypto v0.22.0 // indirect @@ -51,6 +45,7 @@ require ( golang.org/x/sys v0.20.0 // indirect golang.org/x/text v0.14.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/go.sum b/go.sum index 4e8d914..602c81c 100644 --- a/go.sum +++ b/go.sum @@ -1,48 +1,21 @@ -github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= -github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= -github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= -github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= -github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= -github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHSxpiH9JdtuBj0= github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= +github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= -github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= -github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= -github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v1.1.1 h1:XnKU22oiCLy2Xn8vp1re67cXg4SAasg/WDt1NtcRFaw= -github.com/cockroachdb/pebble v1.1.1/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= -github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= -github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= -github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= -github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= @@ -50,83 +23,31 @@ github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHE github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.14.8 h1:NgOWvXS+lauK+zFukEvi85UmmsS/OkV0N23UZ1VTIig= github.com/ethereum/go-ethereum v1.14.8/go.mod h1:TJhyuDq0JDppAkFXgqjwpdlQApywnu/m10kFPxh8vvs= -github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= -github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= -github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= -github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= -github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= -github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= -github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/holiman/uint256 v1.3.1 h1:JfTzmih28bittyHM8z360dCjIA9dbPIBlcTI6lmctQs= github.com/holiman/uint256 v1.3.1/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= -github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= -github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.12.0 h1:C+UIj/QWtmqY13Arb8kwMt5j34/0Z2iKamrJ+ryC0Gg= -github.com/prometheus/client_golang v1.12.0/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a h1:CmF68hwI0XsOQ5UwlBopMi2Ow4Pbg32akc4KIVCOm+Y= -github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= @@ -142,7 +63,6 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= @@ -154,73 +74,32 @@ github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbe github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/wealdtech/go-merkletree v1.0.0 h1:DsF1xMzj5rK3pSQM6mPv8jlyJyHXhFxpnA2bwEjMMBY= github.com/wealdtech/go-merkletree v1.0.0/go.mod h1:cdil512d/8ZC7Kx3bfrDvGMQXB25NTKbsm0rFrmDax4= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= -go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= +golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= From e79e0dc06bbb9ce375dc52357eb802b096416522 Mon Sep 17 00:00:00 2001 From: 18aaddy Date: Tue, 24 Sep 2024 12:47:46 +0530 Subject: [PATCH 3/3] Resolved conflicts --- client/errors.go | 162 ++++++ client/node.go | 715 +++++++++++++++++++++++++ client/rpc.go | 1152 +++++++++++++++++++++++++++++++++++++++++ config/config.go | 4 +- config/config_test.go | 14 +- 5 files changed, 2038 insertions(+), 9 deletions(-) create mode 100644 client/errors.go create mode 100644 client/node.go create mode 100644 client/rpc.go diff --git a/client/errors.go b/client/errors.go new file mode 100644 index 0000000..d72bd83 --- /dev/null +++ b/client/errors.go @@ -0,0 +1,162 @@ +package client + +import ( + "fmt" + "github.com/ethereum/go-ethereum/common/hexutil" + "time" +) + +// NodeError is the base error type for all node-related errors +type NodeError struct { + errType string + message string + cause error +} + +func (e *NodeError) Error() string { + if e.cause != nil { + return fmt.Sprintf("%s: %s", e.errType, e.cause.Error()) + } + return fmt.Sprintf("%s: %s", e.errType, e.message) +} +func (e *NodeError) Unwrap() error { + return e.cause +} + +// NewExecutionEvmError creates a new ExecutionEvmError +func NewExecutionEvmError(err error) *NodeError { + return &NodeError{ + errType: "ExecutionEvmError", + cause: err, + } +} + +// NewExecutionError creates a new ExecutionError +func NewExecutionError(err error) *NodeError { + return &NodeError{ + errType: "ExecutionError", + message: "execution error", + cause: err, + } +} + +// NewOutOfSyncError creates a new OutOfSyncError +func NewOutOfSyncError(behind time.Duration) *NodeError { + return &NodeError{ + errType: "OutOfSyncError", + message: fmt.Sprintf("out of sync: %s behind", behind), + } +} + +// NewConsensusPayloadError creates a new ConsensusPayloadError +func NewConsensusPayloadError(err error) *NodeError { + return &NodeError{ + errType: "ConsensusPayloadError", + message: "consensus payload error", + cause: err, + } +} + +// NewExecutionPayloadError creates a new ExecutionPayloadError +func NewExecutionPayloadError(err error) *NodeError { + return &NodeError{ + errType: "ExecutionPayloadError", + message: "execution payload error", + cause: err, + } +} + +// NewConsensusClientCreationError creates a new ConsensusClientCreationError +func NewConsensusClientCreationError(err error) *NodeError { + return &NodeError{ + errType: "ConsensusClientCreationError", + message: "consensus client creation error", + cause: err, + } +} + +// NewExecutionClientCreationError creates a new ExecutionClientCreationError +func NewExecutionClientCreationError(err error) *NodeError { + return &NodeError{ + errType: "ExecutionClientCreationError", + message: "execution client creation error", + cause: err, + } +} + +// NewConsensusAdvanceError creates a new ConsensusAdvanceError +func NewConsensusAdvanceError(err error) *NodeError { + return &NodeError{ + errType: "ConsensusAdvanceError", + message: "consensus advance error", + cause: err, + } +} + +// NewConsensusSyncError creates a new ConsensusSyncError +func NewConsensusSyncError(err error) *NodeError { + return &NodeError{ + errType: "ConsensusSyncError", + message: "consensus sync error", + cause: err, + } +} + +// NewBlockNotFoundError creates a new BlockNotFoundError +func NewBlockNotFoundError(err error) *NodeError { + return &NodeError{ + errType: "BlockNotFoundError", + cause: err, + } +} + +// EvmError represents errors from the EVM +type EvmError struct { + revertData []byte +} + +func (e *EvmError) Error() string { + return "EVM error" +} + +// DecodeRevertReason attempts to decode the revert reason from the given data +func DecodeRevertReason(data []byte) string { + // This is a placeholder. In a real implementation, you'd decode the ABI-encoded revert reason. + return string(data) +} + +// JSONRPCError represents a JSON-RPC error +type JSONRPCError struct { + Code int `json:"code"` + Message string `json:"message"` + Data interface{} `json:"data,omitempty"` +} + +// ToJSONRPCError converts a NodeError to a JSON-RPC error +func (e *NodeError) ToJSONRPCError() *JSONRPCError { + switch e.errType { + case "ExecutionEvmError": + if evmErr, ok := e.cause.(*EvmError); ok { + if evmErr.revertData != nil { + msg := "execution reverted" + if reason := DecodeRevertReason(evmErr.revertData); reason != "" { + msg = fmt.Sprintf("%s: %s", msg, reason) + } + return &JSONRPCError{ + Code: 3, // Assuming 3 is the code for execution revert + Message: msg, + Data: hexutil.Encode(evmErr.revertData), + } + } + } + return &JSONRPCError{ + Code: -32000, // Generic server error + Message: e.Error(), + } + default: + return &JSONRPCError{ + Code: -32000, // Generic server error + Message: e.Error(), + } + } +} \ No newline at end of file diff --git a/client/node.go b/client/node.go new file mode 100644 index 0000000..3764c89 --- /dev/null +++ b/client/node.go @@ -0,0 +1,715 @@ +package client + +import ( + "errors" + "github.com/BlocSoc-iitr/selene/common" + "github.com/BlocSoc-iitr/selene/config" + "github.com/BlocSoc-iitr/selene/consensus" + "github.com/BlocSoc-iitr/selene/execution" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/core/types" + "math/big" + "time" +) + +// Used instead of Alloy::TransactionRequest +type TransactionRequest struct { + From string + To string + Value *big.Int + Gas uint64 + GasPrice *big.Int + Data []byte +} + +// Here [32]byte is used for B256 type in Rust and *big.Int is used for U256 type +type Node struct { + Consensus *consensus.ConsensusClient + Execution *execution.ExecutionClient + Config *config.Config + HistorySize int +} + +func NewNode(config *config.Config) (*Node, error) { + consensusRPC := config.ConsensusRpc + executionRPC := config.ExecutionRpc + // Initialize ConsensusClient + consensus := consensus.ConsensusClient{}.New(&consensusRPC, *config) + // Extract block receivers + blockRecv := consensus.BlockRecv + if blockRecv == nil { + return nil, errors.New("blockRecv is nil") + } + finalizedBlockRecv := consensus.FinalizedBlockRecv + if finalizedBlockRecv == nil { + return nil, errors.New("finalizedBlockRecv is nil") + } + // Initialize State + state := execution.State{}.New(blockRecv, finalizedBlockRecv, 256) + // Initialize ExecutionClient + execution, err := execution.ExecutionClient{}.New(executionRPC, state) + if err != nil { + return nil, errors.New("ExecutionClient creation error") + } + // Return the constructed Node + return &Node{ + Consensus: &consensus, + Execution: execution, + Config: config, + HistorySize: 64, + }, nil +} + +func (n *Node) Call(tx *TransactionRequest, block common.BlockTag) ([]byte, *NodeError) { + resultChan := make(chan []byte) + errorChan := make(chan *NodeError) + + go func() { + n.CheckBlocktagAge(block) + evm := (&execution.Evm{}).New(n.Execution, n.ChainId, block) + result, err := evm.Call(tx) + if err != nil { + errorChan <- NewExecutionClientCreationError(err) + return + } + resultChan <- result + errorChan <- nil + }() + + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return nil, err + } +} + +func (n *Node) EstimateGas(tx *TransactionRequest) (uint64, *NodeError) { + resultChan := make(chan uint64) + errorChan := make(chan *NodeError) + + go func() { + n.CheckHeadAge() + evm := (&execution.Evm{}).New(n.Execution, n.ChainId, common.BlockTag{Latest: true}) + result, err := evm.EstimateGas(tx) + if err != nil { + errorChan <- NewExecutionEvmError(err) + return + } + resultChan <- result + errorChan <- nil + }() + + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return 0, err + } +} + +func (n *Node) GetBalance(address string, tag common.BlockTag) (*big.Int, error) { + resultChan := make(chan *big.Int) + errorChan := make(chan error) + + go func() { + n.CheckBlocktagAge(tag) + account, err := n.Execution.GetAccount(address, nil, tag) + if err != nil { + errorChan <- err + return + } + resultChan <- account.Balance + errorChan <- nil + }() + + select { + case balance := <-resultChan: + return balance, nil + case err := <-errorChan: + return nil, err + } +} + +func (n *Node) GetNonce(address string, tag common.BlockTag) (uint64, error) { + resultChan := make(chan uint64) + errorChan := make(chan error) + + go func() { + n.CheckBlocktagAge(tag) + account, err := n.Execution.GetAccount(address, nil, tag) + if err != nil { + errorChan <- err + return + } + resultChan <- account.Nonce + errorChan <- nil + }() + + select { + case nonce := <-resultChan: + return nonce, nil + case err := <-errorChan: + return 0, err + } +} + +func (n *Node) GetBlockTransactionCountByHash(hash [32]byte) (uint64, error) { + resultChan := make(chan uint64) + errorChan := make(chan error) + + go func() { + block, err := n.Execution.GetBlockByHash(hash, false) + if err != nil { + errorChan <- err + return + } + transactionCount := len(block.Transactions.HashesFunc()) + resultChan <- uint64(transactionCount) + errorChan <- nil + }() + + select { + case txCount := <-resultChan: + return txCount, nil + case err := <-errorChan: + return 0, err + } +} + +func (n *Node) GetBlockTransactionCountByNumber(tag common.BlockTag) (uint64, error) { + resultChan := make(chan uint64) + errorChan := make(chan error) + + go func() { + block, err := n.Execution.GetBlock(tag, false) + if err != nil { + errorChan <- err + return + } + transactionCount := len(block.Transactions.HashesFunc()) + resultChan <- uint64(transactionCount) + errorChan <- nil + }() + + select { + case txCount := <-resultChan: + return txCount, nil + case err := <-errorChan: + return 0, err + } +} + +func (n *Node) GetCode(address string, tag common.BlockTag) ([]byte, error) { + resultChan := make(chan []byte) + errorChan := make(chan error) + + go func() { + n.CheckBlocktagAge(tag) + account, err := n.Execution.GetAccount(address, nil, tag) + if err != nil { + errorChan <- err + return + } + resultChan <- account.Code + errorChan <- nil + }() + + select { + case code := <-resultChan: + return code, nil + case err := <-errorChan: + return nil, err + } +} + +func (n *Node) GetStorageAt(address string, slot [32]byte, tag common.BlockTag) (*big.Int, error) { + resultChan := make(chan *big.Int) + errorChan := make(chan error) + + go func() { + n.CheckHeadAge() + account := n.Execution.GetAccount(address, &slot, tag) + value := account.Slots.Get(&slot) + if value == nil { + resultChan <- nil + errorChan <- errors.New("slot not found") + return + } + resultChan <- value + errorChan <- nil + }() + + return <-resultChan, <-errorChan +} + +func (n *Node) SendRawTransaction(bytes *[]uint8) ([32]byte, error) { + resultChan := make(chan [32]byte) + errorChan := make(chan error) + + go func() { + txHash, err := n.Execution.SendRawTransaction(bytes) + if err != nil { + errorChan <- err + return + } + resultChan <- txHash + errorChan <- nil + }() + + select { + case txHash := <-resultChan: + return txHash, nil + case err := <-errorChan: + return [32]byte{}, err + } +} + +func (n *Node) GetTransactionReceipt(txHash [32]byte) (*types.Receipt, error) { + resultChan := make(chan *types.Receipt) + errorChan := make(chan error) + + go func() { + txnReceipt, err := n.Execution.GetTransactionReceipt(txHash) + if err != nil { + errorChan <- err + return + } + resultChan <- txnReceipt + errorChan <- nil + }() + + select { + case receipt := <-resultChan: + return receipt, nil + case err := <-errorChan: + return nil, err + } +} + +func (n *Node) GetTransactionByHash(txHash [32]byte) (*types.Transaction, error) { + resultChan := make(chan *types.Transaction) + errorChan := make(chan error) + + go func() { + txn, err := n.Execution.GetTransactionByHash(txHash) + if err != nil { + errorChan <- err + return + } + resultChan <- txn + errorChan <- nil + }() + + select { + case txn := <-resultChan: + return txn, nil + case err := <-errorChan: + return nil, err + } +} + +func (n *Node) GetTransactionByBlockHashAndIndex(hash [32]byte, index uint64) (*types.Transaction, error) { + resultChan := make(chan *types.Transaction) + errorChan := make(chan error) + + go func() { + txn, err := n.Execution.GetTransactionByBlockHashAndIndex(hash, index) + if err != nil { + errorChan <- err + return + } + resultChan <- txn + errorChan <- nil + }() + + select { + case txn := <-resultChan: + return txn, nil + case err := <-errorChan: + return nil, err + } +} + +func (n *Node) GetLogs(filter *ethereum.FilterQuery) ([]types.Log, error) { + resultChan := make(chan []types.Log) + errorChan := make(chan error) + + go func() { + logs, err := n.Execution.GetLogs(filter) + if err != nil { + errorChan <- err + return + } + resultChan <- logs + errorChan <- nil + }() + + select { + case logs := <-resultChan: + return logs, nil + case err := <-errorChan: + return nil, err + } +} + +func (n *Node) GetFilterChanges(filterId *big.Int) ([]types.Log, error) { + resultChan := make(chan []types.Log) + errorChan := make(chan error) + + go func() { + logs, err := n.Execution.GetFilterChanges(filterId) + if err != nil { + errorChan <- err + return + } + resultChan <- logs + errorChan <- nil + }() + + select { + case logs := <-resultChan: + return logs, nil + case err := <-errorChan: + return nil, err + } +} + +func (n *Node) UninstallFilter(filterId *big.Int) (bool, error) { + resultChan := make(chan bool) + errorChan := make(chan error) + + go func() { + success, err := n.Execution.UninstallFilter(filterId) + if err != nil { + errorChan <- err + return + } + resultChan <- success + errorChan <- nil + }() + + select { + case success := <-resultChan: + return success, nil + case err := <-errorChan: + return false, err + } +} + +func (n *Node) GetNewFilter(filter *ethereum.FilterQuery) (*big.Int, error) { + resultChan := make(chan *big.Int) + errorChan := make(chan error) + + go func() { + filterId, err := n.Execution.GetNewFilter(filter) + if err != nil { + errorChan <- err + return + } + resultChan <- filterId + errorChan <- nil + }() + + select { + case filterId := <-resultChan: + return filterId, nil + case err := <-errorChan: + return nil, err + } +} + +func (n *Node) GetNewBlockFilter() (*big.Int, error) { + resultChan := make(chan *big.Int) + errorChan := make(chan error) + + go func() { + filterId, err := n.Execution.GetNewBlockFilter() + if err != nil { + errorChan <- err + return + } + resultChan <- filterId + errorChan <- nil + }() + + select { + case filterId := <-resultChan: + return filterId, nil + case err := <-errorChan: + return nil, err + } +} + +func (n *Node) GetNewPendingTransactionFilter() (*big.Int, error) { + resultChan := make(chan *big.Int) + errorChan := make(chan error) + + go func() { + filterId, err := n.Execution.GetNewPendingTransactionFilter() + if err != nil { + errorChan <- err + return + } + resultChan <- filterId + errorChan <- nil + }() + + select { + case filterId := <-resultChan: + return filterId, nil + case err := <-errorChan: + return nil, err + } +} + +func (n *Node) GetGasPrice() (*big.Int, error) { + resultChan := make(chan *big.Int) + errorChan := make(chan error) + + go func() { + n.CheckHeadAge() + block, err := n.Execution.GetBlock(common.BlockTag{}.Latest, false) + if err != nil { + errorChan <- err + return + } + baseFee := block.BaseFeePerGas + tip := new(big.Int).Exp(big.NewInt(10), big.NewInt(9), nil) // 1 Gwei + resultChan <- new(big.Int).Add(baseFee.ToBig(), tip) + errorChan <- nil + }() + + select { + case gasPrice := <-resultChan: + return gasPrice, nil + case err := <-errorChan: + return nil, err + } +} + +func (n *Node) GetPriorityFee() *big.Int { + tip := new(big.Int).Exp(big.NewInt(10), big.NewInt(9), nil) + return tip +} + +func (n *Node) GetBlockNumber() (*big.Int, error) { + resultChan := make(chan *big.Int) + errorChan := make(chan error) + + go func() { + n.CheckHeadAge() + block, err := n.Execution.GetBlock(common.BlockTag{}.Latest, false) + if err != nil { + errorChan <- err + return + } + resultChan <- big.NewInt(int64(block.Number)) + errorChan <- nil + }() + + select { + case blockNumber := <-resultChan: + return blockNumber, nil + case err := <-errorChan: + return nil, err + } +} + +func (n *Node) GetBlockByNumber(tag common.BlockTag, fullTx bool) (common.Block, error) { + resultChan := make(chan common.Block) + errorChan := make(chan error) + + go func() { + n.CheckBlocktagAge(tag) + block, err := n.Execution.GetBlock(tag, fullTx) + if err != nil { + errorChan <- err + return + } + resultChan <- block + errorChan <- nil + }() + + select { + case block := <-resultChan: + return block, nil + case err := <-errorChan: + return common.Block{}, err + } +} + +func (n *Node) GetBlockByHash(hash [32]byte, fullTx bool) (common.Block, error) { + resultChan := make(chan common.Block) + errorChan := make(chan error) + + go func() { + block, err := n.Execution.GetBlockByHash(hash, fullTx) + if err != nil { + errorChan <- err + return + } + resultChan <- block + errorChan <- nil + }() + + select { + case block := <-resultChan: + return block, nil + case err := <-errorChan: + return common.Block{}, err + } +} + +func (n *Node) ChainId() uint64 { + return n.Config.Chain.ChainID +} + +type SyncInfo struct { + CurrentBlock *big.Int + HighestBlock *big.Int + StartingBlock *big.Int +} +type SyncStatus struct { + Status string + Info SyncInfo +} + +func (n *Node) Syncing() (SyncStatus, error) { + resultChan := make(chan SyncStatus) + errorChan := make(chan error) + + go func() { + headErrChan := make(chan error) + blockNumberChan := make(chan *big.Int) + highestBlockChan := make(chan uint64) + + go func() { + headErrChan <- n.CheckHeadAge() + }() + + go func() { + blockNumber, err := n.GetBlockNumber() + if err != nil { + blockNumberChan <- big.NewInt(0) + } else { + blockNumberChan <- blockNumber + } + }() + + go func() { + highestBlock := n.Consensus.Expected_current_slot() + highestBlockChan <- highestBlock + }() + headErr := <-headErrChan + if headErr == nil { + resultChan <- SyncStatus{ + Status: "None", + } + errorChan <- nil + return + } + latestSyncedBlock := <-blockNumberChan + highestBlock := <-highestBlockChan + + resultChan <- SyncStatus{ + Info: SyncInfo{ + CurrentBlock: latestSyncedBlock, + HighestBlock: big.NewInt(int64(highestBlock)), + StartingBlock: big.NewInt(0), + }, + } + errorChan <- headErr + }() + + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return SyncStatus{}, err + } +} + +func (n *Node) GetCoinbase() ([20]byte, error) { + resultChan := make(chan [20]byte) + errorChan := make(chan error) + + go func() { + headErrChan := make(chan error) + blockChan := make(chan *common.Block) + + go func() { + headErrChan <- n.CheckHeadAge() + }() + + go func() { + block, err := n.Execution.GetBlock(common.BlockTag{}.Latest, false) + if err != nil { + errorChan <- err + resultChan <- [20]byte{} + return + } + blockChan <- block + }() + + if headErr := <-headErrChan; headErr != nil { + resultChan <- [20]byte{} + errorChan <- headErr + return + } + + block := <-blockChan + resultChan <- block.Miner.Addr + errorChan <- nil + }() + + select { + case coinbase := <-resultChan: + return coinbase, nil + case err := <-errorChan: + return [20]byte{}, err + } +} + +func (n *Node) CheckHeadAge() *NodeError { + resultChan := make(chan *NodeError) + + go func() { + currentTime := time.Now() + currentTimestamp := currentTime.Unix() + + block, err := n.Execution.GetBlock(common.BlockTag{Latest: true}, false) + if err != nil { + resultChan <- &NodeError{} + return + } + blockTimestamp := block.Timestamp.Unix() + delay := currentTimestamp - blockTimestamp + if delay > 60 { + resultChan <- NewOutOfSyncError(delay) + return + } + + resultChan <- nil + }() + + return <-resultChan +} + +func (n *Node) CheckBlocktagAge(block common.BlockTag) *NodeError { + errorChan := make(chan *NodeError) + + go func() { + if block.Latest { + headErr := n.CheckHeadAge() + errorChan <- headErr + return + } + if block.Finalized { + errorChan <- nil + return + } + errorChan <- nil + }() + return <-errorChan +} \ No newline at end of file diff --git a/client/rpc.go b/client/rpc.go new file mode 100644 index 0000000..345b940 --- /dev/null +++ b/client/rpc.go @@ -0,0 +1,1152 @@ +package client + +import ( + "encoding/json" + "fmt" + "github.com/BlocSoc-iitr/selene/common" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/core/types" + "github.com/sirupsen/logrus" + "log" + "math/big" + "net" + "net/http" + "sync" +) + +type Rpc struct { + Node *Node + Handle *Server + Address string +} + +func (r Rpc) New(node *Node, ip *string, port uint16) Rpc { + address := "127.0.0.1" //Default LocalHost value + return Rpc{ + Node: node, + Handle: nil, + Address: address, + } +} + +func (r Rpc) Start() (string, error) { + // Create channels to send the address and error back asynchronously + addrChan := make(chan string) + errChan := make(chan error) + + // Run the function in a separate goroutine + go func() { + rpcInner := RpcInner{ + Node: r.Node, + Address: r.Address, + } + handle, addr, err := rpcInner.StartServer() + if err != nil { + // Send the error on the error channel and close the channels + errChan <- err + close(addrChan) + close(errChan) + return + } + r.Handle = handle + logrus.WithField("target", "selene::rpc").Infof("rpc server started at %s", addr) + + // Send the address on the address channel and close the channels + addrChan <- addr + close(addrChan) + close(errChan) + }() + + return <-addrChan, <-errChan +} + +type RpcInner struct { + Node *Node + Address string +} + +func (r *RpcInner) GetBalance(address string, block common.BlockTag) (*big.Int, error) { + resultChan := make(chan *big.Int) + errorChan := make(chan error) + go func() { + balance, err := r.Node.GetBalance(address, block) + if err != nil { + errorChan <- err + return + } + resultChan <- balance + }() + select { + case balance := <-resultChan: + return balance, nil + case err := <-errorChan: + return nil, err + } +} +func (r *RpcInner) GetTransactionCount(address string, block common.BlockTag) (uint64, error) { + resultChan := make(chan uint64) + errorChan := make(chan error) + + go func() { + txCount, err := r.Node.GetNonce(address, block) + if err != nil { + errorChan <- err + return + } + resultChan <- uint64(txCount) + }() + select { + case txCount := <-resultChan: + return txCount, nil + case err := <-errorChan: + return 0, err + } +} +func (r *RpcInner) GetBlockTransactionCountByHash(hash [32]byte) (uint64, error) { + resultChan := make(chan uint64) + errorChan := make(chan error) + + go func() { + txCount, err := r.Node.GetBlockTransactionCountByHash(hash) + if err != nil { + errorChan <- err + return + } + resultChan <- txCount + }() + select { + case txCount := <-resultChan: + return txCount, nil + case err := <-errorChan: + return 0, err + } +} +func (r *RpcInner) GetBlockTransactionCountByNumber(block common.BlockTag) (uint64, error) { + resultChan := make(chan uint64) + errorChan := make(chan error) + + go func() { + txCount, err := r.Node.GetBlockTransactionCountByNumber(block) + if err != nil { + errorChan <- err + return + } + resultChan <- txCount + + }() + select { + case txCount := <-resultChan: + return txCount, nil + case err := <-errorChan: + return 0, err + } +} +func (r *RpcInner) GetCode(address string, block common.BlockTag) ([]byte, error) { + resultChan := make(chan []byte) + errorChan := make(chan error) + + go func() { + code, err := r.Node.GetCode(address, block) + if err != nil { + errorChan <- err + return + } + resultChan <- code + }() + select { + case code := <-resultChan: + return code, nil + case err := <-errorChan: + return nil, err + } +} +func (r *RpcInner) Call(tx TransactionRequest, block common.BlockTag) ([]byte, error) { + resultChan := make(chan []byte) + errorChan := make(chan error) + + go func() { + result, err := r.Node.Call(&tx, block) + if err != nil { + errorChan <- err.cause + return + } + resultChan <- result + + }() + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return nil, err + } +} +func (r *RpcInner) EstimateGas(tx *TransactionRequest) (uint64, error) { + resultChan := make(chan uint64) + errorChan := make(chan error) + go func() { + gas, err := r.Node.EstimateGas(tx) + if err != nil { + errorChan <- err.cause + return + } + resultChan <- gas + }() + select { + case gas := <-resultChan: + return gas, nil + case err := <-errorChan: + return 0, err + } +} +func (r *RpcInner) ChainId() (uint64, error) { + return r.Node.ChainId(), nil +} +func (r *RpcInner) GasPrice() (*big.Int, error) { + resultChan := make(chan *big.Int) + errorChan := make(chan error) + + go func() { + gasPrice, err := r.Node.GetGasPrice() + if err != nil { + errorChan <- err + return + } + resultChan <- gasPrice + }() + + select { + case gasPrice := <-resultChan: + return gasPrice, nil + case err := <-errorChan: + return nil, err + } +} +func (r *RpcInner) MaxPriorityFeePerGas() *big.Int { + return r.Node.GetPriorityFee() +} +func (r *RpcInner) BlockNumber() (uint64, error) { + resultChan := make(chan uint64) + errorChan := make(chan error) + + go func() { + number, err := r.Node.GetBlockNumber() + if err != nil { + errorChan <- err + return + } + resultChan <- number.Uint64() + }() + + select { + case number := <-resultChan: + return number, nil + case err := <-errorChan: + return 0, err + } +} +func (r *RpcInner) GetBlockByNumber(blockTag common.BlockTag, fullTx bool) (*common.Block, error) { + resultChan := make(chan *common.Block) + errorChan := make(chan error) + + go func() { + block, err := r.Node.GetBlockByNumber(blockTag, fullTx) + if err != nil { + errorChan <- err + return + } + resultChan <- &block + }() + + select { + case block := <-resultChan: + return block, nil + case err := <-errorChan: + return nil, err + } +} +func (r *RpcInner) GetBlockByHash(hash [32]byte, fullTx bool) (*common.Block, error) { + resultChan := make(chan *common.Block) + errorChan := make(chan error) + + go func() { + block, err := r.Node.GetBlockByHash(hash, fullTx) + if err != nil { + errorChan <- err + return + } + resultChan <- &block + }() + + select { + case block := <-resultChan: + return block, nil + case err := <-errorChan: + return nil, err + } +} +func (r *RpcInner) SendRawTransaction(bytes []uint8) ([32]byte, error) { + resultChan := make(chan [32]byte) + errorChan := make(chan error) + + go func() { + hash, err := r.Node.SendRawTransaction(&bytes) + if err != nil { + errorChan <- err + return + } + resultChan <- hash + }() + + select { + case hash := <-resultChan: + return hash, nil + case err := <-errorChan: + return [32]byte{}, err + } +} +func (r *RpcInner) GetTransactionReceipt(hash [32]byte) (*types.Receipt, error) { + resultChan := make(chan *types.Receipt) + errorChan := make(chan error) + + go func() { + txnReceipt, err := r.Node.GetTransactionReceipt(hash) + if err != nil { + errorChan <- err + return + } + resultChan <- txnReceipt + }() + + select { + case txnReceipt := <-resultChan: + return txnReceipt, nil + case err := <-errorChan: + return nil, err + } +} +func (r *RpcInner) GetTransactionByHash(hash [32]byte) (*types.Transaction, error) { + resultChan := make(chan *types.Transaction) + errorChan := make(chan error) + + go func() { + txn, err := r.Node.GetTransactionByHash(hash) + if err != nil { + errorChan <- err + return + } + resultChan <- txn + }() + + select { + case txn := <-resultChan: + return txn, nil + case err := <-errorChan: + return nil, err + } +} +func (r *RpcInner) GetTransactionByBlockHashAndIndex(hash [32]byte, index uint64) (*types.Transaction, error) { + resultChan := make(chan *types.Transaction) + errorChan := make(chan error) + + go func() { + txn, err := r.Node.GetTransactionByBlockHashAndIndex(hash, index) + if err != nil { + errorChan <- err + return + } + resultChan <- txn + }() + + select { + case txn := <-resultChan: + return txn, nil + case err := <-errorChan: + return nil, err + } +} +func (r *RpcInner) Coinbase() ([20]byte, error) { + resultChan := make(chan [20]byte) + errorChan := make(chan error) + + go func() { + coinbase, err := r.Node.GetCoinbase() + if err != nil { + errorChan <- err + return + } + resultChan <- coinbase + }() + + select { + case coinbase := <-resultChan: + return coinbase, nil + case err := <-errorChan: + return [20]byte{}, err + } +} +func (r *RpcInner) Syncing() (SyncStatus, error) { + resultChan := make(chan SyncStatus) + errorChan := make(chan error) + + go func() { + sync, err := r.Node.Syncing() + if err != nil { + errorChan <- err + return + } + resultChan <- sync + }() + select { + case sync := <-resultChan: + return sync, nil + case err := <-errorChan: + return SyncStatus{}, err + } +} +func (r *RpcInner) GetLogs(filter ethereum.FilterQuery) ([]types.Log, error) { + resultChan := make(chan []types.Log) + errorChan := make(chan error) + + go func() { + logs, err := r.Node.GetLogs(&filter) + if err != nil { + errorChan <- err + return + } + resultChan <- logs + }() + select { + case logs := <-resultChan: + return logs, nil + case err := <-errorChan: + return nil, err + } +} +func (r *RpcInner) GetFilterChanges(filterId *big.Int) ([]types.Log, error) { + resultChan := make(chan []types.Log) + errorChan := make(chan error) + + go func() { + logs, err := r.Node.GetFilterChanges(filterId) + if err != nil { + errorChan <- err + return + } + resultChan <- logs + }() + select { + case logs := <-resultChan: + return logs, nil + case err := <-errorChan: + return nil, err + } +} +func (r *RpcInner) UninstallFilter(filterId *big.Int) (bool, error) { + resultChan := make(chan bool) + errorChan := make(chan error) + + go func() { + boolean, err := r.Node.UninstallFilter(filterId) + if err != nil { + errorChan <- err + return + } + resultChan <- boolean + }() + select { + case boolean := <-resultChan: + return boolean, nil + case err := <-errorChan: + return false, err + } +} +func (r *RpcInner) GetNewFilter(filter ethereum.FilterQuery) (*big.Int, error) { + resultChan := make(chan *big.Int) + errorChan := make(chan error) + + go func() { + filterId, err := r.Node.GetNewFilter(&filter) + if err != nil { + errorChan <- err + return + } + resultChan <- filterId + }() + select { + case filterId := <-resultChan: + return filterId, nil + case err := <-errorChan: + return nil, err + } +} +func (r *RpcInner) GetNewBlockFilter() (*big.Int, error) { + resultChan := make(chan *big.Int) + errorChan := make(chan error) + + go func() { + filterId, err := r.Node.GetNewBlockFilter() + if err != nil { + errorChan <- err + return + } + resultChan <- filterId + }() + select { + case filterId := <-resultChan: + return filterId, nil + case err := <-errorChan: + return nil, err + } +} +func (r *RpcInner) GetNewPendingTransactionFilter() (*big.Int, error) { + resultChan := make(chan *big.Int) + errorChan := make(chan error) + + go func() { + filterId, err := r.Node.GetNewPendingTransactionFilter() + if err != nil { + errorChan <- err + return + } + resultChan <- filterId + }() + select { + case filterId := <-resultChan: + return filterId, nil + case err := <-errorChan: + return nil, err + } +} +func (r *RpcInner) GetStorageAt(address string, slot [32]byte, block common.BlockTag) (*big.Int, error) { + resultChan := make(chan *big.Int) + errorChan := make(chan error) + go func() { + value, err := r.Node.GetStorageAt(address, slot, block) + if err != nil { + errorChan <- err + return + } + resultChan <- value + }() + select { + case value := <-resultChan: + return value, nil + case err := <-errorChan: + return nil, err + } +} +func (r *RpcInner) Version() (uint64, error) { + return r.Node.ChainId(), nil +} + +// Define a struct to simulate JSON-RPC request/response +type JsonRpcRequest struct { + Method string `json:"method"` + Params json.RawMessage `json:"params"` + ID int `json:"id"` +} +type JsonRpcResponse struct { + Result interface{} `json:"result"` + Error interface{} `json:"error"` + ID int `json:"id"` +} + +// Server struct simulating server handle +type Server struct { + Address string + Methods map[string]http.HandlerFunc + mu sync.Mutex +} + +// Start the server and listen for requests +func (r *RpcInner) StartServer() (*Server, string, error) { + address := r.Address + server := &Server{ + Address: address, + Methods: map[string]http.HandlerFunc{}, + } + // Use a listener to get the local address (port) + listener, err := net.Listen("tcp", address) + if err != nil { + return nil, "", err + } + // Start the server asynchronously + go func() { + http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { + rpcHandler(w, req) + }) + if err := http.Serve(listener, nil); err != nil { + log.Fatalf("Failed to serve: %v", err) + } + }() + + return server, listener.Addr().String(), nil +} + +type RPCRequest struct { + Jsonrpc string `json:"jsonrpc"` + Method string `json:"method"` + Params []interface{} `json:"params"` + ID int `json:"id"` +} + +// JSON-RPC response structure +type RPCResponse struct { + Jsonrpc string `json:"jsonrpc"` + Result interface{} `json:"result"` + Error string `json:"error,omitempty"` + ID int `json:"id"` +} + +// Handle JSON-RPC requests +// Defines methods to call functions in the RPC Server +func rpcHandler(w http.ResponseWriter, r *http.Request) { + var req RPCRequest + var rpc RpcInner + err := json.NewDecoder(r.Body).Decode(&req) + if err != nil { + http.Error(w, "Invalid request payload", http.StatusBadRequest) + return + } + // Handle the RPC methods + switch req.Method { + case "eth_getBalance": + resultChan := make(chan *big.Int) + errorChan := make(chan error) + + go func() { + address := req.Params[0].(string) + block := req.Params[1].(common.BlockTag) + balance, err := rpc.GetBalance(address, block) + if err != nil { + errorChan <- err + return + } + resultChan <- balance + }() + + select { + case balance := <-resultChan: + writeRPCResponse(w, req.ID, balance.String(), "") + case err := <-errorChan: + writeRPCResponse(w, req.ID, nil, err.Error()) + } + case "eth_getTransactionCount": + resultChan := make(chan uint64) + errorChan := make(chan error) + + go func() { + address := req.Params[0].(string) + block := req.Params[1].(common.BlockTag) + nonce, err := rpc.GetTransactionCount(address, block) + if err != nil { + errorChan <- err + return + } + resultChan <- nonce + }() + + select { + case nonce := <-resultChan: + writeRPCResponse(w, req.ID, fmt.Sprintf("%d", nonce), "") + case err := <-errorChan: + writeRPCResponse(w, req.ID, nil, err.Error()) + } + case "eth_getBlockTransactionCountByHash": + resultChan := make(chan uint64) + errorChan := make(chan error) + + go func() { + hash := req.Params[0].([32]byte) + count, err := rpc.GetBlockTransactionCountByHash(hash) + if err != nil { + errorChan <- err + return + } + resultChan <- count + }() + + select { + case count := <-resultChan: + writeRPCResponse(w, req.ID, fmt.Sprintf("%d", count), "") + case err := <-errorChan: + writeRPCResponse(w, req.ID, nil, err.Error()) + } + case "eth_getBlockTransactionCountByNumber": + resultChan := make(chan uint64) + errorChan := make(chan error) + + go func() { + block := req.Params[0].(common.BlockTag) + nonce, err := rpc.GetBlockTransactionCountByNumber(block) + if err != nil { + errorChan <- err + return + } + resultChan <- nonce + }() + + select { + case nonce := <-resultChan: + writeRPCResponse(w, req.ID, fmt.Sprintf("%d", nonce), "") + case err := <-errorChan: + writeRPCResponse(w, req.ID, nil, err.Error()) + } + case "eth_getCode": + resultChan := make(chan []byte) + errorChan := make(chan error) + + go func() { + address := req.Params[0].(string) + block := req.Params[1].(common.BlockTag) + code, err := rpc.GetCode(address, block) + if err != nil { + errorChan <- err + return + } + resultChan <- code + }() + + select { + case code := <-resultChan: + writeRPCResponse(w, req.ID, string(code), "") + case err := <-errorChan: + writeRPCResponse(w, req.ID, nil, err.Error()) + } + case "eth_call": + resultChan := make(chan []byte) + errorChan := make(chan error) + + go func() { + tx := req.Params[0].(TransactionRequest) + block := req.Params[1].(common.BlockTag) + result, err := rpc.Call(tx, block) + if err != nil { + errorChan <- err + return + } + resultChan <- result + }() + + select { + case result := <-resultChan: + writeRPCResponse(w, req.ID, string(result), "") + case err := <-errorChan: + writeRPCResponse(w, req.ID, nil, err.Error()) + } + case "eth_estimateGas": + resultChan := make(chan uint64) + errorChan := make(chan error) + + go func() { + tx := req.Params[0].(TransactionRequest) + gas, err := rpc.EstimateGas(&tx) + if err != nil { + errorChan <- err + return + } + resultChan <- gas + }() + + select { + case gas := <-resultChan: + writeRPCResponse(w, req.ID, fmt.Sprintf("%d", gas), "") + case err := <-errorChan: + writeRPCResponse(w, req.ID, nil, err.Error()) + } + case "eth_chainId": + resultChan := make(chan uint64) + errorChan := make(chan error) + + go func() { + id, err := rpc.ChainId() + if err != nil { + errorChan <- err + return + } + resultChan <- id + }() + + select { + case id := <-resultChan: + writeRPCResponse(w, req.ID, fmt.Sprintf("%d", id), "") + case err := <-errorChan: + writeRPCResponse(w, req.ID, nil, err.Error()) + } + case "eth_gasPrice": + resultChan := make(chan *big.Int) + errorChan := make(chan error) + + go func() { + result, err := rpc.GasPrice() + if err != nil { + errorChan <- err + return + } + resultChan <- result + }() + + select { + case result := <-resultChan: + writeRPCResponse(w, req.ID, result.String(), "") + case err := <-errorChan: + writeRPCResponse(w, req.ID, nil, err.Error()) + } + case "eth_maxPriorityFeePerGas": + result := rpc.MaxPriorityFeePerGas() + writeRPCResponse(w, req.ID, result.String(), "") + case "eth_blockNumber": + resultChan := make(chan uint64) + errorChan := make(chan error) + + go func() { + result, err := rpc.BlockNumber() + if err != nil { + errorChan <- err + return + } + resultChan <- result + }() + + select { + case result := <-resultChan: + writeRPCResponse(w, req.ID, fmt.Sprintf("%d", result), "") + case err := <-errorChan: + writeRPCResponse(w, req.ID, nil, err.Error()) + } + case "eth_getBlockByNumber": + resultChan := make(chan *common.Block) + errorChan := make(chan error) + + go func() { + block := req.Params[0].(common.BlockTag) + fullTx := req.Params[1].(bool) + result, err := rpc.GetBlockByNumber(block, fullTx) + if err != nil { + errorChan <- err + return + } + resultChan <- result + }() + + select { + case result := <-resultChan: + writeRPCResponse(w, req.ID, result, "") + case err := <-errorChan: + writeRPCResponse(w, req.ID, nil, err.Error()) + } + case "eth_getBlockByHash": + resultChan := make(chan *common.Block) + errorChan := make(chan error) + + go func() { + hash := req.Params[0].([32]byte) + fullTx := req.Params[1].(bool) + result, err := rpc.GetBlockByHash(hash, fullTx) + if err != nil { + errorChan <- err + return + } + resultChan <- result + }() + + select { + case result := <-resultChan: + writeRPCResponse(w, req.ID, result, "") + case err := <-errorChan: + writeRPCResponse(w, req.ID, nil, err.Error()) + } + case "eth_sendRawTransaction": + resultChan := make(chan [32]byte) + errorChan := make(chan error) + + go func() { + rawTransaction := req.Params[0].([]uint8) + hash, err := rpc.SendRawTransaction(rawTransaction) + if err != nil { + errorChan <- err + return + } + resultChan <- hash + }() + + select { + case hash := <-resultChan: + writeRPCResponse(w, req.ID, hash, "") + case err := <-errorChan: + writeRPCResponse(w, req.ID, nil, err.Error()) + } + case "eth_getTransactionReceipt": + resultChan := make(chan *types.Receipt) + errorChan := make(chan error) + + go func() { + hash := req.Params[0].([32]byte) + receipt, err := rpc.GetTransactionReceipt(hash) + if err != nil { + errorChan <- err + return + } + resultChan <- receipt + }() + + select { + case receipt := <-resultChan: + writeRPCResponse(w, req.ID, receipt, "") + case err := <-errorChan: + writeRPCResponse(w, req.ID, nil, err.Error()) + } + case "eth_getTransactionByHash": + resultChan := make(chan *types.Transaction) + errorChan := make(chan error) + + go func() { + hash := req.Params[0].([32]byte) + transaction, err := rpc.GetTransactionByHash(hash) + if err != nil { + errorChan <- err + return + } + resultChan <- transaction + }() + + select { + case transaction := <-resultChan: + writeRPCResponse(w, req.ID, transaction, "") + case err := <-errorChan: + writeRPCResponse(w, req.ID, nil, err.Error()) + } + case "eth_getTransactionByBlockHashAndIndex": + resultChan := make(chan *types.Transaction) + errorChan := make(chan error) + + go func() { + blockHash := req.Params[0].([32]byte) + index := req.Params[1].(uint64) + transaction, err := rpc.GetTransactionByBlockHashAndIndex(blockHash, index) + if err != nil { + errorChan <- err + return + } + resultChan <- transaction + }() + + select { + case transaction := <-resultChan: + writeRPCResponse(w, req.ID, transaction, "") + case err := <-errorChan: + writeRPCResponse(w, req.ID, nil, err.Error()) + } + case "eth_getLogs": + resultChan := make(chan []types.Log) + errorChan := make(chan error) + + go func() { + filter := req.Params[0].(ethereum.FilterQuery) + logs, err := rpc.GetLogs(filter) + if err != nil { + errorChan <- err + return + } + resultChan <- logs + }() + + select { + case logs := <-resultChan: + writeRPCResponse(w, req.ID, logs, "") + case err := <-errorChan: + writeRPCResponse(w, req.ID, nil, err.Error()) + } + case "eth_getFilterChanges": + resultChan := make(chan []types.Log) + errorChan := make(chan error) + + go func() { + filterID := req.Params[0].(*big.Int) + logs, err := rpc.GetFilterChanges(filterID) + if err != nil { + errorChan <- err + return + } + resultChan <- logs + }() + + select { + case logs := <-resultChan: + writeRPCResponse(w, req.ID, logs, "") + case err := <-errorChan: + writeRPCResponse(w, req.ID, nil, err.Error()) + } + case "eth_uninstallFilter": + resultChan := make(chan bool) + errorChan := make(chan error) + + go func() { + filterID := req.Params[0].(*big.Int) + result, err := rpc.UninstallFilter(filterID) + if err != nil { + errorChan <- err + return + } + resultChan <- result + }() + + select { + case result := <-resultChan: + writeRPCResponse(w, req.ID, result, "") + case err := <-errorChan: + writeRPCResponse(w, req.ID, nil, err.Error()) + } + case "eth_newFilter": + resultChan := make(chan *big.Int) + errorChan := make(chan error) + + go func() { + filter := req.Params[0].(ethereum.FilterQuery) + filterID, err := rpc.GetNewFilter(filter) + if err != nil { + errorChan <- err + return + } + resultChan <- filterID + }() + + select { + case filterID := <-resultChan: + writeRPCResponse(w, req.ID, filterID, "") + case err := <-errorChan: + writeRPCResponse(w, req.ID, nil, err.Error()) + } + case "eth_newBlockFilter": + resultChan := make(chan *big.Int) + errorChan := make(chan error) + + go func() { + filterID, err := rpc.GetNewBlockFilter() + if err != nil { + errorChan <- err + return + } + resultChan <- filterID + }() + + select { + case filterID := <-resultChan: + writeRPCResponse(w, req.ID, filterID, "") + case err := <-errorChan: + writeRPCResponse(w, req.ID, nil, err.Error()) + } + case "eth_newPendingTransactionFilter": + resultChan := make(chan *big.Int) + errorChan := make(chan error) + + go func() { + filterID, err := rpc.GetNewPendingTransactionFilter() + if err != nil { + errorChan <- err + return + } + resultChan <- filterID + }() + + select { + case filterID := <-resultChan: + writeRPCResponse(w, req.ID, filterID, "") + case err := <-errorChan: + writeRPCResponse(w, req.ID, nil, err.Error()) + } + case "eth_getStorageAt": + resultChan := make(chan *big.Int) + errorChan := make(chan error) + + go func() { + address := req.Params[0].(string) + slot := req.Params[1].([32]byte) + blockTag := req.Params[2].(common.BlockTag) + storage, err := rpc.GetStorageAt(address, slot, blockTag) + if err != nil { + errorChan <- err + return + } + resultChan <- storage + }() + + select { + case storage := <-resultChan: + writeRPCResponse(w, req.ID, storage, "") + case err := <-errorChan: + writeRPCResponse(w, req.ID, nil, err.Error()) + } + case "eth_coinbase": + resultChan := make(chan [20]byte) + errorChan := make(chan error) + + go func() { + coinbaseAddress, err := rpc.Coinbase() + if err != nil { + errorChan <- err + return + } + resultChan <- coinbaseAddress + }() + + select { + case coinbaseAddress := <-resultChan: + writeRPCResponse(w, req.ID, coinbaseAddress, "") + case err := <-errorChan: + writeRPCResponse(w, req.ID, nil, err.Error()) + } + case "eth_syncing": + resultChan := make(chan SyncStatus) + errorChan := make(chan error) + + go func() { + syncStatus, err := rpc.Syncing() + if err != nil { + errorChan <- err + return + } + resultChan <- syncStatus + }() + + select { + case syncStatus := <-resultChan: + writeRPCResponse(w, req.ID, syncStatus, "") + case err := <-errorChan: + writeRPCResponse(w, req.ID, nil, err.Error()) + } + case "net_version": + resultChan := make(chan uint64) + errorChan := make(chan error) + + go func() { + result, err := rpc.Version() + if err != nil { + errorChan <- err + return + } + resultChan <- result + }() + + select { + case version := <-resultChan: + writeRPCResponse(w, req.ID, version, "") + case err := <-errorChan: + writeRPCResponse(w, req.ID, nil, err.Error()) + } + + default: + writeRPCResponse(w, req.ID, nil, "Method not found") + } +} + +// Write a JSON-RPC response +func writeRPCResponse(w http.ResponseWriter, id int, result interface{}, err string) { + resp := RPCResponse{ + Jsonrpc: "2.0", + ID: id, + Result: result, + Error: err, + } + json.NewEncoder(w).Encode(resp) +} \ No newline at end of file diff --git a/config/config.go b/config/config.go index 9cb8052..f8ad0af 100644 --- a/config/config.go +++ b/config/config.go @@ -26,7 +26,7 @@ type Config struct { } // only if we are using CLI -func (c Config) from_file(configPath *string, network *string, cliConfig *CliConfig) Config { +func (c Config) FromFile(configPath *string, network *string, cliConfig *CliConfig) Config { n := Network(*network) baseConfig, err := n.BaseConfig(*network) if err != nil { @@ -118,7 +118,7 @@ func (c Config) from_file(configPath *string, network *string, cliConfig *CliCon } return finalConfig } -func (c Config) to_base_config() BaseConfig { +func (c Config) ToBaseConfig() BaseConfig { return BaseConfig{ RpcBindIp: func() string { if c.RpcBindIp != nil { diff --git a/config/config_test.go b/config/config_test.go index c34095c..481b1fc 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -26,7 +26,7 @@ var ( ) // /////////////////////////// -// /// from_file() tests ///// +// /// FromFile() tests ///// // /////////////////////////// func TestMainnetBaseConfig(t *testing.T) { network := "MAINNET" @@ -38,7 +38,7 @@ func TestMainnetBaseConfig(t *testing.T) { var cliConfig CliConfig var config Config - config = config.from_file(&path, &network, &cliConfig) + config = config.FromFile(&path, &network, &cliConfig) mainnetConfig, _ := Mainnet() @@ -77,7 +77,7 @@ func TestConfigFileCreatedSuccessfully(t *testing.T) { var cliConfig CliConfig var config Config - config = config.from_file(&path, &network, &cliConfig) + config = config.FromFile(&path, &network, &cliConfig) if config.ConsensusRpc != consensusRpc { t.Errorf("Expected ConsensusRpc to be %s, but got %s", consensusRpc, config.ConsensusRpc) @@ -109,7 +109,7 @@ func TestCliConfig(t *testing.T) { } var config Config - config = config.from_file(&path, &network, &cliConfig) + config = config.FromFile(&path, &network, &cliConfig) if config.ExecutionRpc != *cliConfig.ExecutionRpc { t.Errorf("Expected Execution rpc to be %s, but got %s", *cliConfig.ExecutionRpc, config.ExecutionRpc) @@ -142,7 +142,7 @@ func TestIfFieldNotInCliDefaultsToTomlThenBaseConfig(t *testing.T) { RpcBindIp: &rpcBindIp, } var config Config - config = config.from_file(&path, &network, &cliConfig) + config = config.FromFile(&path, &network, &cliConfig) mainnetConfig, _ := Mainnet() // Rpc Port defined in toml file not in cli config @@ -198,7 +198,7 @@ func TestReturnsCorrectBaseConfig(t *testing.T) { StrictCheckpointAge: strictCheckpointAge, } - baseConfig := config.to_base_config() + baseConfig := config.ToBaseConfig() if !reflect.DeepEqual(baseConfig.Chain, config.Chain) { t.Errorf("Expected Chain to be %v, got %v", config.Chain, baseConfig.Chain) @@ -222,7 +222,7 @@ func TestReturnsCorrectDefaultValues(t *testing.T) { StrictCheckpointAge: strictCheckpointAge, } - baseConfig := config.to_base_config() + baseConfig := config.ToBaseConfig() if baseConfig.MaxCheckpointAge != config.MaxCheckpointAge { t.Errorf("Expected Max Checkpoint age to be %v, got %v", config.MaxCheckpointAge, baseConfig.MaxCheckpointAge) }