您正在查看: Layer2 分类下的文章

polygon cdk sequence sender 发送 sequenceBatchesValidium的时机

问题

sequencesender长时间未向L1提交batch->sequenceBatchesValidium
与sequencesender模块有关的日志只看到如下

2024-11-18T04:04:13.436Z        INFO    sequencesender/sequencesender.go:187    batch 312 is not closed yet     {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}

未看到类似日志

2024-11-18T04:04:13.434Z        INFO    sequencesender/sequencesender.go:282    updating virtual batch  {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}

临时重启

重启sequencesender服务后,开始提交

2024-11-18T03:41:32.219Z        INFO    sequencesender/sequencesender.go:352    sending sequences to L1. From batch 83 to batch 318     {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:41:32.555Z        DEBUG   ethtxmanager/ethtxmanager.go:482        found 0 monitored tx to process {"pid": 40}
2024-11-18T03:41:32.555Z        DEBUG   ethtxmanager/ethtxmanager.go:512        found 0 mined monitored tx to process   {"pid": 40}
2024-11-18T03:41:33.434Z        DEBUG   ethtxmanager/ethtxmanager.go:555        found 0 safe monitored tx to process    {"pid": 40}
2024-11-18T03:41:33.434Z        INFO    rpc/batch.go:46 Getting batch 319 from RPC      {"pid": 40, "version": "v0.4.0-beta5"}
2024-11-18T03:41:33.435Z        INFO    rpc/batch.go:93 Getting l2 block timestamp from RPC. Block hash: 0x84fb8a0d5f14d5e0871f6c1488de02c0404ef40724eca3878917631f097a4c51     {"pid": 40, "version": "v0.4.0-beta5"}
2024-11-18T03:41:33.436Z        INFO    sequencesender/sequencesender.go:187    batch 319 is not closed yet     {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:41:35.554Z        DEBUG   ethtxmanager/ethtxmanager.go:482        found 0 monitored tx to process {"pid": 40}
2024-11-18T03:41:35.554Z        DEBUG   ethtxmanager/ethtxmanager.go:512        found 0 mined monitored tx to process   {"pid": 40}
2024-11-18T03:41:36.567Z        DEBUG   ethtxmanager/ethtxmanager.go:555        found 0 safe monitored tx to process    {"pid": 40}
2024-11-18T03:41:38.557Z        DEBUG   sync/evmdownloader.go:96        getting events from blocks 7099833 to  7099833  {"pid": 40, "version": "v0.4.0-beta5", "syncer": "l1infotreesync"}
2024-11-18T03:41:39.058Z        DEBUG   ethtxmanager/ethtxmanager.go:482        found 0 monitored tx to process {"pid": 40}
2024-11-18T03:41:39.058Z        DEBUG   ethtxmanager/ethtxmanager.go:512        found 0 mined monitored tx to process   {"pid": 40}
2024-11-18T03:41:39.437Z        DEBUG   sync/evmdownloader.go:104       sending block 7099833 to the driver (without events)    {"pid": 40, "version": "v0.4.0-beta5", "syncer": "l1infotreesync"}
2024-11-18T03:41:39.935Z        DEBUG   ethtxmanager/ethtxmanager.go:555        found 0 safe monitored tx to process    {"pid": 40}
2024-11-18T03:41:40.450Z        INFO    datacommittee/datacommittee.go:310      sending request to sign the sequence to 0xe492566270951f0630E5f3665900264f1E9232b1 at http://172.18.39.103:8444 {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:41:40.450Z        INFO    datacommittee/datacommittee.go:310      sending request to sign the sequence to 0x3DC4c719718A34B36765A9691B9D72acc0da4737 at http://172.18.36.175:8444 {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:41:40.450Z        INFO    datacommittee/datacommittee.go:310      sending request to sign the sequence to 0x003d77dE9535385942629B182eeB104e82ac3FBa at http://172.18.39.162:8444 {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:41:40.450Z        INFO    datacommittee/datacommittee.go:310      sending request to sign the sequence to 0x78fE7a1Cc51c84a61cC172c4Fb8c666e84d930c0 at http://172.18.36.185:8444 {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:41:40.450Z        INFO    datacommittee/datacommittee.go:310      sending request to sign the sequence to 0x9e07d72b16BDBF8870b79c2421912d677Ccf1F0F at http://172.18.36.16:8444  {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:41:40.553Z        DEBUG   sync/evmdownloader.go:89        waiting for new blocks, last block processed 7099833, last block seen on L1 7099833     {"pid": 40, "version": "v0.4.0-beta5", "syncer": "l1infotreesync"}
2024-11-18T03:41:40.553Z        DEBUG   sync/evmdriver.go:100   handleNewBlock blockNum: 7099833 blockHash: 0x8a6d757fe377f87c170f999db6ece324cdea0068ac839e4db6c5d7a7cdf21bcc  {"pid": 40, "version": "v0.4.0-beta5", "syncer": "l1infotreesync"}
2024-11-18T03:41:40.553Z        INFO    l1infotreesync/processor.go:343 block 7099833 processed with 0 events   {"pid": 40, "version": "v0.4.0-beta5"}
2024-11-18T03:41:40.710Z        INFO    datacommittee/datacommittee.go:283      received signature from 0xe492566270951f0630E5f3665900264f1E9232b1      {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:41:40.714Z        INFO    datacommittee/datacommittee.go:283      received signature from 0x78fE7a1Cc51c84a61cC172c4Fb8c666e84d930c0      {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:41:40.714Z        DEBUG   datacommittee/datacommittee.go:354      adding signature 0165779f9f39f6ce7f77ba7af88178ce181cca3850d46c75d418616d69b45a6a19944e19becc922655464dd688b0ab2274d244a542fcc18e3d53ea3f1fd8d61d1b from 0x78fE7a1Cc51c84a61cC172c4Fb8c666e84d930c0    {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:41:40.714Z        DEBUG   datacommittee/datacommittee.go:354      adding signature 1835e219ef55788ccd705d53703b6546be93e42b4d6e6d579fdd1129bbc1e33e5781922eb6d4180388095532b13ede5dde551195174f5acf0bb7e694e49b5acf1b from 0xe492566270951f0630E5f3665900264f1E9232b1    {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:41:40.714Z        DEBUG   datacommittee/datacommittee.go:358      adding addr 003d77de9535385942629b182eeb104e82ac3fba    {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:41:40.714Z        DEBUG   datacommittee/datacommittee.go:358      adding addr 3dc4c719718a34b36765a9691b9d72acc0da4737    {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:41:40.714Z        DEBUG   datacommittee/datacommittee.go:358      adding addr 78fe7a1cc51c84a61cc172c4fb8c666e84d930c0    {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:41:40.714Z        DEBUG   datacommittee/datacommittee.go:358      adding addr 9e07d72b16bdbf8870b79c2421912d677ccf1f0f    {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:41:40.714Z        DEBUG   datacommittee/datacommittee.go:358      adding addr e492566270951f0630e5f3665900264f1e9232b1    {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:41:40.714Z        DEBUG   datacommittee/datacommittee.go:361      full res 0165779f9f39f6ce7f77ba7af88178ce181cca3850d46c75d418616d69b45a6a19944e19becc922655464dd688b0ab2274d244a542fcc18e3d53ea3f1fd8d61d1b1835e219ef55788ccd705d53703b6546be93e42b4d6e6d579fdd1129bbc1e33e5781922eb6d4180388095532b13ede5dde551195174f5acf0bb7e694e49b5acf1b003d77de9535385942629b182eeb104e82ac3fba3dc4c719718a34b36765a9691b9d72acc0da473778fe7a1cc51c84a61cc172c4fb8c666e84d930c09e07d72b16bdbf8870b79c2421912d677ccf1f0fe492566270951f0630e5f3665900264f1e9232b1 {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:41:40.720Z        INFO    txbuilder/banana_validium.go:137        building banana sequence tx. AccInputHash: 0xc269d41773879024f823014826ff411750d4e40d11ab39368274ff02a4677af8   {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:41:41.434Z        INFO    sequencesender/sequencesender.go:523    latest virtual batch is 82      {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:41:42.054Z        DEBUG   ethtxmanager/ethtxmanager.go:482        found 0 monitored tx to process {"pid": 40}
2024-11-18T03:41:42.054Z        DEBUG   ethtxmanager/ethtxmanager.go:512        found 0 mined monitored tx to process   {"pid": 40}
2024-11-18T03:41:42.933Z        DEBUG   etherman/etherman.go:133        gasPrice chose: 1000068 {"pid": 40}
2024-11-18T03:41:42.934Z        INFO    ethtxmanager/ethtxmanager.go:327        created {"pid": 40, "types.MonitoredTx": "0xa87929898f4cc6ceb7f04839c84dfd49ac4cbabf65f464c6e85bc23bfbb8ca71", "createdAt": "0001-01-01T00:00:00.000Z"}
2024-11-18T03:41:42.934Z        INFO    sequencesender/ethtx.go:270     update transaction 0xa87929898f4cc6ceb7f04839c84dfd49ac4cbabf65f464c6e85bc23bfbb8ca71 to state created  {"pid": 40, "version": "v0.4.0-beta5"}
2024-11-18T03:41:43.056Z        DEBUG   ethtxmanager/ethtxmanager.go:555        found 0 safe monitored tx to process    {"pid": 40}
2024-11-18T03:41:43.434Z        INFO    rpc/batch.go:46 Getting batch 319 from RPC      {"pid": 40, "version": "v0.4.0-beta5"}
2024-11-18T03:41:43.434Z        INFO    sequencesender/sequencesender.go:282    updating virtual batch  {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:41:43.435Z        INFO    rpc/batch.go:93 Getting l2 block timestamp from RPC. Block hash: 0x3f9d3b97570bb1a765830ef53a9325e4ed26cd50213ac19296d78da11c6bfc77     {"pid": 40, "version": "v0.4.0-beta5"}
2024-11-18T03:41:43.436Z        INFO    sequencesender/sequencesender.go:187    batch 319 is not closed yet     {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:41:44.554Z        INFO    sequencesender/sequencesender.go:523    latest virtual batch is 82      {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:41:44.554Z        INFO    sequencesender/sequencesender.go:295    updating tx results     {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:41:44.554Z        INFO    sequencesender/ethtx.go:201     1 tx results synchronized (1 in pending state)  {"pid": 40, "version": "v0.4.0-beta5"}
2024-11-18T03:41:44.554Z        INFO    sequencesender/sequencesender.go:303    max number of pending txs (1) reached. Waiting for some to be completed {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:41:46.053Z        DEBUG   ethtxmanager/ethtxmanager.go:482        found 1 monitored tx to process {"pid": 40}
2024-11-18T03:41:46.053Z        INFO    ethtxmanager/ethtxmanager.go:592        processing      {"pid": 40, "monitoredTxId": "0xa87929898f4cc6ceb7f04839c84dfd49ac4cbabf65f464c6e85bc23bfbb8ca71", "createdAt": "2024-11-18T03:41:42.000Z", "from": "0x85472577b11837bC157F45643047Cb86136985f2", "to": "0x0d08b6F2f6c45a2EA67000C28b08D4591D2090ab"}
2024-11-18T03:41:46.053Z        DEBUG   ethtxmanager/ethtxmanager.go:607        unsigned tx 0xe329b68510423c2cc99fcf10b2b6b6a03de07422568d9ae744d71d9fd7e319ca created  {"pid": 40, "monitoredTxId": "0xa87929898f4cc6ceb7f04839c84dfd49ac4cbabf65f464c6e85bc23bfbb8ca71", "createdAt": "2024-11-18T03:41:42.000Z", "from": "0x85472577b11837bC157F45643047Cb86136985f2", "to": "0x0d08b6F2f6c45a2EA67000C28b08D4591D2090ab"}
2024-11-18T03:41:46.054Z        DEBUG   ethtxmanager/ethtxmanager.go:615        signed tx 0x7b50580b6256d80ac085d1964dde9dad0383d9850019124f9cd6c428e18bf515 created    {"pid": 40, "monitoredTxId": "0xa87929898f4cc6ceb7f04839c84dfd49ac4cbabf65f464c6e85bc23bfbb8ca71", "createdAt": "2024-11-18T03:41:42.000Z", "from": "0x85472577b11837bC157F45643047Cb86136985f2", "to": "0x0d08b6F2f6c45a2EA67000C28b08D4591D2090ab"}
2024-11-18T03:41:46.054Z        DEBUG   ethtxmanager/ethtxmanager.go:631        signed tx added to the monitored tx history     {"pid": 40, "monitoredTxId": "0xa87929898f4cc6ceb7f04839c84dfd49ac4cbabf65f464c6e85bc23bfbb8ca71", "createdAt": "2024-11-18T03:41:42.000Z", "from": "0x85472577b11837bC157F45643047Cb86136985f2", "to": "0x0d08b6F2f6c45a2EA67000C28b08D4591D2090ab"}
2024-11-18T03:41:46.933Z        DEBUG   ethtxmanager/ethtxmanager.go:638        signed tx not found in the network      {"pid": 40, "monitoredTxId": "0xa87929898f4cc6ceb7f04839c84dfd49ac4cbabf65f464c6e85bc23bfbb8ca71", "createdAt": "2024-11-18T03:41:42.000Z", "from": "0x85472577b11837bC157F45643047Cb86136985f2", "to": "0x0d08b6F2f6c45a2EA67000C28b08D4591D2090ab"}
2024-11-18T03:41:48.055Z        INFO    ethtxmanager/ethtxmanager.go:644        signed tx sent to the network: 0x7b50580b6256d80ac085d1964dde9dad0383d9850019124f9cd6c428e18bf515       {"pid": 40, "monitoredTxId": "0xa87929898f4cc6ceb7f04839c84dfd49ac4cbabf65f464c6e85bc23bfbb8ca71", "createdAt": "2024-11-18T03:41:42.000Z", "from": "0x85472577b11837bC157F45643047Cb86136985f2", "to": "0x0d08b6F2f6c45a2EA67000C28b08D4591D2090ab"}
2024-11-18T03:41:48.055Z        DEBUG   ethtxmanager/ethtxmanager.go:648        status changed to sent  {"pid": 40, "monitoredTxId": "0xa87929898f4cc6ceb7f04839c84dfd49ac4cbabf65f464c6e85bc23bfbb8ca71", "createdAt": "2024-11-18T03:41:42.000Z", "from": "0x85472577b11837bC157F45643047Cb86136985f2", "to": "0x0d08b6F2f6c45a2EA67000C28b08D4591D2090ab"}
2024-11-18T03:41:48.055Z        INFO    ethtxmanager/ethtxmanager.go:660        waiting signedTx to be mined... {"pid": 40}

https://sepolia.etherscan.io/tx/0x7b50580b6256d80ac085d1964dde9dad0383d9850019124f9cd6c428e18bf515

首次分析

交易发送完会经过 LatestBlock->SafeBlock->PendingBlock->FinalizedBlock 检查,等交易到达Finalized后,L2可以查到最新virtualBatchNumber

curl http://172.18.39.103:8123/ \
  -X POST \
  -H "Content-Type: application/json" \
  --data '{"method":"zkevm_virtualBatchNumber","params":[],"id":1,"jsonrpc":"2.0"}'

再次等待下一batch提交

2024-11-18T03:52:30.561Z        DEBUG   sync/evmdriver.go:100   handleNewBlock blockNum: 7099887 blockHash: 0x7ff38ef69691014544d333637710eec45028bcce01bb499eae2a90fe7fad234f  {"pid": 40, "version": "v0.4.0-beta5", "syncer": "l1infotreesync"}
2024-11-18T03:52:30.561Z        INFO    l1infotreesync/processor.go:343 block 7099887 processed with 0 events   {"pid": 40, "version": "v0.4.0-beta5"}
2024-11-18T03:52:32.558Z        DEBUG   ethtxmanager/ethtxmanager.go:482        found 0 monitored tx to process {"pid": 40}
2024-11-18T03:52:32.558Z        DEBUG   ethtxmanager/ethtxmanager.go:512        found 0 mined monitored tx to process   {"pid": 40}
2024-11-18T03:52:32.641Z        DEBUG   ethtxmanager/ethtxmanager.go:555        found 1 safe monitored tx to process    {"pid": 40}
2024-11-18T03:52:33.434Z        INFO    rpc/batch.go:46 Getting batch 321 from RPC      {"pid": 40, "version": "v0.4.0-beta5"}
2024-11-18T03:52:33.435Z        INFO    rpc/batch.go:93 Getting l2 block timestamp from RPC. Block hash: 0xbe0ad523b194365a43f235349d06694872a3993985e012b16ce5bbaa6fb61446     {"pid": 40, "version": "v0.4.0-beta5"}
2024-11-18T03:52:33.436Z        INFO    sequencesender/sequencesender.go:187    batch 321 is not closed yet     {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:34.140Z        DEBUG   ethtxmanager/ethtxmanager.go:482        found 0 monitored tx to process {"pid": 40}
2024-11-18T03:52:34.140Z        DEBUG   ethtxmanager/ethtxmanager.go:512        found 0 mined monitored tx to process   {"pid": 40}
2024-11-18T03:52:34.556Z        DEBUG   common/common.go:88     OldAccInputHash: 0xc269d41773879024f823014826ff411750d4e40d11ab39368274ff02a4677af8     {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:34.556Z        DEBUG   common/common.go:89     BatchHashData: 6ee24005ef15f2a20eb634ae9015d296f9c6e62aee35f572eb6bbb77a99169ff {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:34.556Z        DEBUG   common/common.go:90     L1InfoRoot: 0xc2e6e638276e241489b75cb361086e808b996349c06895a9a31e821c23205313  {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:34.556Z        DEBUG   common/common.go:91     TimeStampLimit: 1731901795      {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:34.557Z        DEBUG   common/common.go:92     Sequencer Address: 0x85472577b11837bC157F45643047Cb86136985f2   {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:34.557Z        DEBUG   common/common.go:93     Forced BlockHashL1: 0x0000000000000000000000000000000000000000000000000000000000000000  {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:34.557Z        DEBUG   common/common.go:94     CalculatedAccInputHash: 0x0714950ffe5325d32e0e8ac405b254baef3ba8641e986bbd4bb80562dc82b5e6      {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:34.557Z        DEBUG   common/common.go:88     OldAccInputHash: 0x0714950ffe5325d32e0e8ac405b254baef3ba8641e986bbd4bb80562dc82b5e6     {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:34.557Z        DEBUG   common/common.go:89     BatchHashData: 2b5ef3310d5a0ce9e89a84ea9a18be3b2632f77964fbdb85e82cec09a5a9c6a9 {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:34.557Z        DEBUG   common/common.go:90     L1InfoRoot: 0xc2e6e638276e241489b75cb361086e808b996349c06895a9a31e821c23205313  {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:34.557Z        DEBUG   common/common.go:91     TimeStampLimit: 1731901795      {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:34.557Z        DEBUG   common/common.go:92     Sequencer Address: 0x85472577b11837bC157F45643047Cb86136985f2   {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:34.557Z        DEBUG   common/common.go:93     Forced BlockHashL1: 0x0000000000000000000000000000000000000000000000000000000000000000  {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:34.557Z        DEBUG   common/common.go:94     CalculatedAccInputHash: 0x23a7726c7ae88735622bc47e3b107a7f24ad6eb100aeeb95a14b0b7954537216      {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:34.558Z        DEBUG   sequencesender/sequencesender.go:321    Seq/Banana: L2Coinbase: 0x85472577b11837bC157F45643047Cb86136985f2, OldAccInputHash: 307863323639643431373733383739303234663832333031343832366666343131373530643465343064313161623339333638323734666630326134363737616638, AccInputHash: 307832336137373236633761653838373335363232626334376533623130376137663234616436656231303061656562393561313462306237393534353337323136, L1InfoRoot: 307863326536653633383237366532343134383962373563623336313038366538303862393936333439633036383935613961333165383231633233323035333133, MaxSequenceTimestamp: 1731901795, IndexL1InfoRoot: 5
        Batch 0: Batch/Banana: LastCoinbase: 0x85472577b11837bC157F45643047Cb86136985f2, ForcedBatchTimestamp: 0, ForcedGlobalExitRoot: 307830303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030, ForcedBlockHashL1: 307830303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030, L2Data: 0b00000006000000000b0000000600000000ef8293a3843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808069017e8b83586de1f92e4b3ead48d9da0b54bd8bf64482b5cb59b3c6a21e85a021b1812696389e3e50426b7d86c08baf311c5134a589f08d3500fd0d16f834451bff0b0000000600000000ef8293a4843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080e0ac417a131546b6a1ecfb3652645060e471ab401245eeb4e40e306cd83d145e18b8ed06b2728eda6c1efc7ac63b0695cb88b11557f6ea5c972880f5ad6cf19e1cff0b00000006000000000b0000000700000000ef8293a5843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808058750ab1ce1db175f887b9e11751f6c72288e49bf63801521a8b48b525febae16183692faec3bf817cd287833ffaa488c2f3dbf212e3eb245f19ee5a619ae3201cff0b00000006000000000b0000000600000000ef8293a6843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808073ca1459a40914dff9d51d354456b46812c8f74644592f3a66ef994c805015ef59eafec8e95954b4ce467ba0d9baf08dbe1656ed69a9132fb506a0811b9ad40e1bff0b0000000600000000ef8293a7843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080706ae50515290b5767adc5f0e59cdeda5528e7d0eefb2b545deca4c9deaabf3e4fbb71c069307d6a4f632ca39aaa4b45956eb4bdc73fee542e2257156557a65a1cff0b00000006000000000b0000000600000000ef8293a8843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808071b79be4e078ea12c3025250d136f4554beed52ae9742f9b677e8c279e2ac265649aa65c8685ff15b4e5881c05edfd34f548bdc0df2a7de01c92a250818116871bff0b00000006000000000b0000000600000000ef8293a9843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280804577dc26ef239736cd8db636c94fb5bfcc0a935df9e84a61c1b3fa0212ac7ba6285500fd95db9738815e702ac1ce1fb1e9410050cf5e71046ea970ab31c594da1bff0b0000000600000000ef8293aa843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280800ea637c9c98c865aa943e3b5b0b612c053d8e0107788c60e8ca4a2430677b29c0e05a9143bcd68d29f923ff312badc7ee99d7e09e2f4d1a1e5398e734bfab3611bff0b00000006000000000b0000000600000000ef8293ab843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080396772ecfb3593a798533eb9e7f5a0fcf5922fe35c6e10e53de1ac88a40345f03571289a5053eb5c333f8af9893cf1303160b164ae1b780fe4a3cdb5d45870ec1cff0b00000006000000000b0000000600000000ef8293ac843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080e854f278a2b1cfbf244ca15280916ea17910a1c1ec00e25f8fc780dda6a9b0ec2bd8d59b9785d918d2efe83fa58d2cc9cbafd5bc39ca218848d58b1101d0b1111bff0b0000000600000000ef8293ad843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080a64d69b613b2cd99c9524b3d08b54715611b746a70e3d0966fc3e971a97f1e8376de45f6d9c88da9c878067b0edde1ad686f032d89a2eed6ac04ec58f308c53a1cff0b00000006000000000b0000000600000000ef8293ae843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080fdcc0e1b66b76a6496068ec3e7cdd38bca154f80327662d2a7411155805b1ff00c936b42418e1e094f030b9e299c62fdc48f4430e5cef06e708f04e47da74fd91bff0b00000006000000000b0000000600000000ef8293af843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080e0ac5b427be39d12ca0469a438a9e58840131889b8d1454f70f5deaed47d5f132d28440328156356cdb9752b7074403d49e99d63b90a56e857b8308a31da570e1cff0b0000000700000000ef8293b0843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080a3ee7c52446b770e0570cb540e97e5711391cd507fbabf173073ba95d1178c602026fd0ed2d3a1cfa622ca3bebf04c4cdec240fa1e5f867f6f684c9e8165da241cff0b00000006000000000b0000000600000000ef8293b1843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808086207dc67674698d2b825023b83edafff9e268c2b2c58ce8bfda58d6faca64ce77b55de14f8cf8ec30595e66ea19fbf938d2e568b7a29f640d8ae8c033c0fba51cff0b00000006000000000b0000000600000000ef8293b2843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808057c0ca3249580c4c606f330785e881df27c16d19ee1da20e2289692a75ebeff547d5b27aa0788eafe99ba080e7961b14b9eef4b406b97dc2414af79be3342b911bff0b0000000600000000ef8293b3843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280801e23b08c620995e9806946380de701a26f55f16b8e33713d1b8ea759d559f7f956c6142519267bf599138b27a531b3b28e846e7a58a28b25d054bcd68d8fc89c1bff0b00000006000000000b0000000600000000ef8293b4843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080b6fec13a96a1dee1f9ce460edd1b148aca811c376d0fee2e0fe163cfc2765d417ff159a37efd4839bda12896f4fb9b17a85fffa1784742026537ffec182ba8751cff0b00000006000000000b0000000600000000ef8293b5843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080f8bedcff7fc014bc0c0dd8963e3b46c66af1abc0e564d19f6460c1f8ca09d83f19a97829cb80b6c94706654c66c55454999747f7d0e401d7a6f9c11cb4f1d6401cff0b0000000600000000ef8293b6843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080dc5fc3da1f709be5b98cd8603126b70be35000d2f65b356f7a6c80463192d61300954908bd08255c829d365e1b980aba6d83a43d4023d2674ce3fdf1c3b7ca8c1bff0b00000006000000000b0000000600000000ef8293b7843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280809e6b05e760b5253763691f38dee1cf48844adbd46fca61797e838cd9ae376ef44accce44fac3d3e1d7e30a88cbe369e1cda1a1d86dd4f59c7bd77eed7ab225da1cff0b0000000600000000ef8293b8843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280800bc46c0670576daf044a50d535a3cb11af63b01c4852ebc20dcbfb2eb29ae66e7d977a76ce143107cd960e65c465c3a17bc254fff2a4934af4ed30c86d2b62bb1cff0b00000006000000000b0000000600000000ef8293b9843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080fbaa855ed1b4a0e59cccfe263e32e42776744f00f3714d7191e6f37e36883c415fe9f3d49f30892a91f18f4d300414e0f4157e93b4dc34fb9445d7bd730c094b1cff0b00000006000000000b0000000600000000ef8293ba843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280801f7e8bb1ad4fbe099840310709429b3c552edc4c5b6d3573be429d0b1bd276a254ba9ffc235c52786a08c88b323894c3a4997f4f166a0fc3717406e69a11790e1cff0b0000000600000000ef8293bb843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080c7d7468951132f2e0f0c0acc6fa850a1d7b652ee01a2e81fd9c37ebc7b85157a14d00931ec3d551eea4c014efb44937ee9d189ca71745f42f454c1f59e4837781cff0b00000007000000000b0000000600000000ef8293bc843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808075ce0f990f2c260931b2b5ec4206f94b5cc6e4a2e4a2618885e9a3d199c1e42b058ec6d40cc617b6f123104d8ee3d993c2aceb9f56a402e1df3b4d3d0f36ea931bff0b00000006000000000b0000000600000000ef8293bd843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080ebb31eb9d202b6a1f0aa4c6bdb68bf18332c832161ca515e4fd22b23f48b59d5363c9ca2ac7c4e8085d884b5bd84b4c2e79cc5b0410afce6be35d35ee4edfca81bff0b0000000600000000ef8293be843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080f7cbd4319cf256d2b79670c2ff3686d56c85c1f7a265a37f3985c91f3a3472030430a82b92751521822c16556dd473e17029d7200a19b6b95b9ff62d7c941aad1bff0b00000006000000000b0000000600000000ef8293bf843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808059f78f4e1aca1b48e929251838777278f4576ed666c2727e3c9d12b131d05c0d23fb54fda6d61b40d397bcc4129059879de3c03486bdc6bcfe8e179fe08468a41bff0b00000006000000000b0000000600000000ef8293c0843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280807e7d29e278a369ee74217d7d17f7706976797eb6cd913c7206b29748f31486404ec6c3f60a9567e276d6efb2021b11dcb391065a9e154cafae16cc21b79829a11bff, LastL2BLockTimestamp: 1731901492, BatchNumber: 319, GlobalExitRoot: 307834373430386264326665353162393139343033643066376338663633303433636464303434633162353231313930616266636230306466656436343937396430, L1InfoTreeIndex: 0
        Batch 1: Batch/Banana: LastCoinbase: 0x85472577b11837bC157F45643047Cb86136985f2, ForcedBatchTimestamp: 0, ForcedGlobalExitRoot: 307830303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030, ForcedBlockHashL1: 307830303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030, L2Data: 0b0000000600000000ef8293c1843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280800fb523f872127c34c4fd52642a9a3ec151aed913874df68cf0d7b5b99d6faa0d2889322e8cafe90a55f9854f525f3cfcded603888d2f39d8b3308eb75c5ecf501bff0b00000006000000000b0000000600000000ef8293c2843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080111a9733f105d513eb7236077be87c8010f28c2df58b1e9df8a7a4eb56272a4e31b5cd2144e9981d4f7dbc25ab1f1e9eee37fdf6fb66d1d60410b834fcb5cefc1cff0b00000006000000000b0000000700000000ef8293c3843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080db03fb0c3d24e8d2703f5092ce435517aaecb9d69bce43b829683849affce6ed285773e2ad783deea2ccabb0c0cb8432efc681ff21811ff640b029fdac5787b11bff0b0000000600000000ef8293c4843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080e61e08e8e3639b1bb0701a20edff04b3507e866ad18512201f436d7847c816d75353a34853685f2fa3d8e4cc6ac6b11948b3466e1e7ba9ff68333fdd9479a8b01cff0b00000006000000000b0000000600000000ef8293c5843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280804000e7ccac1b5fa8bbebf22ae8d857c58f7c2e1a0da2c4abd8c6a2db3b48e3cc21b666a752a1c6127c96ad9eebeaf0b97103ce54c97b5b99ee5d8530a2c7b7401bff0b00000006000000000b0000000600000000ef8293c6843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808045182bc184181e851845e2d493a3fad5048b3bbf521cc21d7bfd7df1b30e20f61b91f1a39faebb01f00444ccab92e2e0ea0ff3c300c3f382b11755aeee4b31d71cff0b0000000600000000ef8293c7843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280808bc79fa6149be9d5c7cdd44fe0011850e72e6db5d441ff5983f280e61bdd1b5e5d9caa95d1844f8a2aa88599e038811fbd94e48e68d3a2603a49a7e479b648df1cff0b00000006000000000b0000000600000000ef8293c8843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080d2957b80e7a27d3cf61d97580844689d6178f2a3990e5857ba35b9a369c720092c7f0f649e8db13aa3b0929fdfa40a5446de87ce7ec49459f0256605e4ab37161bff0b00000006000000000b0000000600000000ef8293c9843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280808c5e1d826473c625a5dbd2233e2e0fea4b1aba50abc22f50ef70f426dceefdc2022533a53e268460ab33dc71750d8895d4ee42fd9fcfdf5c358c57af84149b7d1cff0b0000000600000000ef8293ca843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280802cff0a3927fe8d1823d6dede5419424eb6882d289456152a6b235950affe273f657c9353671f9797be8180cd4adb92c7a8e3c33e2905d0f0213be2febf8cd8f81bff0b00000006000000000b0000000600000000ef8293cb843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808005f57fbd41a2fe48d1969d92f2a3f5348d7f6122f9b5d48ed81305267809064b78516c58db32183073dc29c1f423259b7baf856b2208d8c180c37ffabdfe8e7a1cff0b0000000600000000ef8293cc843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080648e50c93f4200dfcb255b725038603e1c3fde7293e79c5396a1be9392f0b4653a682aa6d273cbb276c5703c34c113e9063bb96c16bbc378859e731a5bcc47f91bff0b00000006000000000b0000000600000000ef8293cd843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080f9d20f1ac0f2b8d03560a579298145d87712a7c1f549b2f8de2b1bb61dd36ea11217c1e141bd544c362939388c8c4f41c15917fd2806583f250f4001736d75121bff0b00000006000000000b0000000600000000ef8293ce843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080e8a7139f82f089f3dd0f07d7d581a2122ad5f84f4c9fc459a568dfc3ab6f3db54745e904b88303ab0dcfb91c52794470fd3f5581ae1b791ffb1fa1d33cb44dfd1bff0b0000000700000000ef8293cf843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080d321295243c825bb84afdb6093578da892c94bfa75613b52664b38d7910b73571c4e927f7258e8796d46c94dd2c867795514c6510333af2bd7dd7645c37664511bff0b00000006000000000b0000000600000000ef8293d0843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080d8b690a26c82c0516ae074ae8644327a6ab686ea1cb2bfc45f25a01528256ca67feb033e64417034b20b3301723abee6d279280ae571ac709dccafa6be8e43081cff0b00000006000000000b0000000600000000ef8293d1843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808084b1225e57976e55f7574a076a41947a3d7a540eec860645294281dc20860df91e62c80b2e9ea786562377521128334878388cd065be53fe03eb8df40646b96b1cff0b0000000600000000ef8293d2843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280808b0c04ceab5920a87962bb901ec87b4281c59cb9b67a2c2149dd349bbbddafbc387303a953ef01f2de803387338e5d997539f36d9d32f8521561a6565d4b0e0b1bff0b00000006000000000b0000000600000000ef8293d3843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280801414a699b2175ff01421fead4580cf3e8448325760140657f20de529eb2bbace2bc2108e52fb6cc9c6df86888d8cc5f89ca0cc14fda6b492064c0b9fffdf4ed81cff0b00000006000000000b0000000600000000ef8293d4843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808055987366b3d002555d69c3fdcc3b3bf18210cc4bc46fde2ef5a22121debf76bb450f9c4e3cbb49b778b05257565c366bd0d96e2869db71c79c7ed701298bbc871bff0b0000000600000000ef8293d5843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080447ff0953d8d1802daf71ea45813b4106021effe36385f94017c0f081a8a2f652dd74dd4b782877e069e265e1ab409544a7f5f0ea579703be7b77e1af1e286451cff0b00000006000000000b0000000600000000ef8293d6843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080db6d636cb3274b47a260710356ce5188e9d1b5fadd5d33b7761d9d207a22a567185612f41d744ab80619626389d84adbf2674a9d4a7d6c194e224885b31df1b61bff0b00000006000000000b0000000600000000ef8293d7843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808054369061659795879f067682b40414f595039ddf08fd0b592c8764ccb9990ac751c05b67758a2b8aea20fdd4dcb2ecf85cccdfb3ffc21643184a210591d3d6971bff0b0000000600000000ef8293d8843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808059a93e010411a723c9addd5859af11d2dbda304b2b912118d92d58cd1e5cebd96a45600016404a55cd3828e679c5c37cfa73c91824b24286b703176ab58ebdf51bff0b00000006000000000b0000000700000000ef8293d9843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080679f461633bb779c9f1eb7ac5830e317b5469045cdc4d5f2dd721b793e3980115a0579c067c3ef430fd24558fd0e83c547a6ca6eac4e7ddbd6b4e2968913dcb31bff0b00000006000000000b0000000600000000ef8293da843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080103fb9e491a22e600ae3e0c0f33ad31a9a0e462eff7e80fdbddb4801ba07bce71869d24af24ee0073ddbe9a3a28c77b6b151a7d5767cbffd18ac05c1d3a5f6c51cff0b0000000600000000ef8293db843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080138c13e8702d8f87dab6c2519cb822dd48a1c93dd099735837679e08f7ca06651eee060546906f03769f3965b1682c5a02f0e1e8b647a0c45d446323becaf9881cff0b00000006000000000b0000000600000000ef8293dc843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080be1411793b75b664f102890913e63c3461d51d857d57a34e6cce45b2d6cebe182d1b410cbb5a6f23b74c3184f092dad358f9394ba05516cd1c4b93e01caddac71cff0b00000006000000000b0000000600000000ef8293dd843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080f69f581e0baf6b19245cab4ab153c74b55ba9a014abd99a1141794b11f40fcc31fb21a0ef19ba58c41d2ef6940c0a1a34f4c7e82a83ff640a00ba8783fa23e6a1cff0b0000000600000000ef8293de843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080d955debda7e36c4fff6ea74f39bcc0d34bbc07df4319b6b65e23251a7feedce659ff3fbefa599db1f3f76bb4b54e30fc6a158c2c8f0a6472c82da4505e9c94881bff0b0000000600000000, LastL2BLockTimestamp: 1731901795, BatchNumber: 320, GlobalExitRoot: 307834373430386264326665353162393139343033643066376338663633303433636464303434633162353231313930616266636230306466656436343937396430, L1InfoTreeIndex: 0        {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:34.558Z        INFO    sequencesender/sequencesender.go:322    sending sequences to L1. From batch 319 to batch 320    {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:34.634Z        INFO    sequencesender/sequencesender.go:404    time difference for L1 block block timestamp exceeds 30 seconds, proceeding (batch number: 320, last l2 block ts: 1731901795)   {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:34.634Z        INFO    sequencesender/sequencesender.go:404    time difference for current time exceeds 30 seconds, proceeding (batch number: 320, last l2 block ts: 1731901795)       {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:34.634Z        DEBUG   sequencesender/sequencesender.go:351    Seq/Banana: L2Coinbase: 0x85472577b11837bC157F45643047Cb86136985f2, OldAccInputHash: 307863323639643431373733383739303234663832333031343832366666343131373530643465343064313161623339333638323734666630326134363737616638, AccInputHash: 307832336137373236633761653838373335363232626334376533623130376137663234616436656231303061656562393561313462306237393534353337323136, L1InfoRoot: 307863326536653633383237366532343134383962373563623336313038366538303862393936333439633036383935613961333165383231633233323035333133, MaxSequenceTimestamp: 1731901795, IndexL1InfoRoot: 5
        Batch 0: Batch/Banana: LastCoinbase: 0x85472577b11837bC157F45643047Cb86136985f2, ForcedBatchTimestamp: 0, ForcedGlobalExitRoot: 307830303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030, ForcedBlockHashL1: 307830303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030, L2Data: 0b00000006000000000b0000000600000000ef8293a3843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808069017e8b83586de1f92e4b3ead48d9da0b54bd8bf64482b5cb59b3c6a21e85a021b1812696389e3e50426b7d86c08baf311c5134a589f08d3500fd0d16f834451bff0b0000000600000000ef8293a4843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080e0ac417a131546b6a1ecfb3652645060e471ab401245eeb4e40e306cd83d145e18b8ed06b2728eda6c1efc7ac63b0695cb88b11557f6ea5c972880f5ad6cf19e1cff0b00000006000000000b0000000700000000ef8293a5843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808058750ab1ce1db175f887b9e11751f6c72288e49bf63801521a8b48b525febae16183692faec3bf817cd287833ffaa488c2f3dbf212e3eb245f19ee5a619ae3201cff0b00000006000000000b0000000600000000ef8293a6843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808073ca1459a40914dff9d51d354456b46812c8f74644592f3a66ef994c805015ef59eafec8e95954b4ce467ba0d9baf08dbe1656ed69a9132fb506a0811b9ad40e1bff0b0000000600000000ef8293a7843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080706ae50515290b5767adc5f0e59cdeda5528e7d0eefb2b545deca4c9deaabf3e4fbb71c069307d6a4f632ca39aaa4b45956eb4bdc73fee542e2257156557a65a1cff0b00000006000000000b0000000600000000ef8293a8843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808071b79be4e078ea12c3025250d136f4554beed52ae9742f9b677e8c279e2ac265649aa65c8685ff15b4e5881c05edfd34f548bdc0df2a7de01c92a250818116871bff0b00000006000000000b0000000600000000ef8293a9843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280804577dc26ef239736cd8db636c94fb5bfcc0a935df9e84a61c1b3fa0212ac7ba6285500fd95db9738815e702ac1ce1fb1e9410050cf5e71046ea970ab31c594da1bff0b0000000600000000ef8293aa843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280800ea637c9c98c865aa943e3b5b0b612c053d8e0107788c60e8ca4a2430677b29c0e05a9143bcd68d29f923ff312badc7ee99d7e09e2f4d1a1e5398e734bfab3611bff0b00000006000000000b0000000600000000ef8293ab843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080396772ecfb3593a798533eb9e7f5a0fcf5922fe35c6e10e53de1ac88a40345f03571289a5053eb5c333f8af9893cf1303160b164ae1b780fe4a3cdb5d45870ec1cff0b00000006000000000b0000000600000000ef8293ac843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080e854f278a2b1cfbf244ca15280916ea17910a1c1ec00e25f8fc780dda6a9b0ec2bd8d59b9785d918d2efe83fa58d2cc9cbafd5bc39ca218848d58b1101d0b1111bff0b0000000600000000ef8293ad843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080a64d69b613b2cd99c9524b3d08b54715611b746a70e3d0966fc3e971a97f1e8376de45f6d9c88da9c878067b0edde1ad686f032d89a2eed6ac04ec58f308c53a1cff0b00000006000000000b0000000600000000ef8293ae843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080fdcc0e1b66b76a6496068ec3e7cdd38bca154f80327662d2a7411155805b1ff00c936b42418e1e094f030b9e299c62fdc48f4430e5cef06e708f04e47da74fd91bff0b00000006000000000b0000000600000000ef8293af843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080e0ac5b427be39d12ca0469a438a9e58840131889b8d1454f70f5deaed47d5f132d28440328156356cdb9752b7074403d49e99d63b90a56e857b8308a31da570e1cff0b0000000700000000ef8293b0843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080a3ee7c52446b770e0570cb540e97e5711391cd507fbabf173073ba95d1178c602026fd0ed2d3a1cfa622ca3bebf04c4cdec240fa1e5f867f6f684c9e8165da241cff0b00000006000000000b0000000600000000ef8293b1843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808086207dc67674698d2b825023b83edafff9e268c2b2c58ce8bfda58d6faca64ce77b55de14f8cf8ec30595e66ea19fbf938d2e568b7a29f640d8ae8c033c0fba51cff0b00000006000000000b0000000600000000ef8293b2843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808057c0ca3249580c4c606f330785e881df27c16d19ee1da20e2289692a75ebeff547d5b27aa0788eafe99ba080e7961b14b9eef4b406b97dc2414af79be3342b911bff0b0000000600000000ef8293b3843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280801e23b08c620995e9806946380de701a26f55f16b8e33713d1b8ea759d559f7f956c6142519267bf599138b27a531b3b28e846e7a58a28b25d054bcd68d8fc89c1bff0b00000006000000000b0000000600000000ef8293b4843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080b6fec13a96a1dee1f9ce460edd1b148aca811c376d0fee2e0fe163cfc2765d417ff159a37efd4839bda12896f4fb9b17a85fffa1784742026537ffec182ba8751cff0b00000006000000000b0000000600000000ef8293b5843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080f8bedcff7fc014bc0c0dd8963e3b46c66af1abc0e564d19f6460c1f8ca09d83f19a97829cb80b6c94706654c66c55454999747f7d0e401d7a6f9c11cb4f1d6401cff0b0000000600000000ef8293b6843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080dc5fc3da1f709be5b98cd8603126b70be35000d2f65b356f7a6c80463192d61300954908bd08255c829d365e1b980aba6d83a43d4023d2674ce3fdf1c3b7ca8c1bff0b00000006000000000b0000000600000000ef8293b7843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280809e6b05e760b5253763691f38dee1cf48844adbd46fca61797e838cd9ae376ef44accce44fac3d3e1d7e30a88cbe369e1cda1a1d86dd4f59c7bd77eed7ab225da1cff0b0000000600000000ef8293b8843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280800bc46c0670576daf044a50d535a3cb11af63b01c4852ebc20dcbfb2eb29ae66e7d977a76ce143107cd960e65c465c3a17bc254fff2a4934af4ed30c86d2b62bb1cff0b00000006000000000b0000000600000000ef8293b9843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080fbaa855ed1b4a0e59cccfe263e32e42776744f00f3714d7191e6f37e36883c415fe9f3d49f30892a91f18f4d300414e0f4157e93b4dc34fb9445d7bd730c094b1cff0b00000006000000000b0000000600000000ef8293ba843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280801f7e8bb1ad4fbe099840310709429b3c552edc4c5b6d3573be429d0b1bd276a254ba9ffc235c52786a08c88b323894c3a4997f4f166a0fc3717406e69a11790e1cff0b0000000600000000ef8293bb843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080c7d7468951132f2e0f0c0acc6fa850a1d7b652ee01a2e81fd9c37ebc7b85157a14d00931ec3d551eea4c014efb44937ee9d189ca71745f42f454c1f59e4837781cff0b00000007000000000b0000000600000000ef8293bc843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808075ce0f990f2c260931b2b5ec4206f94b5cc6e4a2e4a2618885e9a3d199c1e42b058ec6d40cc617b6f123104d8ee3d993c2aceb9f56a402e1df3b4d3d0f36ea931bff0b00000006000000000b0000000600000000ef8293bd843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080ebb31eb9d202b6a1f0aa4c6bdb68bf18332c832161ca515e4fd22b23f48b59d5363c9ca2ac7c4e8085d884b5bd84b4c2e79cc5b0410afce6be35d35ee4edfca81bff0b0000000600000000ef8293be843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080f7cbd4319cf256d2b79670c2ff3686d56c85c1f7a265a37f3985c91f3a3472030430a82b92751521822c16556dd473e17029d7200a19b6b95b9ff62d7c941aad1bff0b00000006000000000b0000000600000000ef8293bf843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808059f78f4e1aca1b48e929251838777278f4576ed666c2727e3c9d12b131d05c0d23fb54fda6d61b40d397bcc4129059879de3c03486bdc6bcfe8e179fe08468a41bff0b00000006000000000b0000000600000000ef8293c0843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280807e7d29e278a369ee74217d7d17f7706976797eb6cd913c7206b29748f31486404ec6c3f60a9567e276d6efb2021b11dcb391065a9e154cafae16cc21b79829a11bff, LastL2BLockTimestamp: 1731901492, BatchNumber: 319, GlobalExitRoot: 307834373430386264326665353162393139343033643066376338663633303433636464303434633162353231313930616266636230306466656436343937396430, L1InfoTreeIndex: 0
        Batch 1: Batch/Banana: LastCoinbase: 0x85472577b11837bC157F45643047Cb86136985f2, ForcedBatchTimestamp: 0, ForcedGlobalExitRoot: 307830303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030, ForcedBlockHashL1: 307830303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030, L2Data: 0b0000000600000000ef8293c1843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280800fb523f872127c34c4fd52642a9a3ec151aed913874df68cf0d7b5b99d6faa0d2889322e8cafe90a55f9854f525f3cfcded603888d2f39d8b3308eb75c5ecf501bff0b00000006000000000b0000000600000000ef8293c2843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080111a9733f105d513eb7236077be87c8010f28c2df58b1e9df8a7a4eb56272a4e31b5cd2144e9981d4f7dbc25ab1f1e9eee37fdf6fb66d1d60410b834fcb5cefc1cff0b00000006000000000b0000000700000000ef8293c3843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080db03fb0c3d24e8d2703f5092ce435517aaecb9d69bce43b829683849affce6ed285773e2ad783deea2ccabb0c0cb8432efc681ff21811ff640b029fdac5787b11bff0b0000000600000000ef8293c4843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080e61e08e8e3639b1bb0701a20edff04b3507e866ad18512201f436d7847c816d75353a34853685f2fa3d8e4cc6ac6b11948b3466e1e7ba9ff68333fdd9479a8b01cff0b00000006000000000b0000000600000000ef8293c5843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280804000e7ccac1b5fa8bbebf22ae8d857c58f7c2e1a0da2c4abd8c6a2db3b48e3cc21b666a752a1c6127c96ad9eebeaf0b97103ce54c97b5b99ee5d8530a2c7b7401bff0b00000006000000000b0000000600000000ef8293c6843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808045182bc184181e851845e2d493a3fad5048b3bbf521cc21d7bfd7df1b30e20f61b91f1a39faebb01f00444ccab92e2e0ea0ff3c300c3f382b11755aeee4b31d71cff0b0000000600000000ef8293c7843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280808bc79fa6149be9d5c7cdd44fe0011850e72e6db5d441ff5983f280e61bdd1b5e5d9caa95d1844f8a2aa88599e038811fbd94e48e68d3a2603a49a7e479b648df1cff0b00000006000000000b0000000600000000ef8293c8843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080d2957b80e7a27d3cf61d97580844689d6178f2a3990e5857ba35b9a369c720092c7f0f649e8db13aa3b0929fdfa40a5446de87ce7ec49459f0256605e4ab37161bff0b00000006000000000b0000000600000000ef8293c9843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280808c5e1d826473c625a5dbd2233e2e0fea4b1aba50abc22f50ef70f426dceefdc2022533a53e268460ab33dc71750d8895d4ee42fd9fcfdf5c358c57af84149b7d1cff0b0000000600000000ef8293ca843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280802cff0a3927fe8d1823d6dede5419424eb6882d289456152a6b235950affe273f657c9353671f9797be8180cd4adb92c7a8e3c33e2905d0f0213be2febf8cd8f81bff0b00000006000000000b0000000600000000ef8293cb843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808005f57fbd41a2fe48d1969d92f2a3f5348d7f6122f9b5d48ed81305267809064b78516c58db32183073dc29c1f423259b7baf856b2208d8c180c37ffabdfe8e7a1cff0b0000000600000000ef8293cc843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080648e50c93f4200dfcb255b725038603e1c3fde7293e79c5396a1be9392f0b4653a682aa6d273cbb276c5703c34c113e9063bb96c16bbc378859e731a5bcc47f91bff0b00000006000000000b0000000600000000ef8293cd843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080f9d20f1ac0f2b8d03560a579298145d87712a7c1f549b2f8de2b1bb61dd36ea11217c1e141bd544c362939388c8c4f41c15917fd2806583f250f4001736d75121bff0b00000006000000000b0000000600000000ef8293ce843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080e8a7139f82f089f3dd0f07d7d581a2122ad5f84f4c9fc459a568dfc3ab6f3db54745e904b88303ab0dcfb91c52794470fd3f5581ae1b791ffb1fa1d33cb44dfd1bff0b0000000700000000ef8293cf843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080d321295243c825bb84afdb6093578da892c94bfa75613b52664b38d7910b73571c4e927f7258e8796d46c94dd2c867795514c6510333af2bd7dd7645c37664511bff0b00000006000000000b0000000600000000ef8293d0843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080d8b690a26c82c0516ae074ae8644327a6ab686ea1cb2bfc45f25a01528256ca67feb033e64417034b20b3301723abee6d279280ae571ac709dccafa6be8e43081cff0b00000006000000000b0000000600000000ef8293d1843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808084b1225e57976e55f7574a076a41947a3d7a540eec860645294281dc20860df91e62c80b2e9ea786562377521128334878388cd065be53fe03eb8df40646b96b1cff0b0000000600000000ef8293d2843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280808b0c04ceab5920a87962bb901ec87b4281c59cb9b67a2c2149dd349bbbddafbc387303a953ef01f2de803387338e5d997539f36d9d32f8521561a6565d4b0e0b1bff0b00000006000000000b0000000600000000ef8293d3843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b2280801414a699b2175ff01421fead4580cf3e8448325760140657f20de529eb2bbace2bc2108e52fb6cc9c6df86888d8cc5f89ca0cc14fda6b492064c0b9fffdf4ed81cff0b00000006000000000b0000000600000000ef8293d4843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808055987366b3d002555d69c3fdcc3b3bf18210cc4bc46fde2ef5a22121debf76bb450f9c4e3cbb49b778b05257565c366bd0d96e2869db71c79c7ed701298bbc871bff0b0000000600000000ef8293d5843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080447ff0953d8d1802daf71ea45813b4106021effe36385f94017c0f081a8a2f652dd74dd4b782877e069e265e1ab409544a7f5f0ea579703be7b77e1af1e286451cff0b00000006000000000b0000000600000000ef8293d6843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080db6d636cb3274b47a260710356ce5188e9d1b5fadd5d33b7761d9d207a22a567185612f41d744ab80619626389d84adbf2674a9d4a7d6c194e224885b31df1b61bff0b00000006000000000b0000000600000000ef8293d7843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808054369061659795879f067682b40414f595039ddf08fd0b592c8764ccb9990ac751c05b67758a2b8aea20fdd4dcb2ecf85cccdfb3ffc21643184a210591d3d6971bff0b0000000600000000ef8293d8843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b22808059a93e010411a723c9addd5859af11d2dbda304b2b912118d92d58cd1e5cebd96a45600016404a55cd3828e679c5c37cfa73c91824b24286b703176ab58ebdf51bff0b00000006000000000b0000000700000000ef8293d9843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080679f461633bb779c9f1eb7ac5830e317b5469045cdc4d5f2dd721b793e3980115a0579c067c3ef430fd24558fd0e83c547a6ca6eac4e7ddbd6b4e2968913dcb31bff0b00000006000000000b0000000600000000ef8293da843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080103fb9e491a22e600ae3e0c0f33ad31a9a0e462eff7e80fdbddb4801ba07bce71869d24af24ee0073ddbe9a3a28c77b6b151a7d5767cbffd18ac05c1d3a5f6c51cff0b0000000600000000ef8293db843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080138c13e8702d8f87dab6c2519cb822dd48a1c93dd099735837679e08f7ca06651eee060546906f03769f3965b1682c5a02f0e1e8b647a0c45d446323becaf9881cff0b00000006000000000b0000000600000000ef8293dc843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080be1411793b75b664f102890913e63c3461d51d857d57a34e6cce45b2d6cebe182d1b410cbb5a6f23b74c3184f092dad358f9394ba05516cd1c4b93e01caddac71cff0b00000006000000000b0000000600000000ef8293dd843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080f69f581e0baf6b19245cab4ab153c74b55ba9a014abd99a1141794b11f40fcc31fb21a0ef19ba58c41d2ef6940c0a1a34f4c7e82a83ff640a00ba8783fa23e6a1cff0b0000000600000000ef8293de843b9aca0082520894c2df13b6ad0753e0547a318f65f99ac62aec6e2b87038d7ea4c680008083015b228080d955debda7e36c4fff6ea74f39bcc0d34bbc07df4319b6b65e23251a7feedce659ff3fbefa599db1f3f76bb4b54e30fc6a158c2c8f0a6472c82da4505e9c94881bff0b0000000600000000, LastL2BLockTimestamp: 1731901795, BatchNumber: 320, GlobalExitRoot: 307834373430386264326665353162393139343033643066376338663633303433636464303434633162353231313930616266636230306466656436343937396430, L1InfoTreeIndex: 0        {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:34.634Z        INFO    sequencesender/sequencesender.go:352    sending sequences to L1. From batch 319 to batch 320    {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:35.562Z        DEBUG   ethtxmanager/ethtxmanager.go:555        found 1 safe monitored tx to process    {"pid": 40}
2024-11-18T03:52:38.112Z        DEBUG   ethtxmanager/ethtxmanager.go:482        found 0 monitored tx to process {"pid": 40}
2024-11-18T03:52:38.112Z        DEBUG   ethtxmanager/ethtxmanager.go:512        found 0 mined monitored tx to process   {"pid": 40}
2024-11-18T03:52:39.132Z        DEBUG   sync/evmdownloader.go:96        getting events from blocks 7099888 to  7099888  {"pid": 40, "version": "v0.4.0-beta5", "syncer": "l1infotreesync"}
2024-11-18T03:52:39.561Z        DEBUG   ethtxmanager/ethtxmanager.go:555        found 1 safe monitored tx to process    {"pid": 40}
2024-11-18T03:52:39.639Z        DEBUG   sync/evmdownloader.go:104       sending block 7099888 to the driver (without events)    {"pid": 40, "version": "v0.4.0-beta5", "syncer": "l1infotreesync"}
2024-11-18T03:52:40.134Z        DEBUG   sync/evmdownloader.go:89        waiting for new blocks, last block processed 7099888, last block seen on L1 7099888     {"pid": 40, "version": "v0.4.0-beta5", "syncer": "l1infotreesync"}
2024-11-18T03:52:40.135Z        DEBUG   sync/evmdriver.go:100   handleNewBlock blockNum: 7099888 blockHash: 0x770d6da1c6d3e05688cbb2f91f1a6433ff2ce49f5b5890c8a18e0c2fa7be7310  {"pid": 40, "version": "v0.4.0-beta5", "syncer": "l1infotreesync"}
2024-11-18T03:52:40.135Z        INFO    l1infotreesync/processor.go:343 block 7099888 processed with 0 events   {"pid": 40, "version": "v0.4.0-beta5"}
2024-11-18T03:52:41.558Z        INFO    datacommittee/datacommittee.go:310      sending request to sign the sequence to 0xe492566270951f0630E5f3665900264f1E9232b1 at http://172.18.39.103:8444 {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:52:41.558Z        INFO    datacommittee/datacommittee.go:310      sending request to sign the sequence to 0x3DC4c719718A34B36765A9691B9D72acc0da4737 at http://172.18.36.175:8444 {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:52:41.558Z        INFO    datacommittee/datacommittee.go:310      sending request to sign the sequence to 0x003d77dE9535385942629B182eeB104e82ac3FBa at http://172.18.39.162:8444 {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:52:41.558Z        INFO    datacommittee/datacommittee.go:310      sending request to sign the sequence to 0x78fE7a1Cc51c84a61cC172c4Fb8c666e84d930c0 at http://172.18.36.185:8444 {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:52:41.558Z        INFO    datacommittee/datacommittee.go:310      sending request to sign the sequence to 0x9e07d72b16BDBF8870b79c2421912d677Ccf1F0F at http://172.18.36.16:8444  {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:52:41.562Z        INFO    datacommittee/datacommittee.go:283      received signature from 0x3DC4c719718A34B36765A9691B9D72acc0da4737      {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:52:41.562Z        INFO    datacommittee/datacommittee.go:283      received signature from 0xe492566270951f0630E5f3665900264f1E9232b1      {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:52:41.562Z        DEBUG   datacommittee/datacommittee.go:354      adding signature 7f729d16848dd7790de313f58aae0d7256f343af77933299d44426a7f7aa75ba24a43e10275ec3a73c9de23bfe9f0cf91bd5b99e183322db0302e758266c0baa1b from 0x3DC4c719718A34B36765A9691B9D72acc0da4737    {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:52:41.562Z        DEBUG   datacommittee/datacommittee.go:354      adding signature 9a40e6a054ffe939644330a53cac8b3e97faf9cc3ab28ca46fc234210e1027ea71d619a6bb75b608c607ab49ad064b953ebcfaf7193bb46ad34d4836c92270021c from 0xe492566270951f0630E5f3665900264f1E9232b1    {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:52:41.562Z        DEBUG   datacommittee/datacommittee.go:358      adding addr 003d77de9535385942629b182eeb104e82ac3fba    {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:52:41.562Z        DEBUG   datacommittee/datacommittee.go:358      adding addr 3dc4c719718a34b36765a9691b9d72acc0da4737    {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:52:41.562Z        DEBUG   datacommittee/datacommittee.go:358      adding addr 78fe7a1cc51c84a61cc172c4fb8c666e84d930c0    {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:52:41.562Z        DEBUG   datacommittee/datacommittee.go:358      adding addr 9e07d72b16bdbf8870b79c2421912d677ccf1f0f    {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:52:41.562Z        DEBUG   datacommittee/datacommittee.go:358      adding addr e492566270951f0630e5f3665900264f1e9232b1    {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:52:41.562Z        DEBUG   datacommittee/datacommittee.go:361      full res 7f729d16848dd7790de313f58aae0d7256f343af77933299d44426a7f7aa75ba24a43e10275ec3a73c9de23bfe9f0cf91bd5b99e183322db0302e758266c0baa1b9a40e6a054ffe939644330a53cac8b3e97faf9cc3ab28ca46fc234210e1027ea71d619a6bb75b608c607ab49ad064b953ebcfaf7193bb46ad34d4836c92270021c003d77de9535385942629b182eeb104e82ac3fba3dc4c719718a34b36765a9691b9d72acc0da473778fe7a1cc51c84a61cc172c4fb8c666e84d930c09e07d72b16bdbf8870b79c2421912d677ccf1f0fe492566270951f0630e5f3665900264f1e9232b1 {"pid": 40, "version": "v0.4.0-beta5", "module": "da-committee"}
2024-11-18T03:52:41.562Z        INFO    txbuilder/banana_validium.go:137        building banana sequence tx. AccInputHash: 0x23a7726c7ae88735622bc47e3b107a7f24ad6eb100aeeb95a14b0b7954537216   {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:41.617Z        INFO    sequencesender/sequencesender.go:523    latest virtual batch is 318     {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:42.064Z        DEBUG   ethtxmanager/ethtxmanager.go:482        found 0 monitored tx to process {"pid": 40}
2024-11-18T03:52:42.064Z        DEBUG   ethtxmanager/ethtxmanager.go:512        found 0 mined monitored tx to process   {"pid": 40}
2024-11-18T03:52:42.109Z        DEBUG   ethtxmanager/ethtxmanager.go:555        found 1 safe monitored tx to process    {"pid": 40}
2024-11-18T03:52:43.118Z        DEBUG   etherman/etherman.go:133        gasPrice chose: 1000037 {"pid": 40}
2024-11-18T03:52:43.118Z        INFO    ethtxmanager/ethtxmanager.go:327        created {"pid": 40, "types.MonitoredTx": "0x965c884cd4128e2efb5a81b5ffbf60689e5d061536c1087245b8d45a0ede0804", "createdAt": "0001-01-01T00:00:00.000Z"}
2024-11-18T03:52:43.119Z        INFO    sequencesender/ethtx.go:270     update transaction 0x965c884cd4128e2efb5a81b5ffbf60689e5d061536c1087245b8d45a0ede0804 to state created  {"pid": 40, "version": "v0.4.0-beta5"}
2024-11-18T03:52:43.119Z        INFO    sequencesender/sequencesender.go:275    batches purged count: 236, fromBatch: 83, toBatch: 318  {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:43.434Z        INFO    rpc/batch.go:46 Getting batch 321 from RPC      {"pid": 40, "version": "v0.4.0-beta5"}
2024-11-18T03:52:43.434Z        INFO    sequencesender/sequencesender.go:282    updating virtual batch  {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:43.435Z        INFO    rpc/batch.go:93 Getting l2 block timestamp from RPC. Block hash: 0xed474f23d41fa067d7da4f232afde3a50e43408d0a7f49bd6a4fb9c2d3be06e7     {"pid": 40, "version": "v0.4.0-beta5"}
2024-11-18T03:52:43.436Z        INFO    sequencesender/sequencesender.go:187    batch 321 is not closed yet     {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}

2024-11-18T03:52:44.558Z        INFO    sequencesender/sequencesender.go:523    latest virtual batch is 318     {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:44.558Z        INFO    sequencesender/sequencesender.go:295    updating tx results     {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:45.058Z        DEBUG   ethtxmanager/ethtxmanager.go:482        found 1 monitored tx to process {"pid": 40}
2024-11-18T03:52:45.058Z        INFO    ethtxmanager/ethtxmanager.go:592        processing      {"pid": 40, "monitoredTxId": "0x965c884cd4128e2efb5a81b5ffbf60689e5d061536c1087245b8d45a0ede0804", "createdAt": "2024-11-18T03:52:43.000Z", "from": "0x85472577b11837bC157F45643047Cb86136985f2", "to": "0x0d08b6F2f6c45a2EA67000C28b08D4591D2090ab"}
2024-11-18T03:52:45.058Z        DEBUG   ethtxmanager/ethtxmanager.go:607        unsigned tx 0x30ae0cceb8e8a986905030d7b0962e74a169a5ebbcf7b8c36c87d9a77b1e488c created  {"pid": 40, "monitoredTxId": "0x965c884cd4128e2efb5a81b5ffbf60689e5d061536c1087245b8d45a0ede0804", "createdAt": "2024-11-18T03:52:43.000Z", "from": "0x85472577b11837bC157F45643047Cb86136985f2", "to": "0x0d08b6F2f6c45a2EA67000C28b08D4591D2090ab"}
2024-11-18T03:52:45.058Z        DEBUG   ethtxmanager/ethtxmanager.go:615        signed tx 0x3af59cf181ccd16d12e99e32402e5c15d1fabed209a6fd0968bd2a6870c6517b created    {"pid": 40, "monitoredTxId": "0x965c884cd4128e2efb5a81b5ffbf60689e5d061536c1087245b8d45a0ede0804", "createdAt": "2024-11-18T03:52:43.000Z", "from": "0x85472577b11837bC157F45643047Cb86136985f2", "to": "0x0d08b6F2f6c45a2EA67000C28b08D4591D2090ab"}
2024-11-18T03:52:45.058Z        DEBUG   ethtxmanager/ethtxmanager.go:631        signed tx added to the monitored tx history     {"pid": 40, "monitoredTxId": "0x965c884cd4128e2efb5a81b5ffbf60689e5d061536c1087245b8d45a0ede0804", "createdAt": "2024-11-18T03:52:43.000Z", "from": "0x85472577b11837bC157F45643047Cb86136985f2", "to": "0x0d08b6F2f6c45a2EA67000C28b08D4591D2090ab"}
2024-11-18T03:52:46.560Z        DEBUG   ethtxmanager/ethtxmanager.go:638        signed tx not found in the network      {"pid": 40, "monitoredTxId": "0x965c884cd4128e2efb5a81b5ffbf60689e5d061536c1087245b8d45a0ede0804", "createdAt": "2024-11-18T03:52:43.000Z", "from": "0x85472577b11837bC157F45643047Cb86136985f2", "to": "0x0d08b6F2f6c45a2EA67000C28b08D4591D2090ab"}
2024-11-18T03:52:47.119Z        INFO    ethtxmanager/ethtxmanager.go:644        signed tx sent to the network: 0x3af59cf181ccd16d12e99e32402e5c15d1fabed209a6fd0968bd2a6870c6517b       {"pid": 40, "monitoredTxId": "0x965c884cd4128e2efb5a81b5ffbf60689e5d061536c1087245b8d45a0ede0804", "createdAt": "2024-11-18T03:52:43.000Z", "from": "0x85472577b11837bC157F45643047Cb86136985f2", "to": "0x0d08b6F2f6c45a2EA67000C28b08D4591D2090ab"}
2024-11-18T03:52:47.119Z        DEBUG   ethtxmanager/ethtxmanager.go:648        status changed to sent  {"pid": 40, "monitoredTxId": "0x965c884cd4128e2efb5a81b5ffbf60689e5d061536c1087245b8d45a0ede0804", "createdAt": "2024-11-18T03:52:43.000Z", "from": "0x85472577b11837bC157F45643047Cb86136985f2", "to": "0x0d08b6F2f6c45a2EA67000C28b08D4591D2090ab"}
2024-11-18T03:52:47.119Z        INFO    ethtxmanager/ethtxmanager.go:660        waiting signedTx to be mined... {"pid": 40}
2024-11-18T03:52:51.558Z        INFO    sequencesender/ethtx.go:270     update transaction 0x965c884cd4128e2efb5a81b5ffbf60689e5d061536c1087245b8d45a0ede0804 to state sent     {"pid": 40, "version": "v0.4.0-beta5"}
2024-11-18T03:52:51.559Z        INFO    sequencesender/ethtx.go:201     2 tx results synchronized (1 in pending state)  {"pid": 40, "version": "v0.4.0-beta5"}
2024-11-18T03:52:51.559Z        INFO    sequencesender/sequencesender.go:303    max number of pending txs (1) reached. Waiting for some to be completed {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:52.562Z        DEBUG   etherman/wait.go:96     Transaction successfully mined: 0x3af59cf181ccd16d12e99e32402e5c15d1fabed209a6fd0968bd2a6870c6517b      {"pid": 40}
2024-11-18T03:52:53.059Z        DEBUG   sync/evmdownloader.go:96        getting events from blocks 7099889 to  7099889  {"pid": 40, "version": "v0.4.0-beta5", "syncer": "l1infotreesync"}
2024-11-18T03:52:53.434Z        INFO    rpc/batch.go:46 Getting batch 321 from RPC      {"pid": 40, "version": "v0.4.0-beta5"}
2024-11-18T03:52:53.436Z        INFO    rpc/batch.go:93 Getting l2 block timestamp from RPC. Block hash: 0x7c525112f6a113ebef74c6612cf1bccd38d9d90da7eee5cdbea8d71905448459     {"pid": 40, "version": "v0.4.0-beta5"}
2024-11-18T03:52:53.437Z        INFO    sequencesender/sequencesender.go:187    batch 321 is not closed yet     {"pid": 40, "version": "v0.4.0-beta5", "module": "sequence-sender"}
2024-11-18T03:52:53.564Z        INFO    ethtxmanager/ethtxmanager.go:703        mined   {"pid": 40, "monitoredTxId": "0x965c884cd4128e2efb5a81b5ffbf60689e5d061536c1087245b8d45a0ede0804", "createdAt": "2024-11-18T03:52:43.000Z", "from": "0x85472577b11837bC157F45643047Cb86136985f2", "to": "0x0d08b6F2f6c45a2EA67000C28b08D4591D2090ab"}
2024-11-18T03:52:53.565Z        DEBUG   ethtxmanager/ethtxmanager.go:512        found 1 mined monitored tx to process   {"pid": 40}
2024-11-18T03:52:54.058Z        DEBUG   sync/evmdownloader.go:104       sending block 7099889 to the driver (without events)    {"pid": 40, "version": "v0.4.0-beta5", "syncer": "l1infotreesync"}
2024-11-18T03:52:54.558Z        DEBUG   ethtxmanager/ethtxmanager.go:555        found 1 safe monitored tx to process    {"pid": 40}
2024-11-18T03:52:55.057Z        DEBUG   sync/evmdownloader.go:89        waiting for new blocks, last block processed 7099889, last block seen on L1 7099889     {"pid": 40, "version": "v0.4.0-beta5", "syncer": "l1infotreesync"}

临时总结

该笔提交逻辑正常,说明确实存在逻辑卡住的问题,并且可以通过重启sequencesender恢复,
TODO 忙完继续跟进下,再做补充

注:当前提交batch时间间隔等于配置cfg.WaitPeriodSendSequence检查间隔,加上交易到达Finalized后的时间总和,交易为单笔发送,上一笔Finalized后才会发起下一笔。
对于sepolia测试网目前需要大约15-20分钟

TODO

首先SequenceSender会经过cfg.WaitPeriodSendSequence(默认15s)时间检查一次

func (s *SequenceSender) sequenceSending(ctx context.Context) {
..
    ticker := time.NewTicker(s.cfg.WaitPeriodSendSequence.Duration)
...
        case <-ticker.C:
            // Trigger the sequence sending when the ticker fires
            s.tryToSendSequence(ctx)
        }
    }
}

先看最终发送的逻辑

func (s *SequenceSender) tryToSendSequence(ctx context.Context) {
    // Update latest virtual batch
    s.logger.Infof("updating virtual batch")
    err := s.updateLatestVirtualBatch() // 获取RollupManager合约,通过RollupIDToRollupData获取rollupData->LastBatchSequenced,然后更新本地的latestVirtualBatchNumber存储
    if err != nil {
        return
    }

    // Check if the sequence sending is stopped
    if s.IsStopped() {
        s.logger.Warnf("sending is stopped!")
        return
    }

    // Update state of transactions
    s.logger.Infof("updating tx results")
    pendingTxsCount, err := s.syncEthTxResults(ctx)
    if err != nil {
        return
    }

    // Check if reached the maximum number of pending transactions
    if pendingTxsCount >= s.cfg.MaxPendingTx {
        s.logger.Infof("max number of pending txs (%d) reached. Waiting for some to be completed", pendingTxsCount)
        return
    }

    // Check if should send sequence to L1
    s.logger.Infof("getting sequences to send")
    sequence, err := s.getSequencesToSend(ctx)
    if err != nil || sequence == nil || sequence.Len() == 0 {
        if err != nil {
            s.logger.Errorf("error getting sequences: %v", err)
        }
        return
    }

    // Send sequences to L1
    firstBatch := sequence.FirstBatch()
    lastBatch := sequence.LastBatch()

    s.logger.Debugf(sequence.String())
    s.logger.Infof("sending sequences to L1. From batch %d to batch %d", firstBatch.BatchNumber(), lastBatch.BatchNumber())

    // Wait until last L1 block timestamp is L1BlockTimestampMargin seconds above the timestamp
    // of the last L2 block in the sequence
    timeMargin := int64(s.cfg.L1BlockTimestampMargin.Seconds())

    err = s.waitForMargin(ctx, lastBatch, timeMargin, "L1 block block timestamp",
        func() (uint64, error) {
            lastL1BlockHeader, err := s.etherman.GetLatestBlockHeader(ctx)
            if err != nil {
                return 0, err
            }

            return lastL1BlockHeader.Time, nil
        })
    if err != nil {
        s.logger.Errorf("error waiting for L1 block time margin: %v", err)
        return
    }

    // Sanity check: Wait until the current time is also L1BlockTimestampMargin seconds above the last L2 block timestamp
    err = s.waitForMargin(ctx, lastBatch, timeMargin, "current time",
        func() (uint64, error) { return uint64(time.Now().Unix()), nil })
    if err != nil {
        s.logger.Errorf("error waiting for current time margin: %v", err)
        return
    }

    // Send sequences to L1
    s.logger.Debugf(sequence.String())
    s.logger.Infof("sending sequences to L1. From batch %d to batch %d", firstBatch.BatchNumber(), lastBatch.BatchNumber())

    tx, err := s.TxBuilder.BuildSequenceBatchesTx(ctx, sequence) // 组装sequenceBatchesValidium交易
    if err != nil {
        s.logger.Errorf("error building sequenceBatches tx: %v", err)
        return
    }

    // Get latest virtual state batch from L1
    err = s.updateLatestVirtualBatch()
    if err != nil {
        s.logger.Fatalf("error getting latest sequenced batch, error: %v", err)
    }

    sequence.SetLastVirtualBatchNumber(atomic.LoadUint64(&s.latestVirtualBatchNumber))

    gas, err := s.etherman.EstimateGas(ctx, s.cfg.SenderAddress, tx.To(), nil, tx.Data())
    if err != nil {
        s.logger.Errorf("error estimating gas: ", err)
        return
    }

    // Add sequence tx
    err = s.sendTx(ctx, false, nil, tx.To(), firstBatch.BatchNumber(), lastBatch.BatchNumber(), tx.Data(), gas) // 发送sequenceBatchesValidium交易
    if err != nil {
        return
    }

    // Purge sequences data from memory
    s.purgeSequences()
}

polygon cdk 查看最新提交L1batch num

通过RPC

curl http://L2RPC访问地址/ \
  -X POST \
  -H "Content-Type: application/json" \
  --data '{"method":"zkevm_virtualBatchNumber","params":[],"id":1,"jsonrpc":"2.0"}'

例如返回

 curl http://172.18.39.103:8123/ \
>   -X POST \
>   -H "Content-Type: application/json" \
>   --data '{"method":"zkevm_virtualBatchNumber","params":[],"id":1,"jsonrpc":"2.0"}'
{"jsonrpc":"2.0","id":1,"result":"0x52"}

0x52对应10进制为82
https://tool.lu/hexconvert/

合约逻辑

function sequenceBatchesValidium(
        ValidiumBatchData[] calldata batches,
        uint32 l1InfoTreeLeafCount,
        uint64 maxSequenceTimestamp,
        bytes32 expectedFinalAccInputHash,
        address l2Coinbase,
        bytes calldata dataAvailabilityMessage
    ) external onlyTrustedSequencer {
        uint256 batchesNum = batches.length;
        if (batchesNum == 0) {
            revert SequenceZeroBatches();
        }

        if (batchesNum > _MAX_VERIFY_BATCHES) {
            revert ExceedMaxVerifyBatches();
        }

        // Check max sequence timestamp inside of range
        if (
            uint256(maxSequenceTimestamp) > (block.timestamp + TIMESTAMP_RANGE)
        ) {
            revert MaxTimestampSequenceInvalid();
        }

        // Update global exit root if there are new deposits
        bridgeAddress.updateGlobalExitRoot();

        // Get global batch variables
        bytes32 l1InfoRoot = globalExitRootManager.l1InfoRootMap(
            l1InfoTreeLeafCount
        );

        if (l1InfoRoot == bytes32(0)) {
            revert L1InfoTreeLeafCountInvalid();
        }

        // Store storage variables in memory, to save gas, because will be overrided multiple times
        uint64 currentLastForceBatchSequenced = lastForceBatchSequenced;
        bytes32 currentAccInputHash = lastAccInputHash;

        // Store in a temporal variable, for avoid access again the storage slot
        uint64 initLastForceBatchSequenced = currentLastForceBatchSequenced;

        for (uint256 i = 0; i < batchesNum; i++) {
            // Load current sequence
            ValidiumBatchData memory currentBatch = batches[i];

            // Check if it's a forced batch
            if (currentBatch.forcedTimestamp > 0) {
                currentLastForceBatchSequenced++;

                // Check forced data matches
                bytes32 hashedForcedBatchData = keccak256(
                    abi.encodePacked(
                        currentBatch.transactionsHash,
                        currentBatch.forcedGlobalExitRoot,
                        currentBatch.forcedTimestamp,
                        currentBatch.forcedBlockHashL1
                    )
                );

                if (
                    hashedForcedBatchData !=
                    forcedBatches[currentLastForceBatchSequenced]
                ) {
                    revert ForcedDataDoesNotMatch();
                }

                // Calculate next accumulated input hash
                currentAccInputHash = keccak256(
                    abi.encodePacked(
                        currentAccInputHash,
                        currentBatch.transactionsHash,
                        currentBatch.forcedGlobalExitRoot,
                        currentBatch.forcedTimestamp,
                        l2Coinbase,
                        currentBatch.forcedBlockHashL1
                    )
                );

                // Delete forceBatch data since won't be used anymore
                delete forcedBatches[currentLastForceBatchSequenced];
            } else {
                // Note that forcedGlobalExitRoot and forcedBlockHashL1 remain unused and unchecked in this path
                // The synchronizer should be aware of that

                // Calculate next accumulated input hash
                currentAccInputHash = keccak256(
                    abi.encodePacked(
                        currentAccInputHash,
                        currentBatch.transactionsHash,
                        l1InfoRoot,
                        maxSequenceTimestamp,
                        l2Coinbase,
                        bytes32(0)
                    )
                );
            }
        }

        // Sanity check, should be unreachable
        if (currentLastForceBatchSequenced > lastForceBatch) {
            revert ForceBatchesOverflow();
        }

        // Store back the storage variables
        lastAccInputHash = currentAccInputHash;

        uint256 nonForcedBatchesSequenced = batchesNum;

        // Check if there has been forced batches
        if (currentLastForceBatchSequenced != initLastForceBatchSequenced) {
            uint64 forcedBatchesSequenced = currentLastForceBatchSequenced -
                initLastForceBatchSequenced;
            // substract forced batches
            nonForcedBatchesSequenced -= forcedBatchesSequenced;

            // Transfer pol for every forced batch submitted
            pol.safeTransfer(
                address(rollupManager),
                calculatePolPerForceBatch() * (forcedBatchesSequenced)
            );

            // Store new last force batch sequenced
            lastForceBatchSequenced = currentLastForceBatchSequenced;
        }

        // Pay collateral for every non-forced batch submitted
        if (nonForcedBatchesSequenced != 0) {
            pol.safeTransferFrom(
                msg.sender,
                address(rollupManager),
                rollupManager.getBatchFee() * nonForcedBatchesSequenced
            );

            // Validate that the data availability protocol accepts the dataAvailabilityMessage
            // note This is a view function, so there's not much risk even if this contract was vulnerable to reentrant attacks
            dataAvailabilityProtocol.verifyMessage(
                expectedFinalAccInputHash,
                dataAvailabilityMessage
            );
        }

        uint64 currentBatchSequenced = rollupManager.onSequenceBatches(
            uint64(batchesNum),
            currentAccInputHash
        );

        // Check expectedFinalAccInputHash
        if (currentAccInputHash != expectedFinalAccInputHash) {
            revert FinalAccInputHashDoesNotMatch();
        }

        emit SequenceBatches(currentBatchSequenced, l1InfoRoot);
    }

查看举例交易:https://sepolia.etherscan.io/tx/0xdb8636d8853348d4d48df1d602a3ce6fe8c37c6be3c30ea9d83f2568e7562fa1#eventlog
对应事件:SequenceBatches

最新提交batch num: 82 与RPC 查询数据一致

CDK 部署或重置后第一笔交易

交易组装

 // Add the first batch of the created rollup
    const newZKEVMContract = (await PolygonconsensusFactory.attach(newZKEVMAddress)) as PolygonZkEVMV2;
    const batchData = {
        transactions: await newZKEVMContract.generateInitializeTransaction(
            rollupID,
            gasTokenAddress,
            gasTokenNetwork,
            gasTokenMetadata as any
        ),
        globalExitRoot: globalExitRoot,
        timestamp: timestampReceipt,
        sequencer: trustedSequencer,
    };

    outputJson.firstBatchData = batchData;

测试数据

"firstBatchData": {
  "transactions": "0xf901e480808401c9c38094d66bd4a99f128cab5723ab98443bdda0a8ae65d280b901c4f811bff700000000000000000000000000000000000000000000000000000000000000010000000000000000000000003ec3d234625cde1e0f3267014e26e193610e50ac0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a40d5f56745a118d0906a34e69aec8c0db1cb8fa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000084d4158546f6b656e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034d4158000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ca1ab1e0000000000000000000000000000000000000000000000000000000005ca1ab1e1bff",
  "globalExitRoot": "0xad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5",
  "timestamp": 1731804000,
  "sequencer": "0x85472577b11837bC157F45643047Cb86136985f2"
 }

第一个batch信息为

  1. 一笔zkEVM合约初始化交易
  2. globalExitRoot
  3. timestamp
  4. trustedSequencer

error: latest Synced BlockNumber (7089137) is higher than the latest Proposed block (1008) in the network

问题

cdk 跨链桥启动后,发起一笔跨链复现networkID数据错乱,重启后报错

2024-11-16T14:36:29.512Z        INFO    cmd/run.go:59   main network id: 0      {"pid": 1, "version": "v0.6.0-RC1"}
2024-11-16T14:36:29.512Z        INFO    cmd/run.go:64   l2 network id: 0        {"pid": 1, "version": "v0.6.0-RC1"}
2024-11-16T14:36:29.542Z        DEBUG   cmd/run.go:102  trusted sequencer URL http://172.18.39.103:8123 {"pid": 1, "version": "v0.6.0-RC1"}
2024-11-16T14:36:29.542Z        INFO    server/server.go:93     gRPC Server is serving at 9090  {"pid": 1, "version": "v0.6.0-RC1"}
2024-11-16T14:36:29.542Z        INFO    server/server.go:166    Restful Server is serving at 8080       {"pid": 1, "version": "v0.6.0-RC1"}
2024-11-16T14:36:29.548Z        INFO    synchronizer/synchronizer.go:104        NetworkID: 0, Synchronization started   {"pid": 1, "version": "v0.6.0-RC1"}
2024-11-16T14:36:29.549Z        DEBUG   synchronizer/synchronizer.go:119        NetworkID: 0, initial lastBlockSynced: &{ID:3 BlockNumber:7089137 BlockHash:0xbcb0638af2a8014b561ee72c2f568bda819039ca93f16c7de22896fc1037c1a3 ParentHash:0x919c0185dfa6dbc92fb9e13f535c09130d04d1f980749b952b057ffed68f77b6 NetworkID:0 GlobalExitRoots:[] Deposits:[] Claims:[] Tokens:[] VerifiedBatches:[] ActivateEtrog:[] ReceivedAt:2024-11-16 13:48:00 +0000 UTC}     {"pid": 1, "version": "v0.6.0-RC1"}
2024-11-16T14:36:29.549Z        DEBUG   synchronizer/synchronizer.go:126        NetworkID: 0, syncing...        {"pid": 1, "version": "v0.6.0-RC1"}
2024-11-16T14:36:29.550Z        INFO    synchronizer/synchronizer.go:543        NetworkID: 0, [checkReorg function] Checking Block 7089137 in L1        {"pid": 1, "version": "v0.6.0-RC1"}
2024-11-16T14:36:29.553Z        ERROR   synchronizer/synchronizer.go:546        networkID: 0, error getting latest block synced from blockchain. Block: 7089137, error: Not found%!(EXTRA string=
/src/log/log.go:142 github.com/0xPolygonHermez/zkevm-bridge-service/log.appendStackTraceMaybeArgs()
/src/log/log.go:251 github.com/0xPolygonHermez/zkevm-bridge-service/log.Errorf()
/src/synchronizer/synchronizer.go:546 github.com/0xPolygonHermez/zkevm-bridge-service/synchronizer.(*ClientSynchronizer).checkReorg()
/src/synchronizer/synchronizer.go:239 github.com/0xPolygonHermez/zkevm-bridge-service/synchronizer.(*ClientSynchronizer).syncBlocks()
/src/synchronizer/synchronizer.go:128 github.com/0xPolygonHermez/zkevm-bridge-service/synchronizer.(*ClientSynchronizer).Sync()
/src/cmd/run.go:245 main.runSynchronizer()
)       {"pid": 1, "version": "v0.6.0-RC1"}
github.com/0xPolygonHermez/zkevm-bridge-service/synchronizer.(*ClientSynchronizer).checkReorg
        /src/synchronizer/synchronizer.go:546
github.com/0xPolygonHermez/zkevm-bridge-service/synchronizer.(*ClientSynchronizer).syncBlocks
        /src/synchronizer/synchronizer.go:239
github.com/0xPolygonHermez/zkevm-bridge-service/synchronizer.(*ClientSynchronizer).Sync
        /src/synchronizer/synchronizer.go:128
main.runSynchronizer
        /src/cmd/run.go:245
2024-11-16T14:36:29.553Z        ERROR   synchronizer/synchronizer.go:241        networkID: 0, error checking reorgs. Retrying... Err: Not found {"pid": 1, "version": "v0.6.0-RC1"}
github.com/0xPolygonHermez/zkevm-bridge-service/synchronizer.(*ClientSynchronizer).syncBlocks
        /src/synchronizer/synchronizer.go:241
github.com/0xPolygonHermez/zkevm-bridge-service/synchronizer.(*ClientSynchronizer).Sync
        /src/synchronizer/synchronizer.go:128
main.runSynchronizer
        /src/cmd/run.go:245
2024-11-16T14:36:29.553Z        WARN    synchronizer/synchronizer.go:129        networkID: 0, error syncing blocks: networkID: 0, error checking reorgs {"pid": 1, "version": "v0.6.0-RC1"}
github.com/0xPolygonHermez/zkevm-bridge-service/synchronizer.(*ClientSynchronizer).Sync
        /src/synchronizer/synchronizer.go:129
main.runSynchronizer
        /src/cmd/run.go:245
2024-11-16T14:36:29.554Z        FATAL   synchronizer/synchronizer.go:161        networkID: 0, error: latest Synced BlockNumber (7089137) is higher than the latest Proposed block (1008) in the network {"pid": 1, "version": "v0.6.0-RC1"}
github.com/0xPolygonHermez/zkevm-bridge-service/synchronizer.(*ClientSynchronizer).Sync
        /src/synchronizer/synchronizer.go:161
main.runSynchronizer
        /src/cmd/run.go:245
2024-11-16T14:37:29.896Z        INFO    cmd/run.go:26   Starting application    {"pid": 1, "version": "v0.6.0-RC1", "gitRevision": "002f436", "gitBranch": "HEAD", "goVersion": "go1.21.13", "built": "Thu, 26 Sep 2024 10:05:53 +0000", "os/arch": "linux/amd64"}
2024-11-16T14:37:29.915Z        INFO    pgstorage/utils.go:63   successfully ran 0 migrations   {"pid": 1, "version": "v0.6.0-RC1"}
2024-11-16T14:37:29.923Z        WARN    etherman/etherman.go:187        Claim compressor Address not configured {"pid": 1, "version": "v0.6.0-RC1"}
github.com/0xPolygonHermez/zkevm-bridge-service/etherman.NewL2Client
        /src/etherman/etherman.go:187
main.newEthermans
        /src/cmd/run.go:230
main.start
        /src/cmd/run.go:52
github.com/urfave/cli/v2.(*Command).Run
        /go/pkg/mod/github.com/urfave/cli/v2@v2.27.4/command.go:276
github.com/urfave/cli/v2.(*Command).Run
        /go/pkg/mod/github.com/urfave/cli/v2@v2.27.4/command.go:269
github.com/urfave/cli/v2.(*App).RunContext
        /go/pkg/mod/github.com/urfave/cli/v2@v2.27.4/app.go:333
github.com/urfave/cli/v2.(*App).Run
        /go/pkg/mod/github.com/urfave/cli/v2@v2.27.4/app.go:307
main.main
        /src/cmd/main.go:56
runtime.main
        /usr/local/go/src/runtime/proc.go:267
func (s *ClientSynchronizer) Sync() error {
    lastBlockSynced, err := s.storage.GetLastBlock(s.ctx, s.networkID, nil)
    ....
    if !s.synced {
                // Check latest Block
                header, err := s.etherMan.HeaderByNumber(s.ctx, nil)
                if err != nil {
                    log.Warnf("networkID: %d, error getting latest block from. Error: %s", s.networkID, err.Error())
                    continue
                }
                lastKnownBlock := header.Number.Uint64()
                if lastBlockSynced.BlockNumber == lastKnownBlock && !s.synced {
                    log.Infof("NetworkID %d Synced!", s.networkID)
                    waitDuration = s.cfg.SyncInterval.Duration
                    s.synced = true
                    s.chSynced <- s.networkID
                }
                if lastBlockSynced.BlockNumber > lastKnownBlock {
                    if s.networkID == 0 {
                        log.Fatalf("networkID: %d, error: latest Synced BlockNumber (%d) is higher than the latest Proposed block (%d) in the network", s.networkID, lastBlockSynced.BlockNumber, lastKnownBlock)
                    } 

lastBlockSynced = 7089137
lastKnownBlock = 1008

lastBlockSynced为L1数据,lastKnownBlock为L2数据,说明s.etherMan应使用L1 RPC,目前使用了L2RPC导致出错
s.storage.GetLastBlock查询时有networkID区分,所以被对比数据是正确的
s.networkID等于0, s.etherMan使用的L2 RPC, 也就是networkID与etherMan对应关系乱了

func runSynchronizer(ctx context.Context, genBlockNumber uint64, brdigeCtrl *bridgectrl.BridgeController, etherman *etherman.Client, cfg synchronizer.Config, storage db.Storage, zkEVMClient *client.Client, chExitRootEventL2 chan *etherman.GlobalExitRoot, chsExitRootEvent []chan *etherman.GlobalExitRoot, chSynced chan uint, allNetworkIDs []uint) {
    sy, err := synchronizer.NewSynchronizer(ctx, storage, brdigeCtrl, etherman, zkEVMClient, genBlockNumber, chExitRootEventL2, chsExitRootEvent, chSynced, cfg, allNetworkIDs)
    if err != nil {
        log.Fatal(err)
    }
    if err := sy.Sync(); err != nil {
        log.Fatal(err)
    }
}
for i, l2EthermanClient := range l2Ethermans {
        log.Debug("trusted sequencer URL ", c.Etherman.L2URLs[i])
        zkEVMClient := client.NewClient(c.Etherman.L2URLs[i])
        chExitRootEventL2 := make(chan *etherman.GlobalExitRoot)
        chSyncedL2 := make(chan uint)
        chsExitRootEvent = append(chsExitRootEvent, chExitRootEventL2)
        chsSyncedL2 = append(chsSyncedL2, chSyncedL2)
        go runSynchronizer(ctx.Context, 0, bridgeController, l2EthermanClient, c.Synchronizer, storage, zkEVMClient, chExitRootEventL2, nil, chSyncedL2, []uint{})
    }
    chSynced := make(chan uint)
    go runSynchronizer(ctx.Context, c.NetworkConfig.GenBlockNumber, bridgeController, l1Etherman, c.Synchronizer, storage, nil, nil, chsExitRootEvent, chSynced, networkIDs)
func newEthermans(c *config.Config) (*etherman.Client, []*etherman.Client, error) {
    l1Etherman, err := etherman.NewClient(c.Etherman,
        c.NetworkConfig.PolygonBridgeAddress,
        c.NetworkConfig.PolygonZkEVMGlobalExitRootAddress,
        c.NetworkConfig.PolygonRollupManagerAddress)
    if err != nil {
        log.Error("L1 etherman error: ", err)
        return nil, nil, err
    }
    if len(c.L2PolygonBridgeAddresses) != len(c.Etherman.L2URLs) {
        log.Fatal("environment configuration error. zkevm bridge addresses and zkevm node urls mismatch")
    }
    var l2Ethermans []*etherman.Client
    for i, addr := range c.L2PolygonBridgeAddresses {
        l2Etherman, err := etherman.NewL2Client(c.Etherman.L2URLs[i], addr, c.NetworkConfig.L2ClaimCompressorAddress)
        if err != nil {
            log.Error("L2 etherman ", i, c.Etherman.L2URLs[i], ", error: ", err)
            return l1Etherman, nil, err
        }
        l2Ethermans = append(l2Ethermans, l2Etherman)
    }
    return l1Etherman, l2Ethermans, nil
}

对于l1Etherman networkID直接没有赋值,所以等于0

func NewClient(cfg Config, polygonBridgeAddr, polygonZkEVMGlobalExitRootAddress, polygonRollupManagerAddress common.Address) (*Client, error) {
    logger := log.WithFields("networkID", 0)
    // Connect to ethereum node
    ethClient, err := ethclient.Dial(cfg.L1URL)

对于l2Etherman,经过NewL2Client

func NewL2Client(url string, polygonBridgeAddr, claimCompressorAddress common.Address) (*Client, error) {
    // Connect to ethereum node
    ethClient, err := ethclient.Dial(url)
    if err != nil {
        log.Errorf("error connecting to %s: %+v", url, err)
        return nil, err
    }
    // Create smc clients
    bridge, err := polygonzkevmbridge.NewPolygonzkevmbridge(polygonBridgeAddr, ethClient)
    if err != nil {
        return nil, err
    }
    oldpolygonBridge, err := oldpolygonzkevmbridge.NewOldpolygonzkevmbridge(polygonBridgeAddr, ethClient)
    if err != nil {
        return nil, err
    }
    var claimCompressor *claimcompressor.Claimcompressor
    if claimCompressorAddress == (common.Address{}) {
        log.Warn("Claim compressor Address not configured")
    } else {
        log.Infof("Grouping claims allowed, claimCompressor=%s", claimCompressorAddress.String())
        claimCompressor, err = claimcompressor.NewClaimcompressor(claimCompressorAddress, ethClient)
        if err != nil {
            log.Errorf("error creating claimCompressor: %+v", err)
            return nil, err
        }
    }
    networkID, err := bridge.NetworkID(&bind.CallOpts{Pending: false}) // 从合约读取
    if err != nil {
        return nil, err
    }
    scAddresses := []common.Address{polygonBridgeAddr}
    logger := log.WithFields("networkID", networkID)

    return &Client{
        logger:           logger,
        EtherClient:      ethClient,
        PolygonBridge:    bridge,
        OldPolygonBridge: oldpolygonBridge,
        SCAddresses:      scAddresses,
        ClaimCompressor:  claimCompressor,
        NetworkID:        networkID,
    }, nil
}

对于L2 会使用对应的L2 RPC从二层桥合约读取对应的NetworkID

// Solidity: function networkID() view returns(uint32)
func (_Polygonzkevmbridge *PolygonzkevmbridgeCaller) NetworkID(opts *bind.CallOpts) (uint32, error) {
    var out []interface{}
    err := _Polygonzkevmbridge.contract.Call(opts, &out, "networkID")

    if err != nil {
        return *new(uint32), err
    }

    out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32)

    return out0, err

}

查询二层networkID,确实是0
目前的问题就是因为二层桥合约错误的设置了networkID,导致逻辑错乱,进一步分析下,二层networkID什么时候设置的,如何导致的错误
经过确认,PolygonZkEVMBridgeV2合约没有初始化

结论

经过确认和重置对比测试,该错误是因为当时部署时RPC不稳定造成的交易丢失,所以部署时尽量选择稳定的RPC以及对应链相对空闲时段部署,并且部署完成后检查一下L2的networkID是否为1

polygon cdk 跨链桥交易处理流程分析

数据产生

synchronizer/synchronizer.go

func (s *ClientSynchronizer) syncBlocks(lastBlockSynced *etherman.Block) (*etherman.Block, error) {
...
blocks, order, err := s.etherMan.GetRollupInfoByBlockRange(s.ctx, fromBlock, &toBlock)

etherMan.readEvents

func (etherMan *Client) GetRollupInfoByBlockRange(ctx context.Context, fromBlock uint64, toBlock *uint64) ([]Block, map[common.Hash][]Order, error) {
    // Filter query
    query := ethereum.FilterQuery{
        FromBlock: new(big.Int).SetUint64(fromBlock),
        Addresses: etherMan.SCAddresses,
        Topics:    [][]common.Hash{{updateGlobalExitRootSignatureHash, updateL1InfoTreeSignatureHash, depositEventSignatureHash, claimEventSignatureHash, oldClaimEventSignatureHash, newWrappedTokenEventSignatureHash, verifyBatchesTrustedAggregatorSignatureHash, rollupManagerVerifyBatchesSignatureHash}},
    }
    if toBlock != nil {
        query.ToBlock = new(big.Int).SetUint64(*toBlock)
    }
    blocks, blocksOrder, err := etherMan.readEvents(ctx, query)
    if err != nil {
        return nil, nil, err
    }
    return blocks, blocksOrder, nil
}
func (etherMan *Client) readEvents(ctx context.Context, query ethereum.FilterQuery) ([]Block, map[common.Hash][]Order, error) {
    logs, err := etherMan.EtherClient.FilterLogs(ctx, query)
    if err != nil {
        return nil, nil, err
    }
    var blocks []Block
    blocksOrder := make(map[common.Hash][]Order)
    for _, vLog := range logs {
        err := etherMan.processEvent(ctx, vLog, &blocks, &blocksOrder)
func (etherMan *Client) processEvent(ctx context.Context, vLog types.Log, blocks *[]Block, blocksOrder *map[common.Hash][]Order) error {
    switch vLog.Topics[0] {
    case updateGlobalExitRootSignatureHash:
        return etherMan.updateGlobalExitRootEvent(ctx, vLog, blocks, blocksOrder)
updateGlobalExitRootSignatureHash              = crypto.Keccak256Hash([]byte("UpdateGlobalExitRoot(bytes32,bytes32)"))
func (etherMan *Client) updateGlobalExitRootEvent(ctx context.Context, vLog types.Log, blocks *[]Block, blocksOrder *map[common.Hash][]Order) error {
    etherMan.logger.Debug("UpdateGlobalExitRoot event detected. Processing...")
    return etherMan.processUpdateGlobalExitRootEvent(ctx, vLog.Topics[1], vLog.Topics[2], vLog, blocks, blocksOrder)
}
func (etherMan *Client) processUpdateGlobalExitRootEvent(ctx context.Context, mainnetExitRoot, rollupExitRoot common.Hash, vLog types.Log, blocks *[]Block, blocksOrder *map[common.Hash][]Order) error {
    var gExitRoot GlobalExitRoot
    gExitRoot.ExitRoots = make([]common.Hash, 0)
    gExitRoot.ExitRoots = append(gExitRoot.ExitRoots, mainnetExitRoot)
    gExitRoot.ExitRoots = append(gExitRoot.ExitRoots, rollupExitRoot)
    gExitRoot.GlobalExitRoot = hash(mainnetExitRoot, rollupExitRoot)
    gExitRoot.BlockNumber = vLog.BlockNumber

    if len(*blocks) == 0 || ((*blocks)[len(*blocks)-1].BlockHash != vLog.BlockHash || (*blocks)[len(*blocks)-1].BlockNumber != vLog.BlockNumber) {
        fullBlock, err := etherMan.EtherClient.HeaderByHash(ctx, vLog.BlockHash)
        if err != nil {
            return fmt.Errorf("error getting hashParent. BlockNumber: %d. Error: %v", vLog.BlockNumber, err)
        }
        t := time.Unix(int64(fullBlock.Time), 0)
        block := prepareBlock(vLog, t, fullBlock)
        block.GlobalExitRoots = append(block.GlobalExitRoots, gExitRoot)
        *blocks = append(*blocks, block)
    } else if (*blocks)[len(*blocks)-1].BlockHash == vLog.BlockHash && (*blocks)[len(*blocks)-1].BlockNumber == vLog.BlockNumber {
        (*blocks)[len(*blocks)-1].GlobalExitRoots = append((*blocks)[len(*blocks)-1].GlobalExitRoots, gExitRoot)
    } else {
        etherMan.logger.Error("Error processing UpdateGlobalExitRoot event. BlockHash:", vLog.BlockHash, ". BlockNumber: ", vLog.BlockNumber)
        return fmt.Errorf("error processing UpdateGlobalExitRoot event")
    }
    or := Order{
        Name: GlobalExitRootsOrder,
        Pos:  len((*blocks)[len(*blocks)-1].GlobalExitRoots) - 1,
    }
    (*blocksOrder)[(*blocks)[len(*blocks)-1].BlockHash] = append((*blocksOrder)[(*blocks)[len(*blocks)-1].BlockHash], or)
    return nil
}
GlobalExitRootsOrder EventOrder = "GlobalExitRoot"
func (s *ClientSynchronizer) syncBlocks(lastBlockSynced *etherman.Block) (*etherman.Block, error) {
...
err = s.processBlockRange(blocks, order)
func (s *ClientSynchronizer) processBlockRange(blocks []etherman.Block, order map[common.Hash][]etherman.Order) error {
    ...
    for _, element := range order[blocks[i].BlockHash] {
            switch element.Name {
            case etherman.GlobalExitRootsOrder:
                isNewGer = true
                err = s.processGlobalExitRoot(blocks[i].GlobalExitRoots[element.Pos], blockID, dbTx)
func (s *ClientSynchronizer) processGlobalExitRoot(globalExitRoot etherman.GlobalExitRoot, blockID uint64, dbTx pgx.Tx) error {
    // Store GlobalExitRoot
    globalExitRoot.BlockID = blockID
    err := s.storage.AddGlobalExitRoot(s.ctx, &globalExitRoot, dbTx)
func (p *PostgresStorage) AddGlobalExitRoot(ctx context.Context, exitRoot *etherman.GlobalExitRoot, dbTx pgx.Tx) error {
    const addExitRootSQL = "INSERT INTO sync.exit_root (block_id, global_exit_root, exit_roots) VALUES ($1, $2, $3)"
    e := p.getExecQuerier(dbTx)
    _, err := e.Exec(ctx, addExitRootSQL, exitRoot.BlockID, exitRoot.GlobalExitRoot, pq.Array([][]byte{exitRoot.ExitRoots[0][:], exitRoot.ExitRoots[1][:]}))
    return err
}

数据消费

var chsExitRootEvent []chan *etherman.GlobalExitRoot
    var chsSyncedL2 []chan uint
    for i, l2EthermanClient := range l2Ethermans {
        log.Debug("trusted sequencer URL ", c.Etherman.L2URLs[i])
        zkEVMClient := client.NewClient(c.Etherman.L2URLs[i])
        chExitRootEventL2 := make(chan *etherman.GlobalExitRoot)
        chSyncedL2 := make(chan uint)
        chsExitRootEvent = append(chsExitRootEvent, chExitRootEventL2)
        chsSyncedL2 = append(chsSyncedL2, chSyncedL2)
        go runSynchronizer(ctx.Context, 0, bridgeController, l2EthermanClient, c.Synchronizer, storage, zkEVMClient, chExitRootEventL2, nil, chSyncedL2, []uint{})
    }
func runSynchronizer(ctx context.Context, genBlockNumber uint64, brdigeCtrl *bridgectrl.BridgeController, etherman *etherman.Client, cfg synchronizer.Config, storage db.Storage, zkEVMClient *client.Client, chExitRootEventL2 chan *etherman.GlobalExitRoot, chsExitRootEvent []chan *etherman.GlobalExitRoot, chSynced chan uint, allNetworkIDs []uint) {
    sy, err := synchronizer.NewSynchronizer(ctx, storage, brdigeCtrl, etherman, zkEVMClient, genBlockNumber, chExitRootEventL2, chsExitRootEvent, chSynced, cfg, allNetworkIDs)
func (s *ClientSynchronizer) processBlockRange(blocks []etherman.Block, order map[common.Hash][]etherman.Order) error {
    var isNewGer bool
    for i := range blocks {
    ...
    for _, element := range order[blocks[i].BlockHash] {
            switch element.Name {
            case etherman.GlobalExitRootsOrder:
                isNewGer = true
                err = s.processGlobalExitRoot(blocks[i].GlobalExitRoots[element.Pos], blockID, dbTx)
    ...
    if isNewGer {
        // Send latest GER stored to claimTxManager
        ger, err := s.storage.GetLatestL1SyncedExitRoot(s.ctx, nil)
        if err != nil {
            log.Errorf("networkID: %d, error getting latest GER stored on database. Error: %v", s.networkID, err)
            return err
        }
        if s.l1RollupExitRoot != ger.ExitRoots[1] {
            log.Debugf("Updating ger: %+v", ger)
            s.l1RollupExitRoot = ger.ExitRoots[1]
            for _, ch := range s.chsExitRootEvent {
                ch <- ger
            }
        }
    }
func (s *ClientSynchronizer) processGlobalExitRoot(globalExitRoot etherman.GlobalExitRoot, blockID uint64, dbTx pgx.Tx) error {
    // Store GlobalExitRoot
    globalExitRoot.BlockID = blockID
    err := s.storage.AddGlobalExitRoot(s.ctx, &globalExitRoot, dbTx)
func (p *PostgresStorage) GetLatestL1SyncedExitRoot(ctx context.Context, dbTx pgx.Tx) (*etherman.GlobalExitRoot, error) {
    var (
        ger       etherman.GlobalExitRoot
        exitRoots [][]byte
    )
    const getLatestL1SyncedExitRootSQL = "SELECT block_id, global_exit_root, exit_roots FROM sync.exit_root WHERE block_id > 0 AND network_id = 0 ORDER BY id DESC LIMIT 1"
    err := p.getExecQuerier(dbTx).QueryRow(ctx, getLatestL1SyncedExitRootSQL).Scan(&ger.BlockID, &ger.GlobalExitRoot, pq.Array(&exitRoots))
    if err != nil {
        if errors.Is(err, pgx.ErrNoRows) {
            return &ger, gerror.ErrStorageNotFound
        }
        return nil, err
    }
    ger.ExitRoots = []common.Hash{common.BytesToHash(exitRoots[0]), common.BytesToHash(exitRoots[1])}
    return &ger, nil
}
func start(ctx *cli.Context) error {
    if c.ClaimTxManager.Enabled {
        for i := 0; i < len(c.Etherman.L2URLs); i++ {
            ...
            claimTxManager, err := claimtxman.NewClaimTxManager(ctx, c.ClaimTxManager, chsExitRootEvent[i], chsSyncedL2[i],
                c.Etherman.L2URLs[i], networkIDs[i+1], c.NetworkConfig.L2PolygonBridgeAddresses[i], bridgeService, storage, rollupID, l2Ethermans[i], nonceCache, auth)
func (tm *ClaimTxManager) Start() {
        ...
        case ger = <-tm.chExitRootEvent:
            if tm.synced {
                log.Debugf("RollupID: %d UpdateDepositsStatus for ger: %s", tm.rollupID, ger.GlobalExitRoot.String())
                if tm.cfg.GroupingClaims.Enabled {
                    log.Debugf("rollupID: %d, Ger value updated and ready to be processed...", tm.rollupID)
                    continue
                }
                go func() {
                    err := tm.updateDepositsStatus(ger)
                    if err != nil {
                        log.Errorf("rollupID: %d, failed to update deposits status: %v", tm.rollupID, err)
                    }
                }()
func (tm *ClaimTxManager) updateDepositsStatus(ger *etherman.GlobalExitRoot) error {
    dbTx, err := tm.storage.BeginDBTransaction(tm.ctx)
    if err != nil {
        return err
    }
    err = tm.processDepositStatus(ger, dbTx)
func (tm *ClaimTxManager) processDepositStatus(ger *etherman.GlobalExitRoot, dbTx pgx.Tx) error {
    if ger.BlockID != 0 { // L2 exit root is updated
...
    } else { // L1 exit root is updated in the trusted state
        log.Infof("RollupID: %d, Mainnet exitroot %v is updated", tm.rollupID, ger.ExitRoots[0])
        deposits, err := tm.storage.UpdateL1DepositsStatus(tm.ctx, ger.ExitRoots[0][:], tm.l2NetworkID, dbTx)
func (p *PostgresStorage) UpdateL1DepositsStatus(ctx context.Context, exitRoot []byte, destinationNetwork uint, dbTx pgx.Tx) ([]*etherman.Deposit, error) {
    const updateDepositsStatusSQL = `UPDATE sync.deposit SET ready_for_claim = true 

合约分析

PolygonZkEVMGlobalExitRoot.sol

function updateExitRoot(bytes32 newRoot) external {
        ...
        // If it already exists, do not modify the timestamp
        if (globalExitRootMap[newGlobalExitRoot] == 0) {
            globalExitRootMap[newGlobalExitRoot] = block.timestamp;
            emit UpdateGlobalExitRoot(
                cacheLastMainnetExitRoot,
                cacheLastRollupExitRoot
            );
        }
    }

PolygonZkEVMGlobalExitRootV2.sol

function updateExitRoot(bytes32 newRoot) external {
        ...
            emit UpdateL1InfoTree(
                cacheLastMainnetExitRoot,
                cacheLastRollupExitRoot
            );

            emit UpdateL1InfoTreeV2(
                currentL1InfoRoot,
                uint32(depositCount),
                lastBlockHash,
                currentTimestmap
            );
        }
    }
func (etherMan *Client) processEvent(ctx context.Context, vLog types.Log, blocks *[]Block, blocksOrder *map[common.Hash][]Order) error {
    switch vLog.Topics[0] {
...
    case updateL1InfoTreeSignatureHash:
        return etherMan.updateL1InfoTreeEvent(ctx, vLog, blocks, blocksOrder)
func (etherMan *Client) updateL1InfoTreeEvent(ctx context.Context, vLog types.Log, blocks *[]Block, blocksOrder *map[common.Hash][]Order) error {
    etherMan.logger.Debug("UpdateL1InfoTree event detected")
    globalExitRoot, err := etherMan.PolygonZkEVMGlobalExitRoot.ParseUpdateL1InfoTree(vLog)
    if err != nil {
        return err
    }
    return etherMan.processUpdateGlobalExitRootEvent(ctx, globalExitRoot.MainnetExitRoot, globalExitRoot.RollupExitRoot, vLog, blocks, blocksOrder)
}
if isNewGer {
        // Send latest GER stored to claimTxManager
        ger, err := s.storage.GetLatestL1SyncedExitRoot(s.ctx, nil)
        if err != nil {
            log.Errorf("networkID: %d, error getting latest GER stored on database. Error: %v", s.networkID, err)
            return err
        }
        if s.l1RollupExitRoot != ger.ExitRoots[1] {
            log.Debugf("Updating ger: %+v", ger)
            s.l1RollupExitRoot = ger.ExitRoots[1]
            for _, ch := range s.chsExitRootEvent {
                ch <- ger
            }
        }
    }
func (p *PostgresStorage) GetLatestL1SyncedExitRoot(ctx context.Context, dbTx pgx.Tx) (*etherman.GlobalExitRoot, error) {
    var (
        ger       etherman.GlobalExitRoot
        exitRoots [][]byte
    )
    const getLatestL1SyncedExitRootSQL = "SELECT block_id, global_exit_root, exit_roots FROM sync.exit_root WHERE block_id > 0 AND network_id = 0 ORDER BY id DESC LIMIT 1"
    err := p.getExecQuerier(dbTx).QueryRow(ctx, getLatestL1SyncedExitRootSQL).Scan(&ger.BlockID, &ger.GlobalExitRoot, pq.Array(&exitRoots))
    if err != nil {
        if errors.Is(err, pgx.ErrNoRows) {
            return &ger, gerror.ErrStorageNotFound
        }
        return nil, err
    }
    ger.ExitRoots = []common.Hash{common.BytesToHash(exitRoots[0]), common.BytesToHash(exitRoots[1])}
    return &ger, nil
}

// TODO 继续分析

总和分析

  1. PolygonZkEVMGlobalExitRoot合约升级到V2后,UpdateGlobalExitRoot事件由UpdateL1InfoTree代替,但是桥合约内部是统一处理的,不存在兼容性
  2. 数据库查看对应数据
    SELECT block_id, global_exit_root, exit_roots FROM sync.exit_root;

    block_id | global_exit_root| exit_roots

    1 | \x304fb89608cfb05e5eac3b9e7c70df5821e03b6f8166baf4192f4d921c44f651 | {"\\x76ab2578418da24f3754ecfdef1de5ff8631ca577f998799287eee91b4aace2c","\\x0000000000000000000000000000000000000000000000000000000000000000"}
    2 | \x8c9a2fea84f58dc994dac422ab7ee94238643f976de700a25ec3c5701b5acf32 | {"\\xcc7402af30b35a4ee3d5b793cfed1678ae8529e7ffa79e75ae2e4baaa890df21","\\x0000000000000000000000000000000000000000000000000000000000000000"}
    0 | \x8c9a2fea84f58dc994dac422ab7ee94238643f976de700a25ec3c5701b5acf32 | {"\\xcc7402af30b35a4ee3d5b793cfed1678ae8529e7ffa79e75ae2e4baaa890df21","\\x0000000000000000000000000000000000000000000000000000000000000000"}