본문 바로가기
블록체인/블록체인 이론

블록체인 구현하기: Java로 채굴 기능 구현하기

by P_eli 2024. 3. 7.
728x90
반응형

블록 클래스 구현하기

우선 블록을 나타내는 Block 클래스를 구현해야 합니다. 이 클래스에는 블록의 속성과 기능이 정의되어 있습니다.

package core;

import util.Util;

public class Block {
    
    private int blockID;
    private String previousBlockHash;
    private int nonce;
    private String data;
    
    // Getter 및 Setter 메서드
    public int getBlockID(){
		return blockID;
	}
	
	public void setBlockID(int blockID){
		this.blockID = blockID;
	}
	
	public int getNonce(){
		return nonce;
	}
	
	public void setNonce(int nonce){
		this.nonce = nonce;
	}
	
	public String getData(){
		return data;
	}
	
	public void setData(String data){
		this.data = data;
	}
	
	public String getPreviousBlockHash(){
		return previousBlockHash;
	}

	public void setPreviousBlockHash(String previousBlockHash){
		this.previousBlockHash = previousBlockHash;
	}

    // 생성자
    public Block(int blockID, String previousBlockHash, int nonce, String data) {
        this.blockID = blockID;
        this.previousBlockHash = previousBlockHash;
        this.nonce = nonce;
        this.data = data;
    }

    // 블록 정보 출력
    public void getInformation() {
        System.out.println("-----------------------------------------------------");
        System.out.println("블록 번호 : " + getBlockID());
        System.out.println("이전 해시 : " + getPreviousBlockHash());      
        System.out.println("채굴 변수 값 : " + getNonce());
        System.out.println("블록 데이터 : " + getData());
        System.out.println("블록 해시 : " + getBlockHash());
        System.out.println("-----------------------------------------------------");
    }

    // 블록 해시 계산
    public String getBlockHash() {
        return Util.getHash(nonce + data + previousBlockHash);
    }

    // 블록 채굴
    public void mine() {
        while (true) {
            if (getBlockHash().substring(0, 4).equals("0000")) {
                System.out.println(blockID + "번째 블록의 채굴에 성공했습니다.");
                break;
            }
            nonce++;
        }
    }
}

 

블록체인 스타터 클래스 구현하기

이제 블록체인을 시작하는 BlockChainStarter 클래스를 구현할 차례입니다. 이 클래스에서는 먼저 블록을 생성하고 채굴한 후, 이전 블록의 해시 값을 다음 블록에 전달하는 과정을 반복합니다.

package core;

import util.Util;

public class BlockChainStarter {

    public static void main(String[] args) {
        Block block1 = new Block(1, null, 0, "데이터");
        block1.mine();
        block1.getInformation();

        Block block2 = new Block(2, block1.getBlockHash(), 0, "데이터");
        block2.mine();
        block2.getInformation();

        Block block3 = new Block(3, block2.getBlockHash(), 0, "데이터");
        block3.mine();
        block3.getInformation();

        Block block4 = new Block(4, block3.getBlockHash(), 0, "데이터");
        block4.mine();
        block4.getInformation();
    }

}

 

실행 결과

위의 코드를 실행하면 각 블록이 순차적으로 채굴되고 블록 정보가 출력됩니다. 블록이 채굴될 때마다 이전 블록의 해시 값이 새로운 블록에 전달되어 연결되는 것을 확인할 수 있습니다.

 

 

여기서 만약 두 번째 데이터를 임의대로 변조한다면 어떻게 될까요?

 

두 번째 블록부터 해시 값이 변하는 이유는 블록체인의 특성 때문입니다. 블록체인에서는 이전 블록의 정보를 현재 블록에 반영하여 연결되어 있습니다. 따라서 한 블록의 정보가 변경되면 해당 블록 이후의 모든 블록의 해시 값도 변경될 수 있습니다.

 

여기서는 두 번째 블록부터 데이터가 "변조된 데이터"로 설정되어 있습니다. 블록체인에서는 블록에 저장된 데이터가 변경되면 해당 블록의 해시 값이 변경됩니다. 따라서 두 번째 블록의 데이터가 변경되면 두 번째 블록의 해시 값 또한 변경됩니다.

 

블록체인의 보안과 무결성을 유지하기 위해 블록의 해시 값은 블록 내용에 따라 생성됩니다. 블록의 데이터가 변경되면 해시 값도 변경되므로, 이전 블록의 해시 값을 현재 블록에 반영할 때 변경된 해시 값을 사용해야 합니다. 따라서 두 번째 블록부터 이전 블록의 해시 값이 변경되어야 하며, 이로 인해 블록체인의 모든 후속 블록의 해시 값도 변경됩니다.

 

결국, 블록체인은 연결된 블록의 변경이 한 블록에만 영향을 미치지 않고 전체 블록체인에 영향을 미치는 분산 데이터 구조입니다. 이것이 블록체인의 핵심적인 특징 중 하나입니다.

 

이렇게 하여 Java로 간단한 블록체인을 구현해 보았습니다.

 

참조

Youtube 동빈나

 https://www.youtube.com/playlist?list=PLRx0vPvlEmdCjjaBT_30X8kl534op_Hmy 

728x90
반응형