목표
- 블록객체 생성하기
- SHA256을 이용한 hash값 생성
- genesis block 만들기
// class로 블록 만들기
class Block {
constructor(index, data, timestamp, hash, previousHash){
this.index = index; // height
this.data = data;
this.timestamp = timestamp;
this.hash = hash;
this.previousHash = previousHash;
}
}
SHA-256은 SHA(Secure Hash Algorithm) 알고리즘의 한 종류로서 256비트로 구성되며 64자리 문자열을 반환한다. SHA-256 해시 함수는 어떤 길이의 값을 입력하더라도 256비트의 고정된 결과값을 출력한다. 일반적으로 입력값이 조금만 변동하여도 출력값이 완전히 달라지기 때문에 출력값을 토대로 입력값을 유추하는 것은 거의 불가능하다. 일방향 함수. 이로 인해 블록의 유일성을 설명할 수 있다.
CryptoJS 모듈을 사용하여 hash값을 구할 수 있다. SHA256()안에 들어가는 인자를 string으로 변환해주고 이후에 나오는 값 전체를 다시 한번 string으로 변환해주어야 한다. 위에서 언급한 블록의 유일성을 코드로 직접 확인해보자.
const calculateHash = (index, data, timestamp, previousHash) => {
return CryptoJS.SHA256((1).toString()).toString(); // 1번
//return CryptoJS.SHA256((2).toString()).toString(); // 2번
}
다음과 같이 숫자1에 대한 hash값과 숫자2에 대한 hash값이 완전히 다른것을 확인 할 수 있다. (위는 1번, 아래는 2번의 hash결과값)
아래는 최종코드
import CryptoJS from 'crypto-js'
const calculateHash = (index, data, timestamp, previousHash) => {
return CryptoJS.SHA256((index + data + timestamp + previousHash).toString()).toString();
//return CryptoJS.SHA256((2).toString()).toString();
}
// 이 block이 유일무이 하다는것을 증명해주는거지 16지수 64자리
// genesis block 만들기
const createGenesisBlock = () => {
const genesisBlock = new Block (0, 'genesis block!!', new Date().getTime() / 1000, 0, 0);
genesisBlock.hash = calculateHash(
genesisBlock.index,
genesisBlock.data,
genesisBlock.timestamp,
genesisBlock.previousHash
)
return genesisBlock
}
block.js 에서 web에 뿌려주기 위한 코드를 추가하고, httpServer.js에서 get방식으로 함수를 받아와 호출 했다. localhost:3001/blocks 경로에서 잘 출력되는 것을 볼 수 있다.
// ======== block.js에 추가하기 ========
// 저장해줄 자료구조를 만들기
// genesisblock을 선언할때 한번만 배열에 값으로 들어가도록. 첫번째 인덱스
const blocks = [createGenesisBlock()];
// 외부에 노출할 수 있게 보여주기
function getBlocks() {
return blocks;
}
export { getBlocks }
// ======== httpServer.js에 추가하기 ========
app.get('/blocks', (req, res) => {
// 블록의 배열을 넘겨주는 함수를 여기서 갖다 쓰자 (block.js)
res.send(getBlocks());
})

block.js
import CryptoJS from 'crypto-js'
// class로 블록 만들기
class Block {
constructor(index, data, timestamp, hash, previousHash){
this.index = index; // height
this.data = data;
this.timestamp = timestamp;
this.hash = hash;
this.previousHash = previousHash;
}
}
// 위에 block안의 외부에서 주어지는 index값들을 합해서 sha256 으로 계산? 변환? / 이걸 쓰려면 CryptoJS 모듈을 쓰면된다
const calculateHash = (index, data, timestamp, previousHash) => {
return CryptoJS.SHA256((index + data + timestamp + previousHash).toString()).toString();
//return CryptoJS.SHA256((2).toString()).toString();
}
// genesis block 만들기
const createGenesisBlock = () => {
const genesisBlock = new Block (0, 'genesis block!!', new Date().getTime() / 1000, 0, 0);
genesisBlock.hash = calculateHash(
genesisBlock.index,
genesisBlock.data,
genesisBlock.timestamp,
genesisBlock.previousHash
)
return genesisBlock
}
// 저장해줄 자료구조를 만들기
// genesisblock을 선언할때 한번만 배열에 값으로 들어가도록. 첫번째 인덱스
const blocks = [createGenesisBlock()];
// 외부에 노출할 수 있게 보여주기
function getBlocks() {
return blocks;
}
export { getBlocks }
httpServer.js
import express from 'express';
import bodyParser from 'body-parser';
import { getBlocks } from './block.js';
// 초기화 함수
const initHttpServer = (myHttpPort) => {
const app = express();
app.use(bodyParser.json());
app.get('/', (req, res) => {
res.send('Hello BlockChain!')
})
app.get('/blocks', (req, res) => {
// 블록의 배열을 넘겨주는 함수를 여기서 갖다 쓰자 (block.js)
res.send(getBlocks());
})
//매개변수 2개 / 함수포트 , 화살표함수
app.listen(myHttpPort, () => {
console.log('listening httpServer Port : ', myHttpPort);
})
}
// main에서 import를 하려면 export를 먼저하자
export { initHttpServer };
참고하기
블록개념 이해하기 (작성할 것)