본문 바로가기
프로그래밍/typescsript

[220608] 블록체인 초기설정하기 / 구조 알아보기

by 한코코 2022. 6. 8.

라이브러리 설치

언제나 그랬듯 새로운걸 시작할때는 라이브러리부터 설치하자

$npm install crypto-js

 

 

 

 

블록체인 구조

블록의 버전 = version

이전 블록의 해시값 = previousHash

블록 해시값 = hash

body값의 해시값 = merkleRoot

지금 수준으로는 이해할 수 없는 값 = difficult, nonce

const block = {
  header:{
    version:'1.0.0',
    pervoiusHash:'',
    hash:'',
    merkleRoot:'',
    difficult:0,
    nonce:0,
  },
  body:{
    data:["ada","sdfasd","ere","eaaaa","zzzz","bbbbb"]
  }
}

 

 

 

 

단방향 암호화로 만들어지는 hash

변수 a를 sha256 형식의 암호화를 거치면 다음과 같은 64글자의 문자열이 생김.

이 문자열은 언제나 64글자를 유지함.

단, 암호화된 문자열을 가지고 이전 값 변수 a로 돌아갈 수는 없음 =  단방향 암호화

header+body 암호화 -> 블록의 고유한 키값

const SHA256 = require('crypto-js/sha256');

const a = "hello hash";
console.log(SHA256(a).toString()); // 결과값 아래
console.log(
  'e08e1d7bd3fec53b7360de39482ac30d8d1b7bedead27e013810e29095fee6fb'.length
) // 길이 64

 

 

 

 

body를 해시한 값을 보유한 merkleRoot

이름점 계산 방식과 같음. 맨 앞부터 두개씩 묶어서 해시값을 만들고, 최종적인 해시값이 하나만 남을때까지 반복함.

 

예를 들어 1  3  4  2  8 이라면,

1+3, 4+2, 8 = 4, 6, 8 (마지막에 끝에 남은 한개는 그냥 아래로 내림.)

4+6, 8 = 0, 8 (원래 10, 8 이지만 일의 자리만 남겨놓고 날리기때문에 1이 사라지고 0만 남음)

0+8 = 8 (최종결과값)

 

계산과정이 핵심. 계산방식이나 값이 달라지면 해시값도 달라지는 것.

body 내용이 바뀐적이 없다-라는 것을 검증할때 사용.

라이브러리를 설치해야 사용할 수 있다.

$npm install merkle

 

 

 

 

merkleRoot 구현하기

merkleTree는 이름점처럼 각각의 값을 계산하는 과정을 담고있음.
const merkle = require('merkle');
const data = ["ada","sdfasd","ere","eaaaa","zzzz","bbbbb"];
const merkleTree = merkle('sha256').sync(data)

console.log(merkleTree);

/* 결과값
{
  root: [Function: root],
  level: [Function: level],
  depth: [Function: depth],
  levels: [Function: levels],
  nodes: [Function: nodes],
  getProofPath: [Function: getProofPath]
}
*/

배열 data에 있는 값을 각각 sha256방식으로 암호화하는 과정

const merkleTree = merkle('sha256').sync(data)

최종값을 merkleRoot에 들어간다

const merkleRoot = merkleTree.root();
console.log(merkleRoot)

// 결과값
// 463FC51BDE988ACECF53848FC000BE0CCF691E712BEB2785766666EF62B2E73A

 

 

 

 

실질적으로 사용하는 hash의 모양

암묵적으로 merkleRoot까지 header, data는 body라고 부른다.

const block = {
    version:"1.0.0",
    height: 0, // 몇개나 생성되었는지
    timestamp: 0, // 언제 생성되었는지
    pervoiusHash:"",
    hash:"",
    merkleRoot:"",
    data:["ada","sdfasd","ere","eaaaa","zzzz","bbbbb"]
};

1900-1-1부터 카운팅한 숫자를 timestamp에 넣는다.

const post = new Date().getTime();

실질적인 코인 형태를 확인할 수 있는 사이트

( https://www.blockchain.com/btc/block/739800 )

댓글