Fixes for the morph client and neofs-adm #239
8 changed files with 36 additions and 28 deletions
|
@ -55,6 +55,8 @@ Changelog for FrostFS Node
|
||||||
- Iterating over just removed files by FSTree (#98)
|
- Iterating over just removed files by FSTree (#98)
|
||||||
- Parts of a locked object could not be removed anymore (#141)
|
- Parts of a locked object could not be removed anymore (#141)
|
||||||
- Non-alphabet nodes do not try to handle alphabet events (#181)
|
- Non-alphabet nodes do not try to handle alphabet events (#181)
|
||||||
|
- Failing SN and IR transactions because of incorrect scopes (#2230, #2263)
|
||||||
|
- Global scope used for some transactions (#2230, #2263)
|
||||||
|
|
||||||
### Removed
|
### Removed
|
||||||
### Updated
|
### Updated
|
||||||
|
|
|
@ -15,6 +15,7 @@ import (
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/rpcclient"
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/rpcclient/invoker"
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient/invoker"
|
||||||
|
nnsClient "github.com/nspcc-dev/neo-go/pkg/rpcclient/nns"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/rpcclient/unwrap"
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient/unwrap"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract/callflag"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract/callflag"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
|
@ -284,10 +285,11 @@ func parseNNSResolveResult(res stackitem.Item) (util.Uint160, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func nnsIsAvailable(c Client, nnsHash util.Uint160, name string) (bool, error) {
|
func nnsIsAvailable(c Client, nnsHash util.Uint160, name string) (bool, error) {
|
||||||
switch ct := c.(type) {
|
switch c.(type) {
|
||||||
case *rpcclient.Client:
|
case *rpcclient.Client:
|
||||||
//lint:ignore SA1019 https://git.frostfs.info/TrueCloudLab/frostfs-node/issues/202
|
inv := invoker.New(c, nil)
|
||||||
return ct.NNSIsAvailable(nnsHash, name)
|
reader := nnsClient.NewReader(inv, nnsHash)
|
||||||
|
return reader.IsAvailable(name)
|
||||||
default:
|
default:
|
||||||
b, err := unwrap.Bool(invokeFunction(c, nnsHash, "isAvailable", []any{name}, nil))
|
b, err := unwrap.Bool(invokeFunction(c, nnsHash, "isAvailable", []any{name}, nil))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -9,6 +9,7 @@ import (
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
|
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/rpcclient"
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient/invoker"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/rpcclient/neo"
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient/neo"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/rpcclient/unwrap"
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient/unwrap"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract/callflag"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract/callflag"
|
||||||
|
@ -116,10 +117,11 @@ func (c *initializeContext) transferNEOFinished(neoHash util.Uint160) (bool, err
|
||||||
var errGetPriceInvalid = errors.New("`getRegisterPrice`: invalid response")
|
var errGetPriceInvalid = errors.New("`getRegisterPrice`: invalid response")
|
||||||
|
|
||||||
func (c *initializeContext) getCandidateRegisterPrice() (int64, error) {
|
func (c *initializeContext) getCandidateRegisterPrice() (int64, error) {
|
||||||
switch ct := c.Client.(type) {
|
switch c.Client.(type) {
|
||||||
case *rpcclient.Client:
|
case *rpcclient.Client:
|
||||||
//lint:ignore SA1019 https://git.frostfs.info/TrueCloudLab/frostfs-node/issues/202
|
inv := invoker.New(c.Client, nil)
|
||||||
return ct.GetCandidateRegisterPrice()
|
reader := neo.NewReader(inv)
|
||||||
|
return reader.GetRegisterPrice()
|
||||||
default:
|
default:
|
||||||
neoHash := neo.Hash
|
neoHash := neo.Hash
|
||||||
res, err := invokeFunction(c.Client, neoHash, "getRegisterPrice", nil, nil)
|
res, err := invokeFunction(c.Client, neoHash, "getRegisterPrice", nil, nil)
|
||||||
|
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strconv"
|
"strconv"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/innerring"
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/innerring"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config"
|
"github.com/nspcc-dev/neo-go/pkg/config"
|
||||||
|
@ -101,11 +102,10 @@ func generateTestData(t *testing.T, dir string, size int) {
|
||||||
cfg := config.Config{}
|
cfg := config.Config{}
|
||||||
cfg.ProtocolConfiguration.Magic = 12345
|
cfg.ProtocolConfiguration.Magic = 12345
|
||||||
cfg.ProtocolConfiguration.ValidatorsCount = size
|
cfg.ProtocolConfiguration.ValidatorsCount = size
|
||||||
cfg.ProtocolConfiguration.SecondsPerBlock = 1 //lint:ignore SA1019 https://git.frostfs.info/TrueCloudLab/frostfs-node/issues/202
|
cfg.ProtocolConfiguration.TimePerBlock = time.Second
|
||||||
cfg.ProtocolConfiguration.StandbyCommittee = pubs // sorted by glagolic letters
|
cfg.ProtocolConfiguration.StandbyCommittee = pubs // sorted by glagolic letters
|
||||||
cfg.ProtocolConfiguration.P2PSigExtensions = true
|
cfg.ProtocolConfiguration.P2PSigExtensions = true
|
||||||
cfg.ProtocolConfiguration.VerifyTransactions = true
|
cfg.ProtocolConfiguration.VerifyTransactions = true
|
||||||
cfg.ProtocolConfiguration.VerifyBlocks = true //lint:ignore SA1019 https://git.frostfs.info/TrueCloudLab/frostfs-node/issues/202
|
|
||||||
data, err := yaml.Marshal(cfg)
|
data, err := yaml.Marshal(cfg)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
|
|
@ -57,8 +57,6 @@ type Client struct {
|
||||||
acc *wallet.Account // neo account
|
acc *wallet.Account // neo account
|
||||||
accAddr util.Uint160 // account's address
|
accAddr util.Uint160 // account's address
|
||||||
|
|
||||||
signer *transaction.Signer
|
|
||||||
|
|
||||||
notary *notaryInfo
|
notary *notaryInfo
|
||||||
|
|
||||||
cfg cfg
|
cfg cfg
|
||||||
|
|
|
@ -105,7 +105,6 @@ func New(ctx context.Context, key *keys.PrivateKey, opts ...Option) (*Client, er
|
||||||
logger: cfg.logger,
|
logger: cfg.logger,
|
||||||
acc: acc,
|
acc: acc,
|
||||||
accAddr: accAddr,
|
accAddr: accAddr,
|
||||||
signer: cfg.signer,
|
|
||||||
cfg: *cfg,
|
cfg: *cfg,
|
||||||
switchLock: &sync.RWMutex{},
|
switchLock: &sync.RWMutex{},
|
||||||
notifications: make(chan rpcclient.Notification),
|
notifications: make(chan rpcclient.Notification),
|
||||||
|
|
|
@ -208,8 +208,18 @@ func (c *Client) SetGroupSignerScope() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
c.signer.Scopes = transaction.CustomGroups
|
// Don't change c before everything is OK.
|
||||||
c.signer.AllowedGroups = []*keys.PublicKey{pub}
|
cfg := c.cfg
|
||||||
|
cfg.signer = &transaction.Signer{
|
||||||
|
Scopes: transaction.CustomGroups | transaction.CalledByEntry,
|
||||||
|
|||||||
|
AllowedGroups: []*keys.PublicKey{pub},
|
||||||
|
}
|
||||||
|
rpcActor, err := newActor(c.client, c.acc, cfg)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
c.cfg = cfg
|
||||||
|
c.setActor(rpcActor)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -412,16 +412,11 @@ func (c *Client) NotarySignAndInvokeTX(mainTx *transaction.Transaction) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// error appears only if client
|
|
||||||
// is in inactive mode; that has
|
|
||||||
// been already checked above
|
|
||||||
magicNumber, _ := c.MagicNumber()
|
|
||||||
|
|
||||||
// mainTX is expected to be pre-validated: second witness must exist and be empty
|
// mainTX is expected to be pre-validated: second witness must exist and be empty
|
||||||
mainTx.Scripts[1].VerificationScript = multiaddrAccount.GetVerificationScript()
|
mainTx.Scripts[1].VerificationScript = multiaddrAccount.GetVerificationScript()
|
||||||
mainTx.Scripts[1].InvocationScript = append(
|
mainTx.Scripts[1].InvocationScript = append(
|
||||||
[]byte{byte(opcode.PUSHDATA1), 64},
|
[]byte{byte(opcode.PUSHDATA1), 64},
|
||||||
multiaddrAccount.PrivateKey().SignHashable(uint32(magicNumber), mainTx)...,
|
multiaddrAccount.SignHashable(c.rpcActor.GetNetwork(), mainTx)...,
|
||||||
)
|
)
|
||||||
|
|
||||||
//lint:ignore SA1019 https://git.frostfs.info/TrueCloudLab/frostfs-node/issues/202
|
//lint:ignore SA1019 https://git.frostfs.info/TrueCloudLab/frostfs-node/issues/202
|
||||||
|
@ -596,18 +591,18 @@ func (c *Client) notaryCosigners(invokedByAlpha bool, ir []*keys.PublicKey, comm
|
||||||
|
|
||||||
s = append(s, transaction.Signer{
|
s = append(s, transaction.Signer{
|
||||||
Account: hash.Hash160(multisigScript),
|
Account: hash.Hash160(multisigScript),
|
||||||
Scopes: c.signer.Scopes,
|
Scopes: c.cfg.signer.Scopes,
|
||||||
AllowedContracts: c.signer.AllowedContracts,
|
AllowedContracts: c.cfg.signer.AllowedContracts,
|
||||||
AllowedGroups: c.signer.AllowedGroups,
|
AllowedGroups: c.cfg.signer.AllowedGroups,
|
||||||
})
|
})
|
||||||
|
|
||||||
if !invokedByAlpha {
|
if !invokedByAlpha {
|
||||||
// then we have invoker signature
|
// then we have invoker signature
|
||||||
s = append(s, transaction.Signer{
|
s = append(s, transaction.Signer{
|
||||||
Account: hash.Hash160(c.acc.GetVerificationScript()),
|
Account: hash.Hash160(c.acc.GetVerificationScript()),
|
||||||
Scopes: c.signer.Scopes,
|
Scopes: c.cfg.signer.Scopes,
|
||||||
AllowedContracts: c.signer.AllowedContracts,
|
AllowedContracts: c.cfg.signer.AllowedContracts,
|
||||||
AllowedGroups: c.signer.AllowedGroups,
|
AllowedGroups: c.cfg.signer.AllowedGroups,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -667,12 +662,12 @@ func (c *Client) notaryWitnesses(invokedByAlpha bool, multiaddr *wallet.Account,
|
||||||
// to pass Notary module verification
|
// to pass Notary module verification
|
||||||
var invokeScript []byte
|
var invokeScript []byte
|
||||||
|
|
||||||
magicNumber, _ := c.MagicNumber()
|
magicNumber := c.rpcActor.GetNetwork()
|
||||||
|
|
||||||
if invokedByAlpha {
|
if invokedByAlpha {
|
||||||
invokeScript = append(
|
invokeScript = append(
|
||||||
[]byte{byte(opcode.PUSHDATA1), 64},
|
[]byte{byte(opcode.PUSHDATA1), 64},
|
||||||
multiaddr.PrivateKey().SignHashable(uint32(magicNumber), tx)...,
|
multiaddr.SignHashable(magicNumber, tx)...,
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
// we can't provide alphabet node signature
|
// we can't provide alphabet node signature
|
||||||
|
@ -694,7 +689,7 @@ func (c *Client) notaryWitnesses(invokedByAlpha bool, multiaddr *wallet.Account,
|
||||||
// then we have invoker witness
|
// then we have invoker witness
|
||||||
invokeScript = append(
|
invokeScript = append(
|
||||||
[]byte{byte(opcode.PUSHDATA1), 64},
|
[]byte{byte(opcode.PUSHDATA1), 64},
|
||||||
c.acc.PrivateKey().SignHashable(uint32(magicNumber), tx)...,
|
c.acc.SignHashable(magicNumber, tx)...,
|
||||||
)
|
)
|
||||||
|
|
||||||
w = append(w, transaction.Witness{
|
w = append(w, transaction.Witness{
|
||||||
|
|
Loading…
Add table
Reference in a new issue
Scopes changed. Is it ok?
Yes, it is similar to fix in another commit.