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>
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
);