fix missing root node edge case and use nil snapshot to work with 1.9.15
This commit is contained in:
parent
18ba50ad67
commit
a48e10ac7a
@ -90,6 +90,7 @@ func init() {
|
|||||||
rootCmd.PersistentFlags().String("database-hostname", "localhost", "database hostname")
|
rootCmd.PersistentFlags().String("database-hostname", "localhost", "database hostname")
|
||||||
rootCmd.PersistentFlags().String("database-user", "", "database user")
|
rootCmd.PersistentFlags().String("database-user", "", "database user")
|
||||||
rootCmd.PersistentFlags().String("database-password", "", "database password")
|
rootCmd.PersistentFlags().String("database-password", "", "database password")
|
||||||
|
rootCmd.PersistentFlags().String("log-level", logrus.InfoLevel.String(), "Log level (trace, debug, info, warn, error, fatal, panic")
|
||||||
|
|
||||||
viper.BindPFlag("logfile", rootCmd.PersistentFlags().Lookup("logfile"))
|
viper.BindPFlag("logfile", rootCmd.PersistentFlags().Lookup("logfile"))
|
||||||
viper.BindPFlag("database.name", rootCmd.PersistentFlags().Lookup("database-name"))
|
viper.BindPFlag("database.name", rootCmd.PersistentFlags().Lookup("database-name"))
|
||||||
@ -97,4 +98,5 @@ func init() {
|
|||||||
viper.BindPFlag("database.hostname", rootCmd.PersistentFlags().Lookup("database-hostname"))
|
viper.BindPFlag("database.hostname", rootCmd.PersistentFlags().Lookup("database-hostname"))
|
||||||
viper.BindPFlag("database.user", rootCmd.PersistentFlags().Lookup("database-user"))
|
viper.BindPFlag("database.user", rootCmd.PersistentFlags().Lookup("database-user"))
|
||||||
viper.BindPFlag("database.password", rootCmd.PersistentFlags().Lookup("database-password"))
|
viper.BindPFlag("database.password", rootCmd.PersistentFlags().Lookup("database-password"))
|
||||||
|
viper.BindPFlag("log.level", rootCmd.PersistentFlags().Lookup("log-level"))
|
||||||
}
|
}
|
||||||
|
6
environments/example.toml
Normal file
6
environments/example.toml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
[database]
|
||||||
|
name = "vulcanize_public" # $DATABASE_NAME
|
||||||
|
hostname = "localhost" # $DATABASE_HOSTNAME
|
||||||
|
port = 5432 # $DATABASE_PORT
|
||||||
|
user = "postgres" # $DATABASE_USER
|
||||||
|
password = "" # $DATABASE_PASSWORD
|
4
environments/testing.toml
Normal file
4
environments/testing.toml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
[database]
|
||||||
|
name = "vulcanize_testing"
|
||||||
|
hostname = "localhost"
|
||||||
|
port = 5432
|
@ -17,9 +17,10 @@
|
|||||||
package validator
|
package validator
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/core/state"
|
"github.com/ethereum/go-ethereum/core/state"
|
||||||
"github.com/ethereum/go-ethereum/core/state/snapshot"
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
"github.com/ethereum/go-ethereum/ethdb"
|
"github.com/ethereum/go-ethereum/ethdb"
|
||||||
"github.com/ethereum/go-ethereum/trie"
|
"github.com/ethereum/go-ethereum/trie"
|
||||||
@ -52,12 +53,20 @@ func NewValidator(db *sqlx.DB) *Validator {
|
|||||||
// This does consider child storage tries
|
// This does consider child storage tries
|
||||||
func (v *Validator) ValidateTrie(stateRoot common.Hash) error {
|
func (v *Validator) ValidateTrie(stateRoot common.Hash) error {
|
||||||
// Generate the state.NodeIterator for this root
|
// Generate the state.NodeIterator for this root
|
||||||
snapshotTree := snapshot.New(v.kvs, v.trieDB, 0, stateRoot, false)
|
stateDB, err := state.New(common.Hash{}, v.stateDatabase, nil)
|
||||||
stateDB, err := state.New(common.Hash{}, v.stateDatabase, snapshotTree)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
it := state.NewNodeIterator(stateDB)
|
it := state.NewNodeIterator(stateDB)
|
||||||
|
// state.NodeIterator won't throw an error if we can't find the root node
|
||||||
|
// check if it exists first
|
||||||
|
exists, err := v.kvs.Has(stateRoot.Bytes())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !exists {
|
||||||
|
return fmt.Errorf("root node for hash %s does not exist in database", stateRoot.Hex())
|
||||||
|
}
|
||||||
for it.Next() {
|
for it.Next() {
|
||||||
// iterate through entire state trie and descendent storage tries
|
// iterate through entire state trie and descendent storage tries
|
||||||
// it.Next() will return false when we have either completed iteration of the entire trie or have ran into an error (e.g. a missing node)
|
// it.Next() will return false when we have either completed iteration of the entire trie or have ran into an error (e.g. a missing node)
|
||||||
|
Loading…
Reference in New Issue
Block a user