TxIn TxInRef::getCopy(void) const { TxIn returnTxIn; returnTxIn.unserialize(getPtr()); returnTxIn.scriptType_ = scriptType_; return returnTxIn; }
Tx BlockDataViewer::getPrevTx(TxIn & txin) const { if (txin.isCoinbase()) return Tx(); OutPoint op = txin.getOutPoint(); return getTxByHash(op.getTxHash()); }
TxOut BlockDataViewer::getPrevTxOut(TxIn & txin) const { if (txin.isCoinbase()) return TxOut(); OutPoint op = txin.getOutPoint(); Tx theTx = getTxByHash(op.getTxHash()); if (!theTx.isInitialized()) throw runtime_error("couldn't find prev tx"); uint32_t idx = op.getTxOutIndex(); return theTx.getTxOutCopy(idx); }
///////////////////////////////////////////////////////////////////////////// // This is not a pointer to persistent object, this method actually CREATES // the TxIn. But it's fast and doesn't hold a lot of post-construction // information, so it can probably just be computed on the fly TxIn Tx::getTxInCopy(int i) const { assert(isInitialized()); uint32_t txinSize = offsetsTxIn_[i+1] - offsetsTxIn_[i]; TxIn out; out.unserialize_checked(dataCopy_.getPtr()+offsetsTxIn_[i], dataCopy_.getSize()-offsetsTxIn_[i], txinSize, txRefObj_, i); if(txRefObj_.isInitialized()) { out.setParentHash(getThisHash()); out.setParentHeight(txRefObj_.getBlockHeight()); } return out; }
HashString BlockDataViewer::getSenderScrAddr(TxIn & txin) const { if (txin.isCoinbase()) return HashString(0); return getPrevTxOut(txin).getScrAddressStr(); }
int64_t BlockDataViewer::getSentValue(TxIn & txin) const { if (txin.isCoinbase()) return -1; return getPrevTxOut(txin).getValue(); }
//////////////////////////////////////////////////////////////////////////////// // Need a serious debugging method, that will touch all pointers that are // supposed to be not NULL. I'd like to try to force a segfault here, if it // is going to happen, instead of letting it kill my program where I don't // know what happened. void Tx::pprintAlot(ostream & os) { cout << "Tx hash: " << thisHash_.toHexStr(true) << endl; if(!txRefObj_.isNull()) { cout << "HeaderNum: " << getBlockHeight() << endl; //cout << "HeadHash: " << getBlockHash().toHexStr(true) << endl; } cout << endl << "NumTxIn: " << getNumTxIn() << endl; for(uint32_t i=0; i<getNumTxIn(); i++) { TxIn txin = getTxInCopy(i); cout << " TxIn: " << i << endl; cout << " Siz: " << txin.getSize() << endl; cout << " Scr: " << txin.getScriptSize() << " Type: " << (int)txin.getScriptType() << endl; cout << " OPR: " << txin.getOutPoint().getTxHash().toHexStr(true) << txin.getOutPoint().getTxOutIndex() << endl; cout << " Seq: " << txin.getSequence() << endl; } cout << endl << "NumTxOut: " << getNumTxOut() << endl; for(uint32_t i=0; i<getNumTxOut(); i++) { TxOut txout = getTxOutCopy(i); cout << " TxOut: " << i << endl; cout << " Siz: " << txout.getSize() << endl; cout << " Scr: " << txout.getScriptSize() << " Type: " << (int)txout.getScriptType() << endl; cout << " Val: " << txout.getValue() << endl; } }