이 글은 '한양대 x 그라운드X'에서 진행한 블록체인 강의 영상을 정리한 것입니다.
참고링크 : https://www.youtube.com/watch?v=imh8z8Mf764&list=PLKqrwxupttYEcJhWAw0E_5RVpDD9LD6Q-&index=8
블록체인의 정의, 해시함수
블록체인이란?
정보를 블록이라고 하는 단위로 저장하여 저장된 블록들을 체인형태로 묶은 저장기술을 말한다. 자료구조의 연결리스트와 유사하다. 연결리스트에서는 특정 노드의 다음 노드가 누구인지 알기 위해 다음 노드의 주소값을 특정 노드가 가지고 있다. 그러나, 블록체인에서 블록은 해시 함수를 이용해 다음 블록이 어떤 블록인지 알아낸다.
해시함수(Hash Function)
임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수를 말한다. 다시말해, 데이터의 길이가 어떠하던간에 상관없이 고정된 길이의 데이터로 변환해준다.
해시함수의 특징은 하나의 데이터에서 오직 단 하나의 해시(결과값)이 도출된다는 것이다. 임의의 데이터 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
따라서, 특정 input value(입력값)은 고유한 output value(출력값)에 매핑된다. 이는 1대1 관계를 갖는다.
해시 함수의 예제
- 같은 함수로 다른 데이터를 해시했을 경우
-
문자열 ‘hello!’를 SHA-256으로 해시한 결과는 다음과 같다:
1C0B8448B72C55F2F614640252D14EC132FA031D7C5C35D93B6BCE780CFE0E92
-
문자열 ‘hello?’를 SHA-256으로 해시한 결과는 다음과 같다:
772B10CBE98FA326726AF507FB4BE2B5B72939DC37E5D0FD05E4AD95DEC2905F
같은 함수라도 다른 데이터를 해시할 경우 결과값이 크게 다른 것을 확인할 수 있다. 차이는 ! 와 ? 임에도 불구하고 값은 크게 달라진다.
- 다른 함수로 같은 데이터를 해시했을 경우
- 문자열 ‘hello!’를 SHA-256으로 해시한 결과는 다음과 같다: 1C0B8448B72C55F2F614640252D14EC132FA031D7C5C35D93B6BCE780CFE0E92
- 문자열 ‘hello!’를 Keccak-256으로 해시한 결과는 다음과 같다. 96b8d442f4c09a08d266bf37b18219465cfb341c1b3ab9792a6103a93583fdf7
블록체인의 구조, 주요 용어
블록체인의 구조
- 블록 헤더 : 블록을 설명하는 정보와 이전 블록의 해시를 포함한다.
- 이전 블록의 해시(hash pointer)를 가지고 있기 때문에 ‘어떤 블록이 앞에 와야하는지 결정적으로 알 수 있다’ & ‘이를 바탕으로 블록의 순서를 결정할 수 있다’
- 뒤에 블록이 앞에 블록을 가리킨다라는 개념이 핵심이다.
- 헤더는 바디를 설명한다.
- 해시함수에 들어가는 입력값은 블록 바디에 담긴 정보이다. 거래 정보는 축적되면서 계속 쌓이기 때문에, 입력값으로 동일한 값이 들어가는 경우는 존재하지 않는다.
- 블록 바디 : 정보의 묶음
블록높이, 블록생성주기
블록체인에서 ‘블록높이’라는 개념은 ‘블록은 계속 쌓이며, 중간 블록이 소실되면 전체 블록체인이 흔들린다’라는 말에 의해 등장하였다.
이전 블록이 아래에, 최근 블록이 위에 오도록 블록들을 정렬하면, 블록이 생성됨에 따라 체인의 높이가 높아진다. 블록의 순서를 그 블록이 위치한 ‘높이’(block height)라 부른다. 첫번째 블록은 편의상 높이를 0이라 한다.
블록과 블록 사이에는 생성시간의 갭이 존재한다. 이 갭을 ‘블록생성주기’라고 부른다. 다만, 블록체인에서 정한 블록생성주기가 항상 일치하는 것은 아니고, 특정 기간에 수렴하도록 설정한다.
블록생성주기가 중요한 이유는 체결과 관련있기 때문이다. 블록이 생성되어 블록체인에 최종적으로 등록되는 것을 ‘체결’이라고 부른다. 만약 블록생성주기가 15분이라면, 체결되는데 15분 정도 소요되고, 1초라면, 체결되는데 1초 정도 소요된다.
궁금증 : 블록생성주기 동안에 특정 계좌에서 발생되는 거래는 오직 하나여야 할까? 여러 거래가 발생할 경우 계좌의 synchronization이 보장될까?
→ 해당 계좌에서 여러 트랜잭션이 발생했을 때 실제 블록에 기록되는 트랜잭션은 하나이다. 여러 트랜잭션이 발생했다고 하더라도, 가장 먼저 도착한 트랜잭션이 등록되게 된다.
블록체인 네트워크
블록체인은 기본적으로 P2P(Peer-to-Peer) 구조이다. 중앙 서버에 의존하고 있는 구조가 아니다. 네트워크 참여자 전원은 모든 블록을 동일한 순서로 저장하여 모두 같은 블록체인을 유지한다.
합의 (Consensus)
- 자격이 있는 참여자는 블록을 제안(propose)할 수 있음
- 블록 제안 자격은 네트워크마다 상이하다.(ex. PoW, PoS)
- 노드들은 제안자가 올바른 자격을 취득했는지, 제안된 블록이 올바른지 검증한 뒤 블록을 자신의 체인에 추가한다.
- 정족수 또는 정해진 기준을 만족하는 수의 노드가 블록을 자신의 체인에 추가하면 합의가 이뤄졌다고 판단한다.
정리 : 블록체인의 성질
- 블록체인은 한명 이상의 참여자가 있는 네트워크에서 관리
- 네트워크 참여자 전원은 모든 블록을 동일한 순서로 저장하여 모두 같은 블록체인을 유지
- 자격이 있는 참여자는 블록을 제안할 수 있음. 블록 제안 가격은 네트워크마다 상이
- 블록이 체인에 추가됨 ⇒ 참여자들이 새 블록을 자신의 체인에 추가
- 따라서 새로운 블록이 체인에 추가되려면 네트워크의 합의가 필요. 합의방법은 네트워크마다 상이
- 어느 한 주체가 단독으로 결정하는 구조가 아닌, 여러 참여자가 합의를 통해 결정하기 때문에 블록체인은 탈중앙화되어 있다고 표현
- 참여자 전원은 이전 블록들을 저장하고 있으므로 새로운 블록의 무결성을 확인가능
- 새롭게 제안되는 블록은 참여자들이 검증 및 합의할 수 있는 형태여야 함.(투명성)
- 한번 쓰여진 블록은 이전의 합의를 번복할 수 있지 않는 한 변경될 수 없음. (불변성)
합의 알고리즘
| PoW | PoS | BFT-variants |
---|
제안자격 취득 방법 | 계산이 어려운 문제를 풀 것 | 플랫폼 토큰을 보유한 기간에 따라 결정적으로 또는 확률적으로 뽑힐 것 | 정해진 순서 또는 정해진 확률에 의해 뽑힐 것 |
네트워크 참여 제한 | 없음 | 없거나 낮음 | 높음 |
합의에 필요한 연산량 | 높음 | 낮음 | 낮음 |
위협 | 전체 연산량의 51%를 한 참여자가 소유할 경우 중앙화 됨 | 전체 토큰의 51%를 한 참여자가 소유할 경우 중앙화 됨 | 전체 참여노드의 1/3 이상이 담합할 경우 합의 불가. 전체 참여노드의 2/3 이상이 담합할 경우 중앙화됨 |
대표적인 블록체인 | Bitcoin, Litecoin, Ethereum, Monero, QTUM | Ehtereum FFG & CFG, EOS(dPos) | Klayton, Tendermint, Hyperledger Fabric |
- PoW는 네트워크 참여 제한이 없지만, difficulty가 증가하면서 진입장벽이 생기게 된다.
- PoS는 토큰을 많이 보유한 사람이 유리한 구조이기 때문에, 바로 PoS를 도입하지는 않는다. PoW를 통해 토큰을 다양한 곳에 분포시킨 이후, PoS를 적용한다.
- BFT에서는 각 노드들이 네트워크에 참여하고 있는 모든 노드들을 알고있다. 네트워크에 참여하고 있는 노드들이 많아질 수록 합의를 위한 통신이 많아진다. 따라서, 합의가 느려지게 된다. BFT에서는 2/3가 합의에 대해 승인해야 블록이 인정된다.
블록체인의 비교
Public vs. Private
퍼블릭과 프라이빗의 구분은 블록체인에 대해 다음 사항을 수행할 수 있는지를 확인하여 결정한다.
- 누군든지 기록된 정보(블록)을 자유롭게 읽을 수 있는가?
- 명시적인 등록 또는 자격취득 없이 정보를 블록체인 네트워크에 기록할 수 있는지?
블록체인의 정보가 공개되어 있고 네트워크가 정한 기준(e.g., gas fee)에 따라 정보를 기록요청할 수 있다면 그 블록체인은 퍼블릭/공개형이라 한다.
이와 반대로 정보가 공개되어 있지 않고 미리 자격을 득한 사용자만이 정보를 기록할 수 있다면 그 블록체인은 프라이빗/비공개형이라 한다.
Permissionless vs. Permissioned
일반적으로 네트워크의 참여가 제한된 경우 ‘permissioned’, 그렇지 않은 경우 ‘permissionless’라 정의한다.
네트워크의 참여의 정의
- (넓은 의미) 블록체인 P2P 네트워크에 참여
- (좁은 의미) 합의과정의 참여
Public/Private의 개념이 정보의 접근성(Acecss)와 관련이 있다면 Permissionless/Permissioned는 정보의 제어(Control), 즉 무엇이 블록에 포함되는지를 결정하는 지에 더 밀접한 개념이다.
공개키 암호화와 전자서명
암호
- 고전적인 암호 : 카이사르 암호 암호하려는 내용을 아파벳별로 일정한 거리(distance, d)만큼 밀어서 다른 알파벳으로 치환하는 기법. 암호를 풀거나 만들때 알아야하는 정보를 키(Key)라고 함. 위 예제에서 사용된 키는 d=3.
대칭키암호/비대칭키암호
평문(Plain text)이란 암호화 되어 있지 않은 문자열을 의미
- 암호화는 평문을 암호로 만드는 것 (cipher, encrypt)
- 복호화는 암호를 평문으로 만드는 것 (decipher, decrypt)
암호화에 사용한 키와 복호화에 사용한 키가 동일한 경우 대칭키암호로 분류
암호화에 사용한 키와 복호화에 사용한 키가 다를 경우 비대칭키암호로 분류
비대칭키암호(공개키암호)
블록체인에서는 비대칭키암호를 사용한다.
두개의 키를 사용하여 암호화와 복호화를 실행
- 암호화에 사용되는 키 = 공개키(Public Key, PK)
- 복호화에 사용되는 키 = 비밀키(Private Key/Secret Key, SK)
비대칭키 암호의 목적:
“누구든지 암호화할 수 있지만 비밀키를 아는 사람만 복호화할 수 있어야 한다”
- 공개키와 비밀키는 한쌍으로 묶여있는 아주 큰 숫자들
- 비밀키로부터 공개키를 도출하는 것은 쉬움
- 공개키로부터 비밀키를 찾는 것은 매우 어려움
공개키암호를 사용한 안전한 통신
전자서명
비대칭키암호는 지정된 사람만 정보를 확인할 수 있도록 도움(Privacy)
- Alice가 Bob에게 메세지를 보낼 때 PK(Bob)을 사용
- Bob은 이 메세지가 Alice에게서 온 것인지 어떻게 확인할까?
전자서명은 누가 정보를 보냈는지 알기 위해 사용(non-repudiation)
- 전자서명은 비대칭암호의 응용 프로그램
- 서명은 비밀키로만 생성가능
- 공개키는 서명이 짝을 이루는 비밀키로 생성되었는지를 검증
공개키암호와 전자서명을 사용한 안전한 통신
- 해싱을 추가한 경우(메세지가 변조됬지 않았다는 것을 증명)
블록체인에서 사용되는 암호화 기법
- 블록체인은 암호학적 기법을 토대로 만들어진 기술
- Bitcoin은 네트워크 참여자 모두가 같은 ‘원장’을 공유함으로써 투명한 거래가 가능
- 원장은 어느 주소에 BTC가 있는지 기록하지만 그 주소가 누구에게 속하는지는 기록하지않음(anonymity)
- Bitcoin은 공개키암호를 사용하여 명시적인 비밀교환과정 없이 BTC의 소유권 증명을 실행
공개키암호화를 사용한 소유권 증명
- 대부분의 블록체인 주소는 공개키로부터 도출된 값
- Bitcoin : Hash 160 of a public key where Hash 16 = RIPEMD 160 + SHA256
- Ethereum : Rightmost 160 bits of Keccak hash of public key
- Bitcoin의 경우 임의의 주소 X에 10 BTC가 있다고 가정할 때 Alice는 X에서 또다른 임의의 주소 Y로 5 BTC를 전송(i.e., transfer 5 BTC X to Y)하는 거래를 성사시키기 위해 X로 변환되는 공개키와 짝을 이루는 비밀키로 해당 거래를 서명할 수 있어야 한다.
- 실행과정 X에서 transaction을 비밀키로 암호화 → 암호화된 transaction을 공개키와 함께 네트워크에 전송(공개키 256bit + 암호화된 transaction 256bit = 516bit) → 노드들은 공개키로 암호화된 transaction을 복호화 & 복호화된 transaction의 to_address가 공개키에서 도출가능한 것인지 확인 → 만약 성립한다면 transaction을 인정
- Ethereum의 경우 임의의 주소 X에 위치한 어카운트의 잔고에 10 ETH가 있다고 가정할 때 Alice는 X에서 또다른 임의의 주소 Y에 위치한 어카운트로 5 ETH를 전송(i.e., transfer 5 ETH from the account at X to the account at Y)하는 거래를 성사시키기 위해 X로 변환되는 공개키와 짝을 이루는 비밀키로 해당 거래를 서명할 수 있어야 한다.
- 실행과정 Bitcoin과 유사하지만, 특정 기법을 활용하여 512bit를 256bit로 축소
구현 방법으로 나눠본 블록체인
UTXO는 코인에 주소를 부여하는 방법이고, 어카운트 기반은 어카운트(계좌)에 주소를 부여하고 어카운트에 balance라는 상태값이 존재하는 방법이다.
UTXO(Unspent Transaction Output) 기반 블록체인
- 블록체인에 사용 가능한 토큰(e.g., Bitcoin) - UTXO들과 사용 자격검증방법을 기록
- 일반적인 자격검증방법은 UTXO의 정보와 일치하는 공개키로 검증가능한 전자서명을 제출하는 것
- Bitcoin이 대표적인 UTXO 기반 블록체인
- 돈과 전자서명이 매칭할 수 있어 병렬 작업에 용이하다.
어카운트 기반 블록체인(Account-based Blockchain)
- 어카운트는 블록체인을 구성하는 주체(entity)를 표현하며 상태를 기록
- 사용자는 어카운트를 사용할 때마다 어카운트 공개키로 검증가능한 전자서명을 생성
- 상태를 기록할 수 있기 때문에 스마트 컨트랙트를 구현하기에 용이
- Ethereum, Klayton이 대표적인 어카운트 기반 블록체인
- 어카운트에서 발생하는 트랜잭션들의 순서가 바뀌는 결과값이 바뀌기 때문에, 한 어카운트에서 동시에 여러 트랜잭션을 수행할 수 없다.
- 대신 상태를 가지고 있기 때문에 스마트 컨트랙트 구현이 가능하다.
Ethereum 어카운트, 주소, 상태
- Ethereum의 어카운트는 Ethereum의 주체(entity)를 표현하고 그 상태를 기록하는데 사용
- 어카운트는 EOA(Externally Owned Account)와 스마트 컨트랙트로 구분
- Ethereum 사용자는 EOA를 사용
- 사용자는 임의의 공개키와 비밀키 쌍(Key Pair)을 생성한뒤 공개키를 어카운트 주소로 변환하여 EOA를 생성
- 별도의 승인과정이 필요없으며 Ethereum 네트워크와 통신도 필요없음
- 위 과정으로 인해 어카운트는 특정 키페어에 종속
- 사용자의 상태(state)는 어카운트 주소로 찾을 수 있는 블록체인 저장공간에 기록
- 비밀키 → 공개키 → 주소
트랜잭션(Transaction, TX)
- 블록은 트랜잭션들을 일정한 순서로 정렬하여 저장하는 컨테이너
- 트랜잭션은 어카운트의 행동
- 트랜잭션의 순서는 중요:
TX_1 → TX_2
와 TX_2 → TX_1
은 다름
- 블록체인 참여자들은 블록을 검증할 때 트랜잭션들이 올바른 순서대로 정렬되었는지를 확인 후 합의
- 각각의 트랜잭션들은 어카운트에 연결된 공개키로 검증간으한 서명을 포함
Transaction Journey(트랙잭션이 블록에 저장되는 과정)
- Alice는 노드에게 TX를 전달한다.
- 노드는 다른 노드들에게 TX를 전달한다.
- 그러던 중, 특정 노드에서 블록을 생성하게 된다.
- 해당 블록에는 Alice의 TX가 포함되있고, 해당 TX는 1 confirmaion을 받았다고 말한다.
- 해당 블록 위로 다른 블록들이 쌓일수록 해당 TX의 confirmaion은 증가한다.
Confirmation vs. Finality
- Confirmation 숫자는 트랜잭션이 블록에 포함된 이후 생성된 블록의 숫자
- 임의의 트랜잭션 T가 포함된 블록의 높이가 100, 현재 블록높이가 105라면 T의 confirmation 숫자는 6
- PoW를 사용하는 블록체인들은 finality가 없기 때문에 confirmation 숫자가 중요
- Finality란 블록의 완결성을 의미
- 합의를 통해 생성된 블록이 번복되지 않을 경우 완결성이 존재
- PoW 기반 합의는 확률에 기반하기 때문에 경우에 따라 블록이 사라질 수 있으므로 완결성이 부재함
- PoW 블록체인은 수학적으로 복잡한 퍼즐을 풀어 블록을 제안할 자격을 얻는 구조
- 만약 두명의 서로 다른 참여자가 동시에 퍼즐을 풀어 두개의 올바른 블록을 생성한다면 두 블록 중 하나는 (eventurally) 사라지게 됨
- 이 때문에 블록이 확률적 완결성을 갖기까지 일정 갯수 이상의 블록이 생성되기를 기다려야 함.
- 예시 비트코인이나 이더리움 같은 블록체인은 규모가 크기 때문에 전 세계에 노드들이 분포되있다. 만약 양 끝 지점에 있는 노드에서 각각 블록을 동시에 생성할 경우 어떤 일이 발생할까? 두 노드 주변에 있는 노드들을 본인들의 블록이 옳다고 인정할 것이다. 하지만, 가운데 있는 노드들은 어떤 블록이 옳은 블록인지 알지 못한다. 따라서, 더 긴 블록체인에 포함되 있는 블록이 (eventually) 선택되고, 나머지 블록은 사라질 것이다.
Understanding Bitcoin’s 6 Confirmations Rule
- 네트워크 시차로 인해 생성된 우연한 복수의 블록들 가운데 하나가 선택되는데 필요한 블록은 두어개 정도 → 2~3 confirmations
- 퍼즐을 빠르게 풀 수 있는 악의적인 참여자(공격자)가 있을 경우 그 참여자의 해시능력(hash power)에 따라 필요한 confirmation 숫자가 달라짐
- 해시능력이 높을 수록 퍼즐을 푸는 속도도 빠르기 때문에 주어진 문제를 먼저 풀 확률이 높아짐
- 해시능력이 높은 참여자는 longest chain을 임의로 선택 또는 생성할 수 있음
- 따라서 해시능력을 감안하더라도 임의로 블록체인을 변경하지 못할 정도로 충분히 많은 블록이 생성되기를 기다려야할 필요가 생김
- Bitcoin의 6 confirmation 법칙은 공격자가 전체 해시능력의 약 25%를 가질 때를 가정한 숫자
BFT 기반 블록체인
- BFT 기반 블록체인은 블록의 완결성이 보장됨
- 네트워크가 동기화되어 있기 때문
- 블록 생성이 PoW에 비해 빠르고 경제적
- 하지만 네트워크 동기화의 필요로 인해 참여자의 숫자가 제한됨
- 네트워크 참여자 구성이 고정되어 있어야 합의가 가능
- 구성이 변경될 경우 모든 네트워크 참여자가 새로운 구성을 인지하기 까지 합의 불가능
- 합의 알고리즘이 네트워크 동기화를 가정하고 짜여졌기 때문에 네트워크 사용량이 높음
- 참여자가 많아질 경우 네트워크 오버헤드로 인해 합의가 느림