Skip to content

chainbase-labs/evm-tracer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

evm-tracer

prestate-based stateless EVM custom tracer.

func main() {
	start := time.Now()
	endpoint := "https://eth-mainnet.g.alchemy.com/v2/xZF7o-Vl3z94HOqwaQtrZP06swu4_E15"
	blockNumber := int64(20000000)

	// 1, get chain config.
	chainConfig, err := tracer.GetChainConfig(1)
	if err != nil {
		log.Printf("Error getting chain config: %v", err)
		panic(err)
	}

	// 2,  get full block and prestate
	remoteNode, err := tracer.NewClient(endpoint)
	if err != nil {
		log.Printf("Error creating client: %v", err)
		panic(err)
	}

	ctx := context.Background()
	var rawBlock, rawPreState []byte

	eg := errgroup.Group{}
	eg.Go(func() error {
		rawBlock, err = remoteNode.BlockByNumber(ctx, blockNumber)
		return err
	})
	eg.Go(func() error {
		rawPreState, err = remoteNode.BlockPrestateByNumber(ctx, blockNumber)
		return err
	})
	if err := eg.Wait(); err != nil {
		log.Printf("Error fetching data: %v", err)
		panic(err)
	}
	log.Printf("Fetched block and prestate in %s", time.Since(start))

	// 3, set custom tracer, and parallel re-execution of txs in memory EVM.
	customTracers := []string{"callTracer"}
	results, receipts, err := tracer.TraceBlock(ctx, chainConfig, rawBlock, rawPreState, customTracers)
	var jsonData = map[string]interface{}{
		"results":  results,
		"receipts": receipts,
		"error":    err,
	}
	log.Printf("Traced block in %s", time.Since(start))

	// 4, print results as JSON
	v, err := json.Marshal(jsonData)
	fmt.Println(string(v))
}

build to wasm

make wasm

About

prestate-based EVM custom tracer. demo:

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published