From 00f77f8388647d7bb51b755d8bcd2e2851c53403 Mon Sep 17 00:00:00 2001 From: GarmashAlex Date: Wed, 26 Nov 2025 22:49:52 +0300 Subject: [PATCH 1/2] contracts/deposit: cache parsed ABI and avoid per-call parsing --- contracts/deposit/logs.go | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/contracts/deposit/logs.go b/contracts/deposit/logs.go index 5b1684779fe7..ed1bf689fb39 100644 --- a/contracts/deposit/logs.go +++ b/contracts/deposit/logs.go @@ -1,24 +1,29 @@ package deposit import ( - "bytes" + "strings" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/pkg/errors" ) -// UnpackDepositLogData unpacks the data from a deposit log using the ABI decoder. -func UnpackDepositLogData(data []byte) (pubkey, withdrawalCredentials, amount, signature, index []byte, err error) { - reader := bytes.NewReader([]byte(DepositContractABI)) - contractAbi, err := abi.JSON(reader) +// parsed ABI cached at package level to avoid reparsing on every log unpack +var depositABI abi.ABI + +func init() { + var err error + depositABI, err = abi.JSON(strings.NewReader(DepositContractABI)) if err != nil { - return nil, nil, nil, nil, nil, errors.Wrap(err, "unable to generate contract abi") + // DepositContractABI is a constant generated from the contract; failure here is unrecoverable + panic(err) } +} - unpackedLogs, err := contractAbi.Unpack("DepositEvent", data) - if err != nil { +// UnpackDepositLogData unpacks the data from a deposit log using the ABI decoder. +func UnpackDepositLogData(data []byte) (pubkey, withdrawalCredentials, amount, signature, index []byte, err error) { + evt := new(DepositContractDepositEvent) + if err := depositABI.UnpackIntoInterface(evt, "DepositEvent", data); err != nil { return nil, nil, nil, nil, nil, errors.Wrap(err, "unable to unpack logs") } - - return unpackedLogs[0].([]byte), unpackedLogs[1].([]byte), unpackedLogs[2].([]byte), unpackedLogs[3].([]byte), unpackedLogs[4].([]byte), nil + return evt.Pubkey, evt.WithdrawalCredentials, evt.Amount, evt.Signature, evt.Index, nil } From 2facf90936b4cfc4adf1ae2c208e3f4f6d4d1fbd Mon Sep 17 00:00:00 2001 From: GarmashAlex Date: Wed, 26 Nov 2025 22:51:52 +0300 Subject: [PATCH 2/2] Create GarmashAlex_chore-cache-deposit-abi-logs.md --- changelog/GarmashAlex_chore-cache-deposit-abi-logs.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 changelog/GarmashAlex_chore-cache-deposit-abi-logs.md diff --git a/changelog/GarmashAlex_chore-cache-deposit-abi-logs.md b/changelog/GarmashAlex_chore-cache-deposit-abi-logs.md new file mode 100644 index 000000000000..100a009ca3e2 --- /dev/null +++ b/changelog/GarmashAlex_chore-cache-deposit-abi-logs.md @@ -0,0 +1,3 @@ +### Changed + +- cache parsed ABI and avoid per-call parsing in UnpackDepositLogData [#16061](https://github.com/OffchainLabs/prysm/pull/16061)