Web3js

如何使用私鑰/簽名發送方法執行合約方法?

  • February 5, 2022

我想在不解鎖錢包的情況下執行 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 行的模組)並讓它使用私鑰而不是助記詞階段是微不足道的。

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