赞
踩
⽤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,操作更方便哦
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。