
node --experimental-vm-modules node_modules/jest/bin/jest.jsnpx jest 로는 실행되지 않으므로 위 명령어로 실행한다.
npx jest를 실행하면 .test.js 파일을 모두 확인한다."test" : "jest"jest 파일명을 실행하면 해당 파일만 확인할 수 있다.i : install --save 와 같다.--save : package.json에 해당 라이브러리에 대해서 저장한다.(현재는 포함시키지 않아도 알아서 추가되므로 --save를 붙이지 않아도 된다.)-D === -dev << develop : 테스트에서만 사용한다.npm init
npm i crypto-js merkle
npm i -D jest
npm install crypto-js merkle
npm install --save-dev jest

describe("이건 테스트의 그룹이다.", ()=>{
// 아래의 테스트들을 이 그룹 안에 넣어주면 된다. 어떤 테스트인지 단순히 그룹을 만든 것이다.
});
test("이건 테스트다", () =>{
expect("1234").toBe("1234");
});
// 안되는 이유 : 객체는 서로 다른 것으로 취급하기 때문이다.
// 같은 객체가 되려면 변수에 정의(const obj = { a : 1 })해야 한다.
test("이건 안된다", ()=>{
expect({a : 1}).toBe({a : 1});
});
it("객체의 비교", ()=>{
expect({a:1}).toEqual({a:1});
});
...
npx jest 를 해주면 하위 폴더의 모든 .test.js 파일을 찾아 테스트한다. const SHA256 = require("crypto-js").SHA256;
const merkle = require("merkle");
const data = [1];
const merkleRoot = merkle("sha256").sync(data).root();
const createMerkleRoot = ()=>{
return SHA256(data[0]).toString().toUpperCase();
}
module.exports = {merkleRoot, createdRoot : createMerkleRoot()};const {merkleRoot, createdRoot} = require("./merkle.js"); // failed -> 이유 : merkle 라이브러리는 받는 데이터 배열의
// 아이템을 전부 문자열(string)으로 처리한다.
// 내열 내의 데이터가 **숫자** 1이기 때문에 현재는 오류가 발생한다.
// 머클 라이브러리는 알아서 바꿔줬기 때문에 다르게 나온 것이다.
// merkle.js의 createMerkleRoot에서 data[0]을 data[0].toString()로 바꿔준다.
describe("merkle 비교", ()=>{
it("하나의 데이터 암호화 확인", ()=>{
expect(merkleRoot).toBe(createdRoot);
});
});
const createMerkleRoot = ()=>{
return SHA256(data[0]).toString().toUpperCase();
}
const data = [1, 2]; 로 수정 for(let i = 0; i<data.length; i++){
fitstTree.push(SHA256(data[i].toString()).toString().toUpperCase());
};
const secondTreeRoot = SHA256(fitstTree[0] + fitstTree[1]).toString().toUpperCase();
module.exports = {merkleRoot, createdRoot : createMerkleRoot(), secondTreeRoot};
const {merkleRoot, createdRoot, secondTreeRoot} = require("./merkle.js");
describe("merkle 비교", ()=>{
it("하나의 데이터 암호화 확인", ()=>{
expect(merkleRoot).toBe(createdRoot);
});
// 추가, passed
it("두개의 데이터 암호화 확인", ()=>{
expect(secondTreeRoot).toBe(merkleRoot);
});
});
npx jest 로 테스트해준다. (위에서 failed 뜨는 친구들 주석처리 해준 뒤 테스트했다.)
merkle.js
data 4개가 되도록 추가
const data = [1, 2, 3, 4];
두번째 트리 빈배열 만들어줌
const secondTree = [];
두번째 트리에 암호화해서 넣어줌
암호화된 데이터를 합쳐 다시 암호화해준다.
for(let i = 0; i<fitstTree.length; i+=2){
secondTree.push(
SHA256(
fitstTree[i].toString() +
fitstTree[i+1].toString()
).toString().toUpperCase()
);
};
const thirdTreeRoot = SHA256(secondTree[0] + secondTree[1]).toString().toUpperCase();
module.exports = {merkleRoot, createdRoot : createMerkleRoot(), secondTreeRoot, thirdTreeRoot};
describe("merkle 비교", ()=>{
it("네 개의 데이터 암호화 확인", ()=>{
expect(thirdTreeRoot).toBe(merkleRoot);
});
});
npx jest 로 테스트 -> passed

const SHA256 = require("crypto-js").SHA256;
const merkle = require("merkle");
const data = [1, 2, 3];
const merkleRoot = merkle("sha256").sync(data).root();
const fitstTree = [];
for(let i = 0; i<data.length; i++){
fitstTree.push(SHA256(data[i].toString()).toString().toUpperCase());
};
const secondTree = [];
for(let i = 0; i<fitstTree.length; i+=2){
// 임시값, 아래에서 조건에 따라 값을 정의한다.
let temp = '';
// 홀수개이며 다음 인덱스(아이템)이 없을 경우 기존의 아이템을 그대로 사용한다.
if(i+1===fitstTree.length){
temp = fitstTree[i];
}else{
// 다음 인덱스(아이템)이 있을 때
temp = SHA256(fitstTree[i] + fitstTree[i+1]).toString().toUpperCase();
}
secondTree.push(temp);
};
const oddThirdRoot = SHA256(secondTree[0] + secondTree[1]).toString().toUpperCase();
module.exports = {oddMerkleRoot : merkleRoot, oddThirdRoot};
export해줌
module.exports = {oddMerkleRoot : merkleRoot};
const { oddMerkleRoot, oddThirdRoot } = require("./oddMerkle.js");
describe("merkle 비교", ()=>{
it("세 개의 데이터 암호화 확인", ()=>{
expect(oddThirdRoot).toBe(oddMerkleRoot);
});
});
npx jest로 테스트 -> 3개의 데이터 암호화 확인 passed
const createMerkle = (_data) =>{
// 받은 매개변수값이 배열인지 확인
if(!Array.isArray(_data)) return {isError : true, msg: "너 배열 아님"};
// 배열의 값을 전체 암호화 해서 새로운 배열로 반환해준다.
let merkleArr = _data.map((item) =>
SHA256(item).toString().toUpperCase()
);
// 머클 루트가 나오는 조건 : 한 개의 값이 나올 때까지 계속 돌려야 한다.
// merkleArr 배열의 1보다 크면 1이 될 때까지 반복 작업한다.
while(merkleArr.length > 1){
const tempArr = [];
// 머클의 길이와 같아질 때까지 돌린다.
for (let i = 0; i<merkleArr.length ; i+=2) {
if(i+1 === merkleArr.length){
// 마지막 홀수일 때 자기 자신을 암호화
tempArr.push(merkleArr[i]);
}else{
tempArr.push(
SHA256(merkleArr[i]+merkleArr[i+1]).toString().toUpperCase()
)
}
}
merkleArr = tempArr;
}
// return을 객체로 내보내는 이유 : 블록 생성 후 해당 블록이
// 정상적인 블록인지 확인하기 위해 객체로 내보낸다.
// isError를 통해 생성 도중 문제가 발생했짖니 파악할 수 있다.
// - jest에서 사용하는 것이 아닌 블록 생성 단계에서 사용한다.
return {isError : false, value : merkleArr[0]};
};