Veilid để vận chuyển. Monero để thanh toán. Không có nhà điều hành nào ở giữa.
Không hề có máy chủ DUCAT ở bất cứ đâu — danh bạ, tin nhắn, hoá đơn và biên nhận là các bản ghi DHT cùng những gói tin niêm phong đầu-cuối, và mỗi chiếc điện thoại chạy một nút Veilid đầy đủ, trả lại phần định tuyến và lưu trữ mà nó dùng.
Ký ở chế độ gỡ lỗi, chỉ trên stagenet. Chưa dành cho tiền thật.
Đồng ducat từng là một đồng tiền vàng được chấp nhận từ Venice qua Vienna đến Levant suốt sáu thế kỷ — không quan hệ với bên phát hành, không tài khoản đứng sau, không giấy phép đi kèm. DUCAT chính là điều đó, cho lúc bạn đứng trước một người và làm ăn với họ.
Danh bạ, hoá đơn, thanh toán và biên nhận đi lại dưới dạng gói tin niêm phong đầu-cuối trên DHT của Veilid. Chẳng có gì để triệu tập ra toà, để bóp băng thông, để gỡ khỏi nền tảng hay để tắt đi, bởi chẳng có gì đang chạy. Mỗi điện thoại là một nút đầy đủ và trả lại phần định tuyến cùng lưu trữ mà nó dùng.
Tạo ngay trên điện thoại. Không email, không số điện thoại, không có ai để đăng ký — và cũng chính vì thế không ai khôi phục lại được cho bạn, và ứng dụng nói thẳng điều đó thay vì chôn nó đi.
Bạn đưa ai đó một tấm thẻ — mã QR, liên kết ducat: hoặc một cú chạm NFC — và
nó chỉ dùng được cho một người. Đã nhận rồi thì thẻ ngừng hoạt động, nên
một ảnh chụp màn hình lọt ra chỗ khác không phải là lối vào.
Mã hoá theo dáng X3DH, với khoá dùng một lần và tính bí mật chuyển tiếp. Khi ứng dụng buộc phải lùi về khoá đã ký, nó cho bạn thấy một ổ khoá mở chứ không giấu đi.
Các luồng dựa trên hộp thư, vẫn chạy khi một bên đang ngoại tuyến — chúng mang theo hoá đơn chi tiết mà các dòng buộc phải cộng đúng tổng, nếu không tin nhắn bị từ chối, mang theo thanh toán, và biên nhận do bên nhận tiền phát hành trỏ tới đúng giao dịch mà họ xác nhận. Nhóm nhỏ toả ra chính những luồng đôi ấy: không khoá nhóm, không bản ghi chung, mọi tính chất của luồng vẫn nguyên vẹn.
Mỗi ảnh chụp trên trang này là ứng dụng đang chạy trên điện thoại, không phải bản dựng thử. Không có gì ở đây bắt bạn đăng ký, bởi chẳng có ai để đăng ký cả.
Danh tính của bạn là một cặp khoá sinh ra trên thiết bị — không email, không số điện thoại, không ai để đăng ký, và cũng chính vì thế không ai khôi phục lại được cho bạn. Bước cuối là bản sao lưu, bởi một chiếc ví không khôi phục được mới là cách duy nhất khiến người ta thật sự mất tiền ở đây.
Một chiếc ví Monero bạn tự giữ, quy đổi sang tiền bản địa ở khắp nơi, được quét và chi tiêu bởi một động cơ monero-oxide nhúng sẵn — không có tiến trình ví nào chạy trên điện thoại.
Khi trả tiền, màn hình hiện số tiền, phí mạng ước tính, tổng cộng, còn lại bao nhiêu sau đó, tiêu bao nhiêu tờ và mất khoảng bao lâu — và cho bạn chọn tốc độ. Lịch sử được dựng lại từ chuỗi: các khoản gửi nhận diện bằng key image, tiền thối không bao giờ hiện như khoản thu, mỗi dòng mang số dư luỹ kế, và cả bản sao kê xuất được ra CSV.
Monero tiêu từng tờ riêng biệt chứ không tiêu số dư, nên một chiếc ví chỉ giữ một tờ lớn có thể không trả nổi hai lần liên tiếp. Ứng dụng đếm số tờ có thể tiêu và bảo bạn đổi nhỏ một tờ trước khi đứng ở quầy, thay vì để hỏng việc ngay tại đó.
Một liên hệ là một cặp khoá, không phải một định danh. Một lần quét mở ra cuộc trò chuyện dựa trên hộp thư, vẫn chạy khi một bên ngoại tuyến — và những luồng ấy mang theo giao thương, chứ không chỉ chữ nghĩa.
Bạn đưa ai đó một tấm thẻ — bằng mã QR, liên kết ducat: hoặc một cú chạm NFC —
và nó chỉ dùng được cho một người: đã nhận rồi thì ngừng hoạt động, nên
một ảnh chụp màn hình lọt ra chỗ khác không phải là lối vào.
Một nhóm là danh sách chỉ có thể dài thêm, và lời của nó đi trên một bản ghi bảng tin dùng chung cho mỗi thế hệ (§16.24): mỗi thành viên viết trang của riêng mình dưới một khoá nhóm mà danh sách mang theo, nên một tin nhắn cho năm người là một lần ghi thay vì năm, và mạng không thể phân biệt bản ghi ấy với bất kỳ bản ghi nào khác. Không ai giả danh được ai, và việc rời nhóm là chuyện cục bộ. Một nhóm có thể chia hoá đơn: một tổng số trở thành yêu cầu riêng gửi tới từng người, kèm một câu để mọi người tự kiểm lại phép tính, và mỗi yêu cầu chuyển thành đã trả ngay khi tham chiếu của nó về tới.
Chọn một trong chín chế độ và cả ứng dụng bàn giao lại — với các thẻ riêng của nó, không còn gì của ví. Gần như không phần nào trong đó cần một đối tượng giao thức mới, và đó là câu mà bản đặc tả tự hào nhất.
Một quầy thu ngân nhập từng món hoặc nhận một tổng gõ tay, tính thuế bán hàng cho vùng của nó và hiện một mã; hoá đơn hiện lên điện thoại của khách ngay khi họ quét, và biên nhận quay về khi họ trả tiền. Một sổ nợ quán báo cho khách từng ly và chốt lại bằng một hoá đơn. Một ki-ốt giao hẳn điện thoại cho khách, với bảng nhân viên nằm sau một mã PIN. Một hòm quyên góp mở cả hai lối: một mã DUCAT mở ra cuộc trò chuyện và gửi lại biên nhận ngay khi tiền tới, cùng một địa chỉ cố định mà bất kỳ ví Monero nào cũng gửi được — với cái giá về khả năng liên kết nói ngay trên màn hình chứ không nằm trong một bản chính sách.
Gõ nơi bạn muốn đến. Điện thoại biến một toạ độ GPS thành một ô địa lý — một bảng tin công khai mà địa chỉ chính là nơi chốn ấy — rồi dán lên một lời gọi: một tấm thẻ dùng một lần, một vùng áng chừng, và một mức giá tính từ lộ trình lái xe thật. Không một cái tên nào lên bảng — không trên tấm thẻ, cũng không trong bản ghi phía sau nó. Tài xế theo dõi ô của mình và các ô lân cận rồi nhận cuốc; chính DHT làm trọng tài cuộc đua, và không hề tồn tại một bên mai mối nào.
Đường màu xanh mới là điều đáng nói: giá của DUCAT thấp hơn khoảng 15% so với mức nền tảng thu của khách, và tài xế giữ trọn phần đó — khoản chiết khấu vắng mặt, trả lại cho cả hai. Cái gật đầu đến kèm một gương mặt: tên, xe, màu, biển số, giờ tới — niêm phong gửi riêng cho khách, không bao giờ hiện lên bảng tin. Tên của chính bạn và khung cửa bạn đang đứng đợi đi ngược lại đúng khoảnh khắc ấy, tới đúng người tài xế đã nhận cuốc.
Một nhượng bộ, nói thẳng trên màn hình: tìm địa chỉ, dẫn đường và các ô bản đồ đều hỏi OpenStreetMap — nơi duy nhất DUCAT gửi vị trí ra khỏi thiết bị. Bản thân các bảng tin không bao giờ mang độ chính xác tốt hơn ~1,2 km.
Vẫn bộ máy bảng tin ấy, mang theo nhiều hơn những cuốc xe. Một tin rao ở chợ, một lượt cho thuê, hay một giờ tay nghề giúp việc đều được dán lên một bảng tin lấy khu phố làm địa chỉ, và một người lạ gần đó đọc được nó mà cả hai bên đều không chạm vào nền tảng nào.
Tin rao nằm trên những bảng thô hơn lời gọi xe — rộng chừng năm cây số, bởi người ta sẵn sàng đi một quãng để lấy một chùm chìa khoá. Việc tìm kiếm đọc bảng của bạn và vành đai quanh nó, vẽ kết quả ngay khi từng nơi trả lời, nên thứ đỗ gần bạn hiện lên màn hình trong chưa đầy sáu giây, còn «quanh đây không có gì» mất chừng bốn mươi giây và đánh dấu từng vùng đã dò xong.
Biểu mẫu đăng tin được chia đôi và ứng dụng nói cho bạn biết nửa nào là nửa nào: mọi thứ ở phần đầu sẽ lên một bảng tin công khai mà ai ở gần cũng đọc được, còn địa chỉ, chỗ để chìa khoá và biển số thì nằm ở phần sau, phần không rời khỏi điện thoại bạn cho tới khi có một lượt đặt thật sự.
Những bản ghi mang được hoá đơn thì cũng mang được một trang viết. Khoá của bạn vốn đã là một địa chỉ, nên thứ bạn viết ra có chỗ để ở mà không phải xin ai một khoảng trống.
Mái nhà của một danh tính nằm ở đúng địa chỉ mà khoá của nó gọi tên, còn dòng tin là dòng thời gian của những người bạn giữ — một bài có thể mang theo ảnh và tệp, và những trái tim quay về. Các trang được chính người xuất bản phục vụ từ ổ đĩa của họ và mở ra trong một căn phòng niêm phong, nên đọc một trang không kéo về thứ gì từ nơi khác.
Các ấn phẩm — một tờ báo, một truyện dài kỳ, một phần mềm — được bán toàn cầu trên các bảng theo chủ đề thay vì theo khu phố: một bài đáp xuống bảng của chủ đề và cả bảng của ngôn ngữ nó, còn «Tất cả» đọc cả sáu kệ song song. Một tin rao kéo gói của nó về từ chính điện thoại người bán — tối đa 24 tấm ảnh cỡ đầy đủ, một phần mô tả, thông số và tệp đính kèm — và bị từ chối trọn gói ở bất kỳ khoá nào nó không gọi tên, để một tài liệu tồi không thể giấu những tấm ảnh tốt.
Không có công ty nào ở giữa để bênh bên nào, nên DUCAT làm một điều đơn giản hơn. Tiền nằm ở một địa chỉ mà chỉ hai người mở được, và lệnh giải toả trả về cho mỗi bên đúng phần cọc của mình, ghi rõ tên. Không ai lấy được tiền cọc — kể cả chúng tôi, bởi chẳng có chúng tôi nào để mà trả.
Những con số ấy được lập luận chứ không phải đoán — mô hình 2-trên-2 không bên giữ hộ của Bisq là tiền lệ đang chạy gần nhất, và các nghiên cứu về đặt cọc song phương chứng minh cách sắp xếp này chống gian lận ở trạng thái cân bằng. Từ đó rút ra hai giới hạn: một khoản cọc có giá trị thấp hơn phí trả lại nó thì thành số không chứ không phải đồ trang trí, và không khoản nào vượt quá nửa giá. Bên chịu rủi ro nhiều hơn nạp sau, để tiền của họ không bao giờ nằm một mình trong địa chỉ chung.
Khi một giao dịch cần nhiều hơn một khoản cọc: khách, tài xế và một liên hệ trọng tài được cả hai tin cậy cùng chạy một lượt sinh khoá phân tán qua luồng đã niêm phong — ba thiết bị dẫn ra một địa chỉ Monero, mỗi bên chỉ giữ một phần, hai bên bất kỳ là ký được, không có kẻ chia bài ở đâu cả. Đường đi suôn sẻ chỉ là hai cú chạm.
Mọi trường hợp khác là một thoả thuận: một bên đề nghị cách chia, bên kia ký hoặc trả giá lại. Ai mắc kẹt thì hỏi trọng tài, và chữ ký đồng thuận của trọng tài chính là phán quyết — một trọng tài bị chiếm quyền cùng lắm chỉ chọn được giữa các bên đã nêu tên, không bao giờ tự trả cho mình. Đã chứng minh trên chuỗi ở stagenet với mọi hình thái, kể cả một lượt giải toả FROST hai đầu vào.
Trước khi có bất kỳ giao dịch nào thì chỉ có một người lạ, và câu hỏi là cái tên ấy đã tốn của họ bao nhiêu. Một danh tính có thể đốt Monero — gửi nó tới một địa chỉ không ai giữ khoá, dẫn ra từ một giá trị băm ai cũng tự tính lại được — và mang theo chính bằng chứng thanh toán của Monero cho khoản ấy. Ứng dụng của bạn đối chiếu bằng chứng đó với nút của chính nó, hỏi một nút thứ hai xem giao dịch đã vào khối chưa, và từ đó trở đi hiện danh tính ấy bằng lời ở mọi nơi bạn phải quyết định điều gì: đã đốt 0,01 XMR, từ khối N. Không bao giờ là một điểm số. Quy tắc đáng kể là lời cảnh báo: khi thứ bạn sắp đem ra đánh đổi có giá hơn thứ họ đã đốt, ứng dụng nói thẳng như vậy, bởi một cái tên chẳng tốn gì thì biến mất cũng chẳng mất gì.
Sau một giao dịch đã xong, bên nào cũng có thể ký một biên nhận có đánh giá, và bất kỳ ai bạn đã gặp mặt đều có thể ký một lời bảo đảm. Cả hai đi trong một luồng đã niêm phong và cả hai chỉ do người đọc tự cân — mỗi người ký một tiếng nói, chỉ tính những người ký mà bạn đã kiểm tra lần đốt của chính họ, và chỉ tính lời bảo đảm từ những người đã có sẵn trong danh bạ của bạn. Một bước, không đồ thị, không có gì được công bố ở đâu cả. Uy tín tốn tiền chứ không tốn quyền riêng tư.
Một công cụ riêng tư mà dùng khó chịu thì chỉ được dùng một lần. Cái này gọi tên cái giá bạn phải trả, nói hai mươi thứ tiếng, và có một giao diện tối không phải nghĩ ra sau cùng.
Sự tiện lợi có cái giá của nó trong một hệ thống riêng tư, và ứng dụng gọi tên cái giá ấy ngay lúc bạn chọn chứ không phải trong một bản chính sách chẳng ai đọc. Cho phép các liên hệ trả thẳng cho bạn nghĩa là dùng lại một địa chỉ — nên nó nói rằng bất cứ ai theo dõi chuỗi đều thấy được rằng cùng một người đã được trả tiền mỗi lần, kể cả những người chỉ mới trả cho bạn đúng một lần, rồi chỉ ra lựa chọn thay thế. Cũng nếp ấy chạy suốt: một lần nhìn thấy trong mempool được hiện là đã thấy, chưa hề tất toán; một hồ sơ luôn được trình bày đúng như bản chất của nó, một lời tự nhận.
Nó nói hai mươi thứ tiếng — mọi màn hình đọc từ tài nguyên, dạng số nhiều được soạn ra chứ không nối chuỗi, và tiếng Ả Rập cùng tiếng Ba Tư chứng minh tấm gương ấy. Biên nhận là hồ sơ, không phải tin nhắn: mỗi biên nhận sống trong kho riêng, sống sót qua việc xoá luồng và xoá liên hệ, và đi cùng bản sao lưu đã mã hoá — bản sao lưu mang theo cả con người chứ không chỉ tiền bạc.
Một cửa sổ gốc trên chính phần Rust mà điện thoại đang chạy — nên quầy thu ngân của người bán hàng, một ki-ốt, phòng báo chí, cái chợ và dòng tin là một bản triển khai, không phải bản chuyển.
Nó nói hai mươi thứ tiếng của điện thoại từ cùng bộ tài nguyên, và đã được kiểm chứng đối chiếu với điện thoại trong mọi nghi thức: trò chuyện, nhóm trên bảng, hoá đơn và biên nhận, một đơn ki-ốt trả từ chiếc điện thoại chưa từng gặp máy bàn, tệp và trang được phục vụ lẫn lấy về, cùng những cuộc gọi có tiếng thật.
Tệp README ghi sổ những gì thật sự đã chạy đầu-cuối trên mạng thật và stagenet thật — và nêu rõ các khoảng trống thay vì chôn chúng đi.
core/Mọi bản dựng đều ký ở chế độ gỡ lỗi và tất toán trên stagenet của Monero — những đồng tiền không có giá trị, đúng như thiết kế. Bản đặc tả là bản nháp 1.1.0-dev13 và tự nói về mình: chẳng có gì ở đây là chung cuộc, và §14 mới là chương trình nghị sự thật sự. Hãy thử nó, phá nó, đọc nó — chỉ đừng rót tiền vào nó.
ducat-protocol.md là hiện vật chính — năm phần, nhật ký thay đổi đặt lên đầu,
và một bộ kiểm tra tuân thủ mà một bản triển khai thứ hai chạy qua, để tài liệu không thể
lặng lẽ trôi xa khỏi mã nguồn.
★ ducat-protocol.md bản đặc tả — nháp 1.1.0-dev13, nhật ký thay đổi đặt trước core/ bản triển khai tham chiếu (Rust) vectors/ 406 ca tuân thủ + lược đồ conformance/ bốn bộ kiểm tra, chạy mỗi lần push harness/ đầu-cuối trên các tuyến Veilid thật sim/ trình mô phỏng ngoại tuyến, kịch bản thị trường applications/ android/ + desktop/ (cùng tệp nguồn) mobile/ cầu nối Rust: ví · hộp thư · nút mạng research/ bằng chứng, không phải sản phẩm
schema.jsonTrách nhiệm gìn giữ là quy phạm chứ không phải nguyện vọng: §18.7 biến đạo lý của Veilid thành một điều kiện tuân thủ — không phí giao thức, không trả tiền cho nút, không bao giờ. Hãy dựng bất cứ thứ gì bạn muốn từ mã này, nhưng một ứng dụng kiếm tiền từ việc chuyên chở thì không phải DUCAT.
Không phải cài gì trước — mỗi bản dựng mang theo thư viện Rust và JVM của riêng nó. Android trên điện thoại, và vẫn ứng dụng ấy dưới dạng cửa sổ gốc trên Linux, Windows và macOS. Không có bản dựng cho iOS; nó sẽ có thư mục khi nào xứng đáng.
Trình duyệt trên điện thoại, bản dựng mới nhất, không phải lần mò trang phát hành.
armeabi-v7a chỉ dành cho máy cũ hơn khoảng năm 2016; x86_64
dành cho trình giả lập.
Bản dựng cho Apple Silicon và Intel. Chưa ký — macOS sẽ cảnh báo ở lần mở đầu tiên.
Ký ở chế độ gỡ lỗi, chỉ trên stagenet — không dành cho tiền thật.