From fc77c6db6a920d3ce459b7f149003f7b8d2f14ee Mon Sep 17 00:00:00 2001 From: Roy Lee <roylee17@gmail.com> Date: Fri, 15 Jun 2018 13:06:26 -0700 Subject: [PATCH] [lbry] blockchain, mempool: validate txscripts --- blockchain/validate.go | 10 ++++++++++ mempool/mempool.go | 8 ++++++++ mempool/policy.go | 7 ++++--- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/blockchain/validate.go b/blockchain/validate.go index 2fd5d7fd..c8dd73c0 100644 --- a/blockchain/validate.go +++ b/blockchain/validate.go @@ -291,6 +291,16 @@ func CheckTransactionSanity(tx *btcutil.Tx) error { btcutil.MaxSatoshi) return ruleError(ErrBadTxOutValue, str) } + if txscript.ClaimScriptSize(txOut.PkScript) > txscript.MaxClaimScriptSize { + str := fmt.Sprintf("claimscript exceeds max size of %v", + txscript.MaxClaimScriptSize) + return ruleError(ErrBadTxOutValue, str) + } + if txscript.ClaimNameSize(txOut.PkScript) > txscript.MaxClaimNameSize { + str := fmt.Sprintf("claim name exceeds max size of %v", + txscript.MaxClaimNameSize) + return ruleError(ErrBadTxOutValue, str) + } } // Check for duplicate transaction inputs. diff --git a/mempool/mempool.go b/mempool/mempool.go index 7ada3d29..1203731d 100644 --- a/mempool/mempool.go +++ b/mempool/mempool.go @@ -1155,6 +1155,14 @@ func (mp *TxPool) maybeAcceptTransaction(tx *btcutil.Tx, isNew, rateLimit, rejec return nil, nil, txRuleError(wire.RejectInsufficientFee, str) } + minFee = txscript.CalcMinClaimTrieFee(tx.MsgTx(), txscript.MinFeePerNameclaimChar) + if txFee < minFee { + str := fmt.Sprintf("transaction %v has %d fees which is under "+ + "the required amount of %d for Claims", txHash, txFee, + minFee) + return nil, nil, txRuleError(wire.RejectInsufficientFee, str) + } + // Require that free transactions have sufficient priority to be mined // in the next block. Transactions which are being added back to the // memory pool from blocks that have been disconnected during a reorg diff --git a/mempool/policy.go b/mempool/policy.go index 7e973293..a58f110b 100644 --- a/mempool/policy.go +++ b/mempool/policy.go @@ -99,7 +99,7 @@ func checkInputsStandard(tx *btcutil.Tx, utxoView *blockchain.UtxoViewpoint) err // they have already been checked prior to calling this // function. entry := utxoView.LookupEntry(txIn.PreviousOutPoint) - originPkScript := entry.PkScript() + originPkScript := txscript.StripClaimScriptPrefix(entry.PkScript()) switch txscript.GetScriptClass(originPkScript) { case txscript.ScriptHashTy: numSigOps := txscript.GetPreciseSigOpCount( @@ -332,8 +332,9 @@ func checkTransactionStandard(tx *btcutil.Tx, height int32, // be "dust" (except when the script is a null data script). numNullDataOutputs := 0 for i, txOut := range msgTx.TxOut { - scriptClass := txscript.GetScriptClass(txOut.PkScript) - err := checkPkScriptStandard(txOut.PkScript, scriptClass) + pkScript := txscript.StripClaimScriptPrefix(txOut.PkScript) + scriptClass := txscript.GetScriptClass(pkScript) + err := checkPkScriptStandard(pkScript, scriptClass) if err != nil { // Attempt to extract a reject code from the error so // it can be retained. When not possible, fall back to