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 |