# 🇰🇷 CIP-0068 (데이텀 메타데이터 표준)

**URL:** <https://forum.cardano.org/t/cip-0068/116468>\
**Category:** Translations\
**Tags:** korean, translation, cip\
**Created:** [6 April 2023 04:09 UTC](https://forum.cardano.org/t/cip-0068/116468 "2023-04-06T04:09:32Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![CryptoVeri](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.cardano.org/cryptoveri/32/91508_2.png) [@CryptoVeri](https://forum.cardano.org/u/CryptoVeri)\
**Post date:** [6 April 2023 04:09 UTC](https://forum.cardano.org/t/cip-0068/116468/1 "2023-04-06T04:09:32Z")

</div>

| CIP | 제목 | 저자 | 주석-URI | 단계 | 유형 | 생성 | 포스트 히스토리 | 라이선스 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 68 | 데이텀 메타데이터 표준 | 알레산드로 콘라드 [alessandro.konrad@live.de](mailto:alessandro.konrad@live.de), 토마스 벨레쿠프 [thomas.vellekoop@iohk.io](mailto:thomas.vellekoop@iohk.io) | | 제안 | 정보 제공 | 2022-07-13 | | CC-BY-4.0 |

## 개요

이 제안은 NFT뿐만 아니라 모든 자산 클래스에 대한 출력 데이텀을 사용하는 네이티브 자산에 대한 메타데이터 표준을 정의합니다.

## 동기

이 제안은 [CIP-0025](https://github.com/cardano-foundation/CIPs/blob/master/CIP-0025)의 몇 가지 단점을 다룹니다.

- 프로그래밍 가능성의 부족;
- 메타데이터 업데이트/개선의 어려움;
- Plutus 밸리데이터 내에서 검사할 수 없는 메타데이터…

이러한 단점 외에도 CIP-0025는 몇 가지 설계상의 [결함](https://github.com/cardano-foundation/CIPs/pull/85#issuecomment-1054123645)이 있습니다. CIP-0025를 모르는 사람들이나 다른 방식으로 민팅(minting)을 하려는 사람들, 또는 다른 메타데이터 형식/메커니즘을 사용하고자 하는 경우, 이 표준이 이미 대부분의 플랫폼에서 기본적으로 메타데이터를 해석하기 때문에 메타데이터 스푸핑(spoofing, 위장)에 대한 프로토콜을 열어놓게 됩니다. 이 표준은 프로토콜 레벨에서 강제로 적용되지 않으므로, 모두가 이를 인식하거나 규칙을 따르지 않을 가능성이 있습니다. 동시에, 모든 사람들이 CIP-0025의 규칙을 따르도록 강제한다면, 원장의 능력을 제한하고 제약을 가하게 됩니다.

이 표준은 이러한 문제들을 해결하고 NFT뿐만 아니라 그 이후 나타날 수 있는 모든 자산 클래스에 대한 많은 장점을 제공합니다. 또한, 이 CIP는 지갑과 같은 제3자가 해당 토큰의 종류를 쉽게 파악할 수 있는 방법을 소개할 것입니다.

## 명세

### 고려 사항

기본적인 아이디어는 두 개의 자산을 발행하는 것이며, 한 자산은 다른 자산을 참조합니다. 이 두 가지를 `참조 NFT`(reference NFT) 및 `사용자 토큰`(user token)이라고 합니다. 여기서 `사용자 토큰`은 전송 가능하고 모든 값을 나타내는 NFT, FT 또는 기타 자산 클래스일 수 있습니다. 따라서 `사용자 토큰`은 사용자의 지갑에 있는 실제 자산입니다.

`사용자 토큰`에 대한 메타데이터를 찾으려면 `참조 NFT`가 잠겨 있는 출력을 찾아야 합니다. 이것이 구체적으로 어떻게 이루어지는지는 아래에서 명확해질 것입니다. 또한 이 출력에는 메타데이터를 저장하는 데이텀이 포함되어 있습니다. 이 접근 방식의 장점은 자산 발행자가 `참조 NFT`가 있는 트랜잭션 출력을 잠그고 추가로 처리하는 방법을 결정할 수 있다는 것입니다. 발행자가 완전한 불변 메타데이터를 원하는 경우, `참조 NFT`를 소비할 수 없는 스크립트(unspendable script)의 주소에서 잠글 수 있습니다. 마찬가지로, 발행자가 NFT/FT를 개선시키기를 원하거나 메타데이터를 업데이트하기 위한 메커니즘을 원하는 경우, 발행자가 결정하는 임의의 로직으로 `참조 NFT`를 스크립트 주소에서 잠글 수 있습니다.

마지막으로, 가장 중요한 것은 이 구성을 사용하면 참조 입력 [CIP-0031](https://github.com/cardano-foundation/CIPs/tree/master/CIP-0031)을 사용하여 PlutusV2 스크립트에서 메타데이터를 사용할 수 있다는 것입니다. 이는 토큰 영역에서 더 큰 혁신을 촉진할 것입니다.

### 레이블

각 자산 이름에는 레이블이 접두어로 추가되어야 합니다. 이 레이블의 의도는 토큰의 목적을 식별하는 것입니다. 예를 들어 참조 NFT는 레이블 100으로 식별되므로 참조 NFT로 간주되는 모든 토큰은 16진수 `000643b0`로 자산 이름을 시작해야 합니다. 이것은 레이블 접두어의 형식을 지정하는 [CIP-0067](https://github.com/cardano-foundation/CIPs/tree/master/CIP-0067)을 따릅니다.

자산 이름의 예:

| asset\_name\_label | asset\_name\_content | resulting\_label\_hex | resulting\_content\_hex | resulting\_asset\_name\_hex |
| --- | --- | --- | --- | --- |
| 100 | GenToken | 000643b0 | 47656e546f6b656e | 000643b047656e546f6b656e |
| 100 | NeverGonna | 000643b0 | 4e65766572476f6e6e61 | 000643b04e65766572476f6e6e61 |
| 222 | GiveYouUp | 000de140 | 47697665596f755570 | 000de14047697665596f755570 |

단순화를 위해, 이 문서에서는 레이블 `(100)` 또는 `(<label>)`을 사용할 것이지만, CIP-0067 명세를 따라야 함을 이해해주세요.

### 참조 NFT 레이블

이는 등록된 `asset_name_label` 값입니다.

| asset\_name\_label | 클래스 | 설명 |
| --- | --- | --- |
| 100 | NFT | 데이텀이 포함된 스크립트에서 잠긴 참조 NFT |

### 제약 및 조건

`사용자 토큰`과 `참조 NFT` 간 올바른 관계를 위해 몇 가지 조건이 충족 **되어야** 합니다.

- `사용자 토큰`과 `참조 NFT`는 동일한 정책 ID(policy ID) 아래에 **있어야** 합니다.
- 특정 `사용자 토큰`에 대해 정확히 하나의 `참조 NFT`가 존재 **해야** 합니다.
- `사용자 토큰`과 관련된 `참조 NFT`는 표준 네이밍 패턴을 **따라야** 합니다. 각각의 자산 이름은 해당 `asset_name_label`로 시작하고 자산 클래스가 정의한 패턴이 이어져야 합니다. (예: asset\_name\_label 222)

위의 내용에 대해 몇 가지 언급하자면 다음과 같습니다.

1. `사용자 토큰`과 `참조 NFT`는 같은 트랜잭션에서 발행될 필요는 없습니다. 발행 순서도 중요하지 않습니다.
2. 동일한 `참조 NFT`를 참조하는 여러 `사용자 토큰`(여러 자산 이름 또는 수량이 1보다 큰 경우)이 존재할 수도 있습니다.

`참조 NFT`가 있는 출력의 데이텀에는 생성자 0의 첫 번째 필드에 메타데이터가 포함됩니다. 이 생성자(constructor)의 두 번째 필드에는 버전 번호가 있습니다. 세 번째 필드는 임의의 plutus 데이터가 허용됩니다. 이는 plutus 스크립트에 관련 데이터를 전달하는 데 유용할 수 있습니다.

```auto
big_int = int / big_uint / big_nint
big_uint = #6.2(bounded_bytes)
big_nint = #6.3(bounded_bytes)

metadata =
  { * metadata => metadata }
  / [* metadata]
  / big_int
  / bounded_bytes
  
version = int

; Custom user defined plutus data.
; Setting data is optional, but the field is required
; and needs to be at least Unit/Void: #6.121([])
extra = plutus_data

datum = #6.121([metadata, version, extra])

```

## 222 NFT 표준

이 CIP에서는 `참조 NFT`에 필요한 표준 외에 두 개의 특정 토큰 표준을 소개합니다. 여기서 가능성은 무한하며 FT, 다른 NFT, 반 대체 가능 토큰(semi fungible tokens) 등에 대한 더 많은 표준을 이 CIP 위에 구축할 수 있습니다. 첫 번째는 등록된 `asset_name_label` 접두어 값으로 시작하는 `222` NFT 표준입니다.

| asset\_name\_label | 클래스 | 설명 |
| --- | --- | --- |
| 222 | NFT | CIP-0025 내부 구조를 활용하여 사용자 지갑에 보유된 NFT |

### 클래스

`user token`은 NFT(대체 불가능한 토큰)를 나타냅니다 .

### 패턴

`사용자 토큰`과 `참조 NFT`는 `asset_name_label prefix`로 시작하는 동일한 이름을 가져야합니다.

예:  
`user token` : `(222)Test123`  
`reference NFT` :`(100)Test123`

### 메타데이터

이는 CIP-0025 구조를 따르는 메타데이터의 저수준 표현입니다. UTF-8 인코딩된 모든 키 및 값은 온체인 데이텀을 생성할 때 각각의 바이트 표현으로 변환해야 합니다.

```auto
files_details = 
  {
    ? name : bounded_bytes, ; UTF-8
    mediaType : bounded_bytes, ; UTF-8
    src : bounded_bytes ; UTF-8
    ; ... Additional properties are allowed
  }

metadata = 
  {
    name : bounded_bytes, ; UTF-8
    image : bounded_bytes, ; UTF-8
    ? mediaType : bounded_bytes, ; UTF-8
    ? description : bounded_bytes, ; UTF-8
    ? files : [* files_details]
    ; ... Additional properties are allowed
  }
  
; Custom user defined plutus data.
; Setting data is optional, but the field is required
; and needs to be at least Unit/Void: #6.121([])
extra = plutus_data

datum = #6.121([metadata, 1, extra]) ; version 1

```

JSON 형식의 데이텀 예:

```auto
{"constructor" : 0, "fields": [{"map": [{"k": "6E616D65", "v": "5370616365427564"}, {"k": "696D616765", "v": "697066733A2F2F74657374"}]}, {"int": 1}]}

```

### 제3자의 메타데이터 조회

제3자가 조회하려는 NFT가 `d5e6bf0500378d4f0da4e8dde6becec7621cd8cbf5cbb9b87013d4cc.(222)TestToken`이라고 할때, 다음 단계를 따릅니다.

1. `사용자 토큰`으로부터 `참조 NFT`를 구성합니다: d5e6bf0500378d4f0da4e8dde6becec7621cd8cbf5cbb9b87013d4cc.(100)TestToken
2. `참조 NFT`를 찾아서 이 NFT의 잠긴 출력을 찾습니다.
3. 출력에서 데이텀을 가져와서 생성자 0의 첫 번째 필드로 들어가서 메타데이터를 조회합니다.
4. JSON으로 변환하고 가능한 경우 모든 문자열 항목을 UTF-8로 인코딩합니다. 그렇지 않으면 16진수로 남겨둡니다.

### Plutus 밸리데이터에서 메타데이터 조회

우리는 플루투스 밸리데이터 컨텍스트에서 NFT `d5e6bf0500378d4f0da4e8dde6becec7621cd8cbf5cbb9b87013d4cc.(222)TestToken`의 메타데이터를 가져오고자 합니다. 이를 위해 다음과 같이 합니다.

1. `사용자 토큰`에서 `참조 NFT`를 구성합니다. : `d5e6bf0500378d4f0da4e8dde6becec7621cd8cbf5cbb9b87013d4cc.(100)TestToken` (오프체인)
2. `참조 NFT`를 찾아 그 NFT의 잠긴 출력을 찾습니다. (오프체인)
3. 트랜잭션에서 해당 출력을 참조합니다. (오프체인)
4. `참조 NFT`와 `사용자 토큰`의 정책 ID 및 자산 이름(단, asset\_name\_label 접두어 제외)이 일치하는지 확인하여 참조된 출력의 데이텀이 유효한지 검증합니다. (온체인)

## 333 NFT 표준

두 번째 소개된 표준은 `asset_name_label` 접두어 값으로 등록된 333 FT 표준입니다.

| asset\_name\_label | 클래스 | 설명 |
| --- | --- | --- |
| 333 | FT | 카르다노 재단 오프체인 레지스트리 내부 구조를 활용한 사용자 지갑에 보유된 FT |

### 클래스

`user token`은 FT(대체 가능 토큰)입니다.

### 패턴

`사용자 토큰`과 `참조 NFT`는 asset\_name\_label 접두어로 시작하는 동일한 이름을 **가져야** 합니다.

예:  
`user token` : `(333)Test123`  
`reference NFT` :`(100)Test123`

### 메타데이터

이는 카르다노 재단 오프체인 메타데이터 레지스트리 구조를 엄격히 따르는 메타데이터의 저수준 표현입니다. 모든 UTF-8 인코딩 된 키와 값은 온체인 데이텀을 생성할 때 해당하는 바이트 표현으로 변환되어야 합니다.

```auto
; Explanation here: https://developers.cardano.org/docs/native-tokens/token-registry/cardano-token-registry/

metadata = 
  {
    name : bounded_bytes, ; UTF-8
    description : bounded_bytes, ; UTF-8
    ? ticker: bounded_bytes, ; UTF-8
    ? url: bounded_bytes, ; UTF-8
    ? logo: uri,
    ? decimals: int
    ; ... Additional properties are allowed
  }

; A URI as a UTF-8 encoded bytestring.
; The URI scheme must be one of `https`, `ipfs` or `data`
; Do not encode plain file payloads as URI.
; 'logo' does not follow the explanation of the token-registry, it needs to be a valid URI and not a plain bytestring.
; Only use the following media types: `image/png`, `image/jpeg`, `image/svg+xml`
uri = bounded_bytes

; Custom user defined plutus data.
; Setting data is optional, but the field is required
; and needs to be at least Unit/Void: #6.121([])
extra = plutus_data
  
datum = #6.121([metadata, 1, extra]) ; version 1

```

JSON 형식의 데이텀 예:

```auto
{"constructor" : 0, "fields": [{"map": [{"k": "6E616D65", "v": "5370616365427564"}, {"k": "6465736372697074696F6E", "v": "54686973206973206D79207465737420746F6B656E"}]}, {"int": 1}]}

```

### 제3자의 메타데이터 조회

제3자가 조회하려는 FT `d5e6bf0500378d4f0da4e8dde6becec7621cd8cbf5cbb9b87013d4cc.(333)TestToken`에 대해, 다음과 같은 단계를 거쳐 조회할 수 있습니다.

1. `사용자 토큰`에서 `참조 NFT` 구성합니다.: `d5e6bf0500378d4f0da4e8dde6bec7621cd8cbf5cbb9b87013d4cc.(100)TestToken`
2. `참조 NFT`를 찾아 잠겨 있는 출력을 찾습니다.
3. 출력에서 데이텀을 가져오고 생성자 0의 첫 번째 필드로 들어가 메타데이터를 찾습니다.
4. JSON으로 변환하고 가능하면 모든 문자열 항목을 UTF-8로 인코딩합니다. 그렇지 않으면 16진수로 유지합니다.

### Plutus 밸리데이터에서 메타데이터 조회

플루투스 밸리데이터 컨텍스트에서 FT `d5e6bf0500378d4f0da4e8dde6becec7621cd8cbf5cbb9b87013d4cc.(333)TestToken`의 메타데이터를 가져 오려고 합니다. 이를 위해 다음을 수행합니다.

1. `사용자 토큰`에서 `참조 NFT`를 구성합니다 : `d5e6bf0500378d4f0da4e8dde6becec7621cd8cbf5cbb9b87013d4cc.(100)TestToken` (오프체인)
2. `참조 NFT`를 찾아 잠겨 있는 출력을 찾습니다. (오프체인)
3. 트랜잭션에서 출력을 참조합니다. (오프체인)
4. `참조 NFT` 및 `사용자 토큰`의 정책 ID와 asset\_name\_label 접두어가 없는 해당 자산 이름이 일치하는지 확인하여 참조된 출력의 데이텀이 유효한지 검증합니다. (온체인)

## 근거

`참조 NFT`와 `사용자 토큰`을 분리하지 않으면 모든 유연성을 잃게 되며, `사용자 토큰`을 이동하는 것이 매우 번거로울 것입니다. 새로운 출력으로 `사용자 토큰`을 보내기 위해 매번 메타데이터를 추가해야하기 때문입니다. 따라서 메타데이터와 `사용자 토큰`을 분리하고 메타데이터를 다른 UTxO 안에 잠그면 사용자 토큰을 자유롭게 이동할 수 있습니다.

메타데이터가 포함된 올바른 UtxO를 참조하려면, 인증을 받아야 합니다. 그렇지 않으면 메타데이터 스푸핑 공격이 가능해집니다. 이를 달성하는 한 가지 방법은 UtxO에 NFT(`참조 NFT`)를 추가하는 것입니다. 이 NFT는 `사용자 토큰`과 동일한 정책 ID 아래에서 표준에 정의된 자산 이름 패턴을 따라야 합니다. 이렇게 하면 추가 데이터 없이 `참조 NFT`와 `사용자 토큰` 간에 안전한 링크를 생성할 수 있으며 이 오프체인 및 온체인을 활용할 수 있습니다.

링크에 대한 보안은 민팅 정책 자체에서 파생되므로, 이 CIP는 최대한 높은 유연성을 유지하기 위해 인터페이스만 정의하므로 올바른 제약 사항과 규칙을 가진 밸리데이터를 작성하는 것이 중요합니다.

## 하위 호환성

향후 변경 사항과 메타데이터 호환성을 유지하기 위해, 데이텀에 `version` 필드를 도입합니다.

## 활성 방안

- [CIP-0067](https://github.com/cardano-foundation/CIPs/pull/298)의 자산 이름 레이블에 대한 바이너리 인코딩에 동의.
- 지갑, 탐색기, 도구, 민팅 플랫폼 및 기타 제3자로부터 이 CIP에 대한 지원 받기.
- [Lucid](https://github.com/spacebudz/lucid) (오프체인), [PlutusTx](https://github.com/input-output-hk/plutus) (온체인)를 활용한 최소한의 참조 구현: [구현](https://github.com/JaredCorduan/CIPs/blob/master/CIP-0068/ref_impl)
- 이 CIP를 사용하는 보다 실용적인 오픈소스 구현/프로젝트.

## 참조

- CIP-0025: [CIPs/CIP-0025 at master · cardano-foundation/CIPs · GitHub](https://github.com/cardano-foundation/CIPs/blob/master/CIP-0025)
- CIP-0031: [CIPs/CIP-0031 at master · cardano-foundation/CIPs · GitHub](https://github.com/cardano-foundation/CIPs/tree/master/CIP-0031)
- CIP-0067: [CIPs/CIP-0067 at master · cardano-foundation/CIPs · GitHub](https://github.com/cardano-foundation/CIPs/tree/master/CIP-0067)

## 저작권

이 CIP는 [CC-BY-4.0](https://creativecommons.org/licenses/by/4.0/legalcode) 라이선스에 따라 공개됩니다 .

* * *

\* 원문: [CIPs/CIP-0068 at master · cardano-foundation/CIPs · GitHub](https://github.com/cardano-foundation/CIPs/tree/master/CIP-0068)
