mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-07-03 19:32:30 +00:00

* [NOD-208] Added blockBlueScore to UTXOEntry. * [NOD-208] Added blueBlockScore to NewUTXOEntry. * [NOD-208] Fixed compilation errors in policy, utxoset, and dag tests. * [NOD-208] Changed validateBlockRewardMaturity and CheckTransactionInputsAndCalulateFee to use blueScore. * [NOD-208] Changed CalcBlockSubsidy to use blueScore. * [NOD-208] Changed SequenceLockActive to use blueScore. * [NOD-208] Removed ExtractCoinbaseHeight. * [NOD-208] Removed reference to block height in ensureNoDuplicateTx. * [NOD-208] Changed IsFinalizedTransaction to use blueScore. * [NOD-208] Fixed merge errors. * [NOD-208] Made UTXOEntry serialization use blueScore. * [NOD-208] Changed CalcPriority and calcInputValueAge to use blueScore. * [NOD-208] Changed calcSequenceLock to use blueScore. * [NOD-208] Removed blockChainHeight from UTXOEntry. * [NOD-208] Fixed compilation errors in feeEstimator. Fixed a bug in the test pool hardness. * [NOD-208] Fixed oldestChainBlockWithBlueScoreGreaterThan not handling an extreme case. * [NOD-208] Fixed TestDiffFromTx. * [NOD-208] Got rid of priority and support of free transactions. * [NOD-208] Fixed TestProcessTransaction. * [NOD-208] Fixed TestTxFeePrioHeap. * [NOD-208] Fixed TestAddrIndex and TestFeeEstimatorCfg. * [NOD-208] Removed unused rateLimit parameter from ProcessTransaction. * [NOD-208] Fixed tests that rely on CreateTxChain. * [NOD-208] Fixed tests that rely on CreateSignedTxForSubnetwork. * [NOD-208] Fixed TestFetchTransaction. * [NOD-208] Fixed TestHandleNewBlock. Fixed HandleNewBlock erroneously processing fee transactions. * [NOD-208] Fixed TestTxIndexConnectBlock. * [NOD-208] Removed the use of Height() from the fee estimator. * [NOD-208] Removed unused methods from rpcwebsocket.go. * [NOD-208] Removed Height from util.Block. * [NOD-208] Removed ErrForkTooOld. It doesn't make sense in a DAG. * [NOD-208] Made blockHeap use blueScore instead of height. * [NOD-208] Removed fee estimator. * [NOD-208] Removed DAG.Height. * [NOD-208] Made TestAncestorErrors test chainHeight instead of height. * [NOD-208] Fixed a couple of comments that were still speaking about block height. * [NOD-208] Replaced all uses of HighestTipHash with SelectedTipHash. * [NOD-208] Remove blockNode highest and some remaining erroneous uses of height. * [NOD-208] Fixed a couple of comments. Fixed outPoint -> outpoint merge error. * [NOD-208] Fixed a couple more comments. * [NOD-208] Used calcMinRequiredTxRelayFee instead of DefaultMinRelayTxFee for mempool tests. * [NOD-208] Renamed mempool Config BestHeight to DAGChainHeight. * [NOD-208] Fixed a bug in oldestChainBlockWithBlueScoreGreaterThan. Made calcSequenceLock use the node's selected parent chain rather than the virtual block's. * [NOD-208] Removed chainHeight from blockNode String(). Renamed checkpointsByHeight to checkpointsByChainHeight and prevCheckpointHeight to prevCheckpointChainHeight. Removed reference to chainHeight in blockIndexKey. Fixed comments in dagio.go. * [NOD-208] Removed indexers/blocklogger.go, as no one was using it. * [NOD-208] Made blocklogger.go log blueScore instead of height. * [NOD-208] Fixed typo. * [NOD-208] Fixed comments, did minor renaming. * [NOD-208] Made a "common sense" wrapper around sort.Search. * [NOD-208] Fixed comment in SearchSlice.
132 lines
4.0 KiB
Go
132 lines
4.0 KiB
Go
// Copyright (c) 2014-2016 The btcsuite developers
|
|
// Use of this source code is governed by an ISC
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package mempool
|
|
|
|
import (
|
|
"github.com/daglabs/btcd/blockdag"
|
|
"github.com/daglabs/btcd/wire"
|
|
)
|
|
|
|
// RuleError identifies a rule violation. It is used to indicate that
|
|
// processing of a transaction failed due to one of the many validation
|
|
// rules. The caller can use type assertions to determine if a failure was
|
|
// specifically due to a rule violation and use the Err field to access the
|
|
// underlying error, which will be either a TxRuleError or a
|
|
// blockchain.RuleError.
|
|
type RuleError struct {
|
|
Err error
|
|
}
|
|
|
|
// Error satisfies the error interface and prints human-readable errors.
|
|
func (e RuleError) Error() string {
|
|
if e.Err == nil {
|
|
return "<nil>"
|
|
}
|
|
return e.Err.Error()
|
|
}
|
|
|
|
// TxRuleError identifies a rule violation. It is used to indicate that
|
|
// processing of a transaction failed due to one of the many validation
|
|
// rules. The caller can use type assertions to determine if a failure was
|
|
// specifically due to a rule violation and access the ErrorCode field to
|
|
// ascertain the specific reason for the rule violation.
|
|
type TxRuleError struct {
|
|
RejectCode wire.RejectCode // The code to send with reject messages
|
|
Description string // Human readable description of the issue
|
|
}
|
|
|
|
// Error satisfies the error interface and prints human-readable errors.
|
|
func (e TxRuleError) Error() string {
|
|
return e.Description
|
|
}
|
|
|
|
// txRuleError creates an underlying TxRuleError with the given a set of
|
|
// arguments and returns a RuleError that encapsulates it.
|
|
func txRuleError(c wire.RejectCode, desc string) RuleError {
|
|
return RuleError{
|
|
Err: TxRuleError{RejectCode: c, Description: desc},
|
|
}
|
|
}
|
|
|
|
// dagRuleError returns a RuleError that encapsulates the given
|
|
// blockdag.RuleError.
|
|
func dagRuleError(dagErr blockdag.RuleError) RuleError {
|
|
return RuleError{
|
|
Err: dagErr,
|
|
}
|
|
}
|
|
|
|
// extractRejectCode attempts to return a relevant reject code for a given error
|
|
// by examining the error for known types. It will return true if a code
|
|
// was successfully extracted.
|
|
func extractRejectCode(err error) (wire.RejectCode, bool) {
|
|
// Pull the underlying error out of a RuleError.
|
|
if rerr, ok := err.(RuleError); ok {
|
|
err = rerr.Err
|
|
}
|
|
|
|
switch err := err.(type) {
|
|
case blockdag.RuleError:
|
|
// Convert the chain error to a reject code.
|
|
var code wire.RejectCode
|
|
switch err.ErrorCode {
|
|
// Rejected due to duplicate.
|
|
case blockdag.ErrDuplicateBlock:
|
|
code = wire.RejectDuplicate
|
|
|
|
// Rejected due to obsolete version.
|
|
case blockdag.ErrBlockVersionTooOld:
|
|
code = wire.RejectObsolete
|
|
|
|
// Rejected due to checkpoint.
|
|
case blockdag.ErrCheckpointTimeTooOld:
|
|
fallthrough
|
|
case blockdag.ErrDifficultyTooLow:
|
|
fallthrough
|
|
case blockdag.ErrBadCheckpoint:
|
|
code = wire.RejectCheckpoint
|
|
|
|
// Everything else is due to the block or transaction being invalid.
|
|
default:
|
|
code = wire.RejectInvalid
|
|
}
|
|
|
|
return code, true
|
|
|
|
case TxRuleError:
|
|
return err.RejectCode, true
|
|
|
|
case nil:
|
|
return wire.RejectInvalid, false
|
|
}
|
|
|
|
return wire.RejectInvalid, false
|
|
}
|
|
|
|
// ErrToRejectErr examines the underlying type of the error and returns a reject
|
|
// code and string appropriate to be sent in a wire.MsgReject message.
|
|
func ErrToRejectErr(err error) (wire.RejectCode, string) {
|
|
// Return the reject code along with the error text if it can be
|
|
// extracted from the error.
|
|
rejectCode, found := extractRejectCode(err)
|
|
if found {
|
|
return rejectCode, err.Error()
|
|
}
|
|
|
|
// Return a generic rejected string if there is no error. This really
|
|
// should not happen unless the code elsewhere is not setting an error
|
|
// as it should be, but it's best to be safe and simply return a generic
|
|
// string rather than allowing the following code that dereferences the
|
|
// err to panic.
|
|
if err == nil {
|
|
return wire.RejectInvalid, "rejected"
|
|
}
|
|
|
|
// When the underlying error is not one of the above cases, just return
|
|
// wire.RejectInvalid with a generic rejected string plus the error
|
|
// text.
|
|
return wire.RejectInvalid, "rejected: " + err.Error()
|
|
}
|