본문 바로가기

컴퓨터, IT/채굴

블록체인 공부 - 암호화폐는 왜 "암호"화폐인지? (feat. 비트코인 원리)

반응형

안녕하세요?

 

오늘은 주저리 주저리 포스팅을 해보겠습니다.

채굴에 입문하면서 생긴 궁금증에 대해서 썰을 풀어보았습니다.

관련 분야 전공자가 아니라서 내용에 결함이 있을 수 있어요.

틀린 내용을 발견하시면 댓글로 알려주세요~!

 

 

 

1. 궁금증의 시작

 

컴퓨터 공학을 전공하진 않았지만 코딩과,, 관련 배경지식이 있는 글쓴이는 컴퓨터 조립을 좋아합니다.

비트코인이 한창 성행하던 2017년도에는 관심이 없었지만,

근래 무슨 바람이 들었는지 그래픽카드를 구해서 채굴기를 하나 만들었습니다.

 

보통 "채굴기"라고 부르면 그래픽카드를 6개 혹은 8개, 많으면 12개까지 꽂아서 1개의 cpu와 메인보드에서 최대한 많은 그래픽카드로 연산을 하는 구조를 부르는데요. 글쓴이는 소소하게 그래픽카드 1~4개 정도 할 생각으로 만들어서 돌렸습니다. 그리고 실제로 업비트나 빗썸으로 보내어 원화로 바꾸기에 이르렀습니다.

 

채굴을 하는 중에 궁금증이 생깁니다.

"컴퓨터를 켜놓으니까 진짜 코인이 생기네?" 라는 신기함 부터 시작해서,

코인을 어떻게 원화로 바꾸지? 등등 [채굴 ↔ 거래소 ↔ 돈]에 연결된 궁금증을 해결하다보면 이런 의문에 도달합니다.

"왜 돈이 벌리는거지?"

 

물론 사람이 곡괭이를 들고 금을 캐던 시절에 광부들은 "금이 여기에 왜있는 것이고 왜 돈이되는거지?" 에 대해서 알 필요가 없긴 합니다. 그저 금은 돈이 되니까 금을 발견하면 되는거죠. 마찬가지로 이더리움이 돈이 되니까 이더리움을 캐기만 하면 됩니다. 하지만 그냥 궁금하니까 알아보도록 합니다 ㅋㅋ.

 

 

2. 암호화폐와 블록체인

 

여튼 그것을 알려면 코인이 어떻게 되어있는 구조인지 알아야 합니다.

자연스레 "암호화폐"가 무엇인지 들어가게 되는데요. 암호화폐는 "블록체인" 기술을 사용했다고 어디선가 들으신 적이 있을겁니다.

그럼 블록체인이 뭔지 알아볼까요.

 

이름에서도 알 수 있듯이, 블록체인은 "블록"을 "체인"으로 이어둔 형태입니다.

조금 황당하겠지만 세부적인 것은 뒤로 미루고 하나씩 살펴보겠습니다.

 

"블록"은 정보, 즉 데이터를 담고 있는 블록을 뜻합니다.

블록은 두 가지로 구성이 됩니다. 헤더와 바디인데요.

헤더는 버전, 이전블록 해시, 머클루트, 시간, 난이도(Target), 논스(Nonce) 값을 가지고 있습니다.

 

바디는 거래정보를 담고 있습니다.

바디의 거래정보를 해시함수 처리한 것이 "머클루트"값이 됩니다.

 

헤더와 바디를 합치면 블록이 되고,

블록은 거래정보들과 기타 각종 정보를 담고있는 데이터 덩어리로 이해할 수 있습니다.

 

 

 

"체인"은 블록간의 상관성을 뜻합니다.

복잡하지만 일단 블록은 일련의 정보를 담고있다고 알았습니다.

그럼 다른 거래정보를 추가해서 다음 블록을 찾아야겠죠?

다음 블록은 아무렇게나 만들 수 있는 것이 아닙니다. 바로 Target 값보다 작은 블록을 찾아야하는데요,

Target 값보다 작은 블록을 찾기 위해서 Nonce를 조절해가면서 다음 블록을 찾아야 합니다.

 

'오잉? 이게 무슨소리지?'라는 생각이 드실겁니다. 이 부분에서 비트코인, 이더리움 등이 왜 "암호화폐"라고 불리는지 이유가 나옵니다.

 

바로 SHA-256 알고리즘을 사용하기 때문인데요.

SHA-256 알고리즘은 단방향 "암호화 알고리즘"이고 1990~2000년도에 미국 국가안보국 NSA에서 개발한 알고리즘입니다.

SHA는 Secure Hash Algorithm 이라는 의미입니다.

블록체인의 블록간 상관성 혹은 블록 내 데이터의 상관성 (머클트리와 머클루트의 관계에도 SHA가 사용됨)에 SHA 알고리즘이 사용됩니다. 바로 암호알고리즘이 사용되기 때문에 "암호화폐"라고 부를 수 있는 것입니다.

 

SHA-256이 무엇인지 알아보겠습니다.

일단 제일 겉 표면부터 볼까요.

 

"input → SHA-256 알고리즘 → output"

 

위 과정에서 input은 제한이 없습니다.

 

output은 64개의 hexacode로 나옵니다. 즉,

"0123456789abcdf" 의 글자로 이루어진 64개의 문자열이 나옵니다.

 

헥사코드 하나는 4bit이므로 헥사코드가 64개라면?

(2^4)^64 = 2^256 의 경우의수가 됩니다.

 

SHA-256의 출력은 2의 256승에 해당하는 경우의 수를 가지고 있습니다.

즉, 매우 많은 경우를 표현할 수 있습니다.

 

SHA-256과 숫자가 겹치죠? 맞습니다.

SHA-256에서 "256"은 2^256을 의미하고,

SHA-384, SHA-512는 각각 2^384, 2^512를 의미합니다.

 

output을 가지고 input을 유추하기 매우 어려우며 (불가능함)

output사이의 중복은 이론상은 가능하나 거의 불가능합니다.

2^256 경우의수가 매우 많아서 중복되는 값이 없다고 볼 수 있는거죠.

 

같은 output을 가지는 두개의 input이 발견된다면 그것을 "충돌, Collision"이라고 부릅니다.

 

SHA-256 이전에 있었던 SHA-0, SHA-1의 알고리즘은 충돌이 발견되었습니다.

즉 다른 input을 넣었는데 같은 output이 나오는 경우가 있는것이죠.

 

자 시험삼아 SHA-256으로 해시값을 보겠습니다.

 

"시골필부"에 해당하는 SHA-256 값입니다.

425e10bc4449af7183bab2f82beeeed65abba52f7ed8c5ee3305d32c884f9d78

 

"시골필부2"에 해당하는 SHA-256 값입니다.

da2e3650f8278ed2fff9331b16939e086ce5924c702347e5c04a432ff6bdd962

 

숫자 2가 추가되었을 뿐인데 값이 매우 달라집니다.

이것은 암호 알고리즘의 특징이며 output을 가지고 input을 유추할 수 없는 성질입니다.

 

SHA-256이 어떻게 되어있는 함수길래,

무엇을 넣던 확확 변화시켜 인풋을 추정할 수 없는 아웃풋을 만드는 것일까요?

그것은 글쓴이도 공부가 필요하고,

공부하기 위해 링크를 남겨둔채 다음으로 넘기겠습니다.

https://m.blog.naver.com/vjhh0712v/221447601982

https://up-to-date-items.tistory.com/108

https://steemit.com/kr/@yahweh87/5

 

손으로 SHA-256을 푸는 youtube 동영상도 있는데요.

그것보다는 스택오버플로우에 올라온 엑셀을 뜯어보는게 훨씬 빠를 것 같네요.

https://stackoverflow.com/questions/46509572/excel-formula-based-function-for-sha256-sha512-hashing-without-vba-or-macros

 

VBA없이 엑셀 함수만으로 SHA-256을 구현해 놓은 파일이 들어있고,

공부에 매우 도움이 될 것 같아요.

 

 

 

옆으로 많이 샜는데요.

블록체인은 정보덩어리 "블록"과 체인으로 다음 블록이 연결된 구조라고 알아보았습니다.

블록은 거래정보를 담고있으며,

체인은 블록1, 블록2 사이의 상관관계인데,

그 상관관계에는 암호학 알고리즘 SHA-256이 적용된다고 알아보았습니다.

 

SHA알고리즘은 역으로 추정이 힘들고,

값들 사이에 충돌이 없으며(1인풋 1아웃풋)

인풋이 조금만 바뀌어도 아웃풋 값이 크게 바뀌는 것을 알아보았습니다.

 

블록에 "Target"값이 들어있다고 했는데요.

Nounce를 바꾸어 가면서 Target보다 값이 작은 다음 블록의 주소를 찾아야합니다.

다음 블록을 찾게되면 보상으로 코인을 받게되는 것이죠.

 

이것을 찾는게 채굴자들이 하는 일입니다.

하지만 블록을 혼자 찾을 수 없으니 Pool에 모여서 찾게됩니다.

혼자도 찾을 수 있지만 개인의 작은 계산력으로는 거의 불가능에 가깝다고 봐야겠죠.

 

다음 블록을 찾게되면 주변 노드들이 정합성을 검증하고 이상이 없으면 블록이 연결되는 과정입니다.

 

실제로 블록을 들여다 볼까요?

https://www.blockchain.com/btc/block/0000000000000000000183111bb4f48620528f1214bb542289e1bfd038c9f39e

 

비트코인 블록 713320번입니다.

71만개의 블록이 생성된 상태고 (코인 발행량과 블록생성은 관계없음)

Hash 값과 머클루트에 hexacode로 된 글자들이 보이죠?

 

자세히 세보시면 64글자입니다!.

SHA-256의 아웃풋이라는 뜻이죠.

 

 

 

 

 

블록을 찾아낸 pool은 6.25BTC의 보상을 가져갔겠네요.

해당 pool에서 연산에 참여했던 사람들 그리고 pool의 수수료로 나누어 지급이 되겠죠.

 

밑으로 Transactions 정보들이 담겨있는게 보이실겁니다.

코인베이스에서 일어난 거래정보가 포함되어 있음을 알 수 있습니다.

 

 

여기까지 마치도록 하고,

다음번에 기회가 된다면 SHA 알고리즘을 배워와서 포스팅 해두겠습니다.

 

 

 

 

 

 

번외. 글자크기

헥사코드 1개는 2^4이며 4bit입니다.

문자열마다 몇 비트인지 알아보겠습니다.

ASCII, UTF-8등 인코딩 방식마다 글자의 크기가 다르지만 ASCII 기준으로 아래와 같습니다.

(UTF-8에서느 영문,숫자는 1바이트, 한글은 3바이트)

 

영문자 하나는 8bit입니다.

한글 하나는 16bit입니다.

 

8bit는 1byte와 같습니다.

따라서 영문자는 1바이트, 한글은 2바이트입니다.

 

1byte는 2^8에 해당하는 경우의 수를 가집니다.

 

 

 

번외. ASIC?

알고리즘은 코인마다 특성이 달라서 이더리움은 SHA-256 외에 다른 알고리즘으로 복잡하게 되어있습니다.

따라서 SHA-256만 사용하는 비트코인 계열은 ASIC채굴기가 제작될 수 있는 이유가 바로 그것입니다.

SHA-256외에 추가적인 알고리즘이 적용되어 ASIC구축을 힘들게 만드는 이더리움 계열의 코인은 하드웨어로 계산과정을 반영하기 어렵습니다.

 

참고로 ASIC은 application-specific integrated circuit을 의미하며,

SHA-256의 알고리즘은 이미 계산방법이 있는 관계로 회로구성을 한다면 최적화된 "계산기"를 만들어낼 수 있습니다.

 

 

 

 

번외. SHA-256의 응용

SHA-256은 상당히 많은 부분에 사용이 되고 있습니다.

ID/PW에서 PW의 저장을 SHA-256의 결과값으로 한다면 input은 사용자 본인밖에 모르니 안전하겠죠?

 

또한 프로그램의 진위판단에도 사용되는데요.

최초발행 프로그램을 SHA-256으로 Hash값을 공지해둔다면,

뒤이어 받아 사용하는 사용자가 프로그램을 SHA-256으로 처리시 같은 Hash가 나와야 진본이라는 것을 알 수 있을겁니다. 누군가 추가 코드를 심어놓아 프로그램의 코드가 변경되었다면 다른 Hash값을 같게 될 것이고 사용자는 이것을 알아차릴 수 있을겁니다.

 

https://pixabay.com/images/id-3109378/