devops

Cardano CIP-0014 ~ 0068 - Token Standard 본문

Cardano

Cardano CIP-0014 ~ 0068 - Token Standard

vata500 2024. 4. 20. 13:37
반응형

CIP-14, CIP-25, CIP-27, CIP-68는 카르다노의 개선 제안(CIP)에서 token으로 분류되는 것으로, 모두 active 상태기 때문에 알아두면 카르다노 Native token의 표준을 이해하는데 도움이 된다.

간단히 하나씩 살펴보면,

https://cips.cardano.org/?category=Tokens&status=Active

  • CIP-14: 발행되는 네이티브 토큰을 식별하는 고유값인 'Asset Fingerprint'를 도입하는 것
  • CIP-25: 네이티브 토큰의 메타데이터 표준을 정의
  • CIP-27: 메타데이터를 이용해 세컨 마켓의 로열티 배분 관련된 표준을 정의
  • CIP-68: CIP-25의 메타데이터 표준의 한계를 해결하는 것으로, 메타데이터를 위한 reference NFT를 도입

CIP-0014 User-Facing Asset Fingerprint

asset_fingerprint는 policy id와 asset name을 연결하여 bech32로 인코딩 되어 생성되는 native asset의 고유값이다.

- policy_id: 1e349c9bdea19fd6c147626a5260bc44b71635f398b67c59881df209
  asset_name: 504154415445
  asset_fingerprint: asset1hv4p5tv2a837mzqrst04d0dcptdjmluqvdx9k3

 

Mary 에라를 통해 Native asset을 지원하고 나서 policy id와 asset name으로 자산을 식별하는데 한계가 있어 도입되었다. 아래는 asset_fingerprint 생성하는 haskell 코드다.

newtype PolicyId = PolicyId ByteString
newtype AssetName = AssetName ByteString
newtype AssetFingerprint = AssetFingerprint Text
 
mkAssetFingerprint :: PolicyId -> AssetName -> AssetFingerprint
mkAssetFingerprint (PolicyId policyId) (AssetName assetName)
    = (policyId <> assetName)
    & convert . hash @_ @Blake2b_160
    & Bech32.encodeLenient hrp . Bech32.dataPartFromBytes
    & AssetFingerprint
  where
    hrp = [humanReadablePart|asset|]

CIP-0025 Media Token Metadata Standard

카르다노 네이티브 토큰을 위한 토큰 메타데이터의 표준을 정의하는 제안이다.

이더리움의 토큰은 컨트랙트에 종속적인 개념으로, 해당 컨트랙트로 메타데이터를 정의하지만, 카르다노는 ledger의 일부로 transfer는 컨트랙트를 거치지 않으며 개별적인 메타데이터를 정의해야 한다.

카르다노는 트랜잭션에서 메타데이터를 추가할 수 있기 때문에, 토큰과 메타데이터의 링크를 만드는 것이 가능하다. 고유한 링크 생성을 위해서 토큰이 생성되는 트랜잭션에서 같이 추가해야 한다.

{
  "721": {
    "<policy_id>": {
      "<asset_name>": {
        "name": <string>,
        "image": <uri | array>,
        "mediaType": image/<mime_sub_type>,
        "description": <string | array>,
        "files": [{
          "name": <string>,
          "mediaType": <mime_type>,
          "src": <uri | array>,
          <other_properties>
        }],
        <other properties>
      }
    },
    "version": <version_id>
  }
}

일반적인 구조는 위와 같다.

  • transaction_metadatum_label: 721
  • policy_id: v1은 text 포맷이지만, v2는 raw byte 지원
  • asset_name: v1은 utf-8 인코딩 값, v2는 raw byte 지원
  • imgae: 리소스를 가리키는 유효 URI
  • description: 설명란, 선택값
  • files: 선택값
  • version: 지정하지 않으면 v1

CIP-0027 CNFT Community Royalties Standard

카르다노 커뮤니티는 asset의 재판매가 이뤄질 경우 세컨드 마켓을 통해 분배되는 로열티에 많은 니즈가 있으나, 로얄티 배분을 위한 매커니즘, 표준이 정의되지 않은 상태였다.

CIP-0027는 크리에이터의 로열티 배분에 관련된 제안으로, 스마트 컨트랙트 없이 메타데이터만 가지고도 실행할 수 있 관련 표준을 정의한다.

{ "777": 
	{ "rate": "0.2", 
		"addr": "addr1v9nevxg9wunfck0gt7hpxuy0elnqygglme3u6l3nn5q5gnq5dc9un" 
	} 
}

CIP-0027 가이드라인

  • CIP-0027의 구현을 위해 새로운 policy 사용이 필요함
  • 로얄티 태그는 이름 없는 토큰에 쓰여야 하며, 적용될 자산에 사용될 정책을 이용함
  • 최초로 발행된 명령어 세트만 인정되며, 향후 업데이트되는 것은 무시됨. 크리에이터가 로열티 변경하는 것을 방지하기 위함
  • 777 태그를 통해 로열티 요청 비율을 나타내는 rate, 로열티를 배분할 주소를 나타내는 addr로 구성됨

CIP-0068 Datum Metadata Standard

CIP-0068은 모든 asset 클래스에 대한 output datum을 사용하는 native token의 metadata 표준 정의하는 것으로, CIP-25 메타데이터 한계를 개선한 제안이다.

CIP-25 문제

  • 프로그래밍이 어려움
  • 어려운 metadata 업데이트
  • plutus validator 검사가 불가능함
  • metadata 스푸핑 문제가 발생

위 문제를 해결하기 위해서 CIP-0068은 두 가지 user token, reference NFT asset을 발행해서 활용한다.

user token은 NFT, FT와 같은 asset 클래스로 전송가능하거나, 어떤 가치를 내재한 것이며, reference NFT는 user token의 참조하여, 잠겨있는 output datum이 user token의 metadata를 포함하고 있다.

즉 user token은 사용자의 wallet에 들어있는 자산이고, reference NFT는 해당 자산의 메타데이터를 가지고 있어 참조된다.

이 방법의 장점은 발행자는 reference NFT가 포함된 output datum을 관리하고 락업 할 수 있으며, Plutus v2 스크립트에 의해서 컨트롤될 수 있다.

reference NFT의 ouptut datum

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])
  • metadata: user token의 metadata
  • version: version number
  • extra: 임의의 plutus data

Contraints and condtions

  • user token과 reference NFT는 같은 Policy를 가져야 함
  • user token은 하나의 reference NFT만 가지고 있음
  • user token의 reference NFT는 정해진 네이밍 패턴을 지켜야 함
  • 두 asset의 asset name에는 asset_name_label에 정의된 패턴이 뒤따름.
  • user token과 reference NFT는 동일한 트랜잭션에서 생성될 필요가 없으며, 블록 생성 순서도 중요하지 않음

위에서 언급되는 asset_name_label은 3가지 종류의 토큰을 지정할 수 있다.

  • 222: NFT
  • 333: FT
  • 444: RFT

NFT 예시, Space Pugs #5792

https://cexplorer.io/asset/asset1y5vny0we4qnyuy0v6g5ceyjrfsf9tm7sx7lm42/preview#data

ceplorer에서 임의로 찾은 NFT로, 나와 전혀 관계없음. 위 그림에서 보면 Fingerprint와 policy id를 확인할 수 있다.

https://cardanoscan.io/transaction/f3a097e350ac605d0530c3ac6af2343bb3a18a722ff909afddb849b808737413?tab=metadata

위 Space Pugs는 CIP-0025로 발행되었기 때문에, 메타데이터를 확인하려면 발행했던 트랜잭션의 메타데이터를 봐야 한다. 위 링크를 들어가면 Space Pugs의 #4901과 #5792 가 같이 발행된 것을 알 수 있으며, 아래와 같은 메타데이터를 721 label기준으로 확인이 가능하다.

#721 label
{
    "afe2e7cdf682ce7b604d2ad30b1171a3eb5867126f066f0eb6a498ef": {
        "Space Pugs #4901": {
            "Body": "Chrome",
            "Eyes": "Infra Red Detector",
            "Head": "No Head Trait",
            "Suit": "Armed and Ready",
            "name": "Space Pugs #4901",
            "Mouth": "Binary Beam",
            "files": [
                {
                    "src": "ipfs://QmdhfkTkfFr7qVj8SaR1NDqYVGfcWM6WjDKgp62aUww74i",
                    "name": "Space Pugs #4901.png",
                    "mediaType": "image/png"
                }
            ],
            "image": "ipfs://QmdhfkTkfFr7qVj8SaR1NDqYVGfcWM6WjDKgp62aUww74i",
            "Weapon": "Temporal Rift Generator",
            "Division": "Seven",
            "mediaType": "image/png",
            "Background": "Pink Noir"
        },
        "Space Pugs #5792": {
            "Body": "Purple Kaleida",
            "Eyes": "Astral Spectrum Analyzer",
            "Head": "Pathway",
            "Suit": "Jet Pack",
            "name": "Space Pugs #5792",
            "Mouth": "Playful Snarl",
            "files": [
                {
                    "src": "ipfs://QmZ8wvNic1NufEUZL9yKJ9YCNPn5wRrDt67tt24bd16Dh1",
                    "name": "Space Pugs #5792.png",
                    "mediaType": "image/png"
                }
            ],
            "image": "ipfs://QmZ8wvNic1NufEUZL9yKJ9YCNPn5wRrDt67tt24bd16Dh1",
            "Weapon": "Ion Storm Generator",
            "Division": "Seven",
            "mediaType": "image/png",
            "Background": "Cherry Red"
        }
    }
}

https://www.jpg.store/asset/afe2e7cdf682ce7b604d2ad30b1171a3eb5867126f066f0eb6a498ef53706163652050756773202335373932

반응형
Comments