From a206a23980c15cacf39d267c509bd70c23c94bfa Mon Sep 17 00:00:00 2001 From: gavinandresen Date: Tue, 7 Dec 2010 13:43:31 +0000 Subject: [PATCH] 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 --- main.cpp | 20 ++++++++++++-------- main.h | 11 +++++++++++ script.cpp | 7 +++++++ script.h | 16 ++++++++++++++++ serialize.h | 2 +- sha256.cpp | 4 ++-- 6 files changed, 49 insertions(+), 11 deletions(-) diff --git a/main.cpp b/main.cpp index be29ceb971..10d482d898 100644 --- 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 b221e62a7e..0b950e8074 100644 --- 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) diff --git a/script.cpp b/script.cpp index a09031bad5..a6ed15f801 100644 --- a/script.cpp +++ b/script.cpp @@ -1076,6 +1076,13 @@ bool Solver(const CScript& scriptPubKey, uint256 hash, int nHashType, CScript& s } +bool IsStandard(const CScript& scriptPubKey) +{ + vector > vSolution; + return Solver(scriptPubKey, vSolution); +} + + bool IsMine(const CScript& scriptPubKey) { CScript scriptSig; diff --git a/script.h b/script.h index c829ed053e..f724d99793 100644 --- 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& vchPubKeyRet); bool ExtractHash160(const CScript& scriptPubKey, uint160& hash160Ret); diff --git a/serialize.h b/serialize.h index eccea8f72e..d65ea13ec1 100644 --- a/serialize.h +++ b/serialize.h @@ -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 = ""; diff --git a/sha256.cpp b/sha256.cpp index 530c2c7c19..ca116bdcd3 100644 --- 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