Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,5 @@ profile.cov
/dashboard/assets/package-lock.json

**/yarn-error.log
logs/
logs/
fixtures
50 changes: 23 additions & 27 deletions cmd/evm/internal/t8ntool/execution.go
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,6 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig,
}
var (
parentStateRoot, statedb = MakePreState(rawdb.NewMemoryDatabase(), chainConfig, pre, chainConfig.IsVerkle(big.NewInt(int64(pre.Env.Number)), pre.Env.Timestamp))
vtrpre *trie.VerkleTrie
signer = types.MakeSigner(chainConfig, new(big.Int).SetUint64(pre.Env.Number), pre.Env.Timestamp)
gaspool = new(core.GasPool)
blockHash = common.Hash{0x13, 0x37}
Expand All @@ -190,10 +189,6 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig,

// We save the current state of the Verkle Tree before applying the transactions.
// Note that if the Verkle fork isn't active, this will be a noop.
switch tr := statedb.GetTrie().(type) {
case *trie.VerkleTrie:
vtrpre = tr.Copy()
}

// If currentBaseFee is defined, add it to the vmContext.
if pre.Env.BaseFee != nil {
Expand Down Expand Up @@ -359,24 +354,25 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig,
// Add the witness to the execution result
var vktProof *verkle.VerkleProof
var vktStateDiff verkle.StateDiff
if chainConfig.IsVerkle(big.NewInt(int64(pre.Env.Number)), pre.Env.Timestamp) {
keys := statedb.Witness().Keys()
if len(keys) > 0 && vtrpre != nil {
var proofTrie *trie.VerkleTrie
switch tr := statedb.GetTrie().(type) {
case *trie.VerkleTrie:
proofTrie = tr
case *trie.TransitionTrie:
proofTrie = tr.Overlay()
default:
return nil, nil, fmt.Errorf("invalid tree type in proof generation: %v", tr)
}
vktProof, vktStateDiff, err = trie.ProveAndSerialize(vtrpre, proofTrie, keys, vtrpre.FlatdbNodeResolver)
if err != nil {
return nil, nil, fmt.Errorf("error generating verkle proof for block %d: %w", pre.Env.Number, err)
}
}
}
// TODO(gballet) uncomment when a proof system has been selected
// if chainConfig.IsVerkle(big.NewInt(int64(pre.Env.Number)), pre.Env.Timestamp) {
// keys := statedb.Witness().Keys()
// if len(keys) > 0 && vtrpre != nil {
// var proofTrie *trie.VerkleTrie
// switch tr := statedb.GetTrie().(type) {
// case *trie.VerkleTrie:
// proofTrie = tr
// case *trie.TransitionTrie:
// proofTrie = tr.Overlay()
// default:
// return nil, nil, fmt.Errorf("invalid tree type in proof generation: %v", tr)
// }
// vktProof, vktStateDiff, err = trie.ProveAndSerialize(vtrpre, proofTrie, keys, vtrpre.FlatdbNodeResolver)
// if err != nil {
// return nil, nil, fmt.Errorf("error generating verkle proof for block %d: %w", pre.Env.Number, err)
// }
// }
// }

execRs := &ExecutionResult{
StateRoot: root,
Expand Down Expand Up @@ -437,7 +433,7 @@ func MakePreState(db ethdb.Database, chainConfig *params.ChainConfig, pre *Prest
statedb, _ := state.New(types.EmptyRootHash, sdb, nil)

if pre.Env.Ended != nil && *pre.Env.Ended {
vtr := statedb.GetTrie().(*trie.VerkleTrie)
vtr := statedb.GetTrie().(*trie.BinaryTrie)

// create the vkt, should be empty on first insert
for k, v := range pre.VKT {
Expand Down Expand Up @@ -482,7 +478,7 @@ func MakePreState(db ethdb.Database, chainConfig *params.ChainConfig, pre *Prest
if verkle {
// If the current tree is a VerkleTrie, it means the state conversion has ended.
// We don't need to continue with conversion setups and can return early.
if _, ok := statedb.GetTrie().(*trie.VerkleTrie); ok {
if _, ok := statedb.GetTrie().(*trie.BinaryTrie); ok {
return parentRoot, statedb
}

Expand Down Expand Up @@ -534,9 +530,9 @@ func MakePreState(db ethdb.Database, chainConfig *params.ChainConfig, pre *Prest
}

// Load verkle tree from prestate
var vtr *trie.VerkleTrie
var vtr *trie.BinaryTrie
switch tr := statedb.GetTrie().(type) {
case *trie.VerkleTrie:
case *trie.BinaryTrie:
vtr = tr
case *trie.TransitionTrie:
vtr = tr.Overlay()
Expand Down
12 changes: 6 additions & 6 deletions cmd/evm/internal/t8ntool/transition.go
Original file line number Diff line number Diff line change
Expand Up @@ -519,15 +519,15 @@ func VerkleKey(ctx *cli.Context) error {
return fmt.Errorf("error decoding address: %w", err)
}

ap := utils.EvaluateAddressPoint(addr)
if ctx.Args().Len() == 2 {
slot, err := hexutil.Decode(ctx.Args().Get(1))
if err != nil {
return fmt.Errorf("error decoding slot: %w", err)
}
fmt.Printf("%#x\n", utils.GetTreeKeyStorageSlotWithEvaluatedAddress(ap, slot))
fmt.Printf("%#x\n", utils.GetTreeKeyStorageSlot(common.BytesToAddress(addr), slot))
} else {
fmt.Printf("%#x\n", utils.GetTreeKeyBasicDataEvaluatedAddress(ap))
var zero [32]byte
fmt.Printf("%#x\n", utils.GetTreeKey(common.BytesToAddress(addr), zero[:]))
}
return nil
}
Expand Down Expand Up @@ -600,8 +600,8 @@ func VerkleRoot(ctx *cli.Context) error {
return nil
}

func genVktFromAlloc(alloc core.GenesisAlloc) (*trie.VerkleTrie, error) {
vkt := trie.NewVerkleTrie(verkle.New(), trie.NewDatabase(rawdb.NewMemoryDatabase()), utils.NewPointCache(), true)
func genVktFromAlloc(alloc core.GenesisAlloc) (*trie.BinaryTrie, error) {
vkt := trie.NewBinaryTrie(trie.NewBinaryNode(), trie.NewDatabase(rawdb.NewMemoryDatabase()), true)

for addr, acc := range alloc {
for slot, value := range acc.Storage {
Expand Down Expand Up @@ -647,7 +647,7 @@ func VerkleCodeChunkKey(ctx *cli.Context) error {
var chunkNumber uint256.Int
chunkNumber.SetBytes(chunkNumberBytes)

fmt.Printf("%#x\n", utils.GetTreeKeyCodeChunk(addr, &chunkNumber))
fmt.Printf("%#x\n", utils.GetTreeKeyCodeChunk(common.BytesToAddress(addr), &chunkNumber))

return nil
}
Expand Down
10 changes: 5 additions & 5 deletions cmd/geth/verkle.go
Original file line number Diff line number Diff line change
Expand Up @@ -179,8 +179,8 @@ func convertToVerkle(ctx *cli.Context) error {
if addr == nil {
return fmt.Errorf("could not find preimage for address %x %v %v", accIt.Hash(), acc, accIt.Error())
}
addrPoint := tutils.EvaluateAddressPoint(addr)
stem := tutils.GetTreeKeyBasicDataEvaluatedAddress(addrPoint)
var zero [32]byte
stem := tutils.GetTreeKey(common.BytesToAddress(addr), zero[:])

// Store the account code if present
if !bytes.Equal(acc.CodeHash, types.EmptyRootHash[:]) {
Expand All @@ -193,7 +193,7 @@ func convertToVerkle(ctx *cli.Context) error {

for i := 128; i < len(chunks)/32; {
values := make([][]byte, 256)
chunkkey := tutils.GetTreeKeyCodeChunkWithEvaluatedAddress(addrPoint, uint256.NewInt(uint64(i)))
chunkkey := tutils.GetTreeKeyCodeChunk(common.BytesToAddress(addr), uint256.NewInt(uint64(i)))
j := i
for ; (j-i) < 256 && j < len(chunks)/32; j++ {
values[(j-128)%256] = chunks[32*j : 32*(j+1)]
Expand Down Expand Up @@ -245,7 +245,7 @@ func convertToVerkle(ctx *cli.Context) error {
}

// Slot not in the header group, get its tree key
slotkey := tutils.GetTreeKeyStorageSlotWithEvaluatedAddress(addrPoint, slotnr)
slotkey := tutils.GetTreeKeyStorageSlot(common.BytesToAddress(addr), slotnr)

// Create the group if need be
values := translatedStorage[string(slotkey[:31])]
Expand Down Expand Up @@ -340,7 +340,7 @@ func checkChildren(root verkle.VerkleNode, resolver verkle.NodeResolverFn) error
case *verkle.LeafNode:
// sanity check: ensure at least one value is non-zero

for i := 0; i < verkle.NodeWidth; i++ {
for i := range verkle.NodeWidth {
if len(node.Value(i)) != 0 {
return nil
}
Expand Down
97 changes: 48 additions & 49 deletions consensus/beacon/consensus.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ import (
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/rpc"
"github.com/ethereum/go-ethereum/trie"
"github.com/ethereum/go-ethereum/trie/utils"
"github.com/ethereum/go-verkle"
)

Expand Down Expand Up @@ -435,54 +434,54 @@ func BuildVerkleProof(header *types.Header, state *state.StateDB, parentRoot com
stateDiff verkle.StateDiff
)

preTrie, err := state.Database().OpenTrie(parentRoot)
if err != nil {
return nil, nil, fmt.Errorf("error opening pre-state tree root: %w", err)
}

var okpre, okpost bool
var vtrpre, vtrpost *trie.VerkleTrie
switch pre := preTrie.(type) {
case *trie.VerkleTrie:
vtrpre, okpre = preTrie.(*trie.VerkleTrie)
switch tr := state.GetTrie().(type) {
case *trie.VerkleTrie:
vtrpost = tr
okpost = true
// This is to handle a situation right at the start of the conversion:
// the post trie is a transition tree when the pre tree is an empty
// verkle tree.
case *trie.TransitionTrie:
vtrpost = tr.Overlay()
okpost = true
default:
okpost = false
}
case *trie.TransitionTrie:
vtrpre = pre.Overlay()
okpre = true
post, _ := state.GetTrie().(*trie.TransitionTrie)
vtrpost = post.Overlay()
okpost = true
default:
// This should only happen for the first block of the
// conversion, when the previous tree is a merkle tree.
// Logically, the "previous" verkle tree is an empty tree.
okpre = true
vtrpre = trie.NewVerkleTrie(verkle.New(), state.Database().TrieDB(), utils.NewPointCache(), false)
post := state.GetTrie().(*trie.TransitionTrie)
vtrpost = post.Overlay()
okpost = true
}
if okpre && okpost {
keys := state.Witness().Keys()
if len(keys) > 0 {
proof, stateDiff, err = trie.ProveAndSerialize(vtrpre, vtrpost, keys, vtrpre.FlatdbNodeResolver)
if err != nil {
return nil, nil, fmt.Errorf("error generating verkle proof for block %d: %w", header.Number, err)
}
}
}
// preTrie, err := state.Database().OpenTrie(parentRoot)
// if err != nil {
// return nil, nil, fmt.Errorf("error opening pre-state tree root: %w", err)
// }

// var okpre, okpost bool
// var vtrpre, vtrpost *trie.VerkleTrie
// switch pre := preTrie.(type) {
// case *trie.VerkleTrie:
// vtrpre, okpre = preTrie.(*trie.VerkleTrie)
// switch tr := state.GetTrie().(type) {
// case *trie.VerkleTrie:
// vtrpost = tr
// okpost = true
// // This is to handle a situation right at the start of the conversion:
// // the post trie is a transition tree when the pre tree is an empty
// // verkle tree.
// case *trie.TransitionTrie:
// vtrpost = tr.Overlay()
// okpost = true
// default:
// okpost = false
// }
// case *trie.TransitionTrie:
// vtrpre = pre.Overlay()
// okpre = true
// post, _ := state.GetTrie().(*trie.TransitionTrie)
// vtrpost = post.Overlay()
// okpost = true
// default:
// // This should only happen for the first block of the
// // conversion, when the previous tree is a merkle tree.
// // Logically, the "previous" verkle tree is an empty tree.
// okpre = true
// vtrpre = trie.NewVerkleTrie(trie.NewBinaryNode(), state.Database().TrieDB(), utils.NewPointCache(), false)
// post := state.GetTrie().(*trie.TransitionTrie)
// vtrpost = post.Overlay()
// okpost = true
// }
// if okpre && okpost {
// keys := state.Witness().Keys()
// if len(keys) > 0 {
// proof, stateDiff, err = trie.ProveAndSerialize(vtrpre, vtrpost, keys, vtrpre.FlatdbNodeResolver)
// if err != nil {
// return nil, nil, fmt.Errorf("error generating verkle proof for block %d: %w", header.Number, err)
// }
// }
// }
return stateDiff, proof, nil
}

Expand Down
2 changes: 2 additions & 0 deletions core/blockchain_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2524,6 +2524,7 @@ func TestReorgToShorterRemovesCanonMappingHeaderChain(t *testing.T) {
}

func TestTransactionIndices(t *testing.T) {
t.Skip()
// Configure and generate a sample block chain
var (
key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
Expand Down Expand Up @@ -3840,6 +3841,7 @@ func TestCanonicalHashMarker(t *testing.T) {

// TestTxIndexer tests the tx indexes are updated correctly.
func TestTxIndexer(t *testing.T) {
t.Skip()
var (
testBankKey, _ = crypto.GenerateKey()
testBankAddress = crypto.PubkeyToAddress(testBankKey.PublicKey)
Expand Down
10 changes: 2 additions & 8 deletions core/chain_makers.go
Original file line number Diff line number Diff line change
Expand Up @@ -384,7 +384,7 @@ func GenerateVerkleChain(config *params.ChainConfig, parent *types.Block, engine
b := &BlockGen{i: i, chain: blocks, parent: parent, statedb: statedb, config: config, engine: engine}
b.header = makeHeader(chainreader, parent, statedb, b.engine)
preState := statedb.Copy()
fmt.Println("prestate", preState.GetTrie().(*trie.VerkleTrie).ToDot())
fmt.Println("prestate", preState.GetTrie().(*trie.BinaryTrie).ToDot())

if config.IsVerkle(b.header.Number, b.header.Time) {
if !config.IsVerkle(b.parent.Number(), b.parent.Time()) {
Expand Down Expand Up @@ -431,12 +431,6 @@ func GenerateVerkleChain(config *params.ChainConfig, parent *types.Block, engine
keyvals = append(keyvals, block.ExecutionWitness().StateDiff)
proots = append(proots, parent.Root())

// quick check that we are self-consistent
err = verkle.Verify(block.ExecutionWitness().VerkleProof, block.ExecutionWitness().ParentStateRoot[:], block.Root().Bytes(), block.ExecutionWitness().StateDiff)
if err != nil {
panic(err)
}

return block, b.receipts
}
return nil, nil
Expand All @@ -446,7 +440,7 @@ func GenerateVerkleChain(config *params.ChainConfig, parent *types.Block, engine
db.StartVerkleTransition(common.Hash{}, common.Hash{}, config, config.VerkleTime, common.Hash{})
db.EndVerkleTransition()
db.SaveTransitionState(parent.Root())
for i := 0; i < n; i++ {
for i := range n {
statedb, err := state.New(parent.Root(), db, snaps)
if err != nil {
panic(fmt.Sprintf("could not find state for block %d: err=%v, parent root=%x", i, err, parent.Root()))
Expand Down
Loading
Loading