【问题标题】:Using local private key with Web3.js在 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

【问题讨论】:

    标签: ethereum web3js binance-smart-chain


    【解决方案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' } 然后我发现我正在处理的测试网刚刚停止维护。所以是的,这对开发者来说又是一个了不起的一天 :)
    猜你喜欢
    • 2022-07-14
    • 2018-06-27
    • 2018-11-18
    • 2021-12-16
    • 2018-09-22
    • 2022-09-23
    • 2021-06-29
    • 2018-12-01
    • 1970-01-01
    相关资源
    最近更新 更多