Skip to content

Commit 7f5b4cf

Browse files
feat: adding command to parse batchl2 data
1 parent 13b49b5 commit 7f5b4cf

File tree

6 files changed

+507
-0
lines changed

6 files changed

+507
-0
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ Note: Do not modify this section! It is auto-generated by `cobra` using `make ge
7373

7474
- [polycli p2p](doc/polycli_p2p.md) - Set of commands related to devp2p.
7575

76+
- [polycli parse-batch-l2-data](doc/polycli_parse-batch-l2-data.md) - Convert batch l2 data into an ndjson stream
77+
7678
- [polycli parseethwallet](doc/polycli_parseethwallet.md) - Extract the private key from an eth wallet.
7779

7880
- [polycli retest](doc/polycli_retest.md) - Convert the standard ETH test fillers into something to be replayed against an RPC
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package parsebatchl2data
2+
3+
import (
4+
_ "embed"
5+
"encoding/hex"
6+
"encoding/json"
7+
"fmt"
8+
"github.com/ethereum/go-ethereum/core/types"
9+
"github.com/rs/zerolog/log"
10+
"github.com/spf13/cobra"
11+
"io"
12+
"os"
13+
"strings"
14+
)
15+
16+
var (
17+
//go:embed usage.md
18+
usage string
19+
inputFileName *string
20+
)
21+
22+
var ParseBatchL2Data = &cobra.Command{
23+
Use: "parse-batch-l2-data [flags]",
24+
Aliases: []string{"parsebatchl2data"},
25+
Short: "Convert batch l2 data into an ndjson stream",
26+
Long: usage,
27+
RunE: func(cmd *cobra.Command, args []string) error {
28+
29+
rawData, err := getInputData(cmd, args)
30+
if err != nil {
31+
return err
32+
}
33+
batchL2Data := strings.TrimSpace(strings.TrimPrefix(string(rawData), "0x"))
34+
rawBatchL2Data, err := hex.DecodeString(batchL2Data)
35+
if err != nil {
36+
log.Err(err).Msg("Unable to hex decode batch l2 dat")
37+
return err
38+
}
39+
40+
rawBatch, err := DecodeBatchV2(rawBatchL2Data)
41+
if err != nil {
42+
log.Error().Err(err).Msg("unable to decode l2 batch data")
43+
tryRawBatch(rawBatchL2Data)
44+
return err
45+
}
46+
47+
blocks := rawBatch.Blocks
48+
49+
for _, l2RawBlock := range blocks {
50+
blockData := struct {
51+
IndexL1InfoTree uint32
52+
DeltaTimestamp uint32
53+
}{l2RawBlock.IndexL1InfoTree, l2RawBlock.DeltaTimestamp}
54+
blockDataBytes, err := json.Marshal(blockData)
55+
if err != nil {
56+
log.Err(err).Msg("unable to marshal block data")
57+
return err
58+
}
59+
fmt.Println(string(blockDataBytes))
60+
61+
for idx := range l2RawBlock.Transactions {
62+
_ = printTxData(&l2RawBlock.Transactions[idx])
63+
}
64+
}
65+
return nil
66+
},
67+
Args: func(cmd *cobra.Command, args []string) error {
68+
return nil
69+
},
70+
}
71+
72+
func init() {
73+
flagSet := ParseBatchL2Data.PersistentFlags()
74+
inputFileName = flagSet.String("file", "", "Provide a file with the key information ")
75+
}
76+
77+
func getInputData(cmd *cobra.Command, args []string) ([]byte, error) {
78+
if inputFileName != nil && *inputFileName != "" {
79+
return os.ReadFile(*inputFileName)
80+
}
81+
82+
if len(args) > 1 {
83+
concat := strings.Join(args[1:], " ")
84+
return []byte(concat), nil
85+
}
86+
87+
return io.ReadAll(os.Stdin)
88+
}
89+
90+
func printTxData(rawL2Tx *L2TxRaw) error {
91+
signer := types.NewEIP155Signer(rawL2Tx.Tx.ChainId())
92+
sender, err := signer.Sender(&rawL2Tx.Tx)
93+
if err != nil {
94+
log.Error().Err(err).Msg("unable to reccover sender")
95+
return err
96+
}
97+
jsonTx, err := rawL2Tx.Tx.MarshalJSON()
98+
if err != nil {
99+
log.Error().Err(err).Msg("unable to json marshal tx")
100+
return err
101+
}
102+
txMap := make(map[string]string, 0)
103+
err = json.Unmarshal(jsonTx, &txMap)
104+
if err != nil {
105+
log.Error().Err(err).Msg("unable to remarshal json tx")
106+
return err
107+
}
108+
txMap["from"] = sender.String()
109+
jsonTx, err = json.Marshal(txMap)
110+
if err != nil {
111+
log.Error().Err(err).Msg("unable to marhshal tx with from")
112+
return err
113+
}
114+
115+
fmt.Println(string(jsonTx))
116+
return nil
117+
}
118+
119+
func tryRawBatch(rawBatchL2Data []byte) {
120+
rawBatch, err := DecodeForcedBatchV2(rawBatchL2Data)
121+
if err != nil {
122+
log.Error().Err(err).Msg("unable to decode raw l2 batch data")
123+
return
124+
}
125+
for _, t := range rawBatch.Transactions {
126+
_ = printTxData(&t)
127+
}
128+
}

cmd/parsebatchl2data/usage.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
This tool will parse batch L2 data from the zkEVM. Typically this data would be retrieved by querying `zkevm_getBatchByNumber` or reading the data directly from the L1 call data or from the validium dac
2+
```bash
3+
tmpfile=$(mktemp)
4+
# Rather than echoing, you could pull this from the RPC
5+
echo '0x0b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000004000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000004000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b0000000300000000ed8085012a05f20082520894a1d2c4533d867ce4623681f68df84d9cad73cb6b8802147f289bd648008081c48080abf43cd4adbd663d51f9f7d12d638e98b7dce52b3f2bfccbb5367fba1cf8f464394aa75f11a0943a486567f53d363a75bed35211b3caa8f6e5980699d8643bf51bffed8085012a05f20082520894a1d2c4533d867ce4623681f68df84d9cad73cb6b880186635edcd248008081c48080bc7e302ce64721a83edb93489d493fc934178075289544573a59676fefb0b5f157c0cb487f8e8e0312e4cf323ea2698ea4a4ae8872f35a8db67c21b562ee7e721cffed8085012a05f20082520894a1d2c4533d867ce4623681f68df84d9cad73cb6b88063e4f91b47448008081c4808021348b0d168c2ba0e3e5182ab9d081c0834cc9799795d1c7df09639f53228243360836789c5ba0f5d7179828028460c3ed2443b351232740d0082edc9741af521bffed8085012a05f20082520894a1d2c4533d867ce4623681f68df84d9cad73cb6b880429675d282548008081c48080c813f6e53b6e948b21955cf799f59e60b99a987b26eec65c509a1d656aa9a3c45c114bc94bad2a471fb65b735e0b084d798da46859880e3e4bb728e352d3890d1cffee8206d985012a05f20082520894a60bd9fa2a580a27366f8b60b5e21e8bfa34c06587012020bf7700008081c4808047c06085b8dd8fb85e3099ca71e21db47532b54361fda42f06ce2679e5c6d8f5703d9bbddcce7ab4ead680adfefcd0f3e3e107ac2e515f62cf8fa9ca663ef7801bff0b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000004000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b0000000300000000f86a8085012a05f20082e100941e4a5963abfd975d8c9021ce480b42188849d41d80b844a9059cbb0000000000000000000000005075ff68a0efb54db13423ad924bd680327d305e00000000000000000000000000000000000000000000000000000000005ae54681c48080525140d88325dacc6f817be629ea5ca10f2ac5d8795882a4e3121ce7af7dbbc127dace9e175a6246930490755cafcb4b5addb51f5ec4557ea22dcd81ef29bd0a1bff0b00000003000000000b00000003000000000b00000004000000000b00000003000000000b00000003000000000b0000000300000000f8ee8306464e850165a0bc0083035f30943c2269811836af69497e5f486a85d7316753cf6280b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000b70000000000000000000000000000000000000000000000ca62c08ab3f99ea3000000000000000000000000000000000000000000000000000000000004206feb000000000000000000000000000000000000000000000000000000000000001081c48080e6d6467d03ba8b9902baff55b678f66fb181e794bd60193f3a70626a5e9ee4cd56609863baf2a9f7f83acaf285903402de8775b9c9dc8d69b01cb83fe196b7971bfff8ee8306464f850165a0bc0083035f30943c2269811836af69497e5f486a85d7316753cf6280b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000ca62c08ab3f99ea3000000000000000000000000000000000000000000000000000000000019358829000000000000000000000000000000000000000000000000000000000000000881c480802c37e0289728f12c26f0696d4686557f57d388e5638158d740612e2af53022b82fa27d1a0e9e69b41c81390620dbe7f5de7946e89e2eda9bf8599d65195eea0f1bfff8ee83064650850165a0bc0083035f30943c2269811836af69497e5f486a85d7316753cf6280b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000d60000000000000000000000000000000000000000000000ca62c08ab3f99ea3000000000000000000000000000000000000000000000000000000000002faf080000000000000000000000000000000000000000000000000000000000000001081c48080b3c949c6e590971c4e1dddf0ad98a010c0ce301e49e817f165f64e4b5f8426cd1161de4edf3984ada3bf0657b2130cec0417afee87397ef8c92a77d629694f011cfff8ee83064651850165a0bc0083035f30943c2269811836af69497e5f486a85d7316753cf6280b8c43161b7f600000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000cf1bdec3f1ea5fee0000000000000000000000000000000000000000000000000000000000080d8c000000000000000000000000000000000000000000000000000000000000001081c480808dbb161c31f4243d57030d0b82f2d18bb513e9619d89ec7ac4ff019d68579bd9434ebe4bbbdd60876185581a70cf183c8a4f0a1920a509c13a6e754a5f349f2f1cff0b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b0000000300000000f9012d822a6e85012a05f20082b729948ddf05f9a5c488b4973897e278b58895bf87cb2480b90104800c7789000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000759500000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000001f75425004c618000000000000000000000000000000000000000000000000001f75425004c61881c48080f1e2c614a784dce84b66c65a545c5c90b78d8f2484d62343c231a0c8ea1bcbf91430e6d4b032f98dc85e6124e1b3c1b58c52e6a71474d3e71c3e0088e9f9b86e1cff0b00000003000000000b00000004000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000004000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000004000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b000000030000dd570b00000003000000000b00000004000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b0000000300000000f8ee83064652850165a0bc0083035f30943c2269811836af69497e5f486a85d7316753cf6280b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001010000000000000000000000000000000000000000000000ca157ea14e16b10fa30000000000000000000000000000000000000000000000000000000000342f60000000000000000000000000000000000000000000000000000000000000001081c48080bda6ad6b984d5cffd6a119daec4b76786d539b3633be58adc59821b12349ae0e5a6adfed7f357a2a734ed9672df79f6d3fd812ee2f73a0bd64e4dc53c08dc1321cfff8ee83064653850165a0bc0083035f30943c2269811836af69497e5f486a85d7316753cf6280b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001420000000000000000000000000000000000000000000000ca19a3cd3b4b1112900000000000000000000000000000000000000000000000000000000000200b20000000000000000000000000000000000000000000000000000000000000001081c4808038e9c3088ddbd6d12c76021fc6a3af7250f7dabc9dabfd1fb5b43c01fdd09ca34e86b176be43ca7a2edcc22b0f24178606d4d0c584b4da18f0b014bb10c6dfdf1cfff8ee83064654850165a0bc0083035f30943c2269811836af69497e5f486a85d7316753cf6280b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000d60000000000000000000000000000000000000000000000ca157ea14e16b10fa30000000000000000000000000000000000000000000000000000000002a16401000000000000000000000000000000000000000000000000000000000000001081c48080e5c55928b4a962cd032bdd2584a5fbcba810a9f66ab7b3bc0ed20437fc51b20430b4b07158963c85b678afc761e6007df1adaa91e9f3baaeb7ffed9cd653c1591cfff8ee83064655850165a0bc0083035f30943c2269811836af69497e5f486a85d7316753cf6280b8c43161b7f600000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000cf0d6ec035bc303f000000000000000000000000000000000000000000000000000000000032b198000000000000000000000000000000000000000000000000000000000000001081c480806ee91693b722b9f51c6559e2cbcc3c946b665887e3defe00a231dfe5c3c457c8490e0a398e372387fcfcc044698a6ca3a68af34cf9d4c4e67a3c2693565881561bfff8ee83064656850165a0bc0083035f30943c2269811836af69497e5f486a85d7316753cf6280b8c43161b7f60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000b70000000000000000000000000000000000000000000000ca157ea14e16b10fa30000000000000000000000000000000000000000000000000000000003596a11000000000000000000000000000000000000000000000000000000000000001081c48080505d17742dcbcda30560e52702213fca045307a3bb4a4eb442a3360b4ac52f551f31ad33c0bfc96a0289687e7006ba2fb4decb0bc069b106a1ee060ce0cb7a541cff0b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000004000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000004000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000004000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b0000000300000000f902730485012ffbd3008304eda69475d37b1a8a9d9625ae2b92ef8b4cea59213834ec87d529ae9e860000b90244ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000014488d527dc000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000003ee2ba2633b396f2a4e5250f50aa1b62e8dac93500000000000000000000000000000000000000000000000000d529ae9e8600000000000000000000000000000000000000000000000000000005751855247aa9000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000067e987e1000000000000000000000000000000000000000000000000000000000000002be538905cf8410324e03a5a23c1c177a474d59b2b000bb85a77f1443d16ee5761d310e38b62f77f726bc71c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000081c4808060c4bf5381c342717a00933f00ee89a6ebc6e8aae70b54f57b8f6b84aefd1dfe0ad414479fc0c7b8b9188067d7dbe7ee21de6857c37e0a41ad185e12eb63bcc81bff0b00000003000000000b0000000300000000f88d82378d8501836e21008301029794cf627f20cdcecd11af54143b81b4c7ae1e8d6ea180b8648e02f7590e9ab3a7dbc7a9526a6aa35290f5fbed2822e341fae983b2c9cfc4da0dd15f4b0000000000000000000000000000000000000000000000000000000067e97c3700000000000000000000000000000000000000000000000000000000009e70ac81c48080dfe855bd4ac557511e8522e39ba0c81f04062b1fcc30b888b8a456a0bfae3cef1fb3f6ecc55e41179486dae5577640ee7ba568105dda45e5ef0c863061e081ac1bff0b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b0000000300000000f86b05850135f1b40083010f0d945a77f1443d16ee5761d310e38b62f77f726bc71c80b844095ea7b3000000000000000000000000c626845bf4e6a5802ef774da0b3dfc6707f015f7000000000000000000000000000000000000000000000000006f0ecdebadc00081c48080cfd02fe0a365398cf9d78b0afc7ba9a27863d9a90541d0939dd4ffb8ba6db999776fb81003921525812e3a1e6f504eafae83b64940817aedbd98d73a373cfd4f1cff0b00000004000000000b00000003000000000b00000003000000000b0000000300000000f9014c06850135f1b4008301341394c626845bf4e6a5802ef774da0b3dfc6707f015f780b90124fc18063800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000005a77f1443d16ee5761d310e38b62f77f726bc71c0000000000000000000000001f49a3fa2b5b5b61df8de486abb6f3b9df066d8600000000000000000000000000000000000000000000000000058d8a4bc8b000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000019a4000000000000000000000000000000000000000000000000000000000000002a3078334545326261323633336233393666324134453532353066353041413162363245384441433933350000000000000000000000000000000000000000000081c480804e0f4c96115f74218b462162473df3fa8a1d46e5a9f0857a8e1e13b8e6bf73d234d997ac52065b4b85fbb342ccbc40ad4b164059567425cd95cba47016cf2c7d1bff0b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b00000003000000000b0000000300000000' > "$tmpfile"
6+
7+
# Either of these forms should work
8+
cat "$tmpfile" | polycli parse-batch-l2-data
9+
polycli parse-batch-l2-data --file "$tmpfile"
10+
11+
# get the largest L1 into tree index
12+
polycli parse-batch-l2-data --file "$tmpfile" | jq -r 'select(.IndexL1InfoTree != null) | .IndexL1InfoTree' | sort | tail -n 1
13+
```

0 commit comments

Comments
 (0)