paint-brush
Chuỗi công cụ FHE thế hệ tiếp theo dành cho Đa vũ trụ Dev: TFHE đang đưa chúng ta đến đó như thế nàotừ tác giả@pascalpaillier
1,235 lượt đọc
1,235 lượt đọc

Chuỗi công cụ FHE thế hệ tiếp theo dành cho Đa vũ trụ Dev: TFHE đang đưa chúng ta đến đó như thế nào

từ tác giả Pascal Paillier23m2024/05/17
Read on Terminal Reader
Read this story w/o Javascript

dài quá đọc không nổi

Bài viết này khám phá các chiến lược khác nhau để thiết kế chuỗi công cụ FHE thế hệ tiếp theo bằng cách đặt cược vào TFHE. Kiến thức hiện tại về cách tạo mã đồng cấu với TFHE đã đủ để tạo ra những công cụ như vậy trong hiện tại và cung cấp chúng cho các nhà phát triển, từ đó cho phép họ dễ dàng tích hợp tính toán bí mật khi xây dựng ứng dụng.

People Mentioned

Mention Thumbnail

Companies Mentioned

Mention Thumbnail
Mention Thumbnail

Coins Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - Chuỗi công cụ FHE thế hệ tiếp theo dành cho Đa vũ trụ Dev: TFHE đang đưa chúng ta đến đó như thế nào
Pascal Paillier HackerNoon profile picture

Giới thiệu

FHE đang thay đổi trò chơi và tất cả chúng ta đều được mời tham gia.


Nếu bạn không biết tôi đang nói về điều gì, điều đó có nghĩa là gần đây bạn đang sống dưới một tảng đá. Hãy duyệt qua một số tài nguyên toàn diện của FHE.org và quay lại.


Để FHE thực hiện được lời hứa của mình với thế giới công nghệ, nó phải đi kèm với một thế hệ công cụ sức mạnh công nghiệp mới để phát triển, biên dịch và thực thi thời gian chạy mà bất kỳ ai cũng có thể sử dụng để xây dựng các ứng dụng đồng hình một cách dễ dàng.


Tuy nhiên, ở thời điểm hiện tại, nhiều chuyên gia và công ty trong lĩnh vực FHE vẫn đầu tư phần lớn thời gian và công sức vào việc cải thiện mật mã đằng sau FHE, thay vì tập trung vào việc xây dựng các công cụ phát triển tuyệt vời cho những người không phải chuyên gia. Hãy nghe rõ tôi ở đây: nâng cao hiệu suất và chức năng cốt lõi của FHE luôn là tin tốt. Nhưng trong một kế hoạch vĩ đại, những cải tiến gia tăng này thúc đẩy việc áp dụng toàn cầu ở mức tốt nhất. Chúng sẽ có tác động đến việc áp dụng vào một thời điểm nào đó, nhưng không phải bây giờ .


Theo quan điểm của tôi, rõ ràng là thế giới công nghệ ngày nay cần các chuỗi công cụ FHE mạnh mẽ, thân thiện với nhà phát triển để bắt đầu mở ra những câu chuyện thành công do FHE cung cấp và đưa FHE từ một xu hướng công nghệ sang một sự thay đổi mô hình thực tế trong kinh doanh bảo mật kỹ thuật số. Tôi tin rằng kiến thức hiện tại về FHE - cả về mặt khoa học và công nghệ - đã đủ để xây dựng những công cụ như vậy trong hiện tại và cung cấp chúng cho đại chúng am hiểu công nghệ mà không bị chậm trễ thêm nữa. Việc tích hợp liên tục các tính năng mới sẽ diễn ra một cách tự nhiên theo thời gian, điều đó luôn xảy ra.


Nhưng vấn đề là ở đây: FHE có nhiều loại. Tùy thuộc vào sơ đồ mật mã nào bạn đang sử dụng - hoặc cách sử dụng cụ thể mà bạn thực hiện, sẽ phát sinh một cách khác để biểu diễn tính toán và chạy các chương trình đồng cấu. Có vẻ như các sơ đồ FHE hoàn toàn là những động vật khác nhau, một cái cung cấp cho bạn máy Turing và một cái khác cung cấp cho bạn phép tính lambda. Đa dạng sinh học luôn tốt về mặt công nghệ hoặc mặt khác, nhưng điều đó cũng có nghĩa là bạn cần phải xây dựng một chiến lược khả thi khi áp dụng FHE vào thực tế.


Công ty Zama của tôi tập trung vào một chương trình FHE cụ thể là TFHE . TFHE đạt được khả năng xử lý dữ liệu đồng hình với các nội dung rất cụ thể: khởi động và tính toán siêu nhanh được biểu thị dưới dạng mạng tra cứu bảng. Chúng tôi đã đạt được sự hiểu biết sâu sắc về cách những đặc thù này - vốn từng khiến TFHE trở thành một loại kẻ yếu thế trong không gian FHE - có thể được chuyển thành các thư viện đồng cấu, trình biên dịch, máy ảo hoặc tăng tốc phần cứng.


Các đối thủ FHE nổi bật khác như CKKS , BGV hoặc BFV liên quan đến các khái niệm rất khác nhau trong thiết bị thực tế của họ: quá trình khởi động quá chậm để trở thành một lựa chọn, do đó quá trình xử lý bị hạn chế về chiều sâu, tuy nhiên dữ liệu có thể được vector hóa bằng cách phân khối lớn, tính toán được biểu thị dưới dạng mạch đa thức và - trong trường hợp CKKS - kết quả chỉ mang tính tương đối. Vì vậy, việc dịch BGV/BFV và CKKS sang trình biên dịch và thời gian chạy đòi hỏi tư duy hoàn toàn khác với những người xây dựng công cụ.


Tuy nhiên, các nhà phát triển dường như không quan tâm nhiều đến sơ đồ cụ thể nào đang cung cấp năng lượng cho chuỗi công cụ và môi trường thời gian chạy FHE của họ, miễn là chúng được vận hành dễ dàng và đáp ứng các yêu cầu về hiệu suất trong các ứng dụng đồng cấu được triển khai. Bản thân họ là những người xây dựng sáng tạo và họ phải tập trung vào những trải nghiệm mới mà họ có thể cung cấp cho người dùng.


Vì vậy, mục tiêu cuối cùng dành cho những người hỗ trợ công nghệ FHE là hình thành và cung cấp các công cụ không chỉ sẵn sàng cho thời kỳ đỉnh cao trong đa vũ trụ dành cho nhà phát triển mà còn đủ mạnh để thiết lập tiêu chuẩn ngành mới. Để đạt được điều đó, họ phải nắm bắt cơ hội xem chương trình FHE nào có nhiều khả năng đưa họ đến đó hơn.


Chúng ta hãy chơi một trò chơi.


Lấy một nhà phát triển không biết gì về sự phức tạp của FHE nhưng muốn xây dựng một ứng dụng đồng cấu. Bạn là người xây dựng công cụ ở đây, bạn đang đối mặt với nhà phát triển đó, người mà bạn có thể mong đợi sự quen thuộc với các phương pháp phát triển thông thường và những điều cơ bản về khoa học máy tính nhưng mọi thứ khác - toán nâng cao và những thứ tương tự, đều nằm ngoài giới hạn. Làm thế nào bạn có thể khiến họ tự sản xuất ứng dụng FHE thành công?


Bài viết này khám phá các chiến lược khác nhau để giành chiến thắng trong trò chơi đó bằng cách đặt cược vào TFHE.


Tùy thuộc vào bản chất của ứng dụng - xử lý dữ liệu tùy chỉnh, mạng lưới thần kinh, hợp đồng thông minh hoặc lập trình có mục đích chung, các đường dẫn chiến thắng hỗ trợ TFHE sẽ được khám phá. Cuộc khám phá này sẽ đưa chúng ta đi trên một con đường dễ dàng, một con đường khó khăn và một số con đường khác ở giữa, với các mức độ sẵn sàng công nghệ khác nhau trong việc hiện thực hóa chúng.

Các chương trình TFHE là gì?

TFHE là viết tắt của Torus FHE. Còn được gọi là CGGI theo tên của những người phát hiện ra nó, TFHE chiếm một vị trí độc nhất trong bối cảnh FHE: đây là cơ chế nổi tiếng nhất để kích hoạt khả năng khởi động có thể lập trình (PBS).


Tóm lại, PBS là một bảng tra cứu đồng cấu. Nó trả về mã hóa T[x] trong đó T là hàm được lập bảng theo lựa chọn của bạn, được mã hóa chỉ mục x . Tốc độ chạy của nó không phụ thuộc vào các mục của T mà chỉ phụ thuộc vào số lượng mục và nằm trong khoảng mili giây. Ngoài ra, PBS đặt lại nhiễu mã hóa được nhúng trong văn bản mã hóa đầu ra của nó, do đó bạn có thể soạn các PBS theo trình tự vô thời hạn, biết rằng ứng dụng đồng hình của bạn sẽ luôn xử lý các văn bản mã hóa sạch.

mạng TFHE

Mô hình tính toán mà TFHE ủng hộ là rất tinh túy.


Bộ xử lý cơ bản trong các chương trình TFHE trông giống hệt một nơ-ron và bao gồm 2 phép toán đồng hình cơ bản:


  1. Một tổ hợp tuyến tính của các đầu vào trả về E(x) trong đó x = w_1 x_1 + … + w_n x_n modulo m , với các đầu vào được mã hóa E(x_1), …, E(x_n) và một tập hợp các trọng số văn bản gốc w_1, …, w_n .


  2. Một PBS tính toán E(T[x]) từ E(x) trong đó T là một bảng văn bản gốc nào đó có kích thước m .

Một tế bào thần kinh TFHE


Trong "tế bào thần kinh TFHE", m , x_i , w_i , cũng như các mục T[0], …, T[m-1] đều là số nguyên và người ta có thể tự do lựa chọn các "tham số" m , w_1, …, w_nT . Cho rằng sự kết hợp tuyến tính có chi phí gần như bằng 0, điểm nghẽn hiệu quả là PBS có thời gian chạy chỉ phụ thuộc vào mô đun m : tốc độ giảm khi m tăng. Điều này đòi hỏi phải sử dụng các giá trị nhỏ - lẻ hoặc chẵn, nhưng ít nhất là 2 - cho các mô đun trong tế bào thần kinh TFHE, mặc dù phải tìm ra sự cân bằng để tránh giảm quá mạnh khả năng biểu đạt tính toán của chúng.


Giờ đây, giống như cách các nơ-ron được tập hợp thành các lớp trong mạng nơ-ron để hưởng lợi từ tính song song và các thủ thuật HPC, mạng TFHE xếp chồng các lớp nơ-ron TFHE. Mỗi lớp có một ma trận trọng số modulo một mô đun chung m và một vectơ các bảng tra cứu có kích thước m . Tuy nhiên, mô đun có thể khác nhau ở lớp trước hoặc lớp tiếp theo, giống như hình dạng của lớp.


Mạng TFHE


Và điều đó kết thúc TFHE! Thế là xong, chúng ta chỉ cần biểu diễn một cách có hệ thống các chức năng dưới dạng mạng tra cứu. Bây giờ chúng ta có mô hình tính toán đồng cấu.


Trong thực tế thực tế, TFHE hỗ trợ nhiều phần mở rộng của mô hình đó (đồ thị tùy ý của các toán tử cấp thấp hơn, bản mã thuộc nhiều loại khác nhau, tra cứu bảng nhiều đầu ra, nhiều cách đóng gói biến, v.v.). Nhưng hiện tại, chúng tôi có thể bỏ qua những cải tiến này vì tầm nhìn mạng tra cứu đã đủ mạnh để cho phép chúng tôi chuyển đổi một chương trình đơn giản thành một chương trình đồng hình tương đương và chạy nó. Vì vậy, chúng ta có thể tập trung vào cách thực hiện điều đó, ít nhất là trong lần lặp lại đầu tiên của công nghệ.

Làm cho mạng TFHE có thể thực thi được

Do đó, mạng TFHE chỉ là một bản thiết kế và chưa sẵn sàng để thực thi đúng cách trong một ứng dụng đồng cấu. Mặc dù các mô-đun, ma trận trọng số và bảng tra cứu được chỉ định đầy đủ cho tất cả các lớp của nó, nhưng nó vẫn thiếu một thành phần quan trọng là tham số hóa mật mã.


Các tham số mật mã quyết định mọi số liệu có thể có về những gì sẽ xảy ra trong mạng trong thời gian chạy: kích thước văn bản mã hóa cụ thể, kích thước tensor thực tế của các khóa chuyển đổi khóa và khóa khởi động bên trong PBS, các tùy chọn thuật toán khác nhau trong các toán tử đồng hình cấp thấp, độ chính xác và nhiễu của văn bản gốc như thế nào các cấp độ phát triển trên toàn mạng và cuối cùng là các chi tiết cụ thể về cách mã hóa và giải mã. Họ cũng dự đoán việc sử dụng bộ nhớ và hiệu suất.


Việc tìm ra bộ tham số nào tối ưu hóa việc thực thi mạng TFHE có thể rất phức tạp và trong mọi trường hợp, cực kỳ khó khăn - ngay cả đối với các chuyên gia - để thực hiện theo kiểu bút và giấy như những ngày đầu của FHE, vì mọi thứ đều phụ thuộc vào mọi thứ . Ngoài ra, một số bộ tối ưu có thể cùng tồn tại đồng thời, do đó yêu cầu có sự chênh lệch giữa kích thước khóa công khai, độ trễ đường dẫn quan trọng hoặc thông lượng tối đa. May mắn thay, vấn đề tự động hóa tác vụ này đã được giải quyết trong những năm qua và hiện đã có các công cụ tối ưu hóa mạnh mẽ để nhanh chóng xác định cách khởi tạo mật mã tốt nhất của mạng TFHE nhất định.


Tham số hóa mạng TFHE



Sau khi được khởi tạo bằng các tham số mật mã, mạng TFHE sẽ thực sự có thể thực thi được, hay chính xác hơn là có thể tuân theo một tệp thực thi thực sự thông qua quá trình biên dịch thích hợp.

Chương trình TFHE

Chương trình TFHE là một tập hợp các mạng TFHE được tham số hóa được gắn kết với nhau bằng "logic đơn giản".


Logic đơn giản được làm bằng


  • hướng dẫn hoạt động trên các biến văn bản gốc (có nghĩa là các biến bình thường, không được mã hóa),

  • phân nhánh, không điều kiện hoặc có điều kiện đối với các vị từ của bản rõ,

  • đọc và ghi bộ nhớ tại các địa chỉ văn bản gốc, số học con trỏ,

  • gọi tới các chương trình con/hàm.


Về cơ bản, logic đơn giản chứa bất kỳ logic lập trình nào được ngôn ngữ hỗ trợ, ngoại trừ một trường hợp duy nhất: sửa đổi các biến chương trình được mã hóa, vốn là đặc quyền của các phần TFHE của chương trình. Điều duy nhất logic đơn giản được phép thực hiện với các bản mã - và các khóa công khai TFHE - là di chuyển chúng xung quanh mà không thay đổi và đưa chúng vào các bộ phận TFHE, như thể chúng đang chạy bên trong bộ đồng xử lý hoặc bộ chứa riêng biệt của chúng.


Đối với tất cả ý định và mục đích, một chương trình tuân theo định nghĩa này là hoàn chỉnh và sẵn sàng trở thành một ứng dụng đồng hình hoàn chỉnh, bất kể ngôn ngữ lập trình. Quá trình biên dịch tùy chỉnh sẽ cung cấp ánh xạ cuối cùng này và đối tượng kết quả sau đó có thể được chạy trên thời gian chạy hỗ trợ TFHE hoặc dưới dạng tệp thực thi độc lập, khép kín.


Một chương trình TFHE


Một ngôn ngữ chuyên dụng có thể được sử dụng để thống nhất cách trình bày các chương trình TFHE - như một số DSL, hoặc tốt hơn là phương ngữ MLIR - để quá trình biên dịch có thể được thực hiện với cùng một trình biên dịch phụ trợ.


Bản chất chính xác của thời gian chạy (thư viện chia sẻ/động, VM hoặc cách khác) chỉ là một phương thức ở đây. Một trong hai tùy chọn sẽ dẫn đến một ứng dụng đồng hình được hỗ trợ bởi TFHE có thể được triển khai và hiển thị cho người dùng.


Bây giờ chúng ta hãy quay lại trò chơi đang chơi trong một phút.


Chúng tôi đang đối mặt với một nhà phát triển không biết gì về TFHE hoặc những điều trên nhưng muốn xây dựng một ứng dụng đồng hình. Giả sử chúng ta đã phát hành trình biên dịch được thảo luận ở trên và thời gian chạy hỗ trợ TFHE, nếu có.


Mục tiêu của chúng tôi đã được giải quyết, chúng tôi chỉ cần một chương trình TFHE để có thể thực thi được. Nhưng... làm thế quái nào mà chúng ta lại bắt nhà phát triển tự sản xuất thứ gì đó cụ thể như chương trình TFHE ngay từ đầu?

Con đường dễ dàng: phát hành lib FHE và để nhà phát triển làm việc của họ

Đây là con đường giành chiến thắng dễ dàng: bạn gói gọn tất cả sự phức tạp vào API FHE hộp đen.

Chương trình đơn giản

Trong bất kỳ ngôn ngữ lập trình nào, một chương trình (đơn giản) về cơ bản có thể được xem là sự kết hợp của 3 thành phần:


  • logic lập trình, được tạo thành từ các hướng dẫn ngôn ngữ gốc và cấu trúc phạm vi,

  • các biến và lựa chọn các kiểu dữ liệu mà chương trình gán cho chúng, được chọn trong số tất cả các kiểu dữ liệu có thể,

  • gọi tới một tập hợp các hàm bên ngoài, được chọn trong số tất cả các hàm bên ngoài có sẵn, mà chương trình sử dụng để thao tác trên các biến của nó.


Các kiểu dữ liệu có ngôn ngữ phụ riêng, sự kết hợp giữa các kiểu gốc và cấu trúc gõ để mở rộng các kiểu gốc này và kết hợp chúng thành các kiểu có cấu trúc cấp cao hơn. Hệ thống kiểu nhằm mục đích cung cấp đủ khả năng biểu đạt để bao quát hầu như mọi cấu trúc dữ liệu mà chương trình có thể yêu cầu. Các hàm bên ngoài là các hàm được cung cấp bởi các thư viện, theo tiêu chuẩn hoặc cách khác, nhưng chúng cũng có thể được gọi ngầm bằng các hướng dẫn gốc ngôn ngữ (các toán tử nghĩ về số học hoặc phép chia mô-đun).


Vì vậy, các chương trình đơn giản trên thực tế là "đơn giản":


Về bản chất, một chương trình đơn giản


Hãy nghe tôi nói rõ đây. Tôi không nói rằng tất cả các khái niệm lập trình cấp cao như đa hình, đối tượng với các thành viên và thuộc tính của chúng, các lớp và kế thừa phân cấp, mẫu, macro, đặc điểm, luồng, đệ quy, đường cú pháp, chú thích và tất cả các chi phí bằng 0 có thể tưởng tượng khác Các khái niệm trừu tượng do ngôn ngữ cung cấp cần thiết để nhà phát triển có thể xử lý đơn giản, mặc dù chúng được phát minh ra để đơn giản hóa công việc của họ.


Tôi chỉ nói rằng vì mục đích của chúng ta, chúng chỉ là những vật trang trí vô thưởng vô phạt sẽ biến mất vào thời gian biên dịch, bởi vì một phiên bản dạng bình thường, tương đương, được hạ thấp của chương trình được suy ra từ nguồn. Phiên bản đó của chương trình, được biểu thị bằng bất kỳ biểu diễn trung gian (IR) nào, được tạo thành từ các khối cơ bản đường thẳng - các chuỗi hướng dẫn cơ bản trong IR đó - được kết nối bằng một số biểu đồ luồng điều khiển.


Bây giờ chương trình này ở dạng bình thường là "đơn giản". Ý tôi là, đủ đơn giản để được tăng cường khả năng đồng hình.

Ném FHE vào hình ảnh

Bạn giành chiến thắng trong trò chơi bằng cách phát hành thư viện FHE có ngôn ngữ gốc và để nhà phát triển xử lý cách sử dụng nó tốt nhất.


Thư viện sẽ hiển thị các kiểu dữ liệu mới - các kiểu dữ liệu được mã hóa, để bổ sung cho các kiểu dữ liệu đơn giản - và một tập hợp các hàm đồng cấu bắt chước (ít nhiều) các hàm đơn giản mà nhà phát triển quen thuộc, chỉ có điều chúng hoạt động với các kiểu dữ liệu được mã hóa. Nói tóm lại, bạn đang mở rộng hệ thống loại và hệ sinh thái thư viện, đồng thời để trí thông minh của nhà phát triển tìm ra cách sử dụng các tiện ích mở rộng này để tạo ra ứng dụng đồng hình của họ.


Điều này không đặc biệt gắn liền với TFHE, bất kỳ chương trình FHE nào cũng được. Đó là điều mà các nhà cung cấp các thư viện FHE khác nhau tập trung vào: cải thiện khả năng sử dụng và tính thân thiện với người dùng của FHE bằng cách hiển thị các hàm đồng hình cấp cao trông giống nhất có thể với trải nghiệm mã hóa đơn giản. Tất cả sự phức tạp về mật mã được trừu tượng hóa thành các hộp đen mà chương trình sẽ thực hiện các lệnh gọi oracle.


Tất nhiên điều đó có thể có tác dụng tốt đối với nhà phát triển. Chà... nếu bạn thực hiện được thỏa thuận của mình với tư cách là nhà cung cấp thư viện.


Họ sẽ tìm ra một chương trình đồng hình trông giống như thế này.


Về bản chất, một chương trình đồng hình


Hiện tại có các biến đơn giản và biến được mã hóa cùng tồn tại và chương trình phải duy trì sự phân chia chặt chẽ giữa 2 loại đối tượng này. Đó là bởi vì có quy tắc vàng FHE này cho biết rằng khi bạn áp dụng một hàm cho hỗn hợp các đối số đơn giản và được mã hóa, kết quả nhất thiết phải được mã hóa, ví dụ: fhe_add(E(x), y) trả về E(x+y) và sớm. Vì vậy, các biến đơn giản có thể nhập một số hàm FHE nhưng không bao giờ có thể thoát ra khỏi chúng. Mã hóa đồng cấu "làm ô nhiễm" mọi thứ nó chạm vào thông qua tính toán.


Vì vậy, hãy xem... làm cách nào để bạn phân nhánh có điều kiện sang một biến được mã hóa?


Vâng, bạn không thể. Nhưng nó không phải là một vấn đề lớn chút nào.

Một trục trặc: phân nhánh có điều kiện

Trong ứng dụng FHE, phân nhánh có điều kiện chỉ có thể hoạt động trên các boolean đơn giản chứ không phải trên các boolean được mã hóa. Làm thế nào bạn biết nơi để nhảy dựa trên một bit được mã hóa? Bạn không có khóa riêng của người dùng để giải mã bit đó.


May mắn thay, FHE cũng cung cấp cho bạn những thủ thuật đơn giản để khắc phục điều này.

Làm thế nào để thường xuyên hóa một if

Giả sử ban đầu nhà phát triển muốn làm điều gì đó như


 if (x == 0) then y = 3 else z = 7


nhưng nhận ra rằng, đến thời điểm đó, biến x sẽ thực sự được mã hóa. Làm cách nào để điều chỉnh đoạn mã đó?


Điều đầu tiên cần làm là làm lại câu lệnh if đơn giản để có được đoạn mã đường thẳng tương đương sử dụng ghép kênh:


 bit = (x == 0) // bit = 1 if x == 0 otherwise 0 y = 3 * bit + y * (1 - bit) // y = 3 if bit == 1 otherwise no change z = z * bit + 7 * (1 - bit) // z = 7 if bit == 0 otherwise no change


Trong lần thứ hai, nhà phát triển phải truyền bá sự thật rằng x thuộc loại được mã hóa trên các dòng tiếp theo:


 bit = fhe_is_equal(x, 0) // bit, y_new and z_new are encrypted y_new = fhe_add(fhe_mul(3, bit), fhe_mul(y, fhe_sub(1, bit))) z_new = fhe_add(fhe_mul(z, bit), fhe_mul(7, fhe_sub(1, bit)))


Người ta có thể kiểm tra xem điều này có tương đương về mặt chức năng với mục đích ban đầu của nhà phát triển hay không, thế là xong.


Nếu ngôn ngữ lập trình cho phép các toán tử gốc bị quá tải, API FHE thậm chí có thể làm cho các hàm FHE rõ ràng của đoạn mã thứ hai trở nên thừa thãi, do đó việc viết lại đầu tiên là điều duy nhất mà nhà phát triển cần làm.


Để cung cấp thêm một lượng đường cú pháp cho nhà phát triển, bạn thậm chí có thể hiển thị một toán tử ba ngôi bị quá tải a? b : c trong đó bất kỳ đối số nào cũng có thể được mã hóa hoặc không. Đoạn mã thậm chí còn trở nên đơn giản hơn:


 bit = (x == 0) // bit = 1 if x == 0 otherwise 0 y_new = bit? 3: y // y = 3 if bit == 1 otherwise no change z_new = bit? z: 7 // z = 7 if bit == 0 otherwise no change


Điều này dễ dàng khái quát hóa thành các câu lệnh if/switch tùy ý: mỗi khi có một điều kiện được mã hóa để kiểm tra, nhà phát triển chỉ cần sử dụng tính năng ghép kênh để hợp nhất nhiều nội dung của câu lệnh thành một khối mã đường thẳng tương đương.

Cách thường xuyên hóa vòng lặp for/while

Giờ đây, các cấu trúc vòng lặp liên quan đến các điều kiện được mã hóa có thể được chính quy hóa theo tinh thần tương tự. Lấy ví dụ


 for (i = 0; i < x; i++) do <body> // i is plain, x is encrypted


trong đó x là loại được mã hóa. Đầu tiên, phân tách nó thành một câu lệnh for đơn giản và một câu lệnh if bất quy tắc:


 for (i = 0; i < known_max_value_of_x; i++) do if (i < x) then <body> // i is plain, x is encrypted


và sau đó chuẩn hóa câu lệnh if như trước:


 for (i = 0; i < known_max_value_of_x; i++) do bit = (i < x) // i is plain, x and bit are encrypted <new_body> // new body regularized using bit? _ : _


Lưu ý rằng điều này đòi hỏi một giá trị ngay lập tức known_max_value_of_x . Giá trị tối đa được hỗ trợ bởi loại x được mã hóa có thể được sử dụng theo mặc định, nhưng trong nhiều trường hợp, nhà phát triển biết giới hạn trên tốt hơn nhiều đối với x , điều này cho phép giảm tổng số vòng lặp xuống mức tối thiểu nghiêm ngặt.


Cuối cùng, các phép biến đổi trên có thể dễ dàng khái quát thành một phương pháp có hệ thống để chính quy hóa luồng điều khiển không đều, giúp các lập trình viên dễ dàng tiếp thu và bổ sung vào thói quen viết mã của mình.

Ví dụ: hợp đồng thông minh bí mật trên EVM

FhEVM của Zama là một khung nguồn mở hoàn chỉnh để phát triển và triển khai các hợp đồng thông minh bí mật trên Máy ảo Ethereum (EVM). Hợp đồng fhEVM là các hợp đồng Solidity đơn giản được xây dựng bằng chuỗi công cụ Solidity truyền thống. Trải nghiệm nhà phát triển quen thuộc được tăng cường FHE bởi thư viện TFHE.sol , thư viện này cung cấp các kiểu dữ liệu được mã hóa và thay thế FHE cho các chức năng tiêu chuẩn.


Các loại dữ liệu được mã hóa được hỗ trợ hiện nay


 ebool, euint4, euint8, euint16, euint32, euint64, eaddress


và các số nguyên có chữ ký được mã hóa cũng sẽ sớm được đưa vào. Các biến được mã hóa được tạo từ các bản mã đầu vào thô bằng cách sử dụng các hàm tạo chuyên dụng:


 function mint(bytes calldata encryptedAmount) public onlyContractOwner { euint64 amount = TFHE.asEuint64(encryptedAmount); balances[contractOwner] = balances[contractOwner] + amount; totalSupply = totalSupply + amount; }


Các toán tử gốc +, -, *, &, |, ^, etc của Solidity bị quá tải để thuận tiện cho nhà phát triển và các toán tử so sánh được cung cấp eq, ne, gt, lt, ge, le trả về một boolean ebool được mã hóa. Toán tử ba ngôi đồng cấu _? _ : _ được gọi là select :


 function bid(bytes calldata encryptedBid) internal { euint32 bid = TFHE.asEuint32(encryptedBid); ebool isAbove = TFHE.le(bid, highestBid); // Replace highest bid highestBid = TFHE.select(isAbove, bid, highestBid); }


Về phía thời gian chạy, fhEVM cung cấp EVM hỗ trợ TFHE trong đó các hàm đồng cấu được hiển thị dưới dạng hợp đồng được biên dịch trước, là kết quả của việc tích hợp thư viện Rust mã nguồn mở TFHE-rs .


Xem sách trắng fhEVM để biết thêm về điều này.

Cần những gì để xây dựng API FHE với TFHE?

Bạn có nhớ các chương trình TFHE thực thi trông như thế nào không, các mạng TFHE được tham số hóa được tập hợp bằng logic đơn giản? Chà, bạn chỉ cần một cách để ánh xạ logic phần mềm của nhà phát triển tới đó.


Yêu cầu đầu tiên là đảm bảo rằng logic chương trình là "đơn giản". Đó chính xác là những gì chúng tôi đã dạy nhà phát triển tự sản xuất bằng cách chuẩn hóa các câu lệnh luồng điều khiển của họ. Vì vậy, bây giờ chúng tôi thực sự tốt về điều đó.


Yêu cầu thứ hai là tất cả các hàm đồng cấu mà chương trình gọi phải được ánh xạ tới các mạng TFHE được tham số hóa được thiết lập trước. Điều này phức tạp hơn vẻ ngoài của nó vì nhiều lý do.

1. Bạn cần tạo mạng TFHE cho các chức năng API của mình

Việc thiết lập trước mạng TFHE được tham số hóa để thực hiện một chức năng nhất định không hẳn là chuyện nhỏ.


Chỉ cần xây dựng phép cộng đồng hình của 2 số nguyên không dấu 64 bit được mã hóa sẽ dẫn bạn đến nhiều tùy chọn kỹ thuật: làm cách nào để biểu diễn đầu vào 64 bit dưới dạng vectơ của số nguyên mô-đun? Chính xác với mô-đun nào (hoặc nhiều mô-đun)? Và sau đó làm thế nào để bạn nhận ra mạch cộng 64-bit với các lớp tra cứu bảng?


Nhiều sự lựa chọn ở đó. Nhưng cuối cùng bạn sẽ quyết định nhờ kỹ thuật tốt và bằng cách tiến hành nhiều thí nghiệm.

2. Bạn cần chuẩn hóa các kiểu dữ liệu được mã hóa

Giả sử bạn đã triển khai mạng TFHE cho tất cả các chức năng của API, bạn muốn đảm bảo rằng chúng có thể được cấu thành theo ý muốn giống như các khối Lego.


Điều này không nhất thiết phải được đảm bảo vì cách tốt nhất để biểu diễn cùng một loại dữ liệu được mã hóa có thể khác nhau giữa các chức năng. Vì vậy, bạn cần áp dụng một định dạng số học phổ biến để thể hiện từng loại dữ liệu được mã hóa mà không làm giảm quá nhiều hiệu quả của mạng TFHE của bạn.


Một lần nữa, có nhiều lựa chọn ở đó và bạn sẽ cần phải cân nhắc giữa chúng.

3. Bạn cần đảm bảo khả năng kết hợp thực tế

Giả sử tất cả các mạng TFHE hiện đã tương thích hoàn toàn ở định dạng đầu vào/đầu ra, khả năng kết hợp có thể vẫn chưa được đảm bảo.


Điều này là do các tham số mật mã khởi tạo một mạng TFHE có thể không tương thích với các tham số được sử dụng để khởi tạo một mạng khác. Đặc biệt nhất, mức độ nhiễu mã hóa trong các bản mã đầu vào và đầu ra phải được điều chỉnh để xác định khả năng kết hợp thực tế.


Điều đó tương tự như trở kháng trong các mạch điện tử, không có cách nào bạn có thể kết nối mạch này với mạch khác nếu có trở kháng không khớp. Trước tiên, bạn cần phải căn chỉnh mức trở kháng của chúng và điều tương tự ở đây. Cách dễ nhất để làm điều đó là sử dụng các bộ tham số cố định - thậm chí có thể chỉ là một bộ tham số duy nhất - được điều chỉnh để đảm bảo sự liên kết trên tất cả các hàm API. Sau đó, định dạng khóa chung của người dùng sẽ được sửa, cũng như các tham số được sử dụng trong mã hóa và giải mã người dùng, bất kể mã của nhà phát triển là gì.


Nếu bạn tìm ra cách đáp ứng 3 yêu cầu này khi tạo mạng TFHE và tham số hóa chúng mà vẫn đạt được hiệu suất tổng thể tốt thì xin chúc mừng! Bạn đã kéo nó ra.

Vậy tại sao lib FHE lại không đủ tốt?

Chúng đủ tốt để lập trình cho mục đích chung, một lần nữa giả sử rằng API FHE đủ toàn diện để cung cấp các thay thế đồng cấu cho tất cả các chức năng tiêu chuẩn mà nhà phát triển mong đợi, với khả năng kết hợp đầy đủ.


Nhưng chúng có thể không đủ tốt cho các chương trình chuyên về


  • các hàm lớn, đòi hỏi nhiều tính toán như trong học máy,

  • chức năng tùy chỉnh, không chuẩn.


Đó là lúc quá trình biên dịch đồng hình xuất hiện.

Con đường khó khăn: phát hành trình biên dịch đồng cấu

Con đường khó khăn bắt đầu từ đây: để giành chiến thắng trong trò chơi ngoài việc lập trình cho mục đích chung, giờ đây bạn sẽ cung cấp trình biên dịch TFHE.


Trình biên dịch sẽ đảm nhiệm những việc mà nhà phát triển không biết cách tự thực hiện. Nó sẽ được cung cấp bởi thông tin đầu vào của nhà phát triển - bất kể đó là gì, cuộc gọi của bạn - và sẽ phải hoàn thành những phần còn thiếu để có được chương trình TFHE.


Hãy xem xét các ví dụ điển hình của các ứng dụng không chuẩn.

Suy luận bí mật với mạng lưới thần kinh sâu

Bằng cách biến một mạng lưới thần kinh đơn giản thành một mạng lưới thần kinh tương đương đồng hình, nhà phát triển sẽ xây dựng và triển khai dịch vụ suy luận đồng hình trong đó đầu vào và đầu ra của người dùng được mã hóa hai đầu.

Những gì nhà phát triển cung cấp làm đầu vào

Nhà phát triển phải biết đủ rõ về cách học của máy để tạo ra một mô hình lượng tử hóa được đào tạo hoặc đã sở hữu một mô hình đó.


Các chi tiết cụ thể về cách thực hiện lượng tử hóa thực sự quan trọng ở đây, vì trình biên dịch của bạn sẽ yêu cầu mô hình về cơ bản phải là một mạng TFHE - hoặc có thể dễ dàng tuân theo một mạng thông qua việc viết lại đơn giản. Các kỹ thuật nguồn mở có sẵn được biết là hỗ trợ hình thức lượng tử hóa đó, bằng cách lượng tử hóa sau một mô hình được đào tạo trước hoặc tốt nhất là bằng cách thực hiện Đào tạo nhận thức lượng tử hóa (QAT), đạt được mức độ chính xác tiên tiến nhất so với các kỹ thuật mã nguồn mở khác. sang các mô hình không lượng tử hóa được huấn luyện trên cùng một tập dữ liệu.


Về cơ bản, các mô-đun được sử dụng trên các lớp mạng TFHE có lũy thừa thay đổi bằng 2, do đó độ chính xác của tín hiệu kích hoạt được đo bằng bit. Trọng số là số nguyên có dấu và bản thân các hàm kích hoạt được lượng tử hóa và khởi tạo dưới dạng tra cứu bảng. Khi kích hoạt lập bảng một hàm dấu hiệu cứng đã dịch chuyển với độ lệch đã học, định nghĩa này bao gồm các loại mô hình như BNN , TNN và các khái quát hóa nhiều bit của chúng. Nhưng về nguyên tắc, người ta có thể tự do sử dụng các bảng tra cứu tùy ý trong các hàm kích hoạt và do đó, những bảng đó thậm chí có thể được học trong quá trình đào tạo để đạt được độ chính xác cao hơn.


Tuy nhiên, điều mà nhà phát triển không biết cách thực hiện là chuyển đổi mạng TFHE của họ thành một tệp thực thi đồng cấu. Vì vậy, thành phần còn thiếu duy nhất ở đây chỉ là tham số hóa mật mã của mạng đó và đây là tất cả những gì trình biên dịch của bạn sẽ phải làm trước khi chuyển sang giai đoạn biên dịch back-end.

Cần những gì để tham số hóa mạng TFHE?

Hãy nhớ rằng việc tham số hóa mạng TFHE cung cấp khả năng khởi tạo mật mã có thể được thực thi. Nó cũng kiểm soát tất cả các số liệu liên quan đến việc thực thi đó, như tổng kích thước khóa chung của người dùng và tổng thời gian chạy. Do đó, việc tham số hóa có tầm quan trọng đặc biệt ở đây vì nhà phát triển đang tìm cách giảm độ trễ suy luận xuống mức tối thiểu tuyệt đối.


Có quá nhiều bậc tự do trong các tham số mật mã của mạng TFHE để có thể ép buộc tất cả chúng. Ngoài ra, các số liệu cần tối ưu hóa phụ thuộc vào 2 thành phần hoàn toàn nằm ngoài mạng và phụ thuộc vào các thuật toán mà thời gian chạy sử dụng để thực hiện các hoạt động TFHE cấp thấp:


  • Một bộ sưu tập các công thức tiếng ồn . Công thức nhiễu liên quan đến phân bố đầu vào và đầu ra của nhiễu mã hóa tại các điểm cuối của toán tử, sử dụng các tham số của toán tử làm biến chưa xác định. Việc thiết lập chúng đòi hỏi sự phân tích khoa học của con người và xác nhận bằng thực nghiệm.

  • Một tập hợp các số liệu chi phí . Số liệu chi phí dự đoán hiệu quả đa chiều (mức sử dụng bộ nhớ, thời gian chạy, v.v.) của toán tử dưới dạng hàm của các tham số của nó. Chúng thường được suy ra từ các phép đo điểm chuẩn thông qua phân tích phù hợp nhất.


Mọi thay đổi trong quá trình triển khai thời gian chạy đều phải được phản ánh trong 2 mô-đun này vì cả hai đều phụ thuộc nhiều vào thuật toán và phần cứng.


Các công thức nhiễu và mô hình chi phí của thời gian chạy, cùng với mạng TFHE đã cho, hình thành một trường hợp cụ thể của toàn bộ lớp vấn đề tối ưu hóa và trường hợp này được chuyển giao cho một trình tối ưu hóa chuyên dụng. Ở đây chúng ta đang nói về lập trình phi tuyến số nguyên hỗn hợp với nhiều mục tiêu, vì vậy việc tìm ra mặt trước Pareto của các bộ tham số tối ưu đòi hỏi phải giải quyết loại vấn đề tối ưu hóa không hề tầm thường đó.


Tạo tham số tối ưu của mạng TFHE

Sự sẵn sàng về công nghệ

Khoa học và kỹ thuật tốt đã giúp giải quyết loại vấn đề tối ưu hóa này chỉ trong vài giây và các trình biên dịch TFHE như Concrete đã có trình tối ưu hóa tham số TFHE hiệu quả như một mô-đun bên trong.


Nhiều cải tiến khác nhau có thể làm cho trình tối ưu hóa TFHE thậm chí còn nhanh hơn trong tương lai, nhưng ngay cả khi không có những cải tiến đó, người ta vẫn có thể coi việc tham số hóa mạng TFHE - gần như - là một công việc đã hoàn tất.

Xử lý dữ liệu tùy chỉnh tốc độ cao

Những gì nhà phát triển cung cấp làm đầu vào

Những ứng dụng này hoàn toàn thuộc một loại khác. Nhà phát triển giữ đặc tả toán học của hàm tùy chỉnh để triển khai, cùng với ràng buộc về độ chính xác. Lấy ví dụ

trong đó x là số thực nằm trong khoảng từ 0 đến 1 và việc sử dụng giá trị gần đúng G của F có thể chấp nhận được miễn là

Nhà phát triển biết rằng việc triển khai G ở mặt sau bằng cách soạn các hàm API tiêu chuẩn có thể sẽ quá tối ưu.


Những gì trình biên dịch của bạn sẽ làm là sản xuất - một cách nhanh chóng - một mạng TFHE mới được thiết kế đặc biệt để đáp ứng đặc điểm kỹ thuật của G . Sau đó, nó sẽ tham số hóa nó và tiến hành biên dịch back-end để tạo ra ứng dụng đồng hình.

Cần những gì để tổng hợp mạng TFHE?

Chà, đó là lúc con đường đột nhiên trở nên gập ghềnh hơn nhiều.

Ở thời điểm hiện tại, vẫn còn thiếu kiến thức khoa học về cách các mạng TFHE, với định nghĩa chính xác mà tôi đã nêu trước đó, có thể được tổng hợp một cách tự động. Ngay cả nghiên cứu về tổng hợp các loại mạch liền kề cũng dựa trên số học mô-đun có giá trị nguyên cũng rất khan hiếm. Chưa kể bất kỳ bộ tổng hợp nào hiện có có khả năng thực hiện nhiệm vụ này từ A đến Z.

Lợi dụng tổng hợp boolean

Một cách để giải quyết vấn đề là khai thác một phần sức mạnh tính toán của mạng TFHE bằng cách hạ chúng xuống các mạch boolean. Ví dụ, một nơron TFHE có thể bị buộc phải hoạt động như cổng boolean bậc ba


qua

  • đặt số lượng đầu vào của nó thành 3 và áp đặt x_1, x_2, x_3 thành các giá trị 0/1,
  • đặt mô đun của nó thành m = 4 và trọng số của nó thành (w_1, w_2, w_3) = (2, -1, 1) ,
  • đặt bảng tra cứu của nó thành [0, 1, 1, 0] .


Việc ép buộc tất cả các trọng số và bảng có thể có cùng một mô-đun, sau đó người ta có thể tạo thành một từ điển các nơ-ron TFHE có thể dùng để tính toán các cổng ternary. Bước tiếp theo bao gồm


  • sử dụng công cụ tổng hợp boolean để tạo mạch boolean từ thông số kỹ thuật của nhà phát triển (có nhiều công cụ nguồn mở để thực hiện việc này),
  • cắt (hay còn gọi là phân vùng LUT 3 chiều) mạch thành các cổng ternary thuộc từ điển,
  • thay thế các cổng bậc ba này bằng các nơ-ron tương đương,
  • định hình lại mạch thành một mạng lớp có độ sâu tối thiểu.


Đây chỉ là một chiến lược minh họa trong số nhiều chiến lược khác vì có rất nhiều phương pháp dựa vào mạch boolean. Bạn cũng có thể chỉ xem xét các cổng nhị phân thông thường và triển khai chúng với các nơ-ron TFHE bị ràng buộc. Cingulata của CEA và - sau này - bộ chuyển mã FHE của Google đã đi tiên phong một cách chính xác trên con đường đó với TFHE.

Sự sẵn sàng về công nghệ

Tổng hợp Boolean sử dụng các kỹ thuật tối ưu hóa mạch tích cực và nói chung là một vấn đề kỹ thuật đã được giải quyết - hoặc gần như vậy, làm cho cách tiếp cận đó trở nên hợp lý và thiết thực đối với người xây dựng trình biên dịch.


Tuy nhiên, khi mạng TFHE được tạo theo cách đó, chiều rộng và chiều sâu của nó có thể cao bất thường, dẫn đến hiệu suất tổng thể kém. Vì vậy, có một sự nghi ngờ rộng rãi rằng bằng cách nới lỏng điều kiện boolean - hoàn toàn nhân tạo - của các tế bào thần kinh TFHE, người ta có thể tận dụng toàn bộ khả năng biểu đạt của chúng và có được các mạng nhỏ hơn, nông hơn nhiều.


Nhưng một lần nữa, cần nhiều nghiên cứu hơn để xác định rõ ràng cách thực hiện điều đó. Có thể các cách tiếp cận hoàn toàn khác nhau, chẳng hạn như học mạng TFHE với một số phương pháp đào tạo phù hợp mượn từ học máy, sẽ mang lại kết quả vượt trội. Thời gian sẽ trả lời.

Nhiệm vụ tìm kiếm một trình biên dịch TFHE toàn diện

Giả sử rằng vấn đề tổng hợp của chúng ta đã được giải quyết và mang lại các mạng TFHE tùy chỉnh hiệu quả, bạn sẽ thấy mình sẵn sàng kết hợp tất cả các phần chuyển động lại với nhau và thiết kế một trình biên dịch thực hiện toàn bộ công việc:


  1. Nó sẽ lấy đầu vào là một chương trình đơn giản, trong đó các biến nhạy cảm được chú thích đơn giản là được mã hóa.

  2. Nó sẽ chấp nhận các mạng thần kinh được đào tạo trước hoặc các mô hình học máy khác và diễn giải lại chúng dưới dạng mạng TFHE.

  3. Nó sẽ chấp nhận các mô hình chức năng vừa được tạo thành từ một đặc tả toán học và sẽ thực hiện tổng hợp nhanh chóng để tạo ra các mạng TFHE tùy chỉnh.

  4. Nó sẽ biến tất cả các mạng TFHE không được tham số hóa còn sót lại trong đơn vị biên dịch thành các phiên bản có thể thực thi được bằng cách sử dụng mô-đun tối ưu hóa bất cứ khi nào được yêu cầu.

  5. Nó sẽ thực hiện giai đoạn back-end của quá trình biên dịch cho nhiều thời gian chạy TFHE mục tiêu hoặc/và kiến trúc phần cứng.

  6. Nó sẽ tận dụng các bộ tăng tốc phần cứng cụ thể (thông qua mô hình chi phí của chúng) để cho phép tổng hợp và tham số hóa các mạng TFHE nhanh hơn.


Chết tiệt, bạn cũng có thể đưa vào đó một số hỗ trợ để tự động hóa quy trình điều khiển, để nhà phát triển thậm chí không cần phải quan tâm đến nó nữa.


Điều đó sẽ mang lại cho người xây dựng ứng dụng FHE trải nghiệm phát triển tối ưu.

Bản tóm tắt

Trong bối cảnh lập trình FHE có mục đích chung, thư viện TFHE có thể cung cấp tính mô-đun và trải nghiệm phát triển hoàn toàn tự chủ với các chuỗi công cụ hiện có.


TFHE đi tiên phong trong các kỹ thuật biên dịch cụ thể có thể đáp ứng nhu cầu của nhà phát triển ngoài điểm đó, đặc biệt nhất là suy luận máy học được mã hóa và trong những năm tới là để xử lý dữ liệu được mã hóa tốc độ cao và các ứng dụng FHE tùy chỉnh khác.


Nhìn chung, TFHE cung cấp một lộ trình công nghệ rõ ràng để tạo ra các chuỗi công cụ FHE tích hợp và thích ứng hơn, có thể tạo nên bước tiến lớn trong thế giới phát triển phần mềm, đồng thời tạo ra một làn sóng giải pháp mới ưu tiên quyền riêng tư mà bất kỳ ai cũng có thể xây dựng và vận hành một cách dễ dàng chưa từng có.


Bằng cách chỉ tập trung vào các mạng tra cứu TFHE, tôi vừa sử dụng một mô hình tính toán trong số nhiều mô hình mà TFHE có thể hỗ trợ. Khi nghiên cứu ngày càng khám phá nhiều khả năng của nó hơn, chắc chắn rằng những cách mới để sử dụng thiết bị TFHE sẽ xuất hiện.


Cái nào và khi nào là một câu chuyện khác. Nhưng đằng sau câu chuyện đó ẩn chứa rất nhiều câu hỏi thú vị và có khả năng khai sáng khác liên quan đến tương lai của điện toán bí mật.


Ghi công cho Midjourney v6, với một chút hướng dẫn của tác giả