My Post (1)

Blockchain hoạt động như thế nào?

Trước đây, khi mà những cuốn sổ cái ghi lại các thông tin giao dịch, … được lưu tập trung tại 1 nơi. Điều đó dẫn đến 1 số vấn đề như:

  • Thiên tại, hỏa hoạn xảy ra sẽ làm mất thông tin.
  • Ai đó sửa đổi bất hợp pháp thông tin, dẫn đến việc thông tin không còn chính xác.

Vì vậy Blockchain đã khắc phục được những vấn đề đó. Blockchain là cuốn sổ cái phân tán, nó bao gồm các block data được liên kết thông qua việc sử dụng mật mã. Nó là một network các node được liên kết với nhau thông qua public network. Những người trong network sẽ dữ 1 bản sao của sổ cái, trường hợp sổ cái này có vấn đề thì họ chỉ đơn giản là copy lại từ những người khác.

Một block data bao gồm các giá trị sau:
Hash: Chữ ký số của block
PreviousHash: Chữ ký số của block trước nó
Data: Dữ liệu của block
TimeStamp: Thời gian block được tạo

Chúng ta sẽ sử dụng Java để tạo demo 1 blockchain cơ bản:

Trước tiên chúng ta tạo class Block như sau:

package com.cloudace.blog;

import lombok.Data;
import lombok.ToString;

import java.security.MessageDigest;
import java.sql.Timestamp;

@Data
@ToString
public class Block {
    private String hash;
    private String previousHash;
    private String data;
    private long timeStamp;

    public Block( String data, String previousHash) {
        this.previousHash = previousHash;
        this.data = data;
        this.timeStamp = new Timestamp(System.currentTimeMillis()).getTime();
        this.hash = calculateHash();
    }

    public String calculateHash() {
        try {
            String value = previousHash
                    + timeStamp
                    + data;
            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            byte[] bytes = digest.digest(value.getBytes("UTF-8"));
            StringBuffer sb = new StringBuffer();
            for (byte b: bytes) {
                sb.append(String.format("%02x", b));
            }
            return sb.toString();
        } catch (Exception e) {
            throw new RuntimeException();
        }
    }
}

Class này chứa các thông tin như đã nói ở trên. Ngoài ra nó còn có method calculateHash, method sử dụng thuật toán SHA256 để mã hoá những thông tin của block và trả về String. String này chính là chữ ký số của block.

Tạo method main để test:

public static void main(String[] args) {
    List<Block> blocks = new ArrayList<>();

    blocks.add(new Block("First block", "0"));
    blocks.add(new Block("Second block", blocks.get(blocks.size() - 1).getHash()));
    blocks.add(new Block("Third block", blocks.get(blocks.size() - 1).getHash()));

    for (Block b: blocks) {
        System.out.println(b.toString());
    }
}

Trong blockchain, block đầu tiên gọi là Genesis và block này có previousHash là “0”.
Những block kế tiếm sẽ có previousHash là Hash của block trước đó. Như vậy, nếu ai đó cố tình thay đổi data sẽ phải đổi Hash của block đó và tất cả Hash của các block kế tiếp cho đến block cuối cùng. Điều đó gần như không thể.

Kết quả output sẽ là:

Block(hash=accbf67cd8771f725768c7238d76799b02eb5b6d28773ac2750b5dc9271f61c5, previousHash=0, data=First block, timeStamp=1601453898252)
Block(hash=3a133d8796f6734a50d47ed44810a0250015a0d32f1c56808de824952fe49d5b, previousHash=accbf67cd8771f725768c7238d76799b02eb5b6d28773ac2750b5dc9271f61c5, data=Second block, timeStamp=1601453898282)
Block(hash=a07fe5542febfe653494163fe93fbd699b03d2cb50f4afbf34071c4c2bce7e76, previousHash=3a133d8796f6734a50d47ed44810a0250015a0d32f1c56808de824952fe49d5b, data=Third block, timeStamp=1601453898283)

Như vậy làm sao để biết data có bị thay đổi hay không? Để kiểm tra việc này, chúng ta tạo method validBlock() như dưới đây:

public static boolean validBlock(List<Block> blocks) {
    for (int i = 0; i < blocks.size() - 1; i++) {
        String previousHash = blocks.get(i).getHash();
        Block block = blocks.get(i + 1);
        if (!previousHash.equals(block.getPreviousHash())) {
            return false;
        }
        if (!block.getHash().equals(block.calculateHash())) {
            return false;
        }
    }
    return true;
}

Method này sẽ kiểm tra xem Hash của block trước đó với previousHash của block hiện tại có giống nhau không. Dĩ nhiên, điều kiện bắt buôc là nó phải giống nhau, nếu nó không giống nhau có nghĩa là nó đã bị thay đổi một cách không hợp lệ.
Tương tự, chúng ta cũng tính toán Hash dựa vào thông tin của block hiện tại để đối chiếu với Hash của block hiện tại.
Nếu cả 2 điều kiện trên đúng thì xem như block hợp lệ.

Add dòng code sau vào method main() để check.

System.out.println("isValid: " + validBlock(blocks));

Nhận được kết quả như sau:

isValid: true

Giả sử có ai đó cố tình thay đổi Hash như sau(thêm ký tự “a” vào Hash):

blocks.add(new Block("Second block", blocks.get(blocks.size() - 1).getHash() + "a"));

Ta sẽ được output như sau:

Block(hash=650ec34a31e43874d189aba323dcefe1dd73debc7bbcfa385b7ba2c03740827c, previousHash=0, data=First block, timeStamp=1601455442784)
Block(hash=dcf625749c693074ce8361c429f009f707c74b623369a1ef54ed8b8555f8848a, previousHash=650ec34a31e43874d189aba323dcefe1dd73debc7bbcfa385b7ba2c03740827ca, data=Second block, timeStamp=1601455442808)
Block(hash=3627f9ff42f67f020345e482db3795ce8e5f28735414453c31e5e20bea9fd057, previousHash=dcf625749c693074ce8361c429f009f707c74b623369a1ef54ed8b8555f8848a, data=Third block, timeStamp=1601455442810)
isValid: false

Việc thay đổi trên dẫn đến Hash của block đầu tiên và previsouHash của block thứ 2 khác nhau. Nên nó không hợp lệ, data của chúng ta không còn toàn vẹn.

Đến đây hy vọng phần nào giúp bạn hiểu được cách blockchain hoạt động. Ở các phần sau, tôi sẽ giới thiệu thêm về việc đào mining như thế nào. Các bạn đón xem nhé.

Comments are closed.