ipld-eth-statedb/trie_by_cid/helper/statediff_helper.go

61 lines
1.6 KiB
Go
Raw Normal View History

2023-04-03 06:44:31 +00:00
package helper
import (
"context"
"math/big"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/statediff"
"github.com/ethereum/go-ethereum/statediff/indexer"
"github.com/ethereum/go-ethereum/statediff/indexer/database/sql/postgres"
"github.com/ethereum/go-ethereum/statediff/indexer/node"
)
var (
ChainConfig = params.TestChainConfig
mockTD = big.NewInt(1)
)
func IndexChain(dbConfig postgres.Config, stateCache state.Database, rootA, rootB common.Hash) error {
_, indexer, err := indexer.NewStateDiffIndexer(
context.Background(), ChainConfig, node.Info{}, dbConfig)
2023-04-03 06:44:31 +00:00
if err != nil {
return err
}
defer indexer.Close() // fixme: hangs when using PGX driver
// generating statediff payload for block, and transform the data into Postgres
builder := statediff.NewBuilder(stateCache)
block := types.NewBlock(&types.Header{Root: rootB}, nil, nil, nil, NewHasher())
// todo: use dummy block hashes to just produce trie structure for testing
args := statediff.Args{
OldStateRoot: rootA,
NewStateRoot: rootB,
}
diff, err := builder.BuildStateDiffObject(args, statediff.Params{})
if err != nil {
return err
}
tx, err := indexer.PushBlock(block, nil, mockTD)
if err != nil {
return err
}
// for _, node := range diff.Nodes {
// err := indexer.PushStateNode(tx, node, block.Hash().String())
// if err != nil {
// return err
// }
// }
for _, ipld := range diff.IPLDs {
if err := indexer.PushIPLD(tx, ipld); err != nil {
return err
}
}
return tx.Submit(err)
}