[프린이탈출기] node.js 로 나만의 블록체인을 만들어보자 1.설계

in #kr6 years ago (edited)

안녕하세요 @otac 입니다
흙수저 10억 모으기 프로젝트와
알아두면 아는척하기 좋은 이야기 시리즈에 이어
프린이탈출기 시리즈를 연재하게 되었습니다.

코딩을 공부한지 이제 2년이 다 되어 가는데
어느 순간 한계에 부딪혔는지 점점 흥미가 떨어져갈때
기분 전환겸 나만의 블록체인을 만들어보기로 했습니다

제가 프로그래밍을 공부하게 된 계기가 코인이라서요
블록체인을 만들어보면 뭔가 전환점이 될 것 같다는 생각이..

먼저 언어는 node.js 로 결정했습니다.
블록체인을 아직 정확히 이해하지 못해서
백서를 보고 또보고 몇번을 보고
@ludorum 님을 괴롭힌 끝에 어느정도 이해하게 되었습니다

자 그럼 가즈아!

어려워 하실 필요 없습니다 저도 맨땅에서 3일만에
이해를 끝냈습니다.

그리고 저는 코딩을 야매로 배웠습니다
코드가 지저분하고 각종 기호나 다중 연산 문법에 굉장히 취약하니
지적질하지마시기 바랍니다 ㅂㄷㅂㄷ
말그대로 프린이탈출기에요 ㅠ.ㅠ

그리고 이글은 강좌가 아닙니다.
제 삽질을 구경하시라는 차원에서..

블록체인의 원리


이건 구글링을 넘어서 스팀잇만해도 자료가 엄청나게 많습니다.
@carrotcake 님이 만드신 웹툰으로 이해하는 블록체인 시리즈를 보시면 이해가 더 쉬울거라 생각하여
링크로 설명을 대체합니다

[@twinbraid x @carrotcake] 개복치도 이해하는 블록체인 - 1화 -
[@twinbraid x @carrotcake] 개복치도 이해하는 블록체인 - 2화 -

블록의 구조


블록의 높이(height)를 담고 있는 index
이전 블록의 해쉬값을 담고 있는 previousHash
블록 생성 시간을 담고 있는 timestamp
난수값을 담고 있는 nonce
트랜잭션을 담고있는 transactions
목표값을 담고 있는 bits

로 구성하였고
이들을 전부 해싱한

hash 값을 구비해두었습니다
먼저 sha256 해싱을 위해서

var hashs = require('hash.js');

npm 으로 hash.js 를 설치했습니다.
그리고 블록값을 저장하고 블록생성을 전담할
Block 클래스를 만들었습니다

아 쓰벌 코드를 올리려고 보니까
스팀잇에 코드올리니 들여쓰기나 이런게 다 밀리네요
ㅇ람ㄹ암ㅇ러ㅏ밍러ㅏㅁ어람ㅇ러ㅏ멍람ㅇ
시발놈의스팀잇

여튼 사진으로 대체하겠습니다

스크린샷 2018-03-17 오후 4.21.46.png

backHashJSON 은 입력한 블록데이터를 토대로
해싱하여 블록해시를 만들어주는 함수이며
여기서 리턴된 값을 토대로 목표값 검증을 통해 블록이 생성됩니다

setgenesis 는 말그대로 1번 블록, 즉 초기 블록을 생성시켜주는 함수입니다

sethash 는 backHashJSON 에서 sha256 으로 해싱해주는 부분이구요

JSON 형태의 블록데이터를
sha256 으로 해싱하여 블록헤더를 만들어주는 부분도 끝났고

이제 setgenesis 로 테스트를 해보면되겠습니다

const Block = require('./block.js');
var a = Block.setgenesis;
console.log(a);

스크린샷 2018-03-17 오후 4.13.57.png

짜잔 제네시스 블록이 성생되었습니다
제네시스 블록은 1번 블록을 의미합니다.

이제 1번 블록의 hash 를 이용해서
2번 블록을 생성시켜주면 됩니다

채굴부분도 한번 만들어 볼께요

준비물

  1. sha256 해싱용 hash.js
  2. 끈기

function getLastBlock(){

return blocks[blocks.length-1];

}

우선 블럭정보를 blocks 배열에 담아주고
마지막 블럭정보를 가져오는 함수를 제작해줍니다

아 그리고 블록체인을 만들면서
한계에 답답한점이 있는데
저는 수학에 숫자보다 영어가 많이 나올때 수학을 놨습니다.

16진수 10진수 이 개념 때문에 굉장히 힘들었습니다-_-;
여하튼 마지막 블록에서 블록 난이도를 가져오는 함수를 만들었고

스크린샷 2018-03-17 오후 7.22.16.png

bits 값에서 난이도를 구하는 방법은
@loum 님의 이글 에서 발췌했습니다

이제 마이닝 함수를 만들고 함수이름을 eachMine 으로 정했습니다

스크린샷 2018-03-17 오후 7.30.46.png

마지막 블록 정보를 불러오고
빈 블록 오브젝트를 생성하여

마지막 블록의 정보를 담아주고

while 로 루프를 돌려주는데요

루프 조건은 bits 로 계산된 난이도값이
현재 해쉬 값보다 크면 계속 돌아갑니다

16진수로 비교하면 '작아야' 블럭검증이 성공하지만
16진수를 보면 속이 안좋기에 변환합니다.

잠깐! 말씀드릴 것이 있습니다.

이 글은 실시간으로 만들면서 같이 작성하고 있는데요.
중대한 문제를 발견했습니다

제가 진수를 잘못 이해하고 있었습니다!

그래서!

갈아엎었습니다. (03:35 AM)

스크린샷 2018-03-18 오전 4.26.24.png

지금 이 글은 40시간째 작성하고 있습니다 시벌탱..ㅂㄷㅂㄷ
일단 리틀엔디안을 추가해줬고

스크린샷 2018-03-18 오전 4.28.09.png

채굴 부분을 이렇게 바꿨습니다

여러분 이 글은 강좌가 아닙니다

제가 삽질하는것을 동물원 원숭이보듯 구경하시면 됩니다
미쳐버릴것 같아요

설계고 자시고
자꾸 진수는 왜자꾸 나오는건지
10진수 16진수
진수
진수
진수
진수
아오

KakaoTalk_Photo_2018-03-18-04-30-20_1.jpeg

짜증난다..
ㅁㅁ어라멍라머알머아ㅣ라

결국 윗처럼 채굴단을 수정하고
난이도는 1을 주고

마이닝을 돌렸는데요

저는 난이도가 1 이면 5초만에 채굴이 될 줄 알았는데

스크린샷 2018-03-18 오전 4.32.15.png

오른쪽이 nonce 입니다

왜 얘는 5분째 돌아가고있죠?!?!?!
?!?!!?응!?!?!?!?

제가 뭘 잘못했나요?

예제는 안볼겁니다
예제보면 제가 지는겁니다

지기싫어요
살려주세요

선생님.. 아니 형님
도움을 구합니다

ㅠ.ㅠ

AM 04:45 수정


결국 채굴에 성공함.
성공은 했으나 원활한 테스트를 위해서
난이도를 많이 낮추어야 겠음.

난이도 1로해도 이렇게 오래걸리면 테스트가 불가능하네요

Sort:  

좋은글~~~

스팀가격이 떨어지는 절대보팅금액이 줄어드네요...
ㅠㅠ
그래도 같이 힘냅시다!! 화이팅!
후후후 딸기청이나 만들어볼까합니다!
https://steemit.com/kr/@mmcartoon-kr/6jd2ea

스팀잇에 코드 올릴 때 코드를 ```로 감싸면 들여쓰기 그대로 유지되는 걸로 알고 있어요!

ㅎㅎ 코드도 깔끔하네요 뭐가 그렇다고요 ㅎㅎㅎ
40시간 포스팅 응원합니다 !!!
저도 나중에 공부할때 참고하께요 ㅋㅋ

kr-qna태그는 "주로 뉴비" 분들이 "스티밋에 대해 질문을 할 때" 쓰이는 태그입니다! 😝
순수한 질문이 아닌 게시글에는 보팅 지원을 하지 않고 있어요 :)

kr-qna태그가 순수한 질문들이 아닌 글들에 붙게 되면, 서포터즈분들이 뉴비 분들을 도와드리기 힘들어진답니다. 😖

kr-qna태그를 이용하여 순수하게 질문글을 올리고 싶을 때는 제목에 꼭 "질문"이라는 단어를 넣어주세요!😃

이상 kr-qna 서포터즈 가이드 봇이였습니다! 🤖🤖🤖

🔗올바른 #kr-qna태그 사용법 소개글 링크

개발자보다 코딩을 오래하시는 분이 있다고 듣고 와봤습니다. 40시간이라뇨 ㄷ ㄷ

그래도 잠은 자가면서 해요 ㅜ
블록체인 공부는 확실이 되겠어요

이런건 어디가서 배워야하나요?
절반만 이해하고 갑니다 ㅡㅋㅋㅋ

OTAC COIN (OTAC) 가시는 겁니까 ㄷㄷ 잘봤습니다^^ 갑자기 왜 트론이 떠오르는지 ㅎㅎ 마케팅까지 함 해보시죠 머

포스팅과 관계없는 글을 올려 죄송합니다.

@otac님 텔레그램 스팀잇 알람봇....funsteemit을 잘쓰고 있읍니다.
저는 /add기능을 이용해서 모니터링리스트를 만들어 쓰고 있는데 /unadd를 이용해서 몇몇을 지울려고 하는데 지워지지 않는데...확인부탁드립니다. 지우는 다른 방법이 있는지...아예 다 지울수 있는 방법이 있는지도 궁금합니다.

엇 지금 확인햇습니다
금방 확인해보고 말씀드릴게요!!

Coin Marketplace

STEEM 0.18
TRX 0.14
JST 0.030
BTC 58617.29
ETH 3164.87
USDT 1.00
SBD 2.44