devops

ERC1155, Multi-token standard 본문

개발/Solidity

ERC1155, Multi-token standard

vata500 2023. 11. 12. 15:23
반응형

ERC1155

ERC1155는 가스 효율적인 Token Contract를 만들기 위해서 이전 표준을 최대한 활용하기 위해 만들어진 토큰 표준이다. 좀 더 이해하기 쉽게 얘길하자면, 하나의 컨트랙트에서 여러 토큰을 발행해서 관리한다고 볼 수 있다. 심지어 ERC20, ERC721 모두 지원한다. 그래서 Multi-token standard라고 불린다.

  • ERC1155의 특징은 단일 스마트 컨트랙트를 이용해서 여러 토큰을 한번에 표현
  • 각 토큰 마다 고유한 id 를 기준으로 구분된 balanceOf 메소드를 호출 가능
  • 모든 state를 하나의 컨트랙트에 존재하기 때문에 단일 트랜잭션에서 다양한 토큰 관리 가능

배포 스크립트를 보면 어떤 느낌인지 바로 알 수 있음 by 오픈제플린

Features

  • Batch Transfer: 여러 에셋을 하나의 Tx로 전송가능
  • Batch Balance: 여러 에셋을 하나의 콜로 balance 확인 가능
  • Batch Approval: 모든 토큰을 하나의 주소에 approve 가능
  • Hooks: token hook 받기
  • NFT Support: 발행량이 1이라면, NFT로 사용가능
  • Safe Transfer Rules: 안전한 Transfer rule

위 기능들 중 Batch Transfer와 Hooks만 한 번 보자.

Batch Transfer

// ERC-20
function transferFrom(address from, address to, uint256 value) external returns (bool);

// ERC-1155
function safeBatchTransferFrom(
    address _from,
    address _to,
    uint256[] calldata _ids,
    uint256[] calldata _values,
    bytes calldata _data
) external;

ERC20는 transferFrom 메소드로 하나의 Tx 콜로 하나의 토큰 전송만 가능하지만 ERC1155는 에셋의 고유번호인 ids가 array로 입력할 수 있어 여러 토큰을 한번에 trasfer 하는 것이 가능하다.

ids = [1, 3], values = [100, 5] 로 transfer 하게되면 id가 1인 에셋 100개가 _to로 전송되고, 3인 에셋은 4개만 전송된다고 보면 된다.

Receive Hook

function onERC1155BatchReceived(
    address _operator,
    address _from,
    uint256[] calldata _ids,
    uint256[] calldata _values,
    bytes calldata _data
) external returns(bytes4);

receive hook은 토큰이 특정 주소로 전송될 때 호출되는 함수다. ERC1155는 EIP165를 지원하기 때문에 이를 이용해서 전송된 토큰을 안전하게 처리하기 위해 수신하는 컨트랙트가 인터페이스를 구현하는지 체크한다.

bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))

onERC1155BatchReceived 를 호출하여 bytes4로 변환되어 받는 magic value가 있으면 존재하는 것으로 판단하고 다음 액션을 취한다.

 

반응형

'개발 > Solidity' 카테고리의 다른 글

ERC-721, Non-Fungible Token  (0) 2023.11.05
ERC-6551, NFT Bound Account  (0) 2023.11.05
OpenZeppelin ERC-20 Solidity 코드 리뷰  (1) 2023.10.09
Comments