diff --git a/Dockerfile b/Dockerfile index 7b48184..784deee 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,7 +15,7 @@ RUN GO111MODULE=on GCO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -ldfl FROM alpine ARG USER="vdm" -ARG CONFIG_FILE="./environments/config.toml" +ARG CONFIG_FILE="./environments/docker.toml" ARG EXPOSE_PORT=8545 RUN adduser -Du 5000 $USER adm diff --git a/README.md b/README.md index 7f16dd4..2374859 100644 --- a/README.md +++ b/README.md @@ -10,15 +10,7 @@ Stand up a statediffing service directly on top of a go-ethereum LevelDB instanc This service can serve historical state data over the same rpc interface as [statediffing geth](https://github.com/vulcanize/go-ethereum/releases/tag/v1.9.11-statediff-0.0.5) without needing to run a full node -## Setup - -Build the binary: - -```bash -make build -``` - -### Local Setup +## Configuration * Create a chain config file `chain.json` according to chain config in genesis json file used by local geth. @@ -42,7 +34,7 @@ make build } ``` -* Change the following in [config file](./environments/config.toml) +* Sample database and chain configuration (from [environments/config.toml](./environments/config.toml)): ```toml [leveldb] @@ -53,7 +45,7 @@ make build [ethereum] chainConfig = "./chain.json" # Path to custom chain config file - chainID = 41337 # Same chain ID as in chain.json + chainID = 41337 # Same chain ID as in chain.json [database] # Update database config @@ -65,22 +57,42 @@ make build type = "postgres" ``` -* To write statediff for a range of block make changes in [config file](./environments/config.toml) +* Service and metrics configuration: + ```toml - [prerun] - only = false - ranges = [ - [8, 15] # Block number range for which to write statediff. - ] + [statediff] + serviceWorkers = 1 # Number of diffs to process concurrently + workerQueueSize = 1024 # Size of buffer for block range requests + trieWorkers = 4 # Number of state subtries to process concurrently + + [cache] + database = 1024 # Trie node cache size in MB + trie = 1024 # LevelDB cache size in MiB + + [prom] + dbStats = false + metrics = true + http = true + httpAddr = "localhost" + httpPort = "8889" ``` -* To use remote LevelDB RPC endpoint change the following in [config file](./environments/config.toml) +* To use a remote LevelDB RPC endpoint change the following in [config file](./environments/config.toml) ```toml [leveldb] mode = "remote" url = "http://127.0.0.1:8082/" # Remote LevelDB RPC url ``` +* When using the `run` command to write diffs for specific block ranges, add this: + ```toml + [run] + only = false + ranges = [ + [8, 15] # Block number range for which to write statediff. + ] + ``` + ## Usage ### `serve` @@ -96,88 +108,18 @@ Example: ``` Available RPC methods are: - * `statediff_stateTrieAt()` - * `statediff_streamCodeAndCodeHash()` * `statediff_stateDiffAt()` * `statediff_writeStateDiffAt()` * `statediff_writeStateDiffsInRange()` -e.g. `curl -X POST -H 'Content-Type: application/json' --data '{"jsonrpc":"2.0","method":"statediff_writeStateDiffsInRange","params":['"$BEGIN"', '"$END"', {"intermediateStateNodes":true,"intermediateStorageNodes":true,"includeBlock":true,"includeReceipts":true,"includeTD":true,"includeCode":true}],"id":1}' "$HOST":"$PORT"` +e.g. `curl -X POST -H 'Content-Type: application/json' --data '{"jsonrpc":"2.0","method":"statediff_writeStateDiffsInRange","params":['"$BEGIN"', '"$END"', {"includeBlock":true,"includeReceipts":true,"includeTD":true,"includeCode":true}],"id":1}' "$HOST":"$PORT"` -The process can be configured locally with sets of ranges to process as a "prerun" to processing directed by the server endpoints. -This is done by turning "prerun" on in the config (`statediff.prerun = true`) and defining ranged and params in the -`prerun` section of the config as shown below. +### `run` -## Configuration +Produces diffs for specific block ranges. -An example config file: +Example: -```toml -[leveldb] - mode = "local" - # path and ancient LevelDB paths required in local mode - path = "/Users/user/Library/Ethereum/geth/chaindata" - ancient = "/Users/user/Library/Ethereum/geth/chaindata/ancient" - # url for leveldb-ethdb-rpc endpoint required in remote mode - url = "http://127.0.0.1:8082/" - -[server] - ipcPath = ".ipc" - httpPath = "127.0.0.1:8545" - -[statediff] - prerun = true - serviceWorkers = 1 - workerQueueSize = 1024 - trieWorkers = 4 - -[prerun] - only = false - ranges = [ - [0, 1000] - ] - [prerun.params] - intermediateStateNodes = true - intermediateStorageNodes = true - includeBlock = true - includeReceipts = true - includeTD = true - includeCode = true - watchedAddresses = [] - -[log] - file = "" - level = "info" - -[eth] - chainID = 1 - -[database] - name = "vulcanize_test" - hostname = "localhost" - port = 5432 - user = "vulcanize" - password = "..." - type = "postgres" - driver = "sqlx" - dumpDestination = "" - filePath = "" - -[cache] - database = 1024 - trie = 1024 - -[prom] - dbStats = false - metrics = true - http = true - httpAddr = "localhost" - httpPort = "8889" - -[ethereum] - nodeID = "" - clientName = "eth-statediff-service" - genesisBlock = "0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3" - networkID = 1 - chainID = 1 +```bash +./eth-statediff-service run --config environments/config.toml --run.ranges '[8,15]' ``` diff --git a/environments/config.toml b/environments/config.toml deleted file mode 100644 index 42dce74..0000000 --- a/environments/config.toml +++ /dev/null @@ -1,61 +0,0 @@ -[leveldb] - mode = "local" - path = "/app/geth-rw/chaindata" - ancient = "/app/geth-rw/chaindata/ancient" - url = "http://127.0.0.1:8082/" - -[server] - ipcPath = "" - httpPath = "0.0.0.0:8545" - -[statediff] - prerun = true - serviceWorkers = 1 - workerQueueSize = 1024 - trieWorkers = 16 - -[prerun] - only = true - ranges = [] - [prerun.params] - intermediateStateNodes = true - intermediateStorageNodes = true - includeBlock = true - includeReceipts = true - includeTD = true - includeCode = true - watchedAddresses = [] - -[log] - file = "" - level = "info" - -[database] - name = "" - hostname = "" - port = 5432 - user = "" - password = "" - type = "postgres" - driver = "sqlx" - dumpDestination = "" - filePath = "" - -[cache] - database = 1024 - trie = 4096 - -[prom] - dbStats = false - metrics = true - http = true - httpAddr = "0.0.0.0" - httpPort = 9100 - -[ethereum] - chainConfig = "" - nodeID = "" - clientName = "eth-statediff-service" - genesisBlock = "0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3" - networkID = 1 - chainID = 1 diff --git a/environments/example.toml b/environments/example.toml index a0e85e5..0dc8c60 100644 --- a/environments/example.toml +++ b/environments/example.toml @@ -1,7 +1,7 @@ [leveldb] mode = "local" - path = "/Users/user/Library/Ethereum/geth/chaindata" - ancient = "/Users/user/Library/Ethereum/geth/chaindata/ancient" + path = "/home/user/.ethereum/geth/chaindata" + ancient = "/home/user/.ethereum/geth/chaindata/ancient" url = "http://127.0.0.1:8082/" [server] @@ -9,19 +9,15 @@ httpPath = "127.0.0.1:8545" [statediff] - prerun = true serviceWorkers = 1 workerQueueSize = 1024 trieWorkers = 4 -[prerun] - only = false +[run] ranges = [ [0, 1000] ] - [prerun.params] - intermediateStateNodes = true - intermediateStorageNodes = true + [run.params] includeBlock = true includeReceipts = true includeTD = true @@ -33,15 +29,15 @@ level = "info" [database] - name = "vulcanize_test" - hostname = "localhost" - port = 5432 - user = "vulcanize" - password = "..." - type = "postgres" - driver = "sqlx" + name = "cerc_testing" + hostname = "localhost" + port = 5432 + user = "vdbm" + password = "password" + type = "postgres" + driver = "sqlx" dumpDestination = "" - filePath = "" + filePath = "" [cache] database = 1024