Bitcoin – đồng tiền tự do (P.1)

Bitcoin là một đồng tiền hết sức thú vị. Nó không hề bị kiểm soát bởi chính phủ hay bất cứ tổ chức, ngân hàng nào. Bitcoin hoàn toàn tự do và được bảo trợ bởi toán học. Những vụ lùm xùm gần đây là do các nhà sàn (3rd party exchanges) dở, chứ không phải do bản thân Bitcoin dở. Thực tế thì Bitcoin không khuyến khích mô hình nhà sàn, mỗi một người dùng Bitcoin cần phải trang bị những kiến thức cần thiết để không phải phụ thuộc vào nhà nào cả. Tôi yêu TỰ DO.

Hệ thống Bitcoin không gì khác là xoay quanh (rất nhiều) các transactions (giao dịch). Hiện tại có khoảng 71 triệu transactions đã được tạo ra kể từ lúc cha sinh mẹ đẻ. Database dùng để chứa những transactions này không nằm trên riêng một máy nào, mà được công khai và sao lưu trên nhiều máy tính của mạng Bitcoin (vào thời điểm này database ấy có dung lượng hơn 20GB). Một transaction có nội dung cơ bản như sau:

Bạn An gửi 5 đồng cho bạn Bình

Khi An muốn gửi 5 đồng cho Bình, An chỉ cần dùng phần mềm Bitcoin (Bitcoin Wallet) để tạo mới một transaction có nội dung như trên, rồi gửi đi cho cả thế giới biết. Có vài vấn đề cần giải quyết:

  • Hiện tại An có sở hữu đủ 5 đồng không? Nói cách khác là 5 đồng cho transaction này An lấy đâu ra?
  • Nếu ai cũng có thể tạo được transaction y hệt như trên thì An có mà vỡ mồm. Do đó, người tạo ra transaction cần đưa ra bằng chứng để chứng minh mình là chủ sở hữu của 5 đồng đó.
  • Chuyện gì xảy ra nếu An cố tình dùng lại 5 đồng đó để gửi cho bạn Chi? Chiêu gian lận này gọi là double-spending.

Với mô hình tập trung như ngân hàng, những vấn đề trên không thành vấn đề. Nhưng với mô hình phân tán và tự do như Bitcoin, đây thực sự là những vấn đề to đùng. Để hiểu rõ giải pháp của Bitcoin, trước hết ta sẽ tìm hiểu sơ sơ về các hàm băm mật mã (cryptographic hash function), thuật mã hóa bất đối xứng (asymmetric cryptography hay còn gọi là public-key cryptography), và chữ ký điện tử (digital signature).

Cryptographic hash function

Image from wikipedia
Image from wikipedia

Những hàm này sẽ chuyển đổi bất cứ một input tùy ý, thành một số tự nhiên có độ dài bit cố định. Ví dụ SHA-1 luôn cho ra những số có độ dài bit là 160 bit bất chấp input, với SHA-256 thì độ dài này là 256 bit. Những số tự nhiên như thế gọi là hash value (hoặc digest) và thường được biểu diễn dưới dạng hexa cho gọn (như trong hình trên). Khác với những hash function bình thường, cryptographic hash function có 3 tính chất quan trọng sau đây:

  1. Một chiều: từ input cho ra hash value thì được, nhưng chiều ngược lại thì gần như không thể.
  2. Không đoán được xu hướng: chỉ cần một thay đổi nhỏ xíu ở input sẽ cho ra một hash value hoàn toàn khác biệt.
  3. Không đụng độ: hai input khác nhau sẽ cho ra hai hash value khác nhau, tức là hầu như không tồn tại hai input khác nhau mà cùng cho ra một hash value.

Asymmetric cryptography

Phương pháp mã hóa này được mô tả như hình dưới đây:

Image from wikipedia
Image from wikipedia

Bất kỳ ai có public key của Alice đều có thể dùng public key đó để mã hóa một message, và an tâm gửi đi tới cho Alice, vì chỉ có Alice, với private key của cô ấy mới có thể giải mã message đó. Alice luôn luôn phải giữ private key của mình thật bí mật, còn public key thì có thể công bố thoải mái. Dễ thấy quan hệ giữa private key và public key là một chiều, từ public key không thể suy ra private key.

Digital signature

Đây là một ứng dụng rất quan trọng và hữu ích của cryptographic hash function và asymmetric cryptography.

Image from Wikipedia
Image from Wikipedia

Bạn An có một tài liệu và muốn ký lên đó một chữ ký để chứng tỏ là mình đồng ý với tài liệu. An sẽ dùng private key của mình để tạo ra chữ ký. Chữ ký này là duy nhất; nghĩa là, nếu An ký lên một tài liệu khác; hoặc Bình ký lên chính tài liệu đó; thì chữ ký được sinh ra cũng sẽ khác nhau. Sau khi tạo xong chữ ký, An sẽ công bố tài liệu kèm theo chữ ký. Người khác nhận được sẽ có cách kiểm tra chữ ký đó có phải là chữ ký của An dùng cho tài liệu này hay không. Cái hay ở đây chính là, việc kiểm tra này chỉ cần dùng public key của An, chứ không cần private key.

Nhờ tính chất đặc biệt của cryptographic hash function và asymmetric cryptography, không ai có thể giả mạo chữ ký của An, vì chỉ có An với private key của mình mới có thể tạo ra chữ ký như vậy. Nếu ai đó cố tình dùng private key của họ (khác với của An) thì tất nhiên chữ ký tạo ra sẽ khác. An cũng không thể chối bỏ mình là người đã ký, vì không ai khác ngoài An có thể tạo ra chữ ký ấy. Nói tóm lại, nếu An cung cấp được 3 thứ: tài liệu + chữ ký + public key, thì mọi người đều tin rằng tài liệu đó đã được ký bởi người có public key đó (ở đây là An).

Trở lại Bitcoin transactions

Transaction Tx_ABC: “Bạn An gửi 5 đồng cho bạn Bình” (Tx_ABC là ID của transaction, nó chính là hash value của transaction)

Digital signature được Bitcoin áp dụng để cho An có thể chứng minh rằng bạn ấy đang sở hữu 5 đồng đó:

  • tài liệu = “An” + “5 đồng đó” + “Bình” (*)
  • chữ ký = chữ ký được tạo ra bởi private key của An đối với tài liệu trên
  • public key = “An” (đã có sẵn trong tài liệu trên)

“An”, “Bình” chỉ là public key ví dụ của An, Bình. Trên thực tế, public key là những chuỗi ký tự giun rắn, và có vậy thôi. Public key không tiết lộ thêm bất cứ thông tin gì về An, Bình. Một người có thể sở hữu nhiều public key tùy thích. Bạn có thể coi public key là address của mỗi người dùng Bitcoin.

OK chưa? Chưa, còn một điều vô cùng quan trọng: thế nào gọi là “5 đồng đó”? Phải có cái gì làm ID đặc trưng cho “5 đồng đó”. Và đó chính là 5 đồng mà mẹ của An đã gửi cho An từ tuần trước, trong một transaction khác, cũ hơn, và hợp lệ:

Transaction Tx_XYZ: “Cô Thảo gửi 5 đồng cho bạn An”

Vậy là tài liệu (*) sẽ được viết lại gọn hơn là: Tx_XYZ + “Bình”

Trong trường hợp mẹ An chỉ gửi cho An có 2 đồng, thì An sẽ phải gom một vài transactions khác nữa để gộp lại đủ hoặc hơn 5 đồng. Nếu gộp hơn 5 đồng, An nên chỉ định số tiền gửi về lại cho chính An (tiến thối). Tổng quát, một transaction có nhiều input và output:

  • Mỗi output cho biết public key của người nhận tiền cùng số tiền sẽ nhận. ID của mỗi output là ID của transaction kèm theo thứ tự của output đó, ví dụ transaction Tx_ABC có 3 output thì ID của chúng là: Tx_ABC#0, Tx_ABC#1, Tx_ABC#2.
  • Mỗi input là một tham chiếu trỏ tới một output thuộc transaction khác (cũ hơn), thông qua ID của những output cũ ấy.
  • Hiển nhiên, tổng số tiền của input phải lớn hơn hoặc bằng tổng số tiền của output. Nếu lớn hơn, phần dư được gọi là transaction fee và người đào Bitcoin sẽ hưởng. Chúng ta sẽ nói về công việc đào Bitcoin trong phần sau.
  • Nếu một output đã được trỏ bởi một input nào đó, thì output đó gọi là spent output (đã tiêu xài) và không thể được trỏ bởi một input nào khác nữa. Nếu chuyện ấy xảy ra (double-spending) thì chỉ có một transaction được xét là hợp lệ (việc xét hợp lệ cụ thể như thế nào chúng ta sẽ bàn sau). Có thể nói, việc gán được ID cho các đồng tiền (thông qua output ID) là một yếu tố quan trọng đã giúp Bitcoin giải quyết được vấn đề double-spending.

Bây giờ, tài liệu (*) có thể được viết lại tổng quát hơn như sau:

Tx_XYZ#0 + Tx_PQR#4 + (Bình: 5 đồng) + (An: 1 đồng)

Public key của người nhận tiền trong các output Tx_XYZ#0 và Tx_PQR#4 có thể khác nhau (ví dụ, nếu An có nhiều tài khoản / public key). Do đó, nếu An đang trỏ tới hai output như thế này, An cần phải cung cấp hai chữ ký để chứng minh sự sở hữu lần lượt cho hai output đó. Tài liệu + (nhiều) chữ ký = transaction hợp lệ + an toàn. Không ai có thể sửa transaction này, vì chúng đã được ký. Nói vui, tiền thì cứ tơ hơ trên mạng đấy, nhưng đâu phải ai cũng tùy tiện lấy và chuyển về tài khoản của mình được; mọi transaction với chữ ký vớ vẩn sẽ bị cộng đồng coi là không hợp lệ và bỏ qua.

Chúng ta có thể thấy, một transaction mới được tạo ra dựa trên những transaction cũ. Đồng tiền không tự sinh ra, nó chỉ chuyển từ người này sang người khác; thậm chí còn mất đi dưới dạng transaction fee. Vậy thì đồng tiền mới sẽ sinh ra từ đâu, fee sẽ chuyển đi đâu? Câu trả lời đó chính là những transaction thuộc loại đặc biệt, gọi là coinbase transaction. Chúng không có input, chỉ có output. Những output này có public key của miner (người đào), số tiền bao gồm:

  • tổng fee của một danh sách hữu hạn các transaction bình thường (gọi là một block, khái niệm block sẽ rõ ràng hơn ở phần sau), và
  • 25 đồng bitcoin hoàn toàn mới (con số này sẽ bị giảm một nửa sau mỗi 4 năm, vào năm 2017 nó sẽ là 12.5)

Thơm! Vậy là bạn cứ thoải mái tạo coinbase transaction (vì chúng không có input mà, đâu cần ký đấm gì đâu) và tiền sẽ chảy vào túi bạn như nước??? Đâu có dễ như vậy, để tạo ra một coinbase transaction hợp lệ và được công nhận bởi cộng đồng, bạn phải làm một công việc khá chua chát: đào bitcoin.

Từ “đào” để gọi cho tượng hình, thực chất, nó là công việc giải một bài toán vô cùng vất vả, chỉ có máy tính mới giải được, mà cách giải thì không gì khác ngoài thử, thử, thử … cho đến khi tìm ra đáp số đúng, ai nhanh thì được. Tìm ra đáp số thì khó nhưng kiểm chứng đáp số lại rất dễ; do đó cộng đồng có thể phát hiện ngay những coinbase transaction không hợp lệ. Sự khó nhọc khi giải bài toán trên không chỉ đơn thuần để hạn chế lượng bitcoin mới, mà còn để chống gian lận.

Vậy bài toán đó là gì? Tại sao nó có thể giúp chống gian lận? (còn tiếp)

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s