devops

ERC-6551, NFT Bound Account 본문

개발/Solidity

ERC-6551, NFT Bound Account

vata500 2023. 11. 5. 14:46
반응형

짧게 TBA라고도 하는 ERC-6551은 NFT의 오너가 여러 컨트랙트를 컨트롤할 수 있는 권한을 가지고 있는 것이라고 보면된다.

즉, NFT + CA의 결합이라고도 보는데, 이 TBA의 NFT는 '지갑의 역할을 하기 때문에 누군가에게 양도되는 순간, 이 NFT에 있는 모든 자산도 그대로 양도된다. 

디사이퍼 미디움에 따르면, 여러 유스케이스를 예상할 수 있다.

  • Gas Fee 절약
    • NFT를 살때 개별 NFT마다 Tx가 일어나야했지만, TBA에 NFT Collection이 있다면 한번의 Tx로 모든 NFT를 구매할 수 있음
    • 게임의 경우에도 하나의 NFT TBA안에 캐릭터와 물약, 아이템이 있다면 한번에 거래가 가능
  • 보안의 향상
    • NFT 판매 시점에 ERC-20 토큰을 내재한 채로 판매하여 에어드랍 가능
    • 별도의 스냅샷 없이도 NFT TBA의 NFT, ERC-20을 에어드랍할 수 있음
  • Interactive NFT
    • 온체인으로 상호작용 가능한 NFT 생성 가능,
    • NFT TBA에 ERC-20과 ERC-721이 있을 경우 새로운 형태로 표현하거나 강화 가능

출처


https://eips.ethereum.org/EIPS/eip-6551

 

ERC6551에는 두 가지 주요 구성 요소가 있다.

  • 토큰 바인딩 Account를 위한 싱글 Registry
  • 토큰 바인딩 Account 구현을 위한 공통 Interface

Registry

레지스트리는 모든 토큰 바인딩 Account의 진입점 역할을 하는 싱글톤 Contract다. 쉽게 말해서 Account를 생성하고 관리하는데 사용된다.

특정 NFT에 대해 바인딩된 계정이 존재하는 지 확인하거나 새 account를 생성하는 역할을 담당한다..

  • createAccount implementation: 주어진 address로 NFT에 대한 토큰 바인딩 account 생성
  • account implementation: 주어진 address에 따라 NFT에 대한 토큰 바인딩 account address를 계산
interface IERC6551Registry {
    /**
     * @dev The registry SHALL emit the AccountCreated event upon successful account creation
     */
    event AccountCreated(
        address account, // Account 주소
        address indexed implementation, // 사용된 구현체 주소
        uint256 chainId, // Chain ID
        address indexed tokenContract, // 토큰 컨트랙트 주소
        uint256 indexed tokenId, // 토큰 ID
        uint256 salt // 토큰에 사용된 salt 값
    ); // Account가 성공적으로 생성되었을 때 발생하는 이벤트

    function createAccount(
        address implementation, // 계정 생성에 사용될 구현체 주소
        uint256 chainId, // Chain ID
        address tokenContract, // 토큰 컨트랙트 주소
        uint256 tokenId, // 토큰 ID
        uint256 salt, // Account 주소 생성에 사용될 salt
        bytes calldata initData // 계정 초기화에 사용될 데이터
    ) external returns (address); // 생성된 Account 주소값 리
		// NFT 에대한 토큰 바인딩 Account 생성

    function account(
        address implementation,
        uint256 chainId,
        address tokenContract,
        uint256 tokenId,
        uint256 salt
    ) external view returns (address);
		// 특정 NFT의 토큰 바인딩 주소를 계산하여 반환
}

Account

특정 NFT와 연결된 Account를 나타낸다. Account는 ETH를 받을 수 있으며, 어떤 NFT에 연결되어있는 지에 대한 정보도 제공한다.

이 Account는 NFT 소유자에 의해서 컨트롤된다.

/// @dev the ERC-165 identifier for this interface is `0x6faff5f1`
interface IERC6551Account {

    receive() external payable;

    function token()
        external
        view
        returns (
            uint256 chainId, // 토큰이 존재하는 체인의 EIP155 ID
            address tokenContract, // 토큰 컨트랙트의 주소
            uint256 tokenId // 토큰 ID
        );

    function state() external view returns (uint256);
		// 계정의 상태가 변경될 때마다 변경되어야 하는 값을 반환
		// 반환 값은 계정의 현재 상태값

    function isValidSigner(address signer, bytes calldata context)
        external
        view
        returns (bytes4 magicValue);
		// 주어진 서명자가 계정을 대신해서 행동할 권한이 있는지 여부
		// 기본적으로 계정이 연결된 NFT 소유자는 유효한 서명자로 간주되어야함
		// signer 서명 권한을 확인할 주소
		// context 서명자가 유효성을 결정하는데 사용되는 추가 데이터
		// 리턴 값은 서명자의 유효성을 나타내는 magicValue

		// Account 인터페이스는 NFT 소유권과 관련해 특정 계정의 기능과 상태를 관리하고 검증
}

 

반응형

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

ERC1155, Multi-token standard  (0) 2023.11.12
ERC-721, Non-Fungible Token  (0) 2023.11.05
OpenZeppelin ERC-20 Solidity 코드 리뷰  (1) 2023.10.09
Comments