카테고리 없음

Blockchain 채굴

tp134679 2025. 5. 19. 10:23

<목차>

1. Blockchain 채굴 이란?

2. 코인베이스 트랜잭션(보상)

3. 트랜잭션 hash

 

1. Blockchain 채굴 이란?

채굴은 단순히 "코인을 캐는 행위"로 이해되기 쉽지만, 블록체인에서는 훨씬 중요한 역할을 합니다. 우리가 앞서서 배웠던? 블록의 difficulty ( 난이도 )를 풀고  블록을 체인에 포함시킨 것 그 행위 자체가 블록체인에서의 채굴 입니다. 또한 블록을 채굴한 사람에게 주는 채굴자에 대한 보상은 트랜잭션 구조를 따르고있습니다. 

 

채굴의 작업증명

새로운 블록 생성: 블록체인은 여러 거래들을 하나의 묶음으로 만들어 블록에 저장합니다.

트랜잭션 검증: 채굴자는 트랜잭션들이 유효한지를 확인합니다.

블록 보안 유지: 블록의 해시값이 정해진 조건(예: 특정 개수의 0으로 시작)을 만족해야 하므로, 계산이 매우 어렵습니다.

블록 보상 획득: 이 과정을 가장 먼저 성공한 채굴자는 보상을 받습니다.

 

2. 코인베이스 트랜잭션(보상)

코인베이스 트랜잭션이란 암호화폐 채굴애서 채굴자에게 보상을 지급하는 특별한 종류의 트랜잭션을 말합니다. 블록 내에서 가장 먼저 들어가는 트랜잭션으로 채굴자가 블록을 성공적으로 채굴했을때 받는 보상을 이야기합니다. (보상)

 

사용자에게 주어지는 보상또한 트랜잭션으로서 TXIN TXOUT 을 사용해서 보상을 지급하는 구조로 이루어져 있습니다.

하지만 Txin 안에 내용은 없고 코인베이스의 정보만 있는데 이는 참조할 UTXO 가 없이 기존잔액에서 채굴자에게 지급되는 형식이기 때문입니다. 그럼에도 트랜잭션이기 때문에 Txin 과 Txout 형태의 구조를 사용하여 보상을 지급합니다. 

 

코인베이스 트랜잭션
- 입력(TxIn): 없음 (coinbase 데이터만 있음)
- 출력(TxOut): 채굴자 지갑 주소로 보상 전송 (주소, 채굴자  보상 금액)

실제로 트랜잭션의 맨위에 채굴자 보상이 들어감

private readonly REWARD = 50; // 채굴자 보상
    createCoinbase(account:string, latestBlockHeight: number): TransactionRow {
        const txIn = this.createTxIn(latestBlockHeight + 1);
        const txOut = this.createTxOut(account, this.REWARD);
        return this.createRow([txIn],[txOut]);
    }

 

 

전체 생명 주기 요약

 

 

 

 

3. 트랜잭션 hash 

Txout 과 Txin 으로 인한 트랜잭션이 완료가 되면 해당 거래내용을 직렬화 하여 SHA256등으로 해시를 해서 hash 값에 넣게됩니다. 이를 트랜잭션 hash라고 하는데 이는 트랜잭션의 풀에서도 이 거래에 대한 정보를 찾아내고 , 중복 여부검사, 서명검증, 채굴시 블록에 포함 여부 확인 등을 확인 할  수 있게 알려주는 고유식별자의 개념 즉 트랜잭션 ID 라고 볼 수 있습니다. 

 

트랜잭션 발생

    createRow(txIns: TxIn[], txOuts: TxOut[]): TransactionRow {
        const transactionRow = new TransactionRow();
        transactionRow.txIns = txIns
        transactionRow.txOuts = txOuts
        transactionRow.hash = this.serializeRow(transactionRow);
        return transactionRow;
    }

 

hash 생성

serializeRow(transactionRow);

 

트랜잭션 행 직렬화

 
    serializeRow(row: TransactionRow): string {
        const { txIns, txOuts } = row;
        const txOutsText = this.serializeTx<TxOut>(txOuts ?? [], (item) =>
        this.serializeTxOut(item)
        );
        const txInsText = this.serializeTx<TxIn>(txIns ?? [], (item) =>
        this.serializeTxIn(item)
        );
        return SHA256(txOutsText + txInsText).toString();
    }

 

트랜잭션 데이터 직렬화

 
    serializeTx<T>(data: T[], callback: (item: T) => string): string {
        return data.reduce((acc: string, item: T) => acc + callback(item), '');
    }

 

트랜잭션 출력 직렬화 ,트랜잭션 입력 직렬화

 
    serializeTxOut(txOut: TxOut): string {
        const { account, amount } = txOut;
        const text = [account, amount].join('');
        return SHA256(text).toString();
    }

 
    serializeTxIn(txIn: TxIn): string {
        const { txOutIndex } = txIn;
        return SHA256(txOutIndex?.toString() ?? '').toString();
    }

 

 

블록 채굴 흐름

 

초반에 배울때 트랜잭션의 해시와 머클루트를 착각한적이 있었는데  차이점을 정리해봤습니다.

구분) 트랜잭션 해시 (tx.hash) 머클 루트 (merkleRoot) 차이 

단위 트랜잭션 하나 블록 전체 트랜잭션들
용도 트랜잭션 식별, 추적 블록 무결성 검증
위치 트랜잭션 객체 블록 헤더
생성 방식 트랜잭션 내용 직렬화 후 해시 머클 트리 구조로 상위 해시 계산