블록 클래스 구현하기
우선 블록을 나타내는 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
'블록체인 > 블록체인 이론' 카테고리의 다른 글
Java에서 SHA-256 함수 구현해보기 (0) | 2024.03.04 |
---|---|
Java로 배우는 블록체인: 이론과 구현 (0) | 2024.03.03 |