Skip to content

Commit fa6387b

Browse files
praetoriansentryminhd-vuleovct
authored
feat: BatchL2Data parse command (#570)
* feat: adding command to parse batchl2 data * fix: issue with rpc flags * Update cmd/parsebatchl2data/parsebatchl2data.go Co-authored-by: Léo Vincent <[email protected]> * fix: flag_loader import * fix: lint * fix: err shadow * fix: handle errors from printTxData --------- Co-authored-by: Minh Vu <[email protected]> Co-authored-by: Léo Vincent <[email protected]> Co-authored-by: Minh Vu <[email protected]>
1 parent 4f00714 commit fa6387b

File tree

7 files changed

+570
-0
lines changed

7 files changed

+570
-0
lines changed

README.md

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

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

82+
- [polycli parse-batch-l2-data](doc/polycli_parse-batch-l2-data.md) - Convert batch l2 data into an ndjson stream
83+
8284
- [polycli parseethwallet](doc/polycli_parseethwallet.md) - Extract the private key from an eth wallet.
8385

8486
- [polycli publish](doc/polycli_publish.md) - Publish transactions to the network with high-throughput
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
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 data")
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 i := range l2RawBlock.Transactions {
62+
if err := printTxData(&l2RawBlock.Transactions[i]); err != nil {
63+
log.Error().Err(err).Int("tx_index", i).Msg("Failed to print transaction data")
64+
}
65+
}
66+
}
67+
return nil
68+
},
69+
Args: func(cmd *cobra.Command, args []string) error {
70+
return nil
71+
},
72+
}
73+
74+
func init() {
75+
flagSet := ParseBatchL2Data.PersistentFlags()
76+
inputFileName = flagSet.String("file", "", "Provide a file with the key information ")
77+
}
78+
79+
func getInputData(cmd *cobra.Command, args []string) ([]byte, error) {
80+
if inputFileName != nil && *inputFileName != "" {
81+
return os.ReadFile(*inputFileName)
82+
}
83+
84+
if len(args) > 1 {
85+
concat := strings.Join(args[1:], " ")
86+
return []byte(concat), nil
87+
}
88+
89+
return io.ReadAll(os.Stdin)
90+
}
91+
92+
func printTxData(rawL2Tx *L2TxRaw) error {
93+
signer := types.NewEIP155Signer(rawL2Tx.Tx.ChainId())
94+
sender, err := signer.Sender(rawL2Tx.Tx)
95+
if err != nil {
96+
log.Error().Err(err).Msg("unable to reccover sender")
97+
return err
98+
}
99+
jsonTx, err := rawL2Tx.Tx.MarshalJSON()
100+
if err != nil {
101+
log.Error().Err(err).Msg("unable to json marshal tx")
102+
return err
103+
}
104+
txMap := make(map[string]string, 0)
105+
err = json.Unmarshal(jsonTx, &txMap)
106+
if err != nil {
107+
log.Error().Err(err).Msg("unable to remarshal json tx")
108+
return err
109+
}
110+
txMap["from"] = sender.String()
111+
jsonTx, err = json.Marshal(txMap)
112+
if err != nil {
113+
log.Error().Err(err).Msg("unable to marhshal tx with from")
114+
return err
115+
}
116+
117+
fmt.Println(string(jsonTx))
118+
return nil
119+
}
120+
121+
func tryRawBatch(rawBatchL2Data []byte) {
122+
rawBatch, err := DecodeForcedBatchV2(rawBatchL2Data)
123+
if err != nil {
124+
log.Error().Err(err).Msg("unable to decode raw l2 batch data")
125+
return
126+
}
127+
for i, t := range rawBatch.Transactions {
128+
if err := printTxData(&t); err != nil {
129+
log.Error().Err(err).Int("tx_index", i).Msg("Failed to print transaction data in forced batch")
130+
}
131+
}
132+
}

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)