Truffle
如何在 web3js 中使用助記詞或私鑰創建帳戶並使用該帳戶呼叫合約
我有一個
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);