본문으로 이동

ERC-1155

ERC-1155는 이더리움의 다중 토큰 표준입니다. 하나의 컨트랙트가 ID별로 여러 대체 가능, 대체 불가능 또는 혼합형 토큰을 관리하고 여러 ID를 한 번에 일괄 전송할 수 있습니다.

업데이트

교육 참고용이며 투자 조언이 아닙니다. 투자로 인해 손실이 발생할 수 있습니다.

직접 답변

ERC-1155는 이더리움의 다중 토큰 표준입니다. 하나의 컨트랙트가 여러 토큰 유형을 관리할 수 있으며 각 token ID는 대체 가능한 잔액, 대체 불가능한 아이템 또는 구현체가 선택한 다른 공급량 설계를 나타낼 수 있습니다. 따라서 자산 식별 키는 토큰 ID 하나가 아니라 contract address + token ID입니다.

이 표준은 단일 및 일괄 잔액 조회, 단일 및 일괄 안전 전송, 운영자에 대한 포괄적 승인, 수신자 콜백, 전송 이벤트, 선택적 메타데이터 URI 동작을 정의합니다. 누가 민팅할 수 있는지, 공급량에 상한이 있는지, 메타데이터가 영구적인지, 토큰이 어떤 법적 권리를 부여하는지, 토큰의 가치가 얼마인지는 정의하지 않습니다. 이러한 속성은 해당 컨트랙트, 역할 및 외부 의존성을 통해 확인해야 합니다.

작동 방식

  1. 잔액을 식별합니다. balanceOf(account, id)는 계정이 하나의 ID에 대해 보유한 수량을 반환합니다. balanceOfBatch(accounts, ids)는 서로 짝을 이루는 계정과 ID 항목을 조회합니다. 두 컨트랙트가 서로 무관한 자산에 ID 1을 사용할 수 있으므로 완전한 식별 정보는 체인, 컨트랙트 주소, ID의 조합입니다.
  2. 호출자를 승인합니다. 보유자는 자신의 잔액을 전송하거나 setApprovalForAll(operator, true)를 호출할 수 있습니다. 이 승인은 보유자가 해당 컨트랙트에서 소유한 모든 ERC-1155 ID에 적용됩니다. isApprovedForAll(owner, operator)은 승인 상태를 반환합니다. ERC-1155에는 하나의 ID나 수량으로 제한되는 기본 승인 방식이 없습니다.
  3. 단일 또는 일괄 전송을 적용합니다. safeTransferFrom은 하나의 ID와 수량을 이동합니다. safeBatchTransferFrom은 서로 대응하는 idsvalues 배열을 사용하며 두 배열의 길이와 순서가 일치해야 합니다. 일괄 처리는 반복되는 트랜잭션 비용을 줄일 수 있지만 모든 구현체나 작업에서 반드시 더 저렴한 것은 아닙니다.
  4. 컨트랙트 수신자를 확인합니다. 잔액을 갱신하고 관련 이벤트를 내보낸 뒤, 규격을 준수하는 컨트랙트 대상 전송은 onERC1155Received 또는 onERC1155BatchReceived를 호출합니다. 콜백을 지원하지 않거나 잘못된 값을 반환하거나 수신을 거부하면 일반적으로 전송이 되돌려집니다. 이 수신자 확인은 자산이 실수로 잠기는 위험을 줄이지만 수신 컨트랙트가 신뢰할 수 있거나 출금 경로를 제공한다는 사실을 입증하지는 않습니다.
  5. 이벤트로 상태를 재구성합니다. 모든 민팅, 전송, 소각은 TransferSingle 또는 TransferBatch에 반영되어야 합니다. 민팅은 영 주소를 from으로, 소각은 영 주소를 to로 사용합니다. 인덱서는 로그에서 잔액과 ID별 순민팅 공급량을 도출할 수 있지만 전체 이력, 체인 재구성, 컨트랙트 마이그레이션을 올바르게 처리해야 합니다.
  6. 메타데이터를 확인합니다. 선택적 URI 확장은 {id}를 포함하는 공통 템플릿을 반환할 수 있습니다. 클라이언트는 이를 소문자 십육진수 토큰 ID로 바꾸며, 값은 왼쪽을 영으로 채운 64자이고 0x 접두사가 없어야 합니다. 구현 및 저장소 보증에 달리 명시되지 않는 한 메타데이터는 변경되거나 사용할 수 없게 되거나 오해를 불러일으킬 수 있습니다.

예시

한 게임 컨트랙트가 ID 1을 금화, ID 7을 출입권, ID 42를 고유한 검에 할당합니다. Alice는 balanceOf(Alice, 1) = 500, balanceOf(Alice, 7) = 3, balanceOf(Alice, 42) = 1을 보유합니다.

  • Alice가 safeBatchTransferFrom을 호출하면서 ids = [1, 7, 42]values = [120, 1, 1]을 전달합니다. 검증에 성공하면 새 잔액은 500 - 120 = 380, 3 - 1 = 2, 1 - 1 = 0이 되고 수신자는 각각의 수량을 얻습니다.
  • 컨트랙트는 TransferBatch를 내보냅니다. 수신자가 컨트랙트라면 onERC1155BatchReceived를 통해 일괄 전송을 수락해야 합니다. 그렇지 않으면 전체 트랜잭션이 되돌려지고 세 잔액 변경은 하나도 남지 않습니다.
  • ID 42가 대체 불가능한 토큰처럼 동작하는 것은 발행 및 전송 로직이 공급량을 1로 유지하기 때문일 뿐입니다. ERC-1155 자체는 이 규칙을 강제하지 않습니다. 같은 컨트랙트는 자체 접근 통제에 따라 나중에 ID 1을 추가로 민팅할 수 있습니다.

위험과 통제

  • 운영자 권한이 광범위합니다. setApprovalForAll로 승인받은 악의적이거나 침해된 운영자는 보유자가 해당 컨트랙트에서 소유한 모든 ID를 이동할 수 있습니다. 운영자 주소와 컨트랙트를 확인하고, 적절한 경우 별도 지갑을 사용하며, 더 이상 필요하지 않은 승인을 철회하십시오.
  • 민팅, 일시 중지, 업그레이드 권한. 이는 구현체의 기능이지 표준이 보장하는 사항이 아닙니다. 역할 보유자, 프록시 관리자, 타임록, 공급량 확장 기능 및 업그레이드로 잔액이나 전송 규칙을 변경할 수 있는지 확인하십시오.
  • 메타데이터와 자산의 불일치. 온체인 ID가 그대로여도 URI나 호스팅된 JSON은 바뀔 수 있습니다. 콘텐츠 해시, 저장소 지속성, 발행자의 약속, 토큰 컨트랙트 밖에서 나타내는 권리를 확인하십시오.
  • 통합 오류. 지갑과 인덱서는 일괄 배열의 짝을 잘못 맞추거나, 과거 이벤트를 누락하거나, 체인 재구성을 잘못 처리하거나, 서로 다른 컨트랙트와 체인의 동일한 ID를 혼동할 수 있습니다. 컨트랙트 호출, 로그, 최종 잔액을 서로 대조하십시오.
  • 수신자 및 재진입 위험. 수신자 콜백은 전송 과정에서 외부 코드를 실행합니다. 구현체와 통합 프로토콜에는 적절한 상태 갱신 순서 및 재진입 방어가 필요합니다. 콜백 지원만으로 보안 검토를 대신할 수 없습니다.
  • 비용 및 유동성 위험. 일괄 전송도 Gas를 소모하며 필요한 조건 하나라도 실패하면 전체가 원자적으로 되돌려집니다. 시장 유동성, 가격 책정, 로열티, 브리지, 상환 및 오프체인 집행은 ERC-1155의 범위 밖에 있습니다.

흔한 오해

  • “모든 ID가 NFT다.” 하나의 ID가 임의의 수량을 가질 수 있습니다. 대체 불가능성은 구현체의 공급량과 의미 체계에 따라 결정됩니다.
  • “하나의 컨트랙트는 하나의 컬렉션을 의미한다.” 하나의 컨트랙트에 서로 무관한 토큰 유형이 다수 포함될 수 있으며, 다른 컨트랙트의 동일한 숫자 ID는 다른 자산을 식별합니다.
  • “안전 전송이면 자산도 안전하다.” 콜백은 수신자 호환성만 확인하며 컨트랙트 품질, 가격, 메타데이터 또는 자산 회수 가능성을 확인하지 않습니다.
  • “일괄 처리는 항상 Gas를 절약한다.” 반복 비용을 피하는 경우가 많지만 실제 결과는 구현체, ID 수, 저장소 변경, 호출 데이터 및 네트워크 수수료 모델에 따라 달라집니다.

관련 주제

출처

탐색

위키 검색...