[TIL] Part2 - DAY50 Solidity - 블록체인 이론, ERC-721(NFT민팅)

박동우·2023년 5월 31일

블록체인 스쿨 3기

목록 보기
47/72

[TIL] 2023-05-31 DAY50


Solidity

GIT 주소 : https://github.com/dowoo303/SOLIDITY


오늘 배운것들

  1. 블록체인 이론
    1) 시험 대비
    2) 논문: https://eprint.iacr.org/2017/375.pdf
  2. ERC-721 실습
    1) NFT 민팅

각종 팁

회고

  1. 또또 ","같은거 json에 빠뜨려서 오류 일으킴
    -> 두번 세번 확인하고 빨간줄 나오는건 무조건 들여다보기



💻 Solidity 코딩

✅ 블록체인 이론 시험 대비

  1. 블록의 정의
    일정량의 데이터를 담아놓은(거래정보와 메타데이터를 바디와 헤더에 담은) 기본적인 단위
    거래정보를 담고있는 기본 자료구조
  1. 블록의 구조
  • 헤더: 헤더의 머클루트 해쉬
  • 바디: 메타데이터, 거래내역
  1. 블록을 특정할 수 있는 요소 두가지
    블록의 번호
    블록헤더 해쉬값
  1. 블록체인 정의
    탈중앙화된 네트워크 시스템에서 작동하는 분산원장 기술
  1. 7가지 특징중 3가지 설명
    익명성, 추적가능, 무신뢰, 분산원장, 탈중앙화, 합의알고리즘, 변경 불가능성
  1. 블록체인에는 두가지 종류의 참여자가 존재 각 이름과 역할을 설명
  • 리더 (읽는 사람, 일반 사용자)
  • 라이터 (쓰는 사람, 채굴자)
  1. 블록체인의 종류는 몇가지? 6번을 기준으로

    퍼미션 리스: 채굴자(reader)가 잘 알려져 있지 않음
    퍼블릭 퍼미션드: 채굴자가 알려져 있으며, 공증이 필요함
    프라이빗 퍼미션 리스: 사실상 없음
    프라이빗 퍼미션드: 채굴자가 알려져 있으며, 공증이 필요하지않음
  1. 7번의 종류 기준
  • 리더의 access를 제한 public vs private
  • 리더 or 라이터의 access 를 제한 하느냐 마느냐 : permissionless vs permissioned
  1. 7번의 예시
    비트코인 이더리움
    이오스
    없음
    하이퍼레저 패브릭
  1. 탈중앙 중앙
    옳은정보를 결정하는 노드의 유무
    그래서 중앙화와는 다르게 책임과 권리가 분산된다
  1. 채굴이라는 행동의 각 목적
    사용자 - 거래가 성립됨
    채굴자 - 경제활동이 가능
    네트워크(시스템) - 체인유지 및 발전 가능
  1. 합의알고리즘이 필요한 이유
    탈중앙화 네트워크에서는 옳은 정보를 결정하는 주체가 없기 때문에 다수의 노드들이 다수결로 참여
  1. 논스 블록해쉬 타겟값 설명하기
    논스가 변경되면 블록해쉬가 변경되고 블록해쉬가 타겟값보다 낮은 점수가 나오면 채굴
  1. 채굴자 보상 2가지
    블록보상, 거래수수료
  1. 거래 구성요소 4가지
    송신자 수신자 전송량(보내는 비용) 수수료비용
  1. 빈칸채우기
    (블록)(블록체인)(블록용량제한)(수수료가 높은 거래를 먼저)
  1. 머클루트 머클트리 구성
    각 3개 6개 11개 일 때 머클트리 구성해보기
    머클루트 6개 예시

    -> 짝이 없으면 자기복사
  1. 채굴자의 보상 알아보기
    1) 블록보상 5에 더하여 수수료 3가지 더하기
    2) 거래 후 잔고는?(보내는 양+수수료 감소, 받는 사람은 보내는 양만, 수수료는 채굴자에게)
    3) 채굴자에게 남은 수수료
  1. 지갑의 용도
    개인키 공개키를 보관하는 곳
  1. 개인키 공개키 용도
    돈을 보낼 때 개인키를 이용하고, 돈을 받을 때는 공개키를 이용한다
  1. 암호화 복호화 목적
    암호화는 평문을 암호화하여 가리기 위함이고, 복호화는 평문을 읽기 위해 다시 평문으로 복호화하기 위해 사용한다.
    평문-> 암호, 암호-> 평문
  1. 단방향 암호화, 양방향성 암호화 설명
    단방향은 암호화만 가능하고 복호화가 불가능하며, 양방향성 암호화는 복호화가 가능하다.
  1. 양방향성 종류 2가지
    대칭키(공개키) 비대칭키(비공개키)
    같은키, 다른키
  1. des(과정)
    받는 사람과 보내는 사람이 공유
    평문
    암호화
    받는 사람의 키로 복호화
  1. res(과정)
    공개키 받음
    수신자가 개인키/공개키 생성 공개키 송신자에게 전달
    송신자는 공개키를 이용해 암호화
    수신자는 개인키를 이용해 복호화
  1. 자리수
    sha256의 자릿수
    2진수: 256자리
    16진수: 64자리
  1. 자리수
    sha512 자릿수
    2진수: 512자리
    16진수: 128자리
  1. 해쉬충돌
    다른 인풋을 넣었는데 같은 아웃풋이 나옴
    input은 무한한데, output은 정해져있어서 일어남
  1. 해쉬충돌이 일어날 수 밖에 없는 이유
    output은 16의 64개로 정해져있는데, input값은 무한하기 때문에 (비둘기집의 원리)
  1. 5명의 참가자 10 8 9 7
    가장 긴체인이면 10(a)가 옳다
    다수결이면 b c d가 옳다
  1. 컴퓨팅 파워
    1) 51퍼 공격에서 51퍼란?
    특정 네트워크 안에서 사용되고 있는 해시 파워 / 연산력 의 보유량 51% 의미
    2) 어떤 집단이 30% 컴퓨팅 파워를 가지고 있다. 블록채굴에 성공할 확률은? 30퍼
    3) 어떤 집단이 30% 컴퓨팅 파워를 가지고 있다. 두번연속 블록채굴에 성공할 확률은? 9퍼
    4) 75% * 75% = 56.25%
    5) 미공개
  2. 블록생성시간
    생성주기보다 빠르게 생성되면 난이도 증가
    생성주기보다 빠르게 블록이 생성되면 난이도는 올라간다
    생성주기보다 느리게 블록이 생성되면 난이도는 하락한다
    비트코인은 난이도가 변경되는 주기는 2주(14일) 2016블록마다
  1. 비트코인은 10분마다 한개씩 생성 2016개 블록마다(14일)
  1. 거래
    p2p kh: pay to public key hash
    두가지: 락킹 언락킹 스크립트
    p2sh : pay to sript hash
    앨리스가 받은 거래는 앨리스의 공개키로 락킹되어 있음
    돈을 보내고 싶으면 소유권을 증명한 상태에서 밥(상대방)의 공개키로 락킹 후 전송
    밥이 찰리에게 보내려면 개인키로 언락킹 스크립트를 풀어서 찰리의 공개키로 묶어서 보내줌
  1. UTXO들의 합


✅ ERC-721


이미지의 CID가 아닌 json의 metadata CID가 올라간다.

피나타에 그림과 json파일 올린 후, json파일 주소를 이용해서 remix에서 민팅 시도해보기.

피나타 주소: https://app.pinata.cloud/pinmanager

🟥 TEST10 코드

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";


contract Mint1_1 is ERC721Enumerable {
    string public URI;

    constructor(string memory _uri) ERC721("LikeLion721", "LL721_1") {
        URI = _uri;
    }

    // 만약 이 함수에 payable을 추가하면 돈을 받고 nft 민팅 가능해짐
    function mintNFT(uint _tokenID) public {
        _mint(msg.sender, _tokenID);            
    }

    function tokenURI(uint _tokenID) public override view returns(string memory) {
        return string(abi.encodePacked(URI, '/', Strings.toString(_tokenID), '.json'));     // 공통적인 부분 /, 숫자, .json 붙여주기
    }
}
profile
HELLO!

0개의 댓글