카테고리 없음

Chain 의 difficulty(난이도) 조절

tp134679 2025. 5. 13. 19:07

<목차>

1. Chain의 Block  난이도 설정

 

 

 

1. Chain의 Block  난이도 설정 

Block은 일정수준의 dibfficulty 난이도를 풀어야 체굴이 됩니다 블록체인의 난이도는 새로운 블록을 채굴(혹은 생성)하기 위해 풀어야 하는 암호학적 퍼즐의 난이도를 정의합니다. 이 퍼즐을 풀려면 충분한 계산 능력이 필요하며, 이 과정을 통해 블록체인 네트워크는 탈중앙화된 방식으로 새로운 거래를 검증하고 블록을 추가할 수 있습니다. 난이도가 높을수록 퍼즐을 푸는 데 더 많은 계산이 필요하게 됩니다. 

 

목표 시간: 비트코인의 경우, 블록 생성 시간 목표는 10분입니다.

실제 시간: 2016개의 블록이 생성된 실제 시간을 측정합니다.

조정 비율: 실제 시간과 목표 시간의 차이를 기반으로 난이도를 조정합니다. 예를 들어, 2016개의 블록이 목표 시간보다 빨리 생성되었다면 난이도를 증가시키고, 느리게 생성되었다면 난이도를 낮춥니다.

난이도 조정의 필요성

블록체인의 네트워크는 시간에 따라 참여하는 채굴자의 수와 컴퓨터의 성능이 달라집니다. 예를 들어, 채굴자가 많거나 채굴 장비가 더 강력할 경우, 새로운 블록을 빠르게 생성할 수 있습니다. 이로 인해 블록 생성 속도가 너무 빨라지면 네트워크의 안정성에 문제가 발생할 수 있습니다. 반대로 채굴자가 적거나 장비 성능이 낮으면 블록 생성 속도가 너무 느려지게 되어 거래가 지연될 수 있기에 블록체인은 일정한 간격으로 블록 생성 시간을 조절하는 난이도 조정 메커니즘을 도입하여 네트워크의 안정성을 유지합니다. 이 조정 메커니즘을 통해 블록체인 네트워크는 블록 생성 속도를 일정하게 유지하며, 네트워크의 과도한 변화나 성능 저하를 방지할 수 있습니다.

 

난이도 조정 방식

가장 대표적인 난이도 조정 방식은 비트코인의 난이도 조정 알고리즘입니다. 비트코인 네트워크는 2016개의 블록을 기준으로 난이도를 조정합니다. 이를 ‘난이도 조정 주기’라고 하며, 평균적으로 약 2주에 한 번씩 블록 생성 시간을 10분에 맞추기 위해 난이도를 조정합니다. 즉, 2016개의 블록이 평균적으로 2주를 초과하여 생성되면 난이도를 올리고, 2주보다 빨리 생성되면 난이도를 내리는 방식이고. 이 방식은 블록체인 네트워크에서 채굴의 속도 변동에 맞추어 난이도를 조절함으로써, 블록 생성 시간이 일정하게 유지되도록 합니다. 비트코인의 경우, 블록 생성 속도가 일정하므로 네트워크에서 발생하는 각종 거래가 예측 가능한 시간 내에 처리될 수 있습니다.

 

 

코드에서의 구현  흐름

실제의 블록체인의 난이도조절  X.

 

체인은 블록의 갯수를 판단하고 난이도를 조정할지 말지를 결정합니다  예시의 코드로는 10개 이상 의 블록 갯수를 판단합니다  

chain

체인에서는 블록의 갯수를 판단하고 난이도조절 

    getAdjustmentBlock(): Block {
        // 11
        const currentLength = this.length();
        // 블록이 10개 미만이면, GENESIS를 반환
        if (currentLength < INTERVAL) return this.chain[0];

        // 그렇지 않으면 => 만약 11개다? 11개 이전 블록 반환 => 기준 => 1 10 => timestamp 계산 => 난이도 조정
        return this.chain[currentLength - INTERVAL]
    }

 

블록의 난이도는 블록이 생성될때 결정이 되기때문에 체인에서 받은 블록의 갯수를 기반으로

블럭에서 진짜 난이도가 조정이 됩니다. 

 

block

블록에서는 실제로 getDifficulty 로 난이도 계산을 수행합니다. 

export const INTERVAL = 10;
export const DIFFICULTY_ADJUSTMENT_INTERVAL = 10;
export const BLOCK_GENERATION_INTERVAL = 10 * 60;
 static getDifficulty(_newBlock: Block, _adjustmentBlock: Block, _previousBlock: Block): number {
        if(_newBlock.height <= 0) throw new Error("높이가 없습니다!");
       
        if(_newBlock.height % DIFFICULTY_ADJUSTMENT_INTERVAL !== 0) {
            return _previousBlock.difficulty;
        }
        // DIFFICULTY_ADJUSTMENT_INTERVAL개의 블록이 실제로 채굴되는데 걸린 시간
        const timeToken: number = _newBlock.timestamp - _adjustmentBlock.timestamp;
        // 원래 예상했던 시간(예: 블록 하나당 10초 곱하기 주기 개수)
        const timeExpected = BLOCK_GENERATION_INTERVAL * 10 * DIFFICULTY_ADJUSTMENT_INTERVAL;
        if (timeToken < timeExpected / 2) return _previousBlock.difficulty + 1; // 채굴 속도가 너무 빠르면 난이도 +1
        if (timeToken > timeExpected * 2) return _previousBlock.difficulty - 1; // 채굴 속도가 너무 느리면 난이도 -1
    }