2021-09-28 18:13:16 +00:00
|
|
|
package slasher
|
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
|
2024-02-15 05:46:47 +00:00
|
|
|
slashertypes "github.com/prysmaticlabs/prysm/v5/beacon-chain/slasher/types"
|
|
|
|
"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives"
|
|
|
|
"github.com/prysmaticlabs/prysm/v5/testing/require"
|
2021-09-28 18:13:16 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func Test_attestationsQueue(t *testing.T) {
|
|
|
|
t.Run("push_and_dequeue", func(tt *testing.T) {
|
|
|
|
attQueue := newAttestationsQueue()
|
|
|
|
wantedAtts := []*slashertypes.IndexedAttestationWrapper{
|
Slasher: Refactor and add tests (#13589)
* `helpers.go`: Improve naming consistency.
* `detect_attestations.go`: Improve readability.
* `receive.go`: Add `attsQueueSize` in log message.
* `checkSlashableAttestations`: Improve logging.
`avgBatchProcessingTime` is not displayed any more if not batch is
processed.
* `loadChunks`: Use explicit `chunkKind` and `chunkIndices`.
* `getChunk`: Use specific `chunkIndex` and `chunkKind`.
* `validatorIndicesInChunk` -> `validatorIndexesInChunk`.
* `epochUpdateForValidator`: Use explicit arguments.
* `getChunk`: Change order of arguments.
* `latestEpochWrittenForValidator`: Use `ok` parameter.
So the default value is not any more considered as the absence of
value.
* `applyAttestationForValidator`: Use explicit arguments.
* `updateSpans`: Use explicit arguments.
* `saveUpdatedChunks`: Use explicit arguments.
* `checkSurrounds`: Use explicit arguments.
We see here that, previously, in `checkSlashableAttestations`,
`checkSurrounds` was called with the default value of `slashertypes`: `MinSpan`.
Now, we set it expliciterly at `MinSpan`, which may explicit a bug.
* `epochUpdateForValidator`: Set modified by the function argument first.
* `applyAttestationForValidator`: Set mutated argument `chunksByChunkIdx`first.
* `applyAttestationForValidator`: Rename variables.
* `Test_processQueuedAttestations`: Fix test.
Two tests were actually exactly the same.
* `updateSpans`: Keep happy path in the outer scope.
Even if in this case the "happy" path means slashing.
* `checkSurrounds`: Rename variable.
* `getChunk`: Avoid side effects.
It adds a few lines for callers, but it does not modify any more
arguments and it does what it says: getting a chunk.
* `CheckSlashable`: Flatten.
* `detect_attestations_test.go`: Simplify.
* `CheckSlashable`: Add error log in case of missing attestation.
* `processQueuedAttestations`: Extract a sub function.
So testing will be easier.
* `processAttesterSlashings` and `processProposerSlashings`: Improve.
* `processAttesterSlashings`: Return processed slashings.
* `createAttestationWrapper`: Rename variables.
* `signingRoot` ==> `headerRoot` or `dataRoot`.
Before this commit, there is two typse of `signing root`s floating around.
- The first one is a real signing root, aka a hash tree root computed from an object root and
a domain. This real signing root is the object ready to be signed.
- The second one is a "false" signing root, which is actually just the hash tree root of an object. This object is either the `Data` field of an attestation, or the `Header` field of a block.
Having 2 differents objects with the same name `signing root` is quite confusing.
This commit renames wrongly named `signing root` objects.
* `createAttestationWrapper` => `createAttestationWrapperEmptySig`.
So it's clear for the user that the created attestation wrapper has an empty signature.
* Implement `createAttestationWrapper`.
* `processAttestations`: Return processed attester slashings.
* Test `processAttestations` instead of `processQueuedAttestations`.
By testing `processAttestations` instead of `processQueuedAttestations`, we get rid of a lot of tests fixtures, including the 200 ms sleep.
The whole testing duration is shorter.
* `Test_processAttestations`: Allow multiple steps.
* `Test_processAttestations`: Add double steps tests.
Some new failing tests are commented with a corresponding github issue.
* `NextChunkStartEpoch`: Fix function comment.
Co-authored-by: Preston Van Loon <pvanloon@offchainlabs.com>
* `chunks.go`: Avoid templating log messages.
* `checkSlashableAttestations`: Simplify duration computation.
---------
Co-authored-by: Preston Van Loon <pvanloon@offchainlabs.com>
2024-02-09 21:02:18 +00:00
|
|
|
createAttestationWrapperEmptySig(t, 0, 1, []uint64{1}, make([]byte, 32)),
|
|
|
|
createAttestationWrapperEmptySig(t, 1, 2, []uint64{1}, make([]byte, 32)),
|
2021-09-28 18:13:16 +00:00
|
|
|
}
|
|
|
|
attQueue.push(wantedAtts[0])
|
|
|
|
attQueue.push(wantedAtts[1])
|
|
|
|
require.DeepEqual(t, 2, attQueue.size())
|
|
|
|
|
|
|
|
received := attQueue.dequeue()
|
|
|
|
require.DeepEqual(t, 0, attQueue.size())
|
|
|
|
require.DeepEqual(t, wantedAtts, received)
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("extend_and_dequeue", func(tt *testing.T) {
|
|
|
|
attQueue := newAttestationsQueue()
|
|
|
|
wantedAtts := []*slashertypes.IndexedAttestationWrapper{
|
Slasher: Refactor and add tests (#13589)
* `helpers.go`: Improve naming consistency.
* `detect_attestations.go`: Improve readability.
* `receive.go`: Add `attsQueueSize` in log message.
* `checkSlashableAttestations`: Improve logging.
`avgBatchProcessingTime` is not displayed any more if not batch is
processed.
* `loadChunks`: Use explicit `chunkKind` and `chunkIndices`.
* `getChunk`: Use specific `chunkIndex` and `chunkKind`.
* `validatorIndicesInChunk` -> `validatorIndexesInChunk`.
* `epochUpdateForValidator`: Use explicit arguments.
* `getChunk`: Change order of arguments.
* `latestEpochWrittenForValidator`: Use `ok` parameter.
So the default value is not any more considered as the absence of
value.
* `applyAttestationForValidator`: Use explicit arguments.
* `updateSpans`: Use explicit arguments.
* `saveUpdatedChunks`: Use explicit arguments.
* `checkSurrounds`: Use explicit arguments.
We see here that, previously, in `checkSlashableAttestations`,
`checkSurrounds` was called with the default value of `slashertypes`: `MinSpan`.
Now, we set it expliciterly at `MinSpan`, which may explicit a bug.
* `epochUpdateForValidator`: Set modified by the function argument first.
* `applyAttestationForValidator`: Set mutated argument `chunksByChunkIdx`first.
* `applyAttestationForValidator`: Rename variables.
* `Test_processQueuedAttestations`: Fix test.
Two tests were actually exactly the same.
* `updateSpans`: Keep happy path in the outer scope.
Even if in this case the "happy" path means slashing.
* `checkSurrounds`: Rename variable.
* `getChunk`: Avoid side effects.
It adds a few lines for callers, but it does not modify any more
arguments and it does what it says: getting a chunk.
* `CheckSlashable`: Flatten.
* `detect_attestations_test.go`: Simplify.
* `CheckSlashable`: Add error log in case of missing attestation.
* `processQueuedAttestations`: Extract a sub function.
So testing will be easier.
* `processAttesterSlashings` and `processProposerSlashings`: Improve.
* `processAttesterSlashings`: Return processed slashings.
* `createAttestationWrapper`: Rename variables.
* `signingRoot` ==> `headerRoot` or `dataRoot`.
Before this commit, there is two typse of `signing root`s floating around.
- The first one is a real signing root, aka a hash tree root computed from an object root and
a domain. This real signing root is the object ready to be signed.
- The second one is a "false" signing root, which is actually just the hash tree root of an object. This object is either the `Data` field of an attestation, or the `Header` field of a block.
Having 2 differents objects with the same name `signing root` is quite confusing.
This commit renames wrongly named `signing root` objects.
* `createAttestationWrapper` => `createAttestationWrapperEmptySig`.
So it's clear for the user that the created attestation wrapper has an empty signature.
* Implement `createAttestationWrapper`.
* `processAttestations`: Return processed attester slashings.
* Test `processAttestations` instead of `processQueuedAttestations`.
By testing `processAttestations` instead of `processQueuedAttestations`, we get rid of a lot of tests fixtures, including the 200 ms sleep.
The whole testing duration is shorter.
* `Test_processAttestations`: Allow multiple steps.
* `Test_processAttestations`: Add double steps tests.
Some new failing tests are commented with a corresponding github issue.
* `NextChunkStartEpoch`: Fix function comment.
Co-authored-by: Preston Van Loon <pvanloon@offchainlabs.com>
* `chunks.go`: Avoid templating log messages.
* `checkSlashableAttestations`: Simplify duration computation.
---------
Co-authored-by: Preston Van Loon <pvanloon@offchainlabs.com>
2024-02-09 21:02:18 +00:00
|
|
|
createAttestationWrapperEmptySig(t, 0, 1, []uint64{1}, make([]byte, 32)),
|
|
|
|
createAttestationWrapperEmptySig(t, 1, 2, []uint64{1}, make([]byte, 32)),
|
2021-09-28 18:13:16 +00:00
|
|
|
}
|
|
|
|
attQueue.extend(wantedAtts)
|
|
|
|
require.DeepEqual(t, 2, attQueue.size())
|
|
|
|
|
|
|
|
received := attQueue.dequeue()
|
|
|
|
require.DeepEqual(t, 0, attQueue.size())
|
|
|
|
require.DeepEqual(t, wantedAtts, received)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
func Test_blocksQueue(t *testing.T) {
|
|
|
|
t.Run("push_and_dequeue", func(tt *testing.T) {
|
|
|
|
blkQueue := newBlocksQueue()
|
|
|
|
wantedBlks := []*slashertypes.SignedBlockHeaderWrapper{
|
2023-01-26 14:40:12 +00:00
|
|
|
createProposalWrapper(t, 0, primitives.ValidatorIndex(1), make([]byte, 32)),
|
|
|
|
createProposalWrapper(t, 1, primitives.ValidatorIndex(1), make([]byte, 32)),
|
2021-09-28 18:13:16 +00:00
|
|
|
}
|
|
|
|
blkQueue.push(wantedBlks[0])
|
|
|
|
blkQueue.push(wantedBlks[1])
|
|
|
|
require.DeepEqual(t, 2, blkQueue.size())
|
|
|
|
|
|
|
|
received := blkQueue.dequeue()
|
|
|
|
require.DeepEqual(t, 0, blkQueue.size())
|
|
|
|
require.DeepEqual(t, wantedBlks, received)
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("extend_and_dequeue", func(tt *testing.T) {
|
|
|
|
blkQueue := newBlocksQueue()
|
|
|
|
wantedBlks := []*slashertypes.SignedBlockHeaderWrapper{
|
2023-01-26 14:40:12 +00:00
|
|
|
createProposalWrapper(t, 0, primitives.ValidatorIndex(1), make([]byte, 32)),
|
|
|
|
createProposalWrapper(t, 1, primitives.ValidatorIndex(1), make([]byte, 32)),
|
2021-09-28 18:13:16 +00:00
|
|
|
}
|
|
|
|
blkQueue.extend(wantedBlks)
|
|
|
|
require.DeepEqual(t, 2, blkQueue.size())
|
|
|
|
|
|
|
|
received := blkQueue.dequeue()
|
|
|
|
require.DeepEqual(t, 0, blkQueue.size())
|
|
|
|
require.DeepEqual(t, wantedBlks, received)
|
|
|
|
})
|
|
|
|
}
|