Web3js

在客戶端執行時如何將餘額儲存在變數中?

  • March 28, 2021

語境

在 Ropsten 和 Kovan 測試網路上編寫了一些智能合約後,我正在學習 web3。

我試圖簡單地讀取地址的餘額並將其儲存在一個變數中,以便顯示它。下一步將是使用瀏覽器錢包(例如 Metamask)添加智能合約互動。

我想編寫一個在客戶端執行的腳本,其中一個動機是網站將是靜態的。

程式碼和錯誤

我使用以下行導入了 web3js 庫,請告訴我是否有更好的方法:

<script language="javascript" type="text/javascript" src="https://cdn.jsdelivr.net/gh/ethereum/web3.js@1.3.4/dist/web3.min.js"></script>

然後,為了連接到提供商,我創建了一個 Infura 帳戶並獲得了一個與我的項目相關聯的 url。為了不完全顯示,我就這樣寫

   var url = "https://kovan.infura.io/v3/my_project_id";

正如您在下面的程式碼中看到的那樣,我創建了一個input元素,使用者可以在其中寫下它想知道餘額的地址。按下按鈕時,應更改段落並顯示余額(以wei為單位)。


<body>
   <input type="text" id="address" placeholder="Enter an address here">
   <button onClick="displayBalance()">Get balance</button>
   <p id="showbal">This paragraph would show the balance</p>
</body>
<script>
   var url = "https://kovan.infura.io/v3/my_project_id";
   var web3 = new Web3(url);
   function displayBalance() {
       var addr = document.getElementById("address").value;
       web3.eth.getBalance(addr).then(function(result) {balance = result});
       document.getElementById("showbal").innerHTML = balance;
   }
</script>

使用元素中displayBalance()的有效地址呼叫時出現的錯誤告訴我. 請注意,錯誤顯示在函式的最後一行。此外,值得注意的是,在瀏覽器控制台中一次執行每條指令時,我設法獲得了成功的結果。我猜它在執行下一行時承諾尚未完成。input``Uncaught ReferenceError``balance is not defined

請願書不會立即返回餘額值。出於這個原因,您需要將餘額作為承諾呼叫並等待結果,然後列印到 HTML。

您可以將其與回調函式結合併等待結果。例如:

function getETHBalanceOf(address){
web3js.eth.getBalance(address).then(function(balance){
    myBalanceVar = balance;
    //Your HTML print
}); 
}

或者您可以使用非同步函式呼叫它並等待結果。例如:

async function getTHEBalanceOf(address){
   myBalanceVar = await web3js.eth.getBalance(address);
   //Your HTML print               
}

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