遍歷區塊數據,獲取所有歷史交易數據入庫
首先要建立數據庫 ethereum吧
然后建立數據表 表結構將跟以太坊返回的信息一致
在以太坊控制臺下輸入一下命令
~~~
eth.getBlock(0)
~~~
表示獲取第0個區塊的信息 也就是創世塊信息
~~~
difficulty: 17179869184,
extraData: "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
gasLimit: 5000,
gasUsed: 0,
hash: "0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3",
logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
miner: "0x0000000000000000000000000000000000000000",
mixHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
nonce: "0x0000000000000042",
number: 0,
parentHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
size: 540,
stateRoot: "0xd7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544",
timestamp: 0,
totalDifficulty: 17179869184,
transactions: [],
transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
uncles: []
~~~
將這個json格式數據剔除掉 transactions 和 uncles后轉換為數據表字段
所以sql語句如下
~~~
CREATE TABLE `ethereum_block` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`difficulty` varchar(32) NOT NULL COMMENT '工作難度',
`extraData` varchar(255) NOT NULL COMMENT '外部數據',
`gasLimit` varchar(11) NOT NULL COMMENT '限制的氣體數量',
`gasUsed` varchar(30) NOT NULL COMMENT '所使用的氣體總量',
`hash` varchar(255) NOT NULL COMMENT 'hash值',
`logsBloom` text NOT NULL,
`miner` varchar(255) NOT NULL COMMENT '曠工',
`mixHash` text NOT NULL COMMENT '最小hash',
`nonce` text NOT NULL COMMENT '隨機數',
`number` int(11) NOT NULL COMMENT '第幾個區塊',
`parentHash` varchar(255) NOT NULL COMMENT '前一區塊的hash',
`receiptsRoot` varchar(255) NOT NULL COMMENT '接收根',
`sha3Uncles` varchar(255) NOT NULL,
`size` varchar(255) NOT NULL COMMENT '區塊尺寸 即大小',
`stateRoot` varchar(255) NOT NULL COMMENT '星宿 百度翻譯的',
`timestamp` int(11) NOT NULL COMMENT '時間戳',
`totalDifficulty` varchar(255) NOT NULL COMMENT '總難度',
`transactionsRoot` varchar(255) NOT NULL COMMENT '交易根',
`create_at` int(11) NOT NULL COMMENT '創建時間 插入數據庫時間',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='以太坊區塊表';
~~~
然后寫一個死循環的程序
思路如下:
先查詢本地數據的最后一條數據,
獲取number的數字,
然后遞增1查下一個區塊信息,
一直查詢區塊信息
這樣就可以遍歷所有的區塊高度信息了
下面是實例代碼
public function getBlockInfo()
{
$db = D('Block');
$number = $db->max('number');
// $this->ajaxReturn($number);
if (!$number) {
$number = 0;
}
$block = '0x'. dechex($number + 1); // 需要轉換為16進制數據
$info = $this->eth->eth_getBlockByNumber($block,true); // 查詢區塊高度所包含的信息
if (!$info) {
$this->ajaxReturn(['code'=>0,'msg'=>'data is empty']);
}
$res = $db->update($info); // 添加高度信息
if ($res) {
$this->ajaxReturn(['code'=>1,'msg'=>'add data ok']);
}else{
$this->ajaxReturn(['code'=>0,'msg'=>'add data fail']);
}
}
需要注意的是 jsonrpc調用api命令與在控制臺直接使用是不一樣的 需要參考下官網文檔
sh執行該php方法 (域名都不需要)
cd /data/wwwroot/www.ethereum.io/
while true
do
php /data/wwwroot/www.ethereum.io/index.php Api/Block/getBlockInfo
done
nohup sh block.sh &
一直跑到死為止..........這樣肯定是不行的
數據庫數據太大了 肯定不行 現在的區塊高度是620多萬了
可以優化一下該信息的 具體怎么優化留給你們思考吧