
從波卡發布的2025 路線圖來看, PolkaVM無疑是最重要的技術更新之一,而最先部署和應用的一個就是對Solidity 的支持,在Westend 的Asset Hub 上。大家首先需要了解的是這個實作不是之前的Frontier,它被廣泛的應用在Moonbeam 和其他支援EVM 的平行鏈上,而是在新的基於RISC-V 的PVM 上運行Solidity 程式碼。對於許多DApp 和智能合約的開發者,這將是進入和了解Polkadot 2.0 的絕佳路徑。由於Solidity 的開發者基數大,也會為Polkadot 2.0 帶來很多的開發者,讓大家可以看到PVM 的強大和高效的執行效率。我們先看下它的基本原理和技術架構,我們的智能合約解決方案包含以下元件:
revive pallet
這是執行智能合約的區塊鏈模組。它像任何其他pallet 一樣添加了一堆外部函數和運行時API。但是,它還添加了允許區塊鏈處理以太坊風格交易的邏輯。這些特殊交易不會直接提交到鏈中。儘管這在理論上是可能的。原始碼可以在此目錄下查看:
🔗https://github.com/paritytech/polkadot-sdk/tree/master/substrate/frame/revive pallet
相反,用戶(錢包、Dapps 等)連接到與區塊鏈節點一起部署的代理伺服器。此代理程式模擬以太坊Json RPC,這意味著它將以太坊JSON RPC 介面公開為伺服器並作為網路客戶端連接到節點。它將以太坊交易重新打包成一個特殊的可調度文件,同時保持有效載荷不變。解碼以太坊交易並將其轉換為pallet-revive 可以理解的內容取決於上述邏輯。透過將以太坊交易的有效載荷逐字提交給區塊,我們可以輕鬆調整不需要處理不同交易格式的工具(例如區塊瀏覽器)。
選擇使用獨立代理是有意為之:向節點二進位檔案新增端點需要其他客戶端來實現它們。這就是我們選擇這種不需要對客戶端進行任何更改的方法的原因。
PolkaVM
這是我們與競爭技術相比做出的最明顯的改變。我們使用新的自訂虛擬機器而不是使用EVM 來執行合約。目前,我們在運行時本身包含一個PolkaVM 解釋器。稍後的更新將提供在客戶端內運行的完整PolkaVM JIT。請注意,我們仍將保持解釋器可用,以便我們可以為每個工作負載使用最合適的後端。例如,對於僅執行很少程式碼的合約調用,解釋器仍然會更快,因為它可以立即開始執行程式碼(惰性解釋)。要了解細節的可以去查看專案的原始碼:
🔗 https://github.com/paritytech/polkavm
與EVM 的兩個根本差異是:
暫存器機
EVM 是一台堆疊機。這意味著函數的參數在無限堆疊上傳遞。 PolkaVM 是基於RISC-V,這是一種暫存器機。這意味著它在一組有限的暫存器中傳遞參數。這樣做的主要好處是,由於這些都是暫存器機,因此它使轉換到底層硬體的步驟更有效率。我們仔細選擇了暫存器的數量,使它們比臭名昭著的暫存器匱乏的x86-64 指令集要小。讓我們將NP-hard 暫存器分配問題簡化為簡單的1 對1 映射是PolkaVM 快速編譯時間的秘訣。
減少字長
EVM 使用256 位元的字長。這意味著每個算術運算都必須對這些大數字執行。這使得任何有意義的數字運算都非常慢,因為它必須轉換為許多本機指令。 PolkaVM 使用64 位元的字長,這是底層硬體本機支援的。也就是說,當透過YUL(#Revive)轉換Solidity 合約時,我們仍然會得到256 位元算術,因為YUL 太低級,無法自動轉換整數類型。但是,完全可以用不同的語言編寫合約並從Solidity 無縫調用。我們設想一個系統,其中業務邏輯用Solidity 編寫,但底層架構用更快的語言編寫,類似於Python,其中大部分繁重的工作由C 模組完成。
Revive
為了在PolkaVM 上運行Solidity,我們需要將其編譯為RISC-V。為此,我們需要一個編譯器。它的工作原理是使用原始solc 編譯器,然後將其中間表示(YUL) 輸出重新編譯為RISC-V。與實作完整的Solidity 編譯器相比,這樣做的好處是任務要小得多。透過選擇這種方法,我們支持Solidity 及其所有不同版本的所有怪癖和怪異之處。專案的地址是https://github.com/paritytech/revive,需要了解細節的可以去查看專案的原始碼。
Remix
Remix 是開發Solidity 最受歡迎的工具,它是基於網頁的,讓我們隨時都可以開發,調試和部署合約。 Polkadot 也提供鏈一個自己的版本,https://remix.polkadot.io,可以透過這個網站來存取。我們維護REMIX 的一個分支的原因是,與原始版本相比,主要的變化是我們需要更改編譯器,因此我們將REMIX 更改為使用後端進行編譯,而不是瀏覽器內的編譯器。這是必要的,因為我們基於LLVM 的revive 對於瀏覽器來說太重了。
開發實務
了解完整個原理,我們可以動手實踐,看如何來完成合約的開發、部署和測試。我們可以參考這個文件:
🔗 https://contracts.polkadot.io/
開發測試環境
首先在westend asset hub中已經整合了revive pallet,可以直接在上面開發和測試。

當然你也可以搭建自己的本機測試環境,這樣更容易查看後端日誌,了解錯誤訊息。
1. 下載polkadot sdk 的程式碼並編譯Kitchensink node

2. 啟動node

3. 單獨編譯Eth RPC Proxy

4. 啟動RPC 服務

當以上服務都啟動之後,普通的substrate 的服務會在9944 端口,Eth 會使用8545 端口。
Solidity 合約
首先我們可以嘗試Solidity 合約,你可以直接使用Remix 來開發。在Environment 中,預設已經有westend 的配置了,如果使用本地環境來測試,可以增加customize 的配置。

這樣就可以透過和我們之前啟動的Eth RPC 服務互動。當然如果是開發一個複雜Dapp 應用,可以使用其他框架。這裡推薦大家使用Typescript 和Viem 來實驗,我們可以參考revive pallet 自帶的測試程式碼:
🔗 https://github.com/paritytech/polkadot-sdk/tree/master/substrate/frame/revive/rpc/examples/js
它也有使用Rust 語言的版本,在和它平行的目錄下。一個部署合約的簡化版程式碼如下:



1. 首先我們初始化一個wallet client。
2. 如何使用abi和bytecode來部署一個智慧合約,這裡我們選擇examples裡面的一個簡單合約, piggyBank 。要注意的是這裡的bytecode是編譯成polkavm的程式碼。
3. 呼叫一個讀取的函數。
4. 發送一個交易去更新在合約裡面的這個值。
5. 在交易完成後再次查看數值是否已更新。
Rust 直接寫合約
除了使用Solidity,我們也可以直接使用其他語言來寫合約,然後編譯成polkavm 的程式碼然後直接部署。這裡我們參考https://github.com/paritytech/rust-contract-template。
直接部署polkaVM 合約,我們就不需要使用Eth RPC 了。當合約編譯好了之後,我們可以使用revive 的upload 方法將合約上傳到鏈上。

在呼叫成功之後,我們可以在瀏覽器的event 裡面找到code 的hash,例如在我的例子裡面,hash 值是0x9bef6d3f29397e4994d96657375674096379ba850c31f8c7b950a6f9c13
下面一步就是對合約實例化,呼叫revive 的Instantiate 方法。

這裡會碰到一個account unmapped 錯誤。需要先呼叫account map 的方法,才能部署合約和呼叫。

然後再一次嘗試實例化,就會成功。

我們來記錄一些合約地址,它是一個標準的Eth 地址,在這次部署中,合約地址是0xce58c0af740d49e573998ce92c9147565604d321。
最後我們呼叫revive 的call 方法,填入先前實例化的合約位址。這樣我們就完成了一個PolkaVM 合約的開發,部署和測試。

持續build
當完成來基本的環境搭建,開發流程,之後就可以完成更複雜的業務邏輯。總的說來,polkaVM 還處於早期,大家碰到了問題,或者希望幫忙完成一些功能,修復bug 都可以積極向這些repo 提交PR。
相信隨著2025 年polkadot 2.0的功能逐步delivery,polkaVM 的使用場景和使用範圍會越發廣闊,新創項目也可以提前做好技術儲備,準備好在JAM 上開發出安全高效的產品。
