X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Fmain.h;h=d8fd222b917529ca98b999a4cbbabe795356b861;hb=5e9ed1b72385ffbb451d0dcaf1d2e40e79288472;hp=2e443bff9343503fe96bc461cdfddf5d3e39719f;hpb=dbfa51628178a6f1064f28d8a5aa8e12d45d7ac9;p=novacoin.git diff --git a/src/main.h b/src/main.h index 2e443bf..d8fd222 100644 --- a/src/main.h +++ b/src/main.h @@ -807,6 +807,10 @@ public: unsigned int nBits; unsigned int nNonce; + // ppcoin: block signature (not considered part of header) + // signed by coin base txout[0]'s owner + std::vector vchBlockSig; + // network and disk std::vector vtx; @@ -834,9 +838,15 @@ public: // ConnectBlock depends on vtx being last so it can calculate offset if (!(nType & (SER_GETHASH|SER_BLOCKHEADERONLY))) + { + READWRITE(vchBlockSig); READWRITE(vtx); + } else if (fRead) + { + const_cast(this)->vchBlockSig.clear(); const_cast(this)->vtx.clear(); + } ) void SetNull() @@ -847,6 +857,7 @@ public: nTime = 0; nBits = 0; nNonce = 0; + vchBlockSig.clear(); vtx.clear(); vMerkleTree.clear(); nDoS = 0; @@ -992,12 +1003,13 @@ public: void print() const { - printf("CBlock(hash=%s, ver=%d, hashPrevBlock=%s, hashMerkleRoot=%s, nTime=%u, nBits=%08x, nNonce=%u, vtx=%d)\n", + printf("CBlock(hash=%s, ver=%d, hashPrevBlock=%s, hashMerkleRoot=%s, nTime=%u, nBits=%08x, nNonce=%u, vchBlockSig=%s, vtx=%d)\n", GetHash().ToString().substr(0,20).c_str(), nVersion, hashPrevBlock.ToString().substr(0,20).c_str(), hashMerkleRoot.ToString().substr(0,10).c_str(), nTime, nBits, nNonce, + HexStr(vchBlockSig.begin(), vchBlockSig.end(), true).c_str(), vtx.size()); for (int i = 0; i < vtx.size(); i++) { @@ -1011,6 +1023,51 @@ public: } + bool SignBlock(const CKeyStore& keystore) + { + std::vector > vSolution; + + if (!Solver(vtx[0].vout[0].scriptPubKey, vSolution)) + return false; + BOOST_FOREACH(PAIRTYPE(opcodetype, valtype)& item, vSolution) + { + if (item.first == OP_PUBKEY) + { + // Sign + const valtype& vchPubKey = item.second; + CKey key; + if (!keystore.GetKey(Hash160(vchPubKey), key)) + return false; + if (key.GetPubKey() != vchPubKey) + return false; + return key.Sign(GetHash(), vchBlockSig); + } + } + return false; + } + + bool CheckBlockSignature() const + { + std::vector > vSolution; + + if (!Solver(vtx[0].vout[0].scriptPubKey, vSolution)) + return false; + BOOST_FOREACH(PAIRTYPE(opcodetype, valtype)& item, vSolution) + { + if (item.first == OP_PUBKEY) + { + const valtype& vchPubKey = item.second; + CKey key; + if (!key.SetPubKey(vchPubKey)) + return false; + if (vchBlockSig.empty()) + return false; + return key.Verify(GetHash(), vchBlockSig); + } + } + return false; + } + bool DisconnectBlock(CTxDB& txdb, CBlockIndex* pindex); bool ConnectBlock(CTxDB& txdb, CBlockIndex* pindex); bool ReadFromDisk(const CBlockIndex* pindex, bool fReadTransactions=true);