在 Web3.js 中使用本地私钥

Posted

技术标签:

【中文标题】在 Web3.js 中使用本地私钥【英文标题】:Using local private key with Web3.js 【发布时间】:2021-08-16 13:50:48 【问题描述】:

如何通过本地私钥与智能合约交互并使用 Web3.js 发送交易?私钥是硬编码的还是来自环境 (.env) 文件?

这是 Node.js 和服务器端交互或使用 Ethereum/Polygon/Binance 智能链智能合约的批处理作业所必需的。

您可能会遇到例如错误

Error: The method eth_sendTransaction does not exist/is not available

【问题讨论】:

【参考方案1】:

Infura、QuikNode 等以太坊节点提供商要求您在通过其节点广播交易之前在本地签署传出交易。

Web3.js 没有内置这个功能。您需要使用@truffle/hdwallet-provider package 作为您的以太坊提供商的中间件。

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 是一种低门槛的秘密管理解决方案。

【讨论】:

我知道这很愚蠢,但我想在这里添加一条评论,以防有人遇到同样的假情况。我一直收到如下错误:json code: -32000, message: 'internal' 然后我发现我正在处理的测试网刚刚停止维护。所以是的,这对开发者来说又是一个了不起的一天 :)

以上是关于在 Web3.js 中使用本地私钥的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本地币安智能链lightclient通过web3.js访问区块链

尝试发送 USDC 时无法获取钱包签名者 @solana-labs/web3.js

以太坊系列 - Web3.js

Web3.js getBlock() 将所有块都作为待处理

您可以使用 Webpacker 在 Rails 6 应用程序中直接使用 Web3.js 吗?

我们如何在 Vue.js 中使用 web3.js 库?