erigon-pulse/cmd/rpcdaemon/cli/httpcfg/http_cfg.go

67 lines
2.1 KiB
Go
Raw Normal View History

package httpcfg
import (
"time"
2022-11-20 03:41:30 +00:00
"github.com/ledgerwatch/erigon-lib/common/datadir"
"github.com/ledgerwatch/erigon-lib/kv/kvcache"
"github.com/ledgerwatch/erigon/eth/ethconfig"
"github.com/ledgerwatch/erigon/rpc/rpccfg"
)
type HttpCfg struct {
Enabled bool
PrivateApiAddr string
WithDatadir bool // Erigon's database can be read by separated processes on same machine - in read-only mode - with full support of transactions. It will share same "OS PageCache" with Erigon process.
DataDir string
Dirs datadir.Dirs
HttpListenAddress string
AuthRpcHTTPListenAddress string
TLSCertfile string
TLSCACert string
TLSKeyFile string
HttpPort int
AuthRpcPort int
HttpCORSDomain []string
HttpVirtualHost []string
AuthRpcVirtualHost []string
HttpCompression bool
API []string
Gascap uint64
MaxTraces uint64
WebsocketEnabled bool
WebsocketCompression bool
RpcAllowListFilePath string
RpcBatchConcurrency uint
RpcStreamingDisable bool
DBReadConcurrency int
TraceCompatibility bool // Bug for bug compatibility for trace_ routines with OpenEthereum
TxPoolApiAddr string
StateCache kvcache.CoherentConfig
Snap ethconfig.Snapshot
Sync ethconfig.Sync
allow rpcdaemon to bind to tcp (#6184) this pr adds CLI flag to allow the rpcdaemon to bind to a TCP port. this is very useful if one wants to maintain a remote connection with the rpcdaemon without using websocket. This is useful because a lot of issues come with the websocket protocol (compression, max size, etc). TCP socket gets around these things (it is just raw json over tcp stream) the rpc package already supports this, it was just a matter of adding the bind. try `echo '{"jsonrpc":"2.0","method":"eth_blockNumber","id":"1","params":[""]}' | nc localhost 8548` as a basic test to test. Subscriptions are also working (idk how to send keepalives with netcat) the default rpc.(*Client).Dial method does not support TCP. I have not included that in this PR. The code for such is as follow ``` // DialTCP create a new TCP client that connects to the given endpoint. // // The context is used for the initial connection establishment. It does not // affect subsequent interactions with the client. func DialTCP(ctx context.Context, endpoint string) (*Client, error) { parsed, err := url.Parse(endpoint) if err != nil { return nil, err } ans := make(chan *Client) errc := make(chan error) go func() { client, err := newClient(ctx, func(ctx context.Context) (ServerCodec, error) { conn, err := net.Dial("tcp", parsed.Host) if err != nil { return nil, err } return NewCodec(conn), nil }) if err != nil { errc <- err return } ans <- client }() select { case err := <-errc: return nil, err case a := <-ans: return a, nil case <-ctx.Done(): return nil, ctx.Err() } } // DialContext creates a new RPC client, just like Dial. // // The context is used to cancel or time out the initial connection establishment. It does // not affect subsequent interactions with the client. func DialContext(ctx context.Context, rawurl string) (*Client, error) { u, err := url.Parse(rawurl) if err != nil { return nil, err } switch u.Scheme { case "http", "https": return DialHTTP(rawurl) case "ws", "wss": return DialWebsocket(ctx, rawurl, "") case "tcp": return DialTCP(ctx, rawurl) case "stdio": return DialStdIO(ctx) case "": return DialIPC(ctx, rawurl) default: return nil, fmt.Errorf("no known transport for URL scheme %q", u.Scheme) } } ``` let me know if you would like me to add this to the PR as well. the TCP connection can then be established with `rpc.Dial("tcp://host:port")`
2022-12-03 07:22:47 +00:00
// GRPC server
GRPCServerEnabled bool
GRPCListenAddress string
GRPCPort int
GRPCHealthCheckEnabled bool
// Raw TCP Server
TCPServerEnabled bool
TCPListenAddress string
TCPPort int
JWTSecretPath string // Engine API Authentication
TraceRequests bool // Always trace requests in INFO level
HTTPTimeouts rpccfg.HTTPTimeouts
AuthRpcTimeouts rpccfg.HTTPTimeouts
EvmCallTimeout time.Duration
InternalCL bool
LogDirVerbosity string
LogDirPath string
BatchLimit int // Maximum number of requests in a batch
ReturnDataLimit int // Maximum number of bytes returned from calls (like eth_call)
}