TypeScript ERC-721 NFT 잠금 방법

Blockchain App Builder는 확장된 ERC-721 표준을 사용하는 융통성이 없는 토큰을 잠그는 데 사용할 수 있는 방법을 자동으로 생성합니다.

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

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

NFT 잠금 기능을 사용하는 일반적인 흐름은 다음 단계를 따릅니다.
  • Lockable 동작이 있는 Non-Fungible 토큰을 생성합니다.
  • addTokenSysRole 메소드를 사용하여 vault 롤을 사용자 저장소 관리자에게 제공합니다.
  • lockNFT 메소드를 호출하여 토큰 ID로 지정된 실패할 수 없는 토큰을 잠급니다.

TokenSys 역할 관리 방법

addTokenSysRole
이 메소드는 지정된 사용자에게 TokenSys 롤을 추가합니다. 이 메소드는 체인 코드의 Token Admin만 호출할 수 있습니다.
@Validator(yup.string(), yup.string(), yup.string())
public async addTokenSysRole(role: string, orgId: string, userId: string) {
    await this.Ctx.ERC721Auth.checkAuthorization("ERC721TOKEN.addTokenSysRoleMember", "TOKEN");
    await this.Ctx.ERC721Auth.checkAuthorization('ERC721TOKEN.addRoleMember', 'TOKEN');
    const accountId = await this.Ctx.ERC721Account.generateAccountId(orgId, userId);
    return await this.Ctx.ERC721Token.addTokenSysRoleMember(role, accountId);
}
매개변수:
  • role: string – 사용자에게 제공할 TokenSys 롤의 이름입니다.
  • orgId: string – 현재 조직에 있는 사용자의 멤버쉽 서비스 공급자(MSP) ID입니다.
  • userId: string – 사용자의 사용자 이름 또는 전자 메일 ID입니다.
반환값:
  • 성공 시 작업의 관련 세부 정보가 포함된 메시지입니다.
반환 값 예제:
{
    "msg": "Successfully added role 'vault' to Account Id: oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba (Org-Id: Org1MSP, User-Id: user1)"
}
isInTokenSysRole
이 메소드는 사용자에게 지정된 TokenSys 롤이 있는지 여부를 나타내는 부울 값을 반환합니다. 이 메소드는 체인 코드의 Token Admin만 호출할 수 있습니다.
@GetMethod()
@Validator(yup.string(), yup.string(), yup.string())
public async isInTokenSysRole(orgId: string, userId: string, role: string) {
    await this.Ctx.ERC721Auth.checkAuthorization("ERC721TOKEN.isInTokenSysRole", "TOKEN", {orgId: orgId, userId: userId });
    const accountId = await this.Ctx.ERC721Account.generateAccountId(orgId, userId);
    return await this.Ctx.ERC721Token.isInTokenSysRole(role, accountId);
}
매개변수:
  • role: string – 확인할 TokenSys 역할의 이름입니다.
  • orgId: string – 현재 조직에 있는 사용자의 멤버쉽 서비스 공급자(MSP) ID입니다.
  • userId: string – 사용자의 사용자 이름 또는 전자 메일 ID입니다.
반환값:
  • 성공 시 작업의 관련 세부 정보가 포함된 메시지입니다.
반환 값 예제:
{
    "result": true,
    "msg": "Account Id oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba (Org-Id: Org1MSP, User-Id: user1) has vault role"
}
removeTokenSysRole
이 메소드는 지정된 사용자로부터 TokenSys 롤을 제거합니다. 이 메소드는 체인 코드의 Token Admin만 호출할 수 있습니다.
@Validator(yup.string(), yup.string(), yup.string())
public async removeTokenSysRole(role: string, orgId: string, userId: string) {
    await this.Ctx.ERC721Auth.checkAuthorization("ERC721TOKEN.removeTokenSysRoleMember", "TOKEN");
    const accountId = await this.Ctx.ERC721Account.generateAccountId(orgId, userId);
    return await this.Ctx.ERC721Token.removeTokenSysRoleMember(role, accountId);
}
매개변수:
  • role: string – 제거할 TokenSys 역할의 이름입니다.
  • orgId: string – 현재 조직에 있는 사용자의 멤버쉽 서비스 공급자(MSP) ID입니다.
  • userId: string – 사용자의 사용자 이름 또는 전자 메일 ID입니다.
반환값:
  • 성공 시 작업의 관련 세부 정보가 포함된 메시지입니다.
반환 값 예:
{
    "msg": "Successfully removed role 'vault' from Account Id: oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba (Org-Id: Org1MSP, User-Id: user1)"
}
transferTokenSysRole
이 메소드는 TokenSys 롤을 사용자에서 다른 사용자로 전송합니다. 이 메소드는 체인 코드의 Token Admin만 호출할 수 있습니다.
@Validator(yup.string(), yup.string(), yup.string(), yup.string(), yup.string())
public async transferTokenSysRole(role: string, fromOrgId: string, fromUserId: string, toOrgId: string, toUserId: string) {
    await this.Ctx.ERC721Auth.checkAuthorization("ERC721TOKEN.transferTokenSysRole", "TOKEN");
    const fromAccountId = await this.Ctx.ERC721Account.generateAccountId(fromOrgId, fromUserId);
    const toAccountId = await this.Ctx.ERC721Account.generateAccountId(toOrgId, toUserId);
    return await this.Ctx.ERC721Token.transferTokenSysRole(role, fromAccountId, toAccountId);
}
매개변수:
  • role: string – 전송할 TokenSys 역할의 이름입니다.
  • fromOrgId: stringTokenSys 롤을 전송할 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • fromUserId: stringTokenSys 역할을 전송할 사용자의 사용자 이름 또는 전자 메일 ID입니다.
  • toOrgId: stringTokenSys 롤을 전송할 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • toUserId: stringTokenSys 역할을 전송할 사용자의 사용자 이름 또는 전자 메일 ID입니다.
반환값:
  • 성공 시 작업의 관련 세부 정보가 포함된 메시지입니다.
반환 값 예:
{
    "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만 호출할 수 있습니다.
@GetMethod()
@Validator(yup.string())
public async getAccountsByTokenSysRole(role: string) {
    await this.Ctx.ERC721Auth.checkAuthorization("ERC721TOKEN.getAccountsByTokenSysRole", "TOKEN");
    return await this.Ctx.ERC721Token.getAccountsByTokenSysRole(role);
}
매개변수:
  • role: stringTokenSys 역할의 이름입니다.
반환값:
  • 성공 시 작업의 관련 세부 정보가 포함된 메시지입니다.
반환 값 예:
{
    "accountIds": [
        "oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba"
    ]
}
getUsersByTokenSysRole
이 메소드는 지정된 TokenSys 롤을 가진 모든 사용자에 대한 사용자 정보를 반환합니다. 이 메소드는 체인 코드의 Token Admin만 호출할 수 있습니다.
@GetMethod()
@Validator(yup.string())
public async getUsersByTokenSysRole(role: string) {
    await this.Ctx.ERC721Auth.checkAuthorization("ERC721TOKEN.getUsersByTokenSysRole", "TOKEN");
    return await this.Ctx.ERC721Token.getUsersByTokenSysRole(role);
}
매개변수:
  • role: stringTokenSys 역할의 이름입니다.
반환값:
  • 성공 시 작업의 관련 세부 정보가 포함된 메시지입니다.
반환 값 예:
 "users":[
      {
         "accountId":"oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba",
         "orgId":"Org1MSP",
         "userId":"user1"
      }
   ]
}

NFT 잠금 방법

lockNFT
이 메소드는 지정된 실행 불가능 토큰을 잠급니다. 토큰을 잠그려면 저장소 관리자 역할을 하는 TokenSys vault 롤을 가진 사용자가 있어야 합니다. 이 메소드는 토큰의 소유자만 호출할 수 있습니다.
@Validator(yup.string())
public async lockNFT(tokenId: string) {
    return await this.Ctx.ERC721Token.lockNFT(tokenId);
}
매개변수:
  • tokenID: string – 잠글 토큰의 ID입니다.
반환값:
  • 성공 시 토큰 객체의 JSON 표현입니다.
반환 값 예제:
{
   "assetType":"otoken",
   "tokenId":"token1",
   "tokenName":"artcollection",
   "symbol":"ART",
   "tokenStandard":"erc721+",
   "tokenType":"nonfungible",
   "tokenUnit":"whole",
   "behaviors":[
      "indivisible",
      "singleton",
      "mintable",
      "transferable",
      "lockable",
      "burnable",
      "roles"
   ],
   "roles":{
      "minter_role_name":"minter"
   },
   "mintable":{
      "max_mint_quantity":20000
   },
   "createdBy":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
   "creationDate":"2023-10-20T10:26:29.000Z",
   "owner":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
   "isBurned":false,
   "isLocked":true,
   "tokenUri":"token1.example.com",
   "price":120,
   "on_sale_flag":false
}
isNFTLocked
이 메소드는 지정된 토큰이 잠겨 있는지 여부를 나타내는 부울 값을 반환합니다. 이 메소드는 토큰 소유자, 저장소 관리자(TokenSys vault 롤을 가진 사용자) 또는 체인 코드의 Token Admin만 호출할 수 있습니다.
@GetMethod()
@Validator(yup.string())
public async isNFTLocked(tokenId: string) {
  try {
    await this.Ctx.ERC721Auth.checkAuthorization("ERC721TOKEN.isNFTLocked", "TOKEN", { tokenId });
  } catch(err) {
    const isCallerTokenSysRoleHolder = await this.Ctx.ERC721Token.isCallerTokenSysRoleHolder(TOKEN_SYS_ROLE_TYPE.VAULT);
    if(!isCallerTokenSysRoleHolder)
      throw err;
  }
  const isLocked = await this.Ctx.ERC721Token.isNFTLocked(tokenId);
  return {isLocked: isLocked}
}
매개변수:
  • tokenID: string – 토큰의 ID입니다.
반환값:
  • 성공 시 작업의 관련 세부 정보가 포함된 메시지입니다.
반환 값 예제:
{
   "isNFTLocked":true
}
getAllLockedNFTs
이 메소드는 잠겨 있지 않은 모든 토큰 목록을 반환합니다. 이 메소드는 저장소 관리자(TokenSys vault 롤을 가진 사용자) 또는 체인 코드의 Token Admin만 호출할 수 있습니다.
@GetMethod()
@Validator()
public async getAllLockedNFTs() {
  try {
    await this.Ctx.ERC721Auth.checkAuthorization("ERC721TOKEN.getAllLockedNFTs", "TOKEN");
  } catch(err) {
    const isCallerTokenSysRoleHolder = await this.Ctx.ERC721Token.isCallerTokenSysRoleHolder(TOKEN_SYS_ROLE_TYPE.VAULT);
    if(!isCallerTokenSysRoleHolder)
      throw err;
  }
 return this.Ctx.ERC721Token.getAllLockedNFTs();
}
매개변수:
  • 없음
반환값:
  • 성공 시 잠기지 않는 토큰 객체의 배열입니다.
반환 값 예제:
[
   {
      "key":"token1",
      "valueJson":{
         "assetType":"otoken",
         "tokenId":"token1",
         "tokenName":"artcollection",
         "symbol":"ART",
         "tokenStandard":"erc721+",
         "tokenType":"nonfungible",
         "tokenUnit":"whole",
         "behaviors":[
            "indivisible",
            "singleton",
            "mintable",
            "transferable",
            "lockable",
            "burnable",
            "roles"
         ],
         "roles":{
            "minter_role_name":"minter"
         },
         "mintable":{
            "max_mint_quantity":20000
         },
         "createdBy":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
         "creationDate":"2023-10-20T10:26:29.000Z",
         "owner":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
         "isBurned":false,
         "isLocked":true,
         "tokenUri":"token1.example.com",
         "price":120,
         "on_sale_flag":false
      }
   }
]
getAllLockedNFTsByOrg
이 메소드는 지정된 조직 및 선택적으로 지정된 사용자에 대해 잠금 해제 불가능한 모든 토큰 목록을 반환합니다. 이 메소드는 저장소 관리자(TokenSys vault 롤을 가진 사용자) 또는 체인 코드의 Token Admin만 호출할 수 있습니다.
@GetMethod()
@Validator(yup.string(), yup.string())
public async getLockedNFTsByOrg(orgId: string, userId?: string) {
  try {
    await this.Ctx.ERC721Auth.checkAuthorization("ERC721TOKEN.getLockedNFTsByOrg", "TOKEN");
  } catch(err) {
    const isCallerTokenSysRoleHolder = await this.Ctx.ERC721Token.isCallerTokenSysRoleHolder(TOKEN_SYS_ROLE_TYPE.VAULT);
    if(!isCallerTokenSysRoleHolder)
      throw err;
  }
  return await this.Ctx.ERC721Token.getLockedNFTsByOrg(orgId, userId);
}
매개변수:
  • orgId: string – 현재 조직에 있는 사용자의 멤버쉽 서비스 공급자(MSP) ID입니다.
  • userId: string – 사용자의 사용자 이름 또는 전자 메일 ID입니다(선택 사항).
반환값:
  • 성공 시 잠기지 않는 토큰 객체의 배열입니다.
반환 값 예제:
[
   {
      "key":"token1",
      "valueJson":{
         "assetType":"otoken",
         "tokenId":"token1",
         "tokenName":"artcollection",
         "symbol":"ART",
         "tokenStandard":"erc721+",
         "tokenType":"nonfungible",
         "tokenUnit":"whole",
         "behaviors":[
            "indivisible",
            "singleton",
            "mintable",
            "transferable",
            "lockable",
            "burnable",
            "roles"
         ],
         "roles":{
            "minter_role_name":"minter"
         },
         "mintable":{
            "max_mint_quantity":20000
         },
         "createdBy":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
         "creationDate":"2023-10-20T10:26:29.000Z",
         "owner":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
         "isBurned":false,
         "isLocked":true,
         "tokenUri":"token1.examplecom",
         "price":120,
         "on_sale_flag":false
      }
   }
]