From a206a23980c15cacf39d267c509bd70c23c94bfa Mon Sep 17 00:00:00 2001 From: gavinandresen Date: Tue, 7 Dec 2010 13:43:31 +0000 Subject: [PATCH 1/2] 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 From 82201801336f64ee77851b9eaab9383ee4e442f0 Mon Sep 17 00:00:00 2001 From: s_nakamoto Date: Wed, 8 Dec 2010 23:23:48 +0000 Subject: [PATCH 2/2] -- version 0.3.18 release git-svn-id: https://bitcoin.svn.sourceforge.net/svnroot/bitcoin/trunk@198 1a98c847-1fd6-4fd8-948a-caf3550aa51b --- script.cpp | 2 +- script.h | 2 ++ serialize.h | 2 +- setup.nsi | 6 +++--- util.cpp | 5 ++--- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/script.cpp b/script.cpp index a6ed15f801..a85c3710a3 100644 --- a/script.cpp +++ b/script.cpp @@ -997,7 +997,7 @@ bool Solver(const CScript& scriptPubKey, vector >& vSo break; if (opcode2 == OP_PUBKEY) { - if (vch1.size() < 33) + if (vch1.size() < 33 || vch1.size() > 120) break; vSolutionRet.push_back(make_pair(opcode2, vch1)); } diff --git a/script.h b/script.h index f724d99793..da904ef489 100644 --- a/script.h +++ b/script.h @@ -599,6 +599,8 @@ public: bool IsPushOnly() const { + if (size() > 200) + return false; const_iterator pc = begin(); while (pc < end()) { diff --git a/serialize.h b/serialize.h index d65ea13ec1..4e90b76c03 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 = 31705; +static const int VERSION = 31800; static const char* pszSubVer = ""; diff --git a/setup.nsi b/setup.nsi index 1cb005490b..aee4a528a2 100644 --- a/setup.nsi +++ b/setup.nsi @@ -7,7 +7,7 @@ RequestExecutionLevel highest # General Symbol Definitions !define REGKEY "SOFTWARE\$(^Name)" -!define VERSION 0.3.17 +!define VERSION 0.3.18 !define COMPANY "Bitcoin project" !define URL http://www.bitcoin.org/ @@ -42,12 +42,12 @@ Var StartMenuGroup !insertmacro MUI_LANGUAGE English # Installer attributes -OutFile bitcoin-0.3.17-win32-setup.exe +OutFile bitcoin-0.3.18-win32-setup.exe InstallDir $PROGRAMFILES\Bitcoin CRCCheck on XPStyle on ShowInstDetails show -VIProductVersion 0.3.17.0 +VIProductVersion 0.3.18.0 VIAddVersionKey ProductName Bitcoin VIAddVersionKey ProductVersion "${VERSION}" VIAddVersionKey CompanyName "${COMPANY}" diff --git a/util.cpp b/util.cpp index 607dc3f11e..42256a9d0c 100644 --- a/util.cpp +++ b/util.cpp @@ -175,7 +175,6 @@ inline int OutputDebugStringF(const char* pszFormat, ...) va_start(arg_ptr, pszFormat); ret = vfprintf(fileout, pszFormat, arg_ptr); va_end(arg_ptr); - fflush(fileout); } } @@ -406,11 +405,11 @@ vector ParseHex(const char* psz) while (isspace(*psz)) psz++; char c = phexdigit[(unsigned char)*psz++]; - if (c == -1) + if (c == (char)-1) break; unsigned char n = (c << 4); c = phexdigit[(unsigned char)*psz++]; - if (c == -1) + if (c == (char)-1) break; n |= c; vch.push_back(n);