Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add guardian service UID #4816

Merged
merged 2 commits into from
Dec 23, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@ go 1.17

require (
github.com/ElrondNetwork/elastic-indexer-go v1.3.3
github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221207113027-6add1889c6e8
github.com/ElrondNetwork/elrond-go-crypto v1.2.4-0.20221212134904-9faa0161e5dc
github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221219143439-1bc10dae0ea9
github.com/ElrondNetwork/elrond-go-crypto v1.2.4-0.20221213102512-0180dd3e00ce
github.com/ElrondNetwork/elrond-go-logger v1.0.10
github.com/ElrondNetwork/elrond-go-p2p v1.0.5
github.com/ElrondNetwork/elrond-go-storage v1.0.4
github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221207113405-6973ba06dc58
github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221213075903-473826256396
github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221213080744-6f0dfc0d2d8e
github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.69-0.20221213080907-de31f5655d76
github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221219143644-8d3505605a6d
github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221220091555-43a76f302a3c
github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221220092736-8cf25a9de448
github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.70-0.20221220092056-49d2bc14b314
github.com/beevik/ntp v0.3.0
github.com/davecgh/go-spew v1.1.1
github.com/elastic/go-elasticsearch/v7 v7.12.0
Expand Down
24 changes: 12 additions & 12 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,11 @@ github.com/ElrondNetwork/concurrent-map v0.1.3/go.mod h1:3XwSwn4JHI0lrKxWLZvtp53
github.com/ElrondNetwork/elastic-indexer-go v1.3.3 h1:RgJ043yt92PUWMbSAQHRrC+GiyNnFdwdM/kseHlpLoo=
github.com/ElrondNetwork/elastic-indexer-go v1.3.3/go.mod h1:E3VO5712GkGSGYnOTJ+0wxW74JXgjV6XCRPlcHiTTK0=
github.com/ElrondNetwork/elrond-go-core v1.1.26/go.mod h1:N/RI++YU2M6OlnD1GSZepc1wPhI84ykRDQ1IyD3B0wk=
github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221207113027-6add1889c6e8 h1:iYFJrSgKmyRDFkDFBXABqs7UwjrGeA0b5Nit9xmogzk=
github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221207113027-6add1889c6e8/go.mod h1:N/RI++YU2M6OlnD1GSZepc1wPhI84ykRDQ1IyD3B0wk=
github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221219143439-1bc10dae0ea9 h1:bqVom8Mvfmep6YYW8JjAfrZ+L0I139Llm68hgNc1tP4=
github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221219143439-1bc10dae0ea9/go.mod h1:N/RI++YU2M6OlnD1GSZepc1wPhI84ykRDQ1IyD3B0wk=
github.com/ElrondNetwork/elrond-go-crypto v1.2.2/go.mod h1:MyQPKUKti7Axnx/eihhL0F2jLTalvSV/Ytv1mIxvYyM=
github.com/ElrondNetwork/elrond-go-crypto v1.2.4-0.20221212134904-9faa0161e5dc h1:BpKdjLY05fH/Y80s4n5vqIR73hSuZp4zFlL8+TAUWp4=
github.com/ElrondNetwork/elrond-go-crypto v1.2.4-0.20221212134904-9faa0161e5dc/go.mod h1:niLdPSYjcIzucSj2yMy+yq3KEW0jjFCfvTBOMQphmXk=
github.com/ElrondNetwork/elrond-go-crypto v1.2.4-0.20221213102512-0180dd3e00ce h1:zRLWpUnawPkbJ0b3lDkVWJwhNHwlaPN5POcXz+ToqqE=
github.com/ElrondNetwork/elrond-go-crypto v1.2.4-0.20221213102512-0180dd3e00ce/go.mod h1:niLdPSYjcIzucSj2yMy+yq3KEW0jjFCfvTBOMQphmXk=
github.com/ElrondNetwork/elrond-go-logger v1.0.10 h1:2xQOWZErcHW5sl9qSRO+7mGNw+QhFhqiUlLLtOgvuuk=
github.com/ElrondNetwork/elrond-go-logger v1.0.10/go.mod h1:+rMODFw4yQptTi5WuLUBzvl/AE26V+2YJtc52wX30Eg=
github.com/ElrondNetwork/elrond-go-p2p v1.0.5 h1:XzuieXEKrVSQ9gKKO3sq60RRZC29IRYgmn7RsPmgUOA=
Expand All @@ -63,16 +63,16 @@ github.com/ElrondNetwork/elrond-go-storage v1.0.2/go.mod h1:SRsv4hUtL1BCiQe0eADt
github.com/ElrondNetwork/elrond-go-storage v1.0.4 h1:esyXbHQvlR6m4HGeC86Nq0xAJ74+QG9EnUgfG+wQDYQ=
github.com/ElrondNetwork/elrond-go-storage v1.0.4/go.mod h1:SRsv4hUtL1BCiQe0eADth3C0EZH9baijzIJDCUitR34=
github.com/ElrondNetwork/elrond-vm-common v1.3.27/go.mod h1:3GKLv9hUFYEVxoBgtaCmaZo9HMNfKN9mM/O/xX83Rbw=
github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221207113405-6973ba06dc58 h1:ZduFPEw1cMjTDpJPLXfxOybidOzJ++FWeH/xMsgRxP4=
github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221207113405-6973ba06dc58/go.mod h1:vBVpGtyb7ZerSqX/EOtUIGBGK9VtogmjwAmjAWCnCSw=
github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221219143644-8d3505605a6d h1:pm2jV0AzYtkW4J0phwIuQwEQDVk0For8qC8rZZvFWHM=
github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221219143644-8d3505605a6d/go.mod h1:7aTygO6Kr+Bj8T7nQVFhSqLOji32E7FMHjzNhEkrL7M=
github.com/ElrondNetwork/protobuf v1.3.2 h1:qoCSYiO+8GtXBEZWEjw0WPcZfM3g7QuuJrwpN+y6Mvg=
github.com/ElrondNetwork/protobuf v1.3.2/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221213075903-473826256396 h1:f2FK3XFIySd2qhON8Q2IBB47ZCTO4AD+BYMPSKoVg6M=
github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221213075903-473826256396/go.mod h1:VF3fx+63lmKVkINjn2NkY4pb5s47ZcsiqP8U2AnnnZM=
github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221213080744-6f0dfc0d2d8e h1:R8qyNLa9HINdYiUX+MCbJ3xWWqXT3K/lQ8mTQuENz3g=
github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221213080744-6f0dfc0d2d8e/go.mod h1:HSy/wfbfbEqEyxuMNiDBqDzYnKhcKDNhte7HEzYHIbw=
github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.69-0.20221213080907-de31f5655d76 h1:8cLs/YMhQq+uKpEW/rN3W9v65yb3T4G4B/Kls9563UU=
github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.69-0.20221213080907-de31f5655d76/go.mod h1:OUoPdsZVaMbwSnsnBAKKVVzmUeXW1fSsahfgEUdq+Hc=
github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221220091555-43a76f302a3c h1:uFUfLY3kAOzdkIgd3BgZ3anAoISVn5nY0YD/n5uXCdI=
github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221220091555-43a76f302a3c/go.mod h1:uPhPRwI8mRJTVZ9ytFTOq+ZAUVrwih0g32PGGT3t7yU=
github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221220092736-8cf25a9de448 h1:Qp0N3U0dPSFbGfMl6Tfh18/bT02KZownknnEoCgXUE4=
github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221220092736-8cf25a9de448/go.mod h1:Rpq4orzireC64k1WfBh0KMB0mQ09X7wrLWJgLpq9ExA=
github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.70-0.20221220092056-49d2bc14b314 h1:FYOkSKADmVad/4lInR6p92Zd1yts8pAkWfs0YOnQTdQ=
github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.70-0.20221220092056-49d2bc14b314/go.mod h1:7ei2wjHna2Ag5fQ7LHhIBUaN0XQGJGIIfE7XewIGwfI=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
Expand Down
2 changes: 2 additions & 0 deletions node/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -377,12 +377,14 @@ func (n *Node) getPendingAndActiveGuardians(
activeGuardian = &api.Guardian{
Address: n.coreComponents.AddressPubKeyConverter().Encode(active.Address),
ActivationEpoch: active.ActivationEpoch,
ServiceUID: string(active.ServiceUID),
}
}
if pending != nil {
pendingGuardian = &api.Guardian{
Address: n.coreComponents.AddressPubKeyConverter().Encode(pending.Address),
ActivationEpoch: pending.ActivationEpoch,
ServiceUID: string(pending.ServiceUID),
}
}

Expand Down
3 changes: 3 additions & 0 deletions process/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -1185,5 +1185,8 @@ var ErrInvalidSetGuardianEpochsDelay = errors.New("incorrect setting for set gua
// ErrCannotReplaceGuardedAccountPendingGuardian signals that a pending guardian on a guarded account cannot be replaced
var ErrCannotReplaceGuardedAccountPendingGuardian = errors.New("cannot replace pending guardian on guarded account")

// ErrNilGuardianServiceUID signals that a nil guardian service identifier was provided
var ErrNilGuardianServiceUID = errors.New("nil guardian service unique identifier")

// ErrGasPriceTooHigh signals a too high gas price
var ErrGasPriceTooHigh = errors.New("gas price is too high for the transaction")
2 changes: 1 addition & 1 deletion process/guardian/disabled/disabledGuardedAccount.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ func (dga *disabledGuardedAccount) HasPendingGuardian(_ state.UserAccountHandler
}

// SetGuardian returns nil as this is a disabled implementation
func (dga *disabledGuardedAccount) SetGuardian(_ vmcommon.UserAccountHandler, _ []byte, _ []byte) error {
func (dga *disabledGuardedAccount) SetGuardian(_ vmcommon.UserAccountHandler, _ []byte, _ []byte, _ []byte) error {
return nil
}

Expand Down
11 changes: 9 additions & 2 deletions process/guardian/guardedAccount.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,19 +115,24 @@ func (agc *guardedAccount) HasPendingGuardian(uah state.UserAccountHandler) bool
}

// SetGuardian sets a guardian for an account
func (agc *guardedAccount) SetGuardian(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte) error {
func (agc *guardedAccount) SetGuardian(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte, guardianServiceUID []byte) error {
stateUserAccount, ok := uah.(state.UserAccountHandler)
if !ok {
return process.ErrWrongTypeAssertion
}

if len(guardianServiceUID) == 0 {
return process.ErrNilGuardianServiceUID
}

if len(txGuardianAddress) > 0 {
return agc.instantSetGuardian(stateUserAccount, guardianAddress, txGuardianAddress)
return agc.instantSetGuardian(stateUserAccount, guardianAddress, txGuardianAddress, guardianServiceUID)
}

guardian := &guardians.Guardian{
Address: guardianAddress,
ActivationEpoch: agc.currentEpoch + agc.guardianActivationEpochsDelay,
ServiceUID: guardianServiceUID,
}

return agc.setAccountGuardian(stateUserAccount, guardian)
Expand Down Expand Up @@ -173,6 +178,7 @@ func (agc *guardedAccount) instantSetGuardian(
uah state.UserAccountHandler,
guardianAddress []byte,
txGuardianAddress []byte,
guardianServiceUID []byte,
) error {
accountGuardians, err := agc.getConfiguredGuardians(uah)
if err != nil {
Expand All @@ -192,6 +198,7 @@ func (agc *guardedAccount) instantSetGuardian(
guardian := &guardians.Guardian{
Address: guardianAddress,
ActivationEpoch: agc.currentEpoch,
ServiceUID: guardianServiceUID,
}

accountGuardians.Slice = []*guardians.Guardian{guardian}
Expand Down
44 changes: 37 additions & 7 deletions process/guardian/guardedAccount_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -349,6 +349,7 @@ func TestGuardedAccount_instantSetGuardian(t *testing.T) {
ActivationEpoch: 20,
}
txGuardianAddress := []byte("guardian address")
guardianServiceUID := []byte("testID")

t.Run("getActiveGuardianErr with err (no active guardian) should error", func(t *testing.T) {
configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{}}
Expand All @@ -360,7 +361,7 @@ func TestGuardedAccount_instantSetGuardian(t *testing.T) {
},
}

err := ga.instantSetGuardian(ua, newGuardian.Address, txGuardianAddress)
err := ga.instantSetGuardian(ua, newGuardian.Address, txGuardianAddress, guardianServiceUID)
require.Equal(t, process.ErrAccountHasNoActiveGuardian, err)
})
t.Run("tx signed by different than active guardian should err", func(t *testing.T) {
Expand All @@ -378,17 +379,19 @@ func TestGuardedAccount_instantSetGuardian(t *testing.T) {
},
}

err := ga.instantSetGuardian(ua, newGuardian.Address, txGuardianAddress)
err := ga.instantSetGuardian(ua, newGuardian.Address, txGuardianAddress, guardianServiceUID)
require.Equal(t, process.ErrTransactionAndAccountGuardianMismatch, err)
})
t.Run("immediately set the guardian if setGuardian tx is signed by active guardian", func(t *testing.T) {
activeGuardian := &guardians.Guardian{
Address: txGuardianAddress,
ActivationEpoch: 1,
ServiceUID: guardianServiceUID,
}
newGuardian := &guardians.Guardian{
Address: []byte("new guardian address"),
ActivationEpoch: currentEpoch,
ServiceUID: []byte("testServiceID2"),
}

configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian}}
Expand All @@ -409,7 +412,7 @@ func TestGuardedAccount_instantSetGuardian(t *testing.T) {
}
}}

err := ga.instantSetGuardian(ua, newGuardian.Address, txGuardianAddress)
err := ga.instantSetGuardian(ua, newGuardian.Address, txGuardianAddress, newGuardian.ServiceUID)
require.Nil(t, err)
})
}
Expand Down Expand Up @@ -597,18 +600,22 @@ func TestGuardedAccount_getPendingGuardian(t *testing.T) {
func TestGuardedAccount_SetGuardian(t *testing.T) {
currentEpoch := uint32(10)
ga := createGuardedAccountWithEpoch(currentEpoch)
guardianServiceUID := []byte("testID")
initialServiceUID := []byte("test2ID")
g1 := &guardians.Guardian{
Address: []byte("guardian address 1"),
ActivationEpoch: currentEpoch - 2,
ServiceUID: initialServiceUID,
}
g2 := &guardians.Guardian{
Address: []byte("guardian address 2"),
ActivationEpoch: currentEpoch - 1,
ServiceUID: initialServiceUID,
}
newGuardianAddress := []byte("new guardian address")

t.Run("invalid user account handler should err", func(t *testing.T) {
err := ga.SetGuardian(nil, newGuardianAddress, g1.Address)
err := ga.SetGuardian(nil, newGuardianAddress, g1.Address, guardianServiceUID)
require.Equal(t, process.ErrWrongTypeAssertion, err)
})
t.Run("transaction signed by current active guardian but instantSetGuardian returns error", func(t *testing.T) {
Expand All @@ -619,14 +626,15 @@ func TestGuardedAccount_SetGuardian(t *testing.T) {
return val, 0, err
},
}
err := ga.SetGuardian(uah, newGuardianAddress, g2.Address)
err := ga.SetGuardian(uah, newGuardianAddress, g2.Address, guardianServiceUID)
require.Equal(t, process.ErrTransactionAndAccountGuardianMismatch, err)
})
t.Run("instantly set guardian if tx signed by current active guardian", func(t *testing.T) {
configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g1}}
newGuardian := &guardians.Guardian{
Address: newGuardianAddress,
ActivationEpoch: currentEpoch,
ServiceUID: guardianServiceUID,
}
expectedNewGuardians, _ := ga.marshaller.Marshal(&guardians.Guardians{Slice: []*guardians.Guardian{newGuardian}})

Expand All @@ -645,14 +653,36 @@ func TestGuardedAccount_SetGuardian(t *testing.T) {
}
},
}
err := ga.SetGuardian(uah, newGuardianAddress, g1.Address)
err := ga.SetGuardian(uah, newGuardianAddress, g1.Address, guardianServiceUID)
require.Nil(t, err)
})
t.Run("nil guardian serviceUID should err", func(t *testing.T) {
configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g1}}
saveKeyValueCalled := false
uah := &stateMocks.UserAccountStub{
RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) {
val, err := ga.marshaller.Marshal(configuredGuardians)
return val, 0, err
},
AccountDataHandlerCalled: func() vmcommon.AccountDataHandler {
return &trie.DataTrieTrackerStub{
SaveKeyValueCalled: func(_ []byte, _ []byte) error {
saveKeyValueCalled = true
return nil
},
}
},
}
err := ga.SetGuardian(uah, newGuardianAddress, g1.Address, nil)
require.False(t, saveKeyValueCalled)
require.Equal(t, process.ErrNilGuardianServiceUID, err)
})
t.Run("tx not signed by active guardian sets guardian with delay", func(t *testing.T) {
configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g1}}
newGuardian := &guardians.Guardian{
Address: newGuardianAddress,
ActivationEpoch: currentEpoch + ga.guardianActivationEpochsDelay,
ServiceUID: guardianServiceUID,
}
expectedNewGuardians, _ := ga.marshaller.Marshal(&guardians.Guardians{Slice: []*guardians.Guardian{g1, newGuardian}})

Expand All @@ -671,7 +701,7 @@ func TestGuardedAccount_SetGuardian(t *testing.T) {
}
},
}
err := ga.SetGuardian(uah, newGuardianAddress, nil)
err := ga.SetGuardian(uah, newGuardianAddress, nil, guardianServiceUID)
require.Nil(t, err)
})
}
Expand Down
2 changes: 1 addition & 1 deletion process/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -1258,7 +1258,7 @@ type GuardedAccountHandler interface {
GetActiveGuardian(handler vmcommon.UserAccountHandler) ([]byte, error)
HasActiveGuardian(uah state.UserAccountHandler) bool
HasPendingGuardian(uah state.UserAccountHandler) bool
SetGuardian(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte) error
SetGuardian(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte, guardianServiceUID []byte) error
CleanOtherThanActive(uah vmcommon.UserAccountHandler)
GetConfiguredGuardians(uah state.UserAccountHandler) (active *guardians.Guardian, pending *guardians.Guardian, err error)
IsInterfaceNil() bool
Expand Down
6 changes: 3 additions & 3 deletions testscommon/guardianMocks/guardianAccountHandlerStub.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
// GuardedAccountHandlerStub -
type GuardedAccountHandlerStub struct {
GetActiveGuardianCalled func(handler vmcommon.UserAccountHandler) ([]byte, error)
SetGuardianCalled func(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte) error
SetGuardianCalled func(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte, guardianServiceUID []byte) error
HasPendingGuardianCalled func(uah state.UserAccountHandler) bool
HasActiveGuardianCalled func(uah state.UserAccountHandler) bool
CleanOtherThanActiveCalled func(uah vmcommon.UserAccountHandler)
Expand Down Expand Up @@ -41,9 +41,9 @@ func (gahs *GuardedAccountHandlerStub) HasPendingGuardian(uah state.UserAccountH
}

// SetGuardian -
func (gahs *GuardedAccountHandlerStub) SetGuardian(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte) error {
func (gahs *GuardedAccountHandlerStub) SetGuardian(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte, guardianServiceUID []byte) error {
if gahs.SetGuardianCalled != nil {
return gahs.SetGuardianCalled(uah, guardianAddress, txGuardianAddress)
return gahs.SetGuardianCalled(uah, guardianAddress, txGuardianAddress, guardianServiceUID)
}
return nil
}
Expand Down