From 99a495501c1e7b4614ed55ec7938b86fe980e0f8 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Fri, 20 Mar 2020 10:57:12 +0100 Subject: [PATCH] squashmelater: add snaphash verifier function --- cmd/geth/chaincmd.go | 19 +++++--- core/state/snapshot/hextrie_generator.go | 62 ++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 7 deletions(-) diff --git a/cmd/geth/chaincmd.go b/cmd/geth/chaincmd.go index 219996d466..e04a4fa5c0 100644 --- a/cmd/geth/chaincmd.go +++ b/cmd/geth/chaincmd.go @@ -18,6 +18,7 @@ package main import ( "encoding/json" + "errors" "fmt" "github.com/ethereum/go-ethereum/core/state/snapshot" "os" @@ -616,14 +617,18 @@ func snapToHash(ctx *cli.Context) error { if err != nil { return fmt.Errorf("Could not create iterator for root %x: %v", root, err) } - generatedRoot := snapshot.GenerateTrieRoot(it) - if err := it.Error(); err != nil { - fmt.Printf("Iterator error: %v\n", it.Error()) + ollKorrekt := snapshot.CrosscheckTriehasher(it, 0, 10000) + //generatedRoot := snapshot.GenerateTrieRoot(it) + //if err := it.Error(); err != nil { + // fmt.Printf("Iterator error: %v\n", it.Error()) + //} + //if root != generatedRoot { + // return fmt.Errorf("Wrong hash generated, expected %x, got %x", root, generatedRoot[:]) + //} + if !ollKorrekt { + return errors.New("Computer says No, @gballet\n...come on man, fix me already!") } - if root != generatedRoot { - return fmt.Errorf("Wrong hash generated, expected %x, got %x", root, generatedRoot[:]) - } - log.Info("Generation done", "root", generatedRoot) + //log.Info("Generation done", "root", generatedRoot) return nil } diff --git a/core/state/snapshot/hextrie_generator.go b/core/state/snapshot/hextrie_generator.go index d882bd6cb2..b7ab83e8b5 100644 --- a/core/state/snapshot/hextrie_generator.go +++ b/core/state/snapshot/hextrie_generator.go @@ -39,6 +39,10 @@ func GenerateTrieRoot(it AccountIterator) common.Hash { return generateTrieRoot(it, StdGenerate) } +func CrosscheckTriehasher(it AccountIterator, begin,end int) bool { + return verifyHasher(it, StackGenerate, begin, end) +} + func generateTrieRoot(it AccountIterator, generatorFn trieGeneratorFn) common.Hash { var ( in = make(chan leaf) // chan to pass leaves @@ -73,6 +77,64 @@ func generateTrieRoot(it AccountIterator, generatorFn trieGeneratorFn) common.Ha return result } +func verifyHasher(it AccountIterator, generatorFn trieGeneratorFn, begin, end int) bool { + var ( + referenceFn = StdGenerate + + inA = make(chan leaf) // chan to pass leaves + outA = make(chan common.Hash) // chan to collect result + + inB = make(chan leaf) // chan to pass leaves + outB = make(chan common.Hash) // chan to collect result + wg sync.WaitGroup + ) + wg.Add(2) + go func() { + referenceFn(inA, outA) + wg.Done() + }() + go func() { + generatorFn(inB, outB) + wg.Done() + }() + // Feed leaves + start := time.Now() + logged := time.Now() + accounts := 0 + for it.Next() { + if accounts < begin { + accounts++ + continue + } + if end > 0 && accounts > end { + break + } + slimData := it.Account() + fullData := SlimToFull(slimData) + l := leaf{it.Hash(), fullData} + inA <- l + inB <- l + accounts++ + if time.Since(logged) > 8*time.Second { + log.Info("Generating trie hash from snapshot", + "at", l.key, "accounts", accounts, "elapsed", time.Since(start)) + logged = time.Now() + } + } + close(inA) + close(inB) + resultA := <-outA + resultB := <-outB + log.Info("Generated trie hash from snapshot", "accounts", accounts, + "elapsed", time.Since(start), + "start", begin, + "end", end, + "exp", resultA, + "got", resultB) + wg.Wait() + return resultA == resultB +} + // StackGenerate is a hexary trie builder which is built from the bottom-up as // keys are added. func StackGenerate(in chan (leaf), out chan (common.Hash)) {