+24

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

Tiền ảo là gì?

Ở 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.

Thuật toán để tạo ra một đồng tiền ảo

Để 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

Thực tế có như DEMO?

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/

Kết luận

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é.


All rights reserved

Bình luận

Đăng nhập để bình luận
Avatar
@quangvn6388
thg 3 7, 2018 2:30 SA

Thanks bác đã chia sẻ!

Avatar
@Dao.Danh.Luu
thg 3 16, 2018 8:15 SA

Bài viết rất hay. Bạn cho mình hỏi là mình muốn lấy lịch sử giao dịch của mình thì làm thế nào nhỉ?

Xem thêm (2)
Avatar
@chungminhtu
thg 3 19, 2018 4:12 SA

Dĩ nhiên thì hiệu năng sẽ là bài toán cho người lập trình. Tuy nhiên vì sử dụng mạng ngang hàng. Thì cơ chế của một đồng tiền Ảo phải có một điểm trung gian để các máy client connect đến. Mỗi một quốc gia sẽ có một nút mạng như thế, ta có thể hiểu là 1 "Node". Và ở đó có hệ thống máy chủ lớn chứa các giao dịch và tính toán các giá trị cần thiết (như bạn yêu cầu). Do đó người dùng gần như k cần quá quan tâm đến liệu máy mình đủ mạnh để join vào mạng blockchain hay k. Thực tế thì điện thoại hoặc thiết bị IoT (tivi, tủ lạnh...) cũng có thể truy cập được blockchain như bình thường.

Avatar
@Dao.Danh.Luu
thg 3 19, 2018 4:45 SA

Tks bạn 😄

Avatar
@simple1805
thg 3 19, 2018 3:33 SA

Hay qúa anh ạ

Avatar
@caothien
thg 5 3, 2018 4:06 CH

Quá hay và bổ ích ạ. Cảm ơn anh đã chia sẻ

Avatar
@lequynam93
thg 5 24, 2018 3:44 SA

ở phần này tham so DuLieu của block đã chuyển thành danh sách giao dịch rồi mà, sao phần tinhtoanHash vẫn ghi là DuLieu nhỉ??

Avatar
@chungminhtu
thg 5 24, 2018 3:48 SA

Cám ơn bạn đã phát hiện sai sót. Phải viết là this.DanhSachGiaoDich thay cho this.DuLieu mới đúng.

Avatar
@lequynam93
thg 5 24, 2018 6:41 SA

có 1 vấn đề là ở bài viết đã thêm giao dịch trực tiếp vào để xử lý và sẽ trả TienThuong. Nhưng thực tế ban đầu chỉ có Genesis Block, chưa hề có giao dịch nào, vì phải xử lý giao dịch thì mới tạo TienThuong nên chưa ai có đồng coin cả. Chẳng lẽ ng đào đầu tiên sẽ đc khối block tiếp theo của Genesis Block chứa mảng DanhSachGiaoDich là rỗng, lúc này mới ms sinh ra 100 TienThuong đầu tiên ?

Xem thêm (5)
Avatar
@lequynam93
thg 5 24, 2018 8:27 SA

oh, vậy để mình đọc lại xem. mà mình còn có 1 thắc mắc nữa. Như ở đây mình đã mặc định cho khối GenesisBlock và gán dữ liệu cứng cho nó từ đầu. Người nối tiếp block tiếp theo mới được trả thưởng. Nhưng còn ở Bitcoin sao mình đọc thấy khối GenesisBlock phải đào, và satoshi là người đào cái khối đầu tiên đó và được thưởng 50 bitcoin. Như vậy là # cách làm này phải ko.

Avatar
@chungminhtu
thg 5 24, 2018 8:40 SA

Shatoshi chỉ tạo ra khối đó thôi bạn chứ ổng lấy tiền thưởng 50 BitCoin làm gì. Chắc bạn nhớ nhầm về việc ông ấy giữ trước 1 tỉ BitCoin. Tại sao ổng giữ được. Hiện nay đó vẫn là một câu hỏi lớn chưa có lời giải, bạn xem thêm ở đây: https://www.reddit.com/r/Bitcoin/comments/7f9o5n/how_did_satoshi_get_his_1_million_btc/ https://whoissatoshi.wordpress.com/tag/1-million-btc/

Và tiếp theo là đâu có giao dịch gì trong Block Genesis để biết được là trả thưởng cho ai đâu. Bạn thiếu một chỗ nữa đó là trong BlockChain hoàn toàn không có định danh và không thể biết ai là ai. Vì địa chỉ đưa vào giao dịch chỉ là một chuỗi ma. TienThuong chỉ có thể chuyển từ ví ảo này qua ví ảo kia chứ k thể chuyển thành tiền mặt (như cách hoạt động của ngân hàng ngoài đời, tiền đô chuyển sang tiền Việt và ngược lại. BItCoin và Etherium là 2 đồng tiền khác nhau không thể nào hack để nạp 1 cái vào mảng Block kia đc, phải có một chợ mua bán trung gian để trao đổi, và lúc này người mua người bán sẽ phải lộ mặt, để làm tin). Còn trong cùng Block thì cứ Block được tạo và theo sau nó có thêm 6 Block, tức chuỗi dài 7 Block là bắt đầu đáng tin, k cần biết chủ sở hữu là ai.

Bài thứ 3 này chưa phải là bài cuối cùng mà bạn hãy đọc hết serries này của mình (gồm 6 bài) thì sẽ hiểu rõ hơn những cái bạn đang thắc mắc nhé.

Avatar
@lequynam93
thg 5 25, 2018 5:45 SA

Cho mình hỏi, nếu chạy code MyCoin.DaoTienAo("DiaChiViTienCuaToi"); liên tục thì t sẽ đào được rất nhiều coin à, chẳng cần biết có ai giao dịch hay không, ở đây là mình đã không tạo sẵn dữ liệu giao dịch Screen Shot 2018-05-25 at 12.40.51.png

Avatar
@chungminhtu
thg 5 25, 2018 6:48 SA

Trong ví dụ ở phần 3 này mình lấy ví dụ đơn giản và chỉ là góc nhìn một chiều của 1 người đào. Nhưng thực tế hoạt động đào tiền ảo là hoạt động MẠNG NGANG HÀNG. Nghĩa là bạn phải luôn luôn kết nối và trao đổi (sync) song song với ít nhất 3 người đào khác, để luân chuyển cái mảng Blockchain.

Bạn đọc phần 4 thì sẽ hiểu đến sự tranh chấp Block trong Blockchain. Không có chuyện một mình bạn tự tung tự tác với cả Blockchain, bạn luôn phải chiến đấu với những người khác để đạt được chuỗi Blockchain dài nhất. Và giao dịch trong đó chỉ có một mình giao dịch của bạn thì liệu những người kia có tin tưởng bạn nữa không? Bạn không nên quên sau mỗi lượt đào bạn phải sync lại toàn bộ BLockchain (kết nối với những người đào khác bằng mạng ngang hàng và so sánh xem dữ liệu đã đào được như thế nào)

Nếu bạn đọc đến phần 5 thì sẽ hiểu là, khả năng bạn nhận được cả 100 phần thưởng kia thì sẽ rất thấp vì bạn đào xong rồi nhưng người khác đào nhanh hơn đã đào trước bạn và được thưởng trước bạn.

Trong thế giới BitCoin thì sau 6 lượt đào mới chính thức nhận đc phần thưởng. Sẽ ra sao nếu bạn hì hục đào ra 6 Block và nhận ra toàn bộ điện năng bỏ ra đều không được tiền thưởng.

Avatar
@tinbeo91
thg 8 17, 2021 8:59 SA

Bạn có hứng thú làm 1 đồng coin không ?? 😃

Avatar
@hugo1180
thg 9 29, 2021 2:14 SA

bạn có thể làm ko? liên lạc lại với mình qua mail nhé. online.inv2019@gmail.com

Avatar
+24
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí