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))
}
make wasm