#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