[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以太坊使用裸交易