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