閱讀時間 5 分鐘
概覽
在本地叢集上進行測試,對於快速迭代和開發新的 Solana 程式原型至關重要。然而,本地叢集的預設設定可能與主網(或開發網)叢集的當前功能集不符。這可能會導致在將應用程式部署至生產環境時出現預期之外的行為。
在本指南中,我們將了解 Solana 的功能、如何查看叢集的當前功能集,以及如何配置您的本地叢集以匹配主網叢集的功能集。讓我們開始吧!
您將負責的工作內容
- 了解 Solana 的各項功能,以及它們可能對您的應用程式產生的影響
- 檢查 Solana 叢集的當前功能集
- 將您的本地叢集進行設定,使其功能集與主網叢集相符
先決條件
- 已安裝Solana CLI(版本 1.18 或更新)
- 具備本地 Solana 開發經驗(指南:如何設定並與本地 Solana 驗證者互動)
了解 Solana 的功能
Solana 是一個快速演進的區塊鏈,為回應開發者與使用者的需求,會定期新增功能與改進。透過「功能提案」與「Gate 計畫」的推出與啟用,驗證者得以具備各種新功能(詳見 資源 (詳情請參閱)。這些功能可在特定叢集(例如測試網)中啟用,但在其他叢集(例如主網)中則無法啟用,導致不同環境下的功能存在差異。當使用預設的 solana-test-validator 在本地環境中,所有與本地安裝的 Solana 版本相容的功能都會自動啟用。當應用程式部署至不同的叢集時,這種自動啟用機制可能會導致測試結果出現差異。了解功能啟用機制及其對應用程式效能的影響,對於進行正確的測試至關重要。
例如,我最近測試了一個 NFT 程式,該程式需透過傳遞一個非常大的(約 3kb)資料載荷,向一個銘文程式發出跨程式呼叫(CPI)。儘管在相同條件下,該程式在本地叢集上運作正常,但在開發網(devnet)上卻失敗了。我收到以下錯誤訊息: > 程式傳回錯誤:「傳遞給內部指令的指令過大(3284 > 1280)」.
經過一番調查後,我發現我的本地叢集啟用了一項功能,該功能放寬了 CPI 資料載荷大小的限制,而 devnet 叢集則未啟用此功能。這可能是一個難以除錯的問題,因此務必了解如何檢查叢集的功能集,並將本地叢集配置為與主網叢集的功能集一致。
檢查叢集的功能集
若要檢查叢集的功能集,您可以使用 Solana 功能狀態 指令。此指令可讓您查詢叢集的當前功能集,並檢查個別功能的狀態。讓我們在主網試試看。請在終端機中輸入:
Solana 功能狀態 -um
這將擷取主網(mainnet)上所有功能狀態(活躍、非活躍或待處理);若要取得開發網(devnet)的狀態,可使用 -ud, 測試網使用 -ut,或使用 -ul).
您應該會看到一列功能及其狀態:

請注意,每個功能都有一個唯一的公鑰。在提出時,每個功能都具備:
- 功能:一個用於在 Solana 程式碼庫中識別該功能的唯一公鑰。您可以在 GitHub的此處查看所有這些功能。
- 狀態:有效、失效或待定
- 觸發槽位:該功能被觸發的槽位
- 說明:該功能的簡要說明
如果你仔細觀察,就能發現導致我的 CPI 資料有效載荷大小問題的這個功能: GDH5TVdbTPUpRnXaRyQqiKUa7uZAbZ28Q2N9bhbKoMLm:放寬 CPI 大小限制. 撰寫本文時,此功能在主網和開發網中已停用,但在我的 Solana 本地版本中則已啟用。您也可以看到一則關於 GitHub 問題 (26641) 我們可以在此進一步了解該功能及其狀態。如果您想查詢特定功能,可以像這樣將該功能的公開金鑰加入您的指令中:
Solana 功能狀態 -um GDH5TVdbTPUpRnXaRyQqiKUa7uZAbZ28Q2N9bhbKoMLm
這應該會返回與之前相同的資料表,但只包含您指定的特徵 🙌。
我們可以在本地叢集上執行相同的指令,以查看其中的差異。請在另一個終端機中啟動您的本地叢集:
solana-test-validator
接著,執行 solana feature status -ul 在原始終端機中執行此指令。您應會看到本地叢集上的功能清單及其狀態。請將這些功能與狀態與主網上的資訊進行比對,以找出任何差異。
就我而言,我發現我的本地叢集上也啟用了這項功能:

這就解釋了為什麼我的程式在本地叢集上能運作,但在 devnet 上卻失敗了!
注意:功能集會隨時間而變動,因此您的結果可能會有所不同,但基本概念保持不變。
既然我們已經了解這個問題,接下來就來學習如何配置我們的本地叢集,使其功能與主網叢集相符。請按下以下按鍵來終止您的本地驗證節點: Ctrl + C 在執行該程式的終端機中,然後繼續進行下一節。
設定您的本地叢集
Solana CLI 提供了一個簡單的參數,您可以將其加入您的 solana-test-validator 用於配置您的本地叢集以停用特定功能的指令。該參數為 --停用功能. 您可以使用此參數來指定要在本地叢集中啟用的功能集。因此,以我的情況來說,我會執行:
solana-test-validator --deactivate-feature GDH5TVdbTPUpRnXaRyQqiKUa7uZAbZ28Q2N9bhbKoMLm -r
註:若要使用該--停用功能 標誌,我們必須使用 -r 同時設定此標記,以將本地驗證器重置為創世狀態。此操作將清除帳本,並以新的功能集重新啟動叢集。
您的本地叢集應會如常啟動。現在您可以執行 solana 功能狀態 GDH5TVdbTPUpRnXaRyQqiKUa7uZAbZ28Q2N9bhbKoMLm -ul 執行此指令以確認該功能已停用。您應可看到該功能現在已在您的本地叢集中停用:
GDH5TVdbTPUpRnXaRyQqiKUa7uZAbZ28Q2N9bhbKoMLm | 非活躍 | 不適用 | 放寬 CPI 大小限制 #26641
就是這樣。在我的範例中,我現在可以在本地叢集上執行程式,並預期會出現與部署到 devnet 時相同的錯誤!……現在,我只需要修正這個錯誤就行了 😅。
Anchor CLI
如果您正在使用 錨點, 您很可能正在使用 錨點測試 以啟動您的本地驗證器。在撰寫本文之際,若要使用該 --停用功能 若啟用「Anchor」標記,您需要手動使用 solana-test-validator 指令,就像我們上面所做的那樣。接著,請務必加入 --skip-local-validator 標記為您的 錨點測試 指令。這將指示 Anchor 使用您手動啟動的本地驗證器,而非啟動一個新的驗證器。
A 最新功能 Anchor 已新增此功能(但截至 v. 0.29 版本尚未發布),此功能將讓您能夠包含 停用功能 在您的 Anchor.toml 檔案。這樣一來,您就能執行 錨點測試 無需手動啟動您的本地驗證器。請密切留意 GitHub 錨點 以獲取新發行作品的最新資訊。
總結
雖然這看似是個微不足道的細節,但確保您的本地叢集能與主網叢集表現一致,將能在部署應用程式時為您節省大量時間,並避免許多麻煩。透過了解 Solana 的功能,以及如何檢查和設定本地叢集的功能集,您就能確保應用程式在不同叢集間都能穩定運作。
我們非常想進一步了解您正在開發的專案。歡迎在Discord或Twitter 上與我們聯絡!
我們 ❤️ 您的回饋!
如果您有任何意見回饋或對新主題的建議,請告訴我們。我們非常樂意聽取您的意見。
