Web3js
如何使用私鑰/簽名發送方法執行合約方法?
我想在不解鎖錢包的情況下執行 erc20 合約方法,在我的程式碼中籤署交易。以下是程式碼的外觀:
public async send(sender: string, receiver: string, value: number, key: string) : PromiEvent<object> { return this.contract.methods.transfer(receiver, value) .send({ from: sender }); }
目前程式碼不允許我手動簽名,它假定發件人地址已解鎖。如何手動簽名發送?
public async send(sender: string, receiver: string, value: number, key: string) // @ts-ignore: PromiEvent extends Promise : PromiEvent<TransactionReceipt> { const query = this.contract.methods.transfer(receiver, value); const encodedABI = query.encodeABI(); const signedTx = await this.web3.eth.accounts.signTransaction( { data: encodedABI, from: sender, gas: 2000000, to: this.contract.options.address, }, key, false, ); // @ts-ignore: property exists return this.web3.eth.sendSignedTransaction(signedTx.rawTransaction); }
您可以在 HttpProvider 之上使用 truffle-hdwallet-provider。HDWallet 提供商將在向提供商廣播之前簽署交易。它只是提供者之上的一個簡單包裝器。下面是我的 index.js 用於獲得任何契約。
let HDWalletProvider = require('truffle-hdwallet-provider') , Web3 = require('web3') , path = require('path'); let settings = require('../settings'); function getWeb3Provider() { return new HDWalletProvider(settings.mnemonic, 'https://network.infura.io/apikey'); } async function getContract(abi) { let provider = getWeb3Provider(); let web3 = new Web3(provider); let artifact = require(path.join(settings.artifactsDir, abi)); let contract = new web3.eth.Contract(artifact.abi, artifact.networks[settings.networkId].address); contract.setProvider(provider); return contract } module.exports = { getContract };
然後您可以按原樣使用您的函式,它們都將由助記詞階段生成的第一個私鑰在廣播之前進行簽名。如果你沒有助記詞階段,那麼 fork truffle-hdwallet-provider (它是一個 60 行的模組)並讓它使用私鑰而不是助記詞階段是微不足道的。