Solidity
用乙太幣呼叫合約只返回十六進制值
我正在嘗試呼叫契約的功能。我正在託管一個帶有安全帽的本地節點,顯然我將契約部署到該節點。連接 MetaMask 和所有工作都沒有問題。在控制台中,我還可以看到,合約在節點上被呼叫。在文件中它說返回的值應該是實際的整數。但我只得到以下輸出:
對象{_hex:“0x042deee8d42de3f0”,_isBigNumber:真}
合約呼叫如下所示:
const contractAddress = "address", const abi = ["function getBalance() public view returns (uint256)"] const provider = new ethers.providers.Web3Provider(window.ethereum) await provider.send("eth_requestAccounts", []) let contract = new ethers.Contract(contractAddress, abi, provider) const balance = await contract.getBalance() console.log("Balance: ", balance)
如何獲得實際的整數值?
這些
ethers.js
方法返回一個ethers.BigNumber
實例而不是原生 JavaScript 數字,因為原生 JavaScript 數字不支持我們在加密中使用的大數字,並且會默默溢出產生災難性錯誤的數字。您可以將
balance
變數作為字元串獲取balance.toString()
。相反,您可能想要一個人類可讀的 ETH 數字(而不是您剛剛獲得的 wei 數字,即 10 的 18 次方),在這種情況下,您可以執行類似的操作ethers.utils.formatUnits(balance, 18)
你可以用 把它變成一個 JavaScript 數字
balance.toNumber()
,但你不應該這樣做,除非你確定它不會溢出,你可能不會。要對這些數字做任何其他事情,請閱讀
ethers.BigNumber
文件。您應該閱讀全文,因為粗心的人會遇到各種陷阱。另請注意,它與更常見的庫和替代庫ethers.BigNumber
略有不同。BigNumber.js``BN.js