[#421] morph/client: Add role getter from designate contract

RoleManagement native contract (ex designate contract) stores list
of keys per role. Main net uses NeoFSAlphabet role to store keys of
alphabet nodes of inner ring. Side chain uses the same role to store
keys of all inner ring nodes, including alphabet.

Signed-off-by: Alex Vanin <alexey@nspcc.ru>
This commit is contained in:
Alex Vanin 2021-03-23 13:02:24 +03:00 committed by Alex Vanin
parent f42c5e64fc
commit 2f6adb0465
2 changed files with 28 additions and 0 deletions

View file

@ -37,6 +37,8 @@ type Client struct {
neo util.Uint160 // native neo script-hash neo util.Uint160 // native neo script-hash
designate util.Uint160 // native designate script-hash
waitInterval time.Duration waitInterval time.Duration
notary *notary notary *notary
@ -51,6 +53,7 @@ const HaltState = "HALT"
const ( const (
committeeList = "getCommittee" committeeList = "getCommittee"
designateList = "getDesignatedByRole"
) )
var errEmptyInvocationScript = errors.New("got empty invocation script from neo node") var errEmptyInvocationScript = errors.New("got empty invocation script from neo node")
@ -214,6 +217,25 @@ func (c *Client) Committee() (keys.PublicKeys, error) {
return roleKeys, nil return roleKeys, nil
} }
func (c *Client) roleList(r native.Role) (keys.PublicKeys, error) {
height, err := c.client.GetBlockCount()
if err != nil {
return nil, errors.Wrap(err, "can't get chain height")
}
items, err := c.TestInvoke(c.designate, designateList, r, int64(height))
if err != nil {
return nil, err
}
roleKeys, err := keysFromStack(items)
if err != nil {
return nil, errors.Wrap(err, "can't get role keys")
}
return roleKeys, nil
}
func toStackParameter(value interface{}) (sc.Parameter, error) { func toStackParameter(value interface{}) (sc.Parameter, error) {
var result = sc.Parameter{ var result = sc.Parameter{
Value: value, Value: value,

View file

@ -105,12 +105,18 @@ func New(key *ecdsa.PrivateKey, endpoint string, opts ...Option) (*Client, error
return nil, err return nil, err
} }
designate, err := cli.GetNativeContractHash(nativenames.Designation)
if err != nil {
return nil, err
}
return &Client{ return &Client{
logger: cfg.logger, logger: cfg.logger,
client: cli, client: cli,
acc: account, acc: account,
gas: gas, gas: gas,
neo: neo, neo: neo,
designate: designate,
waitInterval: cfg.waitInterval, waitInterval: cfg.waitInterval,
}, nil }, nil
} }