如何获取以太坊账户的余额?

64

我该如何以编程的方式在以太坊区块链上发现给定帐户中有多少ETH?

5个回答

79
在网上:
(非编程,但为了完整性……)如果您只想获取账户或合约的余额,您可以访问http://etherchain.orghttp://etherscan.io
从geth、eth、pyeth控制台:
使用Javascript API(也就是geth、eth和pyeth控制台使用的API),您可以使用以下代码来获取账户的余额:
web3.fromWei(eth.getBalance(eth.coinbase)); 

"web3"是适用于以太坊的JavaScript库web3.js
"eth"实际上是"web3.eth"的简写(在geth中自动提供)。因此,实际上应该这样写:
web3.fromWei(web3.eth.getBalance(web3.eth.coinbase));

"web3.eth.coinbase" 是您控制台会话的默认账户。如果需要,您可以插入其他值。在以太坊中所有账户余额都是公开的。例如,如果您有多个账户:
web3.fromWei(web3.eth.getBalance(web3.eth.accounts[0]));
web3.fromWei(web3.eth.getBalance(web3.eth.accounts[1]));
web3.fromWei(web3.eth.getBalance(web3.eth.accounts[2]));

或者

web3.fromWei(web3.eth.getBalance('0x2910543af39aba0cd09dbb2d50200b3e800a63d2'));

编辑:以下是一个方便的脚本,可以列出您所有账户的余额:
function checkAllBalances() { var i =0; eth.accounts.forEach( function(e){ console.log("  eth.accounts["+i+"]: " +  e + " \tbalance: " + web3.fromWei(eth.getBalance(e), "ether") + " ether"); i++; })}; checkAllBalances();

智能合约内部:

在智能合约内部,Solidity 提供了一种简单的方法来获取余额。每个地址都有一个 .balance 属性,返回以 wei 为单位的值。以下是示例合约:

contract ownerbalancereturner {

    address owner;

    function ownerbalancereturner() public {
        owner = msg.sender; 
    }

    function getOwnerBalance() constant returns (uint) {
        return owner.balance;
    }
}

2
我可以建议您的列出余额的脚本可以更简单:eth.accounts.forEach( function(e, i){ console.log(" eth.accounts["+i+"]: " + e + " \tbalance: " + web3.fromWei(eth.getBalance(e), "ether") + " ether") }) - user208769
1
eth.getBalance() 接收两个参数,如果你只提供一个参数会发生什么?第二个参数的默认值是什么? - knocte
1
web3.fromWei 不是一个函数。 - rsc05

4

根据文档(查看链接以获取变化),

web3.eth.getBalance("0x407d73d8a49eeb85d32cf465507dd71d507100c1")
.then(console.log);
> "1000000000000"

2

针对web3 API的新版本:

最新版本的web3 API(vers.beta 1.xx)使用Promise(异步,类似于回调函数)。 文档: web3 beta 1.xx

因此,它是一个Promise,并返回以wei为单位的给定地址的字符串。

我正在使用Linux(openSUSE),geth 1.7.3,Rinkeby Ethereum测试网络,使用Meteor 1.6.1,并通过IPC Provider连接到我的geth节点,已经使其正常工作:

// serverside js file

import Web3 from 'web3';

if (typeof web3 !== 'undefined') {
  web3 = new Web3(web3.currentProvider);
} else {
  var net = require('net');
  var web3 = new Web3('/home/xxYourHomeFolderxx/.ethereum/geth.ipc', net);
};

  // set the default account
  web3.eth.defaultAccount = '0x123..............';

  web3.eth.coinbase = '0x123..............';

  web3.eth.getAccounts(function(err, acc) {
    _.each(acc, function(e) {
      web3.eth.getBalance(e, function (error, result) {
        if (!error) {
          console.log(e + ': ' + result);
        };
      });
    });
  });

2
使用Node.js (我正在使用v11.5.0),这是行不通的,因为import不受支持。所以你需要使用const Web3 = require('web3'); - ekkis
此外,余额将以 wei 形式返回,因此需要使用 .fromWei() 进行转换。 - ekkis

1

Ethers.js

使用Ethers.js JavaScript库,您可以使用provider.getBalance()获取账户余额。
以下是一个简单的示例(使用Infura节点或类似节点):
const provider =
    new ethers.providers.WebSocketProvider('wss://mainnet.infura.io/ws/v3/<your_id>');

async function checkBalance() {
    balance = await provider.getBalance('0x2910543af39aba0cd09dbb2d50200b3e800a63d2');
    console.log(ethers.utils.formatEther(balance));
}

checkBalance();

0

'for-each'循环是有效的,但是获取余额的非常简短和简单的方法就是为函数添加await

var bal = await web3.eth.getBalance(accounts[0]);

或者如果你想直接显示它:

console.log('balance = : ', await web3.eth.getBalance(accounts[0]));

当我运行此代码时,出现了Uncaught SyntaxError: missing ) after argument list。 - Carmen Nuccio
语法错误:await 只能在异步函数中使用。 - rsc05

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接