임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수로, 다음과 같은 특징을 갖습니다.
역상 저항성(preimage resistance)
주어진 해시 값에 대해, 그 해시 값을 생성하는 입력값을 찾는 것이 계산상 어렵다. 즉, 제 1 역상 공격에 대해 안전해야 한다. 이 성질은 일방향함수와 연관되어 있다.
제 2 역상 저항성(second preimage resistance)
입력 값에 대해, 그 입력의 해시 값을 바꾸지 않으면서 입력을 변경하는 것이 계산상 어렵다. 제 2 역상 공격에 대해 안전해야 한다.
충돌 저항성(collision resistance)
해시 충돌에 대해 안전해야 한다. 같은 해시 값을 생성하는 두 개의 입력값을 찾는 것이 계산상 어려워야 한다.
일방향함수
계산하기는 쉽지만 역을 구하는 것은 어려운 함수
아래는 sha-256으로 인자로 받은 문자열의 해시값을 출력하는 파이썬 소스입니다.
import hashlib
import sys
string = sys.argv[1]
hashSHA= hashlib.sha256()
hashSHA.update(string)
hexSHA256=hashSHA.hexdigest()
print("SHA-256 : "+hexSHA256.upper())
어떤 문자열을 입력해도, 정해진 길이의 데이터를 출력합니다. (64문자 * 4 bit = 256bits)
일반적으로 해시 값이 중복될 일이 거의 없으며, 해시 값을 주고 입력 값을 찾을 수 있는 특별한 공식도 없습니다.
마침표를 하나 붙이는 것으로도 해시값이 완전히 바뀌게 됩니다. 그리고 이러한 특징은 블록체인에서 유용하게 사용됩니다.
블록체인의 구조를 다시한번 보면
한 블록은 전 블록의 해쉬값을 가지고 있습니다. 만약 이전 블록값이 변소조된다면, 그 블록의 해쉬값을 참조하는 다음 블록의 해쉬값도 바뀌어서 연쇄적으로 다음 블록들도 전부 바뀌게 될 것입니다. 채굴은 이 전 블록의 해쉬값을 참조해 다음블록을 생성하는 작업입니다.
쉽게 말하면 거래 내역을 정리하고 암호화해서 정리하는 작업입니다. 채굴 작업에는 많이 연산이 필요로 되는데 이런 작업들을 한 보상으로 수수료가 지급됩니다.(비트코인, 이더 등)
누가 블록을 채굴할지와 어느 체인이 유효한지를 결정
블록체인에는 다수의 피어(채굴자)들이 존재하고, 이 피어들이 블록체인을 유지(채굴)하기 위해서 채굴자들은 합의를 해야합니다. 합의 알고리즘에는 여러 알고리즘이 존재하고 가장많이 사용되는 알고리즘이 pow와 pos입니다.
먼저, 기존 합의 방식에 대해서 알아봅시다.
1) 기존 합의 방식
중앙 집중형 방식에서 서비스의 제공자가 주체가 되어 사용자의 기록을 관리
장점_빠른 서비스를 제공(채굴이 필요없음)
단점_중앙기관이 악의적 의도로 조작가능, 해커는 중앙기관만 해킹하면 기록을 조작 가능.
2) pow (proof of work)
거래승인 과정에 많은 연산이 필요한 작업을 수행하고, 가장 긴 블록체인을 합의하고 다른 기록은 폐기합니다.
장점_데이터의 무결성을 보장합니다.
단점_채굴의 집중화와 독점할 수 있고, 과도한 에너지 소비 문제가 발생합니다.
3) pos(proof of stake)
채굴 시스템에서 사용자의 소유 지분이 블록 생성권의 지분을 나타냅니다.
장점_블록의 생성 주기가 짧아 독점을 방지할 수 있습니다.
단점_전체 네트워크의 노드 상태를 알아야하며, 지분율이 높은 사용자가 블록을 생성할 확률이 높아 빈익부 빈익빈 현상이 일어날 수 있습니다.