forked from TrueCloudLab/frostfs-node
72935d0a80
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>
78 lines
1.7 KiB
Go
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()),
|
|
)
|
|
}
|
|
}
|
|
}
|