frostfs-node/pkg/innerring/processors/alphabet/process_emit.go
Leonard Lyubich 72935d0a80 [#392] ir: Upgrade to a dynamic number of alphabetical contracts
In previous implementation IR worked with exactly 7 alphabetic contracts
only. Actually number of contracts is limited to only the Glagolitic
alphabet.

Make IR to work with any valid number of alphabetic contracts. Change parser
of alphabetic contract addresses to read amount of processing contracts
before performance. Make Alphabet processor to use interface of the
alphabetic contract group. Use `alphabetContracts` type in IR `Server`.

Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
2021-02-24 19:16:52 +03:00

78 lines
1.7 KiB
Go

package alphabet
import (
"crypto/elliptic"
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
"github.com/nspcc-dev/neo-go/pkg/encoding/fixedn"
"github.com/nspcc-dev/neofs-node/pkg/innerring/invoke"
"go.uber.org/zap"
)
func (np *Processor) processEmit() {
index := np.irList.Index()
if index < 0 {
np.log.Info("passive mode, ignore gas emission event")
return
}
contract, ok := np.alphabetContracts.GetByIndex(index)
if !ok {
np.log.Debug("node is out of alphabet range, ignore gas emission event",
zap.Int("index", index))
return
}
err := invoke.AlphabetEmit(np.morphClient, contract)
if err != nil {
np.log.Warn("can't invoke alphabet emit method")
return
}
if np.storageEmission == 0 {
np.log.Info("storage node emission is off")
return
}
networkMap, err := invoke.NetmapSnapshot(np.morphClient, np.netmapContract)
if err != nil {
np.log.Warn("can't get netmap snapshot to emit gas to storage nodes",
zap.String("error", err.Error()))
return
}
ln := len(networkMap.Nodes)
if ln == 0 {
np.log.Debug("empty network map, do not emit gas")
return
}
gasPerNode := fixedn.Fixed8(np.storageEmission / uint64(ln))
for i := range networkMap.Nodes {
keyBytes := networkMap.Nodes[i].PublicKey()
key, err := keys.NewPublicKeyFromBytes(keyBytes, elliptic.P256())
if err != nil {
np.log.Warn("can't convert node public key to address",
zap.String("error", err.Error()))
continue
}
err = np.morphClient.TransferGas(key.GetScriptHash(), gasPerNode)
if err != nil {
np.log.Warn("can't transfer gas",
zap.String("receiver", key.Address()),
zap.Int64("amount", int64(gasPerNode)),
zap.String("error", err.Error()),
)
}
}
}