From 16d35eb228232ed53f87cee233d0c8c3a9ca39eb Mon Sep 17 00:00:00 2001 From: Braydon Fuller Date: Fri, 13 May 2016 11:43:01 -0400 Subject: [PATCH] main: add amount and address to spentindex value --- src/main.cpp | 53 +++++++++++++++++++++++++--------------------------- src/main.h | 14 +++++++++++++- 2 files changed, 38 insertions(+), 29 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index d750477e92..83e48801d5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2492,39 +2492,36 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin for (size_t j = 0; j < tx.vin.size(); j++) { const CTxIn input = tx.vin[j]; + const CTxOut &prevout = view.GetOutputFor(tx.vin[j]); + uint160 hashBytes; + int addressType; + + if (prevout.scriptPubKey.IsPayToScriptHash()) { + hashBytes = uint160(vector (prevout.scriptPubKey.begin()+2, prevout.scriptPubKey.begin()+22)); + addressType = 2; + } else if (prevout.scriptPubKey.IsPayToPublicKeyHash()) { + hashBytes = uint160(vector (prevout.scriptPubKey.begin()+3, prevout.scriptPubKey.begin()+23)); + addressType = 1; + } else { + hashBytes.SetNull(); + addressType = 0; + } + + if (fAddressIndex && addressType > 0) { + // record spending activity + addressIndex.push_back(make_pair(CAddressIndexKey(addressType, hashBytes, pindex->nHeight, i, txhash, j, true), prevout.nValue * -1)); + + // remove address from unspent index + addressUnspentIndex.push_back(make_pair(CAddressUnspentKey(addressType, hashBytes, input.prevout.hash, input.prevout.n), CAddressUnspentValue())); + } if (fSpentIndex) { // add the spent index to determine the txid and input that spent an output - spentIndex.push_back(make_pair(CSpentIndexKey(input.prevout.hash, input.prevout.n), CSpentIndexValue(txhash, j, pindex->nHeight))); + // and to find the amount and address from an input + spentIndex.push_back(make_pair(CSpentIndexKey(input.prevout.hash, input.prevout.n), CSpentIndexValue(txhash, j, pindex->nHeight, prevout.nValue, addressType, hashBytes))); } - - if (fAddressIndex) { - - const CTxOut &prevout = view.GetOutputFor(tx.vin[j]); - - if (prevout.scriptPubKey.IsPayToScriptHash()) { - vector hashBytes(prevout.scriptPubKey.begin()+2, prevout.scriptPubKey.begin()+22); - - // record spending activity - addressIndex.push_back(make_pair(CAddressIndexKey(2, uint160(hashBytes), pindex->nHeight, i, txhash, j, true), prevout.nValue * -1)); - - // remove address from unspent index - addressUnspentIndex.push_back(make_pair(CAddressUnspentKey(2, uint160(hashBytes), input.prevout.hash, input.prevout.n), CAddressUnspentValue())); - } else if (prevout.scriptPubKey.IsPayToPublicKeyHash()) { - vector hashBytes(prevout.scriptPubKey.begin()+3, prevout.scriptPubKey.begin()+23); - - // record spending activity - addressIndex.push_back(make_pair(CAddressIndexKey(1, uint160(hashBytes), pindex->nHeight, i, txhash, j, true), prevout.nValue * -1)); - - // remove address from unspent index - addressUnspentIndex.push_back(make_pair(CAddressUnspentKey(1, uint160(hashBytes), input.prevout.hash, input.prevout.n), CAddressUnspentValue())); - - } else { - continue; - } - } - } + } if (fStrictPayToScriptHash) diff --git a/src/main.h b/src/main.h index 6c685e68ff..c343a264c5 100644 --- a/src/main.h +++ b/src/main.h @@ -325,6 +325,9 @@ struct CSpentIndexValue { uint256 txid; unsigned int inputIndex; int blockHeight; + CAmount satoshis; + int addressType; + uint160 addressHash; ADD_SERIALIZE_METHODS; @@ -333,12 +336,18 @@ struct CSpentIndexValue { READWRITE(txid); READWRITE(inputIndex); READWRITE(blockHeight); + READWRITE(satoshis); + READWRITE(addressType); + READWRITE(addressHash); } - CSpentIndexValue(uint256 t, unsigned int i, int h) { + CSpentIndexValue(uint256 t, unsigned int i, int h, CAmount s, int type, uint160 a) { txid = t; inputIndex = i; blockHeight = h; + satoshis = s; + addressType = type; + addressHash = a; } CSpentIndexValue() { @@ -349,6 +358,9 @@ struct CSpentIndexValue { txid.SetNull(); inputIndex = 0; blockHeight = 0; + satoshis = 0; + addressType = 0; + addressHash.SetNull(); } bool IsNull() const {