core > BlockChainStarter

package core;

public class BlockChainStarter {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		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();
	}
}

core > Block

package core;

import util.Util;

public class Block {

	private int blockID; // 블록 아이디
	private String previousBlockHash; // 이전 블록의 해시 값
	private int nonce; // 채굴을 위한 정답
	private String data; // 블록에 들어가는 데이터
	
	public Block(int blockID, String previousBlockHash, int nonce, String data) {
		this.blockID = blockID;
		this.previousBlockHash = previousBlockHash;
		this.nonce = nonce;
		this.data = data;
	}
	
	public int getBlockID() {
		return blockID;
	}
	
	public void setBlockID(int blockID) {
		this.blockID = blockID;
	}
	
	public String getPreviousBlockHash() {
		return previousBlockHash;
	}

	public void setPreviousBlockHash(String previousBlockHash) {
		this.previousBlockHash = previousBlockHash;
	}
	
	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 getBlockHash() { // 해당 블록의 해시 값
		return Util.getHash(nonce + data + previousBlockHash);
	}
	
	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 void mine() {
		while(true) {
			if(getBlockHash().substring(0, 4).equals("0000")) { // nonce + data + previousBlockHash의 해시 값이 "0000"으로 시작할 때 채굴에 성공 // 채굴 난이도 고정
				System.out.println(blockID + "번째 블록의 채굴에 성공했습니다.");
				break;
			}
			nonce++;
		}
	}
}

util > Util

package util;

import java.security.MessageDigest;

public class Util {
	
	public static String getHash(String input) { // 단순 문자열 input
		StringBuffer result = new StringBuffer();
		
		try {
			MessageDigest md = MessageDigest.getInstance("SHA-256"); // Secure Hash Algorithm // 256비트로 구성 // 64자리 문자열 반환
			md.update(input.getBytes());
			byte bytes[] = md.digest();
			
			for(int i = 0; i < bytes.length; i++) {
				result.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
			}
		} catch(Exception e) {
			e.printStackTrace();
		}
		
		return result.toString(); // SHA-256 해시를 적용한 결과 리턴
	}
}

 

<정상적인 경우>

<특정 블록의 데이터 변조>

 

<블록체인 해킹이 불가능한 이유>

1. 특정 블록의 데이터가 변조된다면 이후 모든 블록의 해시 값이 달라진다.

즉, 특정 블록의 데이터 변조를 위해서는 이후 모든 블록에 대한 채굴을 다시 수행해야 한다는 것

2. 이후 모든 블록에 대한 채굴을 다시 수행하여 이전에 발생했던 트랜잭션 정보를

변조하는데 성공했다고 하더라도 전체 네트워크에서 50% 이상의 컴퓨팅 파워를 갖고 있지 않은 이상

올바른 블록체인으로 인정받을 수 없다.

해커의 블록체인 vs 그 외 모든 사람들(과반수)의 블록체인 => 해커의 블록체인은 무시됨

'Block Chain' 카테고리의 다른 글

[Block Chain] Java 실습-3  (0) 2022.12.21
[Block Chain] Java 실습-1  (0) 2022.12.19
[Block Chain] 암호화폐  (0) 2022.12.01
[Block Chain] 해시  (0) 2022.12.01
[Block Chain] 쉽게 이해하기  (0) 2022.11.30

+ Recent posts