From 76f50ca541fb1bb5ef075e350dcf1c2db2410a58 Mon Sep 17 00:00:00 2001 From: Matthieu Vachon Date: Fri, 27 Oct 2023 16:58:27 -0400 Subject: [PATCH] More work towards having working firehose-core --- .gitignore | 1 + CHANGELOG.md | 100 +++++++- cmd/fireeth/main.go | 89 ++++--- cmd/fireeth/main_test.go | 37 +++ cmd/fireeth/reader_node_bootstraper.go | 245 +++++++++++++++++++ cmd/fireeth/tools_transform_flags.go | 153 ++++++++++++ codec/console_reader.go | 13 +- codec/console_reader_test.go | 9 +- codec/init_test.go | 8 +- devel/.gitignore | 1 + devel/firehose-mainnet/firehose-mainnet.yaml | 4 + devel/firehose-mainnet/start.sh | 14 -- devel/standard/miner/bootstrap.tar.gz | Bin 0 -> 81214 bytes devel/standard/miner/bootstrap.tar.zst | Bin 52250 -> 0 bytes devel/standard/miner/config.toml | 15 ++ devel/standard/reader/config.toml | 4 + devel/standard/reader/static-nodes.json | 3 - devel/standard/standard.yaml | 28 ++- devel/standard/start.sh | 29 ++- tools/download-blocks-from-firehose.go | 92 ------- tools/firehose-prometheus-exporter.go | 14 -- types/block.go | 51 ---- types/decoder.go | 47 ---- types/init.go | 38 ++- types/logging.go | 21 -- types/pb/sf/ethereum/type/v2/type.go | 12 +- types/testing/types.go | 4 - 27 files changed, 682 insertions(+), 350 deletions(-) create mode 100644 cmd/fireeth/main_test.go create mode 100644 cmd/fireeth/reader_node_bootstraper.go create mode 100644 cmd/fireeth/tools_transform_flags.go create mode 100644 devel/standard/miner/bootstrap.tar.gz delete mode 100644 devel/standard/miner/bootstrap.tar.zst create mode 100644 devel/standard/miner/config.toml create mode 100644 devel/standard/reader/config.toml delete mode 100644 devel/standard/reader/static-nodes.json delete mode 100644 tools/download-blocks-from-firehose.go delete mode 100644 tools/firehose-prometheus-exporter.go delete mode 100644 types/block.go delete mode 100644 types/decoder.go delete mode 100644 types/logging.go diff --git a/.gitignore b/.gitignore index c82988c6..6473b7e1 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ .release_notes.md *.spkg /sf-data +/firehose-data /sf.yaml /fireeth /dist diff --git a/CHANGELOG.md b/CHANGELOG.md index ac9208f7..414488d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,15 +10,24 @@ for instructions to keep up to date. This releases refactor `firehose-ethereum` repository to use the common shared Firehose Core library (https://github.com/streamingfast/firehose-core) that every single Firehose supported chain should use and follow. -At the data level and gRPC level, there is no changes in behavior to all core components which are `reader-node`, `merger`, `relayer`, `firehose`, `substreams-tier1` and `substreams-tier2`. +Both at the data level and gRPC level, there is no changes in behavior to all core components which are `reader-node`, `merger`, `relayer`, `firehose`, `substreams-tier1` and `substreams-tier2`. A lot of changes happened at the operators level however and some superflous mode have been removed, especially around the `reader-node` application. The full changes is listed below, operators should review thoroughly the changelog. -> **Important** It's important to emphasis that at the data level, nothing changed, so reverting to 1.4.12 in case of a problem is quite easy and no special data migration is required. +> [!IMPORTANT] +> It's important to emphasis that at the data level, nothing changed, so reverting to 1.4.19 in case of a problem is quite easy and no special data migration is required outside of changing back to the old set of flags that was used before. #### Operators -You will find below the detailed upgrade procedure for the configuration file providers usually use. If you are using the flags based approach, simply update the corresponding flags. +You will find below the detailed upgrade procedure for the configuration file operators usually use. If you are using the flags based approach, simply update the corresponding flags. + +#### Common Changes + +* The `{sf-data-dir}` templating argument used in various flags to resolve to the `--data-dir=` value has been deprecated and should now be simply `{data-dir}`. The older replacement is still going to work but you should replace any occurrences of `{sf-data-dir}` in your flag definition by `{data-dir}`. + +* The default value for `common-blocks-cache-dir` changed from `{sf-data-dir}/blocks-cache` to `file://{data-dir}/storage/blocks-cache`. If you didn't had this flag defined and you had `common-blocks-cache-enabled: true`, you should define `common-blocks-cache-dir: file://{data-dir}/blocks-cache`. + +* The default value for `common-live-blocks-addr` changed from `:15011` to `:10014`. If you didn't had this flag defined and wish to keep the old default, define `common-live-blocks-addr: 15011` and ensure you also modify `relayer-grpc-listen-addr: :15011` (see next entry for details). #### App `reader-node` changes @@ -37,7 +46,20 @@ Before this release, the `reader-node` app was managing for you a portion of the - `--http.vhosts=* ` - `--firehose-enabled` -We have now removed those magical additions and operators are now responsible of providing the flags they required to properly run a Firehose-enabled native `geth` node. The `+` sign that was used to append/override the flags has been removed also since no default additions is performed, the `+` was now useless. We also removed the following `fireeth` configuration value: +We have now removed those magical additions and operators are now responsible of providing the flags they required to properly run a Firehose-enabled native `geth` node. The `+` sign that was used to append/override the flags has been removed also since no default additions is performed, the `+` was now useless. To make some flag easier to define and avoid repetition, a few templating variable can be used within the `reader-node-arguments` value: + +- `{data-dir}` The current data-dir path defined by the config value `data-dir` +- `{node-data-dir}` The node data dir path defined by the flag `reader-node-data-dir` +- `{hostname}` The machine's hostname +- `{start-block-num}` The resolved start block number defined by the flag `reader-node-start-block-num` (can be overwritten) +- `{stop-block-num}` The stop block number defined by the flag `reader-node-stop-block-num` + +As an example, if you provide the config value `reader-node-data-dir=/var/geth` for example, then you could use `reader-node-arguments: --datadir={node-data-dir}` and that would resolve to `reader-node-arguments: --datadir=/var/geth` for you. + +> [!NOTE] +> The `reader-node-arguments` is a string that is parsed using Shell word splitting rules which means for example that double quotes are supported like `--datadir="/var/with space/path"` and the argument will be correctly accepted. We use https://github.com/kballard/go-shellquote as your parsing library. + +We also removed the following `reader-node` configuration value: - `reader-node-type` (No replacement needed, just remove it) - `reader-node-ipc-path` (If you were using that, define it manually using `geth` flag `--ipcpath=...`) @@ -45,6 +67,55 @@ We have now removed those magical additions and operators are now responsible of Default listening addresses changed also to be the same on all `firehose-<...>` project, meaning consistent ports across all chains for operators. The `reader-node-grpc-listen-addr` default listen address went from `:13010` to `:10010` and `reader-node-manager-api-addr` from `:13009` to `:10011`. If you have no occurrences of `13010` or `13009` in your config file or your scripts, there is nothing to do. Otherwise, feel free to adjust the default port to fit your needs, if you do change `reader-node-grpc-listen-addr`, ensure `--relayer-source` is also updated as by default it points to `:10010`. +Here an example of the required changes. + +Change: + +```yaml +start: + args: + - ... + - reader-node + - ... + flags: + ... + reader-node-bootstrap-data-url: ./reader/genesis.json + reader-node-enforce-peers: localhost:13041 + reader-node-arguments: +--firehose-genesis-file=./reader/genesis.json --authrpc.port=8552 + reader-node-log-to-zap: false + ... +``` + +To: + +```yaml +start: + args: + - ... + - reader-node + - ... + flags: + ... + reader-node-bootstrap-data-url: ./reader/genesis.json + reader-node-arguments: + --networkid=1515 + --datadir={node-data-dir} + --ipcpath={data-dir}/reader/ipc + --port=30305 + --http + --http.api=eth,net,web3 + --http.port=8547 + --http.addr=0.0.0.0 + --http.vhosts=* + --firehose-enabled + --firehose-genesis-file=./reader/genesis.json + --authrpc.port=8552 + ... +``` + +> [!NOTE] +> Adjust the `--networkid=1515` value to fit your targeted chain, see https://chainlist.org/ for a list of Ethereum chain and their `network-id` value. + #### App `node` removed In previous version of `firehose-ethereum`, it was possible to use the `node` app to launch managed "peering/backup/whatever" Ethereum node, this is not possible anymore. If you were using the `node` app previously, like in this config: @@ -68,7 +139,9 @@ We have completely drop support to concentrate on the core mission of Firehose w #### Rename of `combined-index-builder` to `index-builder` -The app has been renamed to simply `index-builder` and the flags has been completely renamed removing the prefix `combined-` in front of them. So change: +The app has been renamed to simply `index-builder` and the flags has been completely renamed removing the prefix `combined-` in front of them. + +Change: ```yaml start: @@ -85,7 +158,7 @@ start: ... ``` -To +To: ```yaml start: @@ -102,7 +175,8 @@ start: ... ``` -> **Note** Rename only configuration item you had previously defined, do not copy paste verbatim example aboe +> [!NOTE] +> Rename only configuration item you had previously defined, do not copy paste verbatim example above. * Removed support for `archive-node` app, if you were using this, please use a standard NEAR Archive node to do the same job. @@ -110,19 +184,18 @@ start: * String variable `{sf-data-dir}` which interpolates at runtime to Firehose data directory is now `{data-dir}`. If any of your parameter value has `{sf-data-dir}` in its value, change it to `{data-dir}`. - > **Note** This is an important change, forgetting to change it will change expected locations of data leading to errors or wrong data. + > [!NOTE] + > This is an important change, forgetting to change it will change expected locations of data leading to errors or wrong data. * The default value for `config-file` changed from `sf.yaml` to `firehose.yaml`. If you didn't had this flag defined and wish to keep the old default, define `config-file: sf.yaml`. * The default value for `data-dir` changed from `sf-data` to `firehose-data`. If you didn't had this flag defined before, you should either move `sf-data` to `firehose-data` or define `data-dir: sf-data`. - > **Note** This is an important change, forgetting to change it will change expected locations of data leading to errors or wrong data. + > [!NOTE] + > This is an important change, forgetting to change it will change expected locations of data leading to errors or wrong data. * The flag `verbose` has been renamed to `log-verbosity`. -* The default value for `common-blocks-cache-dir` changed from `{sf-data-dir}/blocks-cache` to `file://{data-dir}/storage/blocks-cache`. If you didn't had this flag defined and you had `common-blocks-cache-enabled: true`, you should define `common-blocks-cache-dir: {data-dir}/blocks-cache`. - -* The default value for `common-live-blocks-addr` changed from `:15011` to `:10014`. If you didn't had this flag defined and wish to keep the old default, define `common-live-blocks-addr: 15011` and ensure you also modify `relayer-grpc-listen-addr: :15011` (see next entry for details). * The default value for `relayer-grpc-listen-addr` changed from `:15011` to `:10014`. If you didn't had this flag defined and wish to keep the old default, define `relayer-grpc-listen-addr: 15011` and ensure you also modify `common-live-blocks-addr: :15011` (see previous entry for details). @@ -134,7 +207,8 @@ start: * The `reader-node-arguments` is not populated anymore with default `--home={node-data-dir} run` which means you must now specify those manually. The variables `{data-dir}`, `{node-data-dir}` and `{hostname}` are interpolated respectively to Firehose absolute `data-dir` value, to Firehose absolute `reader-node-data-dir` value and to current hostname. To upgrade, if you had no `reader-node-arguments` defined, you must now define `reader-node-arguments: --home="{node-data-dir}" run`, if you had a `+` in your `reader-node-arguments: +--some-flag`, you must now define it like `reader-node-arguments: --home="{node-data-dir}" --some-flag run`. - > **Note** This is an important change, forgetting to change it will change expected locations of data leading to errors or wrong data. + > [!NOTE] + > This is an important change, forgetting to change it will change expected locations of data leading to errors or wrong data. * The `reader-node-boot-nodes` flag has been removed entirely, if you have boot nodes to specify, specify them in `reader-node-arguments` using `--boot-nodes=...` instead. diff --git a/cmd/fireeth/main.go b/cmd/fireeth/main.go index 935a9c07..468e8112 100644 --- a/cmd/fireeth/main.go +++ b/cmd/fireeth/main.go @@ -1,13 +1,17 @@ package main import ( + // Forced imported to convey they fact that this is a required import (for its side-effect!) + _ "github.com/streamingfast/firehose-ethereum/types" + "github.com/spf13/cobra" + "github.com/spf13/pflag" firecore "github.com/streamingfast/firehose-core" "github.com/streamingfast/firehose-ethereum/codec" "github.com/streamingfast/firehose-ethereum/transform" + "github.com/streamingfast/firehose-ethereum/types" pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" "github.com/streamingfast/logging" - "github.com/streamingfast/node-manager/mindreader" pbbstream "github.com/streamingfast/pbgo/sf/bstream/v1" "go.uber.org/zap" "google.golang.org/protobuf/reflect/protoreflect" @@ -18,57 +22,64 @@ func init() { } func main() { - firecore.Main(&firecore.Chain[*pbeth.Block]{ - ShortName: "eth", - LongName: "Ethereum", - ExecutableName: "geth", - FullyQualifiedModule: "github.com/streamingfast/firehose-ethereum", - Version: version, + firecore.Main(Chain) +} - Protocol: "ETH", - ProtocolVersion: 1, +var Chain = &firecore.Chain[*pbeth.Block]{ + ShortName: "eth", + LongName: "Ethereum", + ExecutableName: "geth", + FullyQualifiedModule: "github.com/streamingfast/firehose-ethereum", + Version: version, - BlockFactory: func() firecore.Block { return new(pbeth.Block) }, + // Ensure that if you ever modify test, modify also `types/init.go#init` so that the `bstream.InitGeneric` there fits us + Protocol: "ETH", + ProtocolVersion: 1, - BlockIndexerFactories: map[string]firecore.BlockIndexerFactory[*pbeth.Block]{ - transform.CombinedIndexerShortName: transform.NewEthCombinedIndexer, - }, + BlockFactory: func() firecore.Block { return new(pbeth.Block) }, + BlockAcceptedVersions: types.BlockAcceptedVersions, - BlockTransformerFactories: map[protoreflect.FullName]firecore.BlockTransformerFactory{ - transform.HeaderOnlyMessageName: transform.NewHeaderOnlyTransformFactory, - transform.CombinedFilterMessageName: transform.NewCombinedFilterTransformFactory, + BlockIndexerFactories: map[string]firecore.BlockIndexerFactory[*pbeth.Block]{ + transform.CombinedIndexerShortName: transform.NewEthCombinedIndexer, + }, - // Still needed? - transform.MultiCallToFilterMessageName: transform.NewMultiCallToFilterTransformFactory, - transform.MultiLogFilterMessageName: transform.NewMultiLogFilterTransformFactory, - }, + BlockTransformerFactories: map[protoreflect.FullName]firecore.BlockTransformerFactory{ + transform.HeaderOnlyMessageName: transform.NewHeaderOnlyTransformFactory, + transform.CombinedFilterMessageName: transform.NewCombinedFilterTransformFactory, - ConsoleReaderFactory: func(lines chan string, blockEncoder firecore.BlockEncoder, logger *zap.Logger, tracer logging.Tracer) (mindreader.ConsolerReader, error) { - // FIXME: This was hardcoded also in the previouse firehose-near version, Firehose will break if this is not available - // blockEncoder - return codec.NewConsoleReader(logger, lines) - }, + transform.MultiCallToFilterMessageName: transform.NewMultiCallToFilterTransformFactory, + transform.MultiLogFilterMessageName: transform.NewMultiLogFilterTransformFactory, + }, - // ReaderNodeBootstrapperFactory: newReaderNodeBootstrapper, + ConsoleReaderFactory: codec.NewConsoleReader, - Tools: &firecore.ToolsConfig[*pbeth.Block]{ - BlockPrinter: printBlock, + RegisterExtraStartFlags: func(flags *pflag.FlagSet) { + flags.String("reader-node-bootstrap-data-url", "", "URL (file or gs) to either a genesis.json file or a .tar.zst archive to decompress in the datadir. Only used when bootstrapping (no prior data)") + }, - RegisterExtraCmd: func(chain *firecore.Chain[*pbeth.Block], toolsCmd *cobra.Command, zlog *zap.Logger, tracer logging.Tracer) error { - // toolsCmd.AddCommand(newToolsGenerateNodeKeyCmd(chain)) - // toolsCmd.AddCommand(newToolsBackfillCmd(zlog)) + ReaderNodeBootstrapperFactory: newReaderNodeBootstrapper, - return nil - }, + Tools: &firecore.ToolsConfig[*pbeth.Block]{ + BlockPrinter: printBlock, + + RegisterExtraCmd: func(chain *firecore.Chain[*pbeth.Block], toolsCmd *cobra.Command, zlog *zap.Logger, tracer logging.Tracer) error { + // toolsCmd.AddCommand(newToolsGenerateNodeKeyCmd(chain)) + // toolsCmd.AddCommand(newToolsBackfillCmd(zlog)) - TransformFlags: map[string]*firecore.TransformFlag{ - // "receipt-account-filters": { - // Description: "Comma-separated accounts to use as filter/index. If it contains a colon (:), it will be interpreted as : (each of which can be empty, ex: 'hello:' or ':world')", - // Parser: parseReceiptAccountFilters, - // }, + return nil + }, + + TransformFlags: &firecore.TransformFlags{ + Register: func(flags *pflag.FlagSet) { + flags.Bool("header-only", false, "Apply the HeaderOnly transform sending back Block's header only (with few top-level fields), exclusive option") + flags.String("call-filters", "", "call filters (format: '[address1[+address2[+...]]]:[eventsig1[+eventsig2[+...]]]") + flags.String("log-filters", "", "log filters (format: '[address1[+address2[+...]]]:[eventsig1[+eventsig2[+...]]]") + flags.Bool("send-all-block-headers", false, "ask for all the blocks to be sent (header-only if there is no match)") }, + + Parse: parseTransformFlags, }, - }) + }, } // Version value, injected via go build `ldflags` at build time, **must** not be removed or inlined diff --git a/cmd/fireeth/main_test.go b/cmd/fireeth/main_test.go new file mode 100644 index 00000000..4fecc806 --- /dev/null +++ b/cmd/fireeth/main_test.go @@ -0,0 +1,37 @@ +package main + +import ( + "bytes" + "testing" + + "github.com/streamingfast/bstream" + pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" + "github.com/test-go/testify/require" +) + +func Test_Encode_Decode_Block(t *testing.T) { + Chain.Validate() + Chain.Init() + + original, err := Chain.BlockEncoder.Encode(&pbeth.Block{ + Number: 1, + Header: &pbeth.BlockHeader{}, + }) + require.NoError(t, err) + + require.Equal(t, uint64(1), original.ToProtocol().(*pbeth.Block).Number) + + buffer := bytes.NewBuffer(nil) + writer, err := bstream.GetBlockWriterFactory.New(buffer) + require.NoError(t, err) + + require.NoError(t, writer.Write(original)) + + reader, err := bstream.GetBlockReaderFactory.New(buffer) + require.NoError(t, err) + + hydrated, err := reader.Read() + require.NoError(t, err) + + require.Equal(t, uint64(1), hydrated.ToProtocol().(*pbeth.Block).Number) +} diff --git a/cmd/fireeth/reader_node_bootstraper.go b/cmd/fireeth/reader_node_bootstraper.go new file mode 100644 index 00000000..52017e2a --- /dev/null +++ b/cmd/fireeth/reader_node_bootstraper.go @@ -0,0 +1,245 @@ +package main + +import ( + "archive/tar" + "context" + "fmt" + "io" + "os" + "os/exec" + "path/filepath" + "strings" + "time" + + "github.com/spf13/cobra" + "github.com/streamingfast/cli" + "github.com/streamingfast/cli/sflags" + "github.com/streamingfast/dstore" + firecore "github.com/streamingfast/firehose-core" + "github.com/streamingfast/node-manager/operator" + "go.uber.org/zap" +) + +func newReaderNodeBootstrapper(ctx context.Context, logger *zap.Logger, cmd *cobra.Command, resolvedNodeArguments []string, resolver firecore.ReaderNodeArgumentResolver) (operator.Bootstrapper, error) { + nodePath := sflags.MustGetString(cmd, "reader-node-path") + bootstrapDataURL := sflags.MustGetString(cmd, "reader-node-bootstrap-data-url") + nodeDataDir := resolver("{node-data-dir}") + + switch { + case strings.HasSuffix(bootstrapDataURL, "tar.zst") || strings.HasSuffix(bootstrapDataURL, "tar.zstd"): + // There could be a mistmatch here if the user override `--datadir` manually, we live it for now + return NewTarballBootstrapper(bootstrapDataURL, nodeDataDir, logger), nil + + case strings.HasSuffix(bootstrapDataURL, "json"): + var args []string + if dataDirArgument := findDataDirArgument(resolvedNodeArguments); dataDirArgument != "" { + args = append(args, dataDirArgument) + } + + return NewGenesisBootstrapper(nodeDataDir, bootstrapDataURL, nodePath, append(args, "init"), logger), nil + default: + return nil, fmt.Errorf("'reader-node-bootstrap-data-url' config should point to either an archive ending in '.tar.zstd' or a genesis file ending in '.json', not %s", bootstrapDataURL) + } +} + +func findDataDirArgument(resolvedNodeArguments []string) string { + for i, arg := range resolvedNodeArguments { + if strings.HasPrefix(arg, "--datadir") { + // If the argument is in 2 parts (e.g. [--datadir, ]), we try to re-combine them + if arg == "--datadir" { + if len(resolvedNodeArguments) > i+1 { + return "--datadir=" + resolvedNodeArguments[i+1] + } + + // The arguments are invalid, we'll let the node fail later on + return arg + } + + return arg + } + } + + return "" +} + +// GenesisBootstrapper needs to write genesis file, static node file, then run a command like 'geth init' +type GenesisBootstrapper struct { + dataDir string + genesisFileURL string + cmdArgs []string + nodePath string + // staticNodesFilepath string + logger *zap.Logger +} + +func NewGenesisBootstrapper(dataDir string, genesisFileURL string, nodePath string, cmdArgs []string, logger *zap.Logger) *GenesisBootstrapper { + return &GenesisBootstrapper{ + dataDir: dataDir, + genesisFileURL: genesisFileURL, + nodePath: nodePath, + cmdArgs: cmdArgs, + logger: logger, + } +} + +func downloadDstoreObject(url string, destpath string) error { + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + + reader, _, _, err := dstore.OpenObject(ctx, url) + if err != nil { + return fmt.Errorf("cannot get file from store: %w", err) + } + defer reader.Close() + data, err := io.ReadAll(reader) + if err != nil { + return err + } + + return os.WriteFile(destpath, data, 0644) +} + +func (b *GenesisBootstrapper) Bootstrap() error { + if b.genesisFileURL == "" || isBootstrapped(b.dataDir, b.logger) { + return nil + } + + genesisFilePath := filepath.Join(b.dataDir, "genesis.json") + + b.logger.Info("running bootstrap sequence", zap.String("data_dir", b.dataDir), zap.String("genesis_file_path", genesisFilePath)) + if err := os.MkdirAll(b.dataDir, 0755); err != nil { + return fmt.Errorf("cannot create folder %s to bootstrap node: %w", b.dataDir, err) + } + + if !cli.FileExists(genesisFilePath) { + b.logger.Info("fetching genesis file", zap.String("source_url", b.genesisFileURL)) + if err := downloadDstoreObject(b.genesisFileURL, genesisFilePath); err != nil { + return err + } + } + + cmd := exec.Command(b.nodePath, append(b.cmdArgs, genesisFilePath)...) + b.logger.Info("running node init command (creating genesis block from genesis.json)", zap.Stringer("cmd", cmd)) + if output, err := runCmd(cmd); err != nil { + return fmt.Errorf("failed to init node (output %s): %w", output, err) + } + + return nil +} + +func NewTarballBootstrapper( + url string, + dataDir string, + logger *zap.Logger, +) *TarballBootstrapper { + return &TarballBootstrapper{ + url: url, + dataDir: dataDir, + logger: logger, + } +} + +type TarballBootstrapper struct { + url string + dataDir string + logger *zap.Logger +} + +func isBootstrapped(dataDir string, logger *zap.Logger) bool { + var foundCURRENT bool + err := filepath.Walk(dataDir, + func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if info.IsDir() { + return nil + } + if filepath.Base(path) == "CURRENT" { + foundCURRENT = true + return io.EOF + } + return nil + }) + if err != nil && !os.IsNotExist(err) && err != io.EOF { + logger.Warn("error while checking for bootstrapped status", zap.Error(err)) + } + + return foundCURRENT +} + +func (b *TarballBootstrapper) isBootstrapped() bool { + return isBootstrapped(b.dataDir, b.logger) +} + +func (b *TarballBootstrapper) Bootstrap() error { + if b.isBootstrapped() { + return nil + } + + b.logger.Info("bootstrapping geth chain data from pre-built data", zap.String("bootstrap_data_url", b.url)) + + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute) + defer cancel() + + reader, _, _, err := dstore.OpenObject(ctx, b.url, dstore.Compression("zstd")) + if err != nil { + return fmt.Errorf("cannot get snapshot from gstore: %w", err) + } + defer reader.Close() + + b.createChainData(reader) + return nil +} + +func (b *TarballBootstrapper) createChainData(reader io.Reader) error { + err := os.MkdirAll(b.dataDir, os.ModePerm) + if err != nil { + return fmt.Errorf("unable to create blocks log file: %w", err) + } + + b.logger.Info("extracting bootstrapping data into node data directory", zap.String("data_dir", b.dataDir)) + tr := tar.NewReader(reader) + for { + header, err := tr.Next() + if err != nil { + if err == io.EOF { + return nil + } + + return err + } + + path := filepath.Join(b.dataDir, header.Name) + b.logger.Debug("about to write content of entry", zap.String("name", header.Name), zap.String("path", path), zap.Bool("is_dir", header.FileInfo().IsDir())) + if header.FileInfo().IsDir() { + err = os.MkdirAll(path, os.ModePerm) + if err != nil { + return fmt.Errorf("unable to create directory: %w", err) + } + + continue + } + + file, err := os.Create(path) + if err != nil { + return fmt.Errorf("unable to create file: %w", err) + } + + if _, err := io.Copy(file, tr); err != nil { + file.Close() + return err + } + file.Close() + } +} + +func runCmd(cmd *exec.Cmd) (string, error) { + // This runs (and wait) the command, combines both stdout and stderr in a single stream and return everything + out, err := cmd.CombinedOutput() + if err == nil { + return "", nil + } + + return string(out), err +} diff --git a/cmd/fireeth/tools_transform_flags.go b/cmd/fireeth/tools_transform_flags.go new file mode 100644 index 00000000..91b36886 --- /dev/null +++ b/cmd/fireeth/tools_transform_flags.go @@ -0,0 +1,153 @@ +package main + +import ( + "fmt" + "strings" + + "github.com/spf13/cobra" + "github.com/streamingfast/cli/sflags" + "github.com/streamingfast/eth-go" + pbtransform "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/transform/v1" + "go.uber.org/zap" + "google.golang.org/protobuf/types/known/anypb" +) + +func parseTransformFlags(cmd *cobra.Command, logger *zap.Logger) (transforms []*anypb.Any, err error) { + filters, err := parseFilters(sflags.MustGetString(cmd, "call-filters"), sflags.MustGetString(cmd, "log-filters"), sflags.MustGetBool(cmd, "send-all-block-headers")) + if err != nil { + return nil, err + } + + headerOnly := sflags.MustGetBool(cmd, "header-only") + if filters != nil && headerOnly { + return nil, fmt.Errorf("'header-only' flag is exclusive with 'call-filters', 'log-filters' and 'send-all-block-headers' choose either 'header-only' or a combination of the others") + } + + if headerOnly { + t, err := anypb.New(&pbtransform.HeaderOnly{}) + if err != nil { + return nil, err + } + + return []*anypb.Any{t}, nil + } + + if filters != nil { + t, err := anypb.New(filters) + if err != nil { + return nil, err + } + + return []*anypb.Any{t}, nil + } + + return +} + +func parseFilters(callFilters, logFilters string, sendAllBlockHeaders bool) (*pbtransform.CombinedFilter, error) { + mf := &pbtransform.CombinedFilter{} + + if callFilters == "" && logFilters == "" && !sendAllBlockHeaders { + return nil, nil + } + if callFilters != "" { + for _, filter := range strings.Split(callFilters, ",") { + if filter == "" { + continue + } + parts := strings.Split(filter, ":") + if len(parts) != 2 { + return nil, fmt.Errorf("option --call-filters must be of type address_hash+address_hash+address_hash:event_sig_hash+event_sig_hash (repeated, separated by comma)") + } + var addrs []eth.Address + for _, a := range strings.Split(parts[0], "+") { + if a != "" { + addr := eth.MustNewAddressLoose(a) + addrs = append(addrs, addr) + } + } + var sigs []eth.Hash + for _, s := range strings.Split(parts[1], "+") { + if s != "" { + sig := eth.MustNewHash(s) + sigs = append(sigs, sig) + } + } + + mf.CallFilters = append(mf.CallFilters, basicCallToFilter(addrs, sigs)) + } + } + + if logFilters != "" { + for _, filter := range strings.Split(logFilters, ",") { + if filter == "" { + continue + } + parts := strings.Split(filter, ":") + if len(parts) != 2 { + return nil, fmt.Errorf("option --log-filters must be of type address_hash+address_hash+address_hash:event_sig_hash+event_sig_hash (repeated, separated by comma)") + } + var addrs []eth.Address + for _, a := range strings.Split(parts[0], "+") { + if a != "" { + addr := eth.MustNewAddress(a) + addrs = append(addrs, addr) + } + } + var sigs []eth.Hash + for _, s := range strings.Split(parts[1], "+") { + if s != "" { + sig := eth.MustNewHash(s) + sigs = append(sigs, sig) + } + } + + mf.LogFilters = append(mf.LogFilters, basicLogFilter(addrs, sigs)) + } + } + + if sendAllBlockHeaders { + mf.SendAllBlockHeaders = true + } + return mf, nil +} + +func basicCallToFilter(addrs []eth.Address, sigs []eth.Hash) *pbtransform.CallToFilter { + var addrBytes [][]byte + var sigsBytes [][]byte + + for _, addr := range addrs { + b := addr.Bytes() + addrBytes = append(addrBytes, b) + } + + for _, sig := range sigs { + b := sig.Bytes() + sigsBytes = append(sigsBytes, b) + } + + return &pbtransform.CallToFilter{ + Addresses: addrBytes, + Signatures: sigsBytes, + } +} + +func basicLogFilter(addrs []eth.Address, sigs []eth.Hash) *pbtransform.LogFilter { + var addrBytes [][]byte + var sigsBytes [][]byte + + for _, addr := range addrs { + b := addr.Bytes() + addrBytes = append(addrBytes, b) + } + + for _, sig := range sigs { + b := sig.Bytes() + sigsBytes = append(sigsBytes, b) + } + + return &pbtransform.LogFilter{ + Addresses: addrBytes, + EventSignatures: sigsBytes, + } +} diff --git a/codec/console_reader.go b/codec/console_reader.go index 671fbe9e..8eb420ca 100644 --- a/codec/console_reader.go +++ b/codec/console_reader.go @@ -31,8 +31,10 @@ import ( "github.com/streamingfast/bstream" "github.com/streamingfast/dmetrics" "github.com/streamingfast/eth-go" - "github.com/streamingfast/firehose-ethereum/types" + firecore "github.com/streamingfast/firehose-core" pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" + "github.com/streamingfast/logging" + "github.com/streamingfast/node-manager/mindreader" "go.uber.org/zap" "google.golang.org/protobuf/proto" ) @@ -50,7 +52,7 @@ type ConsoleReader struct { logger *zap.Logger } -func NewConsoleReader(logger *zap.Logger, lines chan string) (*ConsoleReader, error) { +func NewConsoleReader(lines chan string, blockEncoder firecore.BlockEncoder, logger *zap.Logger, tracer logging.Tracer) (mindreader.ConsolerReader, error) { globalStats := newConsoleReaderStats() globalStats.StartPeriodicLogToZap(context.Background(), logger, 30*time.Second) @@ -58,7 +60,7 @@ func NewConsoleReader(logger *zap.Logger, lines chan string) (*ConsoleReader, er lines: lines, close: func() {}, - ctx: &parseCtx{logger: logger, globalStats: globalStats, normalizationFeatures: &normalizationFeatures{}}, + ctx: &parseCtx{logger: logger, globalStats: globalStats, normalizationFeatures: &normalizationFeatures{}, encoder: blockEncoder}, done: make(chan interface{}), stats: globalStats, @@ -177,6 +179,7 @@ type parseCtx struct { transactionTraces []*pbeth.TransactionTrace evmCallStackIndexes []int32 + encoder firecore.BlockEncoder stats *parsingStats globalStats *consoleReaderStats @@ -1134,7 +1137,7 @@ func (ctx *parseCtx) readBlock(line string) (*bstream.Block, error) { libNum = computeProofOfWorkLIBNum(block.Number, bstream.GetProtocolFirstStreamableBlock) } - bstreamBlock, err := types.BlockFromProto(block, libNum) + bstreamBlock, err := ctx.encoder.Encode(firecore.BlockEnveloppe{Block: block, LIBNum: libNum}) if err != nil { return nil, err } @@ -1241,7 +1244,7 @@ func (ctx *parseCtx) readEndBlock(line string) (*bstream.Block, error) { libNum = computeProofOfWorkLIBNum(block.Number, bstream.GetProtocolFirstStreamableBlock) } - bstreamBlock, err := types.BlockFromProto(block, libNum) + bstreamBlock, err := ctx.encoder.Encode(firecore.BlockEnveloppe{Block: block, LIBNum: libNum}) if err != nil { return nil, err } diff --git a/codec/console_reader_test.go b/codec/console_reader_test.go index 18ce8b01..5d289313 100644 --- a/codec/console_reader_test.go +++ b/codec/console_reader_test.go @@ -31,7 +31,7 @@ import ( "testing" "github.com/golang/protobuf/proto" - "github.com/streamingfast/firehose-ethereum/types" + firecore "github.com/streamingfast/firehose-core" pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" "github.com/streamingfast/jsonpb" "github.com/stretchr/testify/assert" @@ -167,13 +167,14 @@ func TestGeneratePBBlocks(t *testing.T) { t.Skip("generate only when firehose-logs.dmlog changes") cr := testFileConsoleReader(t, "testdata/firehose-logs.dmlog") + encoder := firecore.NewBlockEncoder() for { out, err := cr.ReadBlock() if out != nil { block := out.ToProtocol().(*pbeth.Block) - bstreamBlock, err := types.BlockFromProto(block, out.LibNum) + bstreamBlock, err := encoder.Encode(firecore.BlockEnveloppe{Block: block, LIBNum: out.LibNum}) require.NoError(t, err) pbBlock, err := bstreamBlock.ToProto() @@ -222,10 +223,12 @@ func testFileConsoleReader(t *testing.T, filename string) *ConsoleReader { } func testReaderConsoleReader(helperFunc func(), lines chan string, closer func()) *ConsoleReader { + encoder := firecore.NewBlockEncoder() + l := &ConsoleReader{ lines: lines, close: closer, - ctx: &parseCtx{logger: zlog, stats: newParsingStats(zlog, 0), globalStats: newConsoleReaderStats(), normalizationFeatures: &normalizationFeatures{UpgradeBlockV2ToV3: true}}, + ctx: &parseCtx{logger: zlog, stats: newParsingStats(zlog, 0), globalStats: newConsoleReaderStats(), normalizationFeatures: &normalizationFeatures{UpgradeBlockV2ToV3: true}, encoder: encoder}, logger: zlog, } diff --git a/codec/init_test.go b/codec/init_test.go index cda1f14e..5d594e1c 100644 --- a/codec/init_test.go +++ b/codec/init_test.go @@ -1,8 +1,12 @@ package codec -import "github.com/streamingfast/logging" +import ( + // Import for its side-effect (registering necessary bstream + _ "github.com/streamingfast/firehose-ethereum/types" + "github.com/streamingfast/logging" +) -var zlog, _ = logging.PackageLogger("fireeth", "github.com/streamingfast/firehose-ethereum/node-mananager/codec") +var zlog, _ = logging.PackageLogger("fireeth", "github.com/streamingfast/firehose-ethereum/codec") func init() { logging.InstantiateLoggers() diff --git a/devel/.gitignore b/devel/.gitignore index ead192c1..af9c8b2d 100644 --- a/devel/.gitignore +++ b/devel/.gitignore @@ -1,5 +1,6 @@ geth/ sf-data/ cs-data/ +firehose-data/ perso /bsc-local/localdata/ diff --git a/devel/firehose-mainnet/firehose-mainnet.yaml b/devel/firehose-mainnet/firehose-mainnet.yaml index e25325bd..e7200820 100644 --- a/devel/firehose-mainnet/firehose-mainnet.yaml +++ b/devel/firehose-mainnet/firehose-mainnet.yaml @@ -7,6 +7,10 @@ start: # - $FIREETH_COMMON_FORKED_BLOCKS_STORE_URL (defines common-forked-blocks-store-url) # - $FIREETH_COMMON_MERGED_BLOCKS_STORE_URL (defines common-merged-blocks-store-url) # - $FIREETH_SUBSTREAMS_RPC_ENDPOINTS (defines substreams-rpc-endpoint) + # + # Assuming `BLOCK_STORE_URL` is defined, someone can use those config + # - Mainnet: ./devel/firehose-mainnet/start.sh -c -- --common-one-block-store-url="${BLOCK_STORE_URL}/eth-mainnet/v4-oneblock" --common-forked-blocks-store-url="${BLOCK_STORE_URL}/eth-mainnet/v4-forked" --common-merged-blocks-store-url="${BLOCK_STORE_URL}/eth-mainnet/v4" --common-live-blocks-addr="" + # # Comment out 'common-live-blocks-addr' to only use historical which improves the start up speed of 'fireeth' common-live-blocks-addr: localhost:9001 diff --git a/devel/firehose-mainnet/start.sh b/devel/firehose-mainnet/start.sh index 79c6b652..ea15ab90 100755 --- a/devel/firehose-mainnet/start.sh +++ b/devel/firehose-mainnet/start.sh @@ -20,20 +20,6 @@ main() { set -e - if [[ - -z "$FIREETH_COMMON_ONE_BLOCK_STORE_URL" || - -z "$FIREETH_COMMON_FORKED_BLOCKS_STORE_URL" || - -z "$FIREETH_COMMON_MERGED_BLOCKS_STORE_URL" || - -z "$FIREETH_SUBSTREAMS_RPC_ENDPOINTS" - ]]; then - echo 'To use this config, you must define:' - echo '- FIREETH_COMMON_ONE_BLOCK_STORE_URL (defines common-one-block-store-url)' - echo '- FIREETH_COMMON_FORKED_BLOCKS_STORE_URL (defines common-forked-blocks-store-url)' - echo '- FIREETH_COMMON_MERGED_BLOCKS_STORE_URL (defines common-merged-blocks-store-url)' - echo '- FIREETH_SUBSTREAMS_RPC_ENDPOINTS (defines substreams-rpc-endpoint)' - exit 1 - fi - if [[ $clean == "true" ]]; then rm -rf sf-data &> /dev/null || true fi diff --git a/devel/standard/miner/bootstrap.tar.gz b/devel/standard/miner/bootstrap.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..3a3d84e8fbb6e18d9b1b07bebf96376976c6deba GIT binary patch literal 81214 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 m~l9$PcUsHNVIkt9y1-Ko+L>H@&n1>Z!`> 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 bdu++6O|_{u)u!6?zmWb9@VR#`0CofbQvZkt literal 0 HcmV?d00001 diff --git a/devel/standard/miner/bootstrap.tar.zst b/devel/standard/miner/bootstrap.tar.zst deleted file mode 100644 index ecbb910c23356b5963f5e199fb4610dd1a1c528a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52250 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 diff --git a/devel/standard/miner/config.toml b/devel/standard/miner/config.toml new file mode 100644 index 00000000..594ffb79 --- /dev/null +++ b/devel/standard/miner/config.toml @@ -0,0 +1,15 @@ +[Eth] +NetworkId = 1515 +SyncMode = "full" +# Activate archive mode +NoPruning = true + +[Node] +HTTPHost = "" +HTTPPort = 8545 +HTTPModules = ["personal", "net", "web3", "eth"] +AuthPort = 8551 + +[Node.P2P] +ListenAddr = ":30303" +NoDiscovery = true diff --git a/devel/standard/reader/config.toml b/devel/standard/reader/config.toml new file mode 100644 index 00000000..a8645ebb --- /dev/null +++ b/devel/standard/reader/config.toml @@ -0,0 +1,4 @@ +[Node.P2P] +StaticNodes = [ + "enode://e4d5433fd9e84930cd38028f2fdb1ca8d55bdb7b6a749da57e8aa7fc5d3c146c44c0d129a14cecc7b0f13bb98700bf392dd4fd7c31bf2fe26038d4ba8f5a8e32@127.0.0.1:30303", +] diff --git a/devel/standard/reader/static-nodes.json b/devel/standard/reader/static-nodes.json deleted file mode 100644 index 8e3dfab0..00000000 --- a/devel/standard/reader/static-nodes.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "enode://444aadceb03f6dad618842399a1e5908de4bdd7bf3fa64b3dc1ac6dfe5843a99302b86049b2b5c3e16ee3a3279cb09465d98741a8f791b0b0f7a48c309d41dcf@127.0.0.1:13090" -] \ No newline at end of file diff --git a/devel/standard/standard.yaml b/devel/standard/standard.yaml index 77e81252..3a4042e9 100644 --- a/devel/standard/standard.yaml +++ b/devel/standard/standard.yaml @@ -1,23 +1,31 @@ start: args: - - node - reader-node - merger - relayer - - combined-index-builder + - index-builder - firehose - substreams-tier1 - substreams-tier2 flags: - node-role: dev-miner - node-bootstrap-data-url: ./miner/bootstrap.tar.zst - node-log-to-zap: false - reader-node-bootstrap-data-url: ./reader/genesis.json - reader-node-enforce-peers: localhost:13041 # App `node` manager API port - reader-node-arguments: +--firehose-genesis-file=./reader/genesis.json --authrpc.port=8552 - reader-node-log-to-zap: false - merger-time-between-store-pruning: 10s firehose-grpc-listen-addr: :8089 + merger-time-between-store-pruning: 10s + reader-node-bootstrap-data-url: ./reader/genesis.json + reader-node-arguments: + --config=./reader/config.toml + --networkid=1515 + --datadir={node-data-dir} + --ipcpath={data-dir}/reader/ipc + --port=30305 + --nodiscover + --authrpc.port=8552 + --http + --http.api=eth,net,web3 + --http.port=8547 + --http.addr=0.0.0.0 + --http.vhosts=* + --firehose-enabled + --firehose-genesis-file=./reader/genesis.json #substreams-rpc-endpoints: $ETH_MAINNET_RPC # replace with eth mainnet rpc endpoint substreams-rpc-cache-chunk-size: 100 substreams-state-bundle-size: 100 diff --git a/devel/standard/start.sh b/devel/standard/start.sh index 4964b96c..456960b5 100755 --- a/devel/standard/start.sh +++ b/devel/standard/start.sh @@ -18,13 +18,36 @@ main() { shift $((OPTIND-1)) [[ $1 = "--" ]] && shift + fh_data_dir="$ROOT/firehose-data" + miner_data_dir="$fh_data_dir/miner" + + # If nodekey is changed, the enode must be updated too because it's generated from the nodekey (put here for reference purposes, do not remove) + miner_enode="enode://e4d5433fd9e84930cd38028f2fdb1ca8d55bdb7b6a749da57e8aa7fc5d3c146c44c0d129a14cecc7b0f13bb98700bf392dd4fd7c31bf2fe26038d4ba8f5a8e32@[127.0.0.1]:30303" + miner_nodekey="f5f0aadf436e6b35c5fc00a1b0dbc181113ce4f3c448b73b954fe932c00a1b0d" + set -e if [[ $clean == "true" ]]; then - rm -rf sf-data &> /dev/null || true + rm -rf "$fh_data_dir" &> /dev/null || true + + echo "Creating miner Geth directory from 'bootstrap.tar.gz'" + mkdir -p "$miner_data_dir" + tar -C "$miner_data_dir" -xzf "$ROOT/miner/bootstrap.tar.gz" fi - exec $fireeth -c $(basename $ROOT).yaml start "$@" + # The sleep is here to give 1s for the process to exists, too fast and the 'kill' is a noop + trap "trap - SIGTERM && sleep 1 && kill -- -$$" SIGINT SIGTERM EXIT + geth \ + --config="$ROOT/miner/config.toml" \ + --datadir="$miner_data_dir" \ + --mine \ + --miner.etherbase=0x821b55d8abe79bc98f05eb675fdc50dfe796b7ab \ + --nodekeyhex="$miner_nodekey" \ + --allow-insecure-unlock \ + --password=/dev/null \ + --unlock=0x821b55d8abe79bc98f05eb675fdc50dfe796b7ab & + + $fireeth -c $(basename $ROOT).yaml start "$@" } usage_error() { @@ -46,7 +69,7 @@ usage() { echo " -c Clean actual data directory first" echo "" echo "Examples" - echo " Stream blocks grpcurl -plaintext -import-path ../proto -import-path ./proto -proto sf/ethereum/type/v2/type.proto -proto sf/firehose/v1/firehose.proto -d '{\"start_block_num\": -1}' localhost:13042 sf.firehose.v1.Stream.Blocks" + echo " Stream blocks grpcurl -plaintext -d '{\"start_block_num\": -1}' localhost:8089 sf.firehose.v2.Stream/Blocks" } main "$@" diff --git a/tools/download-blocks-from-firehose.go b/tools/download-blocks-from-firehose.go deleted file mode 100644 index 8a5e58c7..00000000 --- a/tools/download-blocks-from-firehose.go +++ /dev/null @@ -1,92 +0,0 @@ -package tools - -import ( - "context" - "fmt" - "os" - "strconv" - - "github.com/spf13/cobra" - "github.com/streamingfast/bstream" - "github.com/streamingfast/firehose-ethereum/types" - pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" - sftools "github.com/streamingfast/sf-tools" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/types/known/anypb" -) - -func init() { - Cmd.AddCommand(DownloadFromFirehoseCmd) - DownloadFromFirehoseCmd.Flags().StringP("api-token-env-var", "a", "FIREHOSE_API_TOKEN", "Look for a JWT in this environment variable to authenticate against endpoint") - DownloadFromFirehoseCmd.Flags().BoolP("plaintext", "p", false, "Use plaintext connection to firehose") - DownloadFromFirehoseCmd.Flags().BoolP("insecure", "k", false, "Skip SSL certificate validation when connecting to firehose") - DownloadFromFirehoseCmd.Flags().Bool("fix-ordinals", false, "Decode the eth blocks to fix the ordinals in the receipt logs") -} - -var DownloadFromFirehoseCmd = &cobra.Command{ - Use: "download-from-firehose ", - Short: "download blocks from firehose and save them to merged-blocks", - Args: cobra.ExactArgs(4), - RunE: downloadFromFirehoseE, - Example: ExamplePrefixed("fireeth tools download-from-firehose", ` - api.streamingfast.io 1000 2000 ./outputdir - `), -} - -func downloadFromFirehoseE(cmd *cobra.Command, args []string) error { - ctx := context.Background() - - endpoint := args[0] - start, err := strconv.ParseUint(args[1], 10, 64) - if err != nil { - return fmt.Errorf("parsing start block num: %w", err) - } - stop, err := strconv.ParseUint(args[2], 10, 64) - if err != nil { - return fmt.Errorf("parsing stop block num: %w", err) - } - destFolder := args[3] - - apiTokenEnvVar := mustGetString(cmd, "api-token-env-var") - apiToken := os.Getenv(apiTokenEnvVar) - - plaintext := mustGetBool(cmd, "plaintext") - insecure := mustGetBool(cmd, "insecure") - var fixerFunc func(*bstream.Block) (*bstream.Block, error) - if mustGetBool(cmd, "fix-ordinals") { - fixerFunc = func(in *bstream.Block) (*bstream.Block, error) { - block := in.ToProtocol().(*pbeth.Block) - return types.BlockFromProto(block, in.LibNum) - } - } else { - fixerFunc = func(in *bstream.Block) (*bstream.Block, error) { - return in, nil - } - } - - return sftools.DownloadFirehoseBlocks( - ctx, - endpoint, - apiToken, - insecure, - plaintext, - start, - stop, - destFolder, - decodeAnyPB, - fixerFunc, - zlog, - ) -} - -func decodeAnyPB(in *anypb.Any) (*bstream.Block, error) { - block := &pbeth.Block{} - if err := anypb.UnmarshalTo(in, block, proto.UnmarshalOptions{}); err != nil { - return nil, fmt.Errorf("unmarshal anypb: %w", err) - } - - // We are downloading only final blocks from the Firehose connection which means the LIB for them - // can be set to themself (althought we use `- 1` to ensure problem would occur if codde don't like - // `LIBNum == self.BlockNum`). - return types.BlockFromProto(block, block.Number-1) -} diff --git a/tools/firehose-prometheus-exporter.go b/tools/firehose-prometheus-exporter.go deleted file mode 100644 index 28f9560c..00000000 --- a/tools/firehose-prometheus-exporter.go +++ /dev/null @@ -1,14 +0,0 @@ -package tools - -import ( - sftools "github.com/streamingfast/sf-tools" -) - -func init() { - prometheusExporterCmd := sftools.GetFirehosePrometheusExporterCmd(zlog, tracer, transformsSetter) - prometheusExporterCmd.Flags().Bool("header-only", false, "Apply the HeaderOnly transform sending back Block's header only (with few top-level fields), exclusive option") - prometheusExporterCmd.Flags().String("call-filters", "", "call filters (format: '[address1[+address2[+...]]]:[eventsig1[+eventsig2[+...]]]") - prometheusExporterCmd.Flags().String("log-filters", "", "log filters (format: '[address1[+address2[+...]]]:[eventsig1[+eventsig2[+...]]]") - prometheusExporterCmd.Flags().Bool("send-all-block-headers", false, "ask for all the blocks to be sent (header-only if there is no match)") - Cmd.AddCommand(prometheusExporterCmd) -} diff --git a/types/block.go b/types/block.go deleted file mode 100644 index ca4fee6b..00000000 --- a/types/block.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package types - -import ( - "fmt" - - "github.com/streamingfast/bstream" - firecore "github.com/streamingfast/firehose-core" - pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" - pbbstream "github.com/streamingfast/pbgo/sf/bstream/v1" - "google.golang.org/protobuf/proto" -) - -var _ firecore.Block = (*pbeth.Block)(nil) - -func BlockFromProto(b *pbeth.Block, libNum uint64) (*bstream.Block, error) { - blockTime, err := b.Time() - if err != nil { - return nil, err - } - - content, err := proto.Marshal(b) - if err != nil { - return nil, fmt.Errorf("unable to marshal to binary form: %s", err) - } - - blk := &bstream.Block{ - Id: b.ID(), - Number: b.Number, - PreviousId: b.PreviousID(), - Timestamp: blockTime, - LibNum: libNum, - PayloadKind: pbbstream.Protocol_ETH, - PayloadVersion: b.Ver, - } - - return bstream.GetBlockPayloadSetter(blk, content) -} diff --git a/types/decoder.go b/types/decoder.go deleted file mode 100644 index 3afef621..00000000 --- a/types/decoder.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package types - -import ( - "fmt" - - "github.com/streamingfast/bstream" - pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" - pbbstream "github.com/streamingfast/pbgo/sf/bstream/v1" - "google.golang.org/protobuf/proto" -) - -func BlockDecoder(blk *bstream.Block) (interface{}, error) { - if blk.Kind() != pbbstream.Protocol_ETH { - return nil, fmt.Errorf("expected kind %s, got %s", pbbstream.Protocol_ETH, blk.Kind()) - } - - if blk.Version() > 3 || blk.Version() < 1 { - return nil, fmt.Errorf("this decoder only knows about version 1, 2 and 3, got %d", blk.Version()) - } - - block := new(pbeth.Block) - pl, err := blk.Payload.Get() - if err != nil { - return nil, fmt.Errorf("unable to get payload: %s", err) - } - - err = proto.Unmarshal(pl, block) - if err != nil { - return nil, fmt.Errorf("unable to decode payload: %s", err) - } - - return block, nil -} diff --git a/types/init.go b/types/init.go index 8350471c..7b3d533a 100644 --- a/types/init.go +++ b/types/init.go @@ -15,38 +15,32 @@ package types import ( - "fmt" - "io" "strings" - "time" "github.com/streamingfast/bstream" + firecore "github.com/streamingfast/firehose-core" + pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" pbbstream "github.com/streamingfast/pbgo/sf/bstream/v1" + "google.golang.org/protobuf/proto" ) +var _ firecore.Block = (*pbeth.Block)(nil) + +var encoder = firecore.NewBlockEncoder() + +var BlockAcceptedVersions = []int32{1, 2, 3} + func init() { - bstream.GetBlockWriterFactory = bstream.BlockWriterFactoryFunc(blockWriterFactory) - bstream.GetBlockReaderFactory = bstream.BlockReaderFactoryFunc(blockReaderFactory) - bstream.GetBlockDecoder = bstream.BlockDecoderFunc(BlockDecoder) - bstream.GetBlockWriterHeaderLen = 10 - bstream.GetBlockPayloadSetter = bstream.MemoryBlockPayloadSetter - bstream.GetMemoizeMaxAge = 20 * time.Second + // Doing it in `types` ensure that does that depend only on us are properly initialized + firecore.UnsafePayloadKind = pbbstream.Protocol_ETH + + // Must fit what is defined in `cmd/fireeth/main.go` in regards to `protocol` and `protocolVersion` and `blockAcceptedVersions` + bstream.InitGeneric("ETH", 1, BlockAcceptedVersions, func() proto.Message { return &pbeth.Block{} }) bstream.NormalizeBlockID = func(in string) string { return strings.TrimPrefix(strings.ToLower(in), "0x") } } -func blockReaderFactory(reader io.Reader) (bstream.BlockReader, error) { - return bstream.NewDBinBlockReader(reader, func(contentType string, version int32) error { - protocol := pbbstream.Protocol(pbbstream.Protocol_value[contentType]) - if protocol != pbbstream.Protocol_ETH && version != 1 { - return fmt.Errorf("reader only knows about %s block kind at version 1, got %s at version %d", protocol, contentType, version) - } - - return nil - }) -} - -func blockWriterFactory(writer io.Writer) (bstream.BlockWriter, error) { - return bstream.NewDBinBlockWriter(writer, pbbstream.Protocol_ETH.String(), 1) +func BlockFromProto(b *pbeth.Block, libNum uint64) (*bstream.Block, error) { + return encoder.Encode(firecore.BlockEnveloppe{Block: b, LIBNum: libNum}) } diff --git a/types/logging.go b/types/logging.go deleted file mode 100644 index ab471b35..00000000 --- a/types/logging.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package types - -import ( - "github.com/streamingfast/logging" -) - -var zlog, _ = logging.PackageLogger("fireeth", "github.com/streamingfast/firehose-ethereum/types") diff --git a/types/pb/sf/ethereum/type/v2/type.go b/types/pb/sf/ethereum/type/v2/type.go index 84c88dc9..c22ca4c2 100644 --- a/types/pb/sf/ethereum/type/v2/type.go +++ b/types/pb/sf/ethereum/type/v2/type.go @@ -293,13 +293,6 @@ func (b *Block) GetFirehoseBlockID() string { return hex.EncodeToString(b.Hash) } -// GetFirehoseBlockLIBNum implements firecore.Block. -func (b *Block) GetFirehoseBlockLIBNum() uint64 { - // FIXME: Wrong, LIBNum is incorrect and can only be implemented by console reader! - // Need to review firehose-core to see how GetFirehoseBlockLIBNum is used - return b.LIBNum() -} - // GetFirehoseBlockNumber implements firecore.Block. func (b *Block) GetFirehoseBlockNumber() uint64 { return b.Number @@ -314,3 +307,8 @@ func (b *Block) GetFirehoseBlockParentID() string { func (b *Block) GetFirehoseBlockTime() time.Time { return b.Header.Timestamp.AsTime() } + +// GetFirehoseBlockVersion implements firecore.Block. +func (b *Block) GetFirehoseBlockVersion() int32 { + return b.Ver +} diff --git a/types/testing/types.go b/types/testing/types.go index ea158626..42ad6243 100644 --- a/types/testing/types.go +++ b/types/testing/types.go @@ -555,7 +555,3 @@ func failInvalidComponent(t testing.T, tag string, component interface{}, option require.FailNowf(t, "invalid component", "Invalid %s component of type %T", tag, component) } - -func logInvalidComponent(tag string, component interface{}) { - zlog.Info(fmt.Sprintf("invalid %s component of type %T", tag, component)) -}