144 lines
4.1 KiB
Go
144 lines
4.1 KiB
Go
package validator_test_test
|
|
|
|
import (
|
|
"context"
|
|
"math/big"
|
|
|
|
"github.com/ethereum/go-ethereum/common"
|
|
"github.com/ethereum/go-ethereum/core"
|
|
"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/node"
|
|
"github.com/ethereum/go-ethereum/statediff/indexer/postgres"
|
|
sdtypes "github.com/ethereum/go-ethereum/statediff/types"
|
|
. "github.com/onsi/ginkgo"
|
|
. "github.com/onsi/gomega"
|
|
"github.com/vulcanize/ipld-eth-server/pkg/eth"
|
|
"github.com/vulcanize/ipld-eth-server/pkg/eth/test_helpers"
|
|
|
|
"github.com/Vulcanize/ipld-eth-db-validator/pkg/validator"
|
|
"github.com/Vulcanize/ipld-eth-db-validator/validator_test"
|
|
)
|
|
|
|
const (
|
|
chainLength = 20
|
|
blockHeight = 1
|
|
trail = 2
|
|
)
|
|
|
|
// SetupDB is use to setup a db for watcher tests
|
|
func setupDB() (*postgres.DB, error) {
|
|
uri := postgres.DbConnectionString(postgres.ConnectionParams{
|
|
User: "vdbm",
|
|
Password: "password",
|
|
Hostname: "localhost",
|
|
Name: "vulcanize_testing",
|
|
Port: 8077,
|
|
})
|
|
return postgres.NewDB(uri, postgres.ConnectionConfig{}, node.Info{})
|
|
}
|
|
|
|
var _ = Describe("eth state reading tests", func() {
|
|
var (
|
|
blocks []*types.Block
|
|
receipts []types.Receipts
|
|
chain *core.BlockChain
|
|
db *postgres.DB
|
|
chainConfig = params.TestChainConfig
|
|
mockTD = big.NewInt(1337)
|
|
err error
|
|
)
|
|
|
|
It("test init", func() {
|
|
db, err = setupDB()
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
transformer, err := indexer.NewStateDiffIndexer(chainConfig, db)
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
// make the test blockchain (and state)
|
|
blocks, receipts, chain = validator_test.MakeChain(chainLength, test_helpers.Genesis, validator_test.TestChainGen)
|
|
params := statediff.Params{
|
|
IntermediateStateNodes: true,
|
|
IntermediateStorageNodes: true,
|
|
}
|
|
|
|
// iterate over the blocks, generating statediff payloads, and transforming the data into Postgres
|
|
builder := statediff.NewBuilder(chain.StateCache())
|
|
for i, block := range blocks {
|
|
var args statediff.Args
|
|
var rcts types.Receipts
|
|
if i == 0 {
|
|
args = statediff.Args{
|
|
OldStateRoot: common.Hash{},
|
|
NewStateRoot: block.Root(),
|
|
BlockNumber: block.Number(),
|
|
BlockHash: block.Hash(),
|
|
}
|
|
} else {
|
|
args = statediff.Args{
|
|
OldStateRoot: blocks[i-1].Root(),
|
|
NewStateRoot: block.Root(),
|
|
BlockNumber: block.Number(),
|
|
BlockHash: block.Hash(),
|
|
}
|
|
rcts = receipts[i-1]
|
|
}
|
|
|
|
diff, err := builder.BuildStateDiffObject(args, params)
|
|
Expect(err).ToNot(HaveOccurred())
|
|
tx, err := transformer.PushBlock(block, rcts, mockTD)
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
for _, node := range diff.Nodes {
|
|
err = transformer.PushStateNode(tx, node)
|
|
Expect(err).ToNot(HaveOccurred())
|
|
}
|
|
|
|
err = tx.Close(err)
|
|
Expect(err).ToNot(HaveOccurred())
|
|
}
|
|
|
|
// Insert some non-canonical data into the database so that we test our ability to discern canonicity
|
|
indexAndPublisher, err := indexer.NewStateDiffIndexer(chainConfig, db)
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
tx, err := indexAndPublisher.PushBlock(test_helpers.MockBlock, test_helpers.MockReceipts, test_helpers.MockBlock.Difficulty())
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
err = tx.Close(err)
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
// The non-canonical header has a child
|
|
tx, err = indexAndPublisher.PushBlock(test_helpers.MockChild, test_helpers.MockReceipts, test_helpers.MockChild.Difficulty())
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
hash := sdtypes.CodeAndCodeHash{
|
|
Hash: test_helpers.CodeHash,
|
|
Code: test_helpers.ContractCode,
|
|
}
|
|
|
|
err = indexAndPublisher.PushCodeAndCodeHash(tx, hash)
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
err = tx.Close(err)
|
|
Expect(err).ToNot(HaveOccurred())
|
|
})
|
|
|
|
defer It("test teardown", func() {
|
|
eth.TearDownDB(db)
|
|
chain.Stop()
|
|
})
|
|
|
|
Describe("state_validation", func() {
|
|
It("Validator", func() {
|
|
srvc := validator.NewService(db, blockHeight, trail, validator.TestChainConfig)
|
|
|
|
_, err := srvc.Start(context.Background())
|
|
Expect(err).ToNot(HaveOccurred())
|
|
})
|
|
})
|
|
})
|