- Bitcoin: A Peer-to-Peer Electronic Cash Sys 논문 읽기
- 비트코인 논문 읽은 후 더 공부가 필요하겠다고 생각하여 주요개념(비트코인 블록의 구조, 작업 증명, 지갑과 지갑 종류, 거래의 구조, 비트코인 노드 종류) 나눠서 조사 후 2회에 공유하기로 함
- 인프런 강의(1. 인트로, 2. 기존 블록체인 플랫폼의 약점, 3. 클레이튼 이해하기) 수강
- 인프런 강의(블록체인과 솔리디티) 수강 후 투표앱 코딩
- 클레이튼 공부도 더 필요하다고 생각하여 클레이튼 docs 나눠서 읽고 3회차에 공유하기로 함
- 3회차에 이더리움으로 구현한 투표앱을 클레이튼으로 구현하기로 계획되어있었으나 클레이튼이 솔리디티 기반이라 변하는게 없는 것 같아 클레이튼 docs tutorial에서 klaystagram을 구현하기로 계획 변경함
이더리움 : 블록체인 플랫폼. 스마트 컨트랙트를 작성할 수 있음
스마트 컨트랙트: 블록체인 상에 존재하는 계약서. 블록체인 내에 들어감. 솔리디티로 작성할 수 있음.
DApp(Decentralized Application)
- privacy : 데이터 조작이 불가능하므로
- 트랜잭션 비용: 트랜잭션을 실행시킬 때 gas 비용 발생. 매번 변하는 gas와 수수료는 부담
- 트랜잭션 속도 : 중앙화된 시스템에 비해 느림. 1초에 2000개. 이더리움은 1초에 20개를 처리할 수 있다고 알려져 있음. 이
- 블록 사이즈 : 모든 채굴자가 모든 블록을 가지고 있어야하기 때문에 (2기가)
따라서 중앙화되어야하는지 탈중앙화되어야하는지 잘 생각해봐야함
스마트 컨트랙트를 만들기 위한 언어. 고수준 언어. EVM(ethereum virtual machine)을 타겟으로 디자인
특징
- 튜링완전 : 반복문과 제어문 사용 가능
- msg.sender: 메시지를 보낸 사람, msg.value : 메시지 보낸 값
// 1. 컨트랙트 선언
contract Sample {
// 2. 상태 변수 선언
uint256 data;
address owner;
// 3. 이벤트 정의
event logData(uint256 dataToLog);
// 4. 함수 변경자 정의
modifier onlyOwner() {
if(msg.sender != owner) revert();
_;
}
// 5. 생성자
function Sample(uint256 initData, address initOwner) {
data = initData;
onwer = initOwner;
}
// 6. 함수(메소드) 정의
function getData() returns (uint256 returned) {
return data;
}
function setData(uint256 newData) onlyOwner {
logData(newData);
data = newData;
}
}
데이터 타입
string(utf-8로 인코딩), bytes12
mapping : 키와 value의 쌍
동적배열과 정적배열 모두 사용 가능.
인터페이스 사용 가능
데이터 위치
storage - 상태변수, 로컬변수 (블록체인에 저장)
memory - 로컬변수 (사용 후 증발)
가시성
누가 접근할 수 있는지를 정의할 수 있음
external - this.f()를 통해 호출
public - 모든 방법으로 접근 가능
internal - 내부적으로만 접근 가능. this 사용 불가능
private - internal과 비슷하지만 상속된 contract에서 사용 불가능
가스
- 가스 리밋 : 수수료의 한계치. 낮게 설정하면 일을 끝마치기 전에 수수료를 다 쓰면 일을 취소시키고 수수료를 환불해주지 않음.
- 가스 프라이스 : 가스당 가격. 비싸지면 먼저 채굴되는 경향이 있음
- 가스 프라이스 * 가스 사용량 = 수수료
클레이튼
- 블록 생성 시간 1초
- 초당 트랜잭션 3000+
- 저렴한 트랜잭션 수수료
- 확장성 & privacy
- solidity, truffle framework 지원
기존 블록체인 플랫폼의 약점 : scalability(확장성)
TPS+block interval
TPS(transaction per second) : 초당 몇 개의 거래 처리
- visa tps 1700
- 비트코인 tps 7(현실적으로는 2~3)
- 이더리움 tps 12~20
block interval : 블록 생성 간격
- 비트코인 10분
- 이더리움 15초~20초
이더리움 20tps + 15초 block interval
20 * 15 = 300 transactions
tps가 10000 & block interval 10분이면? 재수없으면 친구한테 송금이 최대 10분 걸릴 수 있음.
기존의 블록체인은 왜 느린가?
참여하는 노드가 많아진다고 해서 더 빨라지는 것은 아니다 (원래는 서버를 늘림. 블록체인에서는 해당x)
모든 노드가 똑같은 일을 해야됨.
비트코인 & 이더리움
- 많은 양의 트랜잭션 처리하기 부족
- 네트워크 자체 속도 느림
기존 블록체인 플랫폼의 약점 : Finality : 거래가 변경 불가라는 합리적인 보장받기까지 기다려야 되는 시간
블록이 Final하다는 것은? 블록에 담긴 거래가 바뀔 수 없다는 걸 보증
비트코인과 이더리움은 최종성 부족
트랜잭션이 바로 처리되지 않음. 하지만 나중에 될 것이라는 확률론적 최종성만 제공(나중에 안되어있을 수 있음)
- 비트코인 블록 채굴 평균시간 10분. Finality까지의 평균시간 60분 (6번의 검증)
- 이더리움 블록채굴 평균시간 15초. Finality까지의 평균시간 6분(25번의 검증)
기존 블록체인 플랫폼의 약점 : Fork(블록들의 연결이 2개 이상의 분기로 나눠지는 현상)
pow(작업증명) 방식
- 블록체인에 블록 추가하기 위해 문제를 품(Hash값 찾기)
- 여러 노드가 같이 풀었다면 분기 발생
- 서로 풀었다고 알리게 됨. 각자 받은 블록이 다르게 됨. --> Longest chain rule
- 하지만 내가 전체 컴퓨터 파워의 51%를 가지고 있다면 더 많은 블록을 내가 채굴할 수 있음(악용 소지)
클레이튼 이해하기
-
합의(Consensus)
public 블록체인 : pow, pos 등등
private 블록체인: pBFT, Raft 등등
BFT(비잔티움 결함 허용)
- 참여 노드 수 제한/ 성능 높임
- 분산화 약화/ 투명성 저하
클레이튼 합의 알고리즘 IBFT(이스탄불 비잔티움 결함 허용)
- 공개를 통한 개인적인 합의 신뢰 모델
- 합의 달성 소수 private 노드와 블록 생성결과 접근 및 검증 노드로 구성되어있음
-
propose 노드 중 하나가 proposer로 선정
-
pre-prepare proposer노드가 블록을 만들어서 다른 노드들에게 제안하게 됨.
-
preparer 검증자 노드들이 proposer에게 메시지를 받으면 자신을 제외한 다른 노드들에게 믈록을 잘 받았다고 메시지를 보내게 됨.
-
commit 블록을 수락할 것인지 다른 노드와 소통하면서 결정함. 괜찮다고 생각한는지 각자 응답을 보냄. 만약 3분의 2이상이 합의했으면 블록 승인을 하게 됨.(Finality 결정)
- 장점 : 노드들끼리 합의하게 됨
-
블록 생성 사이클(cycle)
- 블록 생성 주기 = 라운드(round)
- 블록 생성 간격 약 1초
제안자와 위원회 선택
- 제안자를 무작위 & 결정적으로 Governance Council 노드들 중 뽑음
- 각각의 합의 노드가 가장 최근의 블록 헤더에서 파생된 난수 사용 자기가 라운드에 선택됐는지 증명함
- 제안자라는 것을 증명하기 위해 제안자의 공개키 통해 입증가능한 암호 증명을 사용
- 누가 제안자고 누가 위원회인지 파악이 되면 제안자가 블록 만들고(tx pool에서 선택) 합의
블록 전파
- 위원회의 3분의 2 이상의 합의를 받아야 블록 생성
- 프록시 노드 통해 엔드포인트 노드들에게 전달됨
-
네트워크 구조
CNN: Consensus node network
- cn은 서로 연결되어있음. 합의 과정에서 최대한 빨리 커뮤니케이션을 하기 위해. cn은 외부와 직접적으로 접촉 불가능함. 접근은 core cell 참여자로써 proxy node를 내세움
PNN: Proxy node network
ENN: Endpoint node network : core cell network와 연결되어있음. 아무나 en가 될 수 있음.
core cell network
CN bootnode
PN bootnode
EN bootnode : 어떤 프록시 노드와 연결해야할지 정보 제공
-
코어 셀(core cell)
사용자가 많아져서 확장이 필요할 때
- 일반적 : 서버늘리고 request 분할 처리
- 노드가 늘어난다고 성능 늘어나는 것 x
- 클레이튼 : 노드 자체의 성능(램, cpu 등)을 늘림
CN(합의 노드) 참여 조건
- physical core가 40개 이상
- 256기가 램
- 1년치 데이터 약 14테라바이트 저장
- 10g 네트워크
Core cell 구조 : 하나의 CN과 여러 대의 pn으로 이루어짐
- cN은 연결에 필요한 자원이 한정적.
- pn을 이용해서 endpoint와 연결(cn은 이 연결때문에 합의에 문제생기면 안됨)
-
서비스 체인
메인넷과 분리되어 운용되는 서비스 체인
언제 쓰이나?
- 특별한 노드환경에서 설정
- 보안 수준 맞춤형으로 설정
- 많은 처리량 요구/메인넷 배포시 경제성 낮음
독립된 서비스 공간을 구축해서 필요할 때 메인넷에 신뢰를 고정
서비스 체인에서는 gas 비용 안받게 설정 가능함
-
이더리움과 클레이튼 차이
이더리움
- 단일 네트워크(누구나 블록 생성 가능)
- 가장 먼저 블록을 만들고 많이 전파해야함
- PoW(작업증명)
- 마이닝 노드 : 블록을 쓰고 네트워크에 전파한 노드
- 어떤 노드든 채굴할 수 있어 최대한 많이 연결시켜야함
클레이튼
- Two layer architecture trust model
- 매 라운드마다 합의 노드들 중 하나가 뽑혀서 블록을 씀
- cn이 블록을 생성하기 때문에 endpoint가 core cell에 붙음