自架指南

你的錢在鏈上的 Safe 合約裡,由你的金鑰控制。Vela 執行的任何東西都動不了它。 Vela 執行的,是讓錢包用起來方便的那套機制:替你送出交易的中繼、幫新裝置找回錢包的 索引、鏈資料目錄、匯率來源,以及各個應用程式本身。

這一頁把這些元件逐一列出:每一樣在做什麼、少了它會怎樣、怎麼換成你自己的。 也會說明唯一無法取代的那一樣——你的密碼金鑰所屬的網域——以及 getvela.app 不在了該怎麼辦。

全貌

元件做什麼Vela 的預設能換掉嗎少了它會怎樣
中繼接收你簽好的操作,墊付 gas、送上鏈,收取你簽署同意的手續費vela-relay-cf.getvela.app能——架設 vela-relay,並讓錢包指向它無法發送交易
公鑰索引把新錢包的金鑰註冊上鏈;回答「這把金鑰屬於哪個錢包?」p256-index-v2.getvela.app能——架設 p256-index無法建立新錢包;登入時改為直接讀鏈
註冊表合約每個錢包金鑰的永久公開紀錄Gnosis 上的 0x94fD…1EA9不需要換——它沒有擁有者,錢包會直接讀取
鏈資料網路資訊、代幣清單、圖示、清晰簽署描述檔ethereum-data.getvela.app能——架設 ethereum-data沒有代幣清單和圖示;能解碼的交易變少;無法新增網路
匯率以你的顯示幣別呈現法幣價值vela-currency.getvela.app能——架設 vela-currency,或任何相容 Frankfurter 的來源應用程式會盡量改用鏈上的 Chainlink 匯率(桌面版會顯示美元)
RPC 節點讀取餘額、模擬交易各網路的公共節點能——在「設定 → 網路」裡逐一設定Vela 會在節點之間自動切換
應用程式錢包本身wallet.getvela.app、正式發布版本能——自行建置
getvela.app你的密碼金鑰所屬的網域不能——請看下文

另外還會連到幾個不屬於 Vela 的第三方服務:解碼交易時最後才會用到的公開函式選擇器 資料庫(sourcify、openchain、4byte)、用來顯示安全金鑰型號名稱的驗證器目錄, 以及用手機掃描 QR 碼簽署時會經過的 Apple 和 Google 通道伺服器。

唯一無法取代的:密碼金鑰的網域

密碼金鑰屬於建立它的那個網站。Vela 的金鑰是為 getvela.app 建立的。瀏覽器只會把它們提供給 getvela.app 和它的子網域上的頁面(或 getvela.app 宣告為相關的來源),手機內建的密碼金鑰也只能在 getvela.app 認可的應用程式裡使用。在瀏覽器之外,規則寬鬆一些:Chrome 允許取得 getvela.app 權限的 擴充功能使用它們,而你電腦上的程式可以直接向安全金鑰或手機要一個給 getvela.app 的簽章——自行建置的 應用程式就是這樣運作的,這也是為什麼你執行什麼軟體很重要。由此可以得出兩點。

把網頁錢包放到你自己的網域上,得到的是另一個錢包。 同一份程式碼放在 wallet.example.com 上,建立的就是屬於 wallet.example.com 的密碼金鑰——新的金鑰, 所以也是新的位址。它無法替在 wallet.getvela.app 建立的錢包簽署。這份副本還是有用的: 可以用在你在它上面新建的錢包,或是從零開始自己跑整套服務。

對已經存在的錢包來說,即使 getvela.app 下線或消失,下面這些方式仍然能用:

方式能用哪些金鑰從哪裡取得
Vela 瀏覽器擴充功能(Chromium 系列瀏覽器:Chrome、Edge、Brave)瀏覽器用得到的任何金鑰:這台裝置的密碼金鑰、USB 安全金鑰(電腦支援時也可以用 NFC)、掃描 QR 碼連線的手機GitHub 上的發布壓縮檔,或自行建置
你自己建置的桌面版或手機應用程式掃描 QR 碼連線的手機,以及 USB 安全金鑰自行建置
商店版和通過公證的桌面版掃描 QR 碼的手機和安全金鑰一定能用;「這台裝置」的密碼金鑰,只有在作業系統還能拿 getvela.app 驗證這個應用程式時才能用GitHub 發布頁面(之後會上架商店)

擴充功能能用 getvela.app 的金鑰,是因為 Chrome 允許取得某個網站權限的擴充功能使用該網站 的密碼金鑰。這項權限由瀏覽器在本機檢查;我們實測過它能用,但還沒有在網域真正下線的情況下測過。 自行建置的應用程式能用手機或安全金鑰,是因為 Vela 直接和它們溝通;手機本身的密碼金鑰(「這台裝置」) 則要求應用程式由 Vela 簽署,而你建置的版本不是。

簽署頁本身不是一條獨立的路:它只替其他程式送來的 請求簽署,而目前還沒有任何 Vela 應用程式會把請求送給它。

讓錢包指向你的服務

每個應用程式在「設定 → 進階 → 服務端點」(桌面版是「設定 → 服務端點」)下都有四個欄位: 鏈資料、密碼金鑰索引(畫面上顯示為「通行密鑰索引」)、Vela 中繼和法幣匯率。在你修改之前,每個欄位顯示的是 Vela 的預設值;「重設為預設值」會把四個一起還原。對中繼、索引和鏈資料,錢包會呼叫 /api/health 並顯示一個 狀態標記,只有端點回報了正確的服務名稱、而且 status"ok" 時才會是綠色。不論標記是什麼顏色, 你輸入的內容都會被儲存——請等它變綠。

服務/api/health 裡的 service
中繼vela-relay
公鑰索引webauthn-p256-publickey-registry
鏈資料ethereum-data
匯率不檢查名稱——必須回傳以美元為基準的匯率清單

四個應用程式都完整支援這四個欄位,而且改過的端點在下一次呼叫時就生效,不必等下一次啟動: 建立錢包、登入、替位址查名字——每一條路徑都是在真正用到端點的那一刻才去讀它。 在 iOS 上,預設索引連不上時,還可以在登入畫面更改密碼金鑰索引。

(在 2026 年 9 月之前,這件事有四項例外, 其中最嚴重的是 iOS 上那個顯示預留值、又什麼都不儲存的頁面。它們都已經修好了。)

架設你自己的中繼

中繼就是 vela-relay(Rust,MIT 授權)。 一個部署就服務所有鏈:錢包會呼叫 https://your-relay/<chainId>。必須是 vela-relay—— 錢包是用一個 Vela 專屬的方法取得手續費報價,通用的 ERC-4337 bundler 並沒有實作它。

你需要

  • Docker,加上你已經在執行的 Redis 和 Iggy 伺服器;或是一個 Workers Paid 付費方案的 Cloudflare 帳號,並在你的電腦上裝好 Node.js 和 Rust 工具鏈 (含 wasm32-unknown-unknown 目標)。
  • 一組 OPERATOR_SECRET(十六進位,至少 32 位元組)。它會衍生出一個金庫位址和一組 中繼位址,在每條鏈上都一樣。請務必保密:它控制著中繼的資金。
  • 你要服務的每條鏈上都要有 gas:把該鏈的原生幣(Tempo 上是 pathUSD)轉到你的 金庫位址,金庫會替各個中繼位址補充。

Docker

git clone https://github.com/mondaylabsltd/vela-relay
cd vela-relay
cp .env.example .env
# 在 .env 裡填入 VELA_RELAY_IGGY_URL、VELA_RELAY_REDIS_URL、OPERATOR_SECRET,
# 如果你自己架設鏈資料,再填 VELA_RELAY_CHAIN_DIRECTORY_URL,
# 並把 VELA_RELAY_IMAGE 設成你信任的發布映像檔(見 docs/docker.md)
docker compose pull relay
docker compose up -d --no-build
curl --fail http://127.0.0.1:4567/readyz

兩條路都走得通:已發布的映像檔最省事,而 docker compose up --build 是從你能讀到的原始碼建置出同樣的東西。不用 Docker 的話, 可以用 cargo run --release --bin vela-relay 直接執行。

Cloudflare Workers

cd vela-relay/vela-relay-cf
npx wrangler queues create vela-relay-ops
npx wrangler queues create vela-relay-dlq
npx wrangler secret put OPERATOR_SECRET
# 自己的鏈資料:在 wrangler.jsonc 的 "vars" 裡加上 "VELA_RELAY_CHAIN_DIRECTORY_URL"
npx wrangler deploy

檢查

curl https://your-relay/api/health        # {"service":"vela-relay","status":"ok",…}
curl https://your-relay/v1/treasury/100   # 你在 Gnosis 上的金庫位址,以及是否需要補 gas

接著把 https://your-relay 填進「VELA RELAY」欄位。

你該知道的

  • 錢包支付的手續費會進到你的金庫。不論用哪個中繼,錢包計算手續費的方式都一樣 (見網路與費用)。
  • 在更換中繼之前新增的自訂網路,會沿用新增時記下的中繼位址。
  • 中繼會從鏈目錄讀取每條鏈的資訊和它接受的穩定幣:預設是 ethereum-data.getvela.app, 把 VELA_RELAY_CHAIN_DIRECTORY_URL 設成你自己的鏈資料就能換掉。 這個設定需要 vela-relay v0.9.6 以上;更早的版本一律讀取 Vela 的那一份。

架設你自己的公鑰索引

索引就是 p256-index(Rust,MIT 授權)。建立錢包時, 它會逐一檢查每把金鑰的證明,再把這組金鑰寫進 Gnosis 上的註冊表合約,並支付 gas。請繼續使用現有的註冊表 0x94fD1A891EB6c5F340622Baf2F3A0cb70A941EA9:它沒有 擁有者,任何有餘額的位址都能寫入,而每個 Vela 應用程式都會直接讀取它。你另外建立的註冊表, 它們是看不到的。

你需要

  • Docker 加上 Redis 和 Iggy(伺服器版本),或是一個 Cloudflare 帳號(Worker 版本;它自己的 README 註明鏈上寫入還沒有做過端對端測試)。
  • 一把有 xDAI 的 Gnosis 私鑰。註冊一個錢包,一把金鑰大約要 1.1M gas,七把大約 3.6M。
  • 以下設定:
P256_INDEX_IGGY_URL=iggy+tcp://user:password@iggy.example:5100
P256_INDEX_REDIS_URL=redis://redis.example:6379/0
P256_INDEX_CONTRACT_ADDRESS=0x94fD1A891EB6c5F340622Baf2F3A0cb70A941EA9
P256_INDEX_DOMAIN_REGISTRY=0x5266DfF591B9F9EecfEdb8E7EfEf6c687854edaf
PRIVATE_KEY=0x…

P256_INDEX_DOMAIN_REGISTRY 是最容易被漏掉的一項:少了它, 伺服器發出的挑戰會被合約拒絕,每一筆註冊都會失敗。它就在 .env.example 裡, 而且必須和已部署合約自己的 DOMAIN_REGISTRY 一致—— 從註冊表 VERSION 12 起,挑戰所用的網域在部署時就固定下來,合約重新部署也不會變。

執行與檢查

git clone https://github.com/mondaylabsltd/p256-index
cd p256-index
cargo run --release -p p256-index-server
curl https://your-index/api/health   # "service":"webauthn-p256-publickey-registry","status":"ok"

伺服器監聽的是一般的 HTTP(預設連接埠 11256);錢包只接受 https:// 端點,所以要在前面加一層 TLS 代理。docker build -f p256-index-server/Dockerfile . 從全新複製的儲存庫也能建置成功; 如果用 Compose,請先把 .env.example 複製成 p256-index-server/.env

如果完全沒有索引可以回應,已經存在的錢包照樣能用:登入時,應用程式會透過你的 RPC 節點直接讀取 Gnosis(接著是以太坊)上的註冊表合約。只有一把金鑰的錢包,甚至可以不經過註冊表, 憑兩次簽章重建出來。但建立新錢包確實需要索引,因為註冊總得有人付費。

架設你自己的鏈資料

鏈資料就是 ethereum-data(MIT):大約 2,600 條網路和它們代幣的靜態 JSON 與圖片,再加上 Vela 用來解釋交易的 ERC-7730 描述檔。

docker run -d --name ethereum-data -p 3000:3000 --restart unless-stopped 
  ghcr.io/atshelchin/ethereum-data:latest
curl http://localhost:3000/api/health   # "service":"ethereum-data","status":"ok"

它的 README 也說明了怎麼從原始碼建置、部署到 Cloudflare。請用 HTTPS 對外提供服務,再把位址 填進「鏈資料索引」欄位。

中繼也會讀取這些檔案,包括一個 Vela 專屬的欄位(stables 清單決定哪些穩定幣能付手續費)。 用 VELA_RELAY_CHAIN_DIRECTORY_URL=https://your-chain-data 讓它改讀你的那一份; 每條網路的資料,它會快取一小時。

架設你自己的匯率服務

vela-currency(MIT)轉發歐洲中央銀行每天 公布的匯率,不需要任何金鑰。

docker run -d -p 8080:8080 -v rates-data:/data ghcr.io/mondaylabsltd/vela-currency:latest
curl "http://localhost:8080/v2/rates?base=USD"

https://your-host/v2/rates?base=USD 填進「法幣匯率」欄位。任何相容 Frankfurter 的 服務也可以。一定要保留 ?base=USD:所有換算都以它為前提。

自行建置應用程式

所有應用程式都在同一個儲存庫裡(MIT)。 README 列出了每個應用程式的建置步驟,這裡是精簡版:

應用程式建置能替你在 getvela.app 已有的錢包簽署嗎?
瀏覽器擴充功能cd app-web/vela-wallet && pnpm install && pnpm build:extension,再到 chrome://extensions 用「載入未封裝項目」載入 extension/dist可以,任何金鑰都行
網頁錢包cd app-web/vela-wallet && pnpm install && pnpm build;以 Cloudflare Worker 部署不行——放在你的網域上,它就是另一個錢包(見上文)
桌面版cd app-desktop/vela-wallet && cargo run(打包腳本見它的 README)可以,用掃描 QR 碼的手機或 USB 安全金鑰
Android先產生核心綁定,再執行 ./gradlew :app:installDebug可以,用掃描 QR 碼的手機或 USB 安全金鑰
iOS./rust/scripts/build-ios-xcframework.sh,再用你自己的開發團隊在 Xcode 裡建置可以,用掃描 QR 碼的手機,或 USB-C / Lightning 接頭的 YubiKey(韌體 5.8 以上)

自行建置的應用程式,無法用「這台裝置」的密碼金鑰替 getvela.app 錢包簽署:Apple 和 Google 只允許 由 Vela 簽署的應用程式使用 getvela.app 的密碼金鑰。

新增 Vela 沒有內建的網路

任何具備 P-256 預編譯合約、也部署了它會檢查的那些標準合約的 EVM 鏈,都能執行 Vela。 鏈設定會告訴你一條鏈缺什麼,並部署任何人都能部署的那些; 網路與費用說明了具體條件。 這項檢查已經涵蓋多把金鑰的錢包所需的那兩份合約,而且會特別標明它們—— 一條鏈上沒有它們,單一金鑰的錢包照樣能跑。

全部換掉之後,還有哪些指向 Vela

把上面的都換成你自己的之後,還會剩下這些:

  • 顯示安全金鑰型號的驗證器目錄——只影響顯示;應用程式會改顯示通用名稱。
  • getvela.app 上的關聯檔案——商店版應用程式使用「這台裝置」的密碼金鑰時需要它們。手機或 安全金鑰用不到。

以下這些則不屬於 Vela:公開的函式選擇器資料庫、Apple 和 Google 的手機登入通道,以及你自己 選擇的 RPC 服務商。

下一步:可以自己架設的簽署頁