From 79999f4be388be85a86ee6c5d017b21495661272 Mon Sep 17 00:00:00 2001 From: keithsue Date: Fri, 23 Aug 2024 19:37:08 +0800 Subject: [PATCH] add tx weight check --- x/btcbridge/types/bitcoin.go | 18 ++++++++++++++++++ x/btcbridge/types/errors.go | 21 +++++++++++---------- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/x/btcbridge/types/bitcoin.go b/x/btcbridge/types/bitcoin.go index 41b0e9a9..6f1439a1 100644 --- a/x/btcbridge/types/bitcoin.go +++ b/x/btcbridge/types/bitcoin.go @@ -3,6 +3,7 @@ package types import ( "lukechampine.com/uint128" + "github.com/btcsuite/btcd/blockchain" "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/btcutil/psbt" "github.com/btcsuite/btcd/chaincfg/chainhash" @@ -20,6 +21,9 @@ const ( // default minimum relay fee MinRelayFee = 1000 + // default maximum allowed transaction weight + MaxTransactionWeight = 400000 + // default sig hash type DefaultSigHashType = txscript.SigHashDefault ) @@ -185,6 +189,10 @@ func BuildUnsignedTransaction(utxos []*UTXO, txOuts []*wire.TxOut, paymentUTXOIt return nil, nil, nil, err } + if err := CheckTransactionWeight(tx); err != nil { + return nil, nil, nil, err + } + var changeUTXO *UTXO if len(tx.TxOut) > len(txOuts) { changeUTXO = GetChangeUTXO(tx, change.EncodeAddress()) @@ -344,6 +352,16 @@ func CheckOutputAmount(address string, amount int64) error { return nil } +// CheckTransactionWeight checks if the weight of the given tx exceeds the allowed maximum weight +func CheckTransactionWeight(tx *wire.MsgTx) error { + weight := blockchain.GetTransactionWeight(btcutil.NewTx(tx)) + if weight > MaxTransactionWeight { + return ErrMaxTransactionWeightExceeded + } + + return nil +} + // IsOpReturnOutput returns true if the script of the given out starts with OP_RETURN func IsOpReturnOutput(out *wire.TxOut) bool { return len(out.PkScript) > 0 && out.PkScript[0] == txscript.OP_RETURN diff --git a/x/btcbridge/types/errors.go b/x/btcbridge/types/errors.go index b500f055..225c11c4 100644 --- a/x/btcbridge/types/errors.go +++ b/x/btcbridge/types/errors.go @@ -22,16 +22,17 @@ var ( ErrInvalidDepositTransaction = errorsmod.Register(ModuleName, 2108, "invalid deposit transaction") ErrInvalidDepositAmount = errorsmod.Register(ModuleName, 2109, "invalid deposit amount") - ErrInvalidAmount = errorsmod.Register(ModuleName, 3100, "invalid amount") - ErrInvalidFeeRate = errorsmod.Register(ModuleName, 3101, "invalid fee rate") - ErrAssetNotSupported = errorsmod.Register(ModuleName, 3102, "asset not supported") - ErrInvalidWithdrawAmount = errorsmod.Register(ModuleName, 3103, "invalid withdrawal amount") - ErrDustOutput = errorsmod.Register(ModuleName, 3104, "too small output amount") - ErrInsufficientUTXOs = errorsmod.Register(ModuleName, 3105, "insufficient utxos") - ErrFailToSerializePsbt = errorsmod.Register(ModuleName, 3106, "failed to serialize psbt") - ErrInvalidSignatures = errorsmod.Register(ModuleName, 3107, "invalid signatures") - ErrWithdrawRequestNotExist = errorsmod.Register(ModuleName, 3108, "withdrawal request does not exist") - ErrWithdrawRequestConfirmed = errorsmod.Register(ModuleName, 3109, "withdrawal request has been confirmed") + ErrInvalidAmount = errorsmod.Register(ModuleName, 3100, "invalid amount") + ErrInvalidFeeRate = errorsmod.Register(ModuleName, 3101, "invalid fee rate") + ErrAssetNotSupported = errorsmod.Register(ModuleName, 3102, "asset not supported") + ErrInvalidWithdrawAmount = errorsmod.Register(ModuleName, 3103, "invalid withdrawal amount") + ErrDustOutput = errorsmod.Register(ModuleName, 3104, "too small output amount") + ErrInsufficientUTXOs = errorsmod.Register(ModuleName, 3105, "insufficient utxos") + ErrMaxTransactionWeightExceeded = errorsmod.Register(ModuleName, 3106, "maximum transaction weight exceeded") + ErrFailToSerializePsbt = errorsmod.Register(ModuleName, 3107, "failed to serialize psbt") + ErrInvalidSignatures = errorsmod.Register(ModuleName, 3108, "invalid signatures") + ErrWithdrawRequestNotExist = errorsmod.Register(ModuleName, 3109, "withdrawal request does not exist") + ErrWithdrawRequestConfirmed = errorsmod.Register(ModuleName, 3110, "withdrawal request has been confirmed") ErrUTXODoesNotExist = errorsmod.Register(ModuleName, 4100, "utxo does not exist") ErrUTXOLocked = errorsmod.Register(ModuleName, 4101, "utxo locked")