6.以太坊php web3 余额查询

正文开始

[md] 获取账户余额

以太坊定义了eth_getBalance 接口用来获取账户余额,在web3.php中,对应Web3\Eth的getBalance()方法。

例如,下面的代码读取节点管理的第一个账户的余额:【demo repo\chapter4\blance.php】

<?php
require('../vendor/autoload.php');

use Web3\Web3;
use EthTool\Callback;

$web3 = new Web3('http://localhost:8545');
$cb = new Callback;

$web3->eth->accounts($cb); 
$accounts = $cb->result;

$web3->eth->getBalance($accounts[0],'latest',$cb);
echo 'balance in latest block: ' . $cb->result . PHP_EOL;

$web3->eth->getBalance($accounts[0],'earliest',$cb);

echo 'balance in earliest block: ' . $cb->result . PHP_EOL;

?>

注意eth_getBalance接口的第二个参数,使用它来指定一个特定的块。 'latest'这个字符串表示使用链上的最后一个块,也就意味着它使用最后一个块的状态树 中记录的账户余额,即当前账户余额:

由于每个块都有对应着块生成那一时刻的状态树,因此你指定一个不同的块,就意味着 将账户余额这个状态回溯到那个块生成的特定时刻。例如,查看这个账户 最初的余额:

$web3->eth->getBalance($accounts[0],'earliest',$cb);
echo 'balance in earliest block: ' . $cp->result . PHP_EOL;

也可以使用编号来指定块,例如,查看第12块时的账户余额:

$web3->eth->getBalance($accounts[0],12,$cb);
echo 'balance in block 12#: ' . $cb->result . PHP_EOL;

以太坊货币单位

如果你成功打印输出了节点账户的余额,可能会吓一跳,怎么这么多钱!

balance in latest block: 100000000000000000000

嗯,通货膨胀 “)

eth_getBalance调用返回的数字,其单位为wei,是以太币众多面值单位中 最小的一只,而我们常说的1个以太币,则对应单位ether,这两者之间差着 18个0:

1 ether = 1000000000000000000 wei

因此上面的账户余额,按ether计算,就是100个以太币了 —— 默认情况下,ganache 创建的测试账户自动充值100个以太。

以太坊定义了10个等级的面值单位,连续两个单位之间总是差3个0,也就是1000倍 的关系。下表列出了常用的单位:

单位 wei Kwei(babbage) Mwei(lovelace) Gwei(shannon) microether(szabo) milliether(finney) ether
单位价值 1 wei 1e3 wei 1e6 wei 1e9 wei 1e12 wei 1e15 wei 1e18 wei
换算为wei 1 1,000 1,000,000 1,000,000,000 1,000,000,000,000 1,000,000,000,000,000 1,000,000,000,000,000,000

值得指出的是,这些货币单位的名称,大多取自在计算机与密码学领域做出杰出 贡献的科学家的名字。例如:wei取自Wei Dai,戴伟,密码学家,B-Money发明人:

这个有必要顶一下,华人的骄傲!

其他的还有:

lovelace:Ada Lovelace,诗人拜伦之女,据称是第一个女程序员 babbage:Charles Babbage,英国数学家、发明家、机械工程师,提出了 差分机与分析机的概念设计,被视为计算机先驱 shannon:Claude Elwood Shannon,美国数学家、电子工程师和密码学家, 现代信息论的创始人 szabo:Nick Szabo,密码学家,智能合约概念的提出者 finney:Hal Finney,密码学家,提出了工作量证明机制(POW) ether则取自从古希腊开始就被认为是构成天体的神秘物质,一直到19世纪科学家 都认为宇宙中充满了以太,认为光是通过以太传播的 —— 当然,现在这种观点已经被 抛弃了。

货币单位表示与换算

在web3.php的Web3\Utils类中,定义了以太坊的货币单位:

class Utils{
  const UNITS = [
      'noether' => '0',
      'wei' => '1',
      'kwei' => '1000',
      'Kwei' => '1000',
      'babbage' => '1000',
      'femtoether' => '1000',
      'mwei' => '1000000',
      'Mwei' => '1000000',
      'lovelace' => '1000000',
      'picoether' => '1000000',
      'gwei' => '1000000000',
      'Gwei' => '1000000000',
      'shannon' => '1000000000',
      'nanoether' => '1000000000',
      'nano' => '1000000000',
      'szabo' => '1000000000000',
      'microether' => '1000000000000',
      'micro' => '1000000000000',
      'finney' => '1000000000000000',
      'milliether' => '1000000000000000',
      'milli' => '1000000000000000',
      'ether' => '1000000000000000000',
      'kether' => '1000000000000000000000',
      'grand' => '1000000000000000000000',
      'mether' => '1000000000000000000000000',
      'gether' => '1000000000000000000000000000',
      'tether' => '1000000000000000000000000000000'
  ];
}

由于在运算中通常使用wei和ether作为计量单位,Utils类同时也提供了三个静态 方法用于将其他单位换算到wei或ether,或者从wei换算到其他单位:

例如,下面的代码将1个ether转换为wei计量的值:[demo: repo\chapter4\units.php ]

$oneEther = Utils::toWei('1','ether');

toWei()方法返回一个BigInteger对象,可以使用toString()方法将其转换为字符串。

又如,下面的代码将1 wei转换为kwei计量的值:

list($quotient,$residue) = Utils.fromWei("1300",'kwei');
echo $quotient . ' kwei ' . $residue . ' wei' . PHP_EOL;

注意fromWei()方法返回的是一个数组,两个成员都是BigInteger对象,第一个表示 商,第二个表示余数。因此我们可以使用一个list来分别取出这两部分的值。因此上面的 结果是:1 kwei 300 wei。

如果你需要进行转换的两个单位中不包含wei,那么可以结合fromWei() 和toWei()这两个函数,先转化到wei,再转化到目标单位。

下一篇:7.php以太坊使用裸交易

正文结束

1.以太坊php web3 在windows10下调试——ganache工具的安装 【hi 以太坊】 7.以太坊php web3 使用裸交易