mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-19 10:22:23 +00:00
* init * add trie/database_types.go * update params/config.go * update les/server.go * update core/types/state_account_marshalling.go * add core/types/state_account_marshalling_test.go * update eth/backend.go * update trie/zk_trie.go * update trie/zk_trie_database.go * update trie/zk_trie_database_test.go * update trie/zk_trie_impl_test.go * update trie/zk_trie_proof_test.go * update trie/zk_trie_test.go * minor * init database_supplement.go * minor * add some supplements * fix * fix * add `zkproof` package * add trie/zktrie_deletionproof.go * init core/state/state_prove.go * fix * fix `(t *ZkTrie) Commit` * fix * update trie/proof.go * fix trie/zk_trie_database.go * update core/blockchain.go * update core/genesis.go * fix init trie_db (#639) * add config * update cmd/evm/internal/t8ntool/execution.go * update core/chain_makers.go * update cmd/evm/runner.go fix cmd/evm/runner.go * update core/chain_makers.go * refactor `triedbConfig` * update core/genesis.go * refactor `genesis.ToBlock()` * fix core/genesis_test.go * update core/state/database.go * update trie/database.go * update core/state/state_object.go * clean up * fix tests * fix `TestDump` & `TestIterativeDump` (#651) * fix `TestDump` * fix `compareStateObjects` * fix `TestIterativeDump` * fix `TestTinyTrie` & `TestCommitSequence` (#652) * zktrie: fix tests (#656) * fix `TestOdrContractCallLes2` * fix `internal/ethapi` tests * fix `TestFilters` * fix `core/state/snapshot/generate_test.go * update core/genesis_test.go (#658)
85 lines
2.6 KiB
Go
85 lines
2.6 KiB
Go
package state
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
zkt "github.com/scroll-tech/zktrie/types"
|
|
|
|
"github.com/ethereum/go-ethereum/common"
|
|
"github.com/ethereum/go-ethereum/crypto"
|
|
"github.com/ethereum/go-ethereum/ethdb"
|
|
zktrie "github.com/ethereum/go-ethereum/trie"
|
|
"github.com/ethereum/go-ethereum/trie/zkproof"
|
|
)
|
|
|
|
type TrieProve interface {
|
|
Prove(key []byte, fromLevel uint, proofDb ethdb.KeyValueWriter) error
|
|
}
|
|
|
|
type ZktrieProofTracer struct {
|
|
*zktrie.ProofTracer
|
|
}
|
|
|
|
// MarkDeletion overwrite the underlayer method with secure key
|
|
func (t ZktrieProofTracer) MarkDeletion(key common.Hash) {
|
|
key_s, _ := zkt.ToSecureKeyBytes(key.Bytes())
|
|
t.ProofTracer.MarkDeletion(key_s.Bytes())
|
|
}
|
|
|
|
// Merge overwrite underlayer method with proper argument
|
|
func (t ZktrieProofTracer) Merge(another ZktrieProofTracer) {
|
|
t.ProofTracer.Merge(another.ProofTracer)
|
|
}
|
|
|
|
func (t ZktrieProofTracer) Available() bool {
|
|
return t.ProofTracer != nil
|
|
}
|
|
|
|
// NewProofTracer is not in Db interface and used explictily for reading proof in storage trie (not updated by the dirty value)
|
|
func (s *StateDB) NewProofTracer(trieS Trie) ZktrieProofTracer {
|
|
if s.IsUsingZktrie() {
|
|
zkTrie := trieS.(*zktrie.ZkTrie)
|
|
if zkTrie == nil {
|
|
panic("unexpected trie type for zktrie")
|
|
}
|
|
return ZktrieProofTracer{zkTrie.NewProofTracer()}
|
|
}
|
|
return ZktrieProofTracer{}
|
|
}
|
|
|
|
// GetStorageTrieForProof is not in Db interface and used explictily for reading proof in storage trie (not updated by the dirty value)
|
|
func (s *StateDB) GetStorageTrieForProof(addr common.Address) (Trie, error) {
|
|
// try the trie in stateObject first, else we would create one
|
|
stateObject := s.getStateObject(addr)
|
|
if stateObject == nil {
|
|
// still return a empty trie
|
|
dummy_trie, _ := s.db.OpenStorageTrie(s.originalRoot, addr, common.Hash{})
|
|
return dummy_trie, nil
|
|
}
|
|
|
|
trie := stateObject.trie
|
|
var err error
|
|
if trie == nil {
|
|
// use a new, temporary trie
|
|
trie, err = s.db.OpenStorageTrie(s.originalRoot, stateObject.address, stateObject.data.Root)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("can't create storage trie on root %s: %v ", stateObject.data.Root, err)
|
|
}
|
|
}
|
|
|
|
return trie, nil
|
|
}
|
|
|
|
// GetSecureTrieProof handle any interface with Prove (should be a Trie in most case) and
|
|
// deliver the proof in bytes
|
|
func (s *StateDB) GetSecureTrieProof(trieProve TrieProve, key common.Hash) ([][]byte, error) {
|
|
var proof zkproof.ProofList
|
|
var err error
|
|
if s.IsUsingZktrie() {
|
|
key_s, _ := zkt.ToSecureKeyBytes(key.Bytes())
|
|
err = trieProve.Prove(key_s.Bytes(), 0, &proof)
|
|
} else {
|
|
err = trieProve.Prove(crypto.Keccak256(key.Bytes()), 0, &proof)
|
|
}
|
|
return proof, err
|
|
}
|