12/08/2018, 17:15

Phần 3: Tự tạo ra một đồng tiền ảo Bitcoin của mình

Ở 2 phần trước ta đã hiểu thế nào là Blockchain, và thế nào là đào Hash để ngăn chặn giao dịch ảo. Tuy nhiên Blockchain của chúng ta vì quá khó để tạo giao dịch. Nó trở nên hoàn toàn kém hấp dẫn và chả ai đi bỏ thời gian ra đào Hash rồi nhét data vào chuỗi của chúng ta làm gì. Chúng ta cần tạo ...

Ở 2 phần trước ta đã hiểu thế nào là Blockchain, và thế nào là đào Hash để ngăn chặn giao dịch ảo. Tuy nhiên Blockchain của chúng ta vì quá khó để tạo giao dịch. Nó trở nên hoàn toàn kém hấp dẫn và chả ai đi bỏ thời gian ra đào Hash rồi nhét data vào chuỗi của chúng ta làm gì. Chúng ta cần tạo ra cái gì đó để kích cầu.

Lúc này thì khái niệm TIỀN ẢO mới ra đời. Tiền ảo là một PHẦN THƯỞNG dành cho người nào bỏ công sức để đào hash, để xác thực các giao dịch và thêm thành công các Block vào chuỗi của chúng ta. Ban đầu, lượng tiền ảo (hay tiền thưởng) đào được là rất ít, dẫn đến có sự cạnh tranh, sự trao đi đổi lại (trading) lấy tiền thật. Dần dần đồng tiền của ta tạo ra sẽ lên giá.

Với suy nghĩ đơn giản như vậy, ta hãy bắt tay vào sửa file html và tạo nên đồng tiền ảo đầu tiên của mình.

Để tạo ra một đồng tiền ảo hoàn chỉnh, ta cần cho phép giao dịch bằng đồng tiền ảo đó. Ở ví dụ trước ta đã tạo ra một dạng DuLieu có thể chứa giao dịch. Nhưng để chính thức hỗ trợ giao dịch, ta tạo một class mới dùng để chứa giao dịch như sau:

/*=== ĐÂY LÀ CLASS MÔ TẢ CẤU TRÚC CỦA MỘT GIAO DỊCH ===*/
class GiaoDich { //Các thông tin của một giao dịch vẫn cơ bản như cũ
    constructor(DiaChiGui, DiaChiNhan, GiaTri) {
        this.DiaChiGui = DiaChiGui;
        this.DiaChiNhan = DiaChiNhan;
        this.GiaTri = GiaTri;
    }
}

Lúc này trong phần định nghĩa của Blockchain, ta cần tạo thêm 2 biến mới.

/*Phần này mới được thêm vào*/
this.GiaoDichTamHoan = []; //Là mảng các giao dịch mới thêm vào mảng Blockchain và chưa được Hash xong.
this.TienThuong = 100; //Là phần thưởng dành cho các miner (người đào hash) cho việc thêm mới thành công mảng GiaoDichTamHoan vào Blockchain.

Thứ nhất là mảng GiaoDichTamHoan. Mảng này sẽ chứa toàn bộ các giao dịch mà chưa có mã Hash, đang đợi máy đào để được thêm vào Blockchain. Điều này sẽ cho phép nhiều giao dịch được thêm đồng thời vào Blockchain và cùng nằm trên một Block. Người giao dịch và người đào Block cũng độc lập với nhau.

Thứ hai là biến TienThuong để lưu giá trị mặc định của khoản tiền thưởng cho Người đào coin. Lượng tiền thưởng này như đã nói ở phần trước, sẽ bị giới hạn, bởi vì đến một lúc nào đó không thể tạo thêm Hash => không ai có thêm tiền thưởng nữa. Và như vậy nghĩa là đồng MyCoin của chúng ta có tính chất khan hiếm, y như vàng bạc vậy.

Trong số các hàm của Blockchain, ta thay hàm DaoBlock() bằng hàm DaoTienAo(). Bởi vì một Block lúc này không thể dễ dàng thêm vào Blockchain được nữa, mà phải có ai đó đào Hash cho Block đó để nó đc thêm vào chuỗi.

Định nghĩa hàm đào tiền ảo như sau:

DaoTienAo(DiaChiViNhanTienThuong) { //Hàm dùng để đào (thêm mới) một Block vào Blockchain.
    //Lúc này ta sẽ tạo mới một Block, trong Block này sẽ chứa toàn bộ các giao dịch đã bị tạm hoãn trước đó, do nó chưa được đào và chưa có Hash.
    let block = new Block(new Date(), this.GiaoDichTamHoan, this.PhanTuCuoiCung().Hash);

    block.DaoBlock(this.DoKho); //Vẫn phải đào Hash bình thường cho lần này.
    this.MangBlock.push(block); //Nối phần tử block vào làm phần tử cuối cùng của mảng Blockchain sau khi đã "đào" được.

    //Sau khi đã bỏ công ra đào 1 Hash cho giao dịch hiện tại, ta sẽ có quyền được thưởng một phần tiền thưởng cố định sẵn. GiaoDichTamHoan đã được xử lý xong nên có thể xóa nó đi, sau đó ta gán một GiaoDichTamHoan mới, trong đó chuyển lượng tiền ta nhận được vào ví của chính mình.
    this.GiaoDichTamHoan = [
        new GiaoDich(null, DiaChiViNhanTienThuong, this.TienThuong)
    ];
    //Chú ý là chỗ này ta không thể nhận được ngay lượng tiền này trong ví, vì giao dịch chưa được tạo và chưa có Hash. Nên trong Blockchain chưa có bản ghi mới ghi nhận số tiền đã chuyển vào ví nhận tiền thưởng.
    //Để nhận được khoản tiền thưởng cho lần đào này. Thì ta phải đợi đến lần đào kế tiếp, giao dịch tạm hoãn này sẽ được khớp lệnh và lúc đó tiền thưởng mới có trong ví.
}

Hàm đào tiền ảo như trong code đã comment, sẽ giúp cho người đào nhét được các giao dịch đang hoãn vào chuỗi. và để lần đào tiếp theo sẽ lấy được giá trị tiền thưởng.

Tại sao lại cần phải lần đào thứ 2 mới lấy được tiền thưởng của lần đào thứ 1. Như thế này thì ăn chặn của người ta à?

Mục đích của việc này có 2 tác dụng:

  1. Để tránh việc người đào "ăn non". Lấy tiền thưởng của Block này đập vào Block kia.
  2. Đó là để khuyến khích đào đào và đào. Người mới tham gia đào, sẽ luôn có một giao dịch chờ sẵn để người đó đào lấy tiền xài.

Trong thực tế thì đối với BitCoin, một giao dịch trong Blockchain chỉ được xác nhận khi mà phía sau Block chứa nó đã có thêm 6 Block khác được thêm vào. Lúc này thì ví tiền của bạn mới được cộng hoặc trừ tiền. Và chỉ khi đó thì bạn mới tiếp tục giao dịch tiếp được.

Khoảng thời gian bạn chờ cho có thêm 6 Block khác được insert vào thường được gọi là thời gian "tiền bị đóng băng" trong hệ thống. Tuy nhiên việc này thường chỉ diễn ra trong vài phút.

6 Block giao dịch xong mới được chứng nhận trong ví có tiền thường được gọi là cơ chế đồng thuận trong hệ thống. Khi mà có nhiều người cùng đào chuỗi Blockchain chứa Block có tiền của bạn. Họ sẽ gián tiếp xác nhận là giao dịch của bạn đáng tin

Việc ngăn không cho người đào lấy ngay được tiền thưởng đó là tùy vào từng đồng coin họ có áp dụng hay không. Đối với BitCoin thì là có. Ta hoàn toàn có thể tùy biến thuật toán chỗ này để áp dụng cho đồng MyCoin của ta.

Chú ý nữa đó là mảng GiaoDichTamHoan sau mỗi một lần đào Hash xong, sẽ nhét toàn bộ mảng này vào chung một Block. Như vậy là có thể có Block chứa tới 100 giao dịch. Ở đây hoàn toàn là do code của ta cho phép việc này. Đối với BitCoin hoặc Etherium, họ chỉ cho phép 2 giao dịch trong cùng một Block thôi. Do đó đào xong Hash, ta phải nhặt 2 GiaoDich trong mảng GiaoDichTamHoan để đưa vào Block mới tạo. Máy đào tiền ảo thực tế thì nó sẽ chọn random 2 GiaoDich bất kỳ (tất nhiên là ưu tiên cái giao dịch nhét tiền vào ví của chính mình trong mảng GiaoDichTamHoan rồi).

Rồi sau khi có thuật toán DaoTienAo. Ta cần một hàm nữa là hàm khởi tạo GiaoDich và nhét vào GiaoDichTamHoan

/* - Đây là hàm sẽ tạo ra một giao dịch mới. Đưa giao dịch vào mảng GiaoDichTamHoan. Như vậy là một Block sẽ có thể chứa nhiều giao dịch mà đang đợi Hash để được công nhận chính thức và thêm được vào Blockchain - */
TaoGiaoDich(GiaoDichMoi) {
    this.GiaoDichTamHoan.push(GiaoDichMoi);
}

Chúng ta cần một hàm nữa đó là hàm tính toán ra số tiền trong ví của mỗi người sau khi trao đổi mua bán bằng tiền ảo của chúng ta.

//Chúng ta cũng cần một hàm để kiểm tra được lượng tiền đang có trong một địa chỉ ví nào đó. 
//Mỗi một ví tiền không hề có một con số tổng tiền được lưu trữ lại. Mà việc tính toán số tiền của một địa chỉ ví trong toàn bộ Blockchain ta phải lần tìm lần lượt toàn bộ các giao dịch bên trong Blockchain để kiểm đếm số tiền của một ví. Điều này sẽ rất an toàn và trung thực.
//Một điều quan trọng là tính minh bạch ở đây vì bất kỳ ai khi có địa chỉ ví của bạn cũng sẽ nhìn thấy hết toàn bộ giao dịch bạn đã từng thực hiện trong hệ thống.
KiemTraTienTrongVi(DiaChiVi) {
    let TienTrongVi = 0;
    for (const block of this.MangBlock) {              //Đi duyệt qua toàn bộ các Block trong Blockchain
        for (const gd of block.DanhSachGiaoDich) {     //Đi duyệt qua toàn bộ các giao dịch trong Block (Vì một Block là 1 mảng các giao dịch)
            if (gd.DiaChiGui === DiaChiVi) {           //Nếu địa chỉ gửi là ví tiền này, thì tức là phải trừ ở Ví đi số tiền tương ứng trong giao dịch
                TienTrongVi -= gd.GiaTri;
            }

            if (gd.DiaChiNhan === DiaChiVi) {          //Nếu địa chỉ nhận là ví tiền này, thì tức là phải cộng vào Ví số tiền tương ứng trong giao dịch
                TienTrongVi += gd.GiaTri;
            }
        }
    }
    return TienTrongVi;                                //Kiểm đếm xong ta sẽ được con số tổng.
}

Như trong code cũng đã nói, mỗi một ví tiền không hề có một con số tổng tiền được lưu trữ lại ở đâu cả. Mà việc tính toán số tiền của một địa chỉ ví trong toàn bộ Blockchain ta phải lần tìm lần lượt toàn bộ các giao dịch bên trong Blockchain để kiểm đếm số tiền của một ví. Điều này sẽ rất an toàn và trung thực.

Điều quan trọng là tính minh bạch ở đây vì bất kỳ ai khi có địa chỉ ví của bạn cũng sẽ nhìn thấy hết toàn bộ giao dịch bạn đã từng thực hiện trong hệ thống.

Bây giờ thì đã có thể chạy thử rồi.

Các bạn có thể xem DEMO tại link này: LINK_DEMO

Download file example3.html tại đây: LINK_DOWNLOAD

Chúng ta hãy đi xem một trang web thực tế, nơi mà họ thực sự tạo ra một đồng tiền ảo có thể đào được ngay bằng trình duyệt. Bạn có thể đào tiền ảo, trao đổi và giao dịch với mọi người trong mạng trên toàn thế giới. Đồng tiền mà tôi đang nói tới, đó chính là NIMIQ.

Hãy vào thử trang web này: https://nimiq.com/miner/ Kích vào Connect to Network. Ta sẽ thấy như sau:

Hãy xem kỹ hơn các thông tin mà máy bạn đang đào.

Chúng ta thấy là quá trình đào được diễn ra một cách tự động, vậy là bạn đã biến laptop của mình thành một con Trâu cày tiền ảo rồi đấy.

Xem lại lịch sử một chút:

  • Vào năm 2009 BitCoin ra đời. Số tiền thưởng của đồng tiền ảo BitCoin là 50 BTC nếu Hash được 1 Block. Đến năm 2012 thì bị giảm 1 nửa còn 25 BTC nếu Hash thành công 1 Block. Và đến năm 2017 thì bị giảm tiếp 1 nửa còn 12.5 BTC/Block. Người ta tính ra là cứ 210.000 Block đào được thì tiền thưởng bị giảm một nửa. Giảm 64 lần là số tiền thưởng sẽ về 0. Và với tốc độ tính toán hiện tại thì khoảng năm 2140 là không còn tiền thưởng để đào nữa. Và hiện nay cả thế giới đang hóng một sự kiện, đó là ngày 31 tháng 5 năm 2020 thì tiền thưởng sẽ bị giảm tiếp một nửa chỉ còn 6.5 BTC/Block mà thôi. Chúng ta có thể xem đếm ngược ở đây cho vui: http://www.bitcoinblockhalf.com. Để xem tỉ giá đào BTC hãy vào đây: https://bitinfocharts.com/bitcoin/
  • Đồng tiền Ethereum thì không có cơ chế thưởng tiền sau khi đào xong 1 Block. Thay vào đó, mỗi một giao dịch sẽ có một khoản phí nhất định. Và tiền phí này được trả cho máy đào. Hiện tại tính ra thì 1 Block đào được sẽ có giá 3 ETH. Trung bình thì cứ 14.6 giây là đào được 1 Block ETH. Xem thêm tại https://bitinfocharts.com/ethereum/

Như vậy là kết thúc bài 3 trong loạt bài về Blockchain và Tiền ảo. Tôi đã lấy ra các thuật toán "đơn giản" nhất để minh họa và giúp bạn dễ hiểu hơn về cách hoạt động của 2 công nghệ đang làm mưa làm gió.

Đây chỉ là những gì sơ khai nhất về ứng dụng Blockchain vào xây dựng thử một loại Tiền ảo. Để có thể hình thành nên cả một đế chế tiền ảo riêng, có những đặc tính riêng biệt nhau. Thì rõ ràng thuật toán của họ phải rất kinh khủng

Vì Blockchain và Tiền ảo có rất nhiều cái hay, cách thực hiện nó cũng dễ. Nên hiện nay có thể thấy các đồng Coin mới ra đời cứ như mưa. Mỗi quốc gia hoàn toàn có thể tự tạo đồng Coin cho riêng mình.

Hạn chế trước mắt của Blockchain và tiền ảo là gì? Đó là mỗi Blockchain và mỗi đồng tiền ảo với thuật toán khác nhau thì hoàn toàn khác nhau và không thể trao đổi tay đôi được. Bạn không thể nào đặt lệnh giao dịch địa chỉ ví chứa BitCoin và lấy đồng Etherium nhét vào được. Vì đơn giản là 2 Blockchain này là hai array chứa thông tin khác hẳn nhau. Bạn bỏ tiền ra mua BitCoin thì không thể trao đổi ngang hàng với Etherium được mà phải dùng trung gian là đổi BTC ra tiền USD chẳng hạn, rồi dùng tiền đó đi mua ETH.

Nhiều dân Trader (người mua đi bán lại) các đồng tiền ảo cũng thấy rằng, họ giao dịch giữa người A với người B nhưng vẫn bị mất một phần nhỏ chi phí giao dịch bị ghi là chi phí dành cho máy đào. Giờ thì bạn đã biết là tại sao rồi chứ nhỉ?

Blockchain và tiền ảo mới đang ở thủa sơ khai của nó. Còn rất nhiều thứ cần được nâng cấp và thuật toán cần được mở rộng. Do đó hãy cùng chờ đợi sự bùng nổ của 2 công nghệ này trong năm 2018 nhé bạn.

Bài này hi vọng nó đã giúp cho bạn có một cái nhìn tổng quan và hiểu biết nhất định để đọc các bài viết khác về Blockchain không bị bỡ ngỡ.

Các bạn hãy comment và share các link tham khảo mà bạn đang đọc về Blockchain và Bitcoin để cùng trao đổi nhé.

0