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

[220610] 블록 채굴(마이닝)-난이도-체인의 관계 / 블록검증 함수

by 한코코 2022. 6. 10.

채굴 - 난이도 - 체인의 관계

 

채굴

블록체인은 기본적으로 모든 사용자들(블럭)이 같은 정보를 유지하고있기때문에 이루어지는 탈중앙 시스템을 이루고있다.

그말은 한 블럭이 가진 정보가 수정된다면 다른 블럭들도 동시에 가진 정보가 수정되어야한다.

이 정보가 공정하게 수정된 정보인지, 누군가 악의적으로 수정한 정보인지 알기위해 일일히 서로 대조를 한 후에 정보수정이 이루어지는데, 이 과정만해도 시간이 오래 걸린다.

그런데 블록생성이 매우 쉬워서 1초에 10개, 15개씩 생성이 가능해진다고 생각해보자.

1명만 그렇게 생성해도 시간이 오래걸릴텐데 전세계의 사람들이 시도때도없이 생성한다면 거래속도가 현저히 느려질것이다.

이런 일을 막기 위해서 생겨난 것이 난이도다.

 

 

 

난이도

블록을 생성하는 난이도 조정을 통해 블록을 생성하는 속도를 조절할 수 있다.

예를 들면, 블록 10개를 생성하는 평균시간을 10분으로 잡았다고 해보자.

연속된 블록 10개를 무작위로 선택해서 생성된 평균 시간을 구한다.

  1. 평균시간이 10분 언저리라면 적절한 난이도이므로 유지한다.
  2. 평균시간이 10분 / 2 = 5분이라면 난이도를 향상해서 생성시간을 늘린다.
  3. 평균시간이 10분 * 2 = 20분이라면 난이도를 낮춰서 생성시간을 줄인다.

이런식으로 조절이 가능해진다.

그렇다면 평균시간을 계산하기 위해 뽑은 블록을 따로 저장할 공간이 필요해지는데 이게 체인이다.

 

 

 

 

 

 


에러코드를 작성하는 Failable.d.ts

import를 사용하지 않고도 전역으로 선언한 변수나 함수를 사용하게 해주는 타입스크립트 선언파일 Railable.d.ts

성공, 실패에 따른 조건문을 try catch문을 사용할 수도 있겠지만, 자꾸 쓰다보면 안으로 파고드는 depth가 늘어난다.

간단한건 이런 방식으로 작성하고, 코드의 최종단계에서 try catch문을 쓰는 습관을 들이자.

 

코드 설명

Result라는 interface를 만든다고 생각하고 R(또는 E)이란 변수를 받는다.

인스턴스는 객체형인데 isError, value가 들어오고, 속성값은 까먹지 말고 꼭 작성하자.

실패할 경우에는 isError를 true로, error를 변수 E로 반환한다.

성공할 경우에는 isError를 fale로, error를 변수 R로 반환한다.

 

// Failable.d.ts
// 그니까 그거구면 구멍뚫린 퍼즐박스를 주는데 그 안에 담을 수만 있음.
declare type Result<R> = {isError:false; value:R}
declare type Failure<E> = {isError: true; error:E}

// 위에 두개는 정의한다고 생각하고 얘가 실질적으로 사용하는 코드
// R,E는 위에서 가져온거 아님!!!
declare type Failable<R,E> = Result<R> | Failure<E>

 

 

 

 

 

블럭을 검증하는 함수 만들기

// 블럭을 검증하는 함수
// 이전블럭과 비교해서 검증해야하니까 인자가 2개 필요함
public static isValidNewBlock(_newBlock: Block, _previousBlock: Block): Failable<Block, string> {
    // 1. 이전 블럭 height + 1 === 새로생긴 블럭 height
    // 2. 이전 블럭 hash === 현재블럭.이전hash
    // 3. _newBlock(version...)를 새로 hash를 만듬 === _newBlock.hash

    if (_previousBlock.height + 1 !== _newBlock.height)    
      return { isError: true, error: '블록 높이가 맞지 않습니다' }

    if (_previousBlock.hash === _newBlock.previousHash)
      return {isError:true, error:'이전 해시값이 맞지 않습니다'}

    if (Block.createBlockHash(_newBlock) !== _newBlock.hash)
      return {isError: true, error:'블록해시가 올바르지 않습니다.'}

    return { isError: false, value: _newBlock }
}

 

 

 

 

 


왜 블록검증을 할까

블록을 생성하면 이 블록을 가지고있는 모든 사람과 대조하고 기록을 옮기면서 기록을 작성해야하는데

생성하기 너무 쉬우면 처리해야할 값이 늘어난다.

게다가 한 사람이 생성하는게 아니라 여러사람이 생성하는것이므로 데이터가 꼬이기 쉽다.

그래서 블록을 생성하기 아주 까다롭게 만들어놓은게 작업증명

그리고 한번 더 검사하는게 merkleroot 값 확인

댓글