
Đồng tiền, số dư và tài khoản: vì sao «tôi có bao nhiêu» có ba câu trả lời khác nhau
Hãy mở một chiếc ví hỗ trợ nhiều chuỗi, và nếu nhìn kỹ bạn sẽ thấy một điều lạ. Số dư Bitcoin và số dư Ethereum đều chỉ là những con số trên màn hình, nhưng bên dưới chúng được tính theo những cách hoàn toàn khác nhau — còn trên Solana lại có thêm một sắp đặt thứ ba.
Đây không phải chuyện vặt. Nó giải thích vì sao phí Bitcoin phụ thuộc vào lịch sử giao dịch của bạn, vì sao một giao dịch Ethereum có thể thất bại mà vẫn khiến bạn mất tiền, và vì sao một tài khoản Solana không thể cứ thế bị vét về không.
Mô hình UTXO: bạn sở hữu những đồng tiền, không phải một số dư
Bitcoin không có tài khoản và chẳng lưu số dư nào. Thứ nó lưu là một tập hợp các đầu ra giao dịch chưa tiêu — UTXO — mỗi cái là một mẩu giá trị rời rạc bị khóa bởi một điều kiện chi tiêu nào đó.
Hãy nghĩ tới tiền mặt. Bạn không có «470 nghìn» trong túi; bạn có một tờ 200, hai tờ 100, một tờ 50 và hai tờ 10. Để trả 230 nghìn, bạn đưa tờ 200 và một tờ 50, rồi nhận lại 20. Bạn không thể xé đôi một tờ tiền.
UTXO vận hành đúng như vậy. Mỗi cái phải được tiêu trọn vẹn. Để trả 0,3 BTC từ một đầu ra 1 BTC, ví của bạn tiêu hết cả 1 BTC ấy và tạo ra hai đầu ra mới: 0,3 cho người nhận và chừng 0,7 quay lại chỗ bạn dưới dạng tiền thừa. UTXO 1 BTC không còn tồn tại nữa.
Vậy nên «số dư» của bạn là một con số dẫn xuất — ví của bạn rà khắp chuỗi tìm những đầu ra bị khóa bằng điều kiện mà bạn thỏa mãn được, rồi cộng lại. Chẳng nơi nào trên chuỗi khối Bitcoin có một bản ghi nói rằng bạn có một khoản cụ thể nào.
Ba hệ quả theo sau, và cả ba đều thiết thực:
Phí phụ thuộc vào lịch sử của bạn, không chỉ vào số tiền. Phí tính theo byte, và mỗi đầu vào bạn tiêu lại thêm byte. Trả 500 nghìn từ một UTXO lớn thì rẻ; trả đúng 500 nghìn ấy bằng cách gộp ba mươi UTXO tí hon thì đắt, bởi giao dịch lớn hơn về mặt vật lý. Đó là lý do gộp UTXO khi phí thấp là việc đáng làm.
Tiền thừa là một đầu ra thật, phải đi đâu đó. Ví nào cũng lo việc này tự động, nhưng đó chính là cơ chế đứng sau các phép suy đoán về địa chỉ tiền thừa mà giới phân tích chuỗi dùng để nối các địa chỉ của bạn lại với nhau.
Việc chi tiêu vốn dĩ song song. Các UTXO khác nhau thì độc lập, nên chẳng gì ép các giao dịch của bạn vào một trật tự nghiêm ngặt.
Bitcoin, Litecoin, Dogecoin, Bitcoin Cash, Zcash, Ravencoin và Flux đều vận hành theo lối này. Đó là mô hình cũ hơn, và là mô hình mà câu «không phải khóa của bạn thì không phải tiền của bạn» đúng theo nghĩa đen nhất: chẳng có tài khoản nào, chỉ có những đồng tiền kèm điều kiện.
Mô hình tài khoản: bạn sở hữu một số dư, và một bộ đếm
Ethereum vứt bỏ tất cả những thứ đó và dùng một thứ gần với sổ cái ngân hàng hơn. Chuỗi lưu một trạng thái: một ánh xạ khổng lồ từ địa chỉ sang số dư (và với hợp đồng thì sang dữ liệu được lưu). Gửi 0,3 ETH là trừ 0,3 khỏi một con số và cộng vào một con số khác. Không đầu vào, không đầu ra, không tiền thừa.
Cách ấy đơn giản hơn, và chính nó làm cho hợp đồng thông minh trở nên khả thi — một hợp đồng cần bộ nhớ bền vững để đọc và ghi, điều rất vụng về khi thế giới được làm bằng những đồng tiền rời rạc.
Nhưng mô hình tài khoản mang tới một vấn đề mà UTXO không có. Nếu một giao dịch chỉ là «trừ 0,3 của An», thì bất kỳ ai nhìn thấy nó cũng có thể phát lại nhiều lần và vét sạch tài khoản. Cách chữa là nonce: một bộ đếm riêng cho từng tài khoản, đi kèm trong mọi giao dịch, và phải tăng đúng một đơn vị. Giao dịch số 7 chỉ có thể được đào sau số 6, và chỉ một lần.
Nonce chính là lý do các chuỗi EVM hành xử như chúng vẫn hành xử:
Các giao dịch của bạn được xếp thứ tự nghiêm ngặt. Một giao dịch bị kẹt sẽ chặn mọi giao dịch sau đó từ cùng địa chỉ, bởi chúng không thể được xử lý lệch thứ tự.
Phí vẫn bị trả ngay cả khi giao dịch thất bại. Gas trả cho phần tính toán đã thử, không phải phần tính toán thành công. Một lệnh gọi hợp đồng bị hoàn tác vẫn tiêu tốn công sức của các trình xác thực, nên vẫn tốn tiền. Điều này khiến người ta bất ngờ suốt, và là khác biệt thật sự so với thế giới UTXO, nơi một giao dịch không hợp lệ đơn giản là không bao giờ được xác nhận và chẳng tốn gì.
Quản lý nonce là hạ tầng thực sự. Với một chiếc ví thường thì nó vô hình. Với một ví đa chữ ký, nơi hai thiết bị phải thống nhất trước khi phát đi, nonce phải được giữ chỗ, theo dõi và giải phóng — đó là lý do việc xử lý nonce là chủ đề lặp đi lặp lại trong việc ký bằng hai thiết bị, chứ không phải một chi tiết cài đặt.
Ethereum, Polygon, BSC, Avalanche, Base và XDC đều dùng mô hình này.
Solana: những tài khoản phải trả tiền thuê chỗ
Solana cũng dựa trên tài khoản, nhưng có một khúc quanh khiến người ta trở tay không kịp.
Trên Solana, gần như mọi thứ đều là một tài khoản — ví của bạn, mỗi mã thông báo bạn giữ, dữ liệu của mỗi chương trình. Và vì những tài khoản ấy chiếm bộ nhớ của trình xác thực, chúng phải giữ một số dư tối thiểu để còn sống. Đó là miễn tiền thuê: nạp đủ thì tài khoản tồn tại vô thời hạn; tụt xuống dưới thì nó có thể bị thu hồi.
Hệ quả thực tế là việc giữ một mã thông báo SPL đòi hỏi một tài khoản mã thông báo riêng, được nạp một chút SOL, trước khi bất kỳ ai có thể gửi mã thông báo ấy cho bạn. Nhận không hề miễn phí. Đây là điều bất thường và đáng hiểu trước khi bạn cần đến, bởi câu «tôi gửi mã thông báo rồi mà chẳng thấy gì tới» thường chỉ là thiếu một tài khoản mã thông báo.
Vì sao một chiếc ví đa chuỗi phải mô hình hóa cả ba
Một chiếc ví hỗ trợ các chuỗi này không thể dùng chung một khái niệm nội bộ duy nhất về «số dư». Nó cần:
- Với chuỗi UTXO: một tập đầu ra, mỗi cái có số tiền và một kịch bản, cộng thêm phần logic chọn đồng tiền quyết định nên tiêu cái nào.
- Với chuỗi EVM: một con số số dư duy nhất cộng một nonce, và một hàng đợi tôn trọng thứ tự.
- Với Solana: một số dư, một tập tài khoản mã thông báo liên kết, và ý thức về các mức tối thiểu của tiền thuê.
Kiến trúc an toàn cũng phải thích ứng theo. Trên các chuỗi UTXO, cơ chế hai trên hai của SSP là một kịch bản: một đầu ra P2WSH đòi hai chữ ký để mở khóa, do chính luật kịch bản của chuỗi cưỡng chế. Trên các chuỗi EVM không có hệ thống kịch bản tương đương cho tài khoản thường, nên đa chữ ký được hiện thực qua trừu tượng hóa tài khoản — một tài khoản hợp đồng thông minh mà logic xác thực của nó đòi cả hai chữ ký. Trên Solana thì đó là một địa chỉ dẫn xuất từ chương trình, do một chương trình trên chuỗi kiểm soát.
Ba cơ chế hoàn toàn khác nhau, một ý tưởng duy nhất hướng tới người dùng: không gì dịch chuyển nếu thiếu cả hai thiết bị. Việc các cách hiện thực bên dưới chẳng giống nhau chút nào chính là lý do lời bảo đảm ấy phải được thiết lập lại, và kiểm toán lại, trên từng chuỗi thay vì mặc nhiên coi là thừa hưởng.
Điều này nghĩa là gì với bạn
Khi phí Bitcoin có vẻ cao cho một khoản nhỏ, hãy nhìn vào các đầu vào của bạn. Số tiền không quan trọng bằng việc nó được ghép từ bao nhiêu mảnh.
Khi một giao dịch Ethereum bị kẹt, những giao dịch sau từ cùng địa chỉ sẽ kẹt phía sau nó. Đó là nonce, không phải lỗi. Gỡ được cái đầu tiên là hàng đợi thông.
Khi một giao dịch EVM thất bại mà vẫn tính tiền bạn, ấy là mô hình đang chạy đúng thiết kế. Việc mô phỏng giúp tránh điều đó — cũng vì thế mà mô phỏng trước khi ký có giá trị hơn trên các chuỗi dựa trên tài khoản so với các chuỗi UTXO.
Khi một lệnh chuyển mã thông báo Solana «biến mất», hãy tìm một tài khoản mã thông báo. Chẳng có gì mất cả; có thể đích đến chưa từng tồn tại.
Không điều nào trong số này là tật riêng của một chiếc ví cụ thể. Chúng là hệ quả của một quyết định thiết kế mà mỗi chuỗi đã đưa ra từ nhiều năm trước, và một khi bạn nhận ra mình đang ở mô hình nào, rất nhiều hành vi vốn khó hiểu bỗng trở nên đoán được.


