Métodos Go para el bloqueo de NFT ERC-1155

Blockchain App Builder genera automáticamente métodos que puede utilizar para bloquear tokens no fungibles que utilizan el estándar ERC-1155 extendido.

Un token bloqueado no se puede grabar ni transferir a otros usuarios. Todas las demás propiedades, como el estado, el propietario y el historial del token, se conservan. Puede utilizar la funcionalidad de bloqueo de NFT al transferir un token a otra red de blockchain, como Ethereum o Polygon.

Antes de poder bloquear NFT, debe asignar el rol de gestor de almacén a un usuario. El gestor de almacenes es un tipo especial de rol, un rol TokenSys. Los roles TokenSys son diferentes de los roles basados en activos, como quemador, minero y notario, y de los roles administrativos, como Token Admin y Org Admin. Actualmente, Blockchain App Builder admite el rol vault TokenSys. El único usuario que tiene el rol vault para un código de cadena es el gestor de almacenes del código de cadena y puede gestionar las NFT bloqueadas.

El flujo típico para utilizar la funcionalidad de bloqueo de NFT sigue estos pasos.
  • Cree un token no fungible que tenga el comportamiento de bloqueo.
  • Utilice el método AddTokenSysRole para asignar el rol vault a un usuario, el gestor de almacenes.
  • Llame al método LockNFT para bloquear un token no fungible, especificado por el ID de token.

TokenSys Métodos de Gestión de Roles

AddTokenSysRole
Este método agrega un rol TokenSys a un usuario especificado. Este método solo puede ser llamado por un Token Admin del código de cadena.
func (t *Controller) AddTokenSysRole(orgId string, userId string, role string) (interface{}, error) {
    userAccountId, err := t.Ctx.ERC1155Account.GenerateAccountId(orgId, userId, constants.UserAccount)
    if err != nil {
        return nil, err
    }
    auth, err := t.Ctx.ERC1155Auth.CheckAuthorization("ERC1155Token.AddTokenSysRole", "TOKEN", map[string]string{"accountId": userAccountId})
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
    }
    return t.Ctx.ERC1155Token.AddTokenSysRoleMember(role, userAccountId)
}
Parámetros:
  • orgId: string: ID del proveedor de servicios de afiliación (MSP) del usuario de la organización actual.
  • userId: string: nombre de usuario o ID de correo electrónico del usuario.
  • role: string: nombre del rol TokenSys que se debe proporcionar al usuario.
Devuelve:
  • En caso de éxito, un mensaje que contiene los detalles relevantes de la operación.
Ejemplo de valor devuelto:
{
    "msg": "Successfully added role 'vault' to Account Id: oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba (Org-Id: Org1MSP, User-Id: user1)"
}
IsInTokenSysRole
Este método devuelve un valor booleano para indicar si un usuario tiene un rol TokenSys especificado. Este método solo puede ser llamado por un Token Admin del código de cadena.
func (t *Controller) IsInTokenSysRole(orgId string, userId string, role string) (interface{}, error) {
    userAccountId, err := t.Ctx.ERC1155Account.GenerateAccountId(orgId, userId, constants.UserAccount)
    if err != nil {
        return nil, err
    }
    auth, err := t.Ctx.ERC1155Auth.CheckAuthorization("ERC1155Token.IsInTokenSysRole", "TOKEN")
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
    }
    return t.Ctx.ERC1155Token.IsInTokenSysRoleMember(role, userAccountId)
}
Parámetros:
  • orgId: string: ID del proveedor de servicios de afiliación (MSP) del usuario de la organización actual.
  • userId: string: nombre de usuario o ID de correo electrónico del usuario.
  • role: string: nombre del rol TokenSys que se va a comprobar.
Devuelve:
  • En caso de éxito, un mensaje que contiene los detalles relevantes de la operación.
Ejemplo de valor devuelto:
{
    "result": true,
    "msg": "Account Id oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba (Org-Id: Org1MSP, User-Id: user1) has vault role"
}
RemoveTokenSysRole
Este método elimina un rol TokenSys de un usuario especificado. Este método solo puede ser llamado por un Token Admin del código de cadena.
func (t *Controller) RemoveTokenSysRole(orgId string, userId string, role string) (interface{}, error) {
    userAccountId, err := t.Ctx.ERC1155Account.GenerateAccountId(orgId, userId, constants.UserAccount)
    if err != nil {
        return nil, err
    }
    auth, err := t.Ctx.ERC1155Auth.CheckAuthorization("ERC1155Token.RemoveTokenSysRole", "TOKEN", map[string]string{"accountId": userAccountId})
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
    }
    return t.Ctx.ERC1155Token.RemoveTokenSysRoleMember(role, userAccountId)
}
Parámetros:
  • orgId: string: ID del proveedor de servicios de afiliación (MSP) del usuario de la organización actual.
  • userId: string: nombre de usuario o ID de correo electrónico del usuario.
  • role: string: nombre del rol TokenSys que se va a eliminar.
Devuelve:
  • En caso de éxito, un mensaje que contiene los detalles relevantes de la operación.
Ejemplo de valor devuelto:
{
    "msg": "Successfully removed role 'vault' from Account Id: oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba (Org-Id: Org1MSP, User-Id: user1)"
}
TransferTokenSysRole
Este método transfiere un rol TokenSys de un usuario a otro usuario. Este método solo puede ser llamado por un Token Admin del código de cadena.
func (t *Controller) TransferTokenSysRole(role string, fromOrgId string, fromUserId string, toOrgId string, toUserId string) (interface{}, error) {
    auth, err := t.Ctx.ERC1155Auth.CheckAuthorization("ERC1155Token.TransferTokenSysRole", "TOKEN")
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
    }
    fromUserAccountId, err := t.Ctx.ERC1155Account.GenerateAccountId(fromOrgId, fromUserId, constants.UserAccount)
    if err != nil {
        return nil, fmt.Errorf("error in TransferTokenSysRole. Error: %s", err)
    }
    toUserAccountId, err := t.Ctx.ERC1155Account.GenerateAccountId(toOrgId, toUserId, constants.UserAccount)
    if err != nil {
        return nil, fmt.Errorf("error in TransferTokenSysRole. Error: %s", err)
    }
    return t.Ctx.ERC1155Token.TransferTokenSysRole(role, fromUserAccountId, toUserAccountId)
}
Parámetros:
  • fromOrgId: string: ID del proveedor de servicios de afiliación (MSP) del usuario desde el que transferir el rol TokenSys.
  • fromUserId: string: nombre de usuario o ID de correo electrónico del usuario desde el que se transfiere el rol TokenSys.
  • toOrgId: string: ID del proveedor de servicios de afiliación (MSP) del usuario al que transferir el rol TokenSys.
  • toUserId: string: nombre de usuario o ID de correo electrónico del usuario al que transferir el rol TokenSys.
  • role: string: nombre del rol TokenSys que se va a transferir.
Devuelve:
  • En caso de éxito, un mensaje que contiene los detalles relevantes de la operación.
Ejemplo de valor devuelto:
{
    "msg": "Successfully transfered role 'vault' from Account Id: ouaccount~f4e311528f03fffa7810753d643f66289ff6c9080fcf839902f28a1d3aff1789 (Org-Id: Org1MSP, User-Id: user1) to Account Id: ouaccount~ae5be2ae8f98d6d32f5d02b43877d987114e7937c7bacbc30390dcce09996a19 (Org-Id: Org1MSP, User-Id: user2)"
}
GetAccountsByTokenSysRole
Este método devuelve una lista de todos los ID de cuenta para un rol TokenSys especificado. Este método solo puede ser llamado por un Token Admin del código de cadena.
func (t *Controller) GetAccountsByTokenSysRole(role string) (interface{}, error) {
    auth, err := t.Ctx.ERC1155Auth.CheckAuthorization("ERC1155Role.GetAccountsByTokenSysRole", "TOKEN")
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
    }
    return t.Ctx.ERC1155Token.GetAccountsByTokenSysRole(role)
}
Parámetros:
  • role: string: nombre del rol TokenSys.
Devuelve:
  • En caso de éxito, un mensaje que contiene los detalles relevantes de la operación.
Ejemplo de valor devuelto:
{
    "accountIds": [
        "oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba"
    ]
}
GetUsersByTokenSysRole
Este método devuelve información de usuario para todos los usuarios con un rol TokenSys especificado. Este método solo puede ser llamado por un Token Admin del código de cadena.
func (t *Controller) GetUsersByTokenSysRole(role string) (interface{}, error) {
    auth, err := t.Ctx.ERC1155Auth.CheckAuthorization("ERC1155Role.GetUsersByTokenSysRole", "TOKEN")
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
    }
    return t.Ctx.ERC1155Token.GetUsersByTokenSysRole(role)
}
Parámetros:
  • role: string: nombre del rol TokenSys.
Devuelve:
  • En caso de éxito, un mensaje que contiene los detalles relevantes de la operación.
Ejemplo de valor devuelto:
{
   "Users":[
      {
         "accountId":"oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba",
         "orgId":"Org1MSP",
         "userId":"user1"
      }
   ]
}

Métodos de bloqueo de NFT

LockNFT
Este método bloquea un token no fungible especificado. Para bloquear un token, debe haber un usuario con el rol TokenSys vault, que actúe como gestor de almacén. Este método solo puede ser llamado por el propietario del token.
func (t *Controller) LockNFT(orgId string, userId string, tokenId string) (interface{}, error) {
    return t.Ctx.ERC1155Token.LockNFT(orgId, userId, tokenId)
}
Parámetros:
  • orgId: string: ID del proveedor de servicios de afiliación (MSP) del usuario de la organización actual.
  • userId: string: nombre de usuario o ID de correo electrónico del usuario (opcional).
  • tokenID: string: ID del token que se va a bloquear.
Devuelve:
  • En caso de éxito, una representación JSON del objeto de token.
Ejemplo de valor devuelto:
{
   "AssetType":"otoken",
   "Behaviors":[
      "indivisible",
      "mintable",
      "transferable",
      "burnable",
      "lockable",
      "roles"
   ],
   "CreatedBy":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
   "CreationDate":"2023-10-20T12:22:47Z",
   "IsBurned":false,
   "IsLocked":true,
   "Mintable":{
      "Max_mint_quantity":20000
   },
   "On_sale_flag":false,
   "Owner":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
   "Price":120,
   "Quantity":1,
   "Roles":{
      "minter_role_name":"minter"
   },
   "TokenDesc":"",
   "TokenId":"token1",
   "TokenMetadata":{
      "Description":"",
      "Image":"",
      "Painter_name":"",
      "Painting_name":""
   },
   "TokenName":"artcollection",
   "TokenStandard":"erc1155+",
   "TokenType":"nonfungible",
   "TokenUnit":"whole",
   "TokenUri":"token1.example.com"
}
IsNFTLocked
Este método devuelve un valor booleano para indicar si un token especificado está bloqueado. Este método solo lo puede llamar el propietario del token, el gestor de almacenes (el usuario con el rol TokenSys vault) o un Token Admin del código de cadena.
func (t *Controller) IsNFTLocked(tokenId string) (interface{}, error) {
        auth, err := t.Ctx.ERC1155Auth.CheckAuthorization("ERC1155Token.IsNFTLocked", "TOKEN", map[string]string{"tokenId": tokenId})
        if err != nil && !auth {
            isCallerTokenSysRoleHolder, error := t.Ctx.ERC1155Token.IsCallerTokenSysRoleHolder(constants.Vault)
            if error != nil {
                return nil, error
            }
            if !isCallerTokenSysRoleHolder {
                return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
            }
        }
        return t.Ctx.ERC1155Token.IsNFTLocked(tokenId)
    }
Parámetros:
  • tokenID: string: ID del token.
Devuelve:
  • En caso de éxito, un mensaje que contiene los detalles relevantes de la operación.
Ejemplo de valor devuelto:
{
   "isNFTLocked":true
}
GetAllLockedNFTs
Este método devuelve una lista de todos los tokens no fungibles bloqueados. Este método solo lo puede llamar el gestor de almacenes (el usuario con el rol TokenSys vault) o un Token Admin del código de cadena.
func (t *Controller) GetAllLockedNFTs() (interface{}, error) {
        auth, err := t.Ctx.ERC1155Auth.CheckAuthorization("ERC1155Token.GetAllLockedNFTs", "TOKEN")
        if err != nil && !auth {
            isCallerTokenSysRoleHolder, error := t.Ctx.ERC1155Token.IsCallerTokenSysRoleHolder(constants.Vault)
            if error != nil {
                return nil, error
            }
            if !isCallerTokenSysRoleHolder {
                return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
            }
        }
        return t.Ctx.ERC1155Token.GetAllLockedNFTs()
    }
Parámetros:
  • ninguno
Devuelve:
  • En caso de éxito, una matriz de los objetos de token no fungibles bloqueados.
Ejemplo de valor devuelto:
[
   {
      "key":"token1",
      "valueJson":{
         "AssetType":"otoken",
         "Behaviors":[
            "indivisible",
            "mintable",
            "transferable",
            "burnable",
            "lockable",
            "roles"
         ],
         "CreatedBy":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
         "CreationDate":"2023-10-20T12:22:47Z",
         "IsBurned":false,
         "IsLocked":true,
         "Mintable":{
            "Max_mint_quantity":20000
         },
         "On_sale_flag":false,
         "Owner":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
         "Price":120,
         "Quantity":1,
         "Roles":{
            "minter_role_name":"minter"
         },
         "TokenDesc":"",
         "TokenId":"token1",
         "TokenMetadata":{
            "Description":"",
            "Image":"",
            "Painter_name":"",
            "Painting_name":""
         },
         "TokenName":"artcollection",
         "TokenStandard":"erc1155+",
         "TokenType":"nonfungible",
         "TokenUnit":"whole",
         "TokenUri":"token1.example.com"
      }
   }
]
GetAllLockedNFTsByOrg
Este método devuelve una lista de todos los tokens no fungibles bloqueados para una organización especificada y, opcionalmente, para un usuario especificado. Este método solo lo puede llamar el gestor de almacenes (el usuario con el rol TokenSys vault) o un Token Admin del código de cadena.
func (t *Controller) GetLockedNFTsByOrg(orgId string, userId ...string) (interface{}, error) {
        auth, err := t.Ctx.ERC1155Auth.CheckAuthorization("ERC1155Token.GetLockedNFTsByOrg", "TOKEN")
        if err != nil && !auth {
            isCallerTokenSysRoleHolder, error := t.Ctx.ERC1155Token.IsCallerTokenSysRoleHolder(constants.Vault)
            if error != nil {
                return nil, error
            }
            if !isCallerTokenSysRoleHolder {
                return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
            }
        }
        return t.Ctx.ERC1155Token.GetLockedNFTsByOrg(orgId, userId...)
    }
Parámetros:
  • orgId: string: ID del proveedor de servicios de afiliación (MSP) del usuario de la organización actual.
  • userId: string: nombre de usuario o ID de correo electrónico del usuario (opcional).
Devuelve:
  • En caso de éxito, una matriz de los objetos de token no fungibles bloqueados.
Ejemplo de valor devuelto:
[
   {
      "key":"token1",
      "valueJson":{
         "AssetType":"otoken",
         "Behaviors":[
            "indivisible",
            "mintable",
            "transferable",
            "burnable",
            "lockable",
            "roles"
         ],
         "CreatedBy":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
         "CreationDate":"2023-10-20T12:22:47Z",
         "IsBurned":false,
         "IsLocked":true,
         "Mintable":{
            "Max_mint_quantity":20000
         },
         "On_sale_flag":false,
         "Owner":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
         "Price":120,
         "Quantity":1,
         "Roles":{
            "minter_role_name":"minter"
         },
         "TokenDesc":"",
         "TokenId":"token1",
         "TokenMetadata":{
            "Description":"",
            "Image":"",
            "Painter_name":"",
            "Painting_name":""
         },
         "TokenName":"artcollection",
         "TokenStandard":"erc1155+",
         "TokenType":"nonfungible",
         "TokenUnit":"whole",
         "TokenUri":"token1.example.com"
      }
   }
]