작업 증명 ( Proof - of - Work : PoW ) 알고리즘 이란 ? : : 개인 적 인 공간 
 1 , 394 / 1 , 352 / 414 , 193 
 작업 증명 ( Proof - of - Work : PoW ) 알고리즘 이란 ? 
 2018 . 07 . 11 22 : 36 
 작업 증명 ( Proof - of - Work ) 방식 의 합의 알고리즘 은 비트코인 에서 사용 되 는 합의 알고리즘 으로써 어떤 트랜잭션 이 발생 했 을 경우 해당 트랜잭션 이 유효 한 트랜잭션 인지 에 대한 합의 방법 및 새로운 블록 이 진짜 인지 , 가짜 인지 에 대한 검증 을 수행 합니다 . 작업 증명 방식 ( PoW ) 을 이해 하 기 위해서 는 우선 마이닝 과정 에 대한 개념 정리 가 필요 합니다 . 
 마이닝 ( 채굴 ) 이란 ? 
 마이닝 ( 채굴 ) 이 란 임의 의 nonce 값 을 대입 하 여 블록 해시 결과 값 을 생성 하 고 , 생성 된 결과 값 이 제시 된 Target 보다 작 은 블록 해시 를 찾 는 과정 입니다 ( 자세 한 내용 은 아래 에서 설명 ) . 해시 함수 의 특징 때문 에 어떤 nonce 값 을 대입 해야 제시 된 Target 보다 작 은 블록 해시 정보 를 찾 을 수 있 을지 는 알 수 없 습니다 . 
 즉 올바른 결과 값 을 찾 기 위해서 는 nonce 의 값 을 0 부터 1 씩 증가 시키 면서 제시 된 Target 보다 작 은 결과 값 이 나올 때 까지 무한 반복 작업 을 수행 해야 합니다 . 이러 한 수학 문제 를 풀이 하 는 과정 을 1 초 에 몇 번 이나 수행 할 수 있 는지 에 대한 수치 정보 를 해시 파워 라고 표현 하 며 , 해시 파워 가 높 은 마이너 일수록 더 많 은 문제 를 풀어낼 수 있 으며 더 많 은 문제 를 풀어낼 수 있 는 채 굴 자 가 새로운 블록 을 찾 을 확률 이 더 높 습니다 . 해시 파워 가 높 은 채 굴 자 일수록 더 많 은 일 을 수행 했 다는 의미 이 며 , 더 많 은 일 을 할 경우 확률 적 으로 더 많 은 보상 을 받 게 됩니다 . 그렇 기 때문 에 PoW 를 정의 할 때 더 많 은 일 을 한 채 굴 자 에게 더 많 은 보상 이 주어지 는 방식 이 라고 표현 합니다 . 
 블록 데이터 해시 연결 을 위해 블록 에 는 블록 헤더 데이터 를 해시 함수 로 계산 한 블록 해시 가 들어가 고 이 를 통해 해시 연결 성 을 검증 해 블록체인 데이터 가 중간 에 위변 조 가 되 지 않 았 음 을 확인 합니다 . 
 작업 증명 ( PoW ) 은 왜 필요 할까 ? 
 이러 한 작업 증명 알고리즘 의 필요 성 은 네트워크 의 모든 노드 가 동시 에 블록 을 만들 수 없 게 하 는 것 입니다 . 작업 증명 을 통과 해야 만 블록 을 생성 할 수 있 고 , 이 를 위해서 는 엄청난 에너지 가 소모 됩니다 . 그리고 작업 증명 알고리즘 은 Difiiculty 조절 알고리즘 을 이용 하 여 10 분당 1 ~ 2 개 의 블록 이 생성 된다는 것 을 보장 합니다 . 
 네트워크 의 노드 들 은 다음 블록 을 생성 하 기 위해 A 와 B 중 하나 의 블록 을 선택 하 여 블록 을 생성 합니다 . 다음 블록 을 생성 하 는 노드 는 A 와 B 중 하나 의 블록 에 연결 한 블록 을 생성 합니다 . 또 다시 A 를 선택 한 노드 와 B 를 선택 한 노드 가 동시 에 블록 을 생성 할 확률 은 굉장히 낮 겠 죠 . 나카모토 사토시 는 확률 증명 을 통해 블록 6 개 가 대립 되 는 블록 이 계속 생성 될 확률 은 0 에 가깝 다는 것 을 보였 습니다 . 
 블록 구하 는 방법 
 위 에서 는 마이닝 ( 채굴 ) 이 뭔지 와 작업 증명 이 왜 필요 한지 를 설명 했 습니다 . 지금 부터 는 블록 을 어떻게 구할 지와 작업 증명 의 성공 여부 를 확인 하 는 방법 을 설명 하 겠 습니다 . 
 https : / / www . blockchain . com / 에 들어가 면 현재 채굴 이 된 블록 을 조회 할 수 있 습니다 . 아래 의 예시 는 125552 번 째 블록 을 채굴 한다고 가정 하 여 125552 를 검색 해 정보 를 확인 합니다 . ( https : / / www . blockchain . com / btc / block / 00000000000000001 e 8 d 6829 a 8 a 21 adc 5 d 38 d 0 a 473 b 144 b 6765798 e 61 f 98 bd 1 d - 125552 를 검색 한 결과 URL ) 
 위 URL 처럼 정보 를 구성 하 여 요청 하 면 125552 번 째 블록 정보 를 JSON 형태 로 제공 받 을 수 있 습니다 . 참고 로 위 의 URL 의 / 125552 ? 이 부분 에 숫자 부분 이 블록 높이 정보 입니다 . 다른 블록 을 확인 하 고자 할 때 는 원 하 는 블록 높이 값 을 입력 하 여 호출 하 면 됩니다 . 
 여기 서 필요 한 값 은 ver , prev _ block , mrkl _ root , time , bits , nonce 입니다 . 위 정보 로 확인 하 면 nonce 가 2504433986 일 때 , 해시 함수 의 결과 값 이 00000000000000001 e 8 d 6829 a 8 a 21 adc 5 d 38 d 0 a 473 b 144 b 6765798 e 61 f 98 bd 1 d 으로 작업 증명 이 성공 한 것 을 알 수 있 습니다 . 
 블록 해시 구하 는 법 
 아래 에서 는 파이썬 3 . + 버전 으로 작성 하 여 연습 을 해 봅니다 . 
 # 125552 번 째 블록 정보 
 # 아래 의 정보 로 결과 가 00000000000000001 e 8 d 6829 a 8 a 21 adc 5 d 38 d 0 a 473 b 144 b 6765798 e 61 f 98 bd 1 d 나오 면 성공 
 ' hash ': ' 00000000000000001 e 8 d 6829 a 8 a 21 adc 5 d 38 d 0 a 473 b 144 b 6765798 e 61 f 98 bd 1 d ', 
 ' prev _ block ': ' 00000000000008 a 3 a 41 b 85 b 8 b 29 ad 444 def 299 fee 21793 cd 8 b 9 e 567 eab 02 cd 81 ', 
 ' mrkl _ root ': ' 2 b 12 fcf 1 b 09288 fcaff 797 d 71 e 950 e 71 ae 42 b 91 e 8 bdb 2304758 dfcffc 2 b 620 e 3 ', 
 ' time ': 1305998791 , 
 ' bits ': 440711666 , 
 ' fee ': 1000000 , 
 ' nonce ': 2504433986 , 
 # 1 . 버전 , 타임 , bits , nonce 정보 를 리틀 엔디 안 형태 로 변형 . 
 # 2 . 이전 블록 해시 , 머 클 루트 결과 값 을 모두 반대 순서 로 변형 
 # 3 . 블록 헤더 정보 를 모두 합산 ( 순서 가 꼭 맞 아야 합니다 . ) 
 # 4 . 바이너리 형태 로 변형 
 # 5 . SHA 256 으로 변환 한 결과 를 다시 SHA 256 으로 변환 ( 2 번 진행 ) 
 # 6 . hash 결과 를 뒤집 은 다음 16 진수 로 변경 
 # result : 00000000000000001 e 8 d 6829 a 8 a 21 adc 5 d 38 d 0 a 473 b 144 b 6765798 e 61 f 98 bd 1 d 
 위 의 코드 를 실행 하 면 현재 블록 의 해시 값 이 나온 것 을 확인 할 수 있 습니다 . 
 실제로 의 채굴 은 nonce 를 0 부터 1 씩 증가 시키 면서 Target 값 과 비교 하 여 작 거나 같 을 때 까지 반복 실행 합니다 . 
 ( 왜 값 을 Little Endian 으로 변형 하 고 16 진수 값 을 뒤집 고 하 는지 이유 는 . ..) 
 ver , time , bits , nonce 는 Little Endian 형태 로 변형 
 prev _ hash , mrkl _ root 는 결과 값 을 모두 반대 순서 로 변경 ( 16 진수 이 므로 2 개 씩 묶 어서 반대 로 변경 ) 
 헤더 정보 들 을 모두 합산 ( 문자열 값 을 이 어 붙임 . 이때 순서 가 변경 되 면 안 됨 ) 
 합산 한 헤더 정보 를 바이너리 형태 로 변경 
 SHA 256 형태 로 변경 한 결과 를 다시 SHA 256 으로 변형 
 5 번 에서 나온 결과 를 전부 뒤집 은 다음 16 진수 로 변경 
 작업 증명 성공 여부 의 기준 은 어떻 게 ? 
 작업 증명 의 성공 여부 뿐 만 아니 라 작업 난이도 도 bits 로 결정 이 됩니다 . 
 작업 증명 값 도출 방법 
 nonce 로 작업 증명 을 성공 하 기 위해선 bits 가 제시 하 는 숫자 와 같 거나 적 으면 성공 입니다 . 그런데 bits 에서 는 지수 와 가수 를 이용 하 여 표현 되 고 있 어 조금 복잡 합니다 . 예 를 들 어 , 수학 에서 큰 수 나 작 은 수 를 표현 할 때 , 0 . 1234 * 10 ^ 5 이나 0 . 1234 * 10 ^(- 5 ) 과 같이 표현 합니다 . 이 를 더 친숙 하 게 표현 하 자면 처음 예 를 든 수 는 12 , 340 이 고 마지막 수 는 0 . 000001234 입니다 . 이때 , 0 . 1234 를 가수 , 5 나 - 5 를 지수 라 표현 합니다 . 위 에서 Little Endian 으로 구한 bits 는 ffff 001 d 지만 Big Endian 으로 바꿔서 1 d 00 ffff 로 계산 해야 합니다 . Endian 으로 계산 한 수 는 16 진수 이 므로 2 자리 씩 끊 어서 이해 해야 하 므로 1 d , 00 , ff , ff 로 파악 해야 합니다 . 여기 서 bits 는 첫 수인 1 d 를 지수 로 보 고 00 ffff 는 가수 로 봐야 합니다 . 즉 , 1 d 는 진수 , 00 ffff 는 가수 로 봅니다 . ( 가수 의 경우 , 앞 에 소수점 0 . 이 생략 되 어 있 으므로 0 . 00 ffff 라는 의미 입니다 . ) 
 여기 서 bits 가 제시 하 는 숫자 의 계산법 은 00 . 00 ffff * 256 ^ 1 d 입니다 . 만약 지수 가 01 이 였 다면 256 ^ 1 로 소수점 이 우측 으로 한 칸 움직인 00 . ffff 가 됩니다 . ( * 여기 서 주의 할 점 은 16 진수 이 므로 16 당 1 칸 이 라 생각 하 면 됩니다 . ) 
 다시 위 구하 고자 하 는 bits 로 돌아오 면 [ 00 ] . [ 00 ] [ ff ] [ ff ] * 256 ^ 1 d 즉 [ 00 ] . [ 00 ] [ ff ] [ ff ] * 256 ^ 29 이 므로 ( 1 d 를 https : / / ko . calcuworld . com / % EC % 88 % 98 % ED % 95 % 99 / 16 % EC % A 7 % 84 % EB % B 2 % 95 -% EA % B 3 % 84 % EC % 82 % B 0 % EA % B 8 % B 0 / 에 넣 어 10 진수 로 변환 하 면 29 의 값 이 나옵니다 . ) 우측 으로 소수점 을 29 칸 옮기 라는 소리 입니다 . 다시 말 해서 [ ff ] [ ff ] 뒤 에 [ 00 ] 을 26 번 작성 하 면 됩니다 . 여기 서 끝 을 내 면 28 개 로 이루어지 기 때문 에 도출 한 28 개 의 값 앞 에 [ 00 ] 을 4 개 더 붙인 [ 00 ] [ 00 ] [ 00 ] [ 00 ] [ ff ] [ ff ] [ 00 ] [ 00 ] … [ 00 ] ( 32 bytes ) - ( 글자 수 로 는 64 자 ) 가 나오 게 됩니다 . 
 결과 적 으로 bits 가 제시 한 숫자 는 000000 ff 0000 . .. 00 ( 32 bytes ) - ( 글자 수 로 는 64 자 ) 입니다 . nonce 를 변경 해 가 며 위 에서 나온 해시 결과 값 이 이 값 보다 작 거나 같 아야 작업 증명 이 성공 하 게 됩니다 . 
 작업 난이도 
 블록 해 쉬 가 특정 숫자 보다 낮 게 나올 때 의 nonce 값 을 찾아내 는 것 이 작업 증명 이 라고 위 에서 설명 을 했 습니다 . 앞 에서 블록 해 쉬 는 32 바이트 의 숫자 라고 했 는데 , 이 를 가지 고 설명 하 려면 너무 복잡 하 기 때문 에 부호 가 없 는 1 바이트 로 가정 합니다 . 그러면 해시 함수 의 결과 값 은 0 ~ 255 사이 의 결과 가 나오 게 됩니다 . 만약 블록 해시 가 128 보다 작 아야 된다고 하 면 128 보다 작 은 블록 해시 결과 값 이 나올 확률 은 128 / 256 이 므로 50 % 의 확률 입니다 . 
 다시 블록 해시 결과 값 이 64 보다 작 아야 한다고 하 면 64 / 256 이 므로 25 % 의 확률 로 nonce 를 구할 수 있 습니다 . 여기 서 예시 를 든 128 , 64 라는 값 이 bits 입니다 . 
 보상 은 새로 발행 되 는 비트코인 과 해당 블록 에 포함 되 는 거래 의 거래 수수료 의 합 입니다 . 비트코인 의 새로운 발행 은 , 채굴 자 가 블록 을 처음 구성 할 때 채굴 자 의 지갑 으로 일정량 의 비트코인 이 입금 되 는 거래 를 그 블록 의 첫 거래 ( generation transaction ) 로 추가 하 는 방식 으로 이루어집니다 . 새로 발행 되 는 비트코인 은 최초 에 50 BTC 에서 시작 해서 블록 체인 에 21 만 개 의 블록 이 추가 될 때 마다 절반 으로 줄어듭니다 . 거래 수수료 는 각 거래 당사자 끼리 자율 적 으로 정할 수 있 고 , 거래 가 블록 에 추가 되 는 우선 순위 를 결정 하 는 데 거래 수수료 가 입력 값 으로 사용 되 기 도 합니다 . 즉 보상 은 nonce 값 을 찾아내 고 , 그 결과 새로운 블록 을 블록 체인 에 추가 해서 , 해당 블록 에 포함 된 모든 거래 를 유효 한 거래 로 확정 시켜 준 대가 라고 할 수 있 습니다 . 
 PoW 는 비트코인 의 합의 알고리즘 이 대표 케이스 
 데이터 의 위변 조 방지 
 머 클 트리 ( merkle tree ) 란 ? ( 0 ) 
 블록체인 기술 정의 ( 0 ) 
 퍼블릭 블록체인 , 프라이빗 ( 컨 소시 움 ) 블록체인 비교 ( 0 ) 
 튜링 완전 ( turing - complete ) 이란 ? ( 0 ) 
 스마트 컨트랙트 란 ? ( 0 ) 
 PREV 12345678910 · · · 369 NEXT