Umbra là một giao thức thanh toán ẩn danh trên các mạng lưới blockchain tương thích với EVM. Giao thức này cho phép thực hiện các giao dịch bảo đảm quyền riêng tư, trong đó danh tính của người nhận chỉ được biết đến bởi người gửi và chính người nhận.

Mục lục
Tìm hiểu về Umbra Protocol
Tổng quan về Umbra Protocol
Umbra là một giao thức địa chỉ ẩn danh (stealth address) dành cho các mạng lưới EVM. Điều này có nghĩa là nó cho phép người thanh toán gửi tiền đến một địa chỉ hoàn toàn mới. Địa chỉ đó do người nhận dự kiến kiểm soát, nhưng chỉ người thanh toán và người nhận mới biết điều này. Để hiểu chi tiết hơn về giao thức này, hãy đọc kỹ phần: Frequently Asked Questions
Umbra Protocol là giao thức mã nguồn mở, được triển khai chính thức trên trang: app.umbra.cash. Thông tin về mã nguồn dự án như sau:
- Contracts: contracts-core
- Periphery contracts: contracts-periphery
- Frontend: frontend và được triển khai trên app.umbra.cash
- TypeScript library: umbra-js
Dự án này cũng được theo dõi trên L2Beat và một số mạng mainnet gồm Ethereum, Optimism, Polygon, Base, Arbitrum One. Không có bản chạy cho testnet, ngay cả Sepolia.
Hiểu Umbra Protocol thông qua ví dụ thực tế
Giả sử Alice là chủ doanh nghiệp và thuê Bob làm nhà thầu phụ. Cô đồng ý trả cho Bob 1.000 Dai mỗi tuần cho công việc của anh. Bob sở hữu địa chỉ ENS là bob.eth. Nếu Alice gửi tiền hàng tuần đến bob.eth, bất kỳ ai quan sát chuỗi khối đều có thể dễ dàng nhận thấy rằng Alice đang trả cho Bob 1.000 Dai mỗi tuần.
Thay vào đó, Bob và Alice sẽ sử dụng Umbra để thực hiện các khoản thanh toán riêng tư. Lần đầu tiên truy cập ứng dụng Umbra, Bob thiết lập tài khoản của mình, cho phép bất kỳ ai cũng có thể thanh toán riêng tư cho anh qua Umbra bằng tên bob.eth hoặc địa chỉ Ethereum thông thường của anh. Sau đó, Alice sử dụng Umbra để gửi 1.000 Dai cho Bob hàng tuần—cô chỉ cần biết tên ENS của anh.
Trên chuỗi khối, ta thấy Alice chuyển 1.000 Dai đến một địa chỉ mới chưa từng có giao dịch (địa chỉ trống) mỗi tuần. Thực tế phía sau là Bob nắm giữ khóa (keys) của các địa chỉ này thông qua Umbra, nhưng không ai ngoài Alice và Bob biết điều đó.
Bob sử dụng Umbra để rút khoản tiền 1.000 Dai của mình hàng tuần. Anh chỉ cần cung cấp một địa chỉ đích để nhận tiền. Tốt nhất là anh nên sử dụng một địa chỉ không liên kết với danh tính thực của mình. Anh thường chọn gửi thẳng số tiền đó đến một sàn giao dịch, nơi anh có thể bán nó lấy tiền pháp định (fiat) khi cần thiết. Điều quan trọng cần lưu ý là sàn giao dịch của Bob lúc này sẽ biết khoản thanh toán đó thuộc về anh. Tuy nhiên, đối với người quan sát chuỗi khối thông thường—những người không có quyền truy cập vào dữ liệu nội bộ của sàn giao dịch tập trung—thì việc khoản thanh toán của Alice được gửi cho Bob sẽ được giữ kín.
Hãy xem xét một ví dụ khác:
Liza điều hành một trang web kêu gọi quyên góp. Nếu mọi người quyên góp bằng cách gửi tiền trực tiếp cho cô, ai cũng sẽ biết tổng số tiền quyên góp mà Liza nhận được. Ngược lại, nếu các khoản quyên góp được thực hiện qua Umbra, mỗi khoản tiền sẽ được gửi đến một địa chỉ khác nhau, và chỉ mình Liza mới biết tổng số tiền quyên góp mà cô nhận được.
Umbra có phải là một công cụ trộn tiền (mixer) không?
Umbra không phải là công cụ trộn tiền và cũng không sử dụng bằng chứng không tiết lộ thông tin (zero-knowledge proofs). Thay vào đó, Umbra dựa trên kỹ thuật mật mã đường cong elliptic thông thường.
Giao thức này được thiết kế cho các khoản thanh toán giữa hai bên và đi kèm với những đặc điểm riêng về sự đánh đổi giữa tính riêng tư và các yếu tố khác. Thay vì cắt đứt mối liên kết giữa địa chỉ gửi và địa chỉ nhận như các công cụ trộn tiền, Umbra khiến mối liên kết đó trở nên vô nghĩa. Mọi người đều có thể thấy ai đã gửi tiền và địa chỉ nhận tiền là gì, nhưng địa chỉ nhận đó chưa từng xuất hiện trên chuỗi, do đó người quan sát bên ngoài không thể biết ai là người kiểm soát nó.
Cơ chế hoạt động của Umbra Protocol
Cơ chế hoạt động của Umbra Protocol như sau:
- Khi thiết lập tài khoản Umbra, người dùng sẽ ký một thông điệp. Giá trị băm (hash) của thông điệp này được dùng để tạo ra hai khóa riêng tư (private key): “khóa chi tiêu” (spending key) và “khóa xem” (viewing key).
- Các khóa công khai (public key) tương ứng sẽ được công bố trên chuỗi (on-chain) dưới dạng các bản ghi gắn liền với địa chỉ của bạn.
- Người gửi sử dụng địa chỉ, tên ENS hoặc tên CNS của bạn để tra cứu hai khóa công khai này. Đồng thời, người gửi tạo ra một số ngẫu nhiên.
- Số ngẫu nhiên này được kết hợp với khóa công khai chi tiêu để tạo ra một “địa chỉ ẩn danh” (stealth address) nhằm chuyển tiền đến đó. Khóa công khai xem được dùng để mã hóa số ngẫu nhiên này.
- Thông qua hợp đồng thông minh Umbra, người gửi chuyển tiền đến địa chỉ ẩn danh; đồng thời, địa chỉ ẩn danh và số ngẫu nhiên đã mã hóa sẽ được phát đi dưới dạng một sự kiện: Announcement event.
- Người nhận sẽ quét tất cả các “Announcement event” từ hợp đồng Umbra. Với mỗi sự kiện, họ sử dụng khóa riêng tư xem của mình để giải mã số ngẫu nhiên, sau đó nhân số này với khóa riêng tư chi tiêu của mình để tạo ra khóa riêng tư cho địa chỉ ẩn danh. Nếu khóa riêng tư ẩn danh này kiểm soát địa chỉ ẩn danh đã được phát trong “Announcement event“, thì khoản thanh toán đó chính là dành cho người nhận.
- Giờ đây, người nhận có thể sử dụng khóa riêng tư chi tiêu để trực tiếp thực hiện giao dịch rút tiền sang một địa chỉ khác, hoặc ký một giao dịch meta (meta-transaction) để yêu cầu rút tiền được xử lý bởi một bên chuyển tiếp (relayer).
Tổng quan về địa chỉ ẩn danh
Chúng ta hãy bắt đầu với cách thức hoạt động của giao thức Umbra (và nói chung hơn, cách thức hoạt động của địa chỉ ẩn danh):
Người nhận có khóa công khai P và khóa riêng tư p . Người gửi tạo ra một số ngẫu nhiên r , và tính toán khóa công khai ẩn P_stealth = P * r bằng phép nhân đường cong elliptic. Người gửi suy ra địa chỉ Ethereum a_stealth từ khóa công khai đó, và gửi tiền đến địa chỉ này. Nhờ vào sự kỳ diệu của toán học đường cong elliptic, người nhận có thể tạo ra khóa riêng tư p_stealth cần thiết để truy cập vào tiền tại a_stealth bằng cách tính p_stealth = p * r .
Vấn đề đầu tiên cần giải quyết là làm thế nào người gửi có thể chuyển giá trị r cho người nhận? Nếu r được công khai, người quan sát có thể xác định người nhận tiền bằng cách tính P * r với nhiều giá trị P đã công bố khác nhau cho đến khi tìm ra địa chỉ ẩn danh. Vì vậy, r cần được mã hóa.
Mã hóa được thực hiện bằng Đường cong elip Diffie-Hellman(ECDH), nghĩa là người gửi sử dụng khóa công khai của người nhận để mã hóa số ngẫu nhiên. Số ngẫu nhiên đã mã hóa cho ta bản mã c . Số ngẫu nhiên đã mã hóa c và địa chỉ ẩn a_stealth được phát ra dưới dạng sự kiện “Announcement event” từ hợp đồng Umbra. ECDH yêu cầu người gửi tạo ra một khóa riêng tạm thời để mã hóa, vì vậy khóa công khai tạm thời P_ephemeral mà người nhận cần để giải mã cũng được phát ra trong sự kiện này.
Giờ đây, người nhận có thể xem qua tất cả các sự kiện “Announcement event” và tìm thấy số tiền của họ như sau:
- Sử dụng khóa riêng p của họ với P_ephemeral , họ có thể tính toán bí mật chung ECDH và giải mã số ngẫu nhiên. Kết quả giải mã luôn luôn là một giá trị nào đó , nhưng chúng ta chưa biết liệu nó có giải mã ra đúng số hay không.
- Vì vậy, người nhận nhân số ngẫu nhiên đã giải mã với p để được p_stealth , và tính toán địa chỉ được điều khiển bởi p_stealth.
- Nếu địa chỉ do p_stealth kiểm soát trùng khớp với địa chỉ ẩn a_stealth được bao gồm trong “Announcement event” , người nhận sẽ biết rằng khoản thanh toán đó dành cho họ và có thể rút tiền bằng cách sử dụng p_stealth .
Khóa riêng tư của ứng dụng
Như đã giải thích ở trên, ứng dụng sẽ cần truy cập vào khóa riêng tư của bạn để thực hiện các phép toán cần thiết. Nhưng khi bạn kết nối ví của mình với một ứng dụng, ví sẽ không chia sẻ khóa riêng tư của bạn với ứng dụng đó. Điều này rất tốt, bởi vì nếu vậy, bất kỳ ứng dụng nào bạn sử dụng đều có thể đánh cắp tiền của bạn! Vậy Umbra truy cập khóa của bạn bằng cách nào? Có một vài lựa chọn:
- Yêu cầu người dùng nhập khóa riêng của ví vào một biểu mẫu. Điều này rất tệ cả về mặt bảo mật lẫn trải nghiệm người dùng, vì vậy chúng tôi không làm điều này.
- Tạo một khóa riêng ngẫu nhiên và yêu cầu bạn sao lưu nó. Cách này có hiệu quả, nhưng việc phải sao lưu một khóa bí mật dành riêng cho ứng dụng thì không lý tưởng.
- Yêu cầu người dùng ký vào tin nhắn, băm chữ ký và tạo khóa từ chữ ký đó.
Phương án 3 giải quyết các vấn đề của phương án 1 và 2, và là phương pháp được ứng dụng sử dụng. Các phương pháp tương tự cũng được sử dụng bởi Loopring và zkSync. Họ cũng chính là nguồn cảm hứng cho phương pháp này.
Quét để xác định đúng người nhận
Điều cần cân nhắc cuối cùng liên quan đến việc quét. Vì mỗi thông báo đều cần được quét, nên việc tìm kiếm có thể mất rất nhiều thời gian.
Một cách để tăng tốc quá trình này (từ góc nhìn của người dùng) là ủy thác việc quét cho một dịch vụ bên thứ ba và yêu cầu họ thông báo cho bạn khi bạn nhận được tiền. Nhưng dịch vụ quét cần khóa riêng tư p của bạn để xác định xem bạn đã nhận được tiền hay chưa, và nếu họ có p, họ có thể đánh cắp tiền của bạn!
Chúng ta có thể giải quyết vấn đề này bằng cách tạo ra hai khóa riêng biệt cho từng ứng dụng. Một khóa riêng sẽ là khóa xem, p_view , được sử dụng để mã hóa số ngẫu nhiên. Khóa còn lại sẽ là khóa chi tiêu, p_spend , được sử dụng để tính toán địa chỉ ẩn danh và truy cập vào số tiền đó. Do đó, quy trình gửi và nhận của chúng ta giờ đây được sửa đổi một chút như sau:
- Bên nhận có hai khóa riêng tư, p_spend và p_view , và công bố các khóa công khai tương ứng P_spend và P_view .
- Bên gửi tạo ra một số ngẫu nhiên r và mã hóa nó bằng P_view và một khóa riêng tạm thời p_ephemeral để tạo ra bản mã c.
- Người gửi tính toán địa chỉ ẩn danh là địa chỉ được tạo ra từ P_stealth = P_spend * r và gửi tiền đến địa chỉ đó.
- Hợp đồng Umbra phát ra c , P_ephemeral và địa chỉ ẩn a_stealth.
- Đối với mỗi sự kiện, bên nhận sử dụng p_view và P_ephemeral để giải mã r , sau đó kiểm tra xem p_stealth = p_spend * r có phải là khóa riêng tư điều khiển a_stealth hay không.
Với phương pháp này, người nhận có thể cung cấp cho dịch vụ quét của bên thứ ba các tham số p_view và P_spend . Dịch vụ này sau đó có thể kiểm tra xem người nhận đã nhận được tiền mà không cần có khả năng chi tiêu hay chưa.
Mức độ riêng tư của Umbra như thế nào?
Umbra cung cấp một số đảm bảo nhất định về quyền riêng tư, và điều quan trọng là bạn cần hiểu rõ các đảm bảo này trước khi sử dụng giao thức. Umbra không mang lại sự riêng tư “hoàn toàn” như Aztec hay Zcash. Nó chỉ đơn giản ngăn chặn các bên quan sát bên ngoài (tức là bất kỳ ai không phải là người gửi hoặc người nhận) biết được người nhận thanh toán là ai khi nhìn vào địa chỉ nhận tiền.
Cần lưu ý rằng thói quen sử dụng không cẩn trọng của người nhận—ví dụ: chuyển tiền trực tiếp đến một địa chỉ đã được công khai—sẽ làm giảm lợi ích về quyền riêng tư cho cả người gửi lẫn người nhận.
Các đặc tính riêng tư của Umbra cũng có thể bị suy giảm nếu người quan sát có thể thu hẹp phạm vi các người nhận tiềm năng cho một giao dịch cụ thể. Bất kỳ khóa công khai (public key) hợp lệ nào cũng có thể được dùng làm địa chỉ nhận, và bất kỳ ai từng thực hiện giao dịch trên Ethereum đều có khóa công khai hiển thị công khai. Do đó, theo mặc định, “tập hợp ẩn danh” (anonymity set)—tức tập hợp các người nhận tiềm năng của một giao dịch—bao gồm tất cả những ai từng thực hiện giao dịch trên Ethereum!
Tuy nhiên, trên thực tế, tình huống có thể khác đi và người quan sát có thể thu hẹp danh sách người nhận theo một số cách:
- Hầu hết người dùng sẽ sử dụng tên ENS để chuyển tiền, vì vậy người nhận nhiều khả năng đã công khai các khóa gắn liền với tên ENS đó.
- Việc thiếu cẩn trọng khi rút tiền từ các địa chỉ ẩn danh (stealth addresses) có thể làm giảm hoặc triệt tiêu hoàn toàn các đặc tính riêng tư mà Umbra mang lại. Ba phương thức rút tiền giúp bảo vệ quyền riêng tư. Lưu ý rằng mỗi phương thức đều đi kèm với những đánh đổi nhất định.
- Rút tiền về một địa chỉ không công khai gắn liền với danh tính của bạn => Đánh đổi: Người gửi sẽ có thể suy luận ra rằng bạn là người kiểm soát địa chỉ đó.
- Tạo một địa chỉ mới và rút tiền về đó => Đánh đổi: Nếu nhận được token, bạn sẽ cần nạp ETH vào địa chỉ này để trả phí gas trước khi có thể sử dụng chúng.
- Rút tiền về địa chỉ trên sàn giao dịch => Đánh đổi: Nếu rút về Coinbase, sàn này sẽ biết ai là người đã gửi tiền cho bạn).
Một số vấn đề thực tế với Umbra
Tôi đã tiến hành kiểm tra một số giao dịch thực tế liên quan tới địa chỉ Umbra 0xFb2dc580Eed955B528407b4d36FfaFe3da685401 trên các mạng lưới hỗ trợ:
Do quá ít người sử dụng dịch vụ, hầu hết mọi người đều thực hiện “send token” sau đó gọi “withdraw token” luôn nên giao dịch cự kỳ dễ đoán là ai gửi cho ai, kiểm tra thêm lượng token gửi với số lượng token nhận và phí thì gần như chắc chắn luôn. Đây là điểm yếu chí mạng của hệ thống, dù về mặt toán học có hay đến mấy mà ít người sử dụng thì cũng không có ý nghĩ ẩn danh gì cả.


Nhưng vậy để ẩn danh được thực tế phải đảm bảo:
- Lượng người sử dụng giao thức đủ nhiều
- Mọi người cùng nên thống nhất một số lượng cố định
- Giao dịch gửi và nhận nên cách xa nhau => Giữa 2 giao dịch phải có nhiều giao dịch khác
Mình là lập trình viên, mặc dù cũng đã khá lớn tuổi nhưng vẫn thích Lập trình. Gần đây mình tập trung tìm hiểu nhiều hơn về Lĩnh vực Blockchain. Với kiến thức tìm hiểu được, mình muốn viết ra để lưu lại cũng như để chia sẻ cho những người quan tâm. Mong mọi người góp ý và có thể cùng mình chia sẻ nhiều kiến thức hơn cho cộng đồng.







Trả lời