1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2011 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>
23 SIGHASH_ANYONECANPAY = 0x80,
30 // 'standard' transaction types:
37 const char* GetTxnOutputType(txnouttype t);
143 OP_GREATERTHANOREQUAL,
159 OP_CHECKMULTISIGVERIFY,
175 // template matching params
176 OP_SMALLINTEGER = 0xfa,
178 OP_PUBKEYHASH = 0xfd,
181 OP_INVALIDOPCODE = 0xff,
184 const char* GetOpName(opcodetype opcode);
188 inline std::string ValueString(const std::vector<unsigned char>& vch)
191 return strprintf("%d", CBigNum(vch).getint());
196 inline std::string StackString(const std::vector<std::vector<unsigned char> >& vStack)
199 BOOST_FOREACH(const std::vector<unsigned char>& vch, vStack)
203 str += ValueString(vch);
216 class CScript : public std::vector<unsigned char>
219 CScript& push_int64(int64 n)
221 if (n == -1 || (n >= 1 && n <= 16))
223 push_back(n + (OP_1 - 1));
228 *this << bn.getvch();
233 CScript& push_uint64(uint64 n)
235 if (n >= 1 && n <= 16)
237 push_back(n + (OP_1 - 1));
242 *this << bn.getvch();
249 CScript(const CScript& b) : std::vector<unsigned char>(b.begin(), b.end()) { }
250 CScript(const_iterator pbegin, const_iterator pend) : std::vector<unsigned char>(pbegin, pend) { }
252 CScript(const unsigned char* pbegin, const unsigned char* pend) : std::vector<unsigned char>(pbegin, pend) { }
255 CScript& operator+=(const CScript& b)
257 insert(end(), b.begin(), b.end());
261 friend CScript operator+(const CScript& a, const CScript& b)
269 explicit CScript(char b) { operator<<(b); }
270 explicit CScript(short b) { operator<<(b); }
271 explicit CScript(int b) { operator<<(b); }
272 explicit CScript(long b) { operator<<(b); }
273 explicit CScript(int64 b) { operator<<(b); }
274 explicit CScript(unsigned char b) { operator<<(b); }
275 explicit CScript(unsigned int b) { operator<<(b); }
276 explicit CScript(unsigned short b) { operator<<(b); }
277 explicit CScript(unsigned long b) { operator<<(b); }
278 explicit CScript(uint64 b) { operator<<(b); }
280 explicit CScript(opcodetype b) { operator<<(b); }
281 explicit CScript(const uint256& b) { operator<<(b); }
282 explicit CScript(const CBigNum& b) { operator<<(b); }
283 explicit CScript(const std::vector<unsigned char>& b) { operator<<(b); }
286 CScript& operator<<(char b) { return push_int64(b); }
287 CScript& operator<<(short b) { return push_int64(b); }
288 CScript& operator<<(int b) { return push_int64(b); }
289 CScript& operator<<(long b) { return push_int64(b); }
290 CScript& operator<<(int64 b) { return push_int64(b); }
291 CScript& operator<<(unsigned char b) { return push_uint64(b); }
292 CScript& operator<<(unsigned int b) { return push_uint64(b); }
293 CScript& operator<<(unsigned short b) { return push_uint64(b); }
294 CScript& operator<<(unsigned long b) { return push_uint64(b); }
295 CScript& operator<<(uint64 b) { return push_uint64(b); }
297 CScript& operator<<(opcodetype opcode)
299 if (opcode < 0 || opcode > 0xff)
300 throw std::runtime_error("CScript::operator<<() : invalid opcode");
301 insert(end(), (unsigned char)opcode);
305 CScript& operator<<(const uint160& b)
307 insert(end(), sizeof(b));
308 insert(end(), (unsigned char*)&b, (unsigned char*)&b + sizeof(b));
312 CScript& operator<<(const uint256& b)
314 insert(end(), sizeof(b));
315 insert(end(), (unsigned char*)&b, (unsigned char*)&b + sizeof(b));
319 CScript& operator<<(const CBigNum& b)
325 CScript& operator<<(const std::vector<unsigned char>& b)
327 if (b.size() < OP_PUSHDATA1)
329 insert(end(), (unsigned char)b.size());
331 else if (b.size() <= 0xff)
333 insert(end(), OP_PUSHDATA1);
334 insert(end(), (unsigned char)b.size());
336 else if (b.size() <= 0xffff)
338 insert(end(), OP_PUSHDATA2);
339 unsigned short nSize = b.size();
340 insert(end(), (unsigned char*)&nSize, (unsigned char*)&nSize + sizeof(nSize));
344 insert(end(), OP_PUSHDATA4);
345 unsigned int nSize = b.size();
346 insert(end(), (unsigned char*)&nSize, (unsigned char*)&nSize + sizeof(nSize));
348 insert(end(), b.begin(), b.end());
352 CScript& operator<<(const CScript& b)
354 // I'm not sure if this should push the script or concatenate scripts.
355 // If there's ever a use for pushing a script onto a script, delete this member fn
356 assert(!"warning: pushing a CScript onto a CScript with << is probably not intended, use + to concatenate");
361 bool GetOp(iterator& pc, opcodetype& opcodeRet, std::vector<unsigned char>& vchRet)
363 // Wrapper so it can be called with either iterator or const_iterator
364 const_iterator pc2 = pc;
365 bool fRet = GetOp2(pc2, opcodeRet, &vchRet);
366 pc = begin() + (pc2 - begin());
370 bool GetOp(iterator& pc, opcodetype& opcodeRet)
372 const_iterator pc2 = pc;
373 bool fRet = GetOp2(pc2, opcodeRet, NULL);
374 pc = begin() + (pc2 - begin());
378 bool GetOp(const_iterator& pc, opcodetype& opcodeRet, std::vector<unsigned char>& vchRet) const
380 return GetOp2(pc, opcodeRet, &vchRet);
383 bool GetOp(const_iterator& pc, opcodetype& opcodeRet) const
385 return GetOp2(pc, opcodeRet, NULL);
388 bool GetOp2(const_iterator& pc, opcodetype& opcodeRet, std::vector<unsigned char>* pvchRet) const
390 opcodeRet = OP_INVALIDOPCODE;
399 unsigned int opcode = *pc++;
402 if (opcode <= OP_PUSHDATA4)
405 if (opcode < OP_PUSHDATA1)
409 else if (opcode == OP_PUSHDATA1)
415 else if (opcode == OP_PUSHDATA2)
420 memcpy(&nSize, &pc[0], 2);
423 else if (opcode == OP_PUSHDATA4)
427 memcpy(&nSize, &pc[0], 4);
430 if (end() - pc < nSize)
433 pvchRet->assign(pc, pc + nSize);
437 opcodeRet = (opcodetype)opcode;
441 // Encode/decode small integers:
442 static int DecodeOP_N(opcodetype opcode)
446 assert(opcode >= OP_1 && opcode <= OP_16);
447 return (int)opcode - (int)(OP_1 - 1);
449 static opcodetype EncodeOP_N(int n)
451 assert(n >= 0 && n <= 16);
454 return (opcodetype)(OP_1+n-1);
457 int FindAndDelete(const CScript& b)
462 iterator pc = begin();
466 while (end() - pc >= b.size() && memcmp(&pc[0], &b[0], b.size()) == 0)
468 erase(pc, pc + b.size());
472 while (GetOp(pc, opcode));
475 int Find(opcodetype op) const
479 for (const_iterator pc = begin(); pc != end() && GetOp(pc, opcode);)
485 // Pre-version-0.6, Bitcoin always counted CHECKMULTISIGs
486 // as 20 sigops. With pay-to-script-hash, that changed:
487 // CHECKMULTISIGs serialized in scriptSigs are
488 // counted more accurately, assuming they are of the form
489 // ... OP_N CHECKMULTISIG ...
490 int GetSigOpCount(bool fAccurate) const;
492 // Accurately count sigOps, including sigOps in
493 // pay-to-script-hash transactions:
494 int GetSigOpCount(const CScript& scriptSig) const;
496 bool IsPayToScriptHash() const;
498 // Called by CTransaction::IsStandard
499 bool IsPushOnly() const
501 const_iterator pc = begin();
505 if (!GetOp(pc, opcode))
514 void SetBitcoinAddress(const CBitcoinAddress& address);
515 void SetBitcoinAddress(const std::vector<unsigned char>& vchPubKey)
517 SetBitcoinAddress(CBitcoinAddress(vchPubKey));
519 void SetMultisig(int nRequired, const std::vector<CKey>& keys);
520 void SetPayToScriptHash(const CScript& subscript);
523 void PrintHex() const
525 printf("CScript(%s)\n", HexStr(begin(), end(), true).c_str());
528 std::string ToString() const
532 std::vector<unsigned char> vch;
533 const_iterator pc = begin();
538 if (!GetOp(pc, opcode, vch))
543 if (0 <= opcode && opcode <= OP_PUSHDATA4)
544 str += ValueString(vch);
546 str += GetOpName(opcode);
553 printf("%s\n", ToString().c_str());
561 bool EvalScript(std::vector<std::vector<unsigned char> >& stack, const CScript& script, const CTransaction& txTo, unsigned int nIn, int nHashType);
562 bool Solver(const CScript& scriptPubKey, txnouttype& typeRet, std::vector<std::vector<unsigned char> >& vSolutionsRet);
563 int ScriptSigArgsExpected(txnouttype t, const std::vector<std::vector<unsigned char> >& vSolutions);
564 bool IsStandard(const CScript& scriptPubKey);
565 bool IsMine(const CKeyStore& keystore, const CScript& scriptPubKey);
566 bool ExtractAddress(const CScript& scriptPubKey, CBitcoinAddress& addressRet);
567 bool ExtractAddresses(const CScript& scriptPubKey, txnouttype& typeRet, std::vector<CBitcoinAddress>& addressRet, int& nRequiredRet);
568 bool SignSignature(const CKeyStore& keystore, const CTransaction& txFrom, CTransaction& txTo, unsigned int nIn, int nHashType=SIGHASH_ALL);
569 bool VerifySignature(const CTransaction& txFrom, const CTransaction& txTo, unsigned int nIn, bool fValidatePayToScriptHash, int nHashType);