ERC-721 을 이용해 NFT 를 발행해보았다.
먼저, 토큰화 시킬 이미지 파일을 생성한다.
그리고 pinata 에 접속해 이미지 파일을 담은 폴더를 업로드 한다.
그리고, 아래와 같이 NFT 메타데이터 파일을 json 형식으로 작성한다. (이미지 파일마다 한개씩)
image 항목에는 업로드한 이미지 파일의 링크가 들어가야 한다.
{
"name": "BCS 1",
"description": "This Is Number 1",
"image": "https://gateway.pinata.cloud/ipfs/QmcvQZr1gKw2ypnJKYpHoRAVuLRsK59jLEvuhpZ2K94qsw/no1.png"
}
그리고, json 파일을 하나의 폴더에 넣어 폴더를 pinata 에 업로드한다.
업로드한 json 파일의 링크를 확인한다.
여기서 파일의 링크를 보면, 각 json 파일마다 숫자만 바뀌는 것을 볼 수 있다.
이 링크에서 숫자만 바꾼다면, 쉽게 원하는 Number 의 NFT 를 민팅할 수 있겠다.
이제 Remix 로 돌아와 컨트랙트를 작성해보자.
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
openzeppelin 의 ERC721Enumrable.sol 파일을 import 해준다.
그리고 ERC721Enumrable 컨트랙트를 상속받아서 사용한다.
contract mint721token is ERC721Enumerable {}
먼저, constructor 를 이용해 컨트랙트 배포와 동시에 pinata 의 uri 를 입력받는다.
그리고 토큰이름과 티커를 작성해준다.
string public URI;
constructor(string memory _uri) ERC721("BCS721","BCS"){
URI = _uri;
}
그리고 발행할 토큰의 uri 를 설정해주어야 한다.
아까 링크에서 보았듯, 토큰의 숫자만 바뀌기에 _tokenID 라는 input 을 정수형으로 받고,
위에서 설정한 (URI + "/" + _tokenID + ".json") 으로 설정한다면,
민팅하고 싶은 토큰을 발행할 수 있을 것이다.
function tokenURI(uint _tokenID) public view override returns(string memory){
return string(abi.encodePacked(URI, "/" , Strings.toString(_tokenID) , ".json"));
}
}
마지막으로, 토큰을 민팅하는 함수를 만들면 되겠다.
function mintNFT(uint _tokenID) public {
_mint(msg.sender, _tokenID);
}
완성된 컨트랙트에 uri 를 넣고 Matic mumbai 테스트넷에 배포했다.
그리고, 1번 NFT 를 발행하고,
BalanceOf 함수로 내 지갑으로 토큰이 재데로 민팅되었는지 확인했다.
그리고 test opensea 에 들어가 확인해보면 민팅한 1번 NFT 가 잘 보여진다.
" 당신은 블록체인이 필요한가? " 라는 논문이다.
과거 비트코인의 가격이 급상승하고 블록체인 만능주의에 빠져있을 때,
취리히 연방 공대와 임페리얼 칼리지 런던에서 이러한 논문을 작성했다.
블록체인이 필요한지 아닌지에 대한 개념을 정리하고 있다.
이 글의 abstract (초록) 부분에서는 이 글을 아래와 같이 요약한다.
블록체인은 사회가 거래하고 상호작용하는 방식을 혁신할 수 있는 기술적 혁신으로 송술되고 있다.
상호 불신하는 주체들이 신뢰할 수 있는 제3자에 의존하지 않고 재정적 가치를 교환하고 상호작용할 수 있는 속성에 기인한다.
본 논문에서는 블록체인이 특정 응용 시나리오에 적합한 기술적 해결책인지를 비판적으로 분석합니다.
퍼미션리스와 퍼미션드 블록체인을 구분하고, 이들의 속성을 중앙 관리형 데이터베이스와 대조합니다. 우리는 특정 응용 문제를 해결하기 위한 적절한 기술적 해결책을 결정하기 위한 구조화된 방법론을 제공합니다.
이 논문에서는 reader 와 writer 를 아래와 같이 정의한다.
Writer 는 데이터베이스에 상태를 기록하는 개체를 의미합니다. 블록체인에서는 합의 프로토콜에 참여하고 블록체인을 확장하는 참여자로 이해할 수 있습니다. 따라서 writer 는 블록 내에서 트랜잭션을 축적하고 이 블록을 블록체인에 추가할 수 있습니다. 이러한 역할은 때로는 validator로도 표현될 수 있습니다.
Reader 는 일반적으로 블록체인 데이터에 접근하여 필요한 정보를 조회하고 분석하는 규제 기관, 연구자, 기업 등을 포함합니다. 그러나 이들은 블록체인에 직접적인 영향을 주지 않으며, 블록체인 데이터를 사용하여 보고서 작성, 분석, 추적 등의 작업을 수행합니다.
POW 의 writer 는 채굴자, POS 의 writer 는 validator 라고 볼 수 있다.
Reader 는 블록체인의 데이터에 접근하는 사람으로써, 주로 일반인이라고 볼 수 있다.
이 논문에서는 permission 에 대해 아래와 같이 정의한다.
Permissioned 는 허가된 참여자만이 해당 블록체인을 쓰고 읽을 수 있는 블록체인 유형입니다. 이는 블록체인 네트워크에 참여할 수 있는 개체들이 사전에 허가를 받아야 함을 의미합니다. 따라서, 허가된 참여자만이 블록체인에 쓰기 및 읽기 권한을 가집니다.
Permissionless 또는 Public 블록체인은 누구나 익명으로 참여할 수 있으며, 참여자의 신뢰 없이도 작동할 수 있는 개방형 네트워크입니다.
permissioned 는 허가된 참여자만이 노드를 운영할 수 있다.
대표적으로 PBFT 알고리즘을 사용하는 Klaytn.
permissionless 는 누구나 노드를 운영할 수 있다.
대표적으로 비트코인과 이더리움.
여러명이 한 과정에 참여하고 있을 때, 한명에게 권한을 위임하고 있고
서로 신뢰를 할 수 없을때 블록체인을 사용한다.
아래의 알고리즘으로 블록체인을 사용할지 안할지, 한다면 어떠한 블록
체인을 사용할지 판단할 수 있다.
- 상태를 저장할 스토리지가 필요한가?
- Writer 가 여러명인가?
- 항상 믿을만한 데이터관리를 위임하고, 위임받은 자가 항상 온라인 상태인가?
- 모든 Writer 를 알고있는가?
- 모든 Writer 를 신뢰할 수 있는가?
- 모든 거래 내역을 공개할 필요가 있는가?
아래는 블록체인과 중앙화된 db 를 비교한 표다.
중앙화된 db 은 매우 빠르고 효율적이지만, 중앙화된 관리체계를 갖고있으며,
퍼미션리스 블록체인은 느리지만, 누구나 writer 가 될 수 있으며 탈중앙적 성격을 갖고있다.
퍼미션드 블록체인은 위 두개의 장점과 단점을 둘다 갖고 있지만, 결정적으로 허가된 참여자만이 writer 가 될 수 있으므로 탈중앙적 성격을 갖지는 못하였다.
블록체인을 사용하지 않아도 되는 서비스를 블록체인을 이용해서 한다면,
효율적이지 못해 금방 도태될 것이라고 생각한다.
그래서 만약, 생각하고 있는 아이디어가 있다면 위 알고리즘을 이용해서
내가 사용할 블록체인을 사용해야 하는지? 사용해야 한다면, 어떤 블록체인을
사용하면 되는지에 대해서 정확히 파악하고 진행해야 할 것이다.