以上每一層都包含了執行特定任務的元件和服務,以確保所有參與節點之間的安全通訊,與網路效能。
對開發者來說這些結構與元件都是無感的。但是,如果要在本地部署測試網,開發和部署過程中的某些步驟會與圖中的元件互動,這主要因為網際網路計算機帶來的變化較大,這樣能讓開發者在工作時更有流程感與真實感。
怎麼開發網際網路計算機上的軟體?
對開發者來說,網際網路計算機的框架極大地簡化了軟體的設計、搭建和部署。Motoko 是框架中一個重要的組成部分,這是專門為這個系統設計的通用程式語言,它能幫助開發者充分地利用網際網路計算機提供的獨特功能,包括:
-直接使用 actor 物件和類定義程式;
-使用 async 和 await 語法來處理非同步訊息傳遞,讓它近似於同步處理;
-自動支援訊息的序列化和反序列化;
-“正交永續性”:無需維護或管理外部資料庫或儲存卷。
Motoko 作為高階程式語言,提供了一些關鍵特性,包括:
-支援大整數操作和溢位保護;
-具備型別檢測系統,能靜態地檢查每個程式,以確保它在任何輸入下都可以執行,而沒有型別錯誤;
-支援函式抽象、使用者自定義的型別、使用者自定義 actors。
容器、actor 與程式碼的關係
在使用 Motoko 語言編碼程式時,要記住的一個最重要的原則:Motoko 是基於 actor 模型的。actor 是一種特殊的物件,它以隔離狀態來處理訊息,允許遠端和非同步地處理訊息。網際網路計算機的許多關鍵特性都依賴於這種安全高效的非同步訊息處理。
通常,每個 actor 物件都包含了一個應用程式的程式碼。程式的 Motoko 程式碼被編譯並部署為 WebAssembly 模組,還包括一些環境配置資訊和介面說明,這些內容以一個軟體容器的形式被髮布。
為什麼使用 WebAssembly 執行程式碼?
WebAssembly 是一個通用的低階計算機指令格式。它定義了一種可移植的、開放的標準二進位制格式,這樣格式相容範圍很廣,非常適合用來部署在網際網路計算機上執行的軟體。
但是現在支援編譯 WebAssembly 的主要程式語言(如,C 或 C++)還不夠安全,或者像 Rust 那樣學習起來非常困難。使用 Motoko ,開發者可以在得益於簡單且高階的語言同時,將程式編譯成 WebAssembly 格式,安全地部署應用程式。
Motoko 提供了許多其他高階現代語言所共有的特性,比如型別安全和模式匹配等。除此之外,Motoko 還預設支援了使用 actors 型別定義訊息傳輸服務,這種方式特別適用於網際網路計算機。
包括程式與狀態的軟體容器
“軟體容器”和程式設計中常說的”容器“相似,它包含了執行一個服務需要的已編譯程式碼和相關檔案。比如,容器包含了介面描述,終端使用者可以使用這個介面向程式傳送請求。而有一個重要的區別在於,這裡說的軟體容器還包含了程式關聯的狀態值。
由程式和狀態組成了軟體容器,這一點非常重要,因為當透過向介面傳送訊息來呼叫容器功能時,只有兩種型別的呼叫:
-查詢呼叫:允許使用者查詢容器的當前狀態,或呼叫對狀態進行操作但不更新狀態的函式。
-更新呼叫:會更改容器的狀態,或控制該容器對一個或多個其他容器進行更新呼叫。
我們可以透過任何託管了該容器的節點進行查詢呼叫,該呼叫可以瞬時響應。因為需要更改容器的狀態,更新呼叫可能會花費一些時間,使用基於 actor 的模型程式設計(具有狀態隔離)可以進行併發和非同步處理。
在更新呼叫中,當狀態更改完成時,會把響應訊息寫入一個迴圈日誌中。使用者可以透過任何託管了該容器的節點查詢,從迴圈日誌中讀取資料獲得最新狀態。響應訊息的大小是受限的,並且只能儲存有限的時間。
容器中包含了程式的狀態值,每個 actor 物件都在隔離狀態下,對部署在非同步處理網路上的容器執行更新操作。理解這個過程,是用好網際網路計算機的關鍵。
可以把網際網路計算機看作一個託管軟體容器的分散式計算平臺。一但軟體容器部署到網際網路計算機上,使用者就可以透過前端與軟體進行互動,從而享受軟體的服務。
資源使用
通常,所有的容器都以 CPU 週期的形式計算消耗資源,用於邏輯執行、訊息路由、資料儲存。為了防止作惡者透過耗盡資源攻擊網路,網際網路計算機對容器進行彈性擴容,使其適應當前的網路負載。這讓軟體總能獲得執行所需的資源,而不必開發者自己去操心未來的可擴充套件性。