[#101] *: update storage after voting

Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
This commit is contained in:
Evgenii Stratonikov 2021-11-30 11:59:52 +03:00 committed by Alex Vanin
parent 4248424a44
commit bf83ed9a4f
2 changed files with 47 additions and 49 deletions

View file

@ -95,6 +95,12 @@ func AddKey(owner []byte, keys []interop.PublicKey) {
panic("incorrect owner") panic("incorrect owner")
} }
for i := range keys {
if len(keys[i]) != interop.PublicKeyCompressedLen {
panic("incorrect public key")
}
}
ctx := storage.GetContext() ctx := storage.GetContext()
notaryDisabled := storage.Get(ctx, notaryDisabledKey).(bool) notaryDisabled := storage.Get(ctx, notaryDisabledKey).(bool)
@ -114,37 +120,30 @@ func AddKey(owner []byte, keys []interop.PublicKey) {
indirectCall = common.FromKnownContract( indirectCall = common.FromKnownContract(
ctx, ctx,
runtime.GetCallingScriptHash(), runtime.GetCallingScriptHash(),
containerContractKey, containerContractKey)
)
if indirectCall {
threshold := len(alphabet)*2/3 + 1
id := invokeIDKeys(owner, keys, []byte("add"))
n := common.Vote(ctx, id, nodeKey)
if n < threshold {
return
}
common.RemoveVotes(ctx, id)
}
} else { } else {
multiaddr := common.AlphabetAddress() multiaddr := common.AlphabetAddress()
common.CheckAlphabetWitness(multiaddr) common.CheckAlphabetWitness(multiaddr)
} }
for i := range keys {
if len(keys[i]) != interop.PublicKeyCompressedLen {
panic("incorrect public key")
}
}
ownerKey := append([]byte{ownerKeysPrefix}, owner...) ownerKey := append([]byte{ownerKeysPrefix}, owner...)
for i := range keys { for i := range keys {
stKey := append(ownerKey, keys[i]...) stKey := append(ownerKey, keys[i]...)
storage.Put(ctx, stKey, []byte{1}) storage.Put(ctx, stKey, []byte{1})
} }
if notaryDisabled && !indirectCall {
threshold := len(alphabet)*2/3 + 1
id := invokeIDKeys(owner, keys, []byte("add"))
n := common.Vote(ctx, id, nodeKey)
if n < threshold {
return
}
common.RemoveVotes(ctx, id)
}
runtime.Log("key bound to the owner") runtime.Log("key bound to the owner")
} }
@ -159,6 +158,12 @@ func RemoveKey(owner []byte, keys []interop.PublicKey) {
panic("incorrect owner") panic("incorrect owner")
} }
for i := range keys {
if len(keys[i]) != interop.PublicKeyCompressedLen {
panic("incorrect public key")
}
}
ctx := storage.GetContext() ctx := storage.GetContext()
notaryDisabled := storage.Get(ctx, notaryDisabledKey).(bool) notaryDisabled := storage.Get(ctx, notaryDisabledKey).(bool)
@ -173,24 +178,7 @@ func RemoveKey(owner []byte, keys []interop.PublicKey) {
if len(nodeKey) == 0 { if len(nodeKey) == 0 {
panic("invocation from non inner ring node") panic("invocation from non inner ring node")
} }
} else {
multiaddr := common.AlphabetAddress()
common.CheckAlphabetWitness(multiaddr)
}
for i := range keys {
if len(keys[i]) != interop.PublicKeyCompressedLen {
panic("incorrect public key")
}
}
ownerKey := append([]byte{ownerKeysPrefix}, owner...)
for i := range keys {
stKey := append(ownerKey, keys[i]...)
storage.Delete(ctx, stKey)
}
if notaryDisabled {
threshold := len(alphabet)*2/3 + 1 threshold := len(alphabet)*2/3 + 1
id := invokeIDKeys(owner, keys, []byte("remove")) id := invokeIDKeys(owner, keys, []byte("remove"))
@ -200,6 +188,17 @@ func RemoveKey(owner []byte, keys []interop.PublicKey) {
} }
common.RemoveVotes(ctx, id) common.RemoveVotes(ctx, id)
} else {
multiaddr := common.AlphabetAddress()
if !runtime.CheckWitness(multiaddr) {
panic("invocation from non inner ring node")
}
}
ownerKey := append([]byte{ownerKeysPrefix}, owner...)
for i := range keys {
stKey := append(ownerKey, keys[i]...)
storage.Delete(ctx, stKey)
} }
} }

View file

@ -100,8 +100,18 @@ func Put(epoch int, peerID []byte, value []byte) {
} }
id := storageID(epoch, peerID) id := storageID(epoch, peerID)
key := getReputationKey(reputationCountPrefix, id) if notaryDisabled {
threshold := len(alphabet)*2/3 + 1
n := common.Vote(ctx, id, nodeKey)
if n < threshold {
return
}
common.RemoveVotes(ctx, id)
}
key := getReputationKey(reputationCountPrefix, id)
rawCnt := storage.Get(ctx, key) rawCnt := storage.Get(ctx, key)
cnt := 0 cnt := 0
if rawCnt != nil { if rawCnt != nil {
@ -113,17 +123,6 @@ func Put(epoch int, peerID []byte, value []byte) {
key[0] = reputationValuePrefix key[0] = reputationValuePrefix
key = append(key, convert.ToBytes(cnt)...) key = append(key, convert.ToBytes(cnt)...)
storage.Put(ctx, key, value) storage.Put(ctx, key, value)
if notaryDisabled {
threshold := len(alphabet)*2/3 + 1
n := common.Vote(ctx, id, nodeKey)
if n < threshold {
return
}
common.RemoveVotes(ctx, id)
}
} }
// Get method returns list of all stable marshaled DataAuditResult structures // Get method returns list of all stable marshaled DataAuditResult structures