ethereum扫描区块,获取区块内的交易记录

初始化客户端

⽤Go初始化以太坊客户端是和区块链交互所需的基本步骤。⾸先,导⼊go-etherem的 ethclient 包并
通过调⽤接收区块链服务提供者URL的 Dial 来初始化它。
若没有现有以太坊客户端,可以连接到官方提供的一个节点

client, err := ethclient.Dial("https://mainnet.infura.io")

完整代码

package main
import (
	"fmt"
	"log"
	"github.com/ethereum/go-ethereum/ethclient"
)
func main() {
	client, err := ethclient.Dial("https://mainnet.infura.io")
		if err != nil {
		log.Fatal(err)
	}
	fmt.Println("成功建立连接")
}

获取节点最新的区块高度

header, err := client.HeaderByNumber(context.Background(), nil)
if err != nil {
log.Fatal(err)
}
fmt.Println(header.Number.String())

获取一个完整区块
调⽤ BlockByNumber ⽅法来获得完整区块。可以读取该区块的所有内容和元数据,例如,
区块号,区块时间戳,区块摘要,区块难度以及交易列表等等

blockNumber := big.NewInt(5671744)
block, err := client.BlockByNumber(context.Background(), blockNumber)
if err != nil {
log.Fatal(err)
}
fmt.Println(block.Number().Uint64()) // 5671744
fmt.Println(block.Time().Uint64()) // 1527211625
fmt.Println(block.Difficulty().Uint64()) // 3217000136609065
fmt.Println(block.Hash().Hex()) // 0x9e8751ebb5069389b855bba72d94902cc38504266149
fmt.Println(len(block.Transactions())) // 144个交易记录

通过上面拿到的block,调用其内部方法 Transactions 可以读取到块中的事物,该事务返回了一个Transaction 类型的列表,然后循环遍历其就可以拿到有关当前区块的详细交易记录了(但是不能直接拿到from)

for _, tx := range block.Transactions() {
	fmt.Println(tx.Hash().Hex()) // 0x5d49fcaa394c97ec8a9c3e7bd9e8388d420fb050a52083c
	fmt.Println(tx.Value().String()) // 10000000000000000
	fmt.Println(tx.Gas()) // 105000
	fmt.Println(tx.GasPrice().Uint64()) // 102000000000
	fmt.Println(tx.Nonce()) // 110644
	fmt.Println(tx.Data()) // []
	fmt.Println(tx.To().Hex()) // 0x55fE59D8Ad77035154dDd0AD0388D09Dd4047A8e
}

如果想拿到from就得按照下面这个方法

for _, tx := range block.Transactions() {
	fmt.Println(tx.Hash().Hex()) // 0x5d49fcaa394c97ec8a9c3e7bd9e8388d420fb050a52083c
	fmt.Println(tx.Value().String()) // 10000000000000000
	fmt.Println(tx.Gas()) // 105000
	fmt.Println(tx.GasPrice().Uint64()) // 102000000000
	fmt.Println(tx.Nonce()) // 110644
	fmt.Println(tx.Data()) // []
	fmt.Println(tx.To().Hex()) // 0x55fE59D8Ad77035154dDd0AD0388D09Dd4047A8e
	chainID, err := client.NetworkID(context.Background())
	if err != nil {
		log.Fatal(err)
	}
	if msg, err := tx.AsMessage(types.NewEIP155Signer(chainID)); err != nil {
		fmt.Println(msg.From().Hex()) // 0x0fD081e3Bb178dc45c0cb23202069ddA57064258
	}
}

下面上传一下我写的扫描某个节点内的所有区块,并插入到数据库内的所有代码

链接: https://pan.baidu.com/s/1gVgfflwZLN6RqL-2ZHEeNQ 提取码: hnvx 复制这段内容后打开百度网盘手机App,操作更方便哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值