이 글은 `인프런 - Klaytn 클레이튼 스마트계약과 탈중앙앱` 강의를 보고 개인적으로 정리한 글입니다.
블록체인의 정의와 구성, 해시함수
블록체인이란?
정보를 블록이라고 하는 단위로 저장하여 저장된 블록들을 체인형태로 묶은 저장기술.
자료구조 링크드 리스트(Linked-List) 와 비슷하지만, 블록체인의 경우 연결된 데이터를 해시함수(Hash Function) 로 기억하고있다.
-- 해시 함수(Hash-Function)
임의의 길이의 데이터를 고정된 길이의 데이터로 매핑(변환)하는 함수
- { 해시 , 해시 값 , 해시 코드 } = 해시 함수에 의해 얻어지는 값
- 데이터를 X , 해시함수를 H 라고 표기할 때 해시를 H(X) 로 표기
- 산업에서 가장 널리 쓰이는 해시 함수는 SHA-2 (e.g. , SHA-256) , SHA-3 (e.g. , Keccak)
---- 해시 함수의 Roles
- 하나의 데이터에서 오직 단 하나의 해시가 도출
- 임의의 데이터 X 와 Y 가 있을때
if X == Y then H(X) == H(Y)
if X != Y then H(X) != H(Y)
if H(X) == H(Y) then X == Y
------ 해시 함수의 example
최근에(강의 게시일 : 2020년 01월 20일) Keccak 해시 알고리즘을 많이 사용한다.
16진수(Hex)로 표현해서 256비트가 된다. (2진수 1자리는 1bit 이고 2진수 8자리는 8bit 즉 1byte가 된다. 또한 16진수는 한자리가 2의 4승 내에서 표현된다. 2진수 4자리는 16진수 1자리와 같기에 16진수 64자리가 존재할때 (64 * 4) = 256(2진수 256자리 및 256bit) , 256 / 8 = 32 byte 가 된다. 최종적으로 32byte * 8bit = 256bit가 된다.) cf) 참고 bit_byte_bps
블록체인의 구조, 주요 용어
해시 함수를 이용해서 블록과 블록을 해시포인터로 연결한다.
블록체인의 구조
- 헤더는 바디를 설명한다.
- 헤더와 바디를 묶으면 블록이된다.
- 헤더의 정보들 중에 앞에 블록에 대한 정보가 해시값으로 기록되어있다.(해시포인터)
- 블록체인을 처음 구상한 사람들은 블록을 수평이아닌 수직으로 쌓아 생각했다. 때문에 블록을 하나라도 빼면 전부 흔들리기에 뺼 수 없는 구조이다.
- '데이터가 블록에 들어갔다'를 체결이라 하는데, 이 체결까지 걸리는 시간이 '적어도 블록생성주기 만큼 걸린다' 라고 할 수 있다.
- 비트코인의 경우 블록생성주기가 약 10분이다.
- 이더리움은 블록생성주기가 약 15초이다.
- 클레이튼은 블록생성주기가 약 1초이다.
클레이튼은 블록생성주기가 약 1초이기에 서비스지향적이며, 평균적으로 3~4초안에 체결이된다.
블록체인 네트워크
블록체인을 블록체인 네트워크라고도 한다.
블록체인은 기본적으로 P2P(Peer-To-Peer-Network, 서버에 의존하는 통신이아닌 네트워크 참여자 즉 노드들간의 동등한 통신 구조 ex> 토렌트) 네트워크이다. 때문에 네트워크 참여원(노드) 들이 같은 데이터를 가지고있고, 하나의 노드가 없어져도 같은 데이터를 가지고있는 다른 노드가 데이터를 줄 수 있기에 , 충분히 복제되어 탈 중앙화 되어있다고 말할 수 있다.
- 블록체인 네트와크와 노드가 존재
- 모든 노드는 같은 데이터를 가지고 있다.
PoW에 의해 자격(노드간 서로의 정보를 모르는 블록체인 세계에서는 어떻게 보면 PoW 로 인증을 하는 것이라 볼 수 있겠다.)을 얻은 노드는 블록을 제안 (Propose) 할 수 있다. 이때 노드 모두가 동의해야 데이터가 블록체인에 포함될 수 있다.
정리
● 블록체인은한명이상의참여자가있는네트워크에서관리
● 네트워크참여자전원은모든블록을동일한순서로저장하여모두같은블록체인을유지
● 자격이있는참여자는블록을제안할수있음;블록제안자격은네트워크마다상이
● 블록이체인에추가됨=참여자들이새블록을자신의체인에추가
● 따라서새로운블록이체인에추가되려면네트워크의합의가필요;합의방법은네트워크마다상이
○ 어느한주체가단독으로결정하는구조가아닌,여러참여자가합의를통해결정하기때문에블록체인은 탈중앙화되어 있다고표현
● 참여자전원은이전블록들을저장하고있으므로새로운블록의무결성을확인가능
● 새롭게제안되는블록은참여자들이검증및합의할수있는형태여야함(투명성)
● 한번쓰여진블록은이전의합의를번복할수있지않는한변경될수없음(불변성)
합의 알고리즘
PoW 에서는 새로운 블록을 얻기위해 마지막 블록을 가지고 해시를 만든다. 이때 nonce 를 활용해 해시값이 고유한값이 나오도록한다. 이때 PoW 는 특정 해시값을 찾도록 문제를 낸다.
사실 컴퓨터로 표현되는 모든것은 숫자이다. 256비트 해시라는것은 2의 256승짜리의 숫자인데 이는 우주의 모든 먼지를 다 모아도 2의 256승이 안되는 어마어마한 수이다. 때문에 여러개를 뽑았을때 같을 확률은 없다 볼 수 있다. 때문에 컴퓨터에게 2의256승이란 부담이되는 수이다. 그래서 PoW 가 요구하는것은 노드가 해시를 하면 숫자가 나오는데 이 숫자가 몇 이하면 내가 인정해 줄게! 라는 것을 요구하고 앞의 0의 갯수를 본다. 즉, 앞의 0의 갯수가 많을수록 더 적은 숫자이기에 앞의 0이 몇개 이하면 PoW 가 인정해주게 된다. 그리고 이는 경쟁이기에 먼저 푸는 노드가 인정되기에 어려운정도(difficult)가 높다. 그리고 이는 마이닝이 CPU 보다 GPU 에서 더 해시가 빠르게 돌고 여러대일수록 빠르게돌기에 difficult 가 점점 더 높아지고 있다.(합의에 필요한 연산양이 많다) 때문에 참여제한은 없지만 기술이 발달할수록 채굴되기가 힘들다.
PoS 는 기여도에따라 자격취득 확률이 높아진다고 볼 수 있다. 때문에 PoS 를 곧바로 쓰는 네트워크는 없다. PoW 로 경쟁하면서 기반이 쌓이고, 분포가 많이 된 상태에서 PoS 를 사용한다.
BFT 는 정해진 순번 또는 정해진 확률에 의해 취득하는 것이다. 누구나 참여할 수 있고 , 네트워크를 비동기화 상태에 두어도 합의를 이끌어낼 수 있다가 PoW 의 장점이다 그러나 이는 연산에 쓰는 비용이 비싸다는 단점이있다. BFT 같은 경우 네트워크가 동기화 되어있다. 이는 네트워크에 참여하는사람들이 누구인지 정확히 모두가 알고 새로 오면 모든걸 멈추고 모든사람이 알아야한다. 단점으로 이는 대단히 통신을 많이한다 때문에 합의에 참여하는 사람이 많으면 많을수록 느리다. (작은 그룹에서는 빠르지만 특정 수를 넘어가면 느려진다) 즉, BFT 는 참여제한 높다(구성원 셋팅해야해서) , 합의에 필요한 연산량 낮다(네트워크 트래픽빼고 해싱하는것만봤을때), 2/3 이란 숫자가 높은 신뢰성을 보장하지만 1/3 이란 숫자때문에 취약하기도하다. (추가적으로 클레이튼은 1초의 4000TPS-Transaction_Percent_Second로 1초에 4000 트랜젝션을 블록에 담을 수 있다.)
블록체인 비교
퍼블릭과 프라이빗의 구분은 블록체인에 다음을 수행 할 수 있는지 확인하여 결정:
● 누구든지 기록된 정보(블록)를 자유롭게 읽을 수 있는지?
● 명시적인 등록 또는 자격취득 없이 정보를 블록체인 네트워크에 기록 할 수 있는지?
==> 블록체인의 정보가 공개되어 있고 네트워크가 정한 기준(e.g.,gasfee)에 따라 정보를 기록 요청 할 수 있다면 그 블록체인은 퍼블릭/공개형이라한다. (Public)
==> 이와 반대로 정보가 공개 되어 있지 않고 미리 자격을 득한 사용자만이 정보를 기록 할 수 있다면 그 블록체인은 프라이빗/비공개형이라한다. (Private)
일반적으로 네트워크의 참여가 제한된 경우 ‘permissioned’, 그렇지않은 경우 ‘permissionless’라 정의
네트워크의 참여의 정의
● (넓은 의미)블록체인 P2P 네트워크에 참여
● (좁은 의미)합의 과정의 참여
- > Public/Private의 개념이 정보의 접근성(Access)와 관련이 있다면
- > Permisionless/Permissioned는 정보의 제어(Control), 즉 무엇이 블록에 포함 되는지를 결정하는지에 더 연관
예: Ethereum → Public,Permissionless , Klaytn → Public,Permissioned
공개키 암호화와 전자서명
블록체인을 얘기할때 해시와 암호화 이 두가지로 만들어졌다고 해도 과언이 아니다.
- 암호화(chipher, encrypt)에 사용한 키와 복호화(dechipher, decrypt)에 사용한 키가 동일한 경우 대칭키암호로 분류
- 암호화에 사용한 키와 복호화에 사용한 키가 다를 경우 비대칭키암호로 분류
블록체인에서 사용되는 암호화는 비대칭키암호를 사용한다. 이것을 공개키암호라고도 한다.
비밀키와 공개키는 한쌍이어서 비밀키를 만들면 공개키가 만들어진다.
비밀키로부터 공개키를 도출할 수는 있지만, 공개키로부터 비밀키를 도출하는것은 암호학적으로 매우 어렵다.
Alice 가 Bob 에게 Bob 의 Public Key 로 암호화를해서 메시지를 보냈다. Bob 은 메시지를 자신의 Secret Key 로 복호화를 한다. 이때 Bob 은 과연 이 메시지가 Alice 에게 온 것인지 어떻게 확인할까? ( 비대칭키암호는 이처럼 지정된 사람만 정보를 확인할 수 있도록 도움 - privacy )
==> 전자서명을 활용하기 시작 ( 전자서명은 누가 정보를 보냈는지 알기 위해 사용 - non repudiation )
- 전자서명은 비대칭암호의 응용 프로그램
- 서명은 비밀키로만 생성가능(즉, 자신만 가능)
- 공개키는 서명이 짝을 이루는 비밀키로 생성되었는지를 검증 (상대방이 공개키로 서명확인)
Alice 는 Bob 에게 Bob 의 Public Key 로 메시지를 암호화해서 보냈다. 이때 Alice 자신의 Secret Key 로 자신의 전자서명도 같이 보냈다.
Bob 은 메시지를 Bob 자신의 Secret Key 로 메시지를 복호화해서 확인한다. 이때 Alice 의 Public Key 로 정말로 Alice 가 보낸 메시지가 맞는지 확인한다. (이는 Alice 가 메시지를 보냈고 Alice 가 Bob 만 읽을 수 있도록 안전한 통신을 했다고 볼 수 있다.)
이때 중간에 누군가 가로채 메시지를 변조시키지 않았다는 것을 확인하기위해 Hash 알고리즘을 통해 메시지의 해시값 또한 함께 보낼 수 있다.(메시지가 바뀌면 해시값이 바뀌기에)
블록체인에서 사용되는 암호화 기법
비트코인의 경우 모든 노드가 같은 데이터를 공유한다. 데이터는 주소도 함께 가지고 있다고 생각할 수 있다. 이때 노드는 이 주소가 누구의 것인지 알기 어렵다. 이렇다보니 암호학적으로 소유권을 확인해야 한다. 이를 위해 전자서명을 사용한다.
공개키를 사용해 암호화된 주소의 값을 복호화할 수 있다. 비트코인의 경우 어느 주소에 10 비트가 있다고 가정해보자. 이 10비트의 소유권을 확인하는 방법으로 트랜젝션을 사용한다. 비트코인을 옮기거나 사용할경우 내용을 자신의 비밀키로 서명해 트랜젝션내에 보관하게되는데, 이 서명과 함께 공개키를 같이 보관하게 된다. 그럼 이 트랜젝션을 받은 노드들은 공개키로 서명을 검증 할 수 있다.
이때 주소의 검증작업또한 이루어지는데, 공개키를 주소를 만드는 함수에 집어넣어 160비트로 줄여봤더니 발행한곳의 주소가 나왔다면 이것은 네트워크 참여자가 발행한 주소가 맞다고 볼 수 있다.(비밀키를 가진자가 발행한것이 맞다.)
이 방법은 공개키가 항상 따라가게된다. 때문에 저자서명 256비트 + 공개키 256비트 = 512비트 이기에 트랜젝션이 많을경우 부하가 크다고 볼 수 있다. 이더리움의 경우 이런 네트워크 페이로드가 비효율적이라 생각해 서명으로부터 공개키를 도출하는 기법을 사용해 공개키를 따로 보내지는 않는다.
다음그림을 참고하면 좋을것 같아 가져왔다.
엘리스는 메시지를 해시데이터로 변경후 자신의 비밀키로 한번더 해쉬값으로 만든다.
밥은 해시화된 데이터를 공개키로 풀고, 본문의 메시지를 해시데이터로 변경 후 공개키로 풀어낸 값과 메시지를 해시한 값이 같은지 비교해 위조가 되었는지 확인할 수 있다.
비트코인에 경우 돈에다가 주소를 준 것이기 때문에 돈이 자체로 암호화되어 돈을 쓸때 전자서명을 낸다.
이더리움의 경우 Account 를 사용하리 위해 Account 를 낸다. Account 에는 주소가 있고 상태값이 있다.
비트코인은 돈에 주소를 줌으로써 돈과 전자서명을 매칭해 보안을 강화하고 병렬화가 가능하다.
이더리움은 Account 기반이기에 순서가 중요하다. 또한 Account 에 상태값을 가지고 있기에 스마트컨트랙트가 가능하다.
결국 주소에 특정 누군가의 Account 가 표현되어있고 state 를 갖고 있다.
트랜젝션은 저장의 단위이다. 이때 트랜젝션의 순서는 중요하다.
Alice 가 TX 를 발행해 어떤 Node 에 추가가 되면 그때 Alice 의 TX 는 '1 confirmation(체결)' 받았다고 한다.
이러한 1 confirmation 의 숫자는 블록이 추가될때마다 confirmation 숫자가 늘어나는 구조이다.
블록이 확률적 완결성을 갖기까지 기다려야 한다는 뜻은 longest chain 법칙을 따르기 때문이다. 이는 가장 긴 체인을 가진 Node 가 채택되는 것이기에, 동시다발적으로 문제를 풀어 블록을 제안한 두 Node 가 있다고 가정했을때 누구든 가장 먼저 문제를 풀어 가장 긴 체인이 된 Node가 채택된다. 때문에 결국 longest chain 법칙을 가진 PoW 기반 코인의 경우 Finality 가 없다(블록의 완결성이 없다)고 볼 수 있다. ( PoW 는 가장긴체인의 마지막 기준의 블록에서 제안을해야 자신의 블록이 포함될 수 있는 구조이기에 longest chain 법칙이 적용되는 것이 당연하다. )
이때 confirmation 숫자가 중요한 이유는, 동시다발적으로 Node 가 제안을 할 가능성은 존재한다. 그러나, 몇 개 이상으로 많이 차이날 가능성은 굉장히 어렵다. 이때 이 차이를 confirmation 숫자로 판단 가능하다. 이러한 차이를 비트코인에서는 6개 정도로 제한하였고, 이더리움의경우 7개 정도로 제한하였다.
이러한 특징을 가진 PoW 의 finality 를 확률적 finality 라고 부른다.
비트코인의 블록생성주기인 약 10분정도의 시간이 걸려 블록이 생성된다고 했을때 기다려야하는 시간이다.
BFT 기반의 블록체인의 경우 모든 Node 의 합의가 이루어져야 채택될 수 있기 때문에 모든 블록이 finality 하다.
Klaytn BFT
klaytn 또한 BFT 를 사용한다.
BFT 라는 합의 알고리즘은 정해진 네트워크 안에서는 굉장히 효율적이다. 그리고 네트워크의 참여자 수가 작으면 작을수록 빠르다. 하지만 네트워크 참여제한이 높기에, 네트워크의 참여자수가 작으면 작을수록 중앙화의 특징을 가질 위험이 있다. 그렇다보니 네트워크 참여자가 담합시 문제가 될 수 있고, BFT 특성상 1/3 이상이 의의를 제기하면 되겠지만, 2/3 이상이 담합하면 문제가 된다. 이런 담합의 문제 및 네트워크 확장에 문제가 있지만, Klaytn 이 BFT 를 사용하는 이유는 단순히 PoS 의 경우 큰 기여도(자본)을 가진 누군가가 과반을 가져가기 쉬운 구조이고, PoW 의 경우는 매우 느리기 때문이다. 그렇다면 BFT 의 단점을 어떻게 극복할까?
클레이튼의 경우 BFT 를 쓰지만 조금 다르다. 네트워크를 구성하는 전체 집합을 대상으로 BFT 를 실행하지 않고, 전체 집합의 구성원 수가 n 개면 그 중 BFT 를 돌리기에 최소한의 크기로 부분집합 s 개를 무작위로 뽑는다. 이때 사용하는 랜덤값은 VRF(vrf verifier Random function) 로
검증가능한 랜덤값을 사용한다.
결론적으로 , Klaytn 은 거대한 전체집합에서 무작위로 부분집합을 뽑고 , 그 부분집합에서 BFT 를 실행해 빠르게 블록을 생성하고 합의된 결과를 나머지 네트워크에 전달하는 방식이다.
이러한 방식으로 Klaytn 은 Transaction 을 1초에 4000개를 처리할 수 있고, 매 초마다 새로운 블록을 생성할 것이다.
'BlockChain > 클레이튼' 카테고리의 다른 글
Klaytn 클레이튼 스마트계약과 탈중앙앱 - 솔리디티와 Klaytn SDK (0) | 2022.06.28 |
---|---|
Klaytn 클레이튼 스마트계약과 탈중앙앱 - 블록체인 상태와 트랜젝션 (0) | 2022.06.25 |