Я хочу создать веб-сайт, который будет переводить деньги в режиме реального времени с моего кошелька ethereum на другой кошелек ethereum. Для этого я использую в javascript-файле библиотеку web3.js.
В этот js-файл также импортируется файл .env, в котором хранится API_URL моего приложения и также ключ от моего эфириум-кошелька. Ключ там написан, чтобы можно было совершать транзакции.
Я всё делаю по туториалам из интернета.
Я знаю, что секретный ключ от эфириум-кошелька нужно держать в секрете, т.к. кто им владеет - тот фактически владеет самим кошельком и эфирами на нём.
Даже во всех туториалах написано, что даже на гитхаб нельзя отправлять файл .env.
Мне мой сайт нужно разместить на хостинге.
Тут есть две опасности: либо хостинг украдёт мой приватный ключ и эфиры, либо какой-нибудь пользователь скачает мой сайт (через тот же wget, например) и получит этот ключ и мои эфиры.
Вопрос: а как мне тогда разместить мой сайт на хостинге, не заливая туда файл .env, чтобы можно было в app.js всё равно получить данные из .env?
(Данныe из .env используются в функции transfer)
_app.js:
function MyApp({ Component, pageProps }) {
const Web3 = require("web3");
const myWallet = "MY_ETHEREUM_ADDRESS";
const sendTo = "SEND_TO_ADDRESS"; //where do we send ethereum
const web3 = new Web3(new Web3.providers.HttpProvider("https://mainnet.infura.io/v3/MY_KEY_IN_INFURA")) //my key in infura
let balance = web3.eth.getBalance(myWallet);
function scanBalance(walletAddress) {
//const web3 = new Web3(new Web3.providers.HttpProvider("https://mainnet.infura.io/v3/MY_PROJECT_ID")
web3.eth.getBalance(walletAddress, function (err, bal) {
if (err) {
console.log(err)
} else {
balance = bal;
console.log(`Balance [${myWallet}]: ${web3.fromWei(balance, "ether")}`);
}
})
}
scanBalance(myWallet);
//TypeError: web3.eth.filter is not a function
const filter = web3.eth.filter('latest');
filter.watch((err, res) => {
scanBalance(myWallet)
});
async function transfer() {
const { API_URL, PRIVATE_KEY } = process.env; //here the data from the .env file is used
const { createAlchemyWeb3 } = require("@alch/alchemy-web3");
const alchemyWeb3 = createAlchemyWeb3(API_URL);
const nonce = await alchemyWeb3.eth.getTransactionCount(myWallet, 'latest'); // nonce starts counting from 0
const transaction = {
'to': sendTo,
'value': balance,
'gas': 30000,
'nonce': nonce,
// optional data field to send message or execute smart contract
};
const signedTx = await alchemyWeb3.eth.accounts.signTransaction(transaction, PRIVATE_KEY);
alchemyWeb3.eth.sendSignedTransaction(signedTx.rawTransaction, function (error, hash) {
if (!error) {
console.log(" The hash of your transaction is: ", hash, "\n Check Alchemy's Mempool to view the status of your transaction!");
} else {
console.log("❗Something went wrong while submitting your transaction:", error)
}
});
}
function checkBalanceVal() {
if (balance > 0) {
console.log("balance > 0");
transfer();
} else {
console.log("balance < 0");
}
}
return <Component {...pageProps} />
}
export default MyApp