【使用go开发区块链】之获取链上数据(01)

在我们实际开发项目中,很多时候都需要从链上获取区块数据,将数据加工处理后存入到数据库中,本章开始,我们来学习一下如何从链上获取数据(主动拉取)并存储到数据库中

本系列文章 1、【使用go开发区块链】之获取链上数据(01) 2、【使用go开发区块链】之获取链上数据(02) 3、【使用go开发区块链】之获取链上数据(03) 4、【使用go开发区块链】之获取链上数据(04)

1、配置文件

首先我们新建go项目,然后在项目根目录新建目录:config、internal、global、pkg,完成后的项目看起来应该是这样的: <!--StartFragment-->

<div align=center><img src="https://img.learnblockchain.cn/attachments/2023/08/n2jDFHmm64d345198687d.png">&lt;/div>

<!--EndFragment-->

config目录主要存储配置文件、配置文件操作相关类 internal目录主要存储内部类,如model、dao、service等等 global目录主要存储全局类 pkg目录主要存储第三方类

1.1、新建配置文件

在config目录下新建文件 config.yml,填写如下信息:

Database:
  DbType: mysql  #数据库类型
  DbName: go-chain-data  #数据库名称
  Host: #数据库链接,如 127.0.0.1:3306
  Username: #用户名
  Pwd: #数据库密码
  Charset: utf8  #数据库编码
  ParseTime: True

BlockChain:
  RpcUrl: https://goerli.infura.io/v3/    #  区块链rpc地址  infura.io 可以获取 

Database配置的是数据库链接信息,我们示例里使用的是mysql数据库 BlockChain配置的是区块链的rpc地址,如果没有可以访问infura.io申请

1.2、新建setting.go文件

首先在config目录下创建setting目录,然后在setting目录下新建setting.go文件,代码如下:

package setting

type DbConfig struct {
    DbType    string
    DbName    string
    Host      string
    Username  string
    Pwd       string
    Charset   string
    ParseTime bool
}
type BlockChainConfig struct {
    RpcUrl string
}

这里的结构与我们yml配置文件是一致的,后面我们会将yml配置读取到这些对象里

1.3、新建config.go文件

首先,在项目终端下执行如下命令安装viper包:

go get github.com/spf13/viper

然后,在config目下新建 config.go文件,代码如下:

package config

import (
    "github.com/spf13/viper"
)

type Config struct {
    vp *viper.Viper
}

func NewConfig() (*Config, error) {
    vp := viper.New()
    vp.SetConfigName("config")
    vp.AddConfigPath("config")
    vp.SetConfigType("yaml")
    err := vp.ReadInConfig()
    if err != nil {
        return nil, err
    }
    return &Config{vp}, nil
}

func (config *Config) ReadSection(k string, v interface{}) error {
    err := config.vp.UnmarshalKey(k, v)
    if err != nil {
        return err
    }
    return nil
}

NewConfig方法里我们创建了viper的实例对象,并读取了yml文件的配置信息 ReadSection方法可以通过给定的 k值 读取配置文件对应的 配置信息 并存到 v 变量里

2、全局变量配置

2.1、新建global.go

在global目录下新建global.go,代码如下:

package global

import (
    "go-chain-data/config/setting"
)

var (
    DbConfig         *setting.DbConfig
    BlockChainConfig *setting.BlockChainConfig
)

这里定义的变量,我们接下来会在各个类中进行调用

2.2、初始化配置

2.2.1、新建配置读取方法

首先,在config.go文件里新建SetupConfig()方法:

func SetupConfig() {
    conf, err := NewConfig()
    if err != nil {
        log.Panic("NewConfig error : ", err)
    }
    err = conf.ReadSection("Database", &global.DbConfig)
    if err != nil {
        log.Panic("ReadSection - Database error : ", err)
    }
    err = conf.ReadSection("BlockChain", &global.BlockChainConfig)
    if err != nil {
        log.Panic("ReadSection - BlockChain error : ", err)
    }
}

通过调用conf.ReadSection()方法,我们将yml里的配置读取到全局变量里,这样在其他的地方我们就可以通过global.DbConfig.X的方式进行调用

2.2.2、调用配置初始化方法

首先,在项目根目录新建main.go文件,记得把package改成main 然后,在main.go文件里新建init()方法:

func init() {
    config.SetupConfig()
}

在init()方法里,我们调用SetupConfig()方法,这个init()是go内置方法,默认会在调用类加载之前自动执行

2.3、验证配置

在main.go里新建main()方法:


func main() {
    log.Println(global.BlockChainConfig.RpcUrl)
}

接下来我们运行main()方法,输出如下:

<!--StartFragment-->

<div align=center><img src="https://img.learnblockchain.cn/attachments/2023/08/xPM0WRBF64d345d8d5c31.png">&lt;/div>

<!--EndFragment-->

说明我们的配置已经能正确的写入到了全局变量,并可以在项目里进行读取

通过本章课程学习,我们搭建了项目的基础环境,并成功的完成了配置文件的读取操作,在下节课里我们将要进一步完善项目,让我们的项目可以访问数据库,没有学会的同学可以照着教程反复练习几遍,那么下节课见吧!

请关注公众号:外柏叁布道者(web3_preacher),回复 “go获取链上数据” 领取完整代码

点赞 2
收藏 1
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
外柏叁布道者
外柏叁布道者
0x6ea1...9dbe
全网同名 资深区块链专家 更多web3、区块链技术与前沿信息 请关注公众号:外柏叁布道者(web3_preacher) Web3工具网站现已上线: https://utools.me 不定时更新各种实用工具,敬请关注 接各种Dapp、合约、web3相关工具开发