Mercurial > hg > bitcoin
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