本文整理汇总了C++中CTransaction::ReadFromDisk方法的典型用法代码示例。如果您正苦于以下问题:C++ CTransaction::ReadFromDisk方法的具体用法?C++ CTransaction::ReadFromDisk怎么用?C++ CTransaction::ReadFromDisk使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CTransaction
的用法示例。
在下文中一共展示了CTransaction::ReadFromDisk方法的8个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ReadDiskTx
bool CTxDB::ReadDiskTx(uint256 hash, CTransaction& tx, CTxIndex& txindex)
{
tx.SetNull();
if (!ReadTxIndex(hash, txindex))
return false;
return (tx.ReadFromDisk(txindex.pos));
}
示例2: IsValid
// Returns:
// false - invalid move tx
// true - non-move tx or valid tx
bool IsValid(const CTransaction& tx, Move &outMove)
{
if (!GetNameOfTx(tx, vchName) || !GetValueOfNameTx(tx, vchValue))
return true;
std::string sName = stringFromVch(vchName), sValue = stringFromVch(vchValue);
if (dup.count(sName))
return error("GameStepValidator: duplicate player name %s", sName.c_str());
dup.insert(sName);
Move m;
m.Parse(sName, sValue);
if (!m)
return error("GameStepValidator: cannot parse move %s for player %s", sValue.c_str(), sName.c_str());
if (!m.IsValid(*pstate))
return error("GameStepValidator: invalid move for the game state: move %s for player %s", sValue.c_str(), sName.c_str());
std::string addressLock = m.AddressOperationPermission(*pstate);
if (!addressLock.empty())
{
// If one of inputs has address equal to addressLock, then that input has been signed by the address owner
// and thus authorizes the address change operation
bool found = false;
if (!pTxDB)
{
pTxDB = new CTxDB("r");
fOwnTxDB = true;
}
for (int i = 0; i < tx.vin.size(); i++)
{
COutPoint prevout = tx.vin[i].prevout;
CTransaction txPrev;
CTxIndex txindex;
if (!pTxDB->ReadTxIndex(prevout.hash, txindex) || txindex.pos == CDiskTxPos(1,1,1))
continue;
else if (!txPrev.ReadFromDisk(txindex.pos))
continue;
if (prevout.n >= txPrev.vout.size())
continue;
const CTxOut &vout = txPrev.vout[prevout.n];
std::string address;
if (ExtractDestination(vout.scriptPubKey, address) && address == addressLock)
{
found = true;
break;
}
}
if (!found)
return error("GameStepValidator: address operation permission denied: move %s for player %s", sValue.c_str(), sName.c_str());
}
outMove = m;
return true;
}
示例3: LoadBlockIndex
bool CTxDB::LoadBlockIndex()
{
if (!LoadBlockIndexGuts())
return false;
if (fRequestShutdown)
return true;
// Calculate bnChainTrust
vector<pair<int, CBlockIndex*> > vSortedByHeight;
vSortedByHeight.reserve(mapBlockIndex.size());
BOOST_FOREACH(const PAIRTYPE(uint256, CBlockIndex*)& item, mapBlockIndex)
{
CBlockIndex* pindex = item.second;
vSortedByHeight.push_back(make_pair(pindex->nHeight, pindex));
}
sort(vSortedByHeight.begin(), vSortedByHeight.end());
BOOST_FOREACH(const PAIRTYPE(int, CBlockIndex*)& item, vSortedByHeight)
{
CBlockIndex* pindex = item.second;
pindex->bnChainTrust = (pindex->pprev ? pindex->pprev->bnChainTrust : 0) + pindex->GetBlockTrust();
// ppcoin: calculate stake modifier checksum
pindex->nStakeModifierChecksum = GetStakeModifierChecksum(pindex);
if (!CheckStakeModifierCheckpoints(pindex->nHeight, pindex->nStakeModifierChecksum))
return error("CTxDB::LoadBlockIndex() : Failed stake modifier checkpoint height=%d, modifier=0x%016"PRI64x, pindex->nHeight, pindex->nStakeModifier);
}
// Load hashBestChain pointer to end of best chain
if (!ReadHashBestChain(hashBestChain))
{
if (pindexGenesisBlock == NULL)
return true;
return error("CTxDB::LoadBlockIndex() : hashBestChain not loaded");
}
if (!mapBlockIndex.count(hashBestChain))
return error("CTxDB::LoadBlockIndex() : hashBestChain not found in the block index");
pindexBest = mapBlockIndex[hashBestChain];
nBestHeight = pindexBest->nHeight;
bnBestChainTrust = pindexBest->bnChainTrust;
printf("LoadBlockIndex(): hashBestChain=%s height=%d trust=%s date=%s\n",
hashBestChain.ToString().substr(0,20).c_str(), nBestHeight, bnBestChainTrust.ToString().c_str(),
DateTimeStrFormat("%x %H:%M:%S", pindexBest->GetBlockTime()).c_str());
// ppcoin: load hashSyncCheckpoint
if (!ReadSyncCheckpoint(Checkpoints::hashSyncCheckpoint))
return error("CTxDB::LoadBlockIndex() : hashSyncCheckpoint not loaded");
printf("LoadBlockIndex(): synchronized checkpoint %s\n", Checkpoints::hashSyncCheckpoint.ToString().c_str());
// Load bnBestInvalidTrust, OK if it doesn't exist
ReadBestInvalidTrust(bnBestInvalidTrust);
// Verify blocks in the best chain
int nCheckLevel = GetArg("-checklevel", 1);
int nCheckDepth = GetArg( "-checkblocks", 2500);
if (nCheckDepth == 0)
nCheckDepth = 1000000000; // suffices until the year 19000
if (nCheckDepth > nBestHeight)
nCheckDepth = nBestHeight;
printf("Verifying last %i blocks at level %i\n", nCheckDepth, nCheckLevel);
CBlockIndex* pindexFork = NULL;
map<pair<unsigned int, unsigned int>, CBlockIndex*> mapBlockPos;
for (CBlockIndex* pindex = pindexBest; pindex && pindex->pprev; pindex = pindex->pprev)
{
if (fRequestShutdown || pindex->nHeight < nBestHeight-nCheckDepth)
break;
CBlock block;
if (!block.ReadFromDisk(pindex))
return error("LoadBlockIndex() : block.ReadFromDisk failed");
// check level 1: verify block validity
if (nCheckLevel>0 && !block.CheckBlock())
{
printf("LoadBlockIndex() : *** found bad block at %d, hash=%s\n", pindex->nHeight, pindex->GetBlockHash().ToString().c_str());
pindexFork = pindex->pprev;
}
// check level 2: verify transaction index validity
if (nCheckLevel>1)
{
pair<unsigned int, unsigned int> pos = make_pair(pindex->nFile, pindex->nBlockPos);
mapBlockPos[pos] = pindex;
BOOST_FOREACH(const CTransaction &tx, block.vtx)
{
uint256 hashTx = tx.GetHash();
CTxIndex txindex;
if (ReadTxIndex(hashTx, txindex))
{
// check level 3: checker transaction hashes
if (nCheckLevel>2 || pindex->nFile != txindex.pos.nFile || pindex->nBlockPos != txindex.pos.nBlockPos)
{
// either an error or a duplicate transaction
CTransaction txFound;
if (!txFound.ReadFromDisk(txindex.pos))
{
printf("LoadBlockIndex() : *** cannot read mislocated transaction %s\n", hashTx.ToString().c_str());
pindexFork = pindex->pprev;
}
else
if (txFound.GetHash() != hashTx) // not a duplicate tx
{
printf("LoadBlockIndex(): *** invalid tx position for %s\n", hashTx.ToString().c_str());
pindexFork = pindex->pprev;
//.........这里部分代码省略.........
示例4: LoadBlockIndex
//.........这里部分代码省略.........
pindexBest = mapBlockIndex[hashBestChain];
nBestHeight = pindexBest->nHeight;
nBestChainTrust = pindexBest->nChainTrust;
printf("LoadBlockIndex(): hashBestChain=%s height=%d trust=%s date=%s\n",
hashBestChain.ToString().substr(0,20).c_str(), nBestHeight, CBigNum(nBestChainTrust).ToString().c_str(),
DateTimeStrFormat("%x %H:%M:%S", pindexBest->GetBlockTime()).c_str());
// CurrentCoin: load hashSyncCheckpoint
if (!ReadSyncCheckpoint(Checkpoints::hashSyncCheckpoint))
return error("CTxDB::LoadBlockIndex() : hashSyncCheckpoint not loaded");
printf("LoadBlockIndex(): synchronized checkpoint %s\n", Checkpoints::hashSyncCheckpoint.ToString().c_str());
// Load bnBestInvalidTrust, OK if it doesn't exist
CBigNum bnBestInvalidTrust;
ReadBestInvalidTrust(bnBestInvalidTrust);
nBestInvalidTrust = bnBestInvalidTrust.getuint256();
// Verify blocks in the best chain
int nCheckLevel = GetArg("-checklevel", 1);
int nCheckDepth = GetArg( "-checkblocks", 2500);
if (nCheckDepth == 0)
nCheckDepth = 1000000000; // suffices until the year 19000
if (nCheckDepth > nBestHeight)
nCheckDepth = nBestHeight;
printf("Verifying last %i blocks at level %i\n", nCheckDepth, nCheckLevel);
CBlockIndex* pindexFork = NULL;
map<pair<unsigned int, unsigned int>, CBlockIndex*> mapBlockPos;
for (CBlockIndex* pindex = pindexBest; pindex && pindex->pprev; pindex = pindex->pprev)
{
if (fRequestShutdown || pindex->nHeight < nBestHeight-nCheckDepth)
break;
CBlock block;
if (!block.ReadFromDisk(pindex))
return error("LoadBlockIndex() : block.ReadFromDisk failed");
// check level 1: verify block validity
// check level 7: verify block signature too
if (nCheckLevel>0 && !block.CheckBlock(true, true, (nCheckLevel>6)))
{
printf("LoadBlockIndex() : *** found bad block at %d, hash=%s\n", pindex->nHeight, pindex->GetBlockHash().ToString().c_str());
pindexFork = pindex->pprev;
}
// check level 2: verify transaction index validity
if (nCheckLevel>1)
{
pair<unsigned int, unsigned int> pos = make_pair(pindex->nFile, pindex->nBlockPos);
mapBlockPos[pos] = pindex;
BOOST_FOREACH(const CTransaction &tx, block.vtx)
{
uint256 hashTx = tx.GetHash();
CTxIndex txindex;
if (ReadTxIndex(hashTx, txindex))
{
// check level 3: checker transaction hashes
if (nCheckLevel>2 || pindex->nFile != txindex.pos.nFile || pindex->nBlockPos != txindex.pos.nBlockPos)
{
// either an error or a duplicate transaction
CTransaction txFound;
if (!txFound.ReadFromDisk(txindex.pos))
{
printf("LoadBlockIndex() : *** cannot read mislocated transaction %s\n", hashTx.ToString().c_str());
pindexFork = pindex->pprev;
}
else
if (txFound.GetHash() != hashTx) // not a duplicate tx
{
示例5: IsValid
// Returns:
// false - invalid move tx
// true - non-move tx or valid tx
bool IsValid(const CTransaction& tx, Move &outMove)
{
if (tx.nVersion != NAMECOIN_TX_VERSION)
return true;
std::vector<vchType> vvchArgs;
int op, nOut;
if (!DecodeNameTx (tx, op, nOut, vvchArgs))
return error ("GameStepValidator: could not decode a name tx");
vchType vchName, vchValue;
switch (op)
{
case OP_NAME_FIRSTUPDATE:
vchName = vvchArgs[0];
vchValue = vvchArgs[2];
break;
case OP_NAME_UPDATE:
vchName = vvchArgs[0];
vchValue = vvchArgs[1];
break;
case OP_NAME_NEW:
return true;
default:
return error ("GameStepValidator: invalid name tx found");
}
const std::string sName = stringFromVch(vchName);
const std::string sValue = stringFromVch(vchValue);
if (dup.count(sName))
return error ("GameStepValidator: duplicate player name %s",
sName.c_str ());
dup.insert(sName);
Move m;
m.Parse(sName, sValue);
if (!m)
return error("GameStepValidator: cannot parse move %s for player %s", sValue.c_str(), sName.c_str());
if (!m.IsValid(*pstate))
return error("GameStepValidator: invalid move for the game state: move %s for player %s", sValue.c_str(), sName.c_str());
/* If this is a spawn move, find out the coin's value and set
the spawned player's value to it. */
if (m.IsSpawn ())
{
if (op != OP_NAME_FIRSTUPDATE)
return error ("GameStepValidator: spawn is not firstupdate");
m.coinAmount = tx.vout[nOut].nValue;
}
else if (op != OP_NAME_UPDATE)
return error ("GameStepValidator: name_firstupdate is not spawn");
std::string addressLock = m.AddressOperationPermission(*pstate);
if (!addressLock.empty())
{
// If one of inputs has address equal to addressLock, then that input has been signed by the address owner
// and thus authorizes the address change operation
bool found = false;
if (!pdbset)
{
pdbset = new DatabaseSet("r");
fOwnDb = true;
}
for (int i = 0; i < tx.vin.size(); i++)
{
COutPoint prevout = tx.vin[i].prevout;
CTransaction txPrev;
CTxIndex txindex;
if (!pdbset->tx ().ReadTxIndex (prevout.hash, txindex)
|| txindex.pos == CDiskTxPos(1,1,1))
continue;
else if (!txPrev.ReadFromDisk(txindex.pos))
continue;
if (prevout.n >= txPrev.vout.size())
continue;
const CTxOut &vout = txPrev.vout[prevout.n];
std::string address;
if (ExtractDestination(vout.scriptPubKey, address) && address == addressLock)
{
found = true;
break;
}
}
if (!found)
return error("GameStepValidator: address operation permission denied: move %s for player %s", sValue.c_str(), sName.c_str());
}
outMove = m;
return true;
}
示例6: LoadBlockIndex
//.........这里部分代码省略.........
nCounter = 0;
//#ifdef _MSC_VER
#ifdef _DEBUG
/****************
const int
nMINUTESperBLOCK = 1, // or whatever you want to do in this *coin
nMINUTESperHOUR = 60,
nBLOCKSperHOUR = nMINUTESperHOUR / nMINUTESperBLOCK,
nHOURStoCHECK = 1, //12, // this could be a variable
nBLOCKSinLASTwhateverHOURS = nBLOCKSperHOUR * nHOURStoCHECK;
nCheckDepth = nBLOCKSinLASTwhateverHOURS;
****************/
#endif
//#endif
#ifdef QT_GUI
std::string
sX;
uiInterface.InitMessage(
strprintf( _("Verifying the last %i blocks at level %i"),
nCheckDepth, nCheckLevel
).c_str()
);
#endif
#endif
printf("Verifying last %i blocks at level %i\n", nCheckDepth, nCheckLevel);
CBlockIndex* pindexFork = NULL;
map<pair<unsigned int, unsigned int>, CBlockIndex*> mapBlockPos;
for (CBlockIndex* pindex = pindexBest; pindex && pindex->pprev; pindex = pindex->pprev)
{
if (fRequestShutdown || pindex->nHeight < nBestHeight-nCheckDepth)
break;
CBlock block;
if (!block.ReadFromDisk(pindex))
return error("LoadBlockIndex() : block.ReadFromDisk failed");
// check level 1: verify block validity
// check level 7: verify block signature too
if (nCheckLevel>0 && !block.CheckBlock(true, true, (nCheckLevel>6)))
{
printf("LoadBlockIndex() : *** found bad block at %d, hash=%s\n", pindex->nHeight, pindex->GetBlockHash().ToString().c_str());
pindexFork = pindex->pprev;
}
// check level 2: verify transaction index validity
if (nCheckLevel>1)
{
pair<unsigned int, unsigned int> pos = make_pair(pindex->nFile, pindex->nBlockPos);
mapBlockPos[pos] = pindex;
BOOST_FOREACH(const CTransaction &tx, block.vtx)
{
uint256 hashTx = tx.GetHash();
CTxIndex txindex;
if (ReadTxIndex(hashTx, txindex))
{
// check level 3: checker transaction hashes
if (nCheckLevel>2 || pindex->nFile != txindex.pos.nFile || pindex->nBlockPos != txindex.pos.nBlockPos)
{
// either an error or a duplicate transaction
CTransaction txFound;
if (!txFound.ReadFromDisk(txindex.pos))
{
printf("LoadBlockIndex() : *** cannot read mislocated transaction %s\n", hashTx.ToString().c_str());
pindexFork = pindex->pprev;
}
else
if (txFound.GetHash() != hashTx) // not a duplicate tx
{
示例7: CreateRestOfTheBlock
// CreateRestOfTheBlock: collect transactions into block and fill in header
bool CreateRestOfTheBlock(CBlock &block, CBlockIndex* pindexPrev)
{
int nHeight = pindexPrev->nHeight + 1;
// Create coinbase tx
CTransaction &CoinBase= block.vtx[0];
CoinBase.nTime=block.nTime;
CoinBase.vin.resize(1);
CoinBase.vin[0].prevout.SetNull();
CoinBase.vout.resize(1);
// Height first in coinbase required for block.version=2
CoinBase.vin[0].scriptSig = (CScript() << nHeight) + COINBASE_FLAGS;
assert(CoinBase.vin[0].scriptSig.size() <= 100);
CoinBase.vout[0].SetEmpty();
// Largest block you're willing to create:
unsigned int nBlockMaxSize = GetArg("-blockmaxsize", MAX_BLOCK_SIZE_GEN/2);
// Limit to betweeen 1K and MAX_BLOCK_SIZE-1K for sanity:
nBlockMaxSize = std::max((unsigned int)1000, std::min((unsigned int)(MAX_BLOCK_SIZE-1000), nBlockMaxSize));
// How much of the block should be dedicated to high-priority transactions,
// included regardless of the fees they pay
unsigned int nBlockPrioritySize = GetArg("-blockprioritysize", 27000);
nBlockPrioritySize = std::min(nBlockMaxSize, nBlockPrioritySize);
// Minimum block size you want to create; block will be filled with free transactions
// until there are no more or the block reaches this size:
unsigned int nBlockMinSize = GetArg("-blockminsize", 0);
nBlockMinSize = std::min(nBlockMaxSize, nBlockMinSize);
// Fee-per-kilobyte amount considered the same as "free"
// Be careful setting this: if you set it to zero then
// a transaction spammer can cheaply fill blocks using
// 1-satoshi-fee transactions. It should be set above the real
// cost to you of processing a transaction.
int64_t nMinTxFee = MIN_TX_FEE;
if (mapArgs.count("-mintxfee"))
ParseMoney(mapArgs["-mintxfee"], nMinTxFee);
// Collect memory pool transactions into the block
int64_t nFees = 0;
{
LOCK2(cs_main, mempool.cs);
CTxDB txdb("r");
// Priority order to process transactions
list<COrphan> vOrphan; // list memory doesn't move
map<uint256, vector<COrphan*> > mapDependers;
// This vector will be sorted into a priority queue:
vector<TxPriority> vecPriority;
vecPriority.reserve(mempool.mapTx.size());
for (map<uint256, CTransaction>::iterator mi = mempool.mapTx.begin(); mi != mempool.mapTx.end(); ++mi)
{
CTransaction& tx = (*mi).second;
if (tx.IsCoinBase() || tx.IsCoinStake() || !IsFinalTx(tx, nHeight))
continue;
COrphan* porphan = NULL;
double dPriority = 0;
int64_t nTotalIn = 0;
bool fMissingInputs = false;
for (auto const& txin : tx.vin)
{
// Read prev transaction
CTransaction txPrev;
CTxIndex txindex;
if (fDebug10) LogPrintf("Enumerating tx %s ",tx.GetHash().GetHex());
if (!txPrev.ReadFromDisk(txdb, txin.prevout, txindex))
{
// This should never happen; all transactions in the memory
// pool should connect to either transactions in the chain
// or other transactions in the memory pool.
if (!mempool.mapTx.count(txin.prevout.hash))
{
LogPrintf("ERROR: mempool transaction missing input\n");
if (fDebug) assert("mempool transaction missing input" == 0);
fMissingInputs = true;
if (porphan)
vOrphan.pop_back();
break;
}
// Has to wait for dependencies
if (!porphan)
{
// Use list for automatic deletion
vOrphan.push_back(COrphan(&tx));
porphan = &vOrphan.back();
if (fDebug10) LogPrintf("Orphan tx %s ",tx.GetHash().GetHex());
msMiningErrorsExcluded += tx.GetHash().GetHex() + ":ORPHAN;";
}
mapDependers[txin.prevout.hash].push_back(porphan);
porphan->setDependsOn.insert(txin.prevout.hash);
nTotalIn += mempool.mapTx[txin.prevout.hash].vout[txin.prevout.n].nValue;
continue;
//.........这里部分代码省略.........
示例8: TxToJSON
void TxToJSON(const CTransaction& tx, const uint256 hashBlock, Object& entry)
{
CTxDB txdb("r");
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));
if (tx.nVersion > 1) {
entry.push_back(Pair("tx-comment", tx.strTxComment));
entry.push_back(Pair("product-id", (boost::int64_t)tx.nProdTypeID));
}
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));
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));
// [TODO] Refactor this! See getturboredemption.
CTransaction txPrev;
CTxIndex txindex;
if (!txPrev.ReadFromDisk(txdb, txin.prevout, txindex))
{
if (fDebug)
{
printf("TxToJSON: could not read txin from disk\n");
}
continue; // previous transaction not in main chain?
}
CTxOut prevtxout = txPrev.vout[txin.prevout.n];
int nRequired;
txnouttype type;
vector<CTxDestination> addresses;
if (ExtractDestinations(prevtxout.scriptPubKey, type, addresses, nRequired))
{
in.push_back(Pair("value", ValueFromAmount(prevtxout.nValue)));
}
else
{
in.push_back(Pair("type", GetTxnOutputType(TX_NONSTANDARD)));
}
Array a;
BOOST_FOREACH(const CTxDestination& addr, addresses)
{
a.push_back(CBitcoinAddress(addr).ToString());
}
in.push_back(Pair("addresses", a));
vin.push_back(in);
}