Support 3 new multisignature IsStandard transactions

Initial support for (a and b), (a or b), and 2-of-3 escrow
transactions (where a, b, and c are keys).
This commit is contained in:
Gavin Andresen
2011-09-28 12:30:06 -04:00
parent 1466b8b78a
commit bf798734db
5 changed files with 578 additions and 91 deletions

View File

@@ -574,6 +574,13 @@ public:
return true;
}
static int DecodeOP_N(opcodetype opcode)
{
if (opcode == OP_0)
return 0;
assert(opcode >= OP_1 && opcode <= OP_16);
return (int)opcode - (int)(OP_1 - 1);
}
void FindAndDelete(const CScript& b)
{
@@ -625,21 +632,6 @@ public:
}
CBitcoinAddress GetBitcoinAddress() const
{
opcodetype opcode;
std::vector<unsigned char> vch;
CScript::const_iterator pc = begin();
if (!GetOp(pc, opcode, vch) || opcode != OP_DUP) return 0;
if (!GetOp(pc, opcode, vch) || opcode != OP_HASH160) return 0;
if (!GetOp(pc, opcode, vch) || vch.size() != sizeof(uint160)) return 0;
uint160 hash160 = uint160(vch);
if (!GetOp(pc, opcode, vch) || opcode != OP_EQUALVERIFY) return 0;
if (!GetOp(pc, opcode, vch) || opcode != OP_CHECKSIG) return 0;
if (pc != end()) return 0;
return CBitcoinAddress(hash160);
}
void SetBitcoinAddress(const CBitcoinAddress& address)
{
this->clear();
@@ -650,6 +642,9 @@ public:
{
SetBitcoinAddress(CBitcoinAddress(vchPubKey));
}
void SetMultisigAnd(const std::vector<CKey>& keys);
void SetMultisigOr(const std::vector<CKey>& keys);
void SetMultisigEscrow(const std::vector<CKey>& keys);
void PrintHex() const