Web3js
在 Truffle 測試中籤名消息
我使用 Truffle 在本地開發並執行測試
truffle test
(讓它創建一個臨時的本地區塊鏈)。在我的一項測試中,我需要簽署一條消息,為此我需要測試錢包的
privateKey
. 不幸的是,Trufflecontract()
只提供了一個數組accounts
(地址數組)。我用Google搜尋,似乎沒有辦法獲得這些地址的私鑰。所以我嘗試了以下方法:
await web3.eth.accounts.wallet.create(1); const wallet = web3.eth.accounts.wallet[0]; // ok const signedMessage = await wallet.sign('message'); // 🆘 fails with "sender account not recognized" const contract = await MyContract.new({ from: wallet.address });
問題:消息簽名者也應該是契約的部署者,但是當我嘗試將契約實例化為新創建的契約時,
wallet.address
我收到以下錯誤:1) Contract: MyContract test case no. 1 : Error: Returned error: sender account not recognized at Context.<anonymous> (test/my_contract.js:67:43) at processTicksAndRejections (node:internal/process/task_queues:96:5)
我們觀察到 web3 暴露了一些起初可能不太清楚的錢包功能:
web3.eth.accounts
/getAccounts()
web3.eth.accounts.wallet
它似乎
web3.eth.accounts.wallet.create
是一個實用程序,旨在動態創建帳戶,而無需將它們實際自動綁定到本地節點的帳戶列表(學分:先前的答案)。您可以使用web3.eth.personal.newAccout()
,但這仍然無法讓您訪問私鑰。解決方案
使用這兩個實用程序,我們可以 (1) 創建一個新錢包 (2) 將其添加到“個人”列表中。
/** Connect to ganache */ const web3 = new Web3('http://localhost:7545') /** Create the new wallet */ await web3.eth.accounts.wallet.create(1) const wallet = web3.eth.accounts.wallet[0] /** Bind the new wallet to the personal accounts */ await web3.eth.personal.importRawKey(wallet.privateKey, '') // password is empty await web3.eth.personal.unlockAccount(wallet.address, '', 10000) // arbitrary duration /** Check wallet was added to accounts */ const accounts = await web3.eth.getAccounts() console.log(accounts, wallet.address)
這裡有一點需要注意的是,如果你想創建合約,你還需要用一些 ETH 為新賬戶注資。