閱讀時間 7 分鐘
概覽
在密碼學和區塊鏈領域中,私鑰是最敏感的資料之一。然而,關於該選擇託管型錢包(由錢包供應商保管用戶的私鑰)還是非託管型錢包(由錢包用戶自行保管私鑰),一直以來都存在爭議與混淆。 本指南將深入探討託管型與非託管型錢包之間的差異,並說明如何使用Quicknode 進行非託管交易。
先決條件
- 您的系統上已安裝 Node.js。
- 文字編輯器。
- 終端機,又稱命令列。
什麼是非託管錢包?
非託管錢包是一種區塊鏈錢包,其錢包持有者對私鑰擁有完全控制權並自行保管。 建立及存取非託管錢包有兩種方法:使用私鑰(一串字母數字組合),或使用助記詞(由 12 至 24 個單詞組成的短語),該短語由錢包持有者自行保管(通常會寫下來並存放在安全的地方,遠離網路和電腦)。
以下是非託管錢包的幾項優勢:
- 自主性——使用者完全掌控自己的資金——因為使用者是唯一能完全掌控自身資金的主體。他們無需依賴任何第三方來管理或保障其錢包的安全。
- 安全性——由於使用者將私鑰儲存於網際網路或任何電腦之外,發生安全漏洞的機率幾乎可以忽略不計。
- 即時提領——透過非託管錢包,使用者無需依賴任何第三方來確認其提領請求。這簡化了整個流程,並實現即時提領。
非託管錢包與託管錢包
- 私鑰保管者——在比較加密貨幣錢包時,首要考量因素是私鑰的持有權。就非託管型錢包而言,使用者自行保管私鑰;而在託管型錢包中,則由第三方(通常是錢包供應商或交易所)控制私鑰。
- 交易類型— 非託管錢包進行的交易會立即在區塊鏈上顯示。相較之下,託管錢包進行的交易必須經過第三方的多重核查,因此容易出現延遲。
- 安全性——在非託管型錢包中,使用者會將私鑰儲存於本地端。除非使用者分享私鑰或裝置遭竊,否則此類錢包的安全性極高。在託管型錢包中,所有敏感的使用者資料(如私鑰)皆儲存於熱儲存裝置(即時更新)與冷儲存裝置(不定期更新)中,通常容易遭受駭客攻擊。
- 離線可用性——非託管型錢包無需主動連線至網際網路。託管型錢包則需要網際網路連線,因為資料通常儲存於集中式伺服器上。
- 備份與恢復— 非託管錢包的唯一缺點在於,一旦私鑰/助記詞遺失,便無法恢復該錢包。相較之下,託管錢包的使用者可向第三方申請恢復服務。
使用非託管節點
在Quicknode,我們在全球範圍內運行著眾多節點。這些節點均持續連線至網際網路,且具有動態特性。Quicknode API 連接到一個由強大節點組成的全球網路。這些節點並非始終連線至單一基礎架構元件。該 API 設計上會於單一基礎架構元件之間進行動態切換,以提升系統穩定性與正常運作時間。正因這些節點處於持續變動的狀態,因此將任何敏感資料儲存於節點上並非理想之舉。 此外,由於這些節點直接對外連網,安全考量亦不容忽視。為保障用戶資料安全,我們不允許節點儲存私鑰。 由於這些節點具有動態特性,它們會頻繁變更狀態以提供更佳的效能。這意味著金鑰可能遺失,進而導致用戶資料遺失。基於上述原因,我們採用非託管節點模式,並讓用戶成為其錢包的唯一掌控者。在接下來的章節中,我們將探討如何使用函式庫建立錢包、進行非託管交易,並透過 Quicknode 發送交易。
設定您的 Quicknode 以太坊端點
針對今天的用途,我們幾乎可以使用任何以太坊客戶端,例如 Geth 或 OpenEthereum(前身為 Parity)。由於這對於發送交易來說稍顯複雜,我們將直接在此建立一個免費的 Quicknode 帳戶,並輕鬆產生一個以太坊端點。我們將使用 Kovan 測試鏈來進行轉帳。建立免費的以太坊端點後,請複製您的 HTTP 提供者 URL:

稍後你會需要這個,所以請複製並儲存下來。
建立錢包並取得一些測試用 ETH
我們可以使用現有的眾多 Web3 函式庫中的任何一個來建立錢包。今天我們將使用ethers.js 這個 JavaScript 函式庫,來建立一個能夠簽署並發送交易的錢包。您也可以參考我們關於使用Go/Python/Ruby/PHP 建立以太坊錢包的指南。
我們將使用 npm(Node Package Manager)來安裝 Ethers,此工具隨 Node.js 一併提供。請開啟命令提示字元(cmd)或終端機,並輸入以下指令以檢查 Node.js 是否已安裝:
node -v
這應該會顯示已安裝的 Node.js 版本;若尚未安裝,請從其官方網站下載 Node.js 的 LTS 版本。
讓我們為專案建立一個新目錄,並在 cmd/終端機中將該目錄設為當前工作目錄:
mkdir noncusTransaction
cd noncusTransaction
現在請輸入以下指令來安裝 ethers:
npm i ethers@5.7
請確認您安裝的是 Ethers.js 5.7 版本
此步驟中最常見的問題是 `node-gyp` 發生內部錯誤。您可以參閱此處的 node-gyp 安裝說明。
注意:若您遇到 node-gyp 相關問題,請確保您的 Python 版本與上述說明中列出的相容版本之一相符。
另一個常見的問題是快取過期;只需在 cmd/終端機中輸入以下指令,即可清除 npm 快取:
npm cache clean
如果一切順利,ethers.js 將會安裝到您的系統上。
現在,請開啟文字編輯器,並建立一個名為 transaction.js 的新 JavaScript 檔案。將以下內容複製並貼上至該檔案中。
var ethers = require('ethers');
var privateKey = "0x0111111111111111111122222222222222222223333333333333333333344445";
var 錢包 = new ethers.錢包(私鑰);
控制台.log("地址:" + 錢包.地址);
上述程式碼的說明:
第 1 行:導入 ethers 函式庫。
第 2 行:將私鑰儲存至變數 privateKey 中,請務必使用您自己的私鑰。您可以參考這份使用 JavaScript 產生私鑰的指南,學習如何產生私鑰。
注意:若您打算將程式碼上傳至網際網路(例如公開的 GitHub 儲存庫),則將私密金鑰儲存於.env 檔案中,並透過環境變數在主程式碼中匯入,始終是良好的實作做法。
第 3 行:使用私鑰建立新的錢包地址,並將其儲存至變數 wallet 中。
第 4 行:輸出錢包地址以及一個字串。
現在,請儲存檔案並執行該腳本。
節點交易
應該長這樣。
現在,讓我們取得一些測試用的 ETH,以便在交易過程中進行轉帳並支付 gas 費。請從輸出欄位複製地址,前往Kovan 水龍頭網站並使用 GitHub 或 GitLab 登入,將錢包地址貼上至水龍頭的文字欄位中,然後點擊「Send me KETH!」。

您可以將該地址貼到Kovan Etherscan 中,以確認是否已收到測試用的 ETH,屆時您將看到 ETH 的餘額。

發送非託管交易
讓我們使用先前建立的錢包建立一筆代幣轉帳交易,並透過 Quicknode 將該交易發送至區塊鏈。
請依下列方式更新您的 transaction.js 檔案:
var ethers = require('ethers');
var url = ''ADD_YOUR_ETHEREUM_NODE_URL'';
var customHttpProvider = new ethers.providers.JsonRpcProvider(url);
var privateKey = "0x0111111111111111111122222222222222222223333333333333333333344445";
var wallet = new ethers.Wallet(privateKey);
console.log("Address: " + wallet.address);
tx = {
to: "0x6E0d01A76C3Cf4288372a29124A26D4353EE51BE",
value: ethers.utils.parseEther("0.05"),
chainId: 42,
nonce: 11
}
customHttpProvider.estimateGas(tx).then(function(estimate) {
tx.gasLimit = estimate;
tx.gasPrice = ethers.utils.parseUnits("3.14085197", "gwei");
wallet.signTransaction(tx).then((signedTX)=>{
customHttpProvider.sendTransaction(signedTX).then(console.log);
});
});
因此,請將 `ADD_YOUR_ETHEREUM_NODE_URL` 替換為上文所述的 HTTP 提供者。
上述程式碼的說明。
第 1 行:導入 ethers 函式庫。
第 2 行:將我們的 Quicknode URL 儲存至 url 變數中。
第 3 行:建立新的 ethers 提供者實例,並將其儲存至變數 customHttpProvider 中。
第 4 行:將私密金鑰儲存至 privateKey 變數中(您必須自行產生私密金鑰)。
第 5 行:根據私鑰建立新的錢包。
第 6 行:將錢包地址與一個字串一併輸出。
第 7-12 行:初始化我們的交易物件,並提供諸如「to」等參數,其中包含收件者的地址(即交易要發送到的任何地址)。其次是「value」,其中包含要轉帳的 ETH 金額。第三個是「chainId」,即區塊鏈的網路識別碼(此處為 42,因為我們使用的是 Kovan 測試網)。 最後是「nonce」,即發送者已發送的交易次數。此處的數值應始終為先前交易次數 +1。
我們也可以透過ethers.js 的 getTransactionCount() 方法,取得特定地址的 nonce。
第 13-14 行:透過提供者估算 Gas 消耗量,然後將其儲存至交易物件的 gasLimit 變數中。
第 15 行:設定氣體價格,並將其儲存至交易物件的 gasPrice 變數中。
第 17 行:使用提供者傳送已簽署的交易,並將交易詳細資訊輸出至控制台。
儲存檔案,並使用以下指令執行它:
節點交易
輸出結果將類似如下:

複製交易哈希值,並將其貼上至Kovan Etherscan的搜尋欄中,以確認該交易是否已確認。
結論
恭喜您成功完成一筆非託管交易,並成為您資金的唯一掌控者。切勿將您的私鑰透露給任何人;請務必將其存放在安全的地方,以確保您的錢包和資金更加安全。
訂閱我們的電子報,獲取更多關於以太坊的文章和指南。您也可以隨時透過Twitter和Discord社群伺服器與我們聯繫,那裡匯集了您這輩子見過最酷的開發者們 :)
我們 ❤️ 您的回饋!
如果您有任何意見回饋或對新主題的建議,請告訴我們。我們非常樂意聽取您的意見。
