以太坊是最受歡迎的加密貨幣之一的鼻祖 – 然而,它的意義遠不止於此。得益於演算法,加密貨幣可以完全自主管理。但「智能合約」如何運作以及我們在這條道路上處於什麼位置?
智能合約在以太坊中如何運作?
要了解以太坊智能合約的原理,首先有必要短暫了解程式語言的世界。常見的程式語言基本上分為兩類:解釋型語言和編譯型語言。在第一組中,程式是用高階語言編寫的,然後由解釋器執行。兩個流行的例子是 Python 和 JavaScript。解釋型語言在許多應用程式領域(例如網路)中很常見,因為它們可以讓您立即開始使用。它們也非常通用,可以跨不同平台使用,無需額外的工具。
相反,也有編譯語言,編譯器首先將程式文字轉換為另一種語言 – 通常是二進位機器碼。此二進位代碼與平台相關,並且直接在處理器上執行。編譯器可以(並且應該)為處理器的指令集(例如 ARM 或 Intel 相容的 CPU)產生自訂程式碼。這種類型的著名代表是 C 和 Rust。
然而,現實一如既往地比這些簡單類別所暗示的更為複雜。一段時間以來,出現了混合形式,例如 Java。這是因為Java編譯器不會將Java程式碼直接翻譯成「真正的」機器碼,而是翻譯成特殊的中間格式。然後,這種中間格式由解譯器(Java 虛擬機器)在處理器的特定架構上執行。
以太坊智能合約也以類似的方式運作。以太坊中驗證交易和挖掘新貨幣的所有節點都包含以太坊虛擬機器(EVM)的實例。以太坊的技術規格黃皮書詳細定義了支援 EVM 的指令 – 以及它們應該如何執行。
這是一項專有開發,具有許多特殊性:
與外界的互動是不可能的:所有演算法決策都必須來自區塊鏈及其交易。
算術基於 256 位元值,以便更輕鬆地處理更大的地址和金額。
整合了哈希函數等特殊操作以提高效能。
所有指令都分配有成本(燃料)函數,該函數大致對應於所需的執行時間和所需的記憶體量。計量一詞在英語中常用。
在 EVM 上編程
與 Java 生態系統一樣,有多種程式語言可以使用 EVM 編譯器。最常見的語言是 Solidity,它表面上(語法上)讓人想起 JavaScript。截至 2020 年底,以太坊的文檔列出了另外兩種語言:基於 Python 的 Vyper 和完全獨立開發的 Yul Plus。
所有這些語言的共同點是它們都是特定領域的,因為與通用語言不同,它們佔據了一個具有特殊特徵的利基市場,特別是一個特殊的執行引擎:EVM。當然,這些領域特定語言(DSL)基本上是降低應用程式複雜性的好主意。
但對 EVM 來說,這似乎沒有什麼意義。畢竟,它可以——儘管缺乏與區塊鏈之外的世界互動的可能性——執行任意演算法,所以它(簡單地說)是圖靈完備的。
為什麼不使用現有的語言和運行時?
如果有必要,那麼功能就必須被刪除,但人們可以依靠更長的經驗、更穩定的工具以及——更重要的是——更廣泛的程式設計師基礎。事實上,眾所周知,當今編程語言的流行不僅取決於人們可以以特別簡潔、類型安全或動態的方式進行編程,而且還取決於人們可以輕鬆訪問大量現有的庫和包。 JavaScript 尤其體現了這種時代的變化,它經常因其粗糙的語義而受到批評,但它必須被視為自最晚第 100 萬個 NPM 套件以來最流行的程式語言。
WebAssembly,一種通用中間語言
以太坊規範背後的人們得出的結論是,一些問題可以透過放棄客製化開發而採用通用語言來解決。 Web 上正在進行的開發是多麼方便,以建立 JavaScript 的替代方案:WebAssembly (WASM)。它既是一種通用中間語言,也是一種二進位格式,並結合了解譯器規範。顧名思義,這個開放標準最初是為網路設計的。同時,其他應用領域(例如智慧型手機應用)也得到了研究。
WASM的發展是由微軟、Google、蘋果等產業巨頭所推動的。該語言的特點是它是為了可移植性而從頭開始設計的。許多現有的程式語言(例如 Rust、C++ 或 Go)已經可以編譯 Web 彙編,這一事實可以看出這一點。