如何解决在 Web3.js 中使用本地私钥
如何通过本地私钥与智能合约交互并使用 Web3.js 发送交易?私钥是硬编码的还是来自环境 (.env
) 文件?
Node.js 和服务器端交互或与 Ethereum/polygon/Binance 智能链智能合约的批处理作业需要这样做。
您可能会遇到例如错误
Error: The method eth_sendTransaction does not exist/is not available
解决方法
Infura、QuikNode 等以太坊节点提供商要求您在本地签署传出交易,然后再通过他们的节点进行广播。
Web3.js 没有内置这个功能。您需要使用 @truffle/hdwallet-provider package 作为您的 Ethereum 提供商的中间件。
TypeScript 中的示例:
const Web3 = require('web3');
const HDWalletProvider = require("@truffle/hdwallet-provider");
import { abi } from "../../build/contracts/AnythingTruffleCompiled.json";
//
// Project secrets are hardcoded here
// - do not do this in real life
//
// No 0x prefix
const myPrivateKeyHex = "123123123";
const infuraProjectId = "123123123";
const provider = new Web3.providers.HttpProvider(`https://mainnet.infura.io/v3/${infuraProjectId}`);
// Create web3.js middleware that signs transactions locally
const localKeyProvider = new HDWalletProvider({
privateKeys: [myPrivateKeyHex],providerOrUrl: provider,});
const web3 = new Web3(localKeyProvider);
const myAccount = web3.eth.accounts.privateKeyToAccount(myPrivateKeyHex);
// Interact with existing,already deployed,smart contract on Ethereum mainnet
const address = '0x123123123123123123';
const myContract = new web3.eth.Contract(abi as any,address);
// Some example calls how to read data from the smart contract
const currentDuration = await myContract.methods.stakingTime().call();
const currentAmount = await myContract.methods.stakingAmount().call();
console.log('Transaction signer account is',myAccount.address,',smart contract is',address);
console.log('Starting transaction now');
// Approve this balance to be used for the token swap
const receipt = await myContract.methods.myMethod(1,2).send({ from: myAccount.address });
console.log('TX receipt',receipt);
您还需要避免将您的私钥提交到任何 Github 存储库。 dotenv package 是用于机密管理的低门槛解决方案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。