mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2024-12-25 21:07:18 +00:00
21bdbd548a
* v0 * getters/setters * init and copy * hasher * all the nice stuff * make bazel happy * remove tests for smaller PR * remove old states * move files * import fixes * custom MarshalSSZ * fixed deadlock * copy version when copying state * correct issues in state_trie * fix Copy() * better e2e comment * add code to minimal state * spectest test * Revert "Auxiliary commit to revert individual files from 84154423464e8372f7e0a03367403656ac5cd78e" This reverts commit 9602599d183081291dfa0ba4f1036430f63a7822. * native state assert * always error * always log * more native state usage * cleanup * remove empty line * Revert "spectests" This reverts commit 1c49bed5d1cf6224afaf21e18562bf72fae5d2b6. # Conflicts: # beacon-chain/powchain/service.go # beacon-chain/state/v1/state_trie.go # beacon-chain/state/v2/state_trie.go # beacon-chain/state/v3/state_trie.go # testing/spectest/shared/phase0/finality/BUILD.bazel # testing/spectest/shared/phase0/finality/runner.go * dedup field trie * fix test issues * cleanup * use correct field num in FinalizedRootProof * use existing version constant * halfway there * "working" version * some fixes * fix field nums in tests * rename v0types to nativetypes * Revert "Auxiliary commit to revert individual files from dc549b1cf8e724bd08cee1ecc760ff3771d5592d" This reverts commit 7254d3070d8693b283fc686a2e01a822ecbac1b3. * uncomment code * remove map size * Revert "Revert "spectests"" This reverts commit 39c271ae6b57d6a3737e2c202cd8407857475e56. * use reverse map * Revert "Revert "Revert "spectests""" This reverts commit 19ba8cf95cdca689357c8234a262e08cccbafef4. * finally found the bug (cherry picked from commit a5414c4be1bdb61a50b391ea5301895e772cc5e9) * simplify populateFieldIndexes * fix copy (cherry picked from commit 7da4fb8cf51557ef931bb781872ea52fc6731af5) * remove native state from e2e * remove index map * unsupported functions * Use ProtobufBeaconState() from native state * tests * typo * reduce complexity of `SaveStatesEfficient` * remove unused receiver name * update doc.go * fix test assertion * fix test assertion 2 * Phase0 justification bits * bring back state tests * rename fieldIndexRev * versioning of ToProto * remove version check from unexported function * hasher tests * don't return error from JustificationBits * extract fieldConvertersNative * helper error function * use fieldConvertersNative * Introduce RealPosition method on FieldIndex * use RealPosition in hasher * remove unused fields * remove TestAppendBeyondIndicesLimit (cherry picked from commit 3017e700282969c30006b64c95c21ffe6b166f8b) * simplify RealPosition * rename field interface * use helper in proofs.go * Update beacon-chain/core/altair/upgrade.go Co-authored-by: Nishant Das <nishdas93@gmail.com> Co-authored-by: Raul Jordan <raul@prysmaticlabs.com>
386 lines
9.7 KiB
Go
386 lines
9.7 KiB
Go
package state_native_test
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/prysmaticlabs/prysm/beacon-chain/state"
|
|
statenative "github.com/prysmaticlabs/prysm/beacon-chain/state/state-native"
|
|
"github.com/prysmaticlabs/prysm/config/params"
|
|
"github.com/prysmaticlabs/prysm/encoding/bytesutil"
|
|
ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1"
|
|
"github.com/prysmaticlabs/prysm/testing/assert"
|
|
"github.com/prysmaticlabs/prysm/testing/require"
|
|
"github.com/prysmaticlabs/prysm/testing/util"
|
|
)
|
|
|
|
func TestInitializeFromProto_Phase0(t *testing.T) {
|
|
testState, _ := util.DeterministicGenesisState(t, 64)
|
|
pbState, err := statenative.ProtobufBeaconStatePhase0(testState.InnerStateUnsafe())
|
|
require.NoError(t, err)
|
|
type test struct {
|
|
name string
|
|
state *ethpb.BeaconState
|
|
error string
|
|
}
|
|
initTests := []test{
|
|
{
|
|
name: "nil state",
|
|
state: nil,
|
|
error: "received nil state",
|
|
},
|
|
{
|
|
name: "nil validators",
|
|
state: ðpb.BeaconState{
|
|
Slot: 4,
|
|
Validators: nil,
|
|
},
|
|
},
|
|
{
|
|
name: "empty state",
|
|
state: ðpb.BeaconState{},
|
|
},
|
|
{
|
|
name: "full state",
|
|
state: pbState,
|
|
},
|
|
}
|
|
for _, tt := range initTests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
_, err := statenative.InitializeFromProtoUnsafePhase0(tt.state)
|
|
if tt.error != "" {
|
|
assert.ErrorContains(t, tt.error, err)
|
|
} else {
|
|
assert.NoError(t, err)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestInitializeFromProto_Altair(t *testing.T) {
|
|
type test struct {
|
|
name string
|
|
state *ethpb.BeaconStateAltair
|
|
error string
|
|
}
|
|
initTests := []test{
|
|
{
|
|
name: "nil state",
|
|
state: nil,
|
|
error: "received nil state",
|
|
},
|
|
{
|
|
name: "nil validators",
|
|
state: ðpb.BeaconStateAltair{
|
|
Slot: 4,
|
|
Validators: nil,
|
|
},
|
|
},
|
|
{
|
|
name: "empty state",
|
|
state: ðpb.BeaconStateAltair{},
|
|
},
|
|
// TODO: Add full state. Blocked by testutil migration.
|
|
}
|
|
for _, tt := range initTests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
_, err := statenative.InitializeFromProtoAltair(tt.state)
|
|
if tt.error != "" {
|
|
require.ErrorContains(t, tt.error, err)
|
|
} else {
|
|
require.NoError(t, err)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestInitializeFromProto_Bellatrix(t *testing.T) {
|
|
type test struct {
|
|
name string
|
|
state *ethpb.BeaconStateBellatrix
|
|
error string
|
|
}
|
|
initTests := []test{
|
|
{
|
|
name: "nil state",
|
|
state: nil,
|
|
error: "received nil state",
|
|
},
|
|
{
|
|
name: "nil validators",
|
|
state: ðpb.BeaconStateBellatrix{
|
|
Slot: 4,
|
|
Validators: nil,
|
|
},
|
|
},
|
|
{
|
|
name: "empty state",
|
|
state: ðpb.BeaconStateBellatrix{},
|
|
},
|
|
}
|
|
for _, tt := range initTests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
_, err := statenative.InitializeFromProtoBellatrix(tt.state)
|
|
if tt.error != "" {
|
|
require.ErrorContains(t, tt.error, err)
|
|
} else {
|
|
require.NoError(t, err)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestInitializeFromProtoUnsafe_Phase0(t *testing.T) {
|
|
testState, _ := util.DeterministicGenesisState(t, 64)
|
|
pbState, err := statenative.ProtobufBeaconStatePhase0(testState.InnerStateUnsafe())
|
|
require.NoError(t, err)
|
|
type test struct {
|
|
name string
|
|
state *ethpb.BeaconState
|
|
error string
|
|
}
|
|
initTests := []test{
|
|
{
|
|
name: "nil validators",
|
|
state: ðpb.BeaconState{
|
|
Slot: 4,
|
|
Validators: nil,
|
|
},
|
|
},
|
|
{
|
|
name: "empty state",
|
|
state: ðpb.BeaconState{},
|
|
},
|
|
{
|
|
name: "full state",
|
|
state: pbState,
|
|
},
|
|
}
|
|
for _, tt := range initTests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
_, err := statenative.InitializeFromProtoUnsafePhase0(tt.state)
|
|
if tt.error != "" {
|
|
assert.ErrorContains(t, tt.error, err)
|
|
} else {
|
|
assert.NoError(t, err)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestInitializeFromProtoUnsafe_Altair(t *testing.T) {
|
|
type test struct {
|
|
name string
|
|
state *ethpb.BeaconStateAltair
|
|
error string
|
|
}
|
|
initTests := []test{
|
|
{
|
|
name: "nil validators",
|
|
state: ðpb.BeaconStateAltair{
|
|
Slot: 4,
|
|
Validators: nil,
|
|
},
|
|
},
|
|
{
|
|
name: "empty state",
|
|
state: ðpb.BeaconStateAltair{},
|
|
},
|
|
// TODO: Add full state. Blocked by testutil migration.
|
|
}
|
|
_ = initTests
|
|
}
|
|
|
|
func TestInitializeFromProtoUnsafe_Bellatrix(t *testing.T) {
|
|
type test struct {
|
|
name string
|
|
state *ethpb.BeaconStateBellatrix
|
|
error string
|
|
}
|
|
initTests := []test{
|
|
{
|
|
name: "nil validators",
|
|
state: ðpb.BeaconStateBellatrix{
|
|
Slot: 4,
|
|
Validators: nil,
|
|
},
|
|
},
|
|
{
|
|
name: "empty state",
|
|
state: ðpb.BeaconStateBellatrix{},
|
|
},
|
|
// TODO: Add full state. Blocked by testutil migration.
|
|
}
|
|
_ = initTests
|
|
}
|
|
|
|
func TestBeaconState_HashTreeRoot(t *testing.T) {
|
|
testState, _ := util.DeterministicGenesisState(t, 64)
|
|
|
|
type test struct {
|
|
name string
|
|
stateModify func(beaconState state.BeaconState) (state.BeaconState, error)
|
|
error string
|
|
}
|
|
initTests := []test{
|
|
{
|
|
name: "unchanged state",
|
|
stateModify: func(beaconState state.BeaconState) (state.BeaconState, error) {
|
|
return beaconState, nil
|
|
},
|
|
error: "",
|
|
},
|
|
{
|
|
name: "different slot",
|
|
stateModify: func(beaconState state.BeaconState) (state.BeaconState, error) {
|
|
if err := beaconState.SetSlot(5); err != nil {
|
|
return nil, err
|
|
}
|
|
return beaconState, nil
|
|
},
|
|
error: "",
|
|
},
|
|
{
|
|
name: "different validator balance",
|
|
stateModify: func(beaconState state.BeaconState) (state.BeaconState, error) {
|
|
val, err := beaconState.ValidatorAtIndex(5)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
val.EffectiveBalance = params.BeaconConfig().MaxEffectiveBalance - params.BeaconConfig().EffectiveBalanceIncrement
|
|
if err := beaconState.UpdateValidatorAtIndex(5, val); err != nil {
|
|
return nil, err
|
|
}
|
|
return beaconState, nil
|
|
},
|
|
error: "",
|
|
},
|
|
}
|
|
|
|
var err error
|
|
var oldHTR []byte
|
|
for _, tt := range initTests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
testState, err = tt.stateModify(testState)
|
|
assert.NoError(t, err)
|
|
root, err := testState.HashTreeRoot(context.Background())
|
|
if err == nil && tt.error != "" {
|
|
t.Errorf("Expected error, expected %v, recevied %v", tt.error, err)
|
|
}
|
|
pbState, err := statenative.ProtobufBeaconStatePhase0(testState.InnerStateUnsafe())
|
|
require.NoError(t, err)
|
|
genericHTR, err := pbState.HashTreeRoot()
|
|
if err == nil && tt.error != "" {
|
|
t.Errorf("Expected error, expected %v, recevied %v", tt.error, err)
|
|
}
|
|
assert.DeepNotEqual(t, []byte{}, root[:], "Received empty hash tree root")
|
|
assert.DeepEqual(t, genericHTR[:], root[:], "Expected hash tree root to match generic")
|
|
if len(oldHTR) != 0 && bytes.Equal(root[:], oldHTR) {
|
|
t.Errorf("Expected HTR to change, received %#x == old %#x", root, oldHTR)
|
|
}
|
|
oldHTR = root[:]
|
|
})
|
|
}
|
|
}
|
|
|
|
func BenchmarkBeaconState(b *testing.B) {
|
|
testState, _ := util.DeterministicGenesisState(b, 16000)
|
|
pbState, err := statenative.ProtobufBeaconStatePhase0(testState.InnerStateUnsafe())
|
|
require.NoError(b, err)
|
|
|
|
b.Run("Vectorized SHA256", func(b *testing.B) {
|
|
st, err := statenative.InitializeFromProtoUnsafePhase0(pbState)
|
|
require.NoError(b, err)
|
|
_, err = st.HashTreeRoot(context.Background())
|
|
assert.NoError(b, err)
|
|
})
|
|
|
|
b.Run("Current SHA256", func(b *testing.B) {
|
|
_, err := pbState.HashTreeRoot()
|
|
require.NoError(b, err)
|
|
})
|
|
}
|
|
|
|
func TestBeaconState_HashTreeRoot_FieldTrie(t *testing.T) {
|
|
testState, _ := util.DeterministicGenesisState(t, 64)
|
|
|
|
type test struct {
|
|
name string
|
|
stateModify func(state.BeaconState) (state.BeaconState, error)
|
|
error string
|
|
}
|
|
initTests := []test{
|
|
{
|
|
name: "unchanged state",
|
|
stateModify: func(beaconState state.BeaconState) (state.BeaconState, error) {
|
|
return beaconState, nil
|
|
},
|
|
error: "",
|
|
},
|
|
{
|
|
name: "different slot",
|
|
stateModify: func(beaconState state.BeaconState) (state.BeaconState, error) {
|
|
if err := beaconState.SetSlot(5); err != nil {
|
|
return nil, err
|
|
}
|
|
return beaconState, nil
|
|
},
|
|
error: "",
|
|
},
|
|
{
|
|
name: "different validator balance",
|
|
stateModify: func(beaconState state.BeaconState) (state.BeaconState, error) {
|
|
val, err := beaconState.ValidatorAtIndex(5)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
val.EffectiveBalance = params.BeaconConfig().MaxEffectiveBalance - params.BeaconConfig().EffectiveBalanceIncrement
|
|
if err := beaconState.UpdateValidatorAtIndex(5, val); err != nil {
|
|
return nil, err
|
|
}
|
|
return beaconState, nil
|
|
},
|
|
error: "",
|
|
},
|
|
}
|
|
|
|
var err error
|
|
var oldHTR []byte
|
|
for _, tt := range initTests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
testState, err = tt.stateModify(testState)
|
|
assert.NoError(t, err)
|
|
root, err := testState.HashTreeRoot(context.Background())
|
|
if err == nil && tt.error != "" {
|
|
t.Errorf("Expected error, expected %v, recevied %v", tt.error, err)
|
|
}
|
|
pbState, err := statenative.ProtobufBeaconStatePhase0(testState.InnerStateUnsafe())
|
|
require.NoError(t, err)
|
|
genericHTR, err := pbState.HashTreeRoot()
|
|
if err == nil && tt.error != "" {
|
|
t.Errorf("Expected error, expected %v, recevied %v", tt.error, err)
|
|
}
|
|
assert.DeepNotEqual(t, []byte{}, root[:], "Received empty hash tree root")
|
|
assert.DeepEqual(t, genericHTR[:], root[:], "Expected hash tree root to match generic")
|
|
if len(oldHTR) != 0 && bytes.Equal(root[:], oldHTR) {
|
|
t.Errorf("Expected HTR to change, received %#x == old %#x", root, oldHTR)
|
|
}
|
|
oldHTR = root[:]
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestBeaconState_AppendValidator_DoesntMutateCopy(t *testing.T) {
|
|
st0, err := util.NewBeaconState()
|
|
require.NoError(t, err)
|
|
st1 := st0.Copy()
|
|
originalCount := st1.NumValidators()
|
|
|
|
val := ðpb.Validator{Slashed: true}
|
|
assert.NoError(t, st0.AppendValidator(val))
|
|
assert.Equal(t, originalCount, st1.NumValidators(), "st1 NumValidators mutated")
|
|
_, ok := st1.ValidatorIndexByPubkey(bytesutil.ToBytes48(val.PublicKey))
|
|
assert.Equal(t, false, ok, "Expected no validator index to be present in st1 for the newly inserted pubkey")
|
|
}
|