Pi SDK 裡的 SmartContract:官方已發布但未寫進文件的功能
在 Pi Network Developer Discord 的 dev-questions 頻道裡,有開發者回報了一個具體的技術問題:他們的應用在 Testnet Sandbox 環境中呼叫 Pi.SmartContract.submitTransaction(unsignedXdr),請求抵達了 native bridge,但回傳「App unauthorized to call this message」。
官方聯絡窗口的回覆是:智能合約功能尚未定案,目前僅供內部使用,有進一步消息會再公告。
OrbitWatch 檢視了 Pi Browser 會自動載入執行的公開檔案 sdk.minepi.com/pi-sdk.js,確認了這個功能的實際狀態。
這不是開發者自創的方法名稱
檢視已發布的 SDK 原始碼,Pi.SmartContract 確實存在,而且結構相當完整:
- 提供
submitTransaction()和pollTransaction()兩個方法 - 內部訊息類型明確命名為
@pi:app:sdk:submit_smart_contract_transaction,符合 SDK 既有的內部通訊命名規則 - 已封裝
Subscription和NativeToken兩個子模組 - Testnet 合約位址已寫死在程式碼中作為預設值(
TESTNET_SUBSCRIPTION_CONTRACT_ADDRESS、TESTNET_PI_SAC_CONTRACT_ADDRESS)
Subscription 這個模組,對應的正是 OrbitWatch 先前讀過的 PiRC2 訂閱合約——那份合約不只是 GitHub 上的原始碼範例,而是已經部署到 Testnet,並封裝進正式發布的 SDK 裡。
為什麼一般開發者用官方教學初始化,看不到這個功能
原始碼裡有一段版本判斷邏輯:
初始化時傳入 version: "2.0" → 不啟用 SmartContract 服務
初始化時傳入 version: "3.0" → 啟用 SmartContract 服務
目前官方公開文件(pi-platform-docs)裡的教學範例,寫的都是 Pi.init({ version: "2.0" })。也就是說,就算開發者完整照著官方文件操作,也不會拿到 SmartContract 這個物件——因為文件從未教過要傳入 version: "3.0"。
Testnet 連線參數
SDK 原始碼裡也包含了 SmartContract 服務的預設連線設定:
RPC URL:https://rpc.testnet.minepi.com
Network passphrase:Pi Testnet
這兩項參數先前在官方文件裡查不到,但確實存在於已發布的 SDK 檔案中。
這說明了什麼
把這次的發現和先前的觀察放在一起看:
- 官方在 Soroban 智能合約這件事上,進度比公開文件呈現的更成熟——已有 Testnet 部署、已封裝進正式發布的 SDK、有版本控制機制
- 但這些進展目前刻意沒有寫進公開文件,也還沒開放給第三方應用呼叫
- 官方的回覆與程式碼呈現的狀態一致:功能存在,但「尚未定案」
這不代表開發者現在可以開始串接智能合約。 第三方應用呼叫這個功能,目前確定會被 unauthorized 擋下。這篇記錄的是「官方目前做到哪裡」,不是操作教學。
關於這次查證方式的說明
以上資訊來自檢視 sdk.minepi.com/pi-sdk.js——這是任何載入 Pi SDK 的網頁都會自動下載並執行的公開檔案,用瀏覽器開發者工具查看已下載的原始碼是公開、常見的技術行為,不涉及繞過任何保護機制或未授權存取。RPC 位址與 passphrase 屬於連線設定資訊,不是可用於竊取資產或偽造交易的機密資料。
延伸閱讀
數據來源:Pi Network Developer Discord(dev-questions 頻道公開討論)、sdk.minepi.com/pi-sdk.js(官方公開發布之 SDK 檔案,直接觀察於 2026/8/16)。所有分析不構成投資建議。 OrbitWatch 是獨立的 Pi Network 生態觀測站,與 Pi Network 官方無任何關聯。
重要摘要
- •Pi Network 的 SDK 包含一個未公開的 `Pi.SmartContract` 模組,其中包含諸如 `submitTransaction` 之類的方法,這一點已通過檢查公開的 `pi-sdk.js` 文件得到證實。
- •此智能合約功能可透過將 SDK 初始化為 `version: "3.0"` 來啟用,但官方文件仍然指示開發者使用 `version: "2.0"`,實際上隱藏了該功能。
- •雖然該功能已部署在測試網上並整合到 SDK 中,但目前僅供內部使用,第三方應用程式無權調用它。