Implement CTransaction::IsEquivalentTo(...)
Define CTransaction::IsEquivalentTo(const CTransaction& tx) True if only scriptSigs are different. In other words, true if the two transactions are malleability clones. In other words, true if the two transactions have the same effect on the outside universe. In the wallet, only SyncMetaData for equivalent transactions.
This commit is contained in:
parent
c8a1350119
commit
b2b3619262
@ -87,6 +87,15 @@ CTransaction& CTransaction::operator=(const CTransaction &tx) {
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CTransaction::IsEquivalentTo(const CTransaction& tx) const
|
||||||
|
{
|
||||||
|
CMutableTransaction tx1 = *this;
|
||||||
|
CMutableTransaction tx2 = tx;
|
||||||
|
for (unsigned int i = 0; i < tx1.vin.size(); i++) tx1.vin[i].scriptSig = CScript();
|
||||||
|
for (unsigned int i = 0; i < tx2.vin.size(); i++) tx2.vin[i].scriptSig = CScript();
|
||||||
|
return CTransaction(tx1) == CTransaction(tx2);
|
||||||
|
}
|
||||||
|
|
||||||
CAmount CTransaction::GetValueOut() const
|
CAmount CTransaction::GetValueOut() const
|
||||||
{
|
{
|
||||||
CAmount nValueOut = 0;
|
CAmount nValueOut = 0;
|
||||||
|
@ -222,6 +222,9 @@ public:
|
|||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// True if only scriptSigs are different
|
||||||
|
bool IsEquivalentTo(const CTransaction& tx) const;
|
||||||
|
|
||||||
// Return sum of txouts.
|
// Return sum of txouts.
|
||||||
CAmount GetValueOut() const;
|
CAmount GetValueOut() const;
|
||||||
// GetValueIn() is a method on CCoinsViewCache, because
|
// GetValueIn() is a method on CCoinsViewCache, because
|
||||||
|
@ -417,6 +417,7 @@ void CWallet::SyncMetaData(pair<TxSpends::iterator, TxSpends::iterator> range)
|
|||||||
const uint256& hash = it->second;
|
const uint256& hash = it->second;
|
||||||
CWalletTx* copyTo = &mapWallet[hash];
|
CWalletTx* copyTo = &mapWallet[hash];
|
||||||
if (copyFrom == copyTo) continue;
|
if (copyFrom == copyTo) continue;
|
||||||
|
if (!copyFrom->IsEquivalentTo(*copyTo)) continue;
|
||||||
copyTo->mapValue = copyFrom->mapValue;
|
copyTo->mapValue = copyFrom->mapValue;
|
||||||
copyTo->vOrderForm = copyFrom->vOrderForm;
|
copyTo->vOrderForm = copyFrom->vOrderForm;
|
||||||
// fTimeReceivedIsTxTime not copied on purpose
|
// fTimeReceivedIsTxTime not copied on purpose
|
||||||
|
Loading…
Reference in New Issue
Block a user