19 typedef std::vector<unsigned char>
valtype;
41 for (
unsigned int i = 0; i < vch.size(); i++)
46 if (i == vch.size()-1 && vch[i] == 0x80)
51 if (vch.size() == 0) {
61 #define stacktop(i) (stack.at(stack.size()+(i)))
62 #define altstacktop(i) (altstack.at(altstack.size()+(i)))
63 static inline void popstack(std::vector<valtype>& stack)
66 throw std::runtime_error(
"popstack() : stack empty");
70 bool static IsCompressedOrUncompressedPubKey(
const valtype &vchPubKey) {
71 if (vchPubKey.size() < 33) {
75 if (vchPubKey[0] == 0x04) {
76 if (vchPubKey.size() != 65) {
80 }
else if (vchPubKey[0] == 0x02 || vchPubKey[0] == 0x03) {
81 if (vchPubKey.size() != 33) {
102 bool static IsValidSignatureEncoding(
const std::vector<unsigned char> &sig) {
116 if (sig.size() < 9)
return false;
117 if (sig.size() > 73)
return false;
120 if (sig[0] != 0x30)
return false;
123 if (sig[1] != sig.size() - 3)
return false;
126 unsigned int lenR = sig[3];
129 if (5 + lenR >= sig.size())
return false;
132 unsigned int lenS = sig[5 + lenR];
136 if ((
size_t)(lenR + lenS + 7) != sig.size())
return false;
139 if (sig[2] != 0x02)
return false;
142 if (lenR == 0)
return false;
145 if (sig[4] & 0x80)
return false;
149 if (lenR > 1 && (sig[4] == 0x00) && !(sig[5] & 0x80))
return false;
152 if (sig[lenR + 4] != 0x02)
return false;
155 if (lenS == 0)
return false;
158 if (sig[lenR + 6] & 0x80)
return false;
162 if (lenS > 1 && (sig[lenR + 6] == 0x00) && !(sig[lenR + 7] & 0x80))
return false;
168 if (!IsValidSignatureEncoding(vchSig)) {
171 unsigned int nLenR = vchSig[3];
172 unsigned int nLenS = vchSig[5+nLenR];
173 const unsigned char *
S = &vchSig[6+nLenR];
183 bool static IsDefinedHashtypeSignature(
const valtype &vchSig) {
184 if (vchSig.size() == 0) {
197 if (vchSig.size() == 0) {
219 if (data.size() == 0) {
221 return opcode ==
OP_0;
222 }
else if (data.size() == 1 && data[0] >= 1 && data[0] <= 16) {
224 return opcode ==
OP_1 + (data[0] - 1);
225 }
else if (data.size() == 1 && data[0] == 0x81) {
228 }
else if (data.size() <= 75) {
230 return opcode == data.size();
231 }
else if (data.size() <= 255) {
234 }
else if (data.size() <= 65535) {
247 static const valtype vchFalse(0);
248 static const valtype vchZero(0);
249 static const valtype vchTrue(1, 1);
256 std::vector<bool> vfExec;
257 std::vector<valtype> altstack;
259 if (script.
size() > 10000)
268 bool fExec = !count(vfExec.begin(), vfExec.end(),
false);
273 if (!script.
GetOp(pc, opcode, vchPushValue))
275 if (vchPushValue.size() > MAX_SCRIPT_ELEMENT_SIZE)
279 if (opcode >
OP_16 && ++nOpCount > 201)
300 if (fRequireMinimal && !CheckMinimalPush(vchPushValue, opcode)) {
303 stack.push_back(vchPushValue);
330 stack.push_back(bn.
getvch());
352 if (stack.size() < 1)
402 if (stack.size() < 1)
410 vfExec.push_back(fValue);
418 vfExec.back() = !vfExec.back();
434 if (stack.size() < 1)
456 if (stack.size() < 1)
465 if (altstack.size() < 1)
475 if (stack.size() < 2)
485 if (stack.size() < 2)
489 stack.push_back(vch1);
490 stack.push_back(vch2);
497 if (stack.size() < 3)
502 stack.push_back(vch1);
503 stack.push_back(vch2);
504 stack.push_back(vch3);
511 if (stack.size() < 4)
515 stack.push_back(vch1);
516 stack.push_back(vch2);
523 if (stack.size() < 6)
527 stack.erase(stack.end()-6, stack.end()-4);
528 stack.push_back(vch1);
529 stack.push_back(vch2);
536 if (stack.size() < 4)
546 if (stack.size() < 1)
550 stack.push_back(vch);
558 stack.push_back(bn.
getvch());
565 if (stack.size() < 1)
574 if (stack.size() < 1)
577 stack.push_back(vch);
584 if (stack.size() < 2)
586 stack.erase(stack.end() - 2);
593 if (stack.size() < 2)
596 stack.push_back(vch);
605 if (stack.size() < 2)
609 if (n < 0 || n >= (
int)stack.size())
613 stack.erase(stack.end()-n-1);
614 stack.push_back(vch);
623 if (stack.size() < 3)
633 if (stack.size() < 2)
642 if (stack.size() < 2)
645 stack.insert(stack.end()-2, vch);
653 if (stack.size() < 1)
656 stack.push_back(bn.
getvch());
669 if (stack.size() < 2)
673 bool fEqual = (vch1 == vch2);
681 stack.push_back(fEqual ? vchTrue : vchFalse);
704 if (stack.size() < 1)
709 case OP_1ADD: bn += bnOne;
break;
710 case OP_1SUB: bn -= bnOne;
break;
712 case OP_ABS:
if (bn < bnZero) bn = -bn;
break;
713 case OP_NOT: bn = (bn == bnZero);
break;
715 default: assert(!
"invalid opcode");
break;
718 stack.push_back(bn.
getvch());
737 if (stack.size() < 2)
752 case OP_BOOLAND: bn = (bn1 != bnZero && bn2 != bnZero);
break;
753 case OP_BOOLOR: bn = (bn1 != bnZero || bn2 != bnZero);
break;
761 case OP_MIN: bn = (bn1 < bn2 ? bn1 : bn2);
break;
762 case OP_MAX: bn = (bn1 > bn2 ? bn1 : bn2);
break;
763 default: assert(!
"invalid opcode");
break;
767 stack.push_back(bn.
getvch());
782 if (stack.size() < 3)
787 bool fValue = (bn2 <= bn1 && bn1 < bn3);
791 stack.push_back(fValue ? vchTrue : vchFalse);
806 if (stack.size() < 1)
821 stack.push_back(vchHash);
836 if (stack.size() < 2)
843 CScript scriptCode(pbegincodehash, pend);
848 if (!CheckSignatureEncoding(vchSig,
flags, serror) || !CheckPubKeyEncoding(vchPubKey,
flags, serror)) {
852 bool fSuccess = checker.
CheckSig(vchSig, vchPubKey, scriptCode);
856 stack.push_back(fSuccess ? vchTrue : vchFalse);
873 if ((
int)stack.size() < i)
877 if (nKeysCount < 0 || nKeysCount > 20)
879 nOpCount += nKeysCount;
884 if ((
int)stack.size() < i)
888 if (nSigsCount < 0 || nSigsCount > nKeysCount)
892 if ((
int)stack.size() < i)
896 CScript scriptCode(pbegincodehash, pend);
899 for (
int k = 0; k < nSigsCount; k++)
905 bool fSuccess =
true;
906 while (fSuccess && nSigsCount > 0)
914 if (!CheckSignatureEncoding(vchSig,
flags, serror) || !CheckPubKeyEncoding(vchPubKey,
flags, serror)) {
920 bool fOk = checker.
CheckSig(vchSig, vchPubKey, scriptCode);
932 if (nSigsCount > nKeysCount)
940 if (stack.size() < 1)
946 stack.push_back(fSuccess ? vchTrue : vchFalse);
963 if (stack.size() + altstack.size() > 1000)
975 return set_success(serror);
984 class CTransactionSignatureSerializer {
988 const unsigned int nIn;
989 const bool fAnyoneCanPay;
990 const bool fHashSingle;
991 const bool fHashNone;
994 CTransactionSignatureSerializer(
const CTransaction &txToIn,
const CScript &scriptCodeIn,
unsigned int nInIn,
int nHashTypeIn) :
995 txTo(txToIn), scriptCode(scriptCodeIn), nIn(nInIn),
1001 template<
typename S>
1002 void SerializeScriptCode(
S &s,
int nType,
int nVersion)
const {
1006 unsigned int nCodeSeparators = 0;
1007 while (scriptCode.
GetOp(it, opcode)) {
1013 while (scriptCode.
GetOp(it, opcode)) {
1015 s.write((
char*)&itBegin[0], it-itBegin-1);
1019 if (itBegin != scriptCode.
end())
1020 s.write((
char*)&itBegin[0], it-itBegin);
1024 template<
typename S>
1025 void SerializeInput(
S &s,
unsigned int nInput,
int nType,
int nVersion)
const {
1036 SerializeScriptCode(s, nType, nVersion);
1038 if (nInput != nIn && (fHashSingle || fHashNone))
1046 template<
typename S>
1047 void SerializeOutput(
S &s,
unsigned int nOutput,
int nType,
int nVersion)
const {
1048 if (fHashSingle && nOutput != nIn)
1056 template<
typename S>
1057 void Serialize(
S &s,
int nType,
int nVersion)
const {
1061 unsigned int nInputs = fAnyoneCanPay ? 1 : txTo.
vin.size();
1063 for (
unsigned int nInput = 0; nInput < nInputs; nInput++)
1064 SerializeInput(s, nInput, nType, nVersion);
1066 unsigned int nOutputs = fHashNone ? 0 : (fHashSingle ? nIn+1 : txTo.
vout.size());
1068 for (
unsigned int nOutput = 0; nOutput < nOutputs; nOutput++)
1069 SerializeOutput(s, nOutput, nType, nVersion);
1079 if (nIn >= txTo.
vin.size()) {
1086 if (nIn >= txTo.
vout.size()) {
1093 CTransactionSignatureSerializer txTmp(txTo, scriptCode, nIn, nHashType);
1097 ss << txTmp << nHashType;
1103 return pubkey.
Verify(sighash, vchSig);
1113 std::vector<unsigned char> vchSig(vchSigIn);
1116 int nHashType = vchSig.back();
1137 (
txTo->
nLockTime < LOCKTIME_THRESHOLD && nLockTime < LOCKTIME_THRESHOLD) ||
1138 (
txTo->
nLockTime >= LOCKTIME_THRESHOLD && nLockTime >= LOCKTIME_THRESHOLD)
1170 std::vector<std::vector<unsigned char> > stack, stackCopy;
1181 if (stack.empty()) {
1197 assert(!stackCopy.empty());
1199 const valtype& pubKeySerialized = stackCopy.back();
1200 CScript pubKey2(pubKeySerialized.begin(), pubKeySerialized.end());
1201 popstack(stackCopy);
1206 if (stackCopy.empty())
1211 return set_success(serror);
1213 return set_success(serror);