ERC-1155 NFT 잠금을위한 이동 방법

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

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

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

NFT 잠금 기능을 사용하는 일반적인 흐름은 다음 단계를 따릅니다.
  • 잠금 가능 동작이 있는 융통성 없는 토큰을 만듭니다.
  • AddTokenSysRole 메소드를 사용하여 사용자에게 vault 롤을 부여합니다(저장소 관리자).
  • 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: stringTokenSys 롤을 전송할 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • fromUserId: stringTokenSys 롤을 전송할 사용자의 사용자 이름 또는 전자메일 ID입니다.
  • toOrgId: stringTokenSys 롤을 전송할 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • toUserId: stringTokenSys 롤을 전송할 사용자의 사용자 이름 또는 전자메일 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: stringTokenSys 역할의 이름입니다.
반환값:
  • 성공 시 작업의 관련 세부 정보가 포함된 메시지입니다.
반환 값 예제:
{
    "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: stringTokenSys 역할의 이름입니다.
반환값:
  • 성공 시 작업의 관련 세부 정보가 포함된 메시지입니다.
반환 값 예제:
{
   "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"
      }
   }
]