Skip to main content


Containers manage the permissions/access of a group of objects that are being stored. Before being able to store an object, you need to create a container.


    ""    ""

Creating a container#

Before being able to create a container, you will need to

  • create a policy (placementPolicy)
  • have access to a private key. This is retrieved from a json file using the helper function helper.GetCredentialsFromPath (key)
  • Decide on a set of permissions, (permissions)
  • Have created a NeoFS client (cli)

Owner ID#

Before continuing, you will need to get the owner ID from the wallet private key. The owner ID is not the same as the wallet ID or public key. A straight forward way to do this is

//see key retrieval generation for how to get a keyw, err := owner.NEO3WalletFromPublicKey(&key.PublicKey)if err != nil {    return fmt.Errorf("invalid private key")}ownerID := owner.NewIDFromPublicKey(key.PublicKey)

Creating a container#

Now we can get on with creating a container.

You will need

  • A container placement policy (placementPolicy)
  • A set of Basic ACL permissions (permissions)
containerPolicy, err := policy.Parse(placementPolicy)if err != nil {  return fmt.Errorf("can't parse placement policy: %w", err)}
cnr := container.New(  // container policy defines the way objects will be  // placed among storage nodes from the network map  container.WithPolicy(containerPolicy),  // container owner can set BasicACL and remove container  container.WithOwnerID(ownerID),  // read more about basic ACL in specification:  //  container.WithCustomBasicACL(permissions),)//if you want to set attributescnr.SetAttributes(attributes)

Finally we can put the container on NeoFS. We will receive a response that contains the container's ID.

var prmContainerPut client.PrmContainerPutprmContainerPut.SetContainer(*cnr)
cnrResponse, err := cli.ContainerPut(ctx, prmContainerPut)if err != nil {    return err}containerID := cnrResponse.ID()

Listing Containers#

You can list all the containers owned by a wallet. This will return an array of container IDs

ownerID, err := wallet.OwnerIDFromPrivateKey(key)l := client.PrmContainerList{}l.SetAccount(*ownerID)response, err := cli.ContainerList(ctx, l)if err != nil {    return nil, fmt.Errorf("can't list container: %w", err)}containerList := response.Containers()    

Retrieve a Container#

You can retrieve a container once you have the ID

get := client.PrmContainerGet{}get.SetContainer(containerID)response, err := cli.ContainerGet(ctx, get)if err != nil {    return nil, fmt.Errorf("can't get container %s: %w", containerID, err)}contianeer := response.Container()

From a container, you can find out storage policies, owners and any other meta information about the container itself

Deleting Containers#

Once you have created a container, you will receive the ID of the container as part of the response (see above). Using this ID you can now delete the container with ease

containerDelete := client.PrmContainerDelete{}containerDelete.SetContainer(containerID)if sessionToken == nil {    return &client.ResContainerDelete{}, errors.New("deleting requires a session token")}containerDelete.SetSessionToken(*sessionToken)cli.ContainerDelete(ctx, containerDelete)response, err := cli.ContainerDelete(ctx, containerDelete)if err != nil {    return nil, fmt.Errorf("can't get container %s: %w", containerID, err)}fmt.Printf("deletion response %+v\r\n", response)

Questions about containers#

  • if you delete a container what happens to all the objects within a container
  • using multisig wallets, could two or more people share ownership of a container - no.
  • status - what information do I receive from a status - error on failure.