From 7e06d0aa69e362dcff938443f235e4f62cf5a561 Mon Sep 17 00:00:00 2001 From: Alex Vanin Date: Tue, 22 Mar 2022 11:52:55 +0300 Subject: [PATCH] [#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 --- .../processors/netmap/process_cleanup.go | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/pkg/innerring/processors/netmap/process_cleanup.go b/pkg/innerring/processors/netmap/process_cleanup.go index 9ddd4b1ce..fa29f0f6d 100644 --- a/pkg/innerring/processors/netmap/process_cleanup.go +++ b/pkg/innerring/processors/netmap/process_cleanup.go @@ -25,13 +25,29 @@ func (np *Processor) processNetmapCleanupTick(ev netmapCleanupTick) { np.log.Info("vote to remove node from netmap", zap.String("key", s)) - prm := netmapclient.UpdatePeerPrm{} + // 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" - prm.SetKey(key.Bytes()) - prm.SetState(netmap.NodeStateOffline) - prm.SetHash(ev.TxHash()) + if np.notaryDisabled { + prm := netmapclient.UpdatePeerPrm{} - err = np.netmapClient.UpdatePeerState(prm) + prm.SetKey(key.Bytes()) + prm.SetState(netmap.NodeStateOffline) + prm.SetHash(ev.TxHash()) + + 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 { np.log.Error("can't invoke netmap.UpdateState", zap.Error(err)) }