Notice
Recent Posts
Recent Comments
Link
devops
ERC-6551, NFT Bound Account 본문
반응형
짧게 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이 있을 경우 새로운 형태로 표현하거나 강화 가능
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