dev/Solidity

2. Mint your own NFT collection and ship a Web3 app

_April 2022. 2. 20. 01:06

https://app.buildspace.so/projects/CO961ddb5f-f428-4608-9949-a9a2f461eb3f

 

buildspace

Start building cool web3 projects, earn NFTs, access secret work opportunities in crypto.

buildspace.so

 

메마 지갑 연결, 트젝, 펀딩등을 해보았으니 nft민팅 차례이다

 

이과제는 3단계로 이루어졌다.

1. NFT 로직관련 스마트 컨트랙트 짜기

2. 스마트컨트랙트 deploy

3. 프론트에 컨트랙트 연결하기

 


예제는 오픈제플린 erc721을 사용한다

근데 요새는 아주키가 만든 erc721a를 사용하는게 대세

 

 

 

Solidity 개념

상태변수 (State Variable)

상태 변수는 DB안에 있는 데이터처럼, 컨트랙트 저장소(이더리움 블록체인)에 영구적으로 저장되는 변수를 의미한다. 

pragma solidity ^0.4.19;

contract ZombieFactory {

	uint a = 1;
}

tokenUri 는 links to a JSON file called the metadata

오픈씨 기준을 맞출것

컨트랙/오픈씨/레리블 테스트 조회

https://rinkeby.etherscan.io/

https://testnets.opensea.io/

  1. Head to rinkeby.rarible.com.
  2. Create this url: https://rinkeby.rarible.com/token/INSERT_DEPLOY_CONTRACT_ADDRESS_HERE:INSERT_TOKEN_ID_HERE.

json 바로 디코딩해서 nft 보여주는사이트

https://nftpreview.0xdev.codes/


NFT데이터 저장법

1. url - 쿨캣이 이렇게하지만 json/이미지 서버에 문제가 생기면 내려감

2. on chain - Loot가 이렇게함. 이더리움체인이 사는한 영원하나 저용량만 가능

 

온체인시 SVG를 사용한다

json 데이터는 링크 대신 base64 인코딩을한다

 

data:application/json;base64,베이스64인코딩내용

_setTokenURI(newItemId, "data:application/json;base64,ewogICAgIm5hbWUiOiAiRXBpY0xvcmRIYW1idXJnZXIiLAogICAgImRlc2NyaXB0aW9uIjogIkFuIE5GVCBmcm9tIHRoZSBoaWdobHkgYWNjbGFpbWVkIHNxdWFyZSBjb2xsZWN0aW9uIiwKICAgICJpbWFnZSI6ICJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSEJ5WlhObGNuWmxRWE53WldOMFVtRjBhVzg5SW5oTmFXNVpUV2x1SUcxbFpYUWlJSFpwWlhkQ2IzZzlJakFnTUNBek5UQWdNelV3SWo0TkNpQWdJQ0E4YzNSNWJHVStMbUpoYzJVZ2V5Qm1hV3hzT2lCM2FHbDBaVHNnWm05dWRDMW1ZVzFwYkhrNklITmxjbWxtT3lCbWIyNTBMWE5wZW1VNklERTBjSGc3SUgwOEwzTjBlV3hsUGcwS0lDQWdJRHh5WldOMElIZHBaSFJvUFNJeE1EQWxJaUJvWldsbmFIUTlJakV3TUNVaUlHWnBiR3c5SW1Kc1lXTnJJaUF2UGcwS0lDQWdJRHgwWlhoMElIZzlJalV3SlNJZ2VUMGlOVEFsSWlCamJHRnpjejBpWW1GelpTSWdaRzl0YVc1aGJuUXRZbUZ6Wld4cGJtVTlJbTFwWkdSc1pTSWdkR1Y0ZEMxaGJtTm9iM0k5SW0xcFpHUnNaU0krUlhCcFkweHZjbVJJWVcxaWRYSm5aWEk4TDNSbGVIUStEUW84TDNOMlp6ND0iCn0=")

이렇게 넣으면됨

 

여기서 랜덤화 하는법

random(string(abi.encodePacked("FIRST_WORD", Strings.toString(tokenId))));

The actual string FIRST_WORD and a stringified version of the tokenId. I combine these two strings using abi.encodePacked and then that combined string is what I use as the source of randomness.

근데 abi.encodePacked(a,b)라는 함수가 진짜 단순해서

 b = string(abi.encodePacked("hello", " world"));
    // b string: hello world

이정도라 이걸로안됨

 

 

 

ipfs

https://docs.ipfs.io/concepts/what-is-ipfs/#participation

 

What is IPFS? | IPFS Docs

What is IPFS? Let's just start with a one-line definition of IPFS: IPFS is a distributed system for storing and accessing files, websites, applications, and data. What does that mean, exactly? Let's say you're doing some research on aardvarks. (Just roll w

docs.ipfs.io

 

events (솔리디티)

https://docs.soliditylang.org/en/v0.4.21/contracts.html#events

 

Contracts — Solidity 0.4.21 documentation

Docs » Solidity in Depth » Contracts Edit on GitHub Contracts Contracts in Solidity are similar to classes in object-oriented languages. They contain persistent data in state variables and functions that can modify these variables. Calling a function on

docs.soliditylang.org

 

가스

https://ethereum.org/en/developers/docs/gas/