package container import ( "fmt" containerContract "git.frostfs.info/TrueCloudLab/frostfs-contract/rpcclient/container" frostfsutil "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/internal/frostfs/util" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container" cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id" "github.com/nspcc-dev/neo-go/pkg/crypto/keys" "github.com/nspcc-dev/neo-go/pkg/rpcclient" "github.com/nspcc-dev/neo-go/pkg/rpcclient/actor" "github.com/nspcc-dev/neo-go/pkg/wallet" ) type Client struct { contract *containerContract.Contract } type Config struct { RPCAddress string Contract string Key *keys.PrivateKey RPCClient *rpcclient.Client } func New(cfg Config) (*Client, error) { contractHash, err := frostfsutil.ResolveContractHash(cfg.Contract, cfg.RPCAddress) if err != nil { return nil, fmt.Errorf("resolve frostfs contract hash: %w", err) } key := cfg.Key if key == nil { if key, err = keys.NewPrivateKey(); err != nil { return nil, fmt.Errorf("generate anon private key for container contract: %w", err) } } acc := wallet.NewAccountFromPrivateKey(key) act, err := actor.NewSimple(cfg.RPCClient, acc) if err != nil { return nil, fmt.Errorf("create new actor: %w", err) } return &Client{ contract: containerContract.New(act, contractHash), }, nil } func (c *Client) GetContainerByID(cnrID cid.ID) (*container.Container, error) { items, err := c.contract.Get(cnrID[:]) if err != nil { return nil, fmt.Errorf("get container by cid: %w", err) } if len(items) != 4 { return nil, fmt.Errorf("unexpected container stack item count: %d", len(items)) } cnrBytes, err := items[0].TryBytes() if err != nil { return nil, fmt.Errorf("could not get byte array of container: %w", err) } var cnr container.Container if err = cnr.Unmarshal(cnrBytes); err != nil { return nil, fmt.Errorf("can't unmarshal container: %w", err) } return &cnr, nil }