Keyword

    Kiến trúc blockchain mang tính cách mạng của Internet Computer

    Internet Computer là tên mạng của blockchain DFINITY. DFINITY cố gắng phân cấp tài nguyên của tất cả các máy tính chạy giao thức thông qua một giao thức mở được xây dựng ở lớp trên của giao thức IP. Nó sử dụng blockchain, mật mã và các công nghệ khác để ảo hóa nó ở trên cùng một môi trường vận hành phần mềm an toàn và đáng tin cậy không có các thành phần truyền thống.

    Hệ thống mạng Neuron (NNS)

    Internet Computer dựa trên một giao thức blockchain điện toán được gọi là Internet Computer Protocol (ICP). Bản thân mạng được thiết kế theo cấu trúc phân lớp. Lớp dưới cùng là một trung tâm dữ liệu độc lập (Data Centers) lưu trữ các node phần cứng chuyên dụng (Node). Các node này được kết hợp để tạo ra các subnet. Subnet chính chạy các canister chứa phần mềm (Canister), là các đơn vị tính toán cơ bản có thể tương tác được, do người dùng tải lên, chứa các mã và trạng thái. Có thể coi Canister như các Smart Contract của blockchain Internet Computer.

     

     

    Tính duy nhất của ICP là hệ thống nơ-ron mạng (NNS) của nó, chịu trách nhiệm điều khiển, cấu hình và quản lý mạng. Bản thân NNS là một hệ thống quản trị mở, hệ thống này giám sát các điều kiện truy cập của mạng. Theo một nghĩa nào đó, trách nhiệm của nó tương tự như ICANN trên Internet (ICANN gán số hệ thống cho các máy muốn chạy định tuyến BGP). NNS đảm nhận vai trò của một loạt các nhà quản trị mạng, bao gồm giám sát các máy tính chạy nodes để tìm ra các sai lệch thống kê trên mạng Internet Computer, từ đó xác định các yêu cầu về hiệu suất và kiểm tra các lỗi xử lý.

    NNS cũng đóng một vai trò quan trọng trong kinh tế học token. NNS tạo mã thông báo ICP mới (trước đây được gọi là mã thông báo DFN) để thưởng cho các node. Các node được chia thành hai loại, một là node phần cứng chuyên dụng chạy trong các trung tâm dữ liệu và node kia là node thần kinh biểu quyết được tạo bằng cách thế chấp ICP trong NNS , các node nơron thần kinh chi phối các đề xuất trong mạng. Khi NNS phát hành mã thông báo ICP mới để thưởng cho các trung tâm dữ liệu và tế bào thần kinh, đây là một phần của lạm phát.

     

     

    Cuối cùng, chủ sở hữu trung tâm dữ liệu và chủ sở hữu neuron có thể nhận được mã thông báo ICP và có thể giao dịch với chủ sở hữu và người quản lý canister. Chủ sở hữu và người quản lý canister chuyển đổi các mã thông báo này thành các Cycles, sau đó sử dụng các Cycles này để tính phí cho các canisters của họ (nghĩa là thanh toán phí gas cho các canisters chạy dapps).
    Ví dụ, khi các canister này thực hiện tính toán hoặc lưu trữ bộ nhớ, các Cycles cần được tiêu thụ trong toàn bộ quá trình, sau khi các Cycles cạn kiệt, chúng phải được bổ sung thêm các Cycles mới (bằng cách đốt các mã thông báo ICP để chuyển đổi thành các Cycles) trước khi chúng có thể tiếp tục chạy. Đây là phần giảm phát mã thông báo ICP.

    Subnet

    Để hiểu Internet Computer, trước tiên bạn phải hiểu khái niệm subnet, là một phần cơ bản của toàn bộ mạng. Subnet chịu trách nhiệm lưu trữ các tập hợp con khác nhau của các canisters trong mạng Internet Computer. Dưới sự điều khiển của NNS, các máy chạy node được trích xuất từ các trung tâm dữ liệu khác nhau được tập hợp lại với nhau để tạo ra các subnet. Các node này hợp tác thông qua ICP để sao chép đối xứng dữ liệu và các phép tính liên quan đến vùng chứa phần mềm mà chúng lưu trữ.

     

     

    NNS hợp nhất các nodes từ các trung tâm dữ liệu độc lập khi xây dựng các subnet. Bằng cách sử dụng khả năng chịu lỗi Byzantine và mật mã do DFINITY phát triển, giao thức ICP có thể đảm bảo rằng subnet chống được giả mạo và không bao giờ ngừng hoạt động. Mặc dù subnet là một phần cơ bản của toàn bộ mạng Internet Computer, chúng gần như trong suốt với người dùng và phần mềm. Người dùng và phần mềm canisters chỉ cần biết danh tính của canisters để gọi các chức năng dùng chung của nó mà không cần biết chúng thuộc subnet nào.

    Tính trong suốt với người dùng này là một phần mở rộng các nguyên tắc thiết kế cơ bản của Internet. Trên internet truyền thống, nếu người dùng muốn kết nối với một phần mềm nào đó, họ cần biết địa chỉ IP của máy tính đang chạy phần mềm và cổng TCP mà phần mềm đang nghe. Trên Internet Computer, nếu người dùng muốn gọi một hàm, anh ta chỉ cần biết danh tính của vùng chứa canister và chữ ký của hàm. Giống như cách internet tạo ra một kết nối liền mạch, DFINITY cũng tạo ra một thế giới liền mạch cho phần mềm, trong đó bất kỳ phần mềm được cấp phép nào cũng có thể gọi trực tiếp bất kỳ phần mềm nào khác mà không cần biết hoạt động cơ bản của mạng.

    Internet Computer cũng đảm bảo tính trong suốt của subnet theo những cách khác. NNS có thể tách và hợp nhất các subnet để cân bằng tải của toàn mạng. Tất nhiên, điều này cũng không bị ảnh hưởng đối với các vùng chứa được quản lý.

     

     

    Trong ví dụ này, chúng ta có một subnet ảo ABC, chứa 11 canisters chứa phần mềm. NNS cho biết cần phải chia nhỏ mạng để mở rộng hiệu suất, lúc này subnet ABC sẽ tiếp tục lưu trữ các canisters 1–6, nhưng đồng thời một subnet mới XYZ sẽ được tạo ra để lưu trữ các canisters 7–11. Trong quá trình mở rộng, tất cả các canisters có liên quan sẽ không bị gián đoạn dịch vụ.
    Khi tải một vùng chứa canister lên Internet Computer, một loại subnet cụ thể phải được chỉ định. Trên thực tế, có một subnet đặc biệt dành riêng cho NNS và bạn không thể tải vùng chứa lên subnet này. Thay vào đó, bạn phải chỉ định loại subnet, chẳng hạn như “dữ liệu”, “hệ thống” hoặc “ủy thác”.

     

    Mỗi loại subnet cung cấp các thuộc tính và chức năng nhất định cho vùng chứa canister. Ví dụ: nếu canister được lưu trữ trong một subnet dữ liệu, nó có thể xử lý các cuộc gọi, nhưng không thể gọi các canister khác. Để gọi các canister khác, bạn cần một subnet hệ thống. Nếu bạn muốn canister của mình duy trì số dư mã thông báo ICP hoặc gửi Cycles đến các canister khác, bạn cần có một subnet đáng tin cậy. Vì những lý do này, các canisters quản trị chỉ có thể được lưu trữ trong các subnet đáng tin cậy.

     


    Chức năng của subnet một phần bắt nguồn từ khả năng chịu lỗi của lớp dưới cùng. Đây là một lĩnh vực thú vị trong lĩnh vực khoa học cơ bản và chúng tôi hy vọng sẽ sớm chia sẻ nó với công chúng, bao gồm các công nghệ mã hóa mới cho phép NNS sửa chữa các subnet bị hỏng.

    Các vùng chứa (Canisters)

    Mục đích của node là lưu trữ các canisters. Canister chạy trong một chương trình quản lý chuyên dụng và tương tác với các canister khác thông qua các API được chỉ định công khai. Canister chứa mã byte WebAssembly có thể chạy trên máy ảo WebAssembly và các trang dữ liệu bộ nhớ chạy trong đó. Nói chung, mã byte WebAssembly này có thể được tạo bằng cách biên dịch một ngôn ngữ lập trình như Rust hoặc Motoko. Bytecode sẽ chứa thời gian chạy (runtime), cho phép các nhà phát triển dễ dàng tương tác với API.

     

     

    Trên Internet Computer, có hai cách để gọi hàm được chia sẻ bởi canister: lệnh gọi cập nhật (update) hoặc lệnh gọi truy vấn (select). Sự khác biệt cơ bản là khi bạn gọi hàm dưới dạng lệnh gọi cập nhật, mọi thay đổi được thực hiện đối với dữ liệu trong bộ nhớ của canister sẽ được giữ lại và nếu bạn gọi hàm dưới dạng lệnh gọi truy vấn, mọi thay đổi đối với bộ nhớ đều sẽ bị loại bỏ sau khi chạy.

    Các thay đổi của lệnh gọi cập nhật là liên tục và chúng có khả năng chống giả mạo vì giao thức máy tính blockchain ICP chạy chúng trên mọi node của subnet. Như bạn có thể mong đợi, các cuộc gọi này nằm trong một chuỗi cuộc gọi toàn cầu nhất quán, cho phép thực hiện đồng thời trong một môi trường thực thi hoàn toàn xác định. Cuộc gọi cập nhật có thể được hoàn thành sau hai giây (2s).

    Trong ví dụ này, người dùng gửi yêu cầu đến một ứng dụng trao đổi được lưu trữ trong một canister.

    Ngược lại, lệnh gọi truy vấn không giữ lại các thay đổi. Mọi thay đổi mà chúng thực hiện đối với bộ nhớ sẽ bị loại bỏ sau khi chạy. Chúng rất hiệu quả và rẻ, có thể hoàn thành chỉ trong vài mili giây. Điều này là do chúng không chạy trên tất cả các nodes trong subnet, điều này cũng có nghĩa là chúng cung cấp mức độ bảo mật thấp hơn.


    Trong ví dụ này, người dùng yêu cầu một trang tin tức được tùy chỉnh và nội dung mới được tạo có sẵn ngay lập tức.

    Lưu trữ tự động, tồn tại trực giao

    Cách các nhà phát triển lưu trữ dữ liệu là một trong những tính năng thú vị nhất của Internet Computer. Các nhà phát triển không cần phải suy nghĩ về sự bền bỉ, họ chỉ cần viết mã và sự kiên trì sẽ tự động xảy ra. Đây được gọi là độ bền trực giao. Điều này là do Internet Computer giữ các trang dữ liệu bộ nhớ trong các canisters.

    Bạn có thể tự hỏi làm thế nào tất cả điều này hoạt động. Đối với các lệnh gọi cập nhật có thể gây ra thay đổi cho các trang dữ liệu bộ nhớ, canister là trình thực thi phần mềm. Điều này có nghĩa là chỉ có thể có một luồng thực thi trong vùng chứa canister tại bất kỳ thời điểm nào.

    Mặc dù chỉ có một luồng thực thi trong canister, các lệnh gọi cập nhật vùng chứa canister chéo có thể được xen kẽ theo mặc định. Điều này xảy ra khi lệnh gọi cập nhật thực hiện lệnh gọi cập nhật vùng chứa canister chéo, lệnh này sẽ chặn, cho phép luồng thực thi chuyển sang lệnh gọi cập nhật mới.

    Ngược lại, các cuộc gọi truy vấn không thực hiện các thay đổi vĩnh viễn đối với bộ nhớ. Bằng cách này, tại bất kỳ thời điểm nào cũng có thể có bất kỳ số lượng luồng đồng thời xử lý các lệnh gọi truy vấn trong canister. Các lệnh gọi truy vấn này được chạy dựa trên ảnh chụp nhanh bộ nhớ được ghi lại ở trạng thái gốc cuối cùng.

    Cuối cùng, các canister có thể tạo ra các canister mới và các canister cũng có thể tự phân nhánh. Bạn chỉ cần chỉ định bytecode của WebAssembly để tạo canister mới và trang dữ liệu bộ nhớ bắt đầu trống. Khi canister phân tách, một bản sao mới sẽ được tạo ra, bản sao này giống với trang bộ nhớ trong. Bởi vậy, khi các dịch vụ trên Internet Computer mở rộng, khả năng fork sẽ xảy ra rất mạnh mẽ.

    Khả năng mở rộng

    Bây giờ, hãy nói về khả năng mở rộng của các dịch vụ Internet Computer. Các loại canister khác nhau có giới hạn dung tích của riêng chúng. Ví dụ: do những hạn chế trong việc triển khai WebAssembly, một canister chỉ có thể lưu trữ 4GB bộ nhớ (có thể tăng lên trong tương lai). Do đó, khi chúng ta muốn tạo ra các dịch vụ Internet có thể mở rộng đến hàng tỷ người dùng, chúng ta phải sử dụng kiến trúc nhiều canister. Chúng ta có thể tạo một canister đặc biệt, để tạo nhiều bản sao của canister, sau đó phân mảnh nội dung người dùng thành các canister khác nhau nhằm tạo ra một dịch vụ Internet có thể mở rộng. Tuy nhiên, do nhiều nguyên nhân mà kiến trúc này sẽ đơn giản hơn vậy.

     

     

    Thật vậy, mỗi canister bổ sung sẽ tăng dung lượng bộ nhớ tổng thể và việc tăng số lượng vùng chứa canister sẽ tăng thông lượng các lệnh gọi truy vấn và cập nhật tổng thể, nhưng chúng ta không thể mở rộng yêu cầu gọi truy vấn cho nội dung người dùng cụ thể. Bất cứ khi nào chúng ta tăng dung lượng hệ thống bằng cách thêm nhiều canister hơn, chúng ta cần tải lại các canister để đồng bộ nội dung người dùng. Đây không phải là một kiến trúc có thể mở rộng thực sự. Cũng không có cách nào dễ dàng để cung cấp dữ liệu từ bản sao gần nhất cho người dùng cuối trong quá trình truy vấn. Chúng ta sẽ cần một kiến trúc hai tầng, gọi là front-end container và back-end container.

    Internet Computer cung cấp một số chức năng thú vị có thể neo người dùng cuối vào vùng chứa front-end, chẳng hạn như cho phép tên miền được ánh xạ tới nhiều vùng chứa front-end thông qua NNS (như DNS). Khi người dùng cuối muốn phân giải một tên miền như vậy, Internet Computer sẽ xem xét tổng số nodes copy trong tất cả các subnet lưu trữ vùng chứa front-end và trả về địa chỉ IP của node gần nhất. Điều này khiến người dùng cuối thực hiện các lệnh gọi truy vấn trên bản sao gần nhất, do đó giảm độ trễ mạng vốn có và cải thiện trải nghiệm người dùng, mang lại lợi thế tính toán biên trong trường hợp không có mạng phân phối nội dung (CDN).

    Để tận dụng hết tính năng này, chúng ta cần cấu trúc hai tầng cổ điển bao gồm một vùng chứa front-end và một vùng chứa dữ liệu back-end. Trong ví dụ này, trình duyệt web muốn tải ảnh hồ sơ.

    Bước 1: Trình duyệt web sẽ được ánh xạ tới vùng chứa front-end, chạy trên subnet với các node lân cận. Sau đó, trình duyệt web sẽ gửi yêu cầu gọi truy vấn đến một node gần đó để lấy ảnh.

    Bước 2: Vùng chứa giao diện người dùng sẽ đưa ra yêu cầu gọi truy vấn vùng chứa chéo tới vùng chứa dữ liệu lưu ảnh.

     

     

    Bước 3: Nếu phản hồi cuộc gọi truy vấn được trả về bởi vùng chứa dữ liệu liên quan đến nội dung tĩnh (chẳng hạn như ảnh), thì dữ liệu có thể được lưu trữ trong bộ nhớ cache. Trong trường hợp này, node bản sao đang chạy lệnh gọi truy vấn của vùng chứa phía trước có thể lưu trữ phản hồi (tức là dữ liệu) của lệnh gọi truy vấn trong bộ đệm truy vấn của nó.

     

    Bước 4: Cơ chế bộ đệm truy vấn và lệnh gọi hoàn toàn không trong suốt với mã vùng chứa front-end. Khi vùng chứa front-end được người dùng gọi đã thu thập tất cả thông tin cần thiết, nó có thể trả về nội dung thông qua phản hồi cuộc gọi truy vấn hoặc yêu cầu HTTP.

     

    Theo thời gian, bộ nhớ đệm truy vấn của node sẽ tích lũy nội dung tĩnh và tạo ra dữ liệu được người dùng gần đó quan tâm, do đó cung cấp cho họ trải nghiệm người dùng nhanh hơn và tốt hơn. Bằng cách này, kiến trúc cạnh gốc của Internet Computer cung cấp các lợi thế của mạng phân phối nội dung mà không yêu cầu các nhà phát triển phải làm bất cứ điều gì đặc biệt và không cần sự trợ giúp của một dịch vụ độc quyền riêng biệt.

     

    Đối với lệnh gọi cập nhật, cấu trúc hai tầng cổ điển sử dụng một phương pháp khác. Các bản cập nhật cho nội dung và dữ liệu của người dùng phải được tuần tự hóa để ngăn ngừa các vấn đề như thiếu bản cập nhật. Thông thường, điều này đạt được bằng cách tính toán giá trị băm của người dùng và ánh xạ người dùng đến một vùng chứa giao diện người dùng cụ thể.

     

    Sau khi UX/UI chạy trên trình duyệt web hoặc điện thoại thông minh đã xác định vùng chứa giao diện người dùng nào chịu trách nhiệm điều phối các thay đổi đối với nội dung hoặc dữ liệu nhất định, nó có thể gửi lệnh gọi cập nhật thông qua giao diện chuẩn để sửa đổi nội dung hoặc dữ liệu.

    Sau đó, vùng chứa canister giao diện người dùng này thường thực hiện nhiều lệnh gọi cập nhật vùng chứa canister chéo hơn để triển khai các thay đổi được yêu cầu.

     

    Dịch vụ Internet mở

    Để tóm tắt, chúng ta hãy thảo luận về thiết kế của một dịch vụ Internet mở sử dụng kiến trúc hai tầng sử dụng canister front-end và canister back-end. Đầu tiên, khi bạn viết mã canister front-end, bạn sẽ đơn giản hóa công việc của mình bằng cách sử dụng một lớp thư viện hiện có được gọi là BigMap.

     

    BigMap có thể lưu trữ exabyte (một tỷ byte, khoảng một triệu terabyte) dữ liệu và ghi các đối tượng chỉ với một dòng mã. Bằng cách sao chép canister front-end và canister nhóm dữ liệu, đồng thời chia sẻ trách nhiệm giữa hai canister, kiến trúc có thể được mở rộng theo chiều ngang một cách minh bạch và tự động.

    Cuối cùng, để tạo một dịch vụ Internet thực sự mở, bạn cần gán tất cả các trách nhiệm canister cho một canister quản trị mã hóa mở. Nếu bạn là một doanh nhân, bạn có thể gây quỹ phát triển bằng cách bán một số mã thông báo quản trị trong giai đoạn đầu. Bạn có thể thiết kế một số kế hoạch để thúc đẩy những người tham gia sớm vào các dịch vụ Internet bằng cách cung cấp cho họ các ưu đãi về mã thông báo quản trị, để có được hiệu ứng mạng tốt hơn và giành chiến thắng trong cạnh tranh.

    Nguồn: DfinityFun

    Windy