Luniverse
Luniverse2.0-kor
Search…
⌃K
Links
🪙

2. NFT 발행단계

1. NFT Contract 배포

NFT 를 발행하기 위해서 먼저 루니버스 Environment(블록체인 네트워크)에 NFT Contract 를 배포해야 합니다. 이 튜토리얼에서는 루니버스 사이드체인에 NFT Contract 를 배포합니다. 루니버스 사이드체인은 이더리움 기반의 체인이며 배포할 스마트 컨트랙트는 이더리움 ERC721 기반의 Luniverse NFT Contract 입니다.
동일한 NFT Contract 코드가 블록체인에 여러 번 배포되기 때문에 체인에 배포된 컨트랙트들을 구분하기 위하여 컨트랙트별로 이름(name), 심볼(symbol) 이 필요합니다.
NFT 를 발행하기 위해서 먼저 NFT Contract 가 루니버스 Environment(블록체인 네트워크)상에 배포되어 있어야합니다.
아래의 절차를 따라하며 Luniverse Console을 통해 NFT Contract를 배포해볼까요?
👇

1) NFT Contract 정보 입력페이지로 이동

  • 좌측메뉴 > NFT > Contracts
  • 우측 [Deploy NFT Contract ] 버튼 클릭

2) NFT Contract 정보 입력 후 배포

배포할 NFT Contract 의 이름과 symbol 을 정해봅시다!
name, symbol 이 다른 컨트랙트와 겹치는 경우 블록스캔에서 자신의 NFT Contract 를 구분하기 어렵기 때문에 중복되지 않는 자신만의 name, symbol 사용할 것을 추천합니다. name 은 영문과 대쉬로 이루어진(-) 64자리까지 입력할 수 있습니다. symbol 은 이름을 축약한 형태이며 보통은 3~4자리를 사용합니다. 이는 미국 주식시장에서 사용하는 티커와 유사합니다. 예를 들어, 미국 주식시장에 상장된 Microsoft 의 티커(ticker)는 MSFT 입니다.
이 튜토리얼에서는 예제로 다음과 같이 아래의 루니버스 아이콘을 NFT Contract 를 발행해보도록 하겠습니다.
  • Token Name 입력 (ex : Luniverse-NFT)
  • Token Symbol 입력 (ex : LNFT)
  • Token Symbol Image 업로드 (루니버스 스캔에서 확인할 NFT의 대표 이미지)
  • [Deploy] 버튼 클릭
위 과정을 통해 NFT Contract 배포(생성)가 요청되면 컨트랙트 배포를 위한 트랜잭션이 생성되고 블록체인에 전달됩니다 .

3) NFT Contract 배포 확인

컨트랙트 배포(생성) 트랜잭션이 블록에 채굴되면 컨트랙트를 식별할 수 있는 컨트랙트 주소가 발급됩니다 . 컨트랙트가 배포되었는지 확인하는 방법은 두 가지가 있습니다.
첫번 째는, 루니버스 콘솔 화면에서 확인하는 방법입니다 .
  • 좌측메뉴 > NFT > Contracts
  • 목록에서 배포한 Contract 클릭
  • 배포한 Contract 상세 정보 확인(Token Name, Symbol, Symbol Image 등..)
두번 째는 Luniverse Scan 에서 확인하는 방법입니다.
  • Contract 상세페이지에서 Scan 링크 클릭
  • Scan 의 NFT Contract 상세 페이지에서 자신이 발행한 이름(name)과 심볼(symbol), 심볼 이미지, 컨트랙트 주소 등을 확인합니다.

2. NFT 발행

루니버스에서는 NFT 를 쉽게 발행할 수 있도록 별도의 API 를 제공하고 있습니다.
Luniverse NFT API를 통해 NFT를 손쉽게 발행해보세요.

1) Auth Token 발급

루니버스에서 NFT 를 발행하기 위해서는 Luniverse NFT API 를 호출해야합니다. Luniverse NFT API 는 간단한 API 호출 몇 번만을 통해 NFT 관련 개발을 할 수 있도록 도와주는 Luniverse API 서비스 중 일부 입니다. Luniverse API 를 사용하기 위해서는 Auth Token (인증토큰) 을 별도로 발급받아야 합니다. Auth Token은 루니버스 콘솔에서 API Key 를 생성한 후 해당 API Key의 Secret Key와 Access Key의 조합을 통해 발급할 수 있습니다.
이 튜토리얼에서는 예제로 미리 생성된 API Key 의 Secret Key와 Access Key 를 이용해 Auth Token 을 발급해보도록 하겠습니다.
아래와 같은 정보를 입력후 Auth Token 발급 API를 호출해주세요.
👇
  • AccessKey : IAM User 계정과 함께 전달해 드리는 Access Key 값 입니다.
  • SecretKey : IAM User 계정과 함께 전달해 드리는 Secret Key 값 입니다.
  • expiresIn: 만료일 설정(초단위)
curl --location --request POST 'https://api.luniverse.io/svc/v2/auth-tokens' \
--header 'Content-Type: application/json' \
--data-raw '{
"accessKey": "MAipRVn5etHmAUww8agGmrLUhvZvm54ysyRUk8quG9i8r..",
"secretKey": "T3kpeyHz8kDTGdrVGcAqR6Ng57FFvSAXxZCz3YZw9LJRX..",
"expiresIn": 315360000
}'
{
"result": true,
"code": "OK",
"data": {
"authToken": {
"authTokenId": "1234567890123456789",
"accountId": "1234567890123456789",
"iamUserId": "1234567890123456789",
"token": "eyJhbdciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJ2Z..",
"expiryAt": "2032-02-22T09:05:08.000Z"
}
}
}
API Response에 담긴 authToken의 token 정보를 확인 후 API를 호출할 때마다 Bearer Token에 넣어주세요.
{
"result": true,
"code": "OK",
"data": {
"authToken": {
...
"token": "eyJhbdciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJ2Z..",
...
}
}
}

2) 미디어 데이터

NFT 에 미디어 데이터(이미지, 동영상, 사운드 등)을 담기 위해서는 실제 데이터를 인터넷 또는 체인 상에 업로드한 후 실제 데이터가 저장되어 있는 URL 주소를 얻어야 합니다. 이로부터 얻은 URL 은 NFT 의 메타데이터(상세정보)에 포함되어 NFT 에 해당하는 실제 파일(데이터)이 저장된 위치를 나타내줍니다.
NFT 로 발행할 미디어 파일을 업로드한 후 NFT 메타데이터에 등록할 media URL(인터넷 주소) 확인해주세요.
👇

1. 업로드할 미디어 파일 입력 후 API 호출

curl --location --request POST 'https://api.luniverse.io/svc/v2/nft/media' \
--header 'Authorization: Bearer <AUTH TOKEN>' \
--form '[email protected]"<FILE PATH>"'

2. Response Body 의 id 를 확인 후 복사(metadata 등록시 사용)

{
"result": true,
"status": 201,
"data": {
"id": "1234567890123456789",
"originalFilename":"\tssu�\tc� 2021-11-18 \u001bin 4.38.00.png",
"mimetype": "image/png",
"size": 353024,
"mediaUrl": "https://nft-cdn.luniverse.io/public/<image>.png",
"createdAt": "2011-02-24T09:25:34.968Z"
},
"code": "CREATED"
}

3) 메타데이터 입력

NFT 의 메타데이터(Metadata)란 NFT에 대한 세부사항을 포함하는 부가 데이터입니다. NFT 미디어 데이터의 제목과 이에 대한 간략한 설명, 미디어 데이터의 창작 정보(창작자 이름, 창작시간), 그리고 미디어 데이터에 대한정보(실제 미디어 데이터가 저장돼 있는 곳의 URL(위에서 업로드한 실제 미디어 파일의 주소), 배경 색 등..)를 포함할 수 있으며, NFT 에 필요한 부가 정보를 자유롭게 추가할 수 있습니다.
이전 단계에서 NFT의 실제 미디어를 업로드한 후 그 미디어가 저장돼 있는 곳의 URL(경로, 위치)을 얻었으니 메타데이터를 저장해볼까요?👇

1. NFT metadata 정보 입력후 API 호출

  • name: 메타데이터 이름
  • createdBy: 창작자 이름
  • createdDate: NFT 생성 일자
  • image: 이미지 리소스를 만들기 위한 19자리 숫자 문자열 ID
  • description: 메타데이터 설명
  • maxMintLimit: 메타데이터의 최대 발행 수량을 설정하는 기능이며, 입력하지 않으면 발행 제한이 없음.
curl --location --request POST 'https://api.luniverse.io/svc/v2/nft/metadata' \
--header 'Authorization: Bearer <AUTH TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "<NFT TOKEN NAME>",
"createdBy": "<CREATOR NAME>",
"createdDate": "<CREATED DATE>",
"image": "<IMAGE ID>",
"description": "<METADATA DESCRIPTION>",
"maxMintLimit": <MAXMINTLIMIT>
}'

2. id 복사 및 저장(NFT 발행 API 호출 시 사용할 것 입니다.)

{
"result": true,
"status": 201,
"data": {
"id": "1234567890123456789",
"name": "My first NFT",
"createdBy": "me",
"createdDate": "2021-05-15",
"image": "https://nft-cdn.luniverse.io/public/sfjdlfksfjdl.png",
"imageHash": "1234567890abcdefg20ab0b1722576ec02b22adca14eeac269e3d9504558fd23",
"description": "Metadata description",
"properties": [],
"editionMax": "100",
"createdAt": "2022-02-24T09:37:22.280Z"
},
"code": "CREATED"
}

4) NFT 발행

NFT 를 발행하기 위해서는 체인에 배포된 NFT Contract(contractId), 발행받을 수신 주소(issuedTo), NFT 메타데이터(metadataId)가 필요합니다. 특정 메타데이터(디지털 창작물에 대한 상세정보)를 가진 NFT 를 발행하기 위해서는 NFT Contract 내부에 정의되어 있는 함수를 호출해야합니다. 함수를 호출하는 순간 Transaction 이 발생하게 되고 해당 Transaction 이 블록에 채굴 된다면 아래 과정을 통해 생성한 NFT 를 수신 주소로 발행할 수 있습니다.
NFT Contract 와 NFT의 메타데이터를 이용해 NFT 를 발행해볼까요?👇

1. contract Id 조회

  • query parameter 값(searchKeyword) 에 NFT Contract 이름 입력 후 API 호출
    curl --location --request GET 'https://api.luniverse.io/svc/v2/nft/contracts?searchKeyword=<CONTRACT NAME>' \
    --header 'Authorization: Bearer <AUTH TOKEN>'
  • itemsid 복사(NFT 발행 API 호출 시 사용할 것 입니다.)
    {
    "result": true,
    "status": 200,
    "data": {
    "contracts": {
    "count": "1",
    "items": [
    {
    "id": "1234567890123456789",
    "name": "name",
    "symbol": "symbol",
    "symbolImage": {
    "attachmentId": "",
    "attachment": null
    },
    "deployedAddress": "0xABCDEFABCDEFABCDEFABCDEF0012345678901234",
    "transactionHash": "0xABCDEFABCDEFABCDEFABCDEF00123456789012349635375da2aa50643ee1efec",
    "transactionStatus": "DEPLOYED",
    "environmentName": "1234567890123456789",
    "createdBy": {
    "accountId": "1234567890123456789",
    "iamUserId": "1234567890123456789",
    "account": {
    "accountId": "1234567890123456789",
    "email": "[email protected]",
    "name": "name",
    "alias": "alias",
    "createdAt": "2021-08-18T02:31:18.000Z",
    "isEnabled": 1,
    "isEmailVerified": true,
    "info": {
    "countryCode": null,
    "phoneAreacode": null,
    "phoneNumber": null,
    "companyName": null,
    "companyWebsite": null,
    "isMarketingAgreed": 0
    }
    },
    "iamUser": {
    "iamUserId": "1234567890123456789",
    "username": "RccaeKzxEWcbPz5tttQWc7q5y9NH5VEWEju8FTvxBRYShNSipnKXiAKDYLMnGf9P",
    "description": "description",
    "type": "API-KEY",
    "createdBy": {
    "accountId": "1234567890123456789",
    "iamUserId": "1234567890123456789"
    },
    "createdAt": "2022-02-17T04:23:27.000Z"
    }
    },
    "createdAt": "2022-02-23T06:36:23.922Z"
    }
    ]
    }
    },
    "code": "OK"
    }

2. NFT 발행 API 호출

  • 1 에서 조회한 NFT Contract Id(id)를 path parameter(contractId)로, Metadata Id(id)와 NFT 를 발행받을 수신 주소(issuedTo)를 body의 property로 입력 후 API 호출
    • issuedTo : NFT 수신 주소(address)
    • metadataId : NFT Metadata의 id
    curl --location --request POST 'https://api.luniverse.io/svc/v2/nft/contracts/<CONTRACT ID>/tokens' \
    --header 'Authorization: Bearer <AUTH TOKEN>' \
    --header 'Content-Type: application/json' \
    --data-raw '{
    "issuedTo": "<ISSUED TO ADDRESS>",
    "metadataId": "<METADATA ID>"
    }'
  • 발행된 tokentransactionHash 확인
    {
    "result": true,
    "status": 201,
    "data": {
    "token": {
    "id": "1234567890123456789",
    "currencyCode": "currencyCode",
    "tokenId": "unknown",
    "issuedTo": "0xABCDEFABCDEFABCDEFABCDEF0012345678901234",
    "transactionHash": "0xABCDEFABCDEFABCDEFABCDEF00123456789012349635375da2aa50643ee1efec",
    "transactionStatus": "SUBMITTED",
    "currentOwner": "0xABCDEFABCDEFABCDEFABCDEF0012345678901234",
    "lastTransactionHash": "0xABCDEFABCDEFABCDEFABCDEF00123456789012349635375da2aa50643ee1efec",
    "editionNo": "1",
    "metadata": {
    "id": "1234567890123456789",
    "name": "name",
    "createdBy": "createdBy",
    "createdDate": "2021-05-15",
    "image": "https://nft-cdn.luniverse.io/public/<IMAGE>.png",
    "imageHash": "ABCDEFABCDEFABCDEFABCDEF00123456789012349635375da2aa50643ee1efec",
    "description": "Metadata description",
    "properties": [],
    "editionMax": "100",
    "createdAt": "2022-02-24T09:37:22.280Z"
    },
    "contractName": "contractName",
    "contractAddress": "0xABCDEFABCDEFABCDEFABCDEF0012345678901234",
    "tokenUri": "unknown",
    "createdBy": {
    "accountId": "1234567890123456789",
    "iamUserId": "1234567890123456789",
    "account": {
    "accountId": "1234567890123456789",
    "email": "[email protected]",
    "name": "name",
    "alias": "alias",
    "createdAt": "2021-08-18T02:31:18.000Z",
    "isEnabled": 1,
    "isEmailVerified": true,
    "info": {
    "countryCode": null,
    "phoneAreacode": null,
    "phoneNumber": null,
    "companyName": null,
    "companyWebsite": null,
    "isMarketingAgreed": 0
    }
    },
    "iamUser": {
    "iamUserId": "1234567890123456789",
    "username": "MAipRVn5etHmAUww8agGmrLUhvZvm54ysyRUk8quG9i8r57g3eLegb15BuVygw3V",
    "description": "description",
    "type": "API-KEY",
    "createdBy": {
    "accountId": "1234567890123456789",
    "iamUserId": null
    },
    "createdAt": "2021-08-18T06:21:22.000Z"
    }
    },
    "createdAt": "2022-02-24T10:18:43.307Z"
    }
    },
    "code": "CREATED"
    }
위 과정을 통해 NFT 발행 요청을 하면 NFT Contract 내부의 함수를 실행해 Transaction 을 발생시키고 , 블록체인에 전달된다.

5) NFT 정보확인

NFT 발행과 관련된 Transaction 이 블록에 채굴되면 NFT 가 정상적으로 발행됩니다. NFT 가 발행됐는지 확인하는 방법은 두 가지가 있습니다.
첫 번째는, 루니버스 콘솔에서 NFT 상세 정보를 확인하는 것입니다.
  • 좌측메뉴 > NFT > Contracts
  • 목록에서 배포한 Contract 클릭
  • 배포한 Contract 상세 정보 확인(Token Name, Symbol, Symbol Image 등..)
두 번째는 Scan에서 NFT 상세 정보를 확인하는 것입니다.
루니버스에서는 Luniverse Scan 에서 NFT 와 관련된 Contract 정보 및 Transaction, Holder 등 다양한 정보들을 볼 수 있도록 제공해줍니다. Luniverse Scan 에서는 아래와 같은 정보들을 확인할 수 있습니다.
  • NFT Transaction 탭: NFT Contract에 관련된 Transaction 내역들 ex) NFT Token 발행에 해당하는 Transaction 내역 NFT Transfer 에 해당하는 Transaction 내역
  • Holders 탭: NFT Contract 에 발행된 NFT Token을 소유하고 있는 Holder들의 랭킹
  • Inventory 탭: NFT Contract 에 발행된 NFT Token들의 목록
Luniverse Console 의 NFT Contract 상세페이지에 나와있는 Scan 링크에 접속해 NFT 정보를 확인해보세요.
👇
  • 좌측메뉴 > NFT > Contracts 클릭
  • 배포한 NFT Contract 클릭
  • Scan 링크 클릭
  • Inventory 탭 클릭 > Token Id 클릭
  • NFT에 대한 정보(NFT Contract Address, Metadata, Holder 등) 확인