IsStandard() check for CScripts: only relay/include in blocks CScripts we can understand.
authorgavinandresen <gavinandresen@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
Tue, 7 Dec 2010 13:43:31 +0000 (13:43 +0000)
committergavinandresen <gavinandresen@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
Tue, 7 Dec 2010 13:43:31 +0000 (13:43 +0000)
git-svn-id: https://bitcoin.svn.sourceforge.net/svnroot/bitcoin/trunk@197 1a98c847-1fd6-4fd8-948a-caf3550aa51b

main.cpp
main.h
script.cpp
script.h
serialize.h
sha256.cpp

index be29ceb..10d482d 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -572,7 +572,7 @@ bool CTransaction::AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs, bool* pfMi
         return error("AcceptToMemoryPool() : not accepting nLockTime beyond 2038 yet");
 
     // Rather not work on nonstandard transactions
-    if (GetSigOpCount() > 2 || ::GetSerializeSize(*this, SER_NETWORK) < 100)
+    if (!IsStandard() || GetSigOpCount() > 2 || ::GetSerializeSize(*this, SER_NETWORK) < 100)
         return error("AcceptToMemoryPool() : nonstandard transaction");
 
     // Do we already have it?
@@ -2567,15 +2567,17 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
     else if (strCommand == "checkorder")
     {
         uint256 hashReply;
-        CWalletTx order;
-        vRecv >> hashReply >> order;
+        vRecv >> hashReply;
 
-        if (!mapArgs.count("-allowreceivebyip") || mapArgs["-allowreceivebyip"] == "0")
+        if (!GetBoolArg("-allowreceivebyip"))
         {
             pfrom->PushMessage("reply", hashReply, (int)2, string(""));
             return true;
         }
 
+        CWalletTx order;
+        vRecv >> order;
+
         /// we have a chance to check the order here
 
         // Keep giving the same key to the same ip until they use it
@@ -2592,16 +2594,18 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
     else if (strCommand == "submitorder")
     {
         uint256 hashReply;
-        CWalletTx wtxNew;
-        vRecv >> hashReply >> wtxNew;
-        wtxNew.fFromMe = false;
+        vRecv >> hashReply;
 
-        if (!mapArgs.count("-allowreceivebyip") || mapArgs["-allowreceivebyip"] == "0")
+        if (!GetBoolArg("-allowreceivebyip"))
         {
             pfrom->PushMessage("reply", hashReply, (int)2);
             return true;
         }
 
+        CWalletTx wtxNew;
+        vRecv >> wtxNew;
+        wtxNew.fFromMe = false;
+
         // Broadcast
         if (!wtxNew.AcceptWalletTransaction())
         {
diff --git a/main.h b/main.h
index b221e62..0b950e8 100644 (file)
--- a/main.h
+++ b/main.h
@@ -499,6 +499,17 @@ public:
         return n;
     }
 
+    bool IsStandard() const
+    {
+        foreach(const CTxIn& txin, vin)
+            if (!txin.scriptSig.IsPushOnly())
+                return error("nonstandard txin: %s", txin.scriptSig.ToString().c_str());
+        foreach(const CTxOut& txout, vout)
+            if (!::IsStandard(txout.scriptPubKey))
+                return error("nonstandard txout: %s", txout.scriptPubKey.ToString().c_str());
+        return true;
+    }
+
     bool IsMine() const
     {
         foreach(const CTxOut& txout, vout)
index a09031b..a6ed15f 100644 (file)
@@ -1076,6 +1076,13 @@ bool Solver(const CScript& scriptPubKey, uint256 hash, int nHashType, CScript& s
 }
 
 
+bool IsStandard(const CScript& scriptPubKey)
+{
+    vector<pair<opcodetype, valtype> > vSolution;
+    return Solver(scriptPubKey, vSolution);
+}
+
+
 bool IsMine(const CScript& scriptPubKey)
 {
     CScript scriptSig;
index c829ed0..f724d99 100644 (file)
--- a/script.h
+++ b/script.h
@@ -597,6 +597,21 @@ public:
     }
 
 
+    bool IsPushOnly() const
+    {
+        const_iterator pc = begin();
+        while (pc < end())
+        {
+            opcodetype opcode;
+            if (!GetOp(pc, opcode))
+                return false;
+            if (opcode > OP_16)
+                return false;
+        }
+        return true;
+    }
+
+
     uint160 GetBitcoinAddressHash160() const
     {
         opcodetype opcode;
@@ -684,6 +699,7 @@ public:
 
 
 uint256 SignatureHash(CScript scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType);
+bool IsStandard(const CScript& scriptPubKey);
 bool IsMine(const CScript& scriptPubKey);
 bool ExtractPubKey(const CScript& scriptPubKey, bool fMineOnly, vector<unsigned char>& vchPubKeyRet);
 bool ExtractHash160(const CScript& scriptPubKey, uint160& hash160Ret);
index eccea8f..d65ea13 100644 (file)
@@ -25,7 +25,7 @@ class CDataStream;
 class CAutoFile;
 static const unsigned int MAX_SIZE = 0x02000000;
 
-static const int VERSION = 31704;
+static const int VERSION = 31705;
 static const char* pszSubVer = "";
 
 
index 530c2c7..ca116bd 100644 (file)
@@ -1,8 +1,8 @@
-// Copyright (c) 2010 Satoshi Nakamoto
+// Copyright (c) 2010 Nils Schneider
 // Distributed under the MIT/X11 software license, see the accompanying
 // file license.txt or http://www.opensource.org/licenses/mit-license.php.
 
-// tcatm's 4-way 128-bit SSE2 SHA-256
+// 4-way 128-bit SSE2 SHA-256
 
 #ifdef FOURWAYSSE2