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