Skip to content

Latest commit

 

History

History
136 lines (111 loc) · 3.65 KB

README.md

File metadata and controls

136 lines (111 loc) · 3.65 KB

Blockchain

  • 블록체인은 암호학과 수학 덕분에 가능한, 영구적 정보의 보관 기술을 뜻함.
  • 새로운 플랫폼 (개발자가 사용할 수있는 플랫폼)
  • chain of block 블록들이 모여있는 체인.
  • BlockChain 을 추가만 가능한 데이터베이스라고 생각. ( 편집 , 삭제 불가 )
  • 탈중앙화 : 특정 개인이 DB를 관리할 수 없다는 의미 (모두가 DB의 복재본을 가지고 있음)
    🎉 즉 분산된 DB라고 할 수 있다. ( => 감시하거나 통제가 절대적으로 힘듬 )

블록이 정보를 DB에 추가하는 방법.

  • 블록형태로 정보가 추가됨.
  • 데이터 + 해시(수학함수, 일방향 함수, 결정론적) ‼해시 : 수학함수, 일방향 함수(ouput을 가지고 input을 얻을 수 없음) , 결정론적( input 에대한 output이 정해져있음. )

=> 결국 필요한 것: ( 데이터 + 이전 블록의 해시 ) 해시

typescript로 만든 blockchain

검증과정을 최소화시킨버젼

import * as CryptoJS from "crypto-js";

class Block {
  static calculateBlockHash = (
    index: number,
    previousHash: string,
    timestamp: number,
    data: string
  ): string =>
    CryptoJS.SHA256(index + previousHash + timestamp + data).toString();

  static validateStructure = (aBlock: Block): boolean =>
    typeof aBlock.index === "number" &&
    typeof aBlock.hash === "string" &&
    typeof aBlock.previousHash === "string" &&
    typeof aBlock.timestamp === "number" &&
    typeof aBlock.data === "string";

  public index: number;
  public hash: string;
  public previousHash: string;
  public data: string;
  public timestamp: number;

  constructor(
    index: number,
    hash: string,
    previousHash: string,
    data: string,
    timestamp: number
  ) {
    this.index = index;
    this.hash = hash;
    this.previousHash = previousHash;
    this.data = data;
    this.timestamp = timestamp;
  }
}

const genesisBlock: Block = new Block(
  0,
  "202031210312313",
  "",
  "hello",
  123456
);

let blockChain: [Block] = [genesisBlock]; //Block 객체만 받을수있는 배열

const getBlockchain = (): Block[] => blockChain;

const getLatestBlock = (): Block => getBlockchain()[blockChain.length - 1];

const getNewTimeStamp = (): number => Math.round(new Date().getTime() / 1000);

const createNewBlock = (data: string): Block => {
  const previousBlock: Block = getLatestBlock();
  const newIndex: number = previousBlock.index + 1;
  const newTimestamp: number = getNewTimeStamp();
  const newHash: string = Block.calculateBlockHash(
    newIndex,
    previousBlock.hash,
    newTimestamp,
    data
  );

  const newBlock: Block = new Block(
    newIndex,
    newHash,
    previousBlock.hash,
    data,
    newTimestamp
  );

  addBlock(newBlock);
  return newBlock;
};

const getHashforBlock = (aBlock: Block): string =>
  Block.calculateBlockHash(
    aBlock.index,
    aBlock.previousHash,
    aBlock.timestamp,
    aBlock.data
  );

const isBlockValid = (candidateBlock: Block, previousBlock: Block): boolean => {
  if (!Block.validateStructure(candidateBlock)) {
    return false;
  } else if (previousBlock.index + 1 !== candidateBlock.index) {
    return false;
  } else if (previousBlock.hash !== candidateBlock.previousHash) {
    return false;
  } else if (getHashforBlock(candidateBlock) !== candidateBlock.hash) {
    return false;
  } else {
    return true;
  }
};

const addBlock = (candidateBlock: Block): void => {
  if (isBlockValid(candidateBlock, getLatestBlock())) {
    blockChain.push(candidateBlock);
  }
};

createNewBlock("second block");
createNewBlock("third block");
createNewBlock("fourth block");

console.log(blockChain);
export {};