провайдер hdwallet создает кошелек для пользователя

#javascript #html #ethereum #solidity #truffle

#javascript #HTML #ethereum #надежность #трюфель

Вопрос:

Я создал смарт-контракт, который облегчает продажу токенов. Я хочу, чтобы пользователь мог нажать кнопку, которая автоматически генерирует кошелек ERC20, на который можно отправлять токены.

Я использую провайдера HDWallet truffle и Infura. Я не хочу, чтобы пользователю приходилось использовать MetaMask или что-либо еще. Я буду подписывать транзакции на серверной части, используя закрытый ключ сгенерированного кошелька пользователя.

Как бы мне реализовать это, чтобы для каждого нового пользователя, который хочет выполнить транзакцию, создавался новый кошелек?

Ответ №1:

Это код, который позволил мне создать кошелек одним нажатием кнопки. Теперь мне нужно найти способ сохранить учетные данные этих кошельков, чтобы я мог подписывать транзакции и переводить на них токены.

   var bip39 = require('bip39');
  const EthereumUtil = require('ethereumjs-util');
  const hdkey = require('hdkey');

  const mnemonic = bip39.generateMnemonic(); //generates string
  const seed = bip39.mnemonicToSeed(mnemonic); //creates seed buffer

  const root = hdkey.fromMasterSeed(seed);
  const masterPrivateKey = root.privateKey.toString('hex');

  const addrNode = root.derive("m/44'/60'/0'/0/0");
  const pubKey = EthereumUtil.privateToPublic(addrNode._privateKey);
  const addr = EthereumUtil.publicToAddress(pubKey).toString('hex');
  const address = EthereumUtil.toChecksumAddress(addr);
  

Ответ №2:

Это довольно просто, просто создайте HDWalletProvider, и у provider.addresses будут все учетные записи, которые вы можете использовать:

Вот код:

 const createWallet =  function(_providerUrl) {
    const mnemonicPhrase = bip39.generateMnemonic()
    let provider = new HDWalletProvider({
        mnemonic: {
            phrase: mnemonicPhrase
        },
        providerOrUrl: "http://localhost:8545"
    });
    return provider.addresses
}
  

Адреса имеют учетные записи

Ответ №3:

Решение уже было прокомментировано выше, но у меня есть лучшее предложение для вас. Я думаю, что лучше сгенерировать только одну мнемонику в вашем бэкэнде, и вы будете создавать бесконечные учетные записи на основе этой мнемоники. Из каждой учетной записи вы извлекаете закрытый ключ и сохраняете его, сохраняете адрес учетной записи и индекс учетной записи.

Код управления:

 

const HDWalletProvider = require("@truffle/hdwallet-provider");
const Web3 = require("web3");
const mnemonicPhrase = "mnemonicPhrase here"; 
const urlRPC = "https://bsc-dataseed.binance.org"; 

//Creating another instance to query balances
const Web3Instance = require('web3');
const web3instance = new Web3Instance(new Web3Instance.providers.HttpProvider(urlRPC));

//HD Wallet Provider loads by default only 10 accounts
//We change the limit to as many accounts as we want
//You cannot run the loop below for i greater than 10, because for
const limit = 50;

async function getAccount() {

  provider = new HDWalletProvider({
    mnemonic: mnemonicPhrase,
    numberOfAddresses: limit,
    providerOrUrl: urlRPC,
    addressIndex: 0,

    });

  //HDWalletProvider is compatible with Web3
  //Use it at Web3 constructor, just like any other Web3 Provider
  const web3 = new Web3(provider);

  //I realized that iterating a loop to limit always gives an error when it reaches limit
  //This happens in this HD Wallet Provider package
  //limit - 1 seems to work best
  for (let i = 0; i < limit - 1; i   ) {

    var get = await web3.eth.getAccounts()
    var address = get[i];
    var balanceETH = await web3instance.eth.getBalance(address)

    //Checking the adress
    console.log(address);
    console.log(balanceETH);

  }

}

getAccount();

  

Вот дополнительная информация:
https://ethereum.stackexchange.com/questions/52370/web3-create-account-from-mnemonic-passphrase/144340#144340