一.区块链加载解析
对于数据的下载主要包括三种方式:
1.实现比特币网络协议,通过该协议和其他比特币全节点建立联系,然后同步区块数据。
2.通过比特币节点提供的API服务下载区块链数据。
3.通过blickchain.com提供的rest服务下载区块数据。
1.搭建提供公链数据服务的全节点
全节点是拥有完整区块链帐本资料的节点,具备独立验证的能力来确认交易之有效性。具体来说全节点主要在处理下列四件事:
- 储存所有历史交易信息,资料公开透明
- 监测矿工挖出来的新区块,验证其合法性后同步该区块
- 监测区块链网络中的新交易信息,验证每个交易的合法性
- 将验证过的「交易/区块信息」广播给全网络节点
1.部署节点(参考ETH全节点搭建教程(2024) | 登链社区 | 区块链技术社区 )
选择要提供数据服务的公链,比如以太坊、比特币、波卡等。以以太坊为例:
- 服务器配置:系统:Linux CPU:16核 内存:128 GB 内存 带宽:1G以上 硬盘:大于4T固态SSD可用空间数据盘
- 系统环境:git、golang等
- 节点安装部署:
# 安装ETH版本的prysm
cd / #进入根目录
mkdir eth #创建eth文件夹
cd eth
mkdir consensus
mkdir execution
cd consensus
mkdir prysm && cd prysm
curl https://raw.githubusercontent.com/prysmaticlabs/prysm/master/prysm.sh --output prysm.sh && chmod +x prysm.sh
./prysm.sh beacon-chain generate-auth-secret
# 安装ETH版本的geth
cd /eth #进入eth目录
git clone https://github.com/ethereum/go-ethereum.git
make geth
cd go-ethereum/build/bin
# 启动ETH信标客户端
screen -S prysm #创建prysm启动窗口
./prysm.sh beacon-chain --execution-endpoint=http://localhost:8551 --jwt-secret=/eth/consensus/prysm/jwt.hex
# 启动ETH执行客户端
screen -S eth #创建eth启动窗口
./geth --cache 10240 --datadir ./node --ws --ws.port 8546 --ws.addr 0.0.0.0 --ws.origins '*' --authrpc.addr localhost --authrpc.port 8551 --authrpc.vhosts localhost --maxpeers=300 --authrpc.jwtsecret /eth/consensus/prysm/jwt.hex --state.scheme=path
d. 节点状态监听
geth attach http://localhost:8545 #端口如果修改配置文件了,就填写配置文件的端口即可
> eth.syncing #查看当前区块情况,结果为false表示已同步最新区块
# currentBlock: 14290861, #当前同步到区块高度 highestBlock: 14297354, #主网当前高度 knownStates:297473485, pulledStates: 297473485, startingBlock: 14270385
# 同步到最高区块用了大概72小时左右就追到了最高区块。
2.拉取数据备份到本地。
3.使用数据分析服务。
(由于数据量过大暂未测试)
2.通过比特币节点提供的API服务下载区块链数据。
- 使用区块链浏览器(比如Blockchain Explorer)可以直观地查看特定地址的交易记录。你只需在区块链浏览器中输入地址,就能查看到相关的交易信息、交易金额、时间戳等。
Bitcoin:
在https://www.okx.com/zh-hans/web3/explorer/ 中记录了44个主流的虚拟货币网站,包括:
BTC、ETH、BNB Chain、Polygon、XL、TRON、Scroll、USDT、Solana、ArbitrumOne、OP Mainnet等
2. 网站提供相关的API接口:
有些区块链提供了API接口,允许开发者通过编程方式查询特定地址的交易记录。你可以查阅该区块链的开发文档,了解如何使用他们的API接口。
按照地址查询交易列表,查询 BTC 、LTC、 Doge 、BCH、Cardano 等链,比如:
curl --location --request GET 'https://www.okx.com/api/v5/waas/wallet/post-transaction/transactions-by-address?accountId=44486e05-3235-2f8e-5fe2-a8ab46217863&chains=111,333&chainIndex=1&tokenAddress=xxx&cursor=1&limit=20&begin=168000021888"&end=168000031888 \
--header 'Content-Type: application/json' \
--header 'OK-ACCESS-PROJECT: 86af********d1bc' \
--header 'OK-ACCESS-KEY: 37c541a1-****-****-****-10fe7a038418' \
--header 'OK-ACCESS-SIGN: leaV********3uw=' \
--header 'OK-ACCESS-PASSPHRASE: 1****6' \
--header 'OK-ACCESS-TIMESTAMP: 2023-10-18T12:21:41.274Z' \
{
"code": "0",
"data": [
{
"chainIndex": 3,
"orderId": "string",
"txHash": "0xcbf411766d65f3cf92839ababa73c4afec69a83442e8b67a68b5104b50a04ejb",
"fromAddr": "0x5ffe4eabaf030jg7a1a75d309ead7ad31a0ef980",
"toAddr": "0x5ffe4eabaf03ff67a1a75d309ead7ad31a0ef817",
"txType": "2",
"txTime": "0",
"txStatus": "1",
"assetSummary": [{
"tokenAmount": "5.5",
"tokenAmountNum": "5",
"direction":"1",
"precision": "8",
"tokenSymbol": "ETH",
"tokenName": "ETH",
"tokenLogoUrl": "http://",
"tokenAddress": ""
}]
}
],
"msg": "success"
}
按照钱包IP查找所有或某条链的交易历史:
curl --location --request GET 'https://www.okx.com/api/v5/waas/wallet/post-transaction/transactions?accountId=44486e05-3235-2f8e-5fe2-a8ab46217863&chains=111,333&chainIndex=1&tokenAddress=xxx&cursor=1&limit=20&begin=168000021888"&end=168000031888 \
--header 'Content-Type: application/json' \
--header 'OK-ACCESS-PROJECT: 86af********d1bc' \
--header 'OK-ACCESS-KEY: 37c541a1-****-****-****-10fe7a038418' \
--header 'OK-ACCESS-SIGN: leaV********3uw=' \
--header 'OK-ACCESS-PASSPHRASE: 1****6' \
--header 'OK-ACCESS-TIMESTAMP: 2023-10-18T12:21:41.274Z' \、
响应体
{
"code": "0",
"data": [
{
"chainIndex": "3",
"orderId": "string",
"txHash": "0xcbf411766d65f3cf92839ababa73c4afec69a83442e8b67a68b5104b50a04ejb",
"fromAddr": "0x5ffe4eabaf030jg7a1a75d309ead7ad31a0ef980",
"toAddr": "0x5ffe4eabaf03ff67a1a75d309ead7ad31a0ef817",
"txType": "2",
"txTime": "0",
"txStatus": "1",
"assetSummary": [{
"tokenAmount": "5.5",
"tokenAmountNum": "5",
"direction":"1",
"precision": "8",
"tokenSymbol": "ETH",
"tokenName": "ETH",
"tokenLogoUrl": "http://",
"tokenAddress": ""
}]
}
],
"msg": "success"
}
3.通过blickchain.com提供的rest服务下载区块数据。
第一个接口:通过区块高度查询区块哈希。我们以创世区块(Genesis Block,高度为0)为例,调用这个接口:https://blockchain.info/block-height/0?format=json,下面是返回的数据(JSON格式,省略了大部分无关内容):
{
"blocks": [
{
"hash": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",
"ver": 1,
"prev_block":"0000000000000000000000000000000000000000000000000000000000000000",
...
}
]
}
第二个接口:通过区块哈希查询区块原始数据。我们还是以创世区块为例,调用这个接口:https://blockchain.info/rawblock/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f?format=hex,下面是返回的数据(16进制字符串,换行是为了方便展示而人为添加的):
0100000000000000000000000000000000000000000000000000000000000000
000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa
4b1e5e4a29ab5f49ffff001d1dac2b7c01010000000100000000000000000000
00000000000000000000000000000000000000000000ffffffff4d04ffff001d
0104455468652054696d65732030332f4a616e2f32303039204368616e63656c
6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f75742066
6f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe554827
1967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4
f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000
解析:
区块头是前面 80 个字节,最开始第一个字节是版本号,往后 32 个字节是前一个区块的哈希值,由于这是第一个区块,它的前面没有区块,所以 32 个字节都是 0,再往后 32 个字节是交易列表的哈希树,再往后 4 个字节是时间,内容是 29 AB 5F 49,转换成后的时间戳是 1231006505,再往后是当前难度,最后 4 个字节是随机数,如下表:
字段 | 含义 | 长度 | 内容 |
Version | 版本号 | 4 | 01 |
PreviousBlockHash | 前一个区块头的哈希值 | 32 | 0000000000000000000000000000000000000000000000000000000000000000000000 |
MerkleRoot | 交易列表的哈希树 | 32 | 3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a |
Time | 时间戳 | 4 | 29ab5f49 |
Bits | 挖矿难度 | 4 | ffff001d |
Nonce | 随机数 | 4 |
区块体:第 81 个字节开始是区块体,区块体第一个字节是交易的数量,内容是 01,说明只有一笔交易。往后的字节是交易体,交易体字段如下表,有一个需要注意的地方,Value 字段是 BTC 的数据,这里是小端格式,内容是十六进制值 0x00f2052a01000000 转化为大端格式十六进制值0x000000012a05f200,再转化为十进制值为 5000000000,比特币最小单位是聪,表示该交易输出比特币是 50 亿聪,也就是挖出该区块得到的 50 个比特币奖励。
字段 | 含义 | 长度 | 内容 |
Version | 版本号 | 4 | 01000000 |
InputCount | 输入的条数 | 1 | 01 |
UTXOHash | UTXO交易哈希值 | 32 | 0000000000000000000000000000000000000000000000000000000000000000 |
outputIndex | 输出索引 | 4 | ffffffff |
ScriptLen | 脚本长度 | 1 | 十六进制 4D,十进制 77 |
Script | 脚本内容 | 不定 | ��EThe Times 03/Jan/2009 Chancellor on brink of second bailout for banks |
Sequence | 字节序列号 | 4 | ffffffff |
outputCount | 输出索引 | 1 | 01 |
Value | BTC数值 | 8 | 00f2052a01000000,转换为 5000000000 |
lockScriptLen | 锁定脚本长度 | 1 | 十六进制 43,十进制 67 |
lockScriptBody | 锁定脚本长度 | 不定 | |
lockScriptTime | 锁定时间 | 4 | 00000000 |
ÿÿETime 03/Jan/2009 Chancellor on brink of second bailout for banks这是比特币的创世区块中coinbase交易的文本部分,按照ASCII编码解码后的内容。
为了说明清晰的说明交易内容,可以查看最新的一个区块链的数据块https://blockchain.info/rawblock/00000000000000000001d1ddded79928d137b52784731b17b70ad56a21f7e666
选取其中一笔交易:
{
"hash": "1b7fc239d4c7d04356a90e274a328bb06fb8e32f540bab79778072af1ee27a6a",
"ver": 2,
"vin_sz": 1,
"vout_sz": 1,
"size": 219,
"weight": 465,
"fee": 2206,
"relayed_by": "0.0.0.0",
"lock_time": 0,
"tx_index": 3746432390917712,
"double_spend": false,
"time": 1719985042,
"block_index": 850489,
"block_height": 850489,
"inputs": [
{
"sequence": 4294967295,
"witness": "0340d1811e193217f655131d151c436e9896767101d39812500865f87889261b539951bfb12ca9a609abbdc3d80d6816ecb198914cd5c1f6f16f6d91197262534dbf220063036f7264510a746578742f706c61696e000d3835303438392e6269746d61706821c1c72952c171396617fbb3a4e0dbb8f4e92eb5835738b3ba0a4c6f0c11ef0c920b",
"script": "",
"index": 0,
"prev_out": {
"type": 0,
"spent": true,
"value": 2500,
"spending_outpoints": [
{
"tx_index": 3746432390917712,
"n": 0
}
],
"n": 404,
"tx_index": 3166247195096694,
"script": "5120f11de4ecaf49d876598ab136dc86d978449dda0af7aa53bea4ad63b2febdc0c6",
"addr": "bc1p7yw7fm90f8v8vkv2kymdepke0pzfmks27749804y443m9l4acrrqau96l9" //这里看到交易from的地址
}
}
],
"out": [
{
"type": 0,
"spent": false,
"value": 294,
"spending_outpoints": [],
"n": 0,
"tx_index": 3746432390917712,
"script": "00143c8c5b36c1500321291b25b5612f5d8cdb40dba8",
"addr": "bc1q8jx9kdkp2qpjz2gmyk6kzt6a3nd5pkagrd79fx" //这里看到交易to的地址
}
]
},
结束语:大家参考引用本文时注意加入来源引用
参考
- api查询区块统计数据 https://www.okx.com/zh-hans/web3/build/docs/waas/walletapi-api-transaction-list
- api查询区块统计数据 OKLink API接入指南 | OKLink技术对接 | 欧科云链
- 钱包:Web3通识课2-助记词、钱包地址、资产的关系-钱包的分类-巴比特从0到1极速通关Web3.0系列课程_哔哩哔哩_bilibili
- 钱包助记词规范: BIP39 钱包助记词规范 - 编程宝库
- 下载区块数据: blog/articles/btc/2021_07_25_mybtc1_download_blocks.md at main · zxh0/blog · GitHub
- ETH全节点搭建教程 ETH全节点搭建教程(2024) | 登链社区 | 区块链技术社区
- 区块链架构之美:GitHub - Ice-Storm/structure-and-interpretation-of-blockchain: 区块链的构造和解释(structure-and-interpretation-of-blockchain)
- 解读比特币区块链的数据结构: 解读比特币区块链的数据结构 – exchen's blog
- 区块信息:https://www.kg.com/article/507675167221223424