Browse Source

Correctly handle missing inputs in signrawtransaction. Fixes #1654.

Signrawtransaction rpc was crashing when some inputs were unknown,
and even with that fixed was failing to handle all the known inputs
if there were unknown inputs in front of them. This commit instead
attempts to fetch inputs one at a time.
miguelfreitas
Gregory Maxwell 13 years ago
parent
commit
3557f99cf5
  1. 11
      src/rpcrawtransaction.cpp

11
src/rpcrawtransaction.cpp

@ -321,18 +321,23 @@ Value signrawtransaction(const Array& params, bool fHelp) @@ -321,18 +321,23 @@ Value signrawtransaction(const Array& params, bool fHelp)
// Fetch previous transactions (inputs):
map<COutPoint, CScript> mapPrevOut;
for (unsigned int i = 0; i < mergedTx.vin.size(); i++)
{
CTransaction tempTx;
MapPrevTx mapPrevTx;
CTxDB txdb("r");
map<uint256, CTxIndex> unused;
bool fInvalid;
mergedTx.FetchInputs(txdb, unused, false, false, mapPrevTx, fInvalid);
// FetchInputs aborts on failure, so we go one at a time.
tempTx.vin.push_back(mergedTx.vin[i]);
tempTx.FetchInputs(txdb, unused, false, false, mapPrevTx, fInvalid);
// Copy results into mapPrevOut:
BOOST_FOREACH(const CTxIn& txin, mergedTx.vin)
BOOST_FOREACH(const CTxIn& txin, tempTx.vin)
{
const uint256& prevHash = txin.prevout.hash;
if (mapPrevTx.count(prevHash))
if (mapPrevTx.count(prevHash) && mapPrevTx[prevHash].second.vout.size()>txin.prevout.n)
mapPrevOut[txin.prevout] = mapPrevTx[prevHash].second.vout[txin.prevout.n].scriptPubKey;
}
}

Loading…
Cancel
Save