Go-Ethereum
使用松露部署契約時無法解鎖帳戶
我正在嘗試使用 geth 建立一個私有區塊鏈,使用 truffle 為其部署智能合約。我的目標是讓一個私有區塊鏈執行多個賬戶,部署一些合約並連接一些對等點。應該是學習鍛煉。
我在跑步:
- geth 1.9.15
- 松露 5.1.30
- Ubuntu 18.04
以下是我設置私有區塊鏈的步驟:
- 創建 5 個帳戶:
geth account new --datadir private-chain --password pw.txt
- 初始化區塊鏈:
geth --datadir private-chain init private-chain/genesis-block.json
- 啟動控制台:
geth --datadir private-chain --http --http.addr 127.0.0.1 --http.port 8545 --http.api eth,net,web3,personal --networkid 3456 console 2> private-chain/private-chain.log
我的 genesis-block.json 文件為每個新賬戶提供了 120 個乙太幣。
當我嘗試使用 truffle 部署合約時,我得到的是:
Starting migrations... ====================== > Network name: 'geth' > Network id: 3456 > Block gas limit: 2000000 (0x1e8480) 1_initial_migration.js ====================== Deploying 'Migrations' ---------------------- Error: *** Deployment Failed *** "Migrations" -- Returned error: authentication needed: password or unlock.
所以我嘗試通過將 1_initial_migration.js 更改為以下內容來解鎖帳戶:
const web3_lib = require ("web3"); const Migrations = artifacts.require ("Migrations.sol"); module.exports = function (deployer, network, addresses) { const web3 = new web3_lib (new web3_lib.providers.HttpProvider ('http://127.0.0.1:8545')); console.log ('>>>>> Attempting to unlock account'); console.log ('>>>>> Using password ' + process.env.GETH_PW); web3.eth.personal.unlockAccount ('0x1234567890abcdef1234567890abcdef12345678', 'my-pw', 36000).then (console.log ('Account unlocked!')); console.log ('>>>>> Deploying migration'); deployer.deploy (Migrations); };
“帳戶已解鎖!” 消息被列印到螢幕上,但我得到了和以前一樣的錯誤。
然後我去了 geth 控制台並嘗試從那裡解鎖帳戶,結果如下:
> web3.personal.unlockAccount ("0x1234567890abcdef1234567890abcdef12345678", "my-pw", 36000) GoError: Error: account unlock with HTTP access is forbidden at web3.js:6347:37(47) at native at <eval>:1:91(6)
這甚至可能嗎?有什麼我忘記了,或者不了解這應該如何工作嗎?做我想做的事情的正確方法是什麼?
正如 MajdTL 所說,從安全形度來看,解鎖帳戶並不是一個好主意。
通常的做法是創建一個助記賬戶並使用@truffle/hdwallet-provider來簽署交易,而無需解鎖它。
如果您只是在練習,則必須使用額外的參數啟動 geth
--allow-insecure-unlock
以指示您將使用解鎖功能。要獲得更多 geth 的參數,請查看他們的文件。