Web3js

在 Truffle 測試中籤名消息

  • January 12, 2022

我使用 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 暴露了一些起初可能不太清楚的錢包功能:

  1. web3.eth.accounts/getAccounts()
  2. 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 為新賬戶注資。

引用自:https://ethereum.stackexchange.com/questions/118706