[#1253] ir: Call UpdateStateIR method to remove dead storage node

Alphabet nodes in notary enabled environment cannot call `UpdateState`
method to remove unwanted storage nodes from the network map,
because this method checks witness of the storage node.

To force storage node state update, alphabet nodes should invoke
new method `UpdateStateIR` which is similar to `AddPeerIR`.

State update initiated by the storage node itself is processed
the same way as before -- alphabet nods resign such transaction.

Signed-off-by: Alex Vanin <alexey@nspcc.ru>
This commit is contained in:
Alex Vanin 2022-03-22 11:52:55 +03:00 committed by Alex Vanin
parent e81081e0e0
commit 7e06d0aa69

View file

@ -25,6 +25,12 @@ func (np *Processor) processNetmapCleanupTick(ev netmapCleanupTick) {
np.log.Info("vote to remove node from netmap", zap.String("key", s)) np.log.Info("vote to remove node from netmap", zap.String("key", s))
// In notary environments we call UpdateStateIR method instead of UpdateState.
// It differs from UpdateState only by name, so we can do this in the same form.
// See https://github.com/nspcc-dev/neofs-contract/issues/225
const methodUpdateStateNotary = "updateStateIR"
if np.notaryDisabled {
prm := netmapclient.UpdatePeerPrm{} prm := netmapclient.UpdatePeerPrm{}
prm.SetKey(key.Bytes()) prm.SetKey(key.Bytes())
@ -32,6 +38,16 @@ func (np *Processor) processNetmapCleanupTick(ev netmapCleanupTick) {
prm.SetHash(ev.TxHash()) prm.SetHash(ev.TxHash())
err = np.netmapClient.UpdatePeerState(prm) err = np.netmapClient.UpdatePeerState(prm)
} else {
err = np.netmapClient.Morph().NotaryInvoke(
np.netmapClient.ContractAddress(),
0,
uint32(ev.epoch),
nil,
methodUpdateStateNotary,
int64(netmap.NodeStateOffline.ToV2()), key.Bytes(),
)
}
if err != nil { if err != nil {
np.log.Error("can't invoke netmap.UpdateState", zap.Error(err)) np.log.Error("can't invoke netmap.UpdateState", zap.Error(err))
} }