라이브러리 설치
언제나 그랬듯 새로운걸 시작할때는 라이브러리부터 설치하자
$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 구현하기
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();
실질적인 코인 형태를 확인할 수 있는 사이트
'프로그래밍 > typescsript' 카테고리의 다른 글
[220616] 월렛(블록체인 지갑)의 개념과 구조, 직접 월렛 만들기 (0) | 2022.06.16 |
---|---|
[220610] 블록 채굴(마이닝)-난이도-체인의 관계 / 블록검증 함수 (0) | 2022.06.10 |
[220609] prettier, eslint 설치 / 테스트코드(test.ts), 선언파일(d.ts) (0) | 2022.06.10 |
[220609] 타입스크립트 개발환경 만들기 (0) | 2022.06.09 |
[220608] 블록체인의 구조를 만들어보기 (0) | 2022.06.08 |
댓글