1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2012 The Bitcoin developers
3 // Distributed under the MIT/X11 software license, see the accompanying
4 // file license.txt or http://www.opensource.org/licenses/mit-license.php.
5 #ifndef H_BITCOIN_SCRIPT
6 #define H_BITCOIN_SCRIPT
13 #include <boost/foreach.hpp>
18 /** Signature hash types/flags */
24 SIGHASH_ANYONECANPAY = 0x80,
31 // 'standard' transaction types:
38 const char* GetTxnOutputType(txnouttype t);
145 OP_GREATERTHANOREQUAL,
161 OP_CHECKMULTISIGVERIFY,
177 // template matching params
178 OP_SMALLINTEGER = 0xfa,
180 OP_PUBKEYHASH = 0xfd,
183 OP_INVALIDOPCODE = 0xff,
186 const char* GetOpName(opcodetype opcode);
190 inline std::string ValueString(const std::vector<unsigned char>& vch)
193 return strprintf("%d", CBigNum(vch).getint());
198 inline std::string StackString(const std::vector<std::vector<unsigned char> >& vStack)
201 BOOST_FOREACH(const std::vector<unsigned char>& vch, vStack)
205 str += ValueString(vch);
217 /** Serialized script, used inside transaction inputs and outputs */
218 class CScript : public std::vector<unsigned char>
221 CScript& push_int64(int64 n)
223 if (n == -1 || (n >= 1 && n <= 16))
225 push_back(n + (OP_1 - 1));
230 *this << bn.getvch();
235 CScript& push_uint64(uint64 n)
237 if (n >= 1 && n <= 16)
239 push_back(n + (OP_1 - 1));
244 *this << bn.getvch();
251 CScript(const CScript& b) : std::vector<unsigned char>(b.begin(), b.end()) { }
252 CScript(const_iterator pbegin, const_iterator pend) : std::vector<unsigned char>(pbegin, pend) { }
254 CScript(const unsigned char* pbegin, const unsigned char* pend) : std::vector<unsigned char>(pbegin, pend) { }
257 CScript& operator+=(const CScript& b)
259 insert(end(), b.begin(), b.end());
263 friend CScript operator+(const CScript& a, const CScript& b)
271 explicit CScript(char b) { operator<<(b); }
272 explicit CScript(short b) { operator<<(b); }
273 explicit CScript(int b) { operator<<(b); }
274 explicit CScript(long b) { operator<<(b); }
275 explicit CScript(int64 b) { operator<<(b); }
276 explicit CScript(unsigned char b) { operator<<(b); }
277 explicit CScript(unsigned int b) { operator<<(b); }
278 explicit CScript(unsigned short b) { operator<<(b); }
279 explicit CScript(unsigned long b) { operator<<(b); }
280 explicit CScript(uint64 b) { operator<<(b); }
282 explicit CScript(opcodetype b) { operator<<(b); }
283 explicit CScript(const uint256& b) { operator<<(b); }
284 explicit CScript(const CBigNum& b) { operator<<(b); }
285 explicit CScript(const std::vector<unsigned char>& b) { operator<<(b); }
288 CScript& operator<<(char b) { return push_int64(b); }
289 CScript& operator<<(short b) { return push_int64(b); }
290 CScript& operator<<(int b) { return push_int64(b); }
291 CScript& operator<<(long b) { return push_int64(b); }
292 CScript& operator<<(int64 b) { return push_int64(b); }
293 CScript& operator<<(unsigned char b) { return push_uint64(b); }
294 CScript& operator<<(unsigned int b) { return push_uint64(b); }
295 CScript& operator<<(unsigned short b) { return push_uint64(b); }
296 CScript& operator<<(unsigned long b) { return push_uint64(b); }
297 CScript& operator<<(uint64 b) { return push_uint64(b); }
299 CScript& operator<<(opcodetype opcode)
301 if (opcode < 0 || opcode > 0xff)
302 throw std::runtime_error("CScript::operator<<() : invalid opcode");
303 insert(end(), (unsigned char)opcode);
307 CScript& operator<<(const uint160& b)
309 insert(end(), sizeof(b));
310 insert(end(), (unsigned char*)&b, (unsigned char*)&b + sizeof(b));
314 CScript& operator<<(const uint256& b)
316 insert(end(), sizeof(b));
317 insert(end(), (unsigned char*)&b, (unsigned char*)&b + sizeof(b));
321 CScript& operator<<(const CBigNum& b)
327 CScript& operator<<(const std::vector<unsigned char>& b)
329 if (b.size() < OP_PUSHDATA1)
331 insert(end(), (unsigned char)b.size());
333 else if (b.size() <= 0xff)
335 insert(end(), OP_PUSHDATA1);
336 insert(end(), (unsigned char)b.size());
338 else if (b.size() <= 0xffff)
340 insert(end(), OP_PUSHDATA2);
341 unsigned short nSize = b.size();
342 insert(end(), (unsigned char*)&nSize, (unsigned char*)&nSize + sizeof(nSize));
346 insert(end(), OP_PUSHDATA4);
347 unsigned int nSize = b.size();
348 insert(end(), (unsigned char*)&nSize, (unsigned char*)&nSize + sizeof(nSize));
350 insert(end(), b.begin(), b.end());
354 CScript& operator<<(const CScript& b)
356 // I'm not sure if this should push the script or concatenate scripts.
357 // If there's ever a use for pushing a script onto a script, delete this member fn
358 assert(!"warning: pushing a CScript onto a CScript with << is probably not intended, use + to concatenate");
363 bool GetOp(iterator& pc, opcodetype& opcodeRet, std::vector<unsigned char>& vchRet)
365 // Wrapper so it can be called with either iterator or const_iterator
366 const_iterator pc2 = pc;
367 bool fRet = GetOp2(pc2, opcodeRet, &vchRet);
368 pc = begin() + (pc2 - begin());
372 bool GetOp(iterator& pc, opcodetype& opcodeRet)
374 const_iterator pc2 = pc;
375 bool fRet = GetOp2(pc2, opcodeRet, NULL);
376 pc = begin() + (pc2 - begin());
380 bool GetOp(const_iterator& pc, opcodetype& opcodeRet, std::vector<unsigned char>& vchRet) const
382 return GetOp2(pc, opcodeRet, &vchRet);
385 bool GetOp(const_iterator& pc, opcodetype& opcodeRet) const
387 return GetOp2(pc, opcodeRet, NULL);
390 bool GetOp2(const_iterator& pc, opcodetype& opcodeRet, std::vector<unsigned char>* pvchRet) const
392 opcodeRet = OP_INVALIDOPCODE;
401 unsigned int opcode = *pc++;
404 if (opcode <= OP_PUSHDATA4)
407 if (opcode < OP_PUSHDATA1)
411 else if (opcode == OP_PUSHDATA1)
417 else if (opcode == OP_PUSHDATA2)
422 memcpy(&nSize, &pc[0], 2);
425 else if (opcode == OP_PUSHDATA4)
429 memcpy(&nSize, &pc[0], 4);
432 if (end() - pc < nSize)
435 pvchRet->assign(pc, pc + nSize);
439 opcodeRet = (opcodetype)opcode;
443 // Encode/decode small integers:
444 static int DecodeOP_N(opcodetype opcode)
448 assert(opcode >= OP_1 && opcode <= OP_16);
449 return (int)opcode - (int)(OP_1 - 1);
451 static opcodetype EncodeOP_N(int n)
453 assert(n >= 0 && n <= 16);
456 return (opcodetype)(OP_1+n-1);
459 int FindAndDelete(const CScript& b)
464 iterator pc = begin();
468 while (end() - pc >= b.size() && memcmp(&pc[0], &b[0], b.size()) == 0)
470 erase(pc, pc + b.size());
474 while (GetOp(pc, opcode));
477 int Find(opcodetype op) const
481 for (const_iterator pc = begin(); pc != end() && GetOp(pc, opcode);)
487 // Pre-version-0.6, Bitcoin always counted CHECKMULTISIGs
488 // as 20 sigops. With pay-to-script-hash, that changed:
489 // CHECKMULTISIGs serialized in scriptSigs are
490 // counted more accurately, assuming they are of the form
491 // ... OP_N CHECKMULTISIG ...
492 int GetSigOpCount(bool fAccurate) const;
494 // Accurately count sigOps, including sigOps in
495 // pay-to-script-hash transactions:
496 int GetSigOpCount(const CScript& scriptSig) const;
498 bool IsPayToScriptHash() const;
500 // Called by CTransaction::IsStandard
501 bool IsPushOnly() const
503 const_iterator pc = begin();
507 if (!GetOp(pc, opcode))
516 void SetBitcoinAddress(const CBitcoinAddress& address);
517 void SetBitcoinAddress(const std::vector<unsigned char>& vchPubKey)
519 SetBitcoinAddress(CBitcoinAddress(vchPubKey));
521 void SetMultisig(int nRequired, const std::vector<CKey>& keys);
522 void SetPayToScriptHash(const CScript& subscript);
525 void PrintHex() const
527 printf("CScript(%s)\n", HexStr(begin(), end(), true).c_str());
530 std::string ToString() const
534 std::vector<unsigned char> vch;
535 const_iterator pc = begin();
540 if (!GetOp(pc, opcode, vch))
545 if (0 <= opcode && opcode <= OP_PUSHDATA4)
546 str += ValueString(vch);
548 str += GetOpName(opcode);
555 printf("%s\n", ToString().c_str());
563 bool EvalScript(std::vector<std::vector<unsigned char> >& stack, const CScript& script, const CTransaction& txTo, unsigned int nIn, int nHashType);
564 bool Solver(const CScript& scriptPubKey, txnouttype& typeRet, std::vector<std::vector<unsigned char> >& vSolutionsRet);
565 int ScriptSigArgsExpected(txnouttype t, const std::vector<std::vector<unsigned char> >& vSolutions);
566 bool IsStandard(const CScript& scriptPubKey);
567 bool IsMine(const CKeyStore& keystore, const CScript& scriptPubKey);
568 bool ExtractAddress(const CScript& scriptPubKey, CBitcoinAddress& addressRet);
569 bool ExtractAddresses(const CScript& scriptPubKey, txnouttype& typeRet, std::vector<CBitcoinAddress>& addressRet, int& nRequiredRet);
570 bool SignSignature(const CKeyStore& keystore, const CTransaction& txFrom, CTransaction& txTo, unsigned int nIn, int nHashType=SIGHASH_ALL);
571 bool VerifySignature(const CTransaction& txFrom, const CTransaction& txTo, unsigned int nIn, bool fValidatePayToScriptHash, int nHashType);