changeset 316:69a0155a14cd draft

IsStandard() check for CScripts: only relay/include in blocks CScripts we can understand. git-svn-id: https://bitcoin.svn.sourceforge.net/svnroot/bitcoin/trunk@197 1a98c847-1fd6-4fd8-948a-caf3550aa51b
author gavinandresen <gavinandresen@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
date Tue, 07 Dec 2010 13:43:31 +0000
parents dd6bfb810b35
children 49ad10c2682f
files main.cpp main.h script.cpp script.h serialize.h sha256.cpp
diffstat 6 files changed, 51 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/main.cpp
+++ b/main.cpp
@@ -572,7 +572,7 @@
         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 @@
     else if (strCommand == "checkorder")
     {
         uint256 hashReply;
-        CWalletTx order;
-        vRecv >> hashReply >> order;
-
-        if (!mapArgs.count("-allowreceivebyip") || mapArgs["-allowreceivebyip"] == "0")
+        vRecv >> hashReply;
+
+        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 @@
     else if (strCommand == "submitorder")
     {
         uint256 hashReply;
-        CWalletTx wtxNew;
-        vRecv >> hashReply >> wtxNew;
-        wtxNew.fFromMe = false;
-
-        if (!mapArgs.count("-allowreceivebyip") || mapArgs["-allowreceivebyip"] == "0")
+        vRecv >> hashReply;
+
+        if (!GetBoolArg("-allowreceivebyip"))
         {
             pfrom->PushMessage("reply", hashReply, (int)2);
             return true;
         }
 
+        CWalletTx wtxNew;
+        vRecv >> wtxNew;
+        wtxNew.fFromMe = false;
+
         // Broadcast
         if (!wtxNew.AcceptWalletTransaction())
         {
--- a/main.h
+++ b/main.h
@@ -499,6 +499,17 @@
         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)
--- a/script.cpp
+++ b/script.cpp
@@ -1076,6 +1076,13 @@
 }
 
 
+bool IsStandard(const CScript& scriptPubKey)
+{
+    vector<pair<opcodetype, valtype> > vSolution;
+    return Solver(scriptPubKey, vSolution);
+}
+
+
 bool IsMine(const CScript& scriptPubKey)
 {
     CScript scriptSig;
--- a/script.h
+++ b/script.h
@@ -597,6 +597,21 @@
     }
 
 
+    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 @@
 
 
 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);
--- a/serialize.h
+++ b/serialize.h
@@ -25,7 +25,7 @@
 class CAutoFile;
 static const unsigned int MAX_SIZE = 0x02000000;
 
-static const int VERSION = 31704;
+static const int VERSION = 31705;
 static const char* pszSubVer = "";
 
 
--- a/sha256.cpp
+++ b/sha256.cpp
@@ -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