mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-10-14 00:59:33 +00:00
[NOD-727] Do not allow delayed blocks from RPC. (#623)
* [NOD-727] Do not allow delayed blocks from RPC. * [NOD-727] Refactor sentFromRPC -> DisallowDelay * [NOD-727] Clarify comment; Clarify error message. * [NOD-727] Change error message.
This commit is contained in:
parent
d90a08ecfa
commit
3dd7dc4496
@ -217,6 +217,10 @@ const (
|
|||||||
// ErrInvalidParentsRelation indicates that one of the parents of a block
|
// ErrInvalidParentsRelation indicates that one of the parents of a block
|
||||||
// is also an ancestor of another parent
|
// is also an ancestor of another parent
|
||||||
ErrInvalidParentsRelation
|
ErrInvalidParentsRelation
|
||||||
|
|
||||||
|
// ErrDelayedBlockIsNotAllowed indicates that a block with a delayed timestamp was
|
||||||
|
// submitted with BFDisallowDelay flag raised.
|
||||||
|
ErrDelayedBlockIsNotAllowed
|
||||||
)
|
)
|
||||||
|
|
||||||
// Map of ErrorCode values back to their constant names for pretty printing.
|
// Map of ErrorCode values back to their constant names for pretty printing.
|
||||||
@ -264,6 +268,7 @@ var errorCodeStrings = map[ErrorCode]string{
|
|||||||
ErrInvalidPayload: "ErrInvalidPayload",
|
ErrInvalidPayload: "ErrInvalidPayload",
|
||||||
ErrInvalidPayloadHash: "ErrInvalidPayloadHash",
|
ErrInvalidPayloadHash: "ErrInvalidPayloadHash",
|
||||||
ErrInvalidParentsRelation: "ErrInvalidParentsRelation",
|
ErrInvalidParentsRelation: "ErrInvalidParentsRelation",
|
||||||
|
ErrDelayedBlockIsNotAllowed: "ErrDelayedBlockIsNotAllowed",
|
||||||
}
|
}
|
||||||
|
|
||||||
// String returns the ErrorCode as a human-readable name.
|
// String returns the ErrorCode as a human-readable name.
|
||||||
|
@ -58,6 +58,7 @@ func TestErrorCodeStringer(t *testing.T) {
|
|||||||
{ErrInvalidPayload, "ErrInvalidPayload"},
|
{ErrInvalidPayload, "ErrInvalidPayload"},
|
||||||
{ErrInvalidPayloadHash, "ErrInvalidPayloadHash"},
|
{ErrInvalidPayloadHash, "ErrInvalidPayloadHash"},
|
||||||
{ErrInvalidParentsRelation, "ErrInvalidParentsRelation"},
|
{ErrInvalidParentsRelation, "ErrInvalidParentsRelation"},
|
||||||
|
{ErrDelayedBlockIsNotAllowed, "ErrDelayedBlockIsNotAllowed"},
|
||||||
{0xffff, "Unknown ErrorCode (65535)"},
|
{0xffff, "Unknown ErrorCode (65535)"},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,6 +45,10 @@ const (
|
|||||||
// in the block index but was never fully processed
|
// in the block index but was never fully processed
|
||||||
BFWasStored
|
BFWasStored
|
||||||
|
|
||||||
|
// BFDisallowDelay is set to indicate that a delayed block should be rejected.
|
||||||
|
// This is used for the case where a block is submitted through RPC.
|
||||||
|
BFDisallowDelay
|
||||||
|
|
||||||
// BFNone is a convenience value to specifically indicate no flags.
|
// BFNone is a convenience value to specifically indicate no flags.
|
||||||
BFNone BehaviorFlags = 0
|
BFNone BehaviorFlags = 0
|
||||||
)
|
)
|
||||||
@ -146,6 +150,7 @@ func (dag *BlockDAG) ProcessBlock(block *util.Block, flags BehaviorFlags) (isOrp
|
|||||||
func (dag *BlockDAG) processBlockNoLock(block *util.Block, flags BehaviorFlags) (isOrphan bool, isDelayed bool, err error) {
|
func (dag *BlockDAG) processBlockNoLock(block *util.Block, flags BehaviorFlags) (isOrphan bool, isDelayed bool, err error) {
|
||||||
isAfterDelay := flags&BFAfterDelay == BFAfterDelay
|
isAfterDelay := flags&BFAfterDelay == BFAfterDelay
|
||||||
wasBlockStored := flags&BFWasStored == BFWasStored
|
wasBlockStored := flags&BFWasStored == BFWasStored
|
||||||
|
disallowDelay := flags&BFDisallowDelay == BFDisallowDelay
|
||||||
|
|
||||||
blockHash := block.Hash()
|
blockHash := block.Hash()
|
||||||
log.Tracef("Processing block %s", blockHash)
|
log.Tracef("Processing block %s", blockHash)
|
||||||
@ -174,6 +179,11 @@ func (dag *BlockDAG) processBlockNoLock(block *util.Block, flags BehaviorFlags)
|
|||||||
return false, false, err
|
return false, false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if delay != 0 && disallowDelay {
|
||||||
|
str := fmt.Sprintf("Cannot process blocks beyond the allowed time offset while the BFDisallowDelay flag is raised %s", blockHash)
|
||||||
|
return false, true, ruleError(ErrDelayedBlockIsNotAllowed, str)
|
||||||
|
}
|
||||||
|
|
||||||
if delay != 0 {
|
if delay != 0 {
|
||||||
err = dag.addDelayedBlock(block, delay)
|
err = dag.addDelayedBlock(block, delay)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -867,7 +867,7 @@ func (sm *SyncManager) limitHashMap(m map[daghash.Hash]struct{}, limit int) {
|
|||||||
|
|
||||||
func (sm *SyncManager) handleProcessBlockMsg(msg processBlockMsg) (isOrphan bool, err error) {
|
func (sm *SyncManager) handleProcessBlockMsg(msg processBlockMsg) (isOrphan bool, err error) {
|
||||||
isOrphan, isDelayed, err := sm.dag.ProcessBlock(
|
isOrphan, isDelayed, err := sm.dag.ProcessBlock(
|
||||||
msg.block, msg.flags)
|
msg.block, msg.flags|blockdag.BFDisallowDelay)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user