coplit
Callback을 인수로 받는 정렬
- 정렬함수의 매개변수로 callback을 선언한다.
- 해당 콜백함수가 인자로 들어오지 않을때도 정상 작동해야하므로 default 값을 지정해줘야 한다.
- default는 해당 값을 그대로 반환해주는 함수로 한다.
- 재귀적으로 호출할때도 callback을 그대로 넣어줘야함을 잊지 말기
const sort(arr, callback = (elem) => elem) {
}
분산원장 1
알아야 할 내용
분산DB, 분산원장, 세그윗, 머클트리
분산 데이터베이스와 분산 원장에 대해 이해할 수 있다.
- 분산 데이터베이스의 특징과 장단점을 이해할 수 있다.
- 분산 데이터베이스의 대표적 기술인 클러스터링, 레플리케이션, 샤딩을 이해할 수 있다.
- 분산 데이터베이스와 블록체인의 차이점을 이해할 수 있다.
- 분산 원장 기술에 대해 이해할 수 있다.
세그윗의 동작 방식을 이해할 수 있다.
- 세그윗이 등장한 배경을 이해할 수 있다.
- 세그윗이 어떤 문제를 해결했는지 이해할 수 있다.
머클트리의 동작 방식을 이해할 수 있다.
- 블록체인에서 머클트리가 어떻게 동작하는지 이해할 수 있다.
분산DB와 분산원장
분산 데이터베이스
분산 DB의 특징, 투명성(Transparency)
블록체인과 유사하지만 엄밀히는 다르다.
- 물리적으로 분산된 노드들을 마치 하나의 시스템인 것 처럼 사용할 수 있게 해주는 시스템
투명성(Transparency) 제공
투명성의 종류는 다음과 같다.
- 병행 : 다수의 트랜잭션의 결과가 일관됨
- 장애 : 장애 발생의 원자성
- 지역사상 : 지역과 관계없이 접근 가능
- 위치 : 스토리지상의 물리적 저장위치가 아닌 논리적 입장에서 데이터에 접근 가능
- 중복 : 물리적으로 중복 저장된 데이터도 처리 가능
- 분할 : 물리적으로 분할저장된 데이터를 하나의 논리적 단위로 사용 가능
분산 데이터베이스의 대표적 기술
클러스터링, 레플리케이션, 샤딩
클러스터링
- DB 스토리지 앞단의 서버를 다중화 하는 기술
- 성능 및 가용성 증가
- 스토리지단의 병목발생 가능, 서버 운용에 추가적인 비용
레플리케이션
- 서버와 스토리지를 다중화 하는 방식
- Master/Slave를 구분하여 master는 write, slave는 read만 처리하는 것으로 운용가능
- 읽기/쓰기 성능이 향상됨.
- master 노드는 단일 장애점, 노드간 동기화 문제 발생
샤딩
- 검색성능을 향상시키기 위해 테이블을 분할하는 기술
- 서버의 수평적 확장이 가능, 쿼리 지연시간의 단축
- 부적절한 분할은 성능을 저하시킴, unsharding은 어렵다.
샤딩의 종류
- 해시 샤딩 : 단순 해싱을 통한 재배치, 단순하지만 확장성이 떨어지며 효율성이 보장되지 않음.
- 다이나믹 샤딩 : Locator 서비를 활용해서 샤딩, Locator 유지의 오버헤드, 단일 장애점
- 엔티티 그룹 샤딩 : 트랜잭션과 DB의 특성을 고려하여 연관성이 높은 데이터끼리 그룹핑해 샤딩
분산 데이터베이스의 장단점
투명한 분산구조, 투명한 트랜잭션
분산 데이터베이스의 특징(요구사항)
- 투명한 분산 : 사용자 입장에서 마치 분산되어 있지 않은 것처럼 시스템이 동작해야 함. 따라서 구현이 복잡하다.
- 투명한 트랜잭션 : 트랜잭션이 하나의 노드에만 진행되는 것 처럼 그 결과가 모든 노드들에 대해 동일하게 적용되어야 한다. 당연히 알고리즘이 복잡해진다.
장점
- 조직 구조 반영 가능
- 중요한 데이터의 DR 가능, 단일 장애지점의 제거
- 설계에 따라 성능 향상됨
- 모듈화
단점
- 하드웨어와 DBMS의 설계가 복잡하여 구현 및 관리비용 비쌈
- 분산 DB간 네트워크 보안도 고려해야 함.
- 불완전하고 미성숙해 아직 표준이 없으며 실 사용 사례가 적다.
- 동시성 제어가 매우 중요하다.
분산 데이터베이스와 (퍼블릭)블록체인의 차이점
악의적 사용자, 거버넌스의 주체, 단일 노드의 영향력
악의적인 사용자
- 악의적인 사용자란 네트워크의 장애를 유발하기 위해 유효하지 않거나 조작된 트랜잭션을 실행하는 사용자를 말한다.
- 분산DB는 성능향상을 위해 악의적인 사용자의 참여를 전제하지 않는다.
- 블록체인의 경우 누구나 네트워크에 참여가능하므로 악의적인 사용자를 가정한다. 대신 악의적 행위에도 네트워크가 정상 작동할 수 있는 합의 알고리즘을 채택하여 이를 방지한다.
네트워크 운영의 단일 주체
- 분산DB는 정부, 기업, 컨소시엄등 특정 단체의 정책이나 규칙에 종속적이다. 분산DB 운영의 의사결정은 분산되어있지 않다.
- 블록체인은 특정 노드가 네트워크에서 이탈해도 네트워크는 다른 노드에 의해 정상적으로 작동해야 한다.
요약 : 블록체인은 특수한 조건을 만족하는 분산DB(또는 원장)의 일종이다.
분산원장 기술
중앙집중형 원장, TTP, 분산원장, 합의 알고리즘
Centralized Ledger
- 일반적인 저장방식, 중앙 서버에 모든 기록을 보관한다.
- 신뢰할 수 있는 제 3의 기관(TTP)이 거래내역을 관리, 사용자는 TTP를 신뢰
- TTP에 무한종속적, TTP 유지에 대한 비용으로 사용자는 수수료 지불
Distributed Ledger(Shared Ledger)
- 거래 정보를 P2P 네트워크의 모든 참여자가 공동으로 기록, 저장, 갱신함
- 모든 참여자는 원장을 갱신할 수 있는 권한과 책임 있음
DLT 장점
- 효율성 : TPP 유지에 따른 오버헤드 없음
- 보안성 : 중앙 서버가 없어 해킹으로부터 안전
- 안정성 : 단일 실패점 없음
- 투명성 : 모든 거래기록이 보존됨
DLT 단점
- 악의적인 참여자의 행위를 방지할 수 있는 알고리즘이 필요
- 비트코인 등장 이전까지 합의 알고리즘의 부재로 실제 구현될 수 없었음.
세그윗
세그윗이란?
세그윗, 비트코인 개선방안, 블록생성주기, 하드포크
등장배경
- 비트코인의 블록생성주기는 10분
- 거래를 완료하기 위해서는 6개의 블록이 생성되어야 됨. 따라서 60분이 지나야 거래가 완료됨
- 비트코인의 블록용량은 1MB에 불과해 블록당 삽입되는 트랜잭션의 양이 제한적
- 따라서 비트코인의 속도와 확장성을 증가시키기 위한 시도가 있었음
속도와 확장성 개선 방안들
- 블록의 크기 또는 가용용량 늘리기
- 블록체인 기술 도입 (샤딩 등)
- 블록체인 외부와 연계 (레이어2 솔루션)
- 합의알고리즘 재설계
세그윗
- 블록용량의 75%를 차지하는 서명데이터를 분리하여 블록의 가용용량을 늘리는 것.
- 확보된 가용용량에 더 많은 트랜잭션을 담을 수 있음
- 블록내부에 머클루트 형태로 저장된 서명을 별도의 저장공간에 보관하게 됨
- 2017년 8월 소프트포크 형식으로 세그윗 진행
- 세그윗에 반대하는 세력이 블록크기를 8MB로 늘리면서 하드포크한 코인이 비트코인 캐시
세그윗의 특징
확장성, 거래 가변성 문제, 버전 호환, 소프트 포크
거래속도와 확장성
- VISA 24,000 TPS vs Bitcoin 7 TPS
- 실생활에 사용하기 어려울 정도로 느린 비트코인 네트워크의 속도를 향상시키기 위해 도입
거래 가변성 문제
- TXID만 변경해서 새로운 거래를 만들어 낼 수 있는 일종의 버그
- 세그윗 이후 서명이 트랜잭션 데이터의 일부가 아니므로 서명조작이 불가능해짐.
하위 호환성 보장
- 소프트웨어의 업그레이드 하지 않아도 세그윗 이전과 이후 버전을 모든 노드에서 활용가능
- 소프트포크
결론
- 디지털 서명 데이터 분리를 통해 블록의 실질크기 4MB
- 블록에 저장되는 트랜잭션이 많아지므로 TPS 증가
- 서명과 트랜잭션을 분리함으로써 트랜잭션 가변성 문제 해결함.
머클트리
머클트리와 무결성 보장
머클트리, 머클루트, 무결성, 충돌저항성
정의
- 개별 데이터를 의미하는 리프 노드로부터 트리를 거슬러 올라가면서 단계적으로 해시함수를 적용해서 머클루트인 단 하나의 해시값을 만들어내는 자료구조
- 쉽게 말해 리듀스가 적용된 해싱
- 이진트리만 가능한가?
작동방식
- 해시함수의 충돌저항성이란 다른 입력값에 대해 동일한 출력값을 가지지 않음을 의미
- 아래처럼 계층적 해싱하면 해시함수의 충돌저항성으로 인해 d1~d4 중 조금만 변화해도 결과가 크게 달라진다.
- 이러한 성질로 머클루트의 값을 비교함으로써 데이터 무결성을 확인할 수 있다.
const merkleRoot= hash(
hash(hash(d1), hash(d2)),
hash(hash(d3), hash(d4)),
)
- 그림으로 표현한 모습
블록체인에서 머클트리를 사용하는 방법
블록 = 블록해시 + 블록헤더 + 트랜잭션들
블록해시 = sha256(블록헤더)
블록해더 = 이전블록해시 + 버전 + 난이도 + 타임스탬프 + 논스 + 머클루트
머클루트 = sha256(sha256(sha256(tx1), sha256(tx2)) + sha256(sha256(tx3) + sha256(tx4)))
- 참고로 새로운 블록은 다음과 같이 생성됨
- 이런 식으로 특정 블록에 들어있는 트랜잭션을 단 하나라도 변경하는 경우, 블록은 체인처럼 모두 연결되어 있기 때문에 해당 블록 이후에 연결된 블록을 모두 수정해야 합니다.
- 하지만 트랜잭션이 들어간 블록 이후 6개 정도의 블록이 추가로 생성되어야 해당 블록의 트랜잭션이 finalize 된다. 그래서 거래가 완료(최종승인)되기까지 60분이 걸린다.
- 블록의 논스값을 찾는 데 10분정도 걸리기 때문에, 트랜잭션을 하나 수정하기 위해서는 연결된 모든 블록의 논스값을 다시 찾는 것은 매우 비용이 많이 들 것입니다. 따라서 블록체인에 올라간 데이터를 수정하는데 많은 비용이 들기 때문에, 위변조를 하기 매우 어렵습니다.
머클 패트리샤 트리
- 이더리움에서 사용함.
- 나중에 공부~