교육 참고용이며 투자 조언이 아닙니다. 투자로 인해 손실이 발생할 수 있습니다.
직접 답변
ERC-1155는 이더리움의 다중 토큰 표준입니다. 하나의 컨트랙트가 여러 토큰 유형을 관리할 수 있으며 각 token ID는 대체 가능한 잔액, 대체 불가능한 아이템 또는 구현체가 선택한 다른 공급량 설계를 나타낼 수 있습니다. 따라서 자산 식별 키는 토큰 ID 하나가 아니라 contract address + token ID입니다.
이 표준은 단일 및 일괄 잔액 조회, 단일 및 일괄 안전 전송, 운영자에 대한 포괄적 승인, 수신자 콜백, 전송 이벤트, 선택적 메타데이터 URI 동작을 정의합니다. 누가 민팅할 수 있는지, 공급량에 상한이 있는지, 메타데이터가 영구적인지, 토큰이 어떤 법적 권리를 부여하는지, 토큰의 가치가 얼마인지는 정의하지 않습니다. 이러한 속성은 해당 컨트랙트, 역할 및 외부 의존성을 통해 확인해야 합니다.
작동 방식
- 잔액을 식별합니다.
balanceOf(account, id)는 계정이 하나의 ID에 대해 보유한 수량을 반환합니다.balanceOfBatch(accounts, ids)는 서로 짝을 이루는 계정과 ID 항목을 조회합니다. 두 컨트랙트가 서로 무관한 자산에 ID1을 사용할 수 있으므로 완전한 식별 정보는 체인, 컨트랙트 주소, ID의 조합입니다. - 호출자를 승인합니다. 보유자는 자신의 잔액을 전송하거나
setApprovalForAll(operator, true)를 호출할 수 있습니다. 이 승인은 보유자가 해당 컨트랙트에서 소유한 모든 ERC-1155 ID에 적용됩니다.isApprovedForAll(owner, operator)은 승인 상태를 반환합니다. ERC-1155에는 하나의 ID나 수량으로 제한되는 기본 승인 방식이 없습니다. - 단일 또는 일괄 전송을 적용합니다.
safeTransferFrom은 하나의 ID와 수량을 이동합니다.safeBatchTransferFrom은 서로 대응하는ids및values배열을 사용하며 두 배열의 길이와 순서가 일치해야 합니다. 일괄 처리는 반복되는 트랜잭션 비용을 줄일 수 있지만 모든 구현체나 작업에서 반드시 더 저렴한 것은 아닙니다. - 컨트랙트 수신자를 확인합니다. 잔액을 갱신하고 관련 이벤트를 내보낸 뒤, 규격을 준수하는 컨트랙트 대상 전송은
onERC1155Received또는onERC1155BatchReceived를 호출합니다. 콜백을 지원하지 않거나 잘못된 값을 반환하거나 수신을 거부하면 일반적으로 전송이 되돌려집니다. 이 수신자 확인은 자산이 실수로 잠기는 위험을 줄이지만 수신 컨트랙트가 신뢰할 수 있거나 출금 경로를 제공한다는 사실을 입증하지는 않습니다. - 이벤트로 상태를 재구성합니다. 모든 민팅, 전송, 소각은
TransferSingle또는TransferBatch에 반영되어야 합니다. 민팅은 영 주소를from으로, 소각은 영 주소를to로 사용합니다. 인덱서는 로그에서 잔액과 ID별 순민팅 공급량을 도출할 수 있지만 전체 이력, 체인 재구성, 컨트랙트 마이그레이션을 올바르게 처리해야 합니다. - 메타데이터를 확인합니다. 선택적 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 자체는 이 규칙을 강제하지 않습니다. 같은 컨트랙트는 자체 접근 통제에 따라 나중에 ID1을 추가로 민팅할 수 있습니다.
위험과 통제
- 운영자 권한이 광범위합니다.
setApprovalForAll로 승인받은 악의적이거나 침해된 운영자는 보유자가 해당 컨트랙트에서 소유한 모든 ID를 이동할 수 있습니다. 운영자 주소와 컨트랙트를 확인하고, 적절한 경우 별도 지갑을 사용하며, 더 이상 필요하지 않은 승인을 철회하십시오. - 민팅, 일시 중지, 업그레이드 권한. 이는 구현체의 기능이지 표준이 보장하는 사항이 아닙니다. 역할 보유자, 프록시 관리자, 타임록, 공급량 확장 기능 및 업그레이드로 잔액이나 전송 규칙을 변경할 수 있는지 확인하십시오.
- 메타데이터와 자산의 불일치. 온체인 ID가 그대로여도 URI나 호스팅된 JSON은 바뀔 수 있습니다. 콘텐츠 해시, 저장소 지속성, 발행자의 약속, 토큰 컨트랙트 밖에서 나타내는 권리를 확인하십시오.
- 통합 오류. 지갑과 인덱서는 일괄 배열의 짝을 잘못 맞추거나, 과거 이벤트를 누락하거나, 체인 재구성을 잘못 처리하거나, 서로 다른 컨트랙트와 체인의 동일한 ID를 혼동할 수 있습니다. 컨트랙트 호출, 로그, 최종 잔액을 서로 대조하십시오.
- 수신자 및 재진입 위험. 수신자 콜백은 전송 과정에서 외부 코드를 실행합니다. 구현체와 통합 프로토콜에는 적절한 상태 갱신 순서 및 재진입 방어가 필요합니다. 콜백 지원만으로 보안 검토를 대신할 수 없습니다.
- 비용 및 유동성 위험. 일괄 전송도 Gas를 소모하며 필요한 조건 하나라도 실패하면 전체가 원자적으로 되돌려집니다. 시장 유동성, 가격 책정, 로열티, 브리지, 상환 및 오프체인 집행은 ERC-1155의 범위 밖에 있습니다.
흔한 오해
- “모든 ID가 NFT다.” 하나의 ID가 임의의 수량을 가질 수 있습니다. 대체 불가능성은 구현체의 공급량과 의미 체계에 따라 결정됩니다.
- “하나의 컨트랙트는 하나의 컬렉션을 의미한다.” 하나의 컨트랙트에 서로 무관한 토큰 유형이 다수 포함될 수 있으며, 다른 컨트랙트의 동일한 숫자 ID는 다른 자산을 식별합니다.
- “안전 전송이면 자산도 안전하다.” 콜백은 수신자 호환성만 확인하며 컨트랙트 품질, 가격, 메타데이터 또는 자산 회수 가능성을 확인하지 않습니다.
- “일괄 처리는 항상 Gas를 절약한다.” 반복 비용을 피하는 경우가 많지만 실제 결과는 구현체, ID 수, 저장소 변경, 호출 데이터 및 네트워크 수수료 모델에 따라 달라집니다.