[TIL] 2023-05-31 DAY50
Solidity
GIT 주소 : https://github.com/dowoo303/SOLIDITY
오늘 배운것들
- 블록체인 이론
1) 시험 대비
2) 논문: https://eprint.iacr.org/2017/375.pdf
- ERC-721 실습
1) NFT 민팅
각종 팁
회고
- 또또 ","같은거 json에 빠뜨려서 오류 일으킴
-> 두번 세번 확인하고 빨간줄 나오는건 무조건 들여다보기
💻 Solidity 코딩
✅ 블록체인 이론 시험 대비
- 블록의 정의
일정량의 데이터를 담아놓은(거래정보와 메타데이터를 바디와 헤더에 담은) 기본적인 단위
거래정보를 담고있는 기본 자료구조
- 블록의 구조
- 헤더: 헤더의 머클루트 해쉬
- 바디: 메타데이터, 거래내역
- 블록을 특정할 수 있는 요소 두가지
블록의 번호
블록헤더 해쉬값
- 블록체인 정의
탈중앙화된 네트워크 시스템에서 작동하는 분산원장 기술
- 7가지 특징중 3가지 설명
익명성, 추적가능, 무신뢰, 분산원장, 탈중앙화, 합의알고리즘, 변경 불가능성
- 블록체인에는 두가지 종류의 참여자가 존재 각 이름과 역할을 설명
- 리더 (읽는 사람, 일반 사용자)
- 라이터 (쓰는 사람, 채굴자)
- 블록체인의 종류는 몇가지? 6번을 기준으로

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

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