Hôm nay chúng ta cùng dành chút thời gian đi tìm hiểu Genesis Block là gì, cơ chế hoạt động của Genesis Block qua bài viết dưới đây.
Vậy Genesis Block là gì ?
Genesis Block là tên gọi dành cho khối đầu tiên trên Blockchain của Bitcoin, hay còn được gọi là “khối nguyên thuỷ”. Genesis Block được tìm thấy vào lúc 18:15:05 UTC ngày 03/01/2009 bởi Satoshi Nakamoto.
Genesis Block chứa một lời nhắn bí mật được giải mã với nội dung “The Times 03/Jan/2009 Chancellor on brink of second bailout for banks”.
Đây có thể là lời nhắn của Satoshi với 2 vế nhằm mục đích đánh dấu ngày khối đầu tiên được tìm thấy và nói rằng các chính phủ đã bơm gói cứu trợ nhằm chống lại sự sụp đổ của hệ thống ngân hàng.
Genesis Block chứa phần thưởng 50 BTC dành cho người khai thác được. Kể từ khi được tìm thấy, Genesis Block nhận được 1.073 giao dịch và 16.5 BTC từ những người tò mò về khối này. Không ai lý giải được vì sao Genesis Block lại tạo ra những BTC không sử dụng được và không có lời giải thích nào được tìm thấy trong mã nguồn của phiên bản Satoshi 0.1.
Các bạn có thể kiểm tra tại đây:
https://www.blockchain.com/btc/address/1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa
Satoshi đã giải thích rằng nếu thiết kế của Bitcoin là tĩnh thì các nguyên quy tắc như nguồn cung, độ khó khi đào và phần thưởng sẽ không thể thay đổi. Cho đến ngày nay thì thiết kế của Bitcoin vẫn được giữ nguyên vì đó là nền tảng của toàn bộ Blockchain này.
Ngoài ra Genesis Block còn chứa đựng nhiều bí ẩn khác chưa ai có thể lý giải như:
- Chiếc máy tính đào ra Genesis Block nằm ở đâu trên thế giới này ?
- Satoshi Nakamoto đã sử dụng bao nhiêu máy tính để đào Genesis Block ?
- Tại sao lại mất 6 ngày để đào và Satoshi có nghĩ ngơi 1 ngày sau đó ?
Cơ chế hoạt động của Genesis Block
Đầu tiên, mỗi block sẽ chứa : + Data + Previous hash + Current hash
↓ Vì vậy mình sẽ tạo ra 1 file gọi là Block.java sẽ có variables sau :
private int preHash; //previous hash
private int blockHash; //current hash
private String[] data; //data
sau đó tạo constructor chứa 2 params :
public Block(int preHash, String[] data) {
this.preHash = preHash;
this.data = data;
Object[] contents = {Arrays.hashCode(data), preHash}; //hash data and preHash ~> contents
this.blockHash = Arrays.hashCode(contents); //generate current block hash base on preHash and data .
}
ở trên mình dùng Arrays.hashCode để mã hóa transactions và previous hash. Sau đó lại hashCode result contents để generate ra hash của block hiện tại. Thêm hàm get để get value của previous hash, transactions, current hash :
public int getPreHash() {
return preHash;
}
public String[] getData() {
return transactions;
}
public int getBlockHash() {
return blockHash;
}
↓ OK, tiếp đến mình sẽ tạo file Main.java . Lần lượt khởi tạo object genesisBlock, block2, block3 :
String[] genesisData = {“A sent B 999 bitcoin”};
Block genesisBlock = new Block(0, genesisData);
String[] block2Data = {“B sent C 50 bitcoin”};
Block block2 = new Block(genesisBlock.getBlockHash(), block2Data);
String[] block3Data = {“C sent D 40 bitcoin”};
Block block3 = new Block(block2.getBlockHash(), block3Data);
Ở trên genesisBlock : là block đầu tiên, previous hash của nó được set value là 0, block2 được tạo ra dựa trên hash của genesisBlock, block 3 được tạo ra dựa trên hash của block2 .
Sau đây chúng ta thử print kết quả ra xem thế nào nhé :
System.out.println(“- Genesis block:”);
System.out.println(“Current blockhash: ” + genesisBlock.getBlockHash());
System.out.println(“- Block 2:”);
System.out.println(“Previous blockhash: ” + block2.getPreHash());
System.out.println(“Current blockhash: ” + block2.getBlockHash());
System.out.println(“- Block 3:”);
System.out.println(“Previous blockhash: ” + block3.getPreHash());
System.out.println(“Current blockhash: ” + block3.getBlockHash());
Run program và xem kết quả sẽ như sau :
ー Genesis block: Current blockhash: 984306106 ー Block 2: Previous blockhash: 984306106 Current blockhash: 1987505532 ー Block 3: Previous blockhash: 1987505532 Current blockhash: -209538211
Giờ ta thử thay đổi chuỗi genesisData = {“A sent B 999 bitcoin”} và run sẽ ra kết quả như sau :
ー Genesis block: Current blockhash: 1255653266 ー Block 2: Previous blockhash: 1255653266 Current blockhash: -2036114604 ー Block 3: Previous blockhash: -2036114604 Current blockhash: 61808949
Có thể thấy khi thay đổi data 1 block thì mã hash của block đó và các block sau đó đều bị thay đổi.