Web3js

我在哪裡可以上傳一個除了我的站點之外任何人都不能訪問的秘密文件?

  • April 13, 2022

我想創建一個網站,將錢從我的乙太坊錢包實時轉移到另一個乙太坊錢包。為此,我使用了 javascript 文件中的 web3.js 庫。

這個 js 文件還導入了 .env 文件,該文件儲存了我的應用程序的 API_URL 以及我的乙太坊錢包的密鑰。密鑰寫在那裡,以便可以進行交易。我根據網際網路上的教程做所有事情。我知道乙太坊錢包的密鑰應該保密,因為——擁有它的人實際上擁有錢包本身和上面的乙太幣。即使在所有教程中,都寫到即使 .env 文件也無法發送到 github。

我需要託管我的網站。這裡有兩個危險:主機會竊取我的私鑰和乙太幣,或者某些使用者會下載我的網站(例如,使用 wget)並獲取此密鑰和我的乙太幣。問題:如何在不上傳 .env 文件的情況下將我的網站放在主機上,以便我仍然可以從 app.js 中的 .env 獲取數據?

(來自 .env 的數據用於傳遞函式)

_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

至少,您不應該將您的秘密上傳到網站。他們永遠不應該為外人所用。這通常是通過為網站使用後端服務來完成的——您的網站向後端服務發送請求,並且只有後端服務知道秘密。這樣,網站就不知道秘密,並且包括秘密在內的流量對使用者來說是不可見的。

但是您仍然需要將密鑰上傳到託管服務提供商的後端伺服器。或者開始考慮某種方案來混淆線索,例如將秘密分成多個部分。我不確定有哪些可用的方案。

如果這是一個非常大的秘密,您可能不應該將其提供給任何託管服務提供商。您應該執行自己的伺服器。

引用自:https://ethereum.stackexchange.com/questions/126105