Go Methoden für ERC-721 NFT Locking

Blockchain App Builder generiert automatisch Methoden, mit denen Sie nicht fungible Token sperren können, die den erweiterten ERC-721-Standard verwenden.

Ein gesperrtes Token kann nicht gebrannt oder an andere Benutzer übertragen werden. Alle anderen Eigenschaften, wie Status, Eigentümer und Historie des Tokens, werden beibehalten. Sie können die NFT-Sperrfunktionalität verwenden, wenn Sie ein Token in ein anderes Blockchain-Netzwerk wie Ethereum oder Polygon übertragen.

Bevor Sie NFTs sperren können, müssen Sie einem Benutzer die Vault-Managerrolle zuweisen. Der Vault-Manager ist ein spezieller Rollentyp, eine TokenSys-Rolle. TokenSys-Rollen unterscheiden sich von Asset-basierten Rollen wie Burner, Minter und Notar sowie von administrativen Rollen wie Token Admin und Org Admin. Derzeit unterstützt Blockchain App Builder die Rolle vault TokenSys. Der einzelne Benutzer mit der Rolle vault für einen Chaincode ist der Vault-Manager des Chaincodes und kann gesperrte NFTs verwalten.

Der typische Ablauf für die Verwendung der NFT-Sperrfunktion führt diese Schritte aus.
  • Erstellen Sie ein nicht fungibles Token mit dem sperrbaren Verhalten.
  • Verwenden Sie die Methode AddTokenSysRole, um einem Benutzer, dem Vault-Manager, die Rolle vault zu erteilen.
  • Rufen Sie die Methode LockNFT auf, um ein nicht fungibles Token zu sperren, das durch die Token-ID angegeben wird.

TokenSys Rollenverwaltungsmethoden

AddTokenSysRole
Diese Methode fügt einem angegebenen Benutzer eine TokenSys-Rolle hinzu. Diese Methode kann nur von einem Token Admin des Chaincodes aufgerufen werden.
func (t *Controller) AddTokenSysRole(role string, orgId string, userId string) (interface{}, error) {
    accountId, err := t.Ctx.ERC721Account.GenerateAccountId(orgId, userId)
    if err != nil {
        return nil, err
    }
    auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.AddTokenSysRole", "TOKEN", map[string]string{"accountId": accountId})
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
    }
    return t.Ctx.ERC721Token.AddTokenSysRoleMember(role, accountId)
}
Parameter:
  • role: string: Der Name der Rolle TokenSys, die dem Benutzer zugewiesen werden soll.
  • orgId: string: Die Mitgliedschaftsserviceprovider-(MSP-)ID des Benutzers in der aktuellen Organisation.
  • userId: string: Der Benutzername oder die E-Mail-ID des Benutzers.
Rückgabewert:
  • Bei Erfolg eine Meldung, die relevante Details des Vorgangs enthält.
Beispiel für den Rückgabewert:
{
    "msg": "Successfully added role 'vault' to Account Id: oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba (Org-Id: Org1MSP, User-Id: user1)"
}
IsInTokenSysRole
Diese Methode gibt einen booleschen Wert zurück, der angibt, ob ein Benutzer eine angegebene TokenSys-Rolle hat. Diese Methode kann nur von einem Token Admin des Chaincodes aufgerufen werden.
func (t *Controller) IsInTokenSysRole(orgId string, userId string, role string) (interface{}, error) {
    accountId, err := t.Ctx.ERC721Account.GenerateAccountId(orgId, userId)
    if err != nil {
        return nil, err
    }
    auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.IsInTokenSysRole", "TOKEN")
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
    }
    return t.Ctx.ERC721Token.IsInTokenSysRoleMember(role, accountId)
}
Parameter:
  • role: string: Der Name der zu prüfenden TokenSys-Rolle.
  • orgId: string: Die Mitgliedschaftsserviceprovider-(MSP-)ID des Benutzers in der aktuellen Organisation.
  • userId: string: Der Benutzername oder die E-Mail-ID des Benutzers.
Rückgabewert:
  • Bei Erfolg eine Meldung, die relevante Details des Vorgangs enthält.
Beispiel für den Rückgabewert:
{
    "result": true,
    "msg": "Account Id oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba (Org-Id: Org1MSP, User-Id: user1) has vault role"
}
RemoveTokenSysRole
Diese Methode entfernt eine TokenSys-Rolle von einem angegebenen Benutzer. Diese Methode kann nur von einem Token Admin des Chaincodes aufgerufen werden.
func (t *Controller) RemoveTokenSysRole(role string, orgId string, userId string) (interface{}, error) {
    accountId, err := t.Ctx.ERC721Account.GenerateAccountId(orgId, userId)
    if err != nil {
        return nil, err
    }
    auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.RemoveTokenSysRole", "TOKEN", map[string]string{"accountId": accountId})
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
    }
    return t.Ctx.ERC721Token.RemoveTokenSysRoleMember(role, accountId)
}
Parameter:
  • role: string: Der Name der zu entfernenden TokenSys-Rolle.
  • orgId: string: Die Mitgliedschaftsserviceprovider-(MSP-)ID des Benutzers in der aktuellen Organisation.
  • userId: string: Der Benutzername oder die E-Mail-ID des Benutzers.
Rückgabewert:
  • Bei Erfolg eine Meldung, die relevante Details des Vorgangs enthält.
Beispiel für den Rückgabewert:
{
    "msg": "Successfully removed role 'vault' from Account Id: oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba (Org-Id: Org1MSP, User-Id: user1)"
}
TransferTokenSysRole
Diese Methode überträgt eine TokenSys-Rolle von einem Benutzer an einen anderen Benutzer. Diese Methode kann nur von einem Token Admin des Chaincodes aufgerufen werden.
func (t *Controller) TransferTokenSysRole(role string, fromOrgId string, fromUserId string, toOrgId string, toUserId string) (interface{}, error) {
    auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.TransferTokenSysRole", "TOKEN")
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
    }
    fromAccountId, err := t.Ctx.ERC721Account.GenerateAccountId(fromOrgId, fromUserId)
    if err != nil {
        return nil, fmt.Errorf("error in TransferTokenSysRole. Error: %s", err)
    }
    toAccountId, err := t.Ctx.ERC721Account.GenerateAccountId(toOrgId, toUserId)
    if err != nil {
        return nil, fmt.Errorf("error in TransferTokenSysRole. Error: %s", err)
    }
    return t.Ctx.ERC721Token.TransferTokenSysRole(role, fromAccountId, toAccountId)
}
Parameter:
  • role: string: Der Name der zu übertragenden TokenSys-Rolle.
  • fromOrgId: string: Die Mitgliedschaftsserviceprovider-(MSP-)ID des Benutzers, von dem die Rolle TokenSys übertragen wird.
  • fromUserId: string: Der Benutzername oder die E-Mail-ID des Benutzers, von dem die Rolle TokenSys übertragen wird.
  • toOrgId: string: Die Mitgliedschaftsserviceprovider-(MSP-)ID des Benutzers, an den die Rolle TokenSys übertragen wird.
  • toUserId: string: Der Benutzername oder die E-Mail-ID des Benutzers, an den die Rolle TokenSys übertragen wird.
Rückgabewert:
  • Bei Erfolg eine Meldung, die relevante Details des Vorgangs enthält.
Beispiel für den Rückgabewert:
{
    "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
Diese Methode gibt eine Liste aller Account-IDs für eine angegebene TokenSys-Rolle zurück. Diese Methode kann nur von einem Token Admin des Chaincodes aufgerufen werden.
func (t *Controller) GetAccountsByTokenSysRole(role string) (interface{}, error) {
    auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.GetAccountsByTokenSysRole", "TOKEN")
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
    }
    return t.Ctx.ERC721Token.GetAccountsByTokenSysRole(role)
}
Parameter:
  • role: string: Der Name der TokenSys-Rolle.
Rückgabewert:
  • Bei Erfolg eine Meldung, die relevante Details des Vorgangs enthält.
Beispiel für den Rückgabewert:
{
    "accountIds": [
        "oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba"
    ]
}
GetUsersByTokenSysRole
Diese Methode gibt Benutzerinformationen für alle Benutzer mit einer angegebenen TokenSys-Rolle zurück. Diese Methode kann nur von einem Token Admin des Chaincodes aufgerufen werden.
func (t *Controller) GetUsersByTokenSysRole(role string) (interface{}, error) {
    auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.GetUsersByTokenSysRole", "TOKEN")
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
    }
    return t.Ctx.ERC721Token.GetUsersByTokenSysRole(role)
}
Parameter:
  • role: string: Der Name der TokenSys-Rolle.
Rückgabewert:
  • Bei Erfolg eine Meldung, die relevante Details des Vorgangs enthält.
Beispiel für den Rückgabewert:
{
   "Users":[
      {
         "accountId":"oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba",
         "orgId":"Org1MSP",
         "userId":"user1"
      }
   ]
}

NFT-Sperrmethoden

LockNFT
Diese Methode sperrt ein angegebenes nicht fungibles Token. Um ein Token zu sperren, muss ein Benutzer mit der Rolle TokenSys vault vorhanden sein, der als Vault-Manager fungiert. Diese Methode kann nur vom Eigentümer des Tokens aufgerufen werden.
func (t *Controller) LockNFT(tokenId string) (interface{}, error) {
    return t.Ctx.ERC721Token.LockNFT(tokenId)
}
Parameter:
  • tokenID: string: Die ID des zu sperrenden Tokens.
Rückgabewert:
  • Bei Erfolg eine JSON-Darstellung des Tokenobjekts.
Beispiel für den Rückgabewert:
{
   "AssetType":"otoken",
   "Behavior":[
      "indivisible",
      "singleton",
      "mintable",
      "transferable",
      "lockable",
      "burnable",
      "roles"
   ],
   "CreatedBy":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
   "CreationDate":"2023-10-20T12:39:50Z",
   "IsBurned":false,
   "IsLocked":true,
   "Mintable":{
      "Max_mint_quantity":20000
   },
   "On_sale_flag":false,
   "Owner":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
   "Price":120,
   "Roles":{
      "minter_role_name":"minter"
   },
   "Symbol":"ART",
   "TokenDesc":"",
   "TokenId":"token1",
   "TokenMetadata":{
      "Description":"",
      "Image":"",
      "Painter_name":"",
      "Painting_name":""
   },
   "TokenName":"artcollection",
   "TokenStandard":"erc721+",
   "TokenType":"nonfungible",
   "TokenUnit":"whole",
   "TokenUri":"token1.example.com"
}
IsNFTLocked
Diese Methode gibt einen booleschen Wert zurück, der angibt, ob ein angegebenes Token gesperrt ist. Diese Methode kann nur vom Tokeneigentümer, vom Vault-Manager (dem Benutzer mit der Rolle TokenSys vault) oder von einem Token Admin des Chaincodes aufgerufen werden.
func (t *Controller) IsNFTLocked(tokenId string) (interface{}, error) {
    auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.IsNFTLocked", "TOKEN", map[string]string{"tokenId": tokenId})
    if err != nil && !auth {
        isCallerTokenSysRoleHolder, error := t.Ctx.ERC721Token.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.ERC721Token.IsNFTLocked(tokenId)
}
Parameter:
  • tokenID: string: Die ID des Tokens.
Rückgabewert:
  • Bei Erfolg eine Meldung, die relevante Details des Vorgangs enthält.
Beispiel für den Rückgabewert:
{
   "isNFTLocked":true
}
GetAllLockedNFTs
Diese Methode gibt eine Liste aller gesperrten nicht fungiblen Token zurück. Diese Methode kann nur vom Vault-Manager (dem Benutzer mit der Rolle TokenSys vault) oder einem Token Admin des Chaincodes aufgerufen werden.
func (t *Controller) GetAllLockedNFTs() (interface{}, error) {
    auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.GetAllLockedNFTs", "TOKEN")
    if err != nil && !auth {
        isCallerTokenSysRoleHolder, error := t.Ctx.ERC721Token.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.ERC721Token.GetAllLockedNFTs()
}
Parameter:
  • Kein Wert
Rückgabewert:
  • Bei Erfolg ein Array der gesperrten nicht fungiblen Tokenobjekte.
Beispiel für den Rückgabewert:
[
   {
      "key":"token1",
      "valueJson":{
         "AssetType":"otoken",
         "Behavior":[
            "indivisible",
            "singleton",
            "mintable",
            "transferable",
            "lockable",
            "burnable",
            "roles"
         ],
         "CreatedBy":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
         "CreationDate":"2023-10-20T12:39:50Z",
         "IsBurned":false,
         "IsLocked":true,
         "Mintable":{
            "Max_mint_quantity":20000
         },
         "On_sale_flag":false,
         "Owner":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
         "Price":120,
         "Roles":{
            "minter_role_name":"minter"
         },
         "Symbol":"ART",
         "TokenDesc":"",
         "TokenId":"token1",
         "TokenMetadata":{
            "Description":"",
            "Image":"",
            "Painter_name":"",
            "Painting_name":""
         },
         "TokenName":"artcollection",
         "TokenStandard":"erc721+",
         "TokenType":"nonfungible",
         "TokenUnit":"whole",
         "TokenUri":"token1.example.com"
      }
   }
]
GetAllLockedNFTsByOrg
Diese Methode gibt eine Liste aller gesperrten nicht fungiblen Token für eine angegebene Organisation und optional einen angegebenen Benutzer zurück. Diese Methode kann nur vom Vault-Manager (dem Benutzer mit der Rolle TokenSys vault) oder einem Token Admin des Chaincodes aufgerufen werden.
func (t *Controller) GetLockedNFTsByOrg(orgId string, userId ...string) (interface{}, error) {
    auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.GetLockedNFTsByOrg", "TOKEN")
    if err != nil && !auth {
        isCallerTokenSysRoleHolder, error := t.Ctx.ERC721Token.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.ERC721Token.GetLockedNFTsByOrg(orgId, userId...)
}
Parameter:
  • orgId: string: Die Mitgliedschaftsserviceprovider-(MSP-)ID des Benutzers in der aktuellen Organisation.
  • userId: string: Der Benutzername oder die E-Mail-ID des Benutzers (optional).
Rückgabewert:
  • Bei Erfolg ein Array der gesperrten nicht fungiblen Tokenobjekte.
Beispiel für den Rückgabewert:
[
   {
      "key":"token1",
      "valueJson":{
         "AssetType":"otoken",
         "Behavior":[
            "indivisible",
            "singleton",
            "mintable",
            "transferable",
            "lockable",
            "burnable",
            "roles"
         ],
         "CreatedBy":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
         "CreationDate":"2023-10-20T12:39:50Z",
         "IsBurned":false,
         "IsLocked":true,
         "Mintable":{
            "Max_mint_quantity":20000
         },
         "On_sale_flag":false,
         "Owner":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
         "Price":120,
         "Roles":{
            "minter_role_name":"minter"
         },
         "Symbol":"ART",
         "TokenDesc":"",
         "TokenId":"token1",
         "TokenMetadata":{
            "Description":"",
            "Image":"",
            "Painter_name":"",
            "Painting_name":""
         },
         "TokenName":"artcollection",
         "TokenStandard":"erc721+",
         "TokenType":"nonfungible",
         "TokenUnit":"whole",
         "TokenUri":"token1.example.com"
      }
   }
]