Những ngày trước, trong khu dân cư có lan truyền một vụ việc, nghe thôi cũng khiến sống lưng lạnh toát. Một người dùng rõ ràng chỉ ký một lệnh chuyển khoản 500U, nhưng thứ được đẩy lên chuỗi lại là 50000U. Truy ra cuối cùng mới ghép đủ mạch thì mới thấy—cái giao diện (front-end) mà anh ta tương tác bị người khác chỉnh sửa. Trên màn hình hiển thị 500U, còn dữ liệu anh ta ký ra lại là 50000U. Khóa riêng thì anh ta tự quản; chữ ký thì anh ta tự tay xác nhận. Thế nhưng anh ấy hoàn toàn không hề biết mình đang ký cái gì.
Chuyện này kéo tôi quay lại với một khái niệm trong @NewtonProtocol Bạch thư (whitepaper) mà xuất hiện nhiều lần, nhưng lại ít người đào sâu: “ý định giao dịch” (transaction intent). Sơ đồ quy trình ủy quyền ở Mục 5.3 mô tả rất rõ—người dùng gửi lên không phải “chữ ký giao dịch trần”, mà là “ý định giao dịch”. Bộ máy chiến lược (strategy engine) trước hết cân nhắc xem ý định này có hợp quy tắc không; nếu qua, nó mới kèm theo chữ ký tổng hợp (aggregated signature) để đưa đi thực thi. Nhìn qua thì chẳng phải đang tách chữ ký thành hai bước sao? Nhưng sau khi suy nghĩ một lúc, tôi cảm thấy ở phía sâu hơn còn có một thay đổi lớn: nó ép “bạn đã ký cái gì” và “bạn định ký cái gì” phải khớp nhau.
Ví truyền thống có một điểm mù gần như không thể né tránh. Khóa riêng ký là một bài toán toán học; còn ý định giao dịch là một vấn đề ngữ nghĩa. Toán học có thể đảm bảo chữ ký là thật, nhưng không thể đảm bảo rằng “cái mà bạn nghĩ trong đầu” và “cái mà cuối cùng chạy trên chuỗi” có phải là cùng một chuyện hay không. Cách của Newton là biến ý định thành dữ liệu dạng cấu trúc để bộ máy chiến lược có thể tự kiểm tra độc lập lần nữa. Người vận hành nhận được không phải một chuỗi “sách bùa phép” hệ mười sáu, mà là bản mô tả văn bản dễ hiểu như “ai muốn chuyển bao nhiêu tiền cho ai”. Họ phải đánh giá xem mô tả văn bản này có hợp quy không, rồi sau đó mới dùng chữ ký BLS của chính mình để đóng dấu xác nhận cho nó. #Newt
Nhưng chuyện này cũng kéo ra một nghịch lý mới. Nếu chính ý định được tạo ra trên một front-end đã bị chiếm đoạt—người dùng tưởng mình gõ 500U, nhưng giao diện âm thầm đổi thành 50000U rồi mới ném ý định đi—thì người vận hành nhận được sẽ là một “ý định chuyển 50000U nhìn có vẻ hợp quy”. Họ kiểm tra, thấy hợp quy; ký, rồi thực thi. $NEWT Việc thế chấp (đặt cọc) token có thể đảm bảo chiến lược không bị sửa đổi, có thể đảm bảo người vận hành không dám lười biếng, nhưng nó không thể vá được khoảng nứt giữa “cái bạn nghĩ trong đầu” và “cái mà màn hình thể hiện”.
Có lẽ đây là lớp điểm mù sâu nhất trong toàn bộ tầng ủy quyền. DYOR.
Chuyện này kéo tôi quay lại với một khái niệm trong @NewtonProtocol Bạch thư (whitepaper) mà xuất hiện nhiều lần, nhưng lại ít người đào sâu: “ý định giao dịch” (transaction intent). Sơ đồ quy trình ủy quyền ở Mục 5.3 mô tả rất rõ—người dùng gửi lên không phải “chữ ký giao dịch trần”, mà là “ý định giao dịch”. Bộ máy chiến lược (strategy engine) trước hết cân nhắc xem ý định này có hợp quy tắc không; nếu qua, nó mới kèm theo chữ ký tổng hợp (aggregated signature) để đưa đi thực thi. Nhìn qua thì chẳng phải đang tách chữ ký thành hai bước sao? Nhưng sau khi suy nghĩ một lúc, tôi cảm thấy ở phía sâu hơn còn có một thay đổi lớn: nó ép “bạn đã ký cái gì” và “bạn định ký cái gì” phải khớp nhau.
Ví truyền thống có một điểm mù gần như không thể né tránh. Khóa riêng ký là một bài toán toán học; còn ý định giao dịch là một vấn đề ngữ nghĩa. Toán học có thể đảm bảo chữ ký là thật, nhưng không thể đảm bảo rằng “cái mà bạn nghĩ trong đầu” và “cái mà cuối cùng chạy trên chuỗi” có phải là cùng một chuyện hay không. Cách của Newton là biến ý định thành dữ liệu dạng cấu trúc để bộ máy chiến lược có thể tự kiểm tra độc lập lần nữa. Người vận hành nhận được không phải một chuỗi “sách bùa phép” hệ mười sáu, mà là bản mô tả văn bản dễ hiểu như “ai muốn chuyển bao nhiêu tiền cho ai”. Họ phải đánh giá xem mô tả văn bản này có hợp quy không, rồi sau đó mới dùng chữ ký BLS của chính mình để đóng dấu xác nhận cho nó. #Newt
Nhưng chuyện này cũng kéo ra một nghịch lý mới. Nếu chính ý định được tạo ra trên một front-end đã bị chiếm đoạt—người dùng tưởng mình gõ 500U, nhưng giao diện âm thầm đổi thành 50000U rồi mới ném ý định đi—thì người vận hành nhận được sẽ là một “ý định chuyển 50000U nhìn có vẻ hợp quy”. Họ kiểm tra, thấy hợp quy; ký, rồi thực thi. $NEWT Việc thế chấp (đặt cọc) token có thể đảm bảo chiến lược không bị sửa đổi, có thể đảm bảo người vận hành không dám lười biếng, nhưng nó không thể vá được khoảng nứt giữa “cái bạn nghĩ trong đầu” và “cái mà màn hình thể hiện”.
Có lẽ đây là lớp điểm mù sâu nhất trong toàn bộ tầng ủy quyền. DYOR.