728x90

알아본다면 당신은 천재임 (못알아봐도 천재)

각 노드, 참여자 컴퓨터에

3001이 관리자 

6001이 노동자..

http서버는 모든 걸 보여주기 용으로 돌리는거

 

라고 대충이해했는데.. 이후에 db서버랑, 리액트서버랑 얘네가 어떻게 맞물리는지 사실 아직도 서버관계를 정확하게 모르겠다! 

 

일단 코드 여기요 (지금까지 한 것만 포크해놓음)

 

https://github.com/jsoyun/4th-project-YunminBlock

 

GitHub - jsoyun/4th-project-YunminBlock: 4th BlockChain Project

4th BlockChain Project. Contribute to jsoyun/4th-project-YunminBlock development by creating an account on GitHub.

github.com

 

 

각 컴퓨터 참여자로 노드 만들어서 

p2p서버 전달 확인해봄

 

참고로 실행할 때는 

node node1/r_httpServer.js

이렇게 했다

 

 

두 서버 각각 열고 

3001
3002

 

 

get 요청인 blocks로 들어가보면

둘다 제네시스 블록이 잘 들어가 있음요 

 

서버 연결!!

post addpeers로 

3002한테 요청하는거임 

 

3002가 6001 웹소켓으로  상대 웹소켓 주소 ws 6001로 연결

문 똑똑

 

 

 

 

peers로 연결된거 확인!

 

 

이제 둘이 연결됐으니

3002에서 채굴해보겠음 

3002 채굴돼서 들어왔지?

 

 

그렇다면 3001을 새로고침해보면 3002랑 연결되어있고 그블록의 길이가 더 길어서 추가됨

 

 

연결되어있으니까 3002에서 연속 2개 추가해도 업데이트 됨

 

 

 

 

 

 

 

3001에서 블록채굴해도 마찬가지로 3002에서 업뎃됨 

연속으로 4,5 값 넣어서 블록추가함


서버 통신 코드

 

 

 

httpServer.js

post로 보내면 

data로 이름지어서 "data" : 웹소켓 주소 가능한거임

 

이 웹소켓 주소 data가 connectToPeers함수로 들어감 얘가 웹소켓 연결해줌

P2PServer.js

 

소켓에 넣고 메세지 핸들러 함수쓰고

얘네가 보내주는거 관리하는거임 

 

 

메세지 핸들러는 이렇게 여기서 변수로 지정해줬음 

(그 검증할 때 변수 10으로 다 잡아서 블록10개 이전과 비교해서 생성시간 알아내는 거 있잖아

이거요 blockchain.js

걔랑 비슷한 원리인듯

신기한게 컴퓨터는 바보라서 걍 숫자 넣어서 계산하는 거기 때문에 시간인지 뭔지 안적어도 가능했음)

 

 

대신 쓸때는 위처럼 MessageType.QUERY_LATEST 이런식으로 해야 얘가 찾겠지?

 

 

연결됐을 때 채굴하면 broadcast로 연결되어있는애들 전부한테 뿌려주는 거

(근데 생각해보니까 마지막 최신블록 담아서 보내주는거 말고도 아예 많이 다르면 전체 교체해야되는 replace함수 써야되는데 broadcast(initMessageHandler(ws)) 이걸로 해줘야 되는거 아닌가....? 흠 정리하고 다시 수정해봐야겠다. )

 

 

 

중간에 맞이했던 에러들

브로드캐스트에 저 함수를넣지 않은 것 말고도 있음

 

갑자기 이거 뜸

(node:11496) Warning: Accessing non-existent property 'Blocks' of module exports inside circular dependency
(Use `node --trace-warnings ...` to show where the warning was created)
(node:11496) Warning: Accessing non-existent property 'getLastBlock' of module exports inside circular dependency                                                                     cular dependency
(node:11496) Warning: Accessing non-existent property 'createHash' of module exports inside circular dependency                                                                       de circular dependency
(node:11496) Warning: Accessing non-existent property 'isValidTimestamp' of module exports  circular dependency
inside circular dependency

이게 찾아보니까 순환참조? a스크립트에서 만든 함수 내보내고 b에서 a의 함수 가져왔는데 또 가져와서? 생기는 뭐 중복돼서 그런거라고 했는데 

이전에 안뜨다가 갑자기 떠서 당황... 작동은 되는데 불안하죠잉

 

결국 전역변수에 있는 애들 다 지역변수로 넣어서 함... 

 

이런식으로.. 

 

 

 

 

 

 

아 그리고 블록체인 에 

 

이 부분 틀렸다는데 

흠 내가 이해한 거는 새블럭을 현재 시간이랑 어느정도 오차범위까지는 인정하는 코드라고 봤거든 책도 그 얘기고..

 

 

흠..어렵군!!

 

 

 

 

 

728x90
728x90

https://medium.com/@dongha.sohn/bitcoin-8-%ED%95%A9%EC%9D%98-consensus-90e879d80b16

 

Bitcoin#8: 합의(Consensus)

이전의 글들을 통해 거래의 구조와 검증방식, 블록의 구조를 살펴보았다.

medium.com

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=gitacademy01&logNo=222027103524 

 

P2P 네트워크를 이용한 블록체인

안녕하세요 여러분 :) 오늘은 블록체인에 대해서 알아보려고 합니다. 얼마 전 만난 AI 연구를 하시는 분...

blog.naver.com

(이거는 비교조건/p2p개념 링크)

 

주의!

 

나름의 이해라서 백퍼 맞지 않을 수 있음ㅎㅎ

(이해를 돕기 위해 설명해준 학우분 감사합니다.)

 

수업에서 블록생성하고 연결하고 검증하고 서버열어서 블록보여주고 이런 걸 해봤는데

 

드는 생각이 왜 p2p를 하지? 였음

노드간의 통신을 작동해야된다는데

 

 

local3001 서버 열고 여기서 블록생성하고 검증하면 여기가 중앙서버고

노드, 참여자용 서버로 만든 6001, 6002,6003은 블록 생성해서 중앙서버가 검증자해주는 건가? 

잉 그러면 탈중앙화가 아닌데? 혼돈;;;

 

내가 이해를 잘못하고 있었음

 

 

 

"먼저 블록 채굴에 성공한 채굴자는 해당 블록을 주변에 전파하게 된다. 중요한 사실은, 이때 전파하는 블록은 채굴에 성공했다고 확신할 수 없는 블록이며 검증을 거쳐 블록체인에 연결되어야 한다. 거래는 노드들에게 전파되며 검증의 과정을 거치듯, 블록 또한 검증을 거치게 되며 검증의 조건은 다음과 같다....."

 

 

우리 p2p하려고 웹소켓 써서 주고받는 통신하잖아

그 전에는 기본 포트는 컴퓨터 내에서 물리적으로 연결되어있으니까 접속이 가능한거고

 

웹소켓으로 내 컴퓨터를 3개의 컴퓨터로 분리하다고 치고 6001, 6002, 6003에 하나씩 컴퓨터가 있고

실제로는 하나니까 물리적으로 3001에 연결될 수 있는거라 서버는 3001만 열어도 될거같기도하고..

 

암튼 결론은!

내가 연 3001은 그냥 이 모든게 보이는 용도로만 쓰이는 보여주기용 서버이고 

실제로 블록 생성, 검증은 

노드들이 하는거임

노드들의 서버 6001, 6002, 6003

그니까 얘네끼리 통신하는 p2p서버로 하는거지.

 

처음에 시작했을 때 

제네시스 블록을 모든 노드들이 갖고 시작하고 

그 뒤에 줄줄이 블록을 생성하는 거임

 

이제 검증과정을 거쳐서 서로블록을 비교하고

황금블록 발견한 애꺼가 당첨되면 원본 블록체인에 연결되고

나머지는 허탕치고 다시 다음블록 만드는 거임

 

 

 

 

그 checkedValid 코드부분은 

//블록구조 유효한지
//현재 블록의 인덱스가 이전 블록의 인덱스보다 1만큼 큰지
//이전블록의 해시값과 현재 블록의 이전해시가 같은지
//데이터 필드로부터 계산한 머클루트와 블록헤더의 머클루트가 동일한지
//이 조건 다 맞으면 올바른 구조체이다

 

이 조건들로 블록이 진짜인지 증명하는거고

진짜 블록이어도 아직 당첨은 안된거지 원본에 연결안된거

 

이제 비교해서 당첨될라면

p2p끼리 통신..

누구꺼를 연결할걸로 할지...

 

chainedBlock에 

replaceChain 함수 주석처리 해놨는데 이거가 

p2pServer.js에서 이렇게 함수호출되어있음

이걸로 누구꺼 연결할지 찾는거 아닐까 짐작..

 

블록들 비교까지 한다면

 어떻게 하는지는 모르겠다 어렵다!!!

 

 

아무튼 해야되는거는 

 

블록마이닝(채굴)/ 지갑생성/ 현재 상황 시각화 / DB 채굴 저장

 

사실상 지갑생성까지 수업때 한거긴한데

 

위같은 비교검증은 없어서

완전한 블록체인은 아닌거같고..흠 

 

 

 

 

 

 

 

 

 

 

 

728x90
728x90

 

 

분산되어 저장한다는 것은 탈중앙화를 의미

P2P(Peer to Peer) 네트워크를 통해서 관리되는 분산데이터베이스에 의한 형태

분산처리와 암호화

블록체인 네트워크에 연결된 여러 컴퓨터(노드)에 저장 및 보관하는 기술

 

블록들을 체인 형태로 묶은 형태

블록들이 형성된 후 시간의 흐름에 따라 순차적으로 연결된 '사슬(체인)'의 구조를 가지게 된다

 

특장점

 

  • 분산저장 (기존거래방식은 데이터를 위,변조하기 위해서 중앙서버를 공격)
  • 여러 명이 동일한 데이터를 저장
  • 블록체인 네트워크를 위,변조하기 위해서는 참여자(노드)의 거래 데이터를 모두 공격해야하기 때문에 사실상 해킹이 불가능
  • 중앙관리자 불필요(중앙기관,관리자 없어도 다수가 데이터를 저장,증명할 수 있기 때문에 탈중앙화가 가능)

 

블록체인의 기술 활용

  • 금융거래
  • 개인의료정보
  • 영상 또는 이미지, 콘텐츠
  • 부동상
  • 의료
  • 인적자원

 

 

블록체인의 기술

  • 해쉬(Hash) 함수를 사용
  • 스마트계약을 활용

블록체인 동작원리

  • 하나의 새로운 블록을 구성한 경우, 이전부터 이어져 내려오던 블록체인의 맨끝에 이 새로운 블록을 연결
  • 새로 구성한 블록의 이름에 해당하는 해시를 찾아내는 일(목표 값보다 작아야한다는 조건을 충족해야함.)

예시)목표 해시 값: 00ff32라고 가정

새로 만든 블록의 해시값: (블록생성에 실패)

새로 찾아낸 해시값: 00c3b1(새로운 블록의 생성에 성공)

 

 

728x90

+ Recent posts