void TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry) { entry.pushKV("txid", tx.GetHash().GetHex()); entry.pushKV("version", tx.nVersion); entry.pushKV("locktime", (int64_t)tx.nLockTime); UniValue vin(UniValue::VARR); BOOST_FOREACH(const CTxIn& txin, tx.vin) { UniValue in(UniValue::VOBJ); if (tx.IsCoinBase()) in.pushKV("coinbase", HexStr(txin.scriptSig.begin(), txin.scriptSig.end())); else { in.pushKV("txid", txin.prevout.hash.GetHex()); in.pushKV("vout", (int64_t)txin.prevout.n); UniValue o(UniValue::VOBJ); o.pushKV("asm", ScriptToAsmStr(txin.scriptSig, true)); o.pushKV("hex", HexStr(txin.scriptSig.begin(), txin.scriptSig.end())); in.pushKV("scriptSig", o); } in.pushKV("sequence", (int64_t)txin.nSequence); vin.push_back(in); } entry.pushKV("vin", vin); UniValue vout(UniValue::VARR); for (unsigned int i = 0; i < tx.vout.size(); i++) { const CTxOut& txout = tx.vout[i]; UniValue out(UniValue::VOBJ); UniValue outValue(UniValue::VNUM, FormatMoney(txout.nValue)); out.pushKV("value", outValue); out.pushKV("n", (int64_t)i); UniValue o(UniValue::VOBJ); ScriptPubKeyToUniv(txout.scriptPubKey, o, true); out.pushKV("scriptPubKey", o); vout.push_back(out); } entry.pushKV("vout", vout); if (!hashBlock.IsNull()) entry.pushKV("blockhash", hashBlock.GetHex()); entry.pushKV("hex", EncodeHexTx(tx)); // the hex-encoded transaction. used the name "hex" to be consistent with the verbose output of "getrawtransaction". }
bool CzTNXTracker::UnArchive(const uint256& hashPubcoin, bool isDeterministic) { CWalletDB walletdb(strWalletFile); if (isDeterministic) { CDeterministicMint dMint; if (!walletdb.UnarchiveDeterministicMint(hashPubcoin, dMint)) return error("%s: failed to unarchive deterministic mint", __func__); Add(dMint, false); } else { CZerocoinMint mint; if (!walletdb.UnarchiveZerocoinMint(hashPubcoin, mint)) return error("%s: failed to unarchivezerocoin mint", __func__); Add(mint, false); } LogPrintf("%s: unarchived %s\n", __func__, hashPubcoin.GetHex()); return true; }
void TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry) { entry.pushKV("txid", tx.GetHash().GetHex()); entry.pushKV("version", tx.nVersion); entry.pushKV("locktime", (int64_t)tx.nLockTime); UniValue vin(UniValue::VARR); BOOST_FOREACH(const CTxIn& txin, tx.vin) { UniValue in(UniValue::VOBJ); if (tx.IsCoinBase()) in.pushKV("coinbase", HexStr(txin.scriptSig.begin(), txin.scriptSig.end())); else { in.pushKV("txid", txin.prevout.hash.GetHex()); in.pushKV("vout", (int64_t)txin.prevout.n); UniValue o(UniValue::VOBJ); o.pushKV("asm", txin.scriptSig.ToString()); o.pushKV("hex", HexStr(txin.scriptSig.begin(), txin.scriptSig.end())); in.pushKV("scriptSig", o); } in.pushKV("sequence", (int64_t)txin.nSequence); vin.push_back(in); } entry.pushKV("vin", vin); UniValue vout(UniValue::VARR); for (unsigned int i = 0; i < tx.vout.size(); i++) { const CTxOut& txout = tx.vout[i]; UniValue out(UniValue::VOBJ); UniValue outValue(UniValue::VNUM, FormatMoney(txout.nValue)); out.pushKV("value", outValue); out.pushKV("n", (int64_t)i); UniValue o(UniValue::VOBJ); ScriptPubKeyToUniv(txout.scriptPubKey, o, true); out.pushKV("scriptPubKey", o); vout.push_back(out); } entry.pushKV("vout", vout); if (hashBlock != 0) entry.pushKV("blockhash", hashBlock.GetHex()); }
bool CZMQPublishRawBlockNotifier::NotifyBlock(const uint256 &hash) { LogPrint("zmq", "Publish raw block %s\n", hash.GetHex()); CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); { LOCK(cs_main); CBlock block; CBlockIndex* pblockindex = mapBlockIndex[hash]; if(!ReadBlockFromDisk(block, pblockindex)) { zmqError("Can't read block from disk"); return false; } ss << block; } int rc = zmq_send_multipart(psocket, "rawblock", 8, &(*ss.begin()), ss.size(), 0); return rc == 0; }
void TxToJSON(const CTransaction& tx, const uint256 hashBlock, UniValue& entry) { // Call into TxToUniv() in bitcoin-common to decode the transaction hex. // // Blockchain contextual information (confirmations and blocktime) is not // available to code in bitcoin-common, so we query them here and push the // data into the returned UniValue. TxToUniv(tx, uint256(), entry, true, RPCSerializationFlags()); if (!hashBlock.IsNull()) { entry.push_back(Pair("blockhash", hashBlock.GetHex())); BlockMap::iterator mi = mapBlockIndex.find(hashBlock); if (mi != mapBlockIndex.end() && (*mi).second) { CBlockIndex* pindex = (*mi).second; if (chainActive.Contains(pindex)) { entry.push_back(Pair("confirmations", 1 + chainActive.Height() - pindex->nHeight)); entry.push_back(Pair("time", pindex->GetBlockTime())); entry.push_back(Pair("blocktime", pindex->GetBlockTime())); } else entry.push_back(Pair("confirmations", 0)); } } }
void TxToJSON(const CTransaction& tx, const uint256 hashBlock, UniValue& entry) { entry.push_back(Pair("txid", tx.GetHash().GetHex())); entry.push_back(Pair("hash", tx.GetWitnessHash().GetHex())); entry.push_back(Pair("size", (int)::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION))); entry.push_back(Pair("vsize", (int)::GetVirtualTransactionSize(tx))); entry.push_back(Pair("version", tx.nVersion)); entry.push_back(Pair("locktime", (int64_t)tx.nLockTime)); UniValue vin(UniValue::VARR); for (unsigned int i = 0; i < tx.vin.size(); i++) { const CTxIn& txin = tx.vin[i]; UniValue in(UniValue::VOBJ); if (tx.IsCoinBase()) in.push_back(Pair("coinbase", HexStr(txin.scriptSig.begin(), txin.scriptSig.end()))); else { in.push_back(Pair("txid", txin.prevout.hash.GetHex())); in.push_back(Pair("vout", (int64_t)txin.prevout.n)); UniValue o(UniValue::VOBJ); o.push_back(Pair("asm", ScriptToAsmStr(txin.scriptSig, true))); o.push_back(Pair("hex", HexStr(txin.scriptSig.begin(), txin.scriptSig.end()))); in.push_back(Pair("scriptSig", o)); } if (!tx.wit.IsNull()) { if (!tx.wit.vtxinwit[i].IsNull()) { UniValue txinwitness(UniValue::VARR); for (unsigned int j = 0; j < tx.wit.vtxinwit[i].scriptWitness.stack.size(); j++) { std::vector<unsigned char> item = tx.wit.vtxinwit[i].scriptWitness.stack[j]; txinwitness.push_back(HexStr(item.begin(), item.end())); } in.push_back(Pair("txinwitness", txinwitness)); } } in.push_back(Pair("sequence", (int64_t)txin.nSequence)); vin.push_back(in); } entry.push_back(Pair("vin", vin)); UniValue vout(UniValue::VARR); for (unsigned int i = 0; i < tx.vout.size(); i++) { const CTxOut& txout = tx.vout[i]; UniValue out(UniValue::VOBJ); out.push_back(Pair("value", ValueFromAmount(txout.nValue))); out.push_back(Pair("n", (int64_t)i)); UniValue o(UniValue::VOBJ); ScriptPubKeyToJSON(txout.scriptPubKey, o, true); out.push_back(Pair("scriptPubKey", o)); vout.push_back(out); } entry.push_back(Pair("vout", vout)); if (!hashBlock.IsNull()) { entry.push_back(Pair("blockhash", hashBlock.GetHex())); BlockMap::iterator mi = mapBlockIndex.find(hashBlock); if (mi != mapBlockIndex.end() && (*mi).second) { CBlockIndex* pindex = (*mi).second; if (chainActive.Contains(pindex)) { entry.push_back(Pair("confirmations", 1 + chainActive.Height() - pindex->nHeight)); entry.push_back(Pair("time", pindex->GetBlockTime())); entry.push_back(Pair("blocktime", pindex->GetBlockTime())); } else entry.push_back(Pair("confirmations", 0)); } } }
void TxToJSON(const CTransaction& tx, const uint256 hashBlock, Object& entry) { entry.push_back(Pair("txid", tx.GetHash().GetHex())); entry.push_back(Pair("version", tx.nVersion)); entry.push_back(Pair("time", (boost::int64_t)tx.nTime)); entry.push_back(Pair("locktime", (boost::int64_t)tx.nLockTime)); Array vin; BOOST_FOREACH(const CTxIn& txin, tx.vin) { Object in; if (tx.IsCoinBase()) in.push_back(Pair("coinbase", HexStr(txin.scriptSig.begin(), txin.scriptSig.end()))); else { in.push_back(Pair("txid", txin.prevout.hash.GetHex())); in.push_back(Pair("vout", (boost::int64_t)txin.prevout.n)); CTransaction txoutspent; uint256 tempHash = 0; if(GetTransaction( txin.prevout.hash, txoutspent, tempHash)) { in.push_back(Pair("value", ValueFromAmount(txoutspent.vout[txin.prevout.n].nValue))); CTxDestination inputAddress; ExtractDestination(txoutspent.vout[txin.prevout.n].scriptPubKey, inputAddress); in.push_back(Pair("addressfrom", CBitcoinAddress(inputAddress).ToString())); } Object o; o.push_back(Pair("asm", txin.scriptSig.ToString())); o.push_back(Pair("hex", HexStr(txin.scriptSig.begin(), txin.scriptSig.end()))); in.push_back(Pair("scriptSig", o)); } in.push_back(Pair("sequence", (boost::int64_t)txin.nSequence)); vin.push_back(in); } entry.push_back(Pair("vin", vin)); Array vout; for (unsigned int i = 0; i < tx.vout.size(); i++) { const CTxOut& txout = tx.vout[i]; Object out; out.push_back(Pair("value", ValueFromAmount(txout.nValue))); out.push_back(Pair("n", (boost::int64_t)i)); Object o; ScriptPubKeyToJSON(txout.scriptPubKey, o); out.push_back(Pair("scriptPubKey", o)); vout.push_back(out); } entry.push_back(Pair("vout", vout)); if (hashBlock != 0) { entry.push_back(Pair("blockhash", hashBlock.GetHex())); map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hashBlock); if (mi != mapBlockIndex.end() && (*mi).second) { CBlockIndex* pindex = (*mi).second; if (pindex->IsInMainChain()) { entry.push_back(Pair("confirmations", 1 + nBestHeight - pindex->nHeight)); entry.push_back(Pair("time", (boost::int64_t)pindex->nTime)); entry.push_back(Pair("blocktime", (boost::int64_t)pindex->nTime)); } else entry.push_back(Pair("confirmations", 0)); } } }
bool CheckProofOfWork(uint256 hash, unsigned int nBits, const Consensus::Params& params, unsigned int nSameMiner) { bool fNegative; bool fOverflow; arith_uint256 bnTarget; // Adjust the difficulty with the amount of repeated miner. bnTarget.SetCompact(nBits, &fNegative, &fOverflow); bnTarget /= std::pow(Params().DynamicDiff(), nSameMiner); // Check range if (fNegative || bnTarget == 0 || fOverflow || bnTarget > UintToArith256(params.powLimit)) return error("CheckProofOfWork(): nBits below minimum work"); // Check proof of work matches claimed amount if (UintToArith256(hash) > bnTarget) return error("%s() : hash doesn't match nBits, %d same miners, \ntarget: %s, \nhash: %s", __func__, nSameMiner, bnTarget.GetHex(), hash.GetHex()); return true; }
string ToString() { return strprintf("nVersion=%d, hashPreBlock=%s, hashMerkleRoot=%s, nValue=%ld, nTime=%ld, nNonce=%ld, nHeight=%d, nFuel=%ld nFuelRate=%d\n", nVersion, hashPrevBlock.GetHex(), hashMerkleRoot.GetHex(), nValues, nTime, nNonce, nHeight, nFuel, nFuelRate); }
UniValue blockToDeltasJSON(const CBlock& block, const CBlockIndex* blockindex) { UniValue result(UniValue::VOBJ); result.push_back(Pair("hash", block.GetHash().GetHex())); int confirmations = -1; // Only report confirmations if the block is on the main chain if (chainActive.Contains(blockindex)) { confirmations = chainActive.Height() - blockindex->nHeight + 1; } else { throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block is an orphan"); } result.push_back(Pair("confirmations", confirmations)); result.push_back(Pair("size", (int)::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION))); result.push_back(Pair("height", blockindex->nHeight)); result.push_back(Pair("version", block.nVersion)); result.push_back(Pair("merkleroot", block.hashMerkleRoot.GetHex())); UniValue deltas(UniValue::VARR); for (unsigned int i = 0; i < block.vtx.size(); i++) { const CTransaction &tx = block.vtx[i]; const uint256 txhash = tx.GetHash(); UniValue entry(UniValue::VOBJ); entry.push_back(Pair("txid", txhash.GetHex())); entry.push_back(Pair("index", (int)i)); UniValue inputs(UniValue::VARR); if (!tx.IsCoinBase()) { for (size_t j = 0; j < tx.vin.size(); j++) { const CTxIn input = tx.vin[j]; UniValue delta(UniValue::VOBJ); CSpentIndexValue spentInfo; CSpentIndexKey spentKey(input.prevout.hash, input.prevout.n); if (GetSpentIndex(spentKey, spentInfo)) { if (spentInfo.addressType == 1) { delta.push_back(Pair("address", CDeuscoinAddress(CKeyID(spentInfo.addressHash)).ToString())); } else if (spentInfo.addressType == 2) { delta.push_back(Pair("address", CDeuscoinAddress(CScriptID(spentInfo.addressHash)).ToString())); } else { continue; } delta.push_back(Pair("satoshis", -1 * spentInfo.satoshis)); delta.push_back(Pair("index", (int)j)); delta.push_back(Pair("prevtxid", input.prevout.hash.GetHex())); delta.push_back(Pair("prevout", (int)input.prevout.n)); inputs.push_back(delta); } else { throw JSONRPCError(RPC_INTERNAL_ERROR, "Spent information not available"); } } } entry.push_back(Pair("inputs", inputs)); UniValue outputs(UniValue::VARR); for (unsigned int k = 0; k < tx.vout.size(); k++) { const CTxOut &out = tx.vout[k]; UniValue delta(UniValue::VOBJ); if (out.scriptPubKey.IsPayToScriptHash()) { vector<unsigned char> hashBytes(out.scriptPubKey.begin()+2, out.scriptPubKey.begin()+22); delta.push_back(Pair("address", CDeuscoinAddress(CScriptID(uint160(hashBytes))).ToString())); } else if (out.scriptPubKey.IsPayToPublicKeyHash()) { vector<unsigned char> hashBytes(out.scriptPubKey.begin()+3, out.scriptPubKey.begin()+23); delta.push_back(Pair("address", CDeuscoinAddress(CKeyID(uint160(hashBytes))).ToString())); } else { continue; } delta.push_back(Pair("satoshis", out.nValue)); delta.push_back(Pair("index", (int)k)); outputs.push_back(delta); } entry.push_back(Pair("outputs", outputs)); deltas.push_back(entry); } result.push_back(Pair("deltas", deltas)); result.push_back(Pair("time", block.GetBlockTime())); result.push_back(Pair("mediantime", (int64_t)blockindex->GetMedianTimePast())); result.push_back(Pair("nonce", (uint64_t)block.nNonce)); result.push_back(Pair("bits", strprintf("%08x", block.nBits))); result.push_back(Pair("difficulty", GetDifficulty(blockindex))); result.push_back(Pair("chainwork", blockindex->nChainWork.GetHex())); if (blockindex->pprev) result.push_back(Pair("previousblockhash", blockindex->pprev->GetBlockHash().GetHex())); CBlockIndex *pnext = chainActive.Next(blockindex); if (pnext) result.push_back(Pair("nextblockhash", pnext->GetBlockHash().GetHex())); return result; }
/* Function to enumerate sub sends for a given txid and add to supplied JSON array * Note: this function exists as send all has the potential to carry multiple sends in a single transaction. */ int populateRPCSendAllSubSends(const uint256& txid, UniValue& subSends) { int numberOfSubSends = 0; { LOCK(cs_tally); numberOfSubSends = p_txlistdb->getNumberOfSubRecords(txid); } if (numberOfSubSends <= 0) { PrintToLog("TXLISTDB Error: Transaction %s parsed as a send all but could not locate sub sends in txlistdb.\n", txid.GetHex()); return -1; } for (int subSend = 1; subSend <= numberOfSubSends; subSend++) { UniValue subSendObj(UniValue::VOBJ); uint32_t propertyId; int64_t amount; { LOCK(cs_tally); p_txlistdb->getSendAllDetails(txid, subSend, propertyId, amount); } subSendObj.push_back(Pair("propertyid", (uint64_t)propertyId)); subSendObj.push_back(Pair("divisible", isPropertyDivisible(propertyId))); subSendObj.push_back(Pair("amount", FormatMP(propertyId, amount))); subSends.push_back(subSendObj); } return subSends.size(); }
int populateRPCTransactionObject(const CTransaction& tx, const uint256& blockHash, UniValue& txobj, std::string filterAddress, bool extendedDetails, std::string extendedDetailsFilter, int blockHeight) { int confirmations = 0; int64_t blockTime = 0; int positionInBlock = 0; if (blockHeight == 0) { blockHeight = GetHeight(); } if (!blockHash.IsNull()) { CBlockIndex* pBlockIndex = GetBlockIndex(blockHash); if (NULL != pBlockIndex) { confirmations = 1 + blockHeight - pBlockIndex->nHeight; blockTime = pBlockIndex->nTime; blockHeight = pBlockIndex->nHeight; } } // attempt to parse the transaction CMPTransaction mp_obj; int parseRC = ParseTransaction(tx, blockHeight, 0, mp_obj, blockTime); if (parseRC < 0) return MP_TX_IS_NOT_MASTER_PROTOCOL; const uint256& txid = tx.GetHash(); // DEx BTC payment needs special handling since it's not actually an Omni message - handle and return if (parseRC > 0) { if (confirmations <= 0) { // only confirmed DEx payments are currently supported return MP_TX_UNCONFIRMED; } std::string tmpBuyer, tmpSeller; uint64_t tmpVout, tmpNValue, tmpPropertyId; { LOCK(cs_tally); p_txlistdb->getPurchaseDetails(txid, 1, &tmpBuyer, &tmpSeller, &tmpVout, &tmpPropertyId, &tmpNValue); } UniValue purchases(UniValue::VARR); if (populateRPCDExPurchases(tx, purchases, filterAddress) <= 0) return -1; txobj.push_back(Pair("txid", txid.GetHex())); txobj.push_back(Pair("type", "DEx Purchase")); txobj.push_back(Pair("sendingaddress", tmpBuyer)); txobj.push_back(Pair("purchases", purchases)); txobj.push_back(Pair("blockhash", blockHash.GetHex())); txobj.push_back(Pair("blocktime", blockTime)); txobj.push_back(Pair("block", blockHeight)); txobj.push_back(Pair("confirmations", confirmations)); return 0; } // check if we're filtering from listtransactions_MP, and if so whether we have a non-match we want to skip if (!filterAddress.empty() && mp_obj.getSender() != filterAddress && mp_obj.getReceiver() != filterAddress) return -1; // parse packet and populate mp_obj if (!mp_obj.interpret_Transaction()) return MP_TX_IS_NOT_MASTER_PROTOCOL; // obtain validity - only confirmed transactions can be valid bool valid = false; if (confirmations > 0) { LOCK(cs_tally); valid = getValidMPTX(txid); positionInBlock = p_OmniTXDB->FetchTransactionPosition(txid); } // populate some initial info for the transaction bool fMine = false; if (IsMyAddress(mp_obj.getSender()) || IsMyAddress(mp_obj.getReceiver())) fMine = true; txobj.push_back(Pair("txid", txid.GetHex())); txobj.push_back(Pair("fee", FormatDivisibleMP(mp_obj.getFeePaid()))); txobj.push_back(Pair("sendingaddress", mp_obj.getSender())); if (showRefForTx(mp_obj.getType())) txobj.push_back(Pair("referenceaddress", mp_obj.getReceiver())); txobj.push_back(Pair("ismine", fMine)); txobj.push_back(Pair("version", (uint64_t)mp_obj.getVersion())); txobj.push_back(Pair("type_int", (uint64_t)mp_obj.getType())); if (mp_obj.getType() != MSC_TYPE_SIMPLE_SEND) { // Type 0 will add "Type" attribute during populateRPCTypeSimpleSend txobj.push_back(Pair("type", mp_obj.getTypeString())); } // populate type specific info and extended details if requested // extended details are not available for unconfirmed transactions if (confirmations <= 0) extendedDetails = false; populateRPCTypeInfo(mp_obj, txobj, mp_obj.getType(), extendedDetails, extendedDetailsFilter, confirmations); // state and chain related information if (confirmations != 0 && !blockHash.IsNull()) { txobj.push_back(Pair("valid", valid)); if (!valid) { txobj.push_back(Pair("invalidreason", p_OmniTXDB->FetchInvalidReason(txid))); } txobj.push_back(Pair("blockhash", blockHash.GetHex())); txobj.push_back(Pair("blocktime", blockTime)); txobj.push_back(Pair("positioninblock", positionInBlock)); } if (confirmations != 0) { txobj.push_back(Pair("block", blockHeight)); } txobj.push_back(Pair("confirmations", confirmations)); // finished return 0; }
void TxToJSON(const CTransaction& tx, const uint256 hashBlock, Object& entry) { entry.push_back(Pair("txid", tx.GetHash().GetHex())); entry.push_back(Pair("version", tx.nVersion)); entry.push_back(Pair("time", (int64_t)tx.nTime)); entry.push_back(Pair("locktime", (int64_t)tx.nLockTime)); if (tx.nVersion > CTransaction::LEGACY_VERSION_1) { entry.push_back(Pair("clam-speech", tx.strCLAMSpeech)); } Array vin; BOOST_FOREACH(const CTxIn& txin, tx.vin) { Object in; if (tx.IsCoinBase()) in.push_back(Pair("coinbase", HexStr(txin.scriptSig.begin(), txin.scriptSig.end()))); else { in.push_back(Pair("txid", txin.prevout.hash.GetHex())); in.push_back(Pair("vout", (int64_t)txin.prevout.n)); Object o; o.push_back(Pair("asm", txin.scriptSig.ToString())); o.push_back(Pair("hex", HexStr(txin.scriptSig.begin(), txin.scriptSig.end()))); in.push_back(Pair("scriptSig", o)); } in.push_back(Pair("sequence", (int64_t)txin.nSequence)); vin.push_back(in); } entry.push_back(Pair("vin", vin)); Array vout; for (unsigned int i = 0; i < tx.vout.size(); i++) { const CTxOut& txout = tx.vout[i]; Object out; out.push_back(Pair("value", ValueFromAmount(txout.nValue))); out.push_back(Pair("n", (int64_t)i)); Object o; ScriptPubKeyToJSON(txout.scriptPubKey, o, false); out.push_back(Pair("scriptPubKey", o)); vout.push_back(out); } entry.push_back(Pair("vout", vout)); if (hashBlock != 0) { entry.push_back(Pair("blockhash", hashBlock.GetHex())); map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hashBlock); if (mi != mapBlockIndex.end() && (*mi).second) { CBlockIndex* pindex = (*mi).second; if (pindex->IsInMainChain()) { entry.push_back(Pair("confirmations", 1 + nBestHeight - pindex->nHeight)); entry.push_back(Pair("time", (int64_t)pindex->nTime)); entry.push_back(Pair("blocktime", (int64_t)pindex->nTime)); } else entry.push_back(Pair("confirmations", 0)); } } }
//Get checkpoint value for a specific block height bool CalculateAccumulatorCheckpoint(int nHeight, uint256& nCheckpoint) { if (nHeight < Params().Zerocoin_StartHeight()) { nCheckpoint = 0; return true; } //the checkpoint is updated every ten blocks, return current active checkpoint if not update block if (nHeight % 10 != 0) { nCheckpoint = chainActive[nHeight - 1]->nAccumulatorCheckpoint; return true; } //set the accumulators to last checkpoint value AccumulatorMap mapAccumulators; if (!mapAccumulators.Load(chainActive[nHeight - 1]->nAccumulatorCheckpoint)) { if (chainActive[nHeight - 1]->nAccumulatorCheckpoint == 0) { //Before zerocoin is fully activated so set to init state mapAccumulators.Reset(); } else { LogPrintf("%s: failed to reset to previous checkpoint\n", __func__); return false; } } //Whether this should filter out invalid/fraudulent outpoints bool fFilterInvalid = nHeight >= Params().Zerocoin_Block_RecalculateAccumulators(); //Accumulate all coins over the last ten blocks that havent been accumulated (height - 20 through height - 11) int nTotalMintsFound = 0; CBlockIndex *pindex = chainActive[nHeight - 20]; //On a specific block, a recalculation of the accumulators will be forced if (nHeight == Params().Zerocoin_Block_RecalculateAccumulators()) { pindex = chainActive[Params().Zerocoin_Block_LastGoodCheckpoint() - 10]; mapAccumulators.Reset(); if (!mapAccumulators.Load(chainActive[Params().Zerocoin_Block_LastGoodCheckpoint()]->nAccumulatorCheckpoint)) { LogPrintf("%s: failed to reset to previous checkpoint when recalculating accumulators\n", __func__); return false; } LogPrintf("*** %s recalculating checkpoint\n", __func__); // Erase the checkpoints from the period of time that bad mints were being made if (!EraseCheckpoints(Params().Zerocoin_Block_LastGoodCheckpoint() + 1, nHeight)) { LogPrintf("%s : failed to erase Checkpoints while recalculating checkpoints\n", __func__); return false; } } while (pindex->nHeight < nHeight - 10) { // checking whether we should stop this process due to a shutdown request if (ShutdownRequested()) { return false; } //make sure this block is eligible for accumulation if (pindex->nHeight < Params().Zerocoin_StartHeight()) { pindex = chainActive[pindex->nHeight + 1]; continue; } //grab mints from this block CBlock block; if(!ReadBlockFromDisk(block, pindex)) { LogPrint("zero","%s: failed to read block from disk\n", __func__); return false; } std::list<PublicCoin> listPubcoins; if (!BlockToPubcoinList(block, listPubcoins, fFilterInvalid)) { LogPrint("zero","%s: failed to get zerocoin mintlist from block %n\n", __func__, pindex->nHeight); return false; } nTotalMintsFound += listPubcoins.size(); LogPrint("zero", "%s found %d mints\n", __func__, listPubcoins.size()); //add the pubcoins to accumulator for (const PublicCoin pubcoin : listPubcoins) { if(!mapAccumulators.Accumulate(pubcoin, true)) { LogPrintf("%s: failed to add pubcoin to accumulator at height %n\n", __func__, pindex->nHeight); return false; } } pindex = chainActive.Next(pindex); } // if there were no new mints found, the accumulator checkpoint will be the same as the last checkpoint if (nTotalMintsFound == 0) { nCheckpoint = chainActive[nHeight - 1]->nAccumulatorCheckpoint; } else nCheckpoint = mapAccumulators.GetCheckpoint(); // make sure that these values are databased because reorgs may have deleted the checksums from DB DatabaseChecksums(mapAccumulators); LogPrint("zero", "%s checkpoint=%s\n", __func__, nCheckpoint.GetHex()); return true; }
//Get checkpoint value for a specific block height bool CalculateAccumulatorCheckpoint(int nHeight, uint256& nCheckpoint, AccumulatorMap& mapAccumulators) { if (nHeight < Params().Zerocoin_Block_V2_Start()) { nCheckpoint = 0; return true; } //the checkpoint is updated every ten blocks, return current active checkpoint if not update block if (nHeight % 10 != 0) { nCheckpoint = chainActive[nHeight - 1]->nAccumulatorCheckpoint; return true; } //set the accumulators to last checkpoint value int nHeightCheckpoint; mapAccumulators.Reset(); if (!InitializeAccumulators(nHeight, nHeightCheckpoint, mapAccumulators)) return error("%s: failed to initialize accumulators", __func__); //Whether this should filter out invalid/fraudulent outpoints bool fFilterInvalid = nHeight >= Params().Zerocoin_Block_RecalculateAccumulators(); //Accumulate all coins over the last ten blocks that havent been accumulated (height - 20 through height - 11) int nTotalMintsFound = 0; CBlockIndex *pindex = chainActive[nHeightCheckpoint - 20]; while (pindex->nHeight < nHeight - 10) { // checking whether we should stop this process due to a shutdown request if (ShutdownRequested()) return false; //make sure this block is eligible for accumulation if (pindex->nHeight < Params().Zerocoin_StartHeight()) { pindex = chainActive[pindex->nHeight + 1]; continue; } //grab mints from this block CBlock block; if(!ReadBlockFromDisk(block, pindex)) return error("%s: failed to read block from disk", __func__); std::list<PublicCoin> listPubcoins; if (!BlockToPubcoinList(block, listPubcoins, fFilterInvalid)) return error("%s: failed to get zerocoin mintlist from block %d", __func__, pindex->nHeight); nTotalMintsFound += listPubcoins.size(); LogPrint("zero", "%s found %d mints\n", __func__, listPubcoins.size()); //add the pubcoins to accumulator for (const PublicCoin& pubcoin : listPubcoins) { if(!mapAccumulators.Accumulate(pubcoin, true)) return error("%s: failed to add pubcoin to accumulator at height %d", __func__, pindex->nHeight); } pindex = chainActive.Next(pindex); } // if there were no new mints found, the accumulator checkpoint will be the same as the last checkpoint if (nTotalMintsFound == 0) nCheckpoint = chainActive[nHeight - 1]->nAccumulatorCheckpoint; else nCheckpoint = mapAccumulators.GetCheckpoint(); LogPrint("zero", "%s checkpoint=%s\n", __func__, nCheckpoint.GetHex()); return true; }
(0x4c5+8720-0x26a6);return asc;}return(0x8b0+1872-0xfff);}std::string HashHex( uint256 blockhash){CPID c2=CPID(blockhash.GetHex());std::string shash=c2. hexdigest();return shash;}std::string ROR(std::string blockhash,int iPos,std::