Truffle

如何在 web3js 中使用助記詞或私鑰創建帳戶並使用該帳戶呼叫合約

  • December 22, 2019

我有一個web3@1.2.4安裝的簡單 React 項目,我想像這樣呼叫契約的方法:

await maincontract.methods.CurrentMethod("arguments").send({ from: accounts[0]/*my account should go here*/, gas: 3000000 });

此程式碼在 localhost Ganache 中執行良好,但我想使用我在 Ropsten 網路中擁有的自己的帳戶,而不是accounts[0]來自 localhost,我想要使用該帳戶,我需要一個可以將我連接到 Ropsten 網路的 infura 項目,我也需要該賬戶的助記詞或私鑰才能使用該賬戶呼叫合約方法。

那麼基本上我如何使用我位於 Ropsten 網路中的帳戶來呼叫位於同一 Ropsten 網路中的合約?我需要傳遞助記詞嗎?我需要傳遞私鑰嗎?我需要做什麼?

我曾嘗試使用truffle-wallet-provider但它沒有安裝,甚至不詢問錯誤。還有另一個truffle-wallet-provider

這是我在 Ganache 本地嘗試的,但它似乎不起作用,契約程式碼執行良好,使用 Ethereum Remix 進行了測試。

const web3 = new Web3("HTTP://127.0.0.1:7545"); //Ganache Local Host
   const maincontract = new web3.eth.Contract(ABI, CONTRACT_ADDRESS); //already deployed the contract using Ethereum Remix and copied the Contract address and ABI
   const privateKey = "c1937e53c13e500644f45d77e075ca0059dcbae204ef06aa08494a129d871fdc"; //took the account right below the first account and copy pasted its private key
   const account = web3.eth.accounts.privateKeyToAccount(privateKey); //creating account
   const transaction = maincontract.methods.CurrentMethod("arguments");
   const options = { //TransactionConfig I guess
     to: transaction._parent._address,
     data: transaction.encodeABI(),
     gas: await transaction.estimateGas({ from: account.address }),
     gasPrice: await web3.eth.getGasPrice()
   };
   await web3.eth.accounts.signTransaction(options, privateKey).then(tx => {
     //signed = tx.rawTransaction; 
     console.log(tx.rawTransaction.toString()) //this is showing random Hex but I see no transaction log in Ganache
   });

您的方案依賴於在您連接的節點上解鎖您的帳戶。

雖然此方案對於通過 Ganache 在本地主機上測試您的系統是合理的,但不建議將其用於作業系統,因為任何黑客攻擊您的節點的人都可以隨意利用您的(未鎖定的)帳戶。

與其在您連接的節點上解鎖您的帳戶,您可能需要考慮在將每筆交易發送到節點之前對其進行簽名,從而最大限度地減少系統中的“違規點”數量。

例如:

const account = web3.eth.accounts.privateKeyToAccount(privateKey);
const transaction = maincontract.methods.CurrentMethod("arguments");
const options = {
   to      : transaction._parent._address,
   data    : transaction.encodeABI(),
   gas     : await transaction.estimateGas({from: account.address}),
   gasPrice: await web3.eth.getGasPrice() // or use some predefined value
};
const signed  = await web3.eth.accounts.signTransaction(options, privateKey);
const receipt = await web3.eth.sendSignedTransaction(signed.rawTransaction);

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