ERC-1155 NFT 잠금 이동 방법

Blockchain App Builder는 확장 된 ERC-1155 표준을 사용하는 불가능한 토큰을 잠그는 데 사용할 수있는 방법을 자동으로 생성합니다.

잠긴 토큰은 다른 사용자에게 레코딩하거나 전송할 수 없습니다. 토큰의 상태, 소유자 및 내역과 같은 기타 모든 등록 정보는 보존됩니다. 토큰을 Ethereum 또는 Polygon과 같은 다른 블록체인 네트워크로 전송할 때 NFT 잠금 기능을 사용할 수 있습니다.

NFT를 잠그려면 먼저 사용자에게 저장소 관리자 역할을 지정해야 합니다. 저장소 관리자는 특수 유형의 역할인 TokenSys 역할입니다. TokenSys 롤은 버너, 채굴자, 공증인 등의 자산 기반 롤과 Token AdminOrg Admin 등의 관리 롤과 다릅니다. 현재 Blockchain App Builder는 vault TokenSys 역할을 지원합니다. 체인코드에 대해 vault 역할을 가진 단일 사용자는 체인코드의 저장소 관리자이며 잠긴 NFT를 관리할 수 있습니다.

NFT 잠금 기능을 사용하는 일반적인 플로우는 다음 단계를 따릅니다.
  • 잠금 가능한 동작을 가지는 불가능한 토큰을 만듭니다.
  • AddTokenSysRole 메소드를 사용하여 vault 롤을 사용자에게 Vault Manager로 지정할 수 있습니다.
  • LockNFT 메소드를 호출하여 토큰 ID로 지정된 사용할 수 없는 토큰을 잠급니다.

TokenSys 역할 관리 방법

AddTokenSysRole
이 메소드는 지정된 사용자에게 TokenSys 롤을 추가합니다. 이 메소드는 체인 코드의 Token Admin로만 호출할 수 있습니다.
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)
}
매개변수:
  • orgId: string - 현재 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • userId: string - 사용자의 사용자 이름 또는 전자메일 ID입니다.
  • role: string - 사용자에게 제공할 TokenSys 롤의 이름입니다.
반환값:
  • 성공 시 작업의 관련 세부정보가 포함된 메시지입니다.
반환 값 예제:
{
    "msg": "Successfully added role 'vault' to Account Id: oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba (Org-Id: Org1MSP, User-Id: user1)"
}
IsInTokenSysRole
이 메소드는 사용자에게 지정된 TokenSys 롤이 있는지 여부를 나타내는 부울 값을 반환합니다. 이 메소드는 체인 코드의 Token Admin로만 호출할 수 있습니다.
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)
}
매개변수:
  • orgId: string - 현재 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • userId: string - 사용자의 사용자 이름 또는 전자메일 ID입니다.
  • role: string - 확인할 TokenSys 롤의 이름입니다.
반환값:
  • 성공 시 작업의 관련 세부정보가 포함된 메시지입니다.
반환 값 예제:
{
    "result": true,
    "msg": "Account Id oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba (Org-Id: Org1MSP, User-Id: user1) has vault role"
}
RemoveTokenSysRole
이 메소드는 지정된 사용자로부터 TokenSys 롤을 제거합니다. 이 메소드는 체인 코드의 Token Admin로만 호출할 수 있습니다.
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)
}
매개변수:
  • orgId: string - 현재 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • userId: string - 사용자의 사용자 이름 또는 전자메일 ID입니다.
  • role: string - 제거할 TokenSys 롤의 이름입니다.
반환값:
  • 성공 시 작업의 관련 세부정보가 포함된 메시지입니다.
반환 값 예제:
{
    "msg": "Successfully removed role 'vault' from Account Id: oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba (Org-Id: Org1MSP, User-Id: user1)"
}
TransferTokenSysRole
이 메소드는 TokenSys 롤을 사용자에서 다른 사용자로 전송합니다. 이 메소드는 체인 코드의 Token Admin로만 호출할 수 있습니다.
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)
}
매개변수:
  • fromOrgId: string - TokenSys 롤을 이전할 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • fromUserId: string - TokenSys 롤을 전송할 사용자의 사용자 이름 또는 전자메일 ID입니다.
  • toOrgId: string - TokenSys 롤을 이전할 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • toUserId: string - TokenSys 역할을 전송할 사용자의 사용자 이름 또는 전자메일 ID입니다.
  • role: string - 전송할 TokenSys 롤의 이름입니다.
반환값:
  • 성공 시 작업의 관련 세부정보가 포함된 메시지입니다.
반환 값 예제:
{
    "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
이 메소드는 지정된 TokenSys 롤에 대한 모든 계정 ID 목록을 반환합니다. 이 메소드는 체인 코드의 Token Admin로만 호출할 수 있습니다.
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)
}
매개변수:
  • role: string - TokenSys 롤의 이름입니다.
반환값:
  • 성공 시 작업의 관련 세부정보가 포함된 메시지입니다.
반환 값 예제:
{
    "accountIds": [
        "oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba"
    ]
}
GetUsersByTokenSysRole
이 메소드는 지정된 TokenSys 롤을 가진 모든 사용자에 대한 사용자 정보를 반환합니다. 이 메소드는 체인 코드의 Token Admin로만 호출할 수 있습니다.
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)
}
매개변수:
  • role: string - TokenSys 롤의 이름입니다.
반환값:
  • 성공 시 작업의 관련 세부정보가 포함된 메시지입니다.
반환 값 예제:
{
   "Users":[
      {
         "accountId":"oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba",
         "orgId":"Org1MSP",
         "userId":"user1"
      }
   ]
}

NFT 잠금 방식

LockNFT
이 메소드는 지정된 변경할 수 없는 토큰을 잠급니다. 토큰을 잠그려면 저장소 관리자 역할을 하는 TokenSys vault 역할을 가진 사용자가 있어야 합니다. 이 메소드는 토큰의 소유자만 호출할 수 있습니다.
func (t *Controller) LockNFT(orgId string, userId string, tokenId string) (interface{}, error) {
    return t.Ctx.ERC1155Token.LockNFT(orgId, userId, tokenId)
}
매개변수:
  • orgId: string - 현재 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • userId: string - 사용자의 사용자 이름 또는 전자메일 ID입니다(선택 사항).
  • tokenID: string - 잠글 토큰의 ID입니다.
반환값:
  • 성공 시 토큰 객체의 JSON 표현입니다.
반환 값 예제:
{
   "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
이 메소드는 지정된 토큰이 잠겨 있는지 여부를 나타내는 부울 값을 반환합니다. 이 메소드는 토큰 소유자, 저장소 관리자(TokenSys vault 롤을 가진 사용자) 또는 체인 코드의 Token Admin에 의해서만 호출될 수 있습니다.
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)
    }
매개변수:
  • tokenID: string - 토큰의 ID입니다.
반환값:
  • 성공 시 작업의 관련 세부정보가 포함된 메시지입니다.
반환 값 예제:
{
   "isNFTLocked":true
}
GetAllLockedNFTs
이 메소드는 잠긴 모든 변경할 수 없는 토큰 목록을 반환합니다. 이 메소드는 Vault 관리자(TokenSys vault 롤을 가진 사용자) 또는 체인 코드의 Token Admin에서만 호출할 수 있습니다.
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()
    }
매개변수:
  • 없음
반환값:
  • 성공 시 잠긴 비정확 토큰 객체의 배열입니다.
반환 값 예제:
[
   {
      "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
이 메소드는 지정된 조직 및 선택적으로 지정된 사용자에 대해 잠긴 모든 변경할 수 없는 토큰 목록을 반환합니다. 이 메소드는 Vault 관리자(TokenSys vault 롤을 가진 사용자) 또는 체인 코드의 Token Admin에서만 호출할 수 있습니다.
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...)
    }
매개변수:
  • orgId: string - 현재 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • userId: string - 사용자의 사용자 이름 또는 전자메일 ID입니다(선택 사항).
반환값:
  • 성공 시 잠긴 비정확 토큰 객체의 배열입니다.
반환 값 예제:
[
   {
      "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"
      }
   }
]