Ở bài viết trước, chúng ta đã biết cách tạo ra một blockchain quản lý tiền ảo đơn giản nhất với chỉ chưa đến 50 dòng code. Blockchain ngắn gọn nhất rất đơn giản và khá dễ làm. Nhưng đơn giản không có nghĩa là không có thiếu sót. Vì thế, ở bài viết này chúng ta sẽ học cách tạo ra một blockchain có quy mô “kha khá” để thực sự là một sàn giao dịch tiền ảo.
Đầu tiên, SnakeCoin đơn giản chỉ chạy trên một máy duy nhất, vì thế nó còn lâu mới được phân phối. Thứ hai, các block có thể được thêm vào chuỗi nhanh như khi máy chủ có thể tạo ra một đối tượng Python và đưa nó vào danh sách.
Trong trường hợp một blockchain đơn giản, điều này không phải vấn đề, nhưng chúng ta sẽ biến SnakeCoin thành một sàn giao dịch tiền ảo thực sự, vì thế chúng ta cần kiểm soát số lượng block (và coin) có thể tạo ra ở một thời điểm.
Từ giờ, dữ liệu của SnakeCoin sẽ là các giao dịch, vì thế mỗi trường dữ liệu của block sẽ là một danh sách gồm các giao dịch. Chúng ta sẽ định nghĩa một giao dịch như sau. Mỗi giao dịch sẽ là một đối tượng JSON bao gồm chi tiết về người gửi coin, người nhận coin và tổng số SnakeCoin được chuyển. Lưu ý: các giao dịch ở định dạng JSON.
Giờ đây chúng ta biết các giao dịch sẽ như thế nào, chúng ta cần một cách để đưa chúng vào một trong các máy tính trong mạng lưới blockchain, gọi là một nốt (node). Để làm điều đó, chúng ta sẽ tạo ra một máy chủ HTTP đơn giản, vì vậy người dùng có thể để các node biết khi nào có giao dịch mới. Một node sẽ có thể chấp nhận một lệnh POST với một giao dịch (như trên) như một request body. Đó là lý do tại sao các giao dịch được đặt ở định dạng JSON; chúng ta cần chúng chuyển vào máy chủ trong một request body.
Giờ chúng ta đã có cách để ghi lại lịch sử của người dùng khi họ gửi SnakeCoins cho người khác. Đó là lý do tại sao mọi người nói blockchains giống như một cuốn sổ cái kỹ thuật số công cộng: mọi giao dịch đều được lưu để tất cả mọi người đều có thể thấy và chúng được lưu trên mỗi node trong mạng lưới.
Nhưng có một câu hỏi đặt ra: Mọi người lấy SnakeCoins từ đâu? Không đâu cả. Không có một thứ như là SnakeCoin, vì chưa một coin nào được tạo ra và phát hành. Để tạo ra các coin mới, mọi người phải “đào” các block SnakeCoin mới. Khi họ đào được block mới, một SnakeCoin mới được tạo ra và thưởng cho người đào được. Coin sau đó sẽ lưu hành khi người đào gửi SnakeCoin cho người khác.
Chúng ta không muốn việc đào các block SnakeCoin quá dễ, vì như thế sẽ tạo ra quá nhiều SnakeCoin và chúng sẽ có ít giá trị. Ngược lại, chúng ta cũng không muốn việc đào SnakeCoin quá khó, vì sẽ không có đủ coin cho mọi người chi tiêu, và chúng sẽ trở nên quá đắt đỏ. Để kiểm soát việc đào SnakeCoin, chúng ta sẽ thực hiện thuật toán Proof-of-Work (PoW). Một thuật toán PoW rất cần thiết để tạo ra một mục khó tạo ra nhưng dễ xác minh.
Trong SnakeCoin, chúng ta sẽ tạo ra một thuật toán PoW đơn giản. Để tạo ra một block mới, máy tính của người đào sẽ phải thêm một số. Khi số đó chia hết cho 9 (số lượng chữ cái trong “SnakeCoin”) và số proof là block cuối cùng, một block SnakeCoin sẽ được đào và người đào sẽ có một SnakeCoin mới.
Giờ đây, chúng ta có thể kiểm soát số lượng block đào được trong một thời gian nhất định, và chúng ta có thể phát hành coin mới cho mọi người trong mạng lưới để gửi cho nhau. Nhưng như đã nói, chúng ta chỉ làm điều này trên một máy tính. Nếu blockchain được phân quyền, làm sao chúng ta đảm bảo cùng chuỗi trên mỗi node? Để làm vậy, chúng ta làm cho mỗi node phát ra phiên bản chuỗi cho những node khác và cho phép chúng nhận các chuỗi của các node khác. Sau đó, mỗi node phải xác minh chuỗi của các node khác để mỗi node trong mạng có thể đi đến một sự đồng thuận về kết quả blockchain sẽ như thế nào. Đây được gọi là thuật toán đồng thuận.
Thuật toán đồng thuận của chúng ta sẽ khá đơn giản: nếu một chuỗi của node khác với các chuỗi của node khác (ví dụ có một xung đột), chuỗi dài nhất trong mạng lưới sẽ còn lại và tất cả chuỗi ngắn hơn sẽ bị xóa. Nếu không có xung đột giữa các chuỗi trong mạng lưới, chúng ta tiếp tục.
Chúng ta vừa hoàn thành. Sau khi chạy toàn bộ mã máy chủ SnakeCoin, hãy chạy các lệnh sau trong thiết bị đầu cuối của bạn. Giả sử bạn đã cài đặt cURL.
1. Tạo ra một giao dịch.
curl “localhost:5000/txion”
-H “Content-Type: application/json”
-d ‘{“from”: “akjflw”, “to”:”fjlakdj”, “amount”: 3}’
2. Đào một block mới
curl localhost:5000/mine
2. Kiểm tra kết quả. Từ cửa sổ client, chúng ta thấy:
Sau khi đào, chúng ta nhận được một số thông tin thú vị trên block mới của chúng ta.
{
“index”: 2,
“data”: {
“transactions”: [
{
“to”: “fjlakdj”,
“amount”: 3,
“from”: “akjflw”
},
{
“to”: “q3nf394hjg-random-miner-address-34nf3i4nflkn3oi”,
“amount”: 1,
“from”: “network”
}
],
“proof-of-work”: 36
},
“hash”: “151edd3ef6af2e7eb8272245cb8ea91b4ecfc3e60af22d8518ef0bba8b4a6b18”,
“timestamp”: “2017-07-23 11:23:10.140996”
}
Và như vậy, chúng ta đã tạo ra một blockchain quy mô “kha khá”. Giờ đây, SnakeCoin có thể đưa lên trên nhiều máy để tạo thành mạng lưới, và SnakeCoin thật có thể được đào.
Nguồn: VnReview