diff options
author | gavinandresen <gavinandresen@1a98c847-1fd6-4fd8-948a-caf3550aa51b> | 2010-12-07 13:43:31 +0000 |
---|---|---|
committer | gavinandresen <gavinandresen@1a98c847-1fd6-4fd8-948a-caf3550aa51b> | 2010-12-07 13:43:31 +0000 |
commit | a206a23980c15cacf39d267c509bd70c23c94bfa (patch) | |
tree | 7a4e29a09bbf32fb9f84abefdd8eb9504195fa32 | |
parent | 865c3a23832e36d50cb873d38c976032b027b5d3 (diff) |
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
-rw-r--r-- | main.cpp | 20 | ||||
-rw-r--r-- | main.h | 11 | ||||
-rw-r--r-- | script.cpp | 7 | ||||
-rw-r--r-- | script.h | 16 | ||||
-rw-r--r-- | serialize.h | 2 | ||||
-rw-r--r-- | sha256.cpp | 4 |
6 files changed, 49 insertions, 11 deletions
@@ -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()) { @@ -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<pair<opcodetype, valtype> > vSolution; + return Solver(scriptPubKey, vSolution); +} + + bool IsMine(const CScript& scriptPubKey) { CScript scriptSig; @@ -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); 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 |