mirror of
https://github.com/OffchainLabs/prysm.git
synced 2026-01-10 05:47:59 -05:00
Compare commits
1 Commits
hdiff-fuzz
...
duplicate-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c236f8c6ce |
@@ -7,11 +7,11 @@ go_library(
|
||||
importpath = "github.com/prysmaticlabs/prysm/v5/testing/spectest/shared/altair/rewards",
|
||||
visibility = ["//testing/spectest:__subpackages__"],
|
||||
deps = [
|
||||
"//beacon-chain/core/altair:go_default_library",
|
||||
"//beacon-chain/core/helpers:go_default_library",
|
||||
"//beacon-chain/state/state-native:go_default_library",
|
||||
"//proto/prysm/v1alpha1:go_default_library",
|
||||
"//testing/require:go_default_library",
|
||||
"//testing/spectest/shared/common/rewards:go_default_library",
|
||||
"//testing/spectest/utils:go_default_library",
|
||||
"//testing/util:go_default_library",
|
||||
"@com_github_golang_snappy//:go_default_library",
|
||||
|
||||
@@ -1,42 +1,20 @@
|
||||
package rewards
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"path"
|
||||
"reflect"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/golang/snappy"
|
||||
"github.com/prysmaticlabs/prysm/v5/beacon-chain/core/altair"
|
||||
"github.com/prysmaticlabs/prysm/v5/beacon-chain/core/helpers"
|
||||
state_native "github.com/prysmaticlabs/prysm/v5/beacon-chain/state/state-native"
|
||||
ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1"
|
||||
"github.com/prysmaticlabs/prysm/v5/testing/require"
|
||||
"github.com/prysmaticlabs/prysm/v5/testing/spectest/shared/common/rewards"
|
||||
"github.com/prysmaticlabs/prysm/v5/testing/spectest/utils"
|
||||
"github.com/prysmaticlabs/prysm/v5/testing/util"
|
||||
)
|
||||
|
||||
// Delta contains list of rewards and penalties.
|
||||
type Delta struct {
|
||||
Rewards []uint64 `json:"rewards"`
|
||||
Penalties []uint64 `json:"penalties"`
|
||||
}
|
||||
|
||||
// unmarshalSSZ deserializes specs data into a simple aggregating container.
|
||||
func (d *Delta) unmarshalSSZ(buf []byte) error {
|
||||
offset1 := binary.LittleEndian.Uint32(buf[:4])
|
||||
offset2 := binary.LittleEndian.Uint32(buf[4:8])
|
||||
|
||||
for i := uint32(0); i < offset2-offset1; i += 8 {
|
||||
d.Rewards = append(d.Rewards, binary.LittleEndian.Uint64(buf[offset1+i:offset1+i+8]))
|
||||
d.Penalties = append(d.Penalties, binary.LittleEndian.Uint64(buf[offset2+i:offset2+i+8]))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// RunPrecomputeRewardsAndPenaltiesTests executes "rewards/{basic, leak, random}" tests.
|
||||
func RunPrecomputeRewardsAndPenaltiesTests(t *testing.T, config string) {
|
||||
require.NoError(t, utils.SetConfig(t, config))
|
||||
@@ -62,7 +40,6 @@ func RunPrecomputeRewardsAndPenaltiesTests(t *testing.T, config string) {
|
||||
}
|
||||
|
||||
func runPrecomputeRewardsAndPenaltiesTest(t *testing.T, testFolderPath string) {
|
||||
ctx := context.Background()
|
||||
preBeaconStateFile, err := util.BazelFileBytes(path.Join(testFolderPath, "pre.ssz_snappy"))
|
||||
require.NoError(t, err)
|
||||
preBeaconStateSSZ, err := snappy.Decode(nil /* dst */, preBeaconStateFile)
|
||||
@@ -71,67 +48,5 @@ func runPrecomputeRewardsAndPenaltiesTest(t *testing.T, testFolderPath string) {
|
||||
require.NoError(t, preBeaconStateBase.UnmarshalSSZ(preBeaconStateSSZ), "Failed to unmarshal")
|
||||
preBeaconState, err := state_native.InitializeFromProtoAltair(preBeaconStateBase)
|
||||
require.NoError(t, err)
|
||||
|
||||
vp, bp, err := altair.InitializePrecomputeValidators(ctx, preBeaconState)
|
||||
require.NoError(t, err)
|
||||
vp, bp, err = altair.ProcessEpochParticipation(ctx, preBeaconState, bp, vp)
|
||||
require.NoError(t, err)
|
||||
|
||||
activeBal, targetPrevious, targetCurrent, err := preBeaconState.UnrealizedCheckpointBalances()
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, bp.ActiveCurrentEpoch, activeBal)
|
||||
require.Equal(t, bp.CurrentEpochTargetAttested, targetCurrent)
|
||||
require.Equal(t, bp.PrevEpochTargetAttested, targetPrevious)
|
||||
|
||||
deltas, err := altair.AttestationsDelta(preBeaconState, bp, vp)
|
||||
require.NoError(t, err)
|
||||
|
||||
rewards := make([]uint64, len(deltas))
|
||||
penalties := make([]uint64, len(deltas))
|
||||
for i, d := range deltas {
|
||||
rewards[i] = d.HeadReward + d.SourceReward + d.TargetReward
|
||||
penalties[i] = d.SourcePenalty + d.TargetPenalty + d.InactivityPenalty
|
||||
}
|
||||
|
||||
totalSpecTestRewards := make([]uint64, len(rewards))
|
||||
totalSpecTestPenalties := make([]uint64, len(penalties))
|
||||
|
||||
// Fetch delta files. i.e. source_deltas.ssz_snappy, etc.
|
||||
testfiles, err := util.BazelListFiles(path.Join(testFolderPath))
|
||||
require.NoError(t, err)
|
||||
deltaFiles := make([]string, 0, len(testfiles))
|
||||
for _, tf := range testfiles {
|
||||
if strings.Contains(tf, "deltas") {
|
||||
deltaFiles = append(deltaFiles, tf)
|
||||
}
|
||||
}
|
||||
if len(deltaFiles) == 0 {
|
||||
t.Fatal("No delta files")
|
||||
}
|
||||
|
||||
for _, dFile := range deltaFiles {
|
||||
sourceFile, err := util.BazelFileBytes(path.Join(testFolderPath, dFile))
|
||||
require.NoError(t, err)
|
||||
sourceSSZ, err := snappy.Decode(nil /* dst */, sourceFile)
|
||||
require.NoError(t, err, "Failed to decompress")
|
||||
d := &Delta{}
|
||||
require.NoError(t, d.unmarshalSSZ(sourceSSZ), "Failed to unmarshal")
|
||||
for i, reward := range d.Rewards {
|
||||
totalSpecTestRewards[i] += reward
|
||||
}
|
||||
for i, penalty := range d.Penalties {
|
||||
totalSpecTestPenalties[i] += penalty
|
||||
}
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(rewards, totalSpecTestRewards) {
|
||||
t.Error("Rewards don't match")
|
||||
t.Log(rewards)
|
||||
t.Log(totalSpecTestRewards)
|
||||
}
|
||||
if !reflect.DeepEqual(penalties, totalSpecTestPenalties) {
|
||||
t.Error("Penalties don't match")
|
||||
t.Log(penalties)
|
||||
t.Log(totalSpecTestPenalties)
|
||||
}
|
||||
rewards.PrecomputeRewardsAndPenalties(t, preBeaconState, testFolderPath)
|
||||
}
|
||||
|
||||
@@ -7,11 +7,11 @@ go_library(
|
||||
importpath = "github.com/prysmaticlabs/prysm/v5/testing/spectest/shared/bellatrix/rewards",
|
||||
visibility = ["//testing/spectest:__subpackages__"],
|
||||
deps = [
|
||||
"//beacon-chain/core/altair:go_default_library",
|
||||
"//beacon-chain/core/helpers:go_default_library",
|
||||
"//beacon-chain/state/state-native:go_default_library",
|
||||
"//proto/prysm/v1alpha1:go_default_library",
|
||||
"//testing/require:go_default_library",
|
||||
"//testing/spectest/shared/common/rewards:go_default_library",
|
||||
"//testing/spectest/utils:go_default_library",
|
||||
"//testing/util:go_default_library",
|
||||
"@com_github_golang_snappy//:go_default_library",
|
||||
|
||||
@@ -1,42 +1,20 @@
|
||||
package rewards
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"path"
|
||||
"reflect"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/golang/snappy"
|
||||
"github.com/prysmaticlabs/prysm/v5/beacon-chain/core/altair"
|
||||
"github.com/prysmaticlabs/prysm/v5/beacon-chain/core/helpers"
|
||||
state_native "github.com/prysmaticlabs/prysm/v5/beacon-chain/state/state-native"
|
||||
ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1"
|
||||
"github.com/prysmaticlabs/prysm/v5/testing/require"
|
||||
"github.com/prysmaticlabs/prysm/v5/testing/spectest/shared/common/rewards"
|
||||
"github.com/prysmaticlabs/prysm/v5/testing/spectest/utils"
|
||||
"github.com/prysmaticlabs/prysm/v5/testing/util"
|
||||
)
|
||||
|
||||
// Delta contains list of rewards and penalties.
|
||||
type Delta struct {
|
||||
Rewards []uint64 `json:"rewards"`
|
||||
Penalties []uint64 `json:"penalties"`
|
||||
}
|
||||
|
||||
// unmarshalSSZ deserializes specs data into a simple aggregating container.
|
||||
func (d *Delta) unmarshalSSZ(buf []byte) error {
|
||||
offset1 := binary.LittleEndian.Uint32(buf[:4])
|
||||
offset2 := binary.LittleEndian.Uint32(buf[4:8])
|
||||
|
||||
for i := uint32(0); i < offset2-offset1; i += 8 {
|
||||
d.Rewards = append(d.Rewards, binary.LittleEndian.Uint64(buf[offset1+i:offset1+i+8]))
|
||||
d.Penalties = append(d.Penalties, binary.LittleEndian.Uint64(buf[offset2+i:offset2+i+8]))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// RunPrecomputeRewardsAndPenaltiesTests executes "rewards/{basic, leak, random}" tests.
|
||||
func RunPrecomputeRewardsAndPenaltiesTests(t *testing.T, config string) {
|
||||
require.NoError(t, utils.SetConfig(t, config))
|
||||
@@ -66,7 +44,6 @@ func RunPrecomputeRewardsAndPenaltiesTests(t *testing.T, config string) {
|
||||
}
|
||||
|
||||
func runPrecomputeRewardsAndPenaltiesTest(t *testing.T, testFolderPath string) {
|
||||
ctx := context.Background()
|
||||
preBeaconStateFile, err := util.BazelFileBytes(path.Join(testFolderPath, "pre.ssz_snappy"))
|
||||
require.NoError(t, err)
|
||||
preBeaconStateSSZ, err := snappy.Decode(nil /* dst */, preBeaconStateFile)
|
||||
@@ -75,67 +52,5 @@ func runPrecomputeRewardsAndPenaltiesTest(t *testing.T, testFolderPath string) {
|
||||
require.NoError(t, preBeaconStateBase.UnmarshalSSZ(preBeaconStateSSZ), "Failed to unmarshal")
|
||||
preBeaconState, err := state_native.InitializeFromProtoBellatrix(preBeaconStateBase)
|
||||
require.NoError(t, err)
|
||||
|
||||
vp, bp, err := altair.InitializePrecomputeValidators(ctx, preBeaconState)
|
||||
require.NoError(t, err)
|
||||
vp, bp, err = altair.ProcessEpochParticipation(ctx, preBeaconState, bp, vp)
|
||||
require.NoError(t, err)
|
||||
|
||||
activeBal, targetPrevious, targetCurrent, err := preBeaconState.UnrealizedCheckpointBalances()
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, bp.ActiveCurrentEpoch, activeBal)
|
||||
require.Equal(t, bp.CurrentEpochTargetAttested, targetCurrent)
|
||||
require.Equal(t, bp.PrevEpochTargetAttested, targetPrevious)
|
||||
|
||||
deltas, err := altair.AttestationsDelta(preBeaconState, bp, vp)
|
||||
require.NoError(t, err)
|
||||
|
||||
rewards := make([]uint64, len(deltas))
|
||||
penalties := make([]uint64, len(deltas))
|
||||
for i, d := range deltas {
|
||||
rewards[i] = d.HeadReward + d.SourceReward + d.TargetReward
|
||||
penalties[i] = d.SourcePenalty + d.TargetPenalty + d.InactivityPenalty
|
||||
}
|
||||
|
||||
totalSpecTestRewards := make([]uint64, len(rewards))
|
||||
totalSpecTestPenalties := make([]uint64, len(penalties))
|
||||
|
||||
// Fetch delta files. i.e. source_deltas.ssz_snappy, etc.
|
||||
testfiles, err := util.BazelListFiles(path.Join(testFolderPath))
|
||||
require.NoError(t, err)
|
||||
deltaFiles := make([]string, 0, len(testfiles))
|
||||
for _, tf := range testfiles {
|
||||
if strings.Contains(tf, "deltas") {
|
||||
deltaFiles = append(deltaFiles, tf)
|
||||
}
|
||||
}
|
||||
if len(deltaFiles) == 0 {
|
||||
t.Fatal("No delta files")
|
||||
}
|
||||
|
||||
for _, dFile := range deltaFiles {
|
||||
sourceFile, err := util.BazelFileBytes(path.Join(testFolderPath, dFile))
|
||||
require.NoError(t, err)
|
||||
sourceSSZ, err := snappy.Decode(nil /* dst */, sourceFile)
|
||||
require.NoError(t, err, "Failed to decompress")
|
||||
d := &Delta{}
|
||||
require.NoError(t, d.unmarshalSSZ(sourceSSZ), "Failed to unmarshal")
|
||||
for i, reward := range d.Rewards {
|
||||
totalSpecTestRewards[i] += reward
|
||||
}
|
||||
for i, penalty := range d.Penalties {
|
||||
totalSpecTestPenalties[i] += penalty
|
||||
}
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(rewards, totalSpecTestRewards) {
|
||||
t.Error("Rewards don't match")
|
||||
t.Log(rewards)
|
||||
t.Log(totalSpecTestRewards)
|
||||
}
|
||||
if !reflect.DeepEqual(penalties, totalSpecTestPenalties) {
|
||||
t.Error("Penalties don't match")
|
||||
t.Log(penalties)
|
||||
t.Log(totalSpecTestPenalties)
|
||||
}
|
||||
rewards.PrecomputeRewardsAndPenalties(t, preBeaconState, testFolderPath)
|
||||
}
|
||||
|
||||
@@ -7,11 +7,11 @@ go_library(
|
||||
importpath = "github.com/prysmaticlabs/prysm/v5/testing/spectest/shared/capella/rewards",
|
||||
visibility = ["//testing/spectest:__subpackages__"],
|
||||
deps = [
|
||||
"//beacon-chain/core/altair:go_default_library",
|
||||
"//beacon-chain/core/helpers:go_default_library",
|
||||
"//beacon-chain/state/state-native:go_default_library",
|
||||
"//proto/prysm/v1alpha1:go_default_library",
|
||||
"//testing/require:go_default_library",
|
||||
"//testing/spectest/shared/common/rewards:go_default_library",
|
||||
"//testing/spectest/utils:go_default_library",
|
||||
"//testing/util:go_default_library",
|
||||
"@com_github_golang_snappy//:go_default_library",
|
||||
|
||||
@@ -1,42 +1,20 @@
|
||||
package rewards
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"path"
|
||||
"reflect"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/golang/snappy"
|
||||
"github.com/prysmaticlabs/prysm/v5/beacon-chain/core/altair"
|
||||
"github.com/prysmaticlabs/prysm/v5/beacon-chain/core/helpers"
|
||||
state_native "github.com/prysmaticlabs/prysm/v5/beacon-chain/state/state-native"
|
||||
ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1"
|
||||
"github.com/prysmaticlabs/prysm/v5/testing/require"
|
||||
"github.com/prysmaticlabs/prysm/v5/testing/spectest/shared/common/rewards"
|
||||
"github.com/prysmaticlabs/prysm/v5/testing/spectest/utils"
|
||||
"github.com/prysmaticlabs/prysm/v5/testing/util"
|
||||
)
|
||||
|
||||
// Delta contains list of rewards and penalties.
|
||||
type Delta struct {
|
||||
Rewards []uint64 `json:"rewards"`
|
||||
Penalties []uint64 `json:"penalties"`
|
||||
}
|
||||
|
||||
// unmarshalSSZ deserializes specs data into a simple aggregating container.
|
||||
func (d *Delta) unmarshalSSZ(buf []byte) error {
|
||||
offset1 := binary.LittleEndian.Uint32(buf[:4])
|
||||
offset2 := binary.LittleEndian.Uint32(buf[4:8])
|
||||
|
||||
for i := uint32(0); i < offset2-offset1; i += 8 {
|
||||
d.Rewards = append(d.Rewards, binary.LittleEndian.Uint64(buf[offset1+i:offset1+i+8]))
|
||||
d.Penalties = append(d.Penalties, binary.LittleEndian.Uint64(buf[offset2+i:offset2+i+8]))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// RunPrecomputeRewardsAndPenaltiesTests executes "rewards/{basic, leak, random}" tests.
|
||||
func RunPrecomputeRewardsAndPenaltiesTests(t *testing.T, config string) {
|
||||
require.NoError(t, utils.SetConfig(t, config))
|
||||
@@ -66,7 +44,6 @@ func RunPrecomputeRewardsAndPenaltiesTests(t *testing.T, config string) {
|
||||
}
|
||||
|
||||
func runPrecomputeRewardsAndPenaltiesTest(t *testing.T, testFolderPath string) {
|
||||
ctx := context.Background()
|
||||
preBeaconStateFile, err := util.BazelFileBytes(path.Join(testFolderPath, "pre.ssz_snappy"))
|
||||
require.NoError(t, err)
|
||||
preBeaconStateSSZ, err := snappy.Decode(nil /* dst */, preBeaconStateFile)
|
||||
@@ -75,67 +52,5 @@ func runPrecomputeRewardsAndPenaltiesTest(t *testing.T, testFolderPath string) {
|
||||
require.NoError(t, preBeaconStateBase.UnmarshalSSZ(preBeaconStateSSZ), "Failed to unmarshal")
|
||||
preBeaconState, err := state_native.InitializeFromProtoCapella(preBeaconStateBase)
|
||||
require.NoError(t, err)
|
||||
|
||||
vp, bp, err := altair.InitializePrecomputeValidators(ctx, preBeaconState)
|
||||
require.NoError(t, err)
|
||||
vp, bp, err = altair.ProcessEpochParticipation(ctx, preBeaconState, bp, vp)
|
||||
require.NoError(t, err)
|
||||
|
||||
activeBal, targetPrevious, targetCurrent, err := preBeaconState.UnrealizedCheckpointBalances()
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, bp.ActiveCurrentEpoch, activeBal)
|
||||
require.Equal(t, bp.CurrentEpochTargetAttested, targetCurrent)
|
||||
require.Equal(t, bp.PrevEpochTargetAttested, targetPrevious)
|
||||
|
||||
deltas, err := altair.AttestationsDelta(preBeaconState, bp, vp)
|
||||
require.NoError(t, err)
|
||||
|
||||
rewards := make([]uint64, len(deltas))
|
||||
penalties := make([]uint64, len(deltas))
|
||||
for i, d := range deltas {
|
||||
rewards[i] = d.HeadReward + d.SourceReward + d.TargetReward
|
||||
penalties[i] = d.SourcePenalty + d.TargetPenalty + d.InactivityPenalty
|
||||
}
|
||||
|
||||
totalSpecTestRewards := make([]uint64, len(rewards))
|
||||
totalSpecTestPenalties := make([]uint64, len(penalties))
|
||||
|
||||
// Fetch delta files. i.e. source_deltas.ssz_snappy, etc.
|
||||
testfiles, err := util.BazelListFiles(path.Join(testFolderPath))
|
||||
require.NoError(t, err)
|
||||
deltaFiles := make([]string, 0, len(testfiles))
|
||||
for _, tf := range testfiles {
|
||||
if strings.Contains(tf, "deltas") {
|
||||
deltaFiles = append(deltaFiles, tf)
|
||||
}
|
||||
}
|
||||
if len(deltaFiles) == 0 {
|
||||
t.Fatal("No delta files")
|
||||
}
|
||||
|
||||
for _, dFile := range deltaFiles {
|
||||
sourceFile, err := util.BazelFileBytes(path.Join(testFolderPath, dFile))
|
||||
require.NoError(t, err)
|
||||
sourceSSZ, err := snappy.Decode(nil /* dst */, sourceFile)
|
||||
require.NoError(t, err, "Failed to decompress")
|
||||
d := &Delta{}
|
||||
require.NoError(t, d.unmarshalSSZ(sourceSSZ), "Failed to unmarshal")
|
||||
for i, reward := range d.Rewards {
|
||||
totalSpecTestRewards[i] += reward
|
||||
}
|
||||
for i, penalty := range d.Penalties {
|
||||
totalSpecTestPenalties[i] += penalty
|
||||
}
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(rewards, totalSpecTestRewards) {
|
||||
t.Error("Rewards don't match")
|
||||
t.Log(rewards)
|
||||
t.Log(totalSpecTestRewards)
|
||||
}
|
||||
if !reflect.DeepEqual(penalties, totalSpecTestPenalties) {
|
||||
t.Error("Penalties don't match")
|
||||
t.Log(penalties)
|
||||
t.Log(totalSpecTestPenalties)
|
||||
}
|
||||
rewards.PrecomputeRewardsAndPenalties(t, preBeaconState, testFolderPath)
|
||||
}
|
||||
|
||||
15
testing/spectest/shared/common/rewards/BUILD.bazel
Normal file
15
testing/spectest/shared/common/rewards/BUILD.bazel
Normal file
@@ -0,0 +1,15 @@
|
||||
load("@prysm//tools/go:def.bzl", "go_library")
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["rewards_penalties.go"],
|
||||
importpath = "github.com/prysmaticlabs/prysm/v5/testing/spectest/shared/common/rewards",
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//beacon-chain/core/altair:go_default_library",
|
||||
"//beacon-chain/state:go_default_library",
|
||||
"//testing/require:go_default_library",
|
||||
"//testing/util:go_default_library",
|
||||
"@com_github_golang_snappy//:go_default_library",
|
||||
],
|
||||
)
|
||||
100
testing/spectest/shared/common/rewards/rewards_penalties.go
Normal file
100
testing/spectest/shared/common/rewards/rewards_penalties.go
Normal file
@@ -0,0 +1,100 @@
|
||||
package rewards
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/binary"
|
||||
"path"
|
||||
"reflect"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/golang/snappy"
|
||||
"github.com/prysmaticlabs/prysm/v5/beacon-chain/core/altair"
|
||||
"github.com/prysmaticlabs/prysm/v5/beacon-chain/state"
|
||||
"github.com/prysmaticlabs/prysm/v5/testing/require"
|
||||
"github.com/prysmaticlabs/prysm/v5/testing/util"
|
||||
)
|
||||
|
||||
// Delta contains list of rewards and penalties.
|
||||
type Delta struct {
|
||||
Rewards []uint64 `json:"rewards"`
|
||||
Penalties []uint64 `json:"penalties"`
|
||||
}
|
||||
|
||||
// unmarshalSSZ deserializes specs data into a simple aggregating container.
|
||||
func (d *Delta) unmarshalSSZ(buf []byte) error {
|
||||
offset1 := binary.LittleEndian.Uint32(buf[:4])
|
||||
offset2 := binary.LittleEndian.Uint32(buf[4:8])
|
||||
|
||||
for i := uint32(0); i < offset2-offset1; i += 8 {
|
||||
d.Rewards = append(d.Rewards, binary.LittleEndian.Uint64(buf[offset1+i:offset1+i+8]))
|
||||
d.Penalties = append(d.Penalties, binary.LittleEndian.Uint64(buf[offset2+i:offset2+i+8]))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func PrecomputeRewardsAndPenalties(t *testing.T, preBeaconState state.BeaconState, testFolderPath string) {
|
||||
ctx := context.Background()
|
||||
vp, bp, err := altair.InitializePrecomputeValidators(ctx, preBeaconState)
|
||||
require.NoError(t, err)
|
||||
vp, bp, err = altair.ProcessEpochParticipation(ctx, preBeaconState, bp, vp)
|
||||
require.NoError(t, err)
|
||||
|
||||
activeBal, targetPrevious, targetCurrent, err := preBeaconState.UnrealizedCheckpointBalances()
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, bp.ActiveCurrentEpoch, activeBal)
|
||||
require.Equal(t, bp.CurrentEpochTargetAttested, targetCurrent)
|
||||
require.Equal(t, bp.PrevEpochTargetAttested, targetPrevious)
|
||||
|
||||
deltas, err := altair.AttestationsDelta(preBeaconState, bp, vp)
|
||||
require.NoError(t, err)
|
||||
|
||||
rewards := make([]uint64, len(deltas))
|
||||
penalties := make([]uint64, len(deltas))
|
||||
for i, d := range deltas {
|
||||
rewards[i] = d.HeadReward + d.SourceReward + d.TargetReward
|
||||
penalties[i] = d.SourcePenalty + d.TargetPenalty + d.InactivityPenalty
|
||||
}
|
||||
|
||||
totalSpecTestRewards := make([]uint64, len(rewards))
|
||||
totalSpecTestPenalties := make([]uint64, len(penalties))
|
||||
|
||||
// Fetch delta files. i.e. source_deltas.ssz_snappy, etc.
|
||||
testfiles, err := util.BazelListFiles(path.Join(testFolderPath))
|
||||
require.NoError(t, err)
|
||||
deltaFiles := make([]string, 0, len(testfiles))
|
||||
for _, tf := range testfiles {
|
||||
if strings.Contains(tf, "deltas") {
|
||||
deltaFiles = append(deltaFiles, tf)
|
||||
}
|
||||
}
|
||||
if len(deltaFiles) == 0 {
|
||||
t.Fatal("No delta files")
|
||||
}
|
||||
|
||||
for _, dFile := range deltaFiles {
|
||||
sourceFile, err := util.BazelFileBytes(path.Join(testFolderPath, dFile))
|
||||
require.NoError(t, err)
|
||||
sourceSSZ, err := snappy.Decode(nil /* dst */, sourceFile)
|
||||
require.NoError(t, err, "Failed to decompress")
|
||||
d := &Delta{}
|
||||
require.NoError(t, d.unmarshalSSZ(sourceSSZ), "Failed to unmarshal")
|
||||
for i, reward := range d.Rewards {
|
||||
totalSpecTestRewards[i] += reward
|
||||
}
|
||||
for i, penalty := range d.Penalties {
|
||||
totalSpecTestPenalties[i] += penalty
|
||||
}
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(rewards, totalSpecTestRewards) {
|
||||
t.Error("Rewards don't match")
|
||||
t.Log(rewards)
|
||||
t.Log(totalSpecTestRewards)
|
||||
}
|
||||
if !reflect.DeepEqual(penalties, totalSpecTestPenalties) {
|
||||
t.Error("Penalties don't match")
|
||||
t.Log(penalties)
|
||||
t.Log(totalSpecTestPenalties)
|
||||
}
|
||||
}
|
||||
@@ -7,11 +7,11 @@ go_library(
|
||||
importpath = "github.com/prysmaticlabs/prysm/v5/testing/spectest/shared/deneb/rewards",
|
||||
visibility = ["//testing/spectest:__subpackages__"],
|
||||
deps = [
|
||||
"//beacon-chain/core/altair:go_default_library",
|
||||
"//beacon-chain/core/helpers:go_default_library",
|
||||
"//beacon-chain/state/state-native:go_default_library",
|
||||
"//proto/prysm/v1alpha1:go_default_library",
|
||||
"//testing/require:go_default_library",
|
||||
"//testing/spectest/shared/common/rewards:go_default_library",
|
||||
"//testing/spectest/utils:go_default_library",
|
||||
"//testing/util:go_default_library",
|
||||
"@com_github_golang_snappy//:go_default_library",
|
||||
|
||||
@@ -1,42 +1,20 @@
|
||||
package rewards
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"path"
|
||||
"reflect"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/golang/snappy"
|
||||
"github.com/prysmaticlabs/prysm/v5/beacon-chain/core/altair"
|
||||
"github.com/prysmaticlabs/prysm/v5/beacon-chain/core/helpers"
|
||||
state_native "github.com/prysmaticlabs/prysm/v5/beacon-chain/state/state-native"
|
||||
ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1"
|
||||
"github.com/prysmaticlabs/prysm/v5/testing/require"
|
||||
"github.com/prysmaticlabs/prysm/v5/testing/spectest/shared/common/rewards"
|
||||
"github.com/prysmaticlabs/prysm/v5/testing/spectest/utils"
|
||||
"github.com/prysmaticlabs/prysm/v5/testing/util"
|
||||
)
|
||||
|
||||
// Delta contains list of rewards and penalties.
|
||||
type Delta struct {
|
||||
Rewards []uint64 `json:"rewards"`
|
||||
Penalties []uint64 `json:"penalties"`
|
||||
}
|
||||
|
||||
// unmarshalSSZ deserializes specs data into a simple aggregating container.
|
||||
func (d *Delta) unmarshalSSZ(buf []byte) error {
|
||||
offset1 := binary.LittleEndian.Uint32(buf[:4])
|
||||
offset2 := binary.LittleEndian.Uint32(buf[4:8])
|
||||
|
||||
for i := uint32(0); i < offset2-offset1; i += 8 {
|
||||
d.Rewards = append(d.Rewards, binary.LittleEndian.Uint64(buf[offset1+i:offset1+i+8]))
|
||||
d.Penalties = append(d.Penalties, binary.LittleEndian.Uint64(buf[offset2+i:offset2+i+8]))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// RunPrecomputeRewardsAndPenaltiesTests executes "rewards/{basic, leak, random}" tests.
|
||||
func RunPrecomputeRewardsAndPenaltiesTests(t *testing.T, config string) {
|
||||
require.NoError(t, utils.SetConfig(t, config))
|
||||
@@ -58,7 +36,6 @@ func RunPrecomputeRewardsAndPenaltiesTests(t *testing.T, config string) {
|
||||
}
|
||||
|
||||
func runPrecomputeRewardsAndPenaltiesTest(t *testing.T, testFolderPath string) {
|
||||
ctx := context.Background()
|
||||
preBeaconStateFile, err := util.BazelFileBytes(path.Join(testFolderPath, "pre.ssz_snappy"))
|
||||
require.NoError(t, err)
|
||||
preBeaconStateSSZ, err := snappy.Decode(nil /* dst */, preBeaconStateFile)
|
||||
@@ -67,68 +44,5 @@ func runPrecomputeRewardsAndPenaltiesTest(t *testing.T, testFolderPath string) {
|
||||
require.NoError(t, preBeaconStateBase.UnmarshalSSZ(preBeaconStateSSZ), "Failed to unmarshal")
|
||||
preBeaconState, err := state_native.InitializeFromProtoDeneb(preBeaconStateBase)
|
||||
require.NoError(t, err)
|
||||
|
||||
vp, bp, err := altair.InitializePrecomputeValidators(ctx, preBeaconState)
|
||||
require.NoError(t, err)
|
||||
|
||||
vp, bp, err = altair.ProcessEpochParticipation(ctx, preBeaconState, bp, vp)
|
||||
require.NoError(t, err)
|
||||
|
||||
activeBal, targetPrevious, targetCurrent, err := preBeaconState.UnrealizedCheckpointBalances()
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, bp.ActiveCurrentEpoch, activeBal)
|
||||
require.Equal(t, bp.CurrentEpochTargetAttested, targetCurrent)
|
||||
require.Equal(t, bp.PrevEpochTargetAttested, targetPrevious)
|
||||
|
||||
deltas, err := altair.AttestationsDelta(preBeaconState, bp, vp)
|
||||
require.NoError(t, err)
|
||||
|
||||
rewards := make([]uint64, len(deltas))
|
||||
penalties := make([]uint64, len(deltas))
|
||||
for i, d := range deltas {
|
||||
rewards[i] = d.HeadReward + d.SourceReward + d.TargetReward
|
||||
penalties[i] = d.SourcePenalty + d.TargetPenalty + d.InactivityPenalty
|
||||
}
|
||||
|
||||
totalSpecTestRewards := make([]uint64, len(rewards))
|
||||
totalSpecTestPenalties := make([]uint64, len(penalties))
|
||||
|
||||
// Fetch delta files. i.e. source_deltas.ssz_snappy, etc.
|
||||
testfiles, err := util.BazelListFiles(path.Join(testFolderPath))
|
||||
require.NoError(t, err)
|
||||
deltaFiles := make([]string, 0, len(testfiles))
|
||||
for _, tf := range testfiles {
|
||||
if strings.Contains(tf, "deltas") {
|
||||
deltaFiles = append(deltaFiles, tf)
|
||||
}
|
||||
}
|
||||
if len(deltaFiles) == 0 {
|
||||
t.Fatal("No delta files")
|
||||
}
|
||||
|
||||
for _, dFile := range deltaFiles {
|
||||
sourceFile, err := util.BazelFileBytes(path.Join(testFolderPath, dFile))
|
||||
require.NoError(t, err)
|
||||
sourceSSZ, err := snappy.Decode(nil /* dst */, sourceFile)
|
||||
require.NoError(t, err, "Failed to decompress")
|
||||
d := &Delta{}
|
||||
require.NoError(t, d.unmarshalSSZ(sourceSSZ), "Failed to unmarshal")
|
||||
for i, reward := range d.Rewards {
|
||||
totalSpecTestRewards[i] += reward
|
||||
}
|
||||
for i, penalty := range d.Penalties {
|
||||
totalSpecTestPenalties[i] += penalty
|
||||
}
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(rewards, totalSpecTestRewards) {
|
||||
t.Error("Rewards don't match")
|
||||
t.Log(rewards)
|
||||
t.Log(totalSpecTestRewards)
|
||||
}
|
||||
if !reflect.DeepEqual(penalties, totalSpecTestPenalties) {
|
||||
t.Error("Penalties don't match")
|
||||
t.Log(penalties)
|
||||
t.Log(totalSpecTestPenalties)
|
||||
}
|
||||
rewards.PrecomputeRewardsAndPenalties(t, preBeaconState, testFolderPath)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user