Skip to content

Finally add support for watch-only addresses #4045

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 18 commits into from
Jul 7, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
c898846
Add support for watch-only addresses
sipa Jul 25, 2013
2935b21
qt: Hide unspendable outputs in coin control
laanwj Dec 10, 2013
ffd40da
Watchonly balances are shown separately in gui.
sdkfjlsfjlskdfjlsdjflsjf Mar 29, 2014
d2692f6
Watchonly transactions are marked in transaction history
sdkfjlsfjlskdfjlsdjflsjf Apr 5, 2014
d4640d7
Added argument to getbalance to include watchonly addresses and fixed…
sdkfjlsfjlskdfjlsdjflsjf Apr 8, 2014
83f3543
Added argument to listaccounts to include watchonly addresses
sdkfjlsfjlskdfjlsdjflsjf Apr 8, 2014
952877e
Showing 'involvesWatchonly' property for transactions returned by 'li…
sdkfjlsfjlskdfjlsdjflsjf Apr 9, 2014
d7d5d23
Added argument to listtransactions and listsinceblock to include watc…
sdkfjlsfjlskdfjlsdjflsjf Apr 8, 2014
a5c6c5d
fixed tiny glitch and improved readability like laanwj suggested
sdkfjlsfjlskdfjlsdjflsjf Apr 29, 2014
f87ba3d
added includeWatchonly argument to 'gettransaction' because it affect…
sdkfjlsfjlskdfjlsdjflsjf May 22, 2014
0fa2f88
added includedWatchonly argument to listreceivedbyaddress/...account
sdkfjlsfjlskdfjlsdjflsjf May 31, 2014
d5087d1
Use script matching rather than destination matching for watch-only.
sipa Jun 9, 2014
80dda36
removed default argument values for ismine filter
sdkfjlsfjlskdfjlsdjflsjf Jun 19, 2014
23b0506
Fixed some stuff in TransactionDesc
sdkfjlsfjlskdfjlsdjflsjf Jun 18, 2014
519dd1c
Added MINE_ALL = (spendable|watchonly)
sdkfjlsfjlskdfjlsdjflsjf Jun 20, 2014
f28707a
fixed bug in ListReceived()
sdkfjlsfjlskdfjlsdjflsjf Jun 22, 2014
53a2148
fixed bug where validateaddress doesn't display information
sdkfjlsfjlskdfjlsdjflsjf Jun 23, 2014
a3e192a
replaced MINE_ with ISMINE_
sdkfjlsfjlskdfjlsdjflsjf Jul 1, 2014
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions src/keystore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,15 @@ bool CBasicKeyStore::GetCScript(const CScriptID &hash, CScript& redeemScriptOut)
return false;
}

bool CBasicKeyStore::AddWatchOnly(const CScript &dest)
{
LOCK(cs_KeyStore);
setWatchOnly.insert(dest);
return true;
}

bool CBasicKeyStore::HaveWatchOnly(const CScript &dest) const
{
LOCK(cs_KeyStore);
return setWatchOnly.count(dest) > 0;
}
19 changes: 19 additions & 0 deletions src/keystore.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,21 @@

#include "key.h"
#include "sync.h"
#include "script.h" // for CNoDestination

#include <boost/signals2/signal.hpp>
#include <boost/variant.hpp>

class CScript;

/** A txout script template with a specific destination. It is either:
* * CNoDestination: no destination set
* * CKeyID: TX_PUBKEYHASH destination
* * CScriptID: TX_SCRIPTHASH destination
* A CTxDestination is the internal data type encoded in a CBitcoinAddress
*/
typedef boost::variant<CNoDestination, CKeyID, CScriptID> CTxDestination;

/** A virtual base class for key stores */
class CKeyStore
{
Expand All @@ -36,17 +46,23 @@ class CKeyStore
virtual bool AddCScript(const CScript& redeemScript) =0;
virtual bool HaveCScript(const CScriptID &hash) const =0;
virtual bool GetCScript(const CScriptID &hash, CScript& redeemScriptOut) const =0;

// Support for Watch-only addresses
virtual bool AddWatchOnly(const CScript &dest) =0;
virtual bool HaveWatchOnly(const CScript &dest) const =0;
};

typedef std::map<CKeyID, CKey> KeyMap;
typedef std::map<CScriptID, CScript > ScriptMap;
typedef std::set<CScript> WatchOnlySet;

/** Basic key store, that keeps keys in an address->secret map */
class CBasicKeyStore : public CKeyStore
{
protected:
KeyMap mapKeys;
ScriptMap mapScripts;
WatchOnlySet setWatchOnly;

public:
bool AddKeyPubKey(const CKey& key, const CPubKey &pubkey);
Expand Down Expand Up @@ -88,6 +104,9 @@ class CBasicKeyStore : public CKeyStore
virtual bool AddCScript(const CScript& redeemScript);
virtual bool HaveCScript(const CScriptID &hash) const;
virtual bool GetCScript(const CScriptID &hash, CScript& redeemScriptOut) const;

virtual bool AddWatchOnly(const CScript &dest);
virtual bool HaveWatchOnly(const CScript &dest) const;
};

typedef std::vector<unsigned char, secure_allocator<unsigned char> > CKeyingMaterial;
Expand Down
Loading