Skip to content

Commit

Permalink
Merge pull request #4491 from ElrondNetwork/dataTrieTracker-refactor
Browse files Browse the repository at this point in the history
refactor dataTrieTracker
  • Loading branch information
BeniaminDrasovean authored Sep 26, 2022
2 parents 894a3d7 + 6a2897b commit 5b8eb89
Show file tree
Hide file tree
Showing 60 changed files with 407 additions and 1,028 deletions.
7 changes: 7 additions & 0 deletions common/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,13 @@ type KeyBuilder interface {
Clone() KeyBuilder
}

// DataTrieHandler is an interface that declares the methods used for dataTries
type DataTrieHandler interface {
RootHash() ([]byte, error)
GetAllLeavesOnChannel(leavesChannel chan core.KeyValueHolder, ctx context.Context, rootHash []byte, keyBuilder KeyBuilder) error
IsInterfaceNil() bool
}

// StorageManager manages all trie storage operations
type StorageManager interface {
Get(key []byte) ([]byte, error)
Expand Down
2 changes: 1 addition & 1 deletion epochStart/metachain/baseRewards.go
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,7 @@ func (brc *baseRewardsCreator) isSystemDelegationSC(address []byte) bool {
return false
}

val, err := userAcc.DataTrieTracker().RetrieveValue([]byte(core.DelegationSystemSCKey))
val, err := userAcc.RetrieveValue([]byte(core.DelegationSystemSCKey))
if err != nil {
return false
}
Expand Down
13 changes: 5 additions & 8 deletions epochStart/metachain/baseRewards_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -855,15 +855,12 @@ func TestBaseRewardsCreator_isSystemDelegationSCTrue(t *testing.T) {
args.UserAccountsDB = &stateMock.AccountsStub{
GetExistingAccountCalled: func(address []byte) (vmcommon.AccountHandler, error) {
return &stateMock.UserAccountStub{
DataTrieTrackerCalled: func() state.DataTrieTracker {
return &mock.DataTrieTrackerStub{
RetrieveValueCalled: func(key []byte) ([]byte, error) {
if bytes.Equal(key, []byte("delegation")) {
return []byte("value"), nil
}
return nil, fmt.Errorf("error")
},
RetrieveValueCalled: func(key []byte) ([]byte, error) {
if bytes.Equal(key, []byte("delegation")) {
return []byte("value"), nil
}

return nil, fmt.Errorf("error")
},
}, nil
},
Expand Down
2 changes: 1 addition & 1 deletion epochStart/metachain/rewards_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -767,7 +767,7 @@ func TestRewardsCreator_ValidatorInfoWithMetaAddressAddedToProtocolSustainabilit

acc, _ := args.UserAccountsDB.LoadAccount(vm.FirstDelegationSCAddress)
userAcc, _ := acc.(state.UserAccountHandler)
_ = userAcc.DataTrieTracker().SaveKeyValue([]byte(core.DelegationSystemSCKey), []byte(core.DelegationSystemSCKey))
_ = userAcc.SaveKeyValue([]byte(core.DelegationSystemSCKey), []byte(core.DelegationSystemSCKey))
_ = args.UserAccountsDB.SaveAccount(userAcc)

miniBlocks, err := rwdc.CreateRewardsMiniBlocks(metaBlk, valInfo, &metaBlk.EpochStart.Economics)
Expand Down
2 changes: 1 addition & 1 deletion epochStart/metachain/stakingDataProvider_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -450,7 +450,7 @@ func saveOutputAccounts(t *testing.T, accountsDB state.AccountsAdapter, vmOutput

userAccount, _ := account.(state.UserAccountHandler)
for _, storeUpdate := range outputAccount.StorageUpdates {
_ = userAccount.DataTrieTracker().SaveKeyValue(storeUpdate.Offset, storeUpdate.Data)
_ = userAccount.SaveKeyValue(storeUpdate.Offset, storeUpdate.Data)
}

err := accountsDB.SaveAccount(account)
Expand Down
2 changes: 1 addition & 1 deletion epochStart/metachain/systemSCs.go
Original file line number Diff line number Diff line change
Expand Up @@ -891,7 +891,7 @@ func (s *systemSCProcessor) processSCOutputAccounts(

storageUpdates := process.GetSortedStorageUpdates(outAcc)
for _, storeUpdate := range storageUpdates {
err = acc.DataTrieTracker().SaveKeyValue(storeUpdate.Offset, storeUpdate.Data)
err = acc.SaveKeyValue(storeUpdate.Offset, storeUpdate.Data)
if err != nil {
return err
}
Expand Down
56 changes: 28 additions & 28 deletions epochStart/metachain/systemSCs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,7 @@ func checkNodesStatusInSystemSCDataTrie(t *testing.T, nodes []*state.ValidatorIn
systemScAccount, ok := account.(state.UserAccountHandler)
require.True(t, ok)
for _, nodeInfo := range nodes {
buff, err = systemScAccount.DataTrieTracker().RetrieveValue(nodeInfo.PublicKey)
buff, err = systemScAccount.RetrieveValue(nodeInfo.PublicKey)
require.Nil(t, err)
require.True(t, len(buff) > 0)

Expand Down Expand Up @@ -547,7 +547,7 @@ func createEligibleNodes(numNodes int, stakingSCAcc state.UserAccountHandler, ma
StakeValue: big.NewInt(100),
}
marshaledData, _ := marshalizer.Marshal(stakedData)
_ = stakingSCAcc.DataTrieTracker().SaveKeyValue([]byte(fmt.Sprintf("waiting_%d", i)), marshaledData)
_ = stakingSCAcc.SaveKeyValue([]byte(fmt.Sprintf("waiting_%d", i)), marshaledData)
}
}

Expand All @@ -562,7 +562,7 @@ func createJailedNodes(numNodes int, stakingSCAcc state.UserAccountHandler, user
OwnerAddress: []byte("ownerForAll"),
}
marshaledData, _ := marshalizer.Marshal(stakedData)
_ = stakingSCAcc.DataTrieTracker().SaveKeyValue([]byte(fmt.Sprintf("jailed__%d", i)), marshaledData)
_ = stakingSCAcc.SaveKeyValue([]byte(fmt.Sprintf("jailed__%d", i)), marshaledData)

_ = userAccounts.SaveAccount(stakingSCAcc)

Expand Down Expand Up @@ -629,11 +629,11 @@ func addValidatorDataWithUnStakedKey(
OwnerAddress: ownerKey,
}
marshaledData, _ := marshalizer.Marshal(stakingData)
_ = stakingAccount.DataTrieTracker().SaveKeyValue(bls, marshaledData)
_ = stakingAccount.SaveKeyValue(bls, marshaledData)
}

marshaledData, _ := marshalizer.Marshal(validatorData)
_ = validatorAccount.DataTrieTracker().SaveKeyValue(ownerKey, marshaledData)
_ = validatorAccount.SaveKeyValue(ownerKey, marshaledData)

_ = accountsDB.SaveAccount(validatorAccount)
_ = accountsDB.SaveAccount(stakingAccount)
Expand All @@ -650,7 +650,7 @@ func createWaitingNodes(numNodes int, stakingSCAcc state.UserAccountHandler, use
StakeValue: big.NewInt(100),
}
marshaledData, _ := marshalizer.Marshal(stakedData)
_ = stakingSCAcc.DataTrieTracker().SaveKeyValue([]byte(fmt.Sprintf("waiting_%d", i)), marshaledData)
_ = stakingSCAcc.SaveKeyValue([]byte(fmt.Sprintf("waiting_%d", i)), marshaledData)
previousKey := string(waitingKeyInList)
waitingKeyInList = []byte("w_" + fmt.Sprintf("waiting_%d", i))
waitingListHead := &systemSmartContracts.WaitingList{
Expand All @@ -659,7 +659,7 @@ func createWaitingNodes(numNodes int, stakingSCAcc state.UserAccountHandler, use
Length: uint32(numNodes),
}
marshaledData, _ = marshalizer.Marshal(waitingListHead)
_ = stakingSCAcc.DataTrieTracker().SaveKeyValue([]byte("waitingList"), marshaledData)
_ = stakingSCAcc.SaveKeyValue([]byte("waitingList"), marshaledData)

waitingListElement := &systemSmartContracts.ElementInList{
BLSPublicKey: []byte(fmt.Sprintf("waiting_%d", i)),
Expand All @@ -674,7 +674,7 @@ func createWaitingNodes(numNodes int, stakingSCAcc state.UserAccountHandler, use
}

marshaledData, _ = marshalizer.Marshal(waitingListElement)
_ = stakingSCAcc.DataTrieTracker().SaveKeyValue(waitingKeyInList, marshaledData)
_ = stakingSCAcc.SaveKeyValue(waitingKeyInList, marshaledData)

vInfo := &state.ValidatorInfo{
PublicKey: []byte(fmt.Sprintf("waiting_%d", i)),
Expand Down Expand Up @@ -713,7 +713,7 @@ func addValidatorData(
}

marshaledData, _ := marshalizer.Marshal(validatorData)
_ = validatorSC.DataTrieTracker().SaveKeyValue(ownerKey, marshaledData)
_ = validatorSC.SaveKeyValue(ownerKey, marshaledData)

_ = accountsDB.SaveAccount(validatorSC)
}
Expand All @@ -732,7 +732,7 @@ func addStakedData(
StakeValue: big.NewInt(0),
}
marshaledData, _ := marshalizer.Marshal(stakedData)
_ = stakingSCAcc.DataTrieTracker().SaveKeyValue(stakedKey, marshaledData)
_ = stakingSCAcc.SaveKeyValue(stakedKey, marshaledData)

_ = accountsDB.SaveAccount(stakingSCAcc)
}
Expand All @@ -754,7 +754,7 @@ func prepareStakingContractWithData(
StakeValue: big.NewInt(100),
}
marshaledData, _ := marshalizer.Marshal(stakedData)
_ = stakingSCAcc.DataTrieTracker().SaveKeyValue(stakedKey, marshaledData)
_ = stakingSCAcc.SaveKeyValue(stakedKey, marshaledData)
_ = accountsDB.SaveAccount(stakingSCAcc)

saveOneKeyToWaitingList(accountsDB, waitingKey, marshalizer, rewardAddress, ownerAddress)
Expand All @@ -772,7 +772,7 @@ func prepareStakingContractWithData(
}

marshaledData, _ = marshalizer.Marshal(validatorData)
_ = validatorSC.DataTrieTracker().SaveKeyValue(rewardAddress, marshaledData)
_ = validatorSC.SaveKeyValue(rewardAddress, marshaledData)

_ = accountsDB.SaveAccount(validatorSC)
_, err := accountsDB.Commit()
Expand All @@ -794,7 +794,7 @@ func saveOneKeyToWaitingList(
StakeValue: big.NewInt(100),
}
marshaledData, _ := marshalizer.Marshal(stakedData)
_ = stakingSCAcc.DataTrieTracker().SaveKeyValue(waitingKey, marshaledData)
_ = stakingSCAcc.SaveKeyValue(waitingKey, marshaledData)

waitingKeyInList := []byte("w_" + string(waitingKey))
waitingListHead := &systemSmartContracts.WaitingList{
Expand All @@ -803,15 +803,15 @@ func saveOneKeyToWaitingList(
Length: 1,
}
marshaledData, _ = marshalizer.Marshal(waitingListHead)
_ = stakingSCAcc.DataTrieTracker().SaveKeyValue([]byte("waitingList"), marshaledData)
_ = stakingSCAcc.SaveKeyValue([]byte("waitingList"), marshaledData)

waitingListElement := &systemSmartContracts.ElementInList{
BLSPublicKey: waitingKey,
PreviousKey: waitingKeyInList,
NextKey: make([]byte, 0),
}
marshaledData, _ = marshalizer.Marshal(waitingListElement)
_ = stakingSCAcc.DataTrieTracker().SaveKeyValue(waitingKeyInList, marshaledData)
_ = stakingSCAcc.SaveKeyValue(waitingKeyInList, marshaledData)

_ = accountsDB.SaveAccount(stakingSCAcc)
}
Expand All @@ -833,18 +833,18 @@ func addKeysToWaitingList(
StakeValue: big.NewInt(100),
}
marshaledData, _ := marshalizer.Marshal(stakedData)
_ = stakingSCAcc.DataTrieTracker().SaveKeyValue(waitingKey, marshaledData)
_ = stakingSCAcc.SaveKeyValue(waitingKey, marshaledData)
}

marshaledData, _ := stakingSCAcc.DataTrieTracker().RetrieveValue([]byte("waitingList"))
marshaledData, _ := stakingSCAcc.RetrieveValue([]byte("waitingList"))
waitingListHead := &systemSmartContracts.WaitingList{}
_ = marshalizer.Unmarshal(waitingListHead, marshaledData)
waitingListHead.Length += uint32(len(waitingKeys))
lastKeyInList := []byte("w_" + string(waitingKeys[len(waitingKeys)-1]))
waitingListHead.LastKey = lastKeyInList

marshaledData, _ = marshalizer.Marshal(waitingListHead)
_ = stakingSCAcc.DataTrieTracker().SaveKeyValue([]byte("waitingList"), marshaledData)
_ = stakingSCAcc.SaveKeyValue([]byte("waitingList"), marshaledData)

numWaitingKeys := len(waitingKeys)
previousKey := waitingListHead.FirstKey
Expand All @@ -863,17 +863,17 @@ func addKeysToWaitingList(
}

marshaledData, _ = marshalizer.Marshal(waitingListElement)
_ = stakingSCAcc.DataTrieTracker().SaveKeyValue(waitingKeyInList, marshaledData)
_ = stakingSCAcc.SaveKeyValue(waitingKeyInList, marshaledData)

previousKey = waitingKeyInList
}

marshaledData, _ = stakingSCAcc.DataTrieTracker().RetrieveValue(waitingListHead.FirstKey)
marshaledData, _ = stakingSCAcc.RetrieveValue(waitingListHead.FirstKey)
waitingListElement := &systemSmartContracts.ElementInList{}
_ = marshalizer.Unmarshal(waitingListElement, marshaledData)
waitingListElement.NextKey = []byte("w_" + string(waitingKeys[0]))
marshaledData, _ = marshalizer.Marshal(waitingListElement)
_ = stakingSCAcc.DataTrieTracker().SaveKeyValue(waitingListHead.FirstKey, marshaledData)
_ = stakingSCAcc.SaveKeyValue(waitingListHead.FirstKey, marshaledData)

_ = accountsDB.SaveAccount(stakingSCAcc)
}
Expand Down Expand Up @@ -1484,7 +1484,7 @@ func addDelegationData(
}

marshaledData, _ := marshalizer.Marshal(dStatus)
_ = delegatorSC.DataTrieTracker().SaveKeyValue([]byte("delegationStatus"), marshaledData)
_ = delegatorSC.SaveKeyValue([]byte("delegationStatus"), marshaledData)
_ = accountsDB.SaveAccount(delegatorSC)
}

Expand Down Expand Up @@ -1563,7 +1563,7 @@ func TestSystemSCProcessor_ProcessSystemSmartContractUnStakeFromDelegationContra
assert.Equal(t, 4, len(validatorInfos[0]))

delegationSC := loadSCAccount(args.UserAccountsDB, delegationAddr)
marshalledData, err := delegationSC.DataTrie().Get([]byte("delegationStatus"))
marshalledData, err := delegationSC.DataTrie().(common.Trie).Get([]byte("delegationStatus"))
assert.Nil(t, err)
dStatus := &systemSmartContracts.DelegationContractStatus{
StakedKeys: make([]*systemSmartContracts.NodesData, 0),
Expand Down Expand Up @@ -1652,7 +1652,7 @@ func TestSystemSCProcessor_ProcessSystemSmartContractShouldUnStakeFromAdditional
}

delegationSC := loadSCAccount(args.UserAccountsDB, delegationAddr)
marshalledData, err := delegationSC.DataTrie().Get([]byte("delegationStatus"))
marshalledData, err := delegationSC.DataTrie().(common.Trie).Get([]byte("delegationStatus"))
assert.Nil(t, err)
dStatus := &systemSmartContracts.DelegationContractStatus{
StakedKeys: make([]*systemSmartContracts.NodesData, 0),
Expand Down Expand Up @@ -1742,7 +1742,7 @@ func TestSystemSCProcessor_ProcessSystemSmartContractUnStakeFromAdditionalQueue(
assert.Nil(t, err)

delegationSC := loadSCAccount(args.UserAccountsDB, delegationAddr2)
marshalledData, err := delegationSC.DataTrie().Get([]byte("delegationStatus"))
marshalledData, err := delegationSC.DataTrie().(common.Trie).Get([]byte("delegationStatus"))
assert.Nil(t, err)
dStatus := &systemSmartContracts.DelegationContractStatus{
StakedKeys: make([]*systemSmartContracts.NodesData, 0),
Expand All @@ -1758,7 +1758,7 @@ func TestSystemSCProcessor_ProcessSystemSmartContractUnStakeFromAdditionalQueue(
assert.Equal(t, []byte("waitingPubKe3"), dStatus.UnStakedKeys[1].BLSKey)

stakingSCAcc := loadSCAccount(args.UserAccountsDB, vm.StakingSCAddress)
marshaledData, _ := stakingSCAcc.DataTrieTracker().RetrieveValue([]byte("waitingList"))
marshaledData, _ := stakingSCAcc.RetrieveValue([]byte("waitingList"))
waitingListHead := &systemSmartContracts.WaitingList{}
_ = args.Marshalizer.Unmarshal(waitingListHead, marshaledData)
assert.Equal(t, uint32(3), waitingListHead.Length)
Expand Down Expand Up @@ -1827,14 +1827,14 @@ func TestSystemSCProcessor_TogglePauseUnPause(t *testing.T) {
assert.Nil(t, err)

validatorSC := loadSCAccount(s.userAccountsDB, vm.ValidatorSCAddress)
value, _ := validatorSC.DataTrie().Get([]byte("unStakeUnBondPause"))
value, _ := validatorSC.DataTrie().(common.Trie).Get([]byte("unStakeUnBondPause"))
assert.True(t, value[0] == 1)

err = s.ToggleUnStakeUnBond(false)
assert.Nil(t, err)

validatorSC = loadSCAccount(s.userAccountsDB, vm.ValidatorSCAddress)
value, _ = validatorSC.DataTrie().Get([]byte("unStakeUnBondPause"))
value, _ = validatorSC.DataTrie().(common.Trie).Get([]byte("unStakeUnBondPause"))
assert.True(t, value[0] == 0)
}

Expand Down
66 changes: 0 additions & 66 deletions epochStart/mock/dataTrieTrackerStub.go

This file was deleted.

Loading

0 comments on commit 5b8eb89

Please sign in to comment.