Phần 1 Tự xây dựng một Blockchain đơn giản

Ngay bây giờ, ta hãy thử sử dụng javascript thuần và HTML để tự xây dựng một công nghệ Blockchain

Để mô tả một Block (phần tử giao dịch) trong Blockchain (mảng các giao dịch), ta cần một class như sau:

class Block {
 constructor(NgayGioTao, DuLieu, HashTruocDo = '') { //Để tạo ra một Block chúng ta cần truyền vào các tham số như sau:
   this.NgayGioTao = NgayGioTao; //Ngày tháng hiện tại tạo ra Block này 
   this.DuLieu = DuLieu; //Dữ liệu sẽ được lưu trong BLock này. Nó có thể là bất cứ cái gì, từ String, Array, Object JSON...
   this.HashTruocDo = HashTruocDo; //Lưu trữ Hash của Block ngay trước Block này. Vì các Block sẽ được nối lại thành chuỗi (mảng). 
   this.Hash = this.TinhToanHash(); //Mã hóa toàn bộ nội dung của BLock này theo thuật toán SHA256 và lưu lại vào chính Block này.
  }
  TinhToanHash() { //Hàm mã hóa nội dung của toàn bộ Block. Do đó ta cần lấy toàn bộ các thuộc tính của Block đưa vào SHA256 để mã hóa ra một chuỗi. 
    return CryptoJS.SHA256(this.HashTruocDo + this.NgayTao + JSON.stringify(this.DuLieu)).toString(); //chú ý: JSON.stringify(this.DuLieu) sẽ convert biến Object this.DuLieu thành chuỗi. 
  }
}

Hàm quan trọng nhất trong mỗi Block chính là hàm tính toán giá trị Hash (mã hóa) của toàn bộ Block đó. Vì hàm tính toán Hash cần đến một thuật toán mã hóa mạnh là mã hóa SHA 256 bit, do đó ta cần một thư viện.  Tôi sẽ load thư viện này từ cdn:

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/core.min.js"></script> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/sha256.min.js"></script>

Chúng ta cần tạo một class Blockchain để chứa mảng các phần tử Block

/*=== ĐÂY LÀ CLASS MÔ TẢ CẤU TRÚC CỦA MỘT BLOCKCHAIN. LÀ MỘT MẢNG CÁC BLOCK ===*/ class Blockchain { 
 constructor() { //Cấu trúc của Blockchain như sau 
  this.MangBlock = []; //Tạo ra một mảng rỗng để chứa các Block.
  this.MangBlock.push(new Block("01/01/2018", "Genesis Block", "0")); //Tạo phần tử đầu tiên của Blockchain. Đây thường được gọi là Genesis Block, hay chính là "phần tử khởi tạo". Các phần tử tiếp theo sẽ nối tiếp vào phần tử này. 
 }
 
 PhanTuCuoiCung() { 
     return this.MangBlock[this.MangBlock.length - 1]; //Lấy ra phần tử cuối cùng của Blockchain 
 } 

 TaoMoiBlock(newBlock) { //Hàm dùng để thêm mới một Block vào Blockchain. 
    newBlock.HashTruocDo = this.PhanTuCuoiCung().Hash; //Lấy Hash của phần tử cuối cùng của mảng và lưu vào HasTruocDo của phần tử này 
    newBlock.Hash = newBlock.TinhToanHash(); //Tính toán Hash của chính phần tử này. 
    this.MangBlock.push(newBlock); //Nối phần tử newBlock vào làm phần tử cuối cùng của mảng Blockchain. 
 }
 
 KiemTraTinhToanVen() { 
     for (let i = 1; i < this.MangBlock.length; i++) { 
        const BlockHienTai = this.MangBlock[i]; //Lấy ra phần tử ở vị trí hiện tại 
        const BlockTruocDo = this.MangBlock[i - 1]; //Lấy ra phần tử ở ngay trước vị trí hiện tại 
       if (BlockHienTai.Hash !== BlockHienTai.TinhToanHash()) { //Kiểm tra lại Hash của toàn bộ Block hiện tại và Hash đã lưu xem có trùng nhau không. 
           return false; //Nếu không trùng tức là Dữ liệu trong Block hiện tạiđã bị chỉnh sửa, hàm KiemTraToanVen sẽ trả về false luôn. 
       } 
       if (BlockHienTai.HashTruocDo !== BlockTruocDo.Hash) { //Lấy Hash hiện tại và Hash phần tử trước đó đã lưu xem có trùng nhau không. 
          return false; //Nếu không trùng tức là Hash của Block hiện tại đã bị chỉnh sửa, hàm KiemTraToanVen sẽ trả về false luôn.
       } 
    } 
    return true; //Nếu kiểm tra hết toàn bộ trong vòng For mà không vấn đề gì thì tức là Blockchain vẫn toàn vẹn, chưa bị sửa đổi. 
  }
}

Hàm TaoMoiBlock() là hàm sẽ đảm bảo 2 việc:

  1. Tính toán toàn bộ Hash của Block hiện tại và lưu lại.
  2. Lấy Hash của Block cuối cùng để lưu vào biến HashTruocDo của Block hiện tại. Như vậy thì các Block sẽ được nối (chain-xích) lại với nhau thông qua ràng buộc là mã Hash.

Hàm KiemTraTinhToanVen() là một hàm rất quan trọng, đóng vai trò trái tim trong Blockchain. Mỗi khi một người dùng bất kỳ muốn kiểm tra toàn bộ Blockchain hiện tại xem có an toàn hay không để tiếp tục giao dịch. Toàn bộ các Hash trong chuỗi được lấy ra so sánh. Tính toàn vẹn của từng Block và tính liên kết của toàn bộ Block phải được đảm bảo không bị sai mã Hash. Nếu có một trường hợp sai, tức là data đã bị ai đó trong mạng chỉnh sửa.

Như vậy là công nghệ Blockchain tự tạo đã xong, giờ ta có thể bắt đầu test nó:

var MyCoin = new Blockchain(); //Tạo mới một Blockchain để chứa các giao dịch. Ở đây ta có thể coi là lịch sử giao dịch của đồng tiền MyCoin. 
MyCoin.TaoMoiBlock(new Block("02/01/2018", { //Thêm một giao dịch mới, Data là một Object chứa nội dung chuyển tiền 
   NguoiGui: "Ong A", 
   NguoiNhan: "Ba B", 
   Tien: 350 
})); 
MyCoin.TaoMoiBlock(new Block("03/01/2018", {//Thêm một giao dịch mới, Data là một Object chứa nội dung chuyển tiền 
   NguoiGui: "Ba B", 
   NguoiNhan: "Ong C", 
   Tien: 200 
}));

Sau khi chạy kết quả ta sẽ thấy sự toàn vẹn của dữ liệu đã được kiểm tra đúng. Và dữ liệu MangBlock cũng đã liên kết đúng giữa HashTruocDo và Hash của 2 phần tử liền kề nhau.

Kết luận

Chỉ đơn giản như vậy là ta đã tạo thành công một công nghệ Blockchain. Để có thể giao dịch được thì file js  này của chúng ta phải được copy đến các máy cá nhân của người dùng trong mạng. Và giá trị MangBlock phải là cố định và được sync (đồng bộ) bằng mạng ngang hàng P2P để mỗi khi có giao dịch mới ở máy một người, toàn bộ những người khác sẽ Validate (kiểm tra lại tính toàn vẹn những gì được thêm vào) và tiếp tục giao dịch tiếp. Công nghệ Blockchain sơ khai này mới đáp ứng được một số yêu cầu đơn giản của Blockchain:

  1. Dữ liệu nằm phân tán.
  2. Dữ liệu và mã nguồn được minh bạch. Người dùng sẽ dễ dàng kiểm tra tính toàn vẹn.
  3. Một khi dữ liệu đã thêm vào hệ thống thì không thể xóa hoặc sửa được nữa. Nếu mất đi một phần tử thì chuỗi của chúng ta không toàn vẹn. Điều này đảm bảo tính minh bạch của toàn hệ thống, không ai có thể tác động vào hệ thống và mọi người đều nhìn thấy rõ dữ liệu một khi đã thêm vào thành công.

Tuy nhiên công nghệ Blockchain vừa tạo vẫn còn một số sơ hở:

  1. Người dùng dễ dàng thêm hàng trăm ngàn giao dịch vào hệ thống mỗi giây. Dẫn đến hệ thống bị SPAM và toàn giao dịch rác. Blockchain dài nhất cũng sẽ được coi là đúng nhất do đó khả năng sai lệch hệ thống.
  2. Hacker dễ dàng clone (copy) toàn bộ biến MangBlock rồi sửa một bản ghi, rồi ghi đè toàn bộ MangBlock fake đó vào hệ thống của hắn. Tiếp theo MangBlock đó sẽ được tính toán lại Hash cho thành chuỗi mới và đồng bộ tự động, và ghi đè vào máy của những người còn lại. Dẫn đến sự “tèo” của hệ thống chúng ta khổ công gây dựng.

Để nâng cấp hệ thống vừa xây dựng, chúng ta cần tìm hiểu đến một công nghệ cao siêu hơn. Đó chính là các công nghệ “đào” tiền ảo, hay còn gọi là Mining. Hồi sau sẽ có

 

Leave a reply:

Your email address will not be published.

Site Footer