이더리움/이더리움과 월드 컴퓨터

[이더리움과 월드 컴퓨터] 3-2. NFT

라이튼 2023. 3. 21. 16:09

이전글

 

[이더리움과 월드 컴퓨터] 3-1. 토큰

이전글 [이더리움과 월드 컴퓨터] 2-5. 솔리디티 이전글 [이더리움과 월드 컴퓨터] 2-4. 컨트랙트 계정 이전글 [이더리움과 월드 컴퓨터] 2-3. EVM 이전글 [이더리움과 월드 컴퓨터] 2-2. EOA 이전글 [이

kwjdnjs.tistory.com

 

NFT

 이번 글에서는 토큰을 확장한 개념인 NFT에 대해 알아보겠습니다.

 

I. NFT

 지금까지 스마트 컨트랙트로 배포되는 토큰이 무엇인지에 대해 알아봤습니다. 그리고 이러한 토큰이 기존의 이더와는 다르게 스마트 컨트랙트를 생성하는 개발자가 최대 수량을 마음대로 조절할 수 있다는 사실도 알아봤습니다.

 

 이러한 토큰의 특징을 응용한다면 다음과 같은 것도 만들 수 있습니다.

  •  최대발행 개수가 한 개인 토큰

 

 하나의 스마트 컨트랙트 위에서 움직이는 토큰의 개수를 조정할 수 있다면, 단 하나의 토큰만이 존재하는 컨트랙트도 만들 수 있습니다. 이것이 바로 NFT입니다.

 

 

 NFT는 Non-fungible token으로 직역하면 대체 불가능한 토큰입니다. 이름처럼 다른 토큰과는 교환할 수 없는 유일한 토큰을 뜻합니다. 일반적으로 토큰을 발행할 때에는 여러 개의 토큰을 발행합니다. 이러한 토큰은 함께 발행된 다른 토큰과 서로 대체될 수 있습니다. 하지만 NFT는 단 한 개의 유일한 토큰이기 때문에 다른 토큰과 대체될 수 없습니다.

 

 사실 단순히 하나의 토큰을 발행하는 것으로는 큰 의미가 없을 수도 있습니다. 하지만 NFT는 단순히 하나의 토큰을 발행하는 것을 뜻하지 않습니다.

 

 그렇다면 NFT가 단순히 토큰을 발행하는 것 이상으로 무슨 의미를 가질까요? 이것의 해답을 알기 위해 다음과 같은 상황을 만들어 보겠습니다.

 

 NFT는 실제 동전이 아닌 가상의 토큰입니다. 따라서 스마트 컨트랙트를 적절히 변경하면 NFT 안에 디지털 정보를 담을 수 있습니다. 예를 들어, 이 글의 주소를 담은 NFT를 발행한다고 가정해 보겠습니다. 이 경우 해당 NFT는 이 글을 가리키고 있는 유일한 토큰으로써의 가치를 가지게 됩니다.

 

 

 또한 이러한 토큰은 이더리움이라는 월드 컴퓨터 위에서 영원히 저장되며 함부로 변조될 수 없기 때문에, 디지털 인증서의 역할을 할 수 있습니다. 만약 누군가가 이 글의 주소를 포함한 새로운 NFT를 발행하게 된다면, 다른 계정 주소를 가진 컨트랙트 계정이 생성됩니다. 따라서 이 NFT가 가짜라는 것을 바로 알아차릴 수 있습니다. 이것이 바로 NFT가 일반 토큰과 차별화되는 점입니다.

 

 

 마지막으로 NFT 컨트랙트를 조금 효율적으로 사용하기 위해 다음과 같이 변경해 보겠습니다.

 

 

 기존에 토큰의 개수를 표시하던 변수를 NFT ID값을 저장하도록 변경하였습니다. NFT는 발행개수가 하나인 토큰이기 때문에 보유개수를 저장하는 것은 큰 의미가 없습니다. 따라서 토큰의 개수 대신 토큰의 ID를 저장하도록 하여 하나의 스마트 컨트랙트에서 여러 개의 NFT가 동작하도록 할 수 있습니다.

 

 예를 들어 이 글을 12번 ID의 NFT로 발행한다면, NFT 소유자의 변수에 12를 저장하는 것으로 NFT 소유자를 변경할 수 있습니다. 이러한 방식을 이용하면 하나의 스마트 컨트랙트에서 모든 블로그의 글들을 하나의 고유 ID를 가진 NFT로 발행할 수 있습니다.

 

II. NFT 표준: ERC-721

 NFT 역시 일반 토큰처럼 표준이 존재합니다. 대표적인 표준에는 ERC-721이 있습니다.

 

 ERC-721은 기존 토큰 표준인 ERC-20을 NFT에 맞게 수정한 것입니다. 솔리디티로 작성된 표준은 다음과 같습니다.

 

function balanceOf(address _owner) external view returns (uint256);
function ownerOf(uint256 _tokenId) external view returns (address);
function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;
function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
function approve(address _approved, uint256 _tokenId) external payable;
function setApprovalForAll(address _operator, bool _approved) external;
function getApproved(uint256 _tokenId) external view returns (address);
function isApprovedForAll(address _owner, address _operator) external view returns (bool);

event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

 

 기존 ERC-20에서는 토큰 보유자와 현재 보유 수량 만을 저장합니다. 하지만 NFT 표준인 ERC-721에서는 토큰을 보유하고 있는 주소(계정)를 추적할 수 있습니다.

 

지금까지 NFT와 주요 표준에 대해 알아봤습니다. 감사합니다.

 

 

다음글

 

[이더리움과 월드 컴퓨터] 4-1. 오라클

이전글 [이더리움과 월드 컴퓨터] 3-2. NFT 이전글 [이더리움과 월드 컴퓨터] 3-1. 토큰 이전글 [이더리움과 월드 컴퓨터] 2-5. 솔리디티 이전글 [이더리움과 월드 컴퓨터] 2-4. 컨트랙트 계정 이전글 [

kwjdnjs.tistory.com