Add have-pubkey distinction to ISMINE flags
This indicates that, eg, we have a public key for a key which may be used as a pay-to-pubkey-hash. It generally means that we can create a valid scriptSig except for missing private key(s) with which to create signatures.
This commit is contained in:
parent
5c17059872
commit
d3354c52d7
4 changed files with 18 additions and 10 deletions
|
@ -165,7 +165,7 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx, TransactionReco
|
||||||
|
|
||||||
if (fAllFromMe)
|
if (fAllFromMe)
|
||||||
{
|
{
|
||||||
if(fAllFromMe == ISMINE_WATCH_ONLY)
|
if(fAllFromMe & ISMINE_WATCH_ONLY)
|
||||||
strHTML += "<b>" + tr("From") + ":</b> " + tr("watch-only") + "<br>";
|
strHTML += "<b>" + tr("From") + ":</b> " + tr("watch-only") + "<br>";
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -190,7 +190,7 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx, TransactionReco
|
||||||
strHTML += GUIUtil::HtmlEscape(CBitcoinAddress(address).ToString());
|
strHTML += GUIUtil::HtmlEscape(CBitcoinAddress(address).ToString());
|
||||||
if(toSelf == ISMINE_SPENDABLE)
|
if(toSelf == ISMINE_SPENDABLE)
|
||||||
strHTML += " (own address)";
|
strHTML += " (own address)";
|
||||||
else if(toSelf == ISMINE_WATCH_ONLY)
|
else if(toSelf & ISMINE_WATCH_ONLY)
|
||||||
strHTML += " (watch-only)";
|
strHTML += " (watch-only)";
|
||||||
strHTML += "<br>";
|
strHTML += "<br>";
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,7 @@ QList<TransactionRecord> TransactionRecord::decomposeTransaction(const CWallet *
|
||||||
CTxDestination address;
|
CTxDestination address;
|
||||||
sub.idx = parts.size(); // sequence number
|
sub.idx = parts.size(); // sequence number
|
||||||
sub.credit = txout.nValue;
|
sub.credit = txout.nValue;
|
||||||
sub.involvesWatchAddress = mine == ISMINE_WATCH_ONLY;
|
sub.involvesWatchAddress = mine & ISMINE_WATCH_ONLY;
|
||||||
if (ExtractDestination(txout.scriptPubKey, address) && IsMine(*wallet, address))
|
if (ExtractDestination(txout.scriptPubKey, address) && IsMine(*wallet, address))
|
||||||
{
|
{
|
||||||
// Received by Bitcoin Address
|
// Received by Bitcoin Address
|
||||||
|
@ -86,7 +86,7 @@ QList<TransactionRecord> TransactionRecord::decomposeTransaction(const CWallet *
|
||||||
BOOST_FOREACH(const CTxIn& txin, wtx.vin)
|
BOOST_FOREACH(const CTxIn& txin, wtx.vin)
|
||||||
{
|
{
|
||||||
isminetype mine = wallet->IsMine(txin);
|
isminetype mine = wallet->IsMine(txin);
|
||||||
if(mine == ISMINE_WATCH_ONLY) involvesWatchAddress = true;
|
if(mine & ISMINE_WATCH_ONLY) involvesWatchAddress = true;
|
||||||
if(fAllFromMe > mine) fAllFromMe = mine;
|
if(fAllFromMe > mine) fAllFromMe = mine;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,7 +94,7 @@ QList<TransactionRecord> TransactionRecord::decomposeTransaction(const CWallet *
|
||||||
BOOST_FOREACH(const CTxOut& txout, wtx.vout)
|
BOOST_FOREACH(const CTxOut& txout, wtx.vout)
|
||||||
{
|
{
|
||||||
isminetype mine = wallet->IsMine(txout);
|
isminetype mine = wallet->IsMine(txout);
|
||||||
if(mine == ISMINE_WATCH_ONLY) involvesWatchAddress = true;
|
if(mine & ISMINE_WATCH_ONLY) involvesWatchAddress = true;
|
||||||
if(fAllToMe > mine) fAllToMe = mine;
|
if(fAllToMe > mine) fAllToMe = mine;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include "keystore.h"
|
#include "keystore.h"
|
||||||
#include "script/script.h"
|
#include "script/script.h"
|
||||||
#include "script/standard.h"
|
#include "script/standard.h"
|
||||||
|
#include "script/sign.h"
|
||||||
|
|
||||||
#include <boost/foreach.hpp>
|
#include <boost/foreach.hpp>
|
||||||
|
|
||||||
|
@ -40,7 +41,7 @@ isminetype IsMine(const CKeyStore &keystore, const CScript& scriptPubKey)
|
||||||
txnouttype whichType;
|
txnouttype whichType;
|
||||||
if (!Solver(scriptPubKey, whichType, vSolutions)) {
|
if (!Solver(scriptPubKey, whichType, vSolutions)) {
|
||||||
if (keystore.HaveWatchOnly(scriptPubKey))
|
if (keystore.HaveWatchOnly(scriptPubKey))
|
||||||
return ISMINE_WATCH_ONLY;
|
return ISMINE_WATCH_NOPUBKEY;
|
||||||
return ISMINE_NO;
|
return ISMINE_NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,7 +86,10 @@ isminetype IsMine(const CKeyStore &keystore, const CScript& scriptPubKey)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (keystore.HaveWatchOnly(scriptPubKey))
|
if (keystore.HaveWatchOnly(scriptPubKey)) {
|
||||||
return ISMINE_WATCH_ONLY;
|
// TODO: This could be optimized some by doing some work after the above solver
|
||||||
|
CScript scriptSig;
|
||||||
|
return ProduceSignature(DummySignatureCreator(&keystore), scriptPubKey, scriptSig) ? ISMINE_WATCH_PUBKEY : ISMINE_WATCH_NOPUBKEY;
|
||||||
|
}
|
||||||
return ISMINE_NO;
|
return ISMINE_NO;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,8 +16,12 @@ class CScript;
|
||||||
enum isminetype
|
enum isminetype
|
||||||
{
|
{
|
||||||
ISMINE_NO = 0,
|
ISMINE_NO = 0,
|
||||||
ISMINE_WATCH_ONLY = 1,
|
//! Indicates that we dont know how to create a scriptSig that would solve this if we were given the appropriate private keys
|
||||||
ISMINE_SPENDABLE = 2,
|
ISMINE_WATCH_NOPUBKEY = 1,
|
||||||
|
//! Indicates that we know how to create a scriptSig that would solve this if we were given the appropriate private keys
|
||||||
|
ISMINE_WATCH_PUBKEY = 2,
|
||||||
|
ISMINE_WATCH_ONLY = ISMINE_WATCH_NOPUBKEY | ISMINE_WATCH_PUBKEY,
|
||||||
|
ISMINE_SPENDABLE = 4,
|
||||||
ISMINE_ALL = ISMINE_WATCH_ONLY | ISMINE_SPENDABLE
|
ISMINE_ALL = ISMINE_WATCH_ONLY | ISMINE_SPENDABLE
|
||||||
};
|
};
|
||||||
/** used for bitflags of isminetype */
|
/** used for bitflags of isminetype */
|
||||||
|
|
Loading…
Reference in a new issue