프로그래밍/Blockchain

NFT 이해를 위해 꼭 알아야하는 용어들

Lou Park 2022. 2. 19. 22:44

메인넷

기존 플랫폼에서 벗어난 독립적인 네트워크 생태계를 구축한 블록체인이다. 코인을 생성할 수 있고, 다른 파생 토큰을 만들고 호환가능하게 개방된다.

 

코인과 토큰의 차이

자체 메인넷이 있는 암호화폐를 코인이라고 한다. 반면 다른 코인의 플랫폼을 기반으로 하는 응용 프로그램을 탈중앙화 응용 프로그램(Decentralize Application, dApp)이라고 하며 이 dApp에서 사용가능하게끔 개발된 암호화폐를 토큰이라고 한다.

 

예로 자체 메인넷을 보유하고 있는 이더리움 네트워크의 이더(ETH)는 코인, ERC-20 표준을 따라 이더리움 네트워크에서 파생된 토큰인 샌드박스(SAND)가 있다. 메인넷 없이 파생 토큰으로 시작해서 자체 메인넷을 구축하는 사례도 많다. (이오스 EOS, 트론 TRX)

 

거래소 지갑

거래소 지갑은 업비트, 빗썸, 코인원 등 거래소에서 관리하는 지갑이다. 개인키와 니모닉코드 모두 거래소에서 관리를 하게된다. 실제로 블록체인에서 이루어지는 거래는 수십초에서 수분걸리지만, 우리가 틱단위로 거래를 할 수 있는 이유는 그냥 거래소 DB내에서 수치만 바꾸고 있기 때문이다. 암호화폐를 Staking(그냥 예치해두는 것)하는 것만으로도 보상(PoS)을 주는 암호화폐들도 있는데 지갑의 실소유는 거래소니까 그런 혜택을 받을 수 없다.

 

암호화폐 지갑 - 콜드 월렛 / 핫 월렛

암호화폐 지갑은 크게 콜드 월렛(Cold wallet)과 핫 월렛(Hot Wallet)으로 나누어 진다. 콜드 월렛은 USB나 카드 형태의 하드웨어가 있고, 인터넷에 연결되어 있지 않은 지갑을 말한다. 해킹을 당할 위험이 적어 고액투자자들이 코인을 안전하게 보호하기 위한 목적으로 사용한다.

핫 월렛은 온라인으로 연결되는 지갑이다. 편리하다는 장점이 있지만 해킹을 당할 위험이 있다. (주변에는 그래서 왠만하면 윈도우 컴퓨터로는 MetaMask를 켜는걸 꺼려하시는 분도 있다.)  

 

암호화폐 지갑에서 공개키와 개인키

지갑에서 공개키는 계좌번호에 해당한다. 누구에게나 공개되어있다. 개인키는 거래서명을 확인하고, 출금시에 사용하는 통장 비밀번호에 가깝다. 타원 곡선 암호화 알고리즘 덕분에, 개인키를 알고있을때 공개키를 계산하기는 쉽지만, 공개키를 통해 개인키를 유추하는것은 거의 불가능하다. 그렇기 때문에 개인키를 무슨일이 있더라도 노출되면 안된다. 그리고 개인키를 분실하거나 니모닉 코드*마저 분실하면, 지갑을 찾을 방법은 영영 없기때문에 주의하자.

 

니모닉 코드 (Mnemonic code)

지갑을 복구하기 위해 필요한 12~24개의 단어 조합이다. 니모닉 코드를 순서대로 입력하면 지갑을 백업하고 복구 할 수 있다. 개인키는 인간이 기억하기 어려운 형태이므로 기억하기 용이하기 위해 만들어 졌다. Metamask 한글 번역에서는 비밀 백업 구문이라고 번역되어있다.

 

이더리움

이더리움은 자체 블록체인을 기반으로 다양한 dApp들이 작동할 수 있도록 고안된 하나의 플랫폼 네트워크다. 이러한 이더리움 플랫폼 상에서 스마트 컨트랙트를 이용하여 쉽고 빠르게 토큰을 발행할 수 있다.

 

스마트 컨트랙트 (Smart contract)

계약 당사자가 사전에 협의한 내용을 미리 프로그래밍해서 전자 계약서 문서에 넣어두고, 계약이 조건이 충족되면 계약 내용을 실행하도록 하는 시스템이다. 이더리움은 이러한 스마트 컨트랙트를 이행할 수 있는 플랫폼으로서 개발되었다. 비트코인 스크립트에서는 조건문, 반복문이 불가능하지만 이더리움의 스마트 컨트랙트에서는 if, loop가 가능하다. 여기에 스마트 컨트랙트의 실행마다 수수료인 gas를 발생시키기고, 네트워크상에 수수료의 한계를 설정하여 무한루프를 막았다.

 

Solidity

스마트 컨트랙트 작성을 위한 언어로서, 이더리움 가상 머신(EVM)위에서 돌아간다. 작성된 코드는 solc로 컴파일 되고, 바이트 코드는 geth를 통해 블록체인에 등록되어 EVM에서 실행된다. 소스파일 확장자 명은 sol이다.

 

가스비 (Gas fee)

이더리움 네트워크에서 일어나는 모든 트랜잭션이 이행되기 위해서는 가스비가 필요하다. 해당 트랜잭션에 소요되는 연산 작업량에 대한 보상, 거창하게 말했지만 거래 수수료다. 가스비(Gas price)는 이더리움에 보내지는 수많은 트랜잭션을 조절하기 위해 사용된다. 이를 조절하지 않으면 스팸 트랜잭션들로 네트워크에 과부하가 발생할 가능성도 있다. 내 거래가 남들보다 빠르게 이행되게 하고싶다면 더 높은 가스비를 지불하면 된다.

 

가스비는 아래 공식으로 계산된다. 

Gas fee = Gas Price (unit: Gwei) x Gas limit

Gas limit은 내가 요청하는 작업량의 추측이다. 작업시간이 길고 오래걸리는 일이라면 Gas limit이 높은데, 이를 일반 사용자들이 추측하기는 쉽지 않으므로 지갑앱들에서 Gas limit을 정해준다. 일반적으로 21,000 정도이다. 이를 과도하게 낮게 설정하게 되면 작업을 하다가- Gas 부족으로 중간에 거래가 실패해서 이더가 손실되므로 유의하자. 반대로 훨씬 많은 Gas limit을 설정했다면 거래가 끝난 후 돌려받을 수 있다.

 

Gwei는 이더리움의 작은 값이다. 0.01$를 1Cent라고 하듯이 0.000000001ETH를 1Gwei라고 한다. 이는 가스 가격(Gas Price)의 단위가 되는데, 이는 현재 이더리움 네트워크의 거래량에 따라 높아지기도하고 낮아지기도 한다. 이를 보고싶다면 https://ethereumprice.org/gas/ 여기에서 볼 수 있다. 

 

EIP (이더리움 개선 제안 Ethereum Improvement Proposals)

이더리움 커뮤니티에 정보를 제공하거나 이더리움 또는 그 프로세스, 환경에 대한 새로운 기능을 설명하는 설계 문서다. 예로, ERC-20에 대한 내용인 EIP-20 문서를 보면 등장 계기, 간략한 설명, 인터페이스에 대한 설명이 나온다.

https://eips.ethereum.org/

 

ERC-20 (Ethereum Request for Comment 20)

이더리움 블록체인 네트워크에서 정한 표준 토큰 사양이다. ERC-20에 맞추어 dApp을 설계하고 토큰을 발행하면 이더리움(ETH)과 교환 가능하며, 이더리움 지갑으로 전송이 가능하다. ERC-20

https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol

 function _transfer(
    address from,
    address to,
    uint256 amount
) internal virtual {
    require(from != address(0), "ERC20: transfer from the zero address");
    require(to != address(0), "ERC20: transfer to the zero address");

    _beforeTokenTransfer(from, to, amount);

    uint256 fromBalance = _balances[from];
    require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
    unchecked {
        _balances[from] = fromBalance - amount;
    }
    _balances[to] += amount;

    emit Transfer(from, to, amount);

    _afterTokenTransfer(from, to, amount);
}

 

ERC-721 (Ethereum Request for Comment 721)

대체 불가능한 특징을 가지고 있다. ERC-721로 발행되는 토큰은 모두 각각의 가치를 가지고 있어 NFT 표준이 되었다.

https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol

function _mint(address to, uint256 tokenId) internal virtual {
    require(to != address(0), "ERC721: mint to the zero address");
    require(!_exists(tokenId), "ERC721: token already minted");

    _beforeTokenTransfer(address(0), to, tokenId);

    _balances[to] += 1;
    _owners[tokenId] = to;

    emit Transfer(address(0), to, tokenId);

    _afterTokenTransfer(address(0), to, tokenId);
}

function _transfer(
    address from,
    address to,
    uint256 tokenId
) internal virtual {
    require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
    require(to != address(0), "ERC721: transfer to the zero address");

    _beforeTokenTransfer(from, to, tokenId);

    // Clear approvals from the previous owner
    _approve(address(0), tokenId);

    _balances[from] -= 1;
    _balances[to] += 1;
    _owners[tokenId] = to;

    emit Transfer(from, to, tokenId);

    _afterTokenTransfer(from, to, tokenId);
}

 

ERC-1155

실제로 Opensea.io에 NFT를 올려보면 해당 토큰은 ERC-1155를 따른다고 한다. ERC-1155는 ERC-20과 ERC-721 토큰을 하나의 스마트 컨트랙트에 담아 결합한 것이다. 기존 토큰 표준들이 토큰 유형별로 별도의 스마트 컨트랙트가 필요하여 불필요한 저장공간을 차지하고 전력소모를 하고 있다고 판단, 이 문제를 해결하기 위해 만들어졌다. 이로서 세미 대체 가능 토큰 (SFT, Semi-fungible Token)이라는 말이 떠오르고 있다.

function _mint(
    address to,
    uint256 id,
    uint256 amount,
    bytes memory data
) internal virtual {
    require(to != address(0), "ERC1155: mint to the zero address");

    address operator = _msgSender();
    uint256[] memory ids = _asSingletonArray(id);
    uint256[] memory amounts = _asSingletonArray(amount);

    _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

    _balances[id][to] += amount;
    emit TransferSingle(operator, address(0), to, id, amount);

    _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);

    _afterTokenTransfer(operator, address(0), to, ids, amounts, data);
}

function _safeTransferFrom(
    address from,
    address to,
    uint256 id,
    uint256 amount,
    bytes memory data
) internal virtual {
    require(to != address(0), "ERC1155: transfer to the zero address");

    address operator = _msgSender();
    uint256[] memory ids = _asSingletonArray(id);
    uint256[] memory amounts = _asSingletonArray(amount);

    _beforeTokenTransfer(operator, from, to, ids, amounts, data);

    uint256 fromBalance = _balances[id][from];
    require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
    unchecked {
        _balances[id][from] = fromBalance - amount;
    }
    _balances[id][to] += amount;

    emit TransferSingle(operator, from, to, id, amount);

    _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);

    _afterTokenTransfer(operator, from, to, ids, amounts, data);
}

 

IPFS (InterPlanetary File System)

분산형 파일 시스템에 데이터를 저장하고 인터넷으로 공유하기 위한 프로토콜이다. P2P 파일 저장 시스템. 파일 조각을 동시에 여러 컴퓨터 노드로 부터 가져오는 구조다.

 

HTTP는 위치로 데이터를 가져온다. (Location-addressed) 그렇기 때문에 링크가 깨지거나, 파일이 그 위치에 없다면 404 오류를 뿜뿜하지만, IPFS로 데이터를 요청할때는 컨텐츠 고유 CID를 가지고 데이터를 요청 하기 때문에 절대로 링크가 바뀌지 않는다. Opensea에서 NFT를 등록할때 Owner만 볼 수 있는 링크를 제공하는 란이있는데, 여기에 IPFS 링크를 제공하기도 한다.

 

https://ipfs.io/ 에서 가이드에 따라 프로그램 설치하고 환경을 구축 후 파일 업로드를 하는 방법으로 업로드한 파일에 대한 IPFS hash를 얻어올 수 있다.

 

Mining

블록체인 참여자로서 암호화폐의 거래내역을 기록한 블록을 생성하고 그 대가로 암호화폐를 얻는 행위다. 비트코인의 경우 해시값을 때려 맞추는 방식으로 엄청난 양의 단순업무반복으로 이를 얻어낼 수 있는데, GPU의 경우 비디오 프로세싱 특성상 이에 최적화되어있기 때문에 채굴에 잘 이용된다.

 

Minting

블록체인 자산을 생성하는 과정을 위한 작업으로 서로 다른 암호화폐가 상대편 체인에 생성되고 교환되는 것을 의미한다. NFT를 생성하여 블록 체인에 내 토큰을 띄우는 작업도 민팅이다.

 

폴리곤 네트워크 (MATIC)

폴리곤은 이더리움의 높은 가스비, 느린 거래속도 등을 보완하기 위해 이더리움과 호환가능한 블록체인 네트워크 솔루션이다. Opensea에서 폴리곤 네트워크를 통해 NFT를 등록할때는 무료 등록이 가능하다.

 

소량의 MATIC 코인을 지원받기

처음 Polygon Network에 자산을 옮기려할때 기존 자산이 없기때문에 거래 진행이 불가능한데, Polygon에서는 사용자를 위해 무료로 소량의 (0.001 MATIC)을 제공해주고있다. 아래 두 사이트다. (현재는 작동안되는 듯)

https://faucet.firebird.finance/

https://matic.supply/

 

NFT의 활용

디지털 아트 - 유명하죠?ㅋㅋ

게이밍 - 게임의 수집 아이템이나 인게임 구매

부동산 - 매물을 토큰화하고, 계약을 스마트컨트랙트로 이행

소프트웨어 - 소프트웨어 라이센스

콘서트 티켓 - 티케팅에서 발생하는 부정들을 방지하고, 과거 거래 행적을 추적할 수 있음

 

Opensea API

Opensea에 내가 등록한 NFT에 대한 정보를 가져오고 싶다면 아래 URL을 브라우저에 붙여 넣으면 된다.

 https://api.opensea.io/api/v1/asset/<컨트랙트 주소>/<토큰 아이디>/
 https://api.opensea.io/asset/0x495f947276749ce646f68ac8c248420045cb7b5e/40574776558194280033599662379340974128130657580272950643782066727348676329473

Opensea 내 아이템의 정보 [Details]에서 Contract Address와 Token ID를 확인할 수 있다.

 


참고자료

해시넷

https://bitkr.com/altcoins-kr/what-is-matic-coin-polygon/

https://ethgas.io/kr/