4. 链上数据基础:区块、交易、Gas、地址标签、Token转账
大家好,我是你们的老朋友。今天咱们聊聊链上数据的基础知识。
说实话,很多做交易的朋友一听到「链上数据」就觉得头大。觉得那是程序员才该懂的东西。其实不然。你想想看,K线图反映的是价格和成交量,但链上数据告诉你的是——谁在买、谁在卖、为什么动。
我个人习惯把链上数据比作「市场的X光片」。K线是皮肤,链上是骨骼。今天我们就来把这五块骨头拆开看看:区块、交易、Gas、地址标签、Token转账。
4.1 区块:链上世界的「账本页」
区块是什么?说白了,就是区块链上的一页账本。
每产生一批交易,矿工就把它们打包成一个区块,然后链接到上一个区块后面。这就是「区块链」这个名字的由来——区块连成链。
我记得刚入行时,有个同事问我:「一个区块能装多少笔交易?」答案是——看区块大小。以太坊的区块大小是动态的,目标约1500万Gas,实际能塞多少交易取决于每笔交易的Gas消耗。
嗯,这里要注意:区块不是无限大的。如果网络拥堵,交易就得排队。这就是为什么有时候你转账要等很久。
4.2 交易:链上的一切活动
交易是区块链的核心。没有交易,区块链就是个死账本。
每一笔交易都包含:
- 发送方地址:谁发起的
- 接收方地址:发给谁
- 金额/数据:转了多少ETH,或者调用了什么合约
- Nonce:交易序号,防止双花
- Gas参数:Gas Limit 和 Gas Price
- 签名:证明是你本人操作的
我在项目中遇到过最坑的事:有个用户转账时把Gas Price设得太低,结果交易在内存池里躺了整整3天。最后不得不取消重发。所以,Gas参数千万别乱填。
status 字段。0表示失败,1表示成功。失败的交易也会消耗Gas,但不会执行状态变更。
4.3 Gas:链上的「油费」
Gas是EVM(以太坊虚拟机)的燃料。每执行一条指令,就要消耗一定量的Gas。
为什么要有Gas?说白了,是为了防止有人写死循环把链搞崩。你每步操作都要付钱,自然就不会乱来了。
| 概念 | 说明 | 我的经验 |
|---|---|---|
| Gas Limit | 你愿意为这笔交易消耗的最大Gas量 | 普通ETH转账设21000就够了 |
| Gas Price | 每单位Gas你愿意付多少Gwei | 高峰期建议用EIP-1559的Max Fee |
| Base Fee | 网络基础费用,会被销毁 | 这个数值由协议自动调整 |
| Priority Fee | 给矿工的小费,加速用 | 我一般设2-5 Gwei就够了 |
我曾经犯过一个低级错误:写合约时没注意循环里的Gas消耗,结果上线后一笔交易烧掉了0.5 ETH的Gas。嗯,从那以后我写合约都会先做Gas估算。
4.4 地址标签:给链上地址「贴名牌」
链上地址是一串乱码,比如 0x1234...abcd。正常人记不住,也分不清谁是谁。
地址标签就是给这些地址起个名字。比如:
0x...f977→ 「币安热钱包」0x...dac5→ 「某巨鲸地址」0x...0000→ 「零地址(销毁地址)」
我个人习惯用Etherscan的标签库,再结合自己的分析工具做补充。比如我发现某个地址频繁与多个交易所交互,就会给它打上「做市商」的标签。
为什么要做地址标签?因为只有知道谁在动,你才能判断市场情绪。举个例子:
- 如果某个代币的大户地址开始向交易所转账,大概率是要卖
- 如果某个项目方地址开始归集代币,可能是在准备空投
4.5 Token转账:不只是ETH在动
很多人以为链上只有ETH转账。其实ERC-20、ERC-721(NFT)等Token的转账才是大头。
Token转账和ETH转账有个关键区别:ETH转账是原生操作,Token转账是通过智能合约完成的。也就是说,每次Token转账背后都有一笔合约调用。
看Token转账数据时,我重点关注这几个字段:
- From / To:谁转给谁
- Value:转了多少,注意小数位数(比如USDT是6位小数)
- Token Contract:是哪个代币
- Transaction Hash:对应的交易哈希
我记得有一次分析一个土狗币的链上数据,发现它的转账记录里频繁出现同一个地址,每次转出后价格就跌。后来一查,那个地址是项目方的老鼠仓。嗯,链上数据不会骗人。
from web3 import Web3
w3 = Web3(Web3.HTTPProvider('https://eth-mainnet.g.alchemy.com/v2/YOUR_KEY'))
# 获取USDT合约的Transfer事件
usdt_contract = '0xdAC17F958D2ee523a2206206994597C13D831ec7'
transfer_event_signature = w3.keccak(text='Transfer(address,address,uint256)').hex()
# 查询最近100个区块的转账
logs = w3.eth.get_logs({
'fromBlock': w3.eth.block_number - 100,
'address': usdt_contract,
'topics': [transfer_event_signature]
})
for log in logs[:5]:
print(f"From: {log['topics'][1].hex()[-40:]}")
print(f"To: {log['topics'][2].hex()[-40:]}")
print(f"Value: {int(log['data'], 16) / 10**6} USDT")
print("---")
知识体系总览
下面这张图是我自己画的,把今天讲的五个知识点串起来了。你可以把它当作链上数据入门的「地图」:
这张图你看懂了吗?区块是容器,交易是内容,Gas是成本,地址标签是身份,Token转账是具体动作。五者缺一不可。
好了,今天的内容就到这里。链上数据其实没那么神秘,你只要把每个概念拆开来看,再结合实战去用,很快就能上手。
记住一句话:K线告诉你发生了什么,链上数据告诉你为什么发生。
公众号:蓝海资料掘金营,微信deep3321