Blockchain - Cơ chế generate blocks
Bài đăng này đã không được cập nhật trong 3 năm
1. Giới thiệu
Blockchain - 1 từ khóa rất hot hiện nay, nhưng đại đa số vẫn không hiểu được thực sự nó là cái gì, công nghệ đằng sau nó được tạo ra như thế nào, và cứ nghĩ nó là 1 thứ gì đó cao siêu lắm. Trong bài viết này mình sẽ cho các bạn thấy thực sự nó không cao siêu như các bạn tưởng tượng.
2. Ví dụ
Mình sẽ sử dụng Java Language và JVM to run program. Đầ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 . Ok, 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.
3. Kết Luận
- Blockchain về cơ bản đều được tạo ra theo nguyên lý ở trên.
- Thuật toán hash rất khó bị crack vì nó là dạng mã hóa 1 chiều, hơn nữa previous hash tạo ra dựa trên hash của block trước đó, và current hash sẽ được base vào previous hash. Nên khi thay đổi dữ liệu của 1 transaction thì tất cả các digital signatures của các block sau cũng sẽ bị thay đổi. Giả sử cho dù bạn có thay đổi được 1 block, nhưng khi bạn broadcast nó ra network, sẽ bị reject ngay. Tại sao lại như vậy, vì nếu bạn muốn thay đổi 1 block và các block sau đó, thì bạn phải có sự đồng thuận 51% của nodes còn lại hay chính là bạn phải kiểm soát được 51% hashrate của mạng lưới. Về cơ bản nó chính là dựa trên nguyên tắc "đa số thằng tiểu số vậy" :v Nhưng trên thực tế để mà kiểm soát 51% mạng lưới thì khó khả thi.
4. Resource:
All rights reserved