mirror of
https://github.com/dashpay/dash.git
synced 2024-12-26 12:32:48 +01:00
787ee0c913
redeemScripts >520bytes can't be spent due to the MAX_SCRIPT_ELEMENT_SIZE limit; previously the addmultisigaddress and createmultisig RPC calls would let you violate that limit unknowingly. Also made the wallet code itself check the redeemScript prior to adding it to the wallet, which in the (rare) instance that a user has added an invalid oversized redeemScript to their wallet causes an error on startup. The affected key isn't added to the wallet; other keys are unaffected.
62 lines
1.5 KiB
C++
62 lines
1.5 KiB
C++
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
|
// Copyright (c) 2009-2013 The Bitcoin developers
|
|
// Distributed under the MIT/X11 software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#include "keystore.h"
|
|
|
|
#include "crypter.h"
|
|
#include "key.h"
|
|
#include "script.h"
|
|
|
|
#include <boost/foreach.hpp>
|
|
|
|
bool CKeyStore::GetPubKey(const CKeyID &address, CPubKey &vchPubKeyOut) const
|
|
{
|
|
CKey key;
|
|
if (!GetKey(address, key))
|
|
return false;
|
|
vchPubKeyOut = key.GetPubKey();
|
|
return true;
|
|
}
|
|
|
|
bool CKeyStore::AddKey(const CKey &key) {
|
|
return AddKeyPubKey(key, key.GetPubKey());
|
|
}
|
|
|
|
bool CBasicKeyStore::AddKeyPubKey(const CKey& key, const CPubKey &pubkey)
|
|
{
|
|
LOCK(cs_KeyStore);
|
|
mapKeys[pubkey.GetID()] = key;
|
|
return true;
|
|
}
|
|
|
|
bool CBasicKeyStore::AddCScript(const CScript& redeemScript)
|
|
{
|
|
if (redeemScript.size() > MAX_SCRIPT_ELEMENT_SIZE)
|
|
return error("CBasicKeyStore::AddCScript() : redeemScripts > %i bytes are invalid", MAX_SCRIPT_ELEMENT_SIZE);
|
|
|
|
LOCK(cs_KeyStore);
|
|
mapScripts[redeemScript.GetID()] = redeemScript;
|
|
return true;
|
|
}
|
|
|
|
bool CBasicKeyStore::HaveCScript(const CScriptID& hash) const
|
|
{
|
|
LOCK(cs_KeyStore);
|
|
return mapScripts.count(hash) > 0;
|
|
}
|
|
|
|
bool CBasicKeyStore::GetCScript(const CScriptID &hash, CScript& redeemScriptOut) const
|
|
{
|
|
LOCK(cs_KeyStore);
|
|
ScriptMap::const_iterator mi = mapScripts.find(hash);
|
|
if (mi != mapScripts.end())
|
|
{
|
|
redeemScriptOut = (*mi).second;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|