mirror of
https://github.com/XRPLF/rippled.git
synced 2025-12-06 17:27:55 +00:00
An account can be made signable with only its regular key by disabling the master key. Now an account can also be made exclusively multisigned by both disabling the master key and having no regular key. In order to prevent an account from becoming unsignable the network uses these rules: o An account can always add or replace a regular key or a SignerList as long as the fee and reserve can be met by the account. o The master key on an account can be disabled if either a regular key or a SignerList (or both) is present on the account. Either the regular key or the SignerList can be used to re-enable the master key later if that is desired. o The regular key on an account may only be removed if either the master key is enabled or the account has a SignerList (or both). o The SignerList on an account may only be removed if either the master key is enabled or a regular key is present (or both). As a consequence of this change, the tecMASTER_DISABLED error code is renamed to tecNO_ALTERNATIVE_KEY. The error code number (130 decimal) is unchanged.
92 lines
2.8 KiB
C++
92 lines
2.8 KiB
C++
//------------------------------------------------------------------------------
|
|
/*
|
|
This file is part of rippled: https://github.com/ripple/rippled
|
|
Copyright (c) 2014 Ripple Labs Inc.
|
|
|
|
Permission to use, copy, modify, and/or distribute this software for any
|
|
purpose with or without fee is hereby granted, provided that the above
|
|
copyright notice and this permission notice appear in all copies.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
*/
|
|
//==============================================================================
|
|
|
|
#ifndef RIPPLE_TX_SETSIGNERLIST_H_INCLUDED
|
|
#define RIPPLE_TX_SETSIGNERLIST_H_INCLUDED
|
|
|
|
#include <ripple/app/ledger/Ledger.h>
|
|
#include <ripple/app/tx/impl/Transactor.h>
|
|
#include <ripple/app/tx/impl/SignerEntries.h>
|
|
#include <ripple/protocol/STObject.h>
|
|
#include <ripple/protocol/STArray.h>
|
|
#include <ripple/protocol/STTx.h>
|
|
#include <ripple/protocol/STAccount.h>
|
|
#include <ripple/protocol/Indexes.h>
|
|
#include <ripple/basics/Log.h>
|
|
#include <algorithm>
|
|
#include <cstdint>
|
|
#include <vector>
|
|
|
|
namespace ripple {
|
|
|
|
/**
|
|
See the README.md for an overview of the SetSignerList transaction that
|
|
this class implements.
|
|
*/
|
|
class SetSignerList : public Transactor
|
|
{
|
|
private:
|
|
// Values determined during preCompute for use later.
|
|
enum Operation {unknown, set, destroy};
|
|
Operation do_ {unknown};
|
|
std::uint32_t quorum_ {0};
|
|
std::vector<SignerEntries::SignerEntry> signers_;
|
|
|
|
public:
|
|
SetSignerList (ApplyContext& ctx)
|
|
: Transactor(ctx)
|
|
{
|
|
}
|
|
|
|
static
|
|
TER
|
|
preflight (PreflightContext const& ctx);
|
|
|
|
TER doApply () override;
|
|
void preCompute() override;
|
|
|
|
private:
|
|
static
|
|
std::tuple<TER, std::uint32_t,
|
|
std::vector<SignerEntries::SignerEntry>,
|
|
Operation>
|
|
determineOperation(STTx const& tx,
|
|
ApplyFlags flags, beast::Journal j);
|
|
|
|
static
|
|
TER validateQuorumAndSignerEntries (
|
|
std::uint32_t quorum,
|
|
std::vector<SignerEntries::SignerEntry> const& signers,
|
|
AccountID const& account,
|
|
beast::Journal j);
|
|
|
|
TER replaceSignerList ();
|
|
TER destroySignerList ();
|
|
|
|
TER removeSignersFromLedger (Keylet const& accountKeylet,
|
|
Keylet const& ownerDirKeylet, Keylet const& signerListKeylet);
|
|
void writeSignersToSLE (SLE::pointer const& ledgerEntry) const;
|
|
|
|
static int ownerCountDelta (std::size_t entryCount);
|
|
};
|
|
|
|
} // ripple
|
|
|
|
#endif
|