본문 바로가기
카테고리 없음

블록체인 책 읽고 정리

by 흥뷰자 2022. 7. 25.

1. 인트로

주목해야 하는 이유 

:  처음에 핀테크(금융분야의 혁신)를 지원하는 핵심 기술로 응용될 것으로 보았지만(송금, 결제. 증권 거래 등) , 
최근에는 광고, 유통 효율화, 지적재산권 관리, 유휴시설 공유, 각종 법적 신고 등기 처리 등 다양한 분야에 사용 가능성 보이고 있음

 

한문장으로 블록체인은

: 올바른 것만 기입, 변경 혹은 삭제 변조 불가능, 중된되지 않고, 모두 합의한 내용만 유효하다고 인식되는 네트워크 공유형 데이터베이스. (기존의 데이터베이스 기능을 강화) 

 

블록체인에 무엇을 기록하고 싶은가, 기록해야하는가

:  확증이 필요한 사실정보, 계약

 

2. 정의

: 대규모 노드 사이에서 각 노드에 분산된 장보의 데이터가 항상 있게 하는 합의 수렵 알고리즘  (위키백과)

 

잘못된 사실을 기록할 수 있는 참여자가 있다면 제대로 합의한 것인가?

: 합의를 이끄는 구조가 존재. 분산 저장된 장부의 데이틑 항상 있게 하는 합의는 시간이 지날수록 합의가 뒤집히기 어려워지는 구조. 변조하면 합의에 들어올 수 없고, 중단없는 분산 데이터로 같을 수밖에 없는 구조. 넓은 의미의 블록체인은 분산원장기술

 

분산원장 기술

: 여러가지로 구현됨 - 하이퍼레저, 코다, 인터레저 등.. 

 

블록체인이 데이터베이스와 다른 점

: 정보를 기록하는 점에서는 갖지만, 차이가 많음 

데이터로는 참여자가 확인한 규칙에 따른 서식만 기록되고,

전원이 합의한 데이터만 유효하다는 약속으로 운용됨

변조하기 어려운 해시체인구조, 

수정은 손상으로 간주되어, 다른 참여자의 정상 데이터를 가져와 자동으로 복구함

기록 후 삭제나 수정 불가

누구도 시스템 전체를 중단시킬 수 없음 

 

무엇을 기록하냐

: UTXO(Unspent Transaction Output) 거래의 연속성 보장, 삼식부기의 데이터 구조로 구현되어

금융의 화폐, 증권 채권 기록

광고 유통분야의 포인트, 우표, 쿠폰, 티켓 기록

기타 권리이전, 순차제어 등 가치가 이전되는 기록에 모두 사용할 수 있지

*스마트 계약은 : 블록체인 기반으로 계약서를 사용하면 ? 계약 내용을 자동으로 이행하도록 만들면 어때? 라면서 발전시킨 시스템.

3. 기초개념

블록체인의 가치유통구조

: 블록체인 - 컴퓨터와 네트워크로 가치를 유통하는 구조. 화폐말고도 특정 장소에서만 유통되는 것들도 가치로 유통될 수 있지. 블록체인 안에서 유통되는 화폐는 현실 화폐와 달리 국가가 발행하지 않았다는 의미에서, 가상화폐 혹은 암호화폐. 

 

화폐의 조건

: 위변조 방지, 복사 불가능하게 

 

절대고장나지 않는 시스템

: 노드를 많이 놓고 네트워크에 열결해서, 노드가 같은 정보를 복사해서 공유. == 다중화 

다중화 기능에 의한 시스템이 분산시스템.

 

중앙이 없는 네트워크

 

4. 기초개념

블록체인에서 화폐를 교환하는 방법

: 공개키와 암호키에 대응하는 지갑주소로 주고받음. 개인정보 없이 == 누구나 지갑주소를 만들어서 사용할 수 있다.

블록체인의 특징 정리해보면

: 자율분산시스템/ 리더없는 구조/ 지갑주소/ 트랜잭션 - 제한적 용도로 사용하는 데이터베이스 

왜쓰는거지? 위변조없이 올바른 거래 내용이 이어짐을 수학과 암호학 기반으로 보장하기 때문. 

블록체인은 가치 유통을 기록하는 기술이니까 트랜잭션(거래)만 기록하지만 최근에 트랜잭션과 함께 수십바이트 짧은 문자열 보낼 수 있다는 특징을 이용해 스마트계약(프로그램)을 실행하거나 암호화폐 이외의 다양한 애플리케이션 개발가능하다.

 

5. 블록체인의 종류

프라이빗과 퍼블릭 - 네트워크에 참여한 노드 수에 제한을 두는지에 따라 차이가 나며 합의 시스템도 달라진다. 퍼블릭은 노드를 운용하는 사람(마이너)에게 직접 주는 구조가 대부분이다. 직접 노드를 운용하지 않고 트랜잭션 수수료만 지급해도 돼서 애플리케이션 등에 활용 가능하다.

프라이빗은 다수결방식의 합의 알고리즘이라 노드운영자에게 보상이나 트랜잭션 수수료를 줄 필요가 없다. 트랜잭션이 아무리 많아도 수수료가 0이다. 참여자가 노드를 스스로 관리하니까 노드 운용에 많은 비용이 들 수 있다.

같은 이더리움이더라도 퍼블릭 체인기반으로 운용되는 것도 있고, 프라이빗 체인기반으로 운용되는 것도 있다.

 

6. 블록체인의 장단점

: 참여자가 승인한 정보만 기록한다. 영구적으로 동작하고, 서비스 제공자나 시스템 관리자도 데이터 변조 불가능.  따라서 서비스 제공자 신뢰도가 낮아도 안심하고 서비스를 이용할 수 있따. 신뢰하지 않는 사람 사이의 거래도 문제가 발생하지 않는다. 

많은 노드가 기록된 데이터를 저장하고 공유하고 삭제하지 않기 때문에 개인정보는 담지 않는다. 효과적인 블록체인 서비스를 구축하려면 분산 저장 장치 등의 외부시스템과 연동해서 운영되어야 한다.


7. 블록의 발행과 계획

비트코인은

: 분산원장(블록체인)을 구현한 최초의 가상화폐시스템. 2009년 제네시스 블록 이후 현재까지 20기가정도의 블록이 누적되어 있다. 

전체 발행량이 초기부터 정해져있으며, 생성은 채굴(연산경쟁)을 통해 블록을 발견(생성)할 때마다 보상으로 정해진 비트코인을 준다. == 채굴에 성공한 사람은 고정된 수의 비트코인을 신규발행할 권리를 얻는다 == 블록 하나를 만들 권리를 얻는다.

제네시스 블록의 트랜잭션 내역은 50BTC 발행. 21만 블록마다 보상은 반으로 줄어들고 현재까지 90%가량이 채굴됨(발행됨). 트랜잭션 수수료<= 보상 일때까지 작동하겠지.

현재 유통되는 비트코인은 채굴자가 얻은 것을 일반인들이 사고파는것 

 

8. 비트코인인과 전자화폐

: 둘다 디지털 화폐로 가치가 전달되는 것이지만, 원칙상 관리자가 존재하느냐 여부가 차이다. 

비트코인은 어디에 보관하나

: 블록체인에 기록된 숫자. 지갑, 주소상 보관됨. 

 

9. 비트코인 처음 사용

: 달려를 환전하듯이 비트코인을 수수료를 내고 거래소에서 환전(구매)한다.  나의 비트코인지갑이 있어야 한다. 거래소에 나의 계좌를 만들고 지갑주소를 등록해야 한다.

 

10. 비트코인 지갑 

: 블록체인닷컴이나 코인베이스같이 지갑을 거래소에서 제공하는 거래소지갑으로 거래하는 지갑서비스나 웹지갑을 이용하든지, (한국 거래소 : 고팍스, 빗썸, 업비트, 코인원 등)

브래드월렛이나 마이셀리움 지갑 등을 통해 내 스마트폰에 비밀비를 저장하거나 종이지갑(주소생성기 walletGenerator.net)을 이용하는 방식으로 직접 지갑을 관리하는 방법이 있다. 

거래소지갑을 이용하는 경우 가입이라는 절차를 거치니까 잃어버리더라도 id 비밀번호 찾기 등을 통해 로그인이 가능하지만, 거래소의 서비스가 중단되면 이용할 수 없고 해킹의 위험에 노출될 가능성이 있다.

 

12. 비트코인 얻기

: 거래소에서 구입하거나, ATM을 통해 거래(Bitcoin ATM Map), 직접 채굴 노드를 마련해서 채굴에 참여

 

13. 비트코인 송금

: 내 지갑 비밀키(지갑주소비밀번호)와 송금받는 사람의 공개키(지갑주소)가 있으면 된다. 보통 QR코드 스캔을 통해 송금이 이루어진다. 지갑의 금액 확인은 비밀키를 가진자만 할 수 있으나, 거래내역은 비트코인에 기록되어 누구나 열람 가능하다.

 

14. 비트코인 위험성

: 비트코인은 퍼블릭체인이라 7천개 이상의 노드가 연결되어 운영되어 파산이나 서비스 중단위험은 0에 가깝지만, 개인정보가 연결되어 있는 것이 아니기 때문에 비밀키를 잃어버리면 그 안에 있는 비트코인을 영원히 찾을 수 없다. 비밀키가 노출되면 개인정보와 연결된 것이 아니기 때문에 비트코인이 도난된다. 

블록이 하드포크되는 경우 (블록하나의 최대 용량에 대한 기준과 같은 중요사항이 변경되는 경우) 호환되지 않는 새로운 분기가 발생하면 영구적인 분기를 의미하고, 송금이 제대로 이루어질때까지 확인해야 한다. (소프트 포크는 일시적으로 합의가 되지 않은 경우 분기했다가, 일정시간 후 블록 높이가 가장 큰 것으로 자연스럽게 합의됨) 

 

** 소프트 포크하는 경우 다른 쪽 체인에 기록되는 거래기록은 사라지는 것인가? 그런듯. 그래서 블록이 생성 완료가 되는 걸 확인해야 하는것. 그 최종 체인에 들어가는 것 까지가 블록 완성으로 보면 되는 것이군? 근데 생성된 블록이 사라질 수도 있음. 그렇군. 분기되는 경우 블록이 확정되기 전까지 사용이 불가능한 매커니즘이 있군. 

 

15. 비트코인과 블록체인

: 비트코인의 송금 == 블록체인에 트랜젝션이 발생

트랜잭션 흐름과 블록체인

: 블록체인은 암호화폐 거래 내용을 기록하는 전문 데이터베이스인데, 송금할 때 애플리케이션이 비트코인 네트워크에 트랜잭션을 보내면, 이 트랜잭션은 바로 블록체인에 가지 않고, 트랜잭션 풀에 임시 저장된다. 여럿의 채굴자는 트랜잭션을 블록에 기록하려고 채굴을 시도하는데, 이 중 한명이 성공하면 해당 블록이 비트코인 네트워크에 퍼진다 (Broadcast) == 블록체인 추가 성공 == 블록체인에 기록 완료. 

채굴 빈도는 10분에 한번 정도이기 때문에 채굴되기 전까지 송금은 엄밀히 완료되는 것이 아닌 상태라서 처리되었는지는 기다려서 확인해야 한다. 채굴자에게 지급되는 트랜잭션 수수료가 너무 싸면 트랜잭션 기록이 블록체인에 반영되지 않을 수 있으니까, 수수료를 높여 트랜잭션을 다시 보내면 블록체인에 반영될 가능성이 더 올러가겠지. 그래서 오프라인에서는 결제 완료 확인까지 기다리기가 어려워서 위험이 따른다.

거래소에서 비트코인을 관리하는 방법

: 거래소 지갑은 하나고 내부에 누구에게 얼마가 있는지는 내부 데이터베이스로 관리한다. 거래소 밖에서 안에 있는 누구에게 송금하려면 거래소 지갑으로 송금이 이루어지는 것, 거래 금액이 블록체인이 아니라 거래소 내부 데이터베이스에 기록하게 된다. 거래소 안에서 밖으로 송금하려면 내부개인별 데이터베이스에 기록하고 거래소 지갑에서 외부로 송금하게 된다.

블록체인뷰어

: (체인플라이어 chainflyer bitflyer.jp)에서 실시간으로 발생하는 트랜잭션 정보를 시각적으로 볼 수 있다. 블록체인 지갑주소의 잔액(input)에서 지갑주소별로 송금한 금액(output)도 확인가능하다. (차액은 수수료)

 


16. 암호화기술의 목적

: 인터넷으로 데이터를 교환하는 과정 노출 위험방지를 위해 암호화 처리.

단순한 비밀 교환을 넘어 접근권한을 제한하거나, 원본임을 보장하거나, 작성시점, 내용의 확인, 서명의 증명 등 다양한 목적으로 구현된다. 암호화를 통해 인터넷 생활이 가능하다. 

과거에 암호화는 카이사르암호(기원전, 특정 숫자만큼 알파벳 밀어서 읽기) 비즈네르 암호(16세기, 배치변경, 배열 표로 기록) , 이니그마(20세기 중반, 암호기계 이용) 모두 암호화, 복호화, 암호 푸는 키를 알리면 안되는 방식이었던데 반해

현대 암호화 기술은 수학이론에 기반하여 비밀로 해야하는 것은 개별키 자체이다. 보통 대칭키나 공개키 암호 방식(비대칭키)으로 나뉘고, 블록체인에서는 공개키 암호를 사용하는데, 그 중에서도 다른  공개키 암호방식보다 키 길이 짧은 타원곡선암호(RSA < ECDSA타원곡선 디지털 서명 알고리즘) 를 자주 쓴다. 

 

17. 공개키와 비밀키

: 공개키 암호 == 만든키와 푸는키가 다른 비대칭 암호화, 공개키로 만들고 그와 쌍이 되는 비밀키로 푼다. 슈퍼컴퓨터로도 무차별 탐색을 하더라도 해결에 수만년이 걸리는 수학적 난제에 기반한다.

공개키암호는 특정사람만 접근 가능한 구조(비트코인)를 만드는 데 적합한데 대칭키암호와 비교했을 때 계산 시간이 훨씬 오래걸려서 용량이 큰 데이터를 암호화 할 때 적합하지 않다.

보통 통신 암호화 과정(SSL/TSL) 구현 시 공개키를 그대로 암호키로 사용하지 않고, 대칭키 방식으로 문서를 암호화해서 일회성으로 대칭키를 주고받을 때 공개키로 암호화하거나 전자서명에 사용한다. 

 

18. 암호화의 보안 강도(암호키 생성하는 난수 생성법)

암호의 안전성은 난수 생성을 얼마나 잘하냐에 따라 결정된다. == 규칙성 없는 예측 불가능한 난수를 생성해야 하는데

컴퓨터가 생성한 난수는 사실 규칙이 있는 (유사)난수, 함수를 사용하니까  예측가능하고 재현가능. == 시드값을 알면 누구나 같은 난수를 만든다. == 공격이 쉽다. 

주사위던지기같은 아날로그방식으로 진짜 난수를 얻어야 한다. 실제로 난수를 생성할 때 사용자 커서의 임의 좌표 변화나, 스마트폰 기울기나 진동 변화로 시드값 생성하는 등 방법들이 있다.

 

19. 해시함수의 구조

: (단방향)해시 함수는 동일 입력값을 넣을 때 항상 같은 해시값을 반환하는 특성의 함수. 규칙성없어서 하나만 바뀌어도 전혀다른 값을 반환해서 예상 불가능. 해시의 뜻은 데이터를 동일 자리수의 데이터로 매핑함을 뜻한다. SHA-256(256비트) 알고리즘은 입력값이 몇 바이트이든 출력이 64자리의 16진수 반환. 텍스트뿐만 아니라 파일에도 적용가능한데, 내용 1바이트만 수정해도 해시값이 다르다. == 해시값이 같으면 해당 정보는 손상되지 않았음을 의미한다. 문서변조감지에 사용.

 

** hash("BlockChain") => "3a6fed5fc11392b3ee....." 0부터 9, a부터 f 까지 16개의 문자를로 표현해서 32개의 16진수 64자리로 표현. (2자리가 1개의 16진수. 16진수 하나당8비트, 4비트는 2^4 ==16가지표현, 그래서 16진수로 표현하는거수나..)

 

20. 해시함수의 약점 (충돌 저항성)

: 해시함수로 생성된 값은 고정 된 값을 생성하니까 자리수가 일정해서 용량이 큰 파일을 줄이거나 작은 파일을 일정 크기로 늘리면 반드시 문제가 발생한다. (알고리즘 발전중에 있음)

해시 함수는 여러가지가 있는데, 알고리즘마다 자리수가 다르고 입력에 대한 출력 해시값도 달라지지만 모두 입력이 같으면 항상 동일 출력을 한다는 점에서 같다. 

해시함수가 많은 이유는 보안을 강화하려고하는 것이고, 보안 강도는 충돌 저항성과 같은 의미다. 다른값을 입력했는데 같은 값을 반환하는 상황이 충돌이다. 일정 자리수를 반환하기 때문에 이러한 현상이 발생할 수 있는 것인데 고의로 충돌을 발생시키기는 매우 어렵다. (실제 SAH1도 구글이 첫 충돌 발생을 찾기까지 22년이 걸렸떤 일이라고..) 

 

21. 전자서명

: 디지털 문서의 작성자를 증명하는 기술로, 전자서명만으로 데이터 바꿔치기나 스푸핑 문제를 근본적으로 막지 못하니까 정말 본인이 직접 해당 암호키로 서명한 것인지 증명하는 과정이 필요하다.

전자서명은

: 누가 무엇을 했는지 증명하는 프레임워크이다. 인터넷에서 교환하는 문서가 본인이 작성한게 맞는지 확인할 때 쓰는데, 블록체인에 기록한 트랜잭션 정보는 전자서명을 반드시 포함한다. 공개키 암호화와 단방향 해시함수값 성질을 결합한 기술이다. 원문의 해시값을 문서에 포함해서 공개키로 암호화해서 전송하면 비밀키로 문서와 첨부된 해시값을 분리해서 문서의 해시가 첨부된 해시값과 일치하면 위변조가 없을을 보증하는 구조. 비밀키로 복호화가 안된다면 만든이가 다른것이거나, 서명이 바뀌었거나, 복호화는 됐는데 해시값이 다르다면 문서가 바뀐 것이 되지. 

전자서명이 보장하지 않는 점

: 공개키가 애초에 진짜 송신자꺼 맞나? 그건 모르는일이지. 애초에 다른사람이 작성하고 암호화하고 그 키로 복호화하는거 가능한거니까 . 본인이 맞는지 직접 만나 공개키를 문서로 교환하면 확신이 가능한데, 현실적으로 어려운점이 많다. 

 

22. 겅개키 인증기반 PKI (전자인증서)

: 제삼자인 인증기관을 거치는 방법. 

인증기관

: 공개키 암호의 소유자를 사람이나 조직에 연결해서 관리한다. 본인 확인 유효성 관리를 위해 전자인증서를 발급한다. 인증기관 운영은 민간이나 정부, 지자체 등이 있다. 인증기관이 본인임을 확인하기 위해 전자인증서를 발급하고 유효성 관리하는 구조를 '공개키 기반 구조 Public Key Infrastructure, PKI 라고 한다. 

PKI 를 배제하는 퍼블릭 블록체인

: P2P 네트워크에서 무신뢰 분산 합의 알고리즘을 구현한  퍼블릭 블록체인에서는, 특정 사람에 의한 중단, 개인의 자유 제한과 다른 흐름의 움직임이기 때문에, PKI를 중앙화, 권위의 상징이라고 여긴다.

퍼블릭 블록체인의 합의 형성 알고리즘 (PoW, PoS) 에서 무신뢰는 중요하지만, 블록체인 시스템이 모두 무신뢰인 것은 아니다. 비지니스 성격에 따라 본인확인을 필요로하는 유신뢰 환경의 거래를 구축하려는 네트워크라면 PKI는 합리적이고 효과적인 대안이 된다.

**은행에서 블록체인 기반의 서비스를 구축하려는 경우에 해당하는 듯

 

23. 타임스탬프

: 암호기술이 아니지만 디지털 문서의 존재를 증명하는데 필수 기술.

파일을 생성하거나 수정 시 운영체제가 자동으로 부여하는 시각. 협정 세계시(UTC) 1970년 1월 1일 0시 0분 0초 기준으로 관리한다. 컴퓨팅 자원으로 시각기록에 무리가 없는 날짜를 고려해서 선택된 시간이다. 그러나, 전 세계 컴퓨터가 독립적으로 동작하고, 시각 관리도 독립적이고, 컴퓨터마다 시각 차이가 몇초씩 생길 수도 있다. 네트워크에 연결된 컴퓨터의 시각을 맞추려는 타임 프로토콜 (NTP) 이 존재하지만, 네트워크 지연에 의해 노드들의 각 타임스탬프가 엄격하게 맞추기는 어렵다. 

블록체인에서는 분산 타임스탬프

: 개별 트랜잭션에 포함된 타임스탬프 정밀도가 낮지만, 여러 트랜잭션의 타임스탬프를 블록단위로 비교한 후 비슷한 시각의 타임스탬프를 선택하는 방법을 사용하여, 신뢰할만한 정밀도와 정확성을 보장한다. 

 


25. 블록체인을 지원하는 네트워크(P2P 분산 시스템)

: 분산시스템은 여러대의 컴퓨터가 함께 동작하는 시스템이다. 분산시스템을 구성하는 다양한 네트워크 유형이 있다.

P2P방식

: 2개 이상의 노드(네트워크에 연결된 컴퓨터)가 서로 1:1로 연결되어 통신하는 방식. 망형 네트워크이다. P2P분산 네트워크는 모두 동등한 역할을 수행하니까 일부가 고장나도 네트워크 전체에 영향을 주지 않고, 네트워크 규모가 커질수록 복원력이 높아진다. 블록체인이 수천개의 노드가 이 방식으로 동작하기 때문에 시스템 중단없이 관리되고 있다.

새 노드가 블록체인 네트워크에 참여할 시에는 블록체인 데이터의 해시 함수값을 비교해서 신중하게 복사해야 한다. 복사가 끝나면 노드의 하나로서 불특정 다수의 이용자가 발행하는 거래데이터(트랜잭션)를 받아  블록체인에 기록할 수 있다. 모든 노드가 동일한 데이터를 중복적으로 가지고 있다는 점이 장점이기도 하고, 장기적으로는 단점이 되기도 한다.

 

26. P2P방식의 특징

: 제로다운타임(Zero Downtime) 구현에 필요한 기능이 있다. 일부가 고장나도 노드수가 많을수록 복구력이 올라가지만, 같은 의미에서 노드가 많을 수록 Bucket Relay (불끌때 양동이) 가 길어지니까 그만큼 성능이 나빠진다. (거쳐야할 노드가 많은건가요 여러 곳에서 브로드캐스팅을 한다는건가요)  악의적인 목적으로 노드에 참여하더라도 시스템이 그대로 동작하니까 시스템 안전성에 위험이 있을 수 있다. 이런 문제를 배제하기 위해 신규 노드로 참여시 승인절차라는 제한을 두는 시스템도 있다.

 

27. 블록체인이 할 수 없는 것

인터넷 서비스가 보장해야 하는 세가지 특성 CAP. 동시에 충족 불가능하다. (CAP 정리) 블록체인은 가용성과 분할내성을 보장하지만 일관성이 약하다. 전세계에 수천개의 노드가 통신하면서 기록하기 때문에 모든 노드에 데이터가 반영되기까지 시간이 소요된다. 두 노드에 서로 다른 데이터가 동시에 기록되면 데이터 기록 순서가 바뀔수도 있는것이기 때문에 순서가 중요한 거래라면 블록체인은 적합하지 않다. 신용카드나 교통 IC 카드를 이용한 즉시승인을 보장해야 하는 비지네스에 적합하지 않다. (사용하려면 보완이 필요하다. )

 

28. 블록체인의 데이터 스토리지 기술

P2P분산 데이터 스토리지 - 여러 컴퓨터에 데이터 저장하는 공간 중 하나이다. 블록체인은 원칙적으로 거래데이터만 기로간다. 통상적인 방법으로는 이미지나 워드 파일을 그대로 기록하지 못한다. 가능하더라도 기록 데이터를 수정하거나 삭제 불가하기 때문에 권하지도 않는다. 

파일 해시값과 실제 파일을 연결하는 컨텐트 주소 

: 파일이름을 임의로 붙이면 우연히 같은 시점에 같은 파일이름이 저장되는 사고가 발생할 수 있다. (P2P분산 기술이 실시간 일관성이 보장되지 않기 때문에) 그래서 저장할 파일의 해시값을 생성해서 주소(컨텐트주소)로 사용해야 다른파일의 주소와 겹칠 일이 없다. 

 

29. 블록체인의 분기

: 노드 역할 중 하나가 합의 형성이다. 분산컴퓨팅이 여러 컴퓨터가 역할을 나눠 동시 연산을 수행하는 고속처리 구현 기술이라면, 블록체은의 분산 컴퓨팅은 모든 노드가 같은 연산을 수행한다. 결과는 모두 같다고 보장할 수 없기 때문에 연산 후에 모든 노드가 연산 결과의 동일성을 확인해야 한다. == 합의해야 한다. 연산 결과가 다르게 나온다면 각 노드는 옳다고 생각되는 결과에 따라 블록을 연결하는데 블록 높이가 차이가 발생하면 블록이 높은 체인쪽으로 합의가 형성된다.  그 합의 결과가 전체 네트워크에 퍼지려면 시간이 소요되기 때문에 블록체인의 분산 컴퓨팅은 속도가 느리다. 이런 단점에도 블록체인 구조를 사용하는 이유는 가용성과 부정행위 방지를 중요시 여기기 때문이다. 

( 채굴자가 보상으로 얻은 비트코인을 사용하려면 체인에 블록이 100개 이상 연결되어야 하며, 지금까지 합의를 형성하지 못한 상태로 분기한 블록의 최대 높이는 24개)

 

30. 합의 형성 구조

: 프라이빗은 리더노드가 제안한 선택에 다수결로 결정하고. 퍼블릭은 노드가 수가 미정이라 다수결이 불가능하기 때문에 리더노드가 필요하지 않은데 선택을 할 수 없는 상황에서, 블록체인에서는 어떤 것을 선택할지를 두고 경제적 보상을 이용한다. 어떤 결과를 선택할지 사용자가 하고 올바른 선택인 경우 경제적 보상을 행사할 권리를 얻게 된다. (PoW, PoS 합의형성알고리즘) 

 

31. 합의 형성과 암호화폐

: 참여자 수가 몇이든 상관 없이 불특정 다수가 합의를 형성할 수 있는 상황이 형성되었다. 대가로 실제 지급되는 것이 암호화폐이다. 

비잔티움 장애허용을 합의 형성에 적용한다. 배신자가 있을지도 모르는 환경에서 합의 형성하고 운용되고 있다. 

** 비잔티움장애허용이 뭐야?? 읽어도 모르겠다

나빼고 다른 세놈이 이상한 뻘짓할 수 있다는 계산 

N = 3F + 1 (F: Fault)

if( F=1) => N = 3*1 + 1 = 4 노드 4개구성해야만 겨우 합의 이를수있다 ( 합의 디폴트 4대)

if( F=2) -> N = 3*2 + 1 = 7

if( F=3) => N = 3*3 +1 = 10 ...

 

합의조건 :

N-F < 

(3F + 1 - F 

2F +1 같거나 커야 합의 완성

F = 1, 3<= 

F= 2, 5<=

F=3,  7<= 

 

N이 5개인경우 F가 2개면 노드 최소 7개에서 10개사이 잡아야.. 

 

노드가 4개로 시작하는데 1개가 죽어서 3개가 되거나 +1로 5개가 될수도 있고... 노드 총수는 늘어나니까 조건도 달라지게 되지 

노드 3  C : F=1-> 2F+1  => c: 3개

노드 5 C: F=2였다면 2F+1 => 노드컨디션 5

런타임시 사고발생(노드개수변화)에 따라 컨디션이 변경할 수 있어야 한다. 

노드 +/- 증감을 처리해야 함. 노드 붙고싶다고 붙는게 아니고 http주소 아니까 데이터 쏘는데 

노드가 붙고싶을 때 하나가 아웃될거 같으면 들어오려는 애가 주소를 서로 알아야 데이터쏘니까 주소록을 공유해야한다. 주소록 누군가한테 갱신되어야하고

 

죽으면 컨디션도 바꿔야하고 주소록정리해서 죽은애한테 데이터 쏘지 않고, 노드 늘고줄어듦에 따라 주소나 컨디션 바꾸자고 의사결정할 노드가 따로 필요하다.  노드밖에 있는 노드 

의사결정에 따른 데이터를 빨리 전송해야 나머지노드들이 그 액션을 취할 수 있지. 새노드들어오고(노드확장) 죽은거빼고

컨디션값도 변수로 두고

주소록도 메모리상에 두고 

어딘가 참조해서 갱신해야 함

 

pBFT동작 방식

 

2F+F(이상한놈)+1(나) - finish - 3개만족 (2F+1)

request - preprepare - prepare - commit -reply 각스테이지

preprepare는 리더노드만 request를 받음. 데이터를 다른데로 쏘기전까지 request 들어온걸 preprepare형식에 맞도록메세지를 바꿈. 

다음prepare메세지 준비해서 쏨

다음commit메세지만들어서 절달하고 reply 메세지를던짐 

메세지 구조체바꾸는건 각단계를 어디를 거치고있는지 구분하려고 

노드입장에서는 스테이지별로 상태가변함. 들어오는메세지에 따라 스테이지마다 노드의 역할이 달라진다. state machine 

n0 리더노드

n1 스타트점 prepare 2번넘어가서 쏨

C request 던지고 결과reply도 받아옴 돌아오는시차가달라, 다 3개 돌아와야 합의도달로 봄. 

http통신에서 패킷소실이 되는 케이스 n3

 

- 이전 BFT 는 C에서 모든노드로 보냄. 비효율적. 합의가 9개와서 누구로부터왔는지 복잡?

그래서 나온게 pBFT

preprepare (N-1) + prepare 랑commit (N-1)*(N-1)*2 +리플라이(N)  합의 한번하기위한 내부트래픽 발생량

ssl/tls 하이퍼레저는 이거의 9배가 더 늘어남 트래픽줄이는게 고민

그래서 나온게 각단계에서 (2n+1이면그냥넘어가 prepare, commit그냥넘어가...

PoA

하이퍼레저에 BeSu프로젝트  : Raft합의 알고리즘 만들어냄. (내부 PoA가져다 쓰는 것) IoT디바이스 다 이어서 센서 데이터기반으로 블럭만들어서 합의과정 이후 블럭을 배포해야하는데 , 누구랑합의할지, IoT에서 올라온대상을 데이터를 뭘합의할거야 . 리더노드가 블록을 만들고 자기가 authority 검증하고 지가뿌림. 합의과정없어서 속도빠름. 

하이퍼레저기반 Fabric, Indy 등등이 있다

하이퍼레저 단점 오더링, 순서.. 블록받는 주체 순서없이넣기만하면됨.. 

 

한국은행은 IBFT를 사용한다, 

한국은행이 n1

시중은행이 n2, n3 ....

하나카드 신한카드.. 는 n2, n3에 붙어있는것.. 

노드안에 pBFT 구현되어있음. 

 

클라이언트 curl로쏘고 10K만큼 쏨 (처리하는 녀석들) 결과받아처리하는 것 별도로 만들어서 전체 동작하는거 보는 작업 

index value 넣고 리플라이에 index값 출력

0 1 2 3 주소체계로 구성 . 하나 리더노드로 세팅하고 . 만번 동작. 

 

윈도우에서 데몬 1500개정도 돌릴수있음 (노드) 1800개정도 트래픽던지면 컴퓨터 다운됨.

우르르 받으면 받을때 컨디션따라 메모리버켓에 쌓아놓다가 오버플로대면 죽는것. cpu가 아니라 메모리떄문에.

테스트넷으로 50개정도 돌려보면서 동작확인

http에서 코어로 트리거링 하면 노드들이 반응시작 동영상으로 찍어야

10K (만개) 던졌을 때 토탈타임 합의 초당 몇건이뤄지는지 노드를 기준으로 계산

10K-t.time

BPS 초당 블럭 몇개만들어지는지 

가장성능좋은 게 161개정도..? 보통100개정도.. 초당 100개정도만든다는말. 180-200정도나오면 잘나온것.

 

불특정 다수의 합의 형성을 구현하는 작업증명 

: 이전 블록의 해시값 + 트랜젝션 데이터의 해시값 + 타임스탬프 + 논스 블록앞에 해시값 특정 자릿수만큼 0이 나올때까지 적당한 수 넣어서 계속 연산

 

거래소에서 하는일은 핑날리는거

거래소 지갑은 댑 웹서비스 하는게 다..

 

 


33. 지갑

: 공개키 암호 키에 기반한 애플리케이션. 블록체인에서 사용하는 공기키 암호의 비밀키 공개키를 바탕으로 수학적으로 도출한 주소이다. 

지갑주소에 있는 비밀키와 공개키

: 지갑주소는 비밀키 지갑주소와 공개키 지갑주소가 있는데, 송금이나 입금받을 곧이 공개키 지갑주소이고, 비밀키 지갑주소는 거래에 서명하는 지갑주소다. 

실제 지갑 앱에는 보통 비밀 키를 보관하니까 비밀키 지갑주소는 암호화폐지갑을 백업하는 역할로 볼 수 있다. 비밀키 지갑주소는 다른 지갑 앱 주소를 마이그레이션하는 용도로 쓴다.

시드(난수열)로 비밀키를 생성하고, 비밀키로 비밀키 지갑주소를 생성한다. (상호변환가능)

비밀키로 공개키를 생성하고, 공개키로 공개키 지갑수조를 생성한다. (역으로 알아내는 것은 불가능)

 

34. 지갑 주소

: 비밀키와 공개키 쌍을 포함

오프라인에서 지갑주소 생성 가능

: 지갑주소는 앱 설치 시 자동으로 만든다. 연산이기 때문에 인터넷 연결 필요없이 생성된다.

난수 생성해서- 비밀키 공개키 쌍만들고- 비밀키 지갑주소와 공개키 지갑주소 생성

 

35. 지갑주소 구조

: 1로 시작(해더) + 맨 뒤자리 4개 체크썸 + 가운데 낀 거 개체 블록으로 구분된다.  지갑주소는 Base58 이진 텍스트 인코딩 방식으로 만든다. 

헤더: 0x00 비트코인 지갑주소 버전 번호

개체 : 공개키를 SHA256해시함수에 곱한 후 / RIPEMD160 해시함수에 곱해서 / 앞에 헤더블록을 연결한 블록

체크썸: 개체블록에 SHA256 해시함수 두번 곱한 값의 첫 4바이트

 

지갑주소 : 개체블록 + 체크썸 블록 연결해서/ Base58 로 인코딩한 결과

 

39. 트랜잭션

: 거래내용, 타임스탬프, 전자서명으로 이루어진 트랜잭션의 파일 해시값이 블록체인 내 고유한 트랜잭션ID가 된다.

input에 지갑주소의 잔액(UTXO)

output에 받는 쪽의 주소로의 송금액과, 보내는 지갑주소의 잔액이 표기.

트랜잭션은 송금 뿐만 아니라 메세지나 문서의 존재 증명을 위해 사용할 수도 있다. 80바이트 정도의 메세지 첨부 영역에 파일의 해시값을 입력하고 P2P 분산 스토리지에 같은 값의 파일을 저장해서 파일 존재 증명할 수도 있다.

 

41. 합의구조

: 트랜잭션은 전 세계 P2P 분산 네트워크 노드에 전달, 배포 복사된다. 사용자에 가장 가까운 노드에 배포되고, 내용에 문제가 없으면 해당 트랜잭션을 복사하기를 반복 전세계로 전달된다. (버킷릴레이방식) 

전세계에 배포할 트랜잭션은 먼저 트랜잭션 풀이나 메모리풀에 저장한다. 이는 블록체인에 포함될때까지 잠시 대기하는 상태, 미승인 상태, 합의(기록)되지 않은 상태이다. 채굴자가 승인하면 (채굴 성공하면) 블록체인에 포함되기 때문에 시간 지연의 문제가 있다. 

 

42. 뒤집히는 합의

: 분기 합의가 이루어지지 않은 상태, 일정 시간이 지나서 높아진 블럭을 선택하니까 합의가 뒤집힐 수 있는 것이다. 분기가 발생하는 것은 거의 동일한 시점에 채굴이 된 경우 어떤 블록이 높은지 선택할 때까지 기다려야 한다. 결제무효가 발생할 가능성이 있다. 동시에 채굴이 되어 분기한 상황의 트랜잭션들의 내용은 순서는 다를지라도 같은 내용이 모두 포함된 상태일 때가 많다. 트랜잭션 자체의 분기는 기록상에 큰 영향을 받지 않지만 선택받지 못한 체인은 무효화되기 때문에 채굴자에게는 중요한 문제지.

프라이빗 블록체인은 노드 수가 확정적이라 다수결 합의가 많아서 분기가 없이 확실하게 합의형성 후 블록에 기록되도록 설계될 때가 많다. 따라서 합의 지연 문제도 거의 없다. 

 

43. 트랜잭션의 순서

: 분산시스템의 특성상 트랜잭션의 순서를 보장할 수 없다. 네트워크 통신 속도나 노드의 성능차이, 버킷릴레이 방식이라 가까운 지역의 노드에서 오는 걸 더 빨리 받을 수밖에 없으니까. 기록되는 순서는 누가먼저 채굴하는지가 결과적으로 중요할 뿐이다. 결과적으로 처리되기만 하면 되는 경우가 많아서 문제되는 경우는 많지 않지만, 증권거래나 이벤트 티켓 판매같은 상황에서는 별도의 서브 시스템을 연결해서 블록체인 도입해야겠지. 

하이퍼레저 패브릭(Hyperledger Fabric)이라는 블록체인 시스템은 카프카(Kafka) 라는 메세지 중개 서비스와 블록체인을 연결해서 트랜잭션 처리 순서를 보장한다. 블록에 기록하기 전에 파티션(트랜잭션 큐) 에 순서를 정렬을 진행한다. 

시각인증 기관이 협정 세계시(UTC)와 오차가 밀리세컨드 이하임을 보장하는 토큰을 이용해 생성시간을 증명하는 방법도 있다.

 

44. 블록의 구조

:   비트코인에서 트랜잭션 하나가 수백 바이트 정도이고, 

input에 입력수, UTXO포함한 트랜잭션ID, UTXO인덱스, 송신자 전자 서명과 공개키

output에 출력수, 송금하는 암호화폐 금액, 송금자 지갑주소, 반환하는 암호화폐금액, 암호화폐 반환할 지갑 주소

트랜잭션파일의 해시값 == 트랜잭션 ID

여러 트랜잭션이 블록안에 들어가기 때문에 순차 검색이 아니라 각 트랜잭션의 해시값과 그걸로 만든 트랜잭션 ID 로 인덱스삼아서, 인덱스 하나에 문서 하나 연결하는 Key-Value Storage, KVS에 저장한다. KVS 구조의 트랜잭션 ID 여러개를 SHA2-256 해시함수로 여러번 연산한 구조가 검색 효율 좋은 이진트리 구조 혹은 머클트리 구조이다. 머클루트를 해시함수에 넣어 얻은 값이 트리에 포함된 모든 트랜잭션에 의존선이 있는 해시값으로 블록헤더에 영구히 기록된다. 

이 트리구조는 트랜잭션조작을 어렵게 하고, 데이터의 크기에 상관 없이 효율적인 검색을 가능하게 한다. 

 

블록구조는

: 블록헤더와 트랜잭션 두 부분으로 나눌 수 있다.

블록헤더 :

블록버전정보,

이전블록헤더의 해시값,

해당 블록에 포함된 트랜잭션의 머클루트 해시값,

블록이 생성된 타임스탬프,

블록 채굴시의 난이도,

채굴시 주어진 논스

 

트랜잭션 :

해당 블록에 포함된 트랜잭션 수,

서명된 트랜잭션 데이터

등등

 

블록체인에서 체인은 헤더정보의 SHA2-256 해싱값의 논리적 연결고리를 지칭한다. 트랜잭션의 머클루터의 해시값이 트리형태인 것처럼. 

블록체인에 저장되는 값은 해시값형태라서 데이터 변조가 발생하거나 트랜잭션 저장순서가 잘못되면 해시값이 일치하지 않아서 변경불가성을 보장하게 되는 것이다.

 

46. 이중송금문제


47. 스마트계약

: 블록체인 네트워크를 실행하는 연산 기능이 있는 프로그램으로. 당사자 없이 여러사람의 합의 내용을 자동으로 실행하는 기능을 구현한다. 단순 송금은 스마트 계약이 아니지만, 일정시간 후에 이의가 없는 경우 권리이전한다는 내용의 트랜잭션이 스마트 계약에 해당한다. (배포하고 승인하는 시점에 계약 조건이 충족되지 않고, 계약조건이 충족되는 시점 계약이 자동으로 성립하는 것)

댓글