在我們實(shí)際開發(fā)項(xiàng)目中,很多時(shí)候都需要從鏈上獲取區(qū)塊數(shù)據(jù),將數(shù)據(jù)加工處理后存入到數(shù)據(jù)庫(kù)中,本章開始,我們來學(xué)習(xí)一下如何從鏈上獲取數(shù)據(jù)(主動(dòng)拉取)并存儲(chǔ)到數(shù)據(jù)庫(kù)中
本系列文章
1、【使用go開發(fā)區(qū)塊鏈】之獲取鏈上數(shù)據(jù)(01)
2、【使用go開發(fā)區(qū)塊鏈】之獲取鏈上數(shù)據(jù)(02)
3、【使用go開發(fā)區(qū)塊鏈】之獲取鏈上數(shù)據(jù)(03)
4、【使用go開發(fā)區(qū)塊鏈】之獲取鏈上數(shù)據(jù)(04)
1、配置文件
首先我們新建go項(xiàng)目,然后在項(xiàng)目根目錄新建目錄:config、internal、global、pkg,完成后的項(xiàng)目看起來應(yīng)該是這樣的:
config目錄主要存儲(chǔ)配置文件、配置文件操作相關(guān)類
internal目錄主要存儲(chǔ)內(nèi)部類,如model、dao、service等等
global目錄主要存儲(chǔ)全局類
pkg目錄主要存儲(chǔ)第三方類
1.1、新建配置文件
在config目錄下新建文件 config.yml,填寫如下信息:
Database:
DbType: mysql #數(shù)據(jù)庫(kù)類型
DbName: go-chain-data #數(shù)據(jù)庫(kù)名稱
Host: #數(shù)據(jù)庫(kù)鏈接,如 127.0.0.1:3306
Username: #用戶名
Pwd: #數(shù)據(jù)庫(kù)密碼
Charset: utf8 #數(shù)據(jù)庫(kù)編碼
ParseTime: True
BlockChain:
RpcUrl: https://goerli.infura.io/v3/ # 區(qū)塊鏈rpc地址 infura.io 可以獲取
Database配置的是數(shù)據(jù)庫(kù)鏈接信息,我們示例里使用的是mysql數(shù)據(jù)庫(kù)
BlockChain配置的是區(qū)塊鏈的rpc地址,如果沒有可以訪問infura.io申請(qǐng)
1.2、新建setting.go文件
首先在config目錄下創(chuàng)建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
}
這里的結(jié)構(gòu)與我們yml配置文件是一致的,后面我們會(huì)將yml配置讀取到這些對(duì)象里
1.3、新建config.go文件
首先,在項(xiàng)目終端下執(zhí)行如下命令安裝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方法里我們創(chuàng)建了viper的實(shí)例對(duì)象,并讀取了yml文件的配置信息
ReadSection方法可以通過給定的 k值 讀取配置文件對(duì)應(yīng)的 配置信息 并存到 v 變量里
2、全局變量配置
2.1、新建global.go
在global目錄下新建global.go,代碼如下:
package global
import (
"go-chain-data/config/setting"
)
var (
DbConfig *setting.DbConfig
BlockChainConfig *setting.BlockChainConfig
)
這里定義的變量,我們接下來會(huì)在各個(gè)類中進(jìn)行調(diào)用
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)
}
}
通過調(diào)用conf.ReadSection()方法,我們將yml里的配置讀取到全局變量里,這樣在其他的地方我們就可以通過global.DbConfig.X的方式進(jìn)行調(diào)用
2.2.2、調(diào)用配置初始化方法
首先,在項(xiàng)目根目錄新建main.go文件,記得把package改成main
然后,在main.go文件里新建init()方法:
func init() {
config.SetupConfig()
}
在init()方法里,我們調(diào)用SetupConfig()方法,這個(gè)init()是go內(nèi)置方法,默認(rèn)會(huì)在調(diào)用類加載之前自動(dòng)執(zhí)行
2.3、驗(yàn)證配置
在main.go里新建main()方法:
func main() {
log.Println(global.BlockChainConfig.RpcUrl)
}
接下來我們運(yùn)行main()方法,輸出如下:
說明我們的配置已經(jīng)能正確的寫入到了全局變量,并可以在項(xiàng)目里進(jìn)行讀取
通過本章課程學(xué)習(xí),我們搭建了項(xiàng)目的基礎(chǔ)環(huán)境,并成功的完成了配置文件的讀取操作,在下節(jié)課里我們將要進(jìn)一步完善項(xiàng)目,讓我們的項(xiàng)目可以訪問數(shù)據(jù)庫(kù),沒有學(xué)會(huì)的同學(xué)可以照著教程反復(fù)練習(xí)幾遍,那么下節(jié)課見吧!文章來源:http://www.zghlxwxcb.cn/news/detail-815015.html
請(qǐng)關(guān)注公眾號(hào):外柏叁布道者(web3_preacher),回復(fù) “go獲取鏈上數(shù)據(jù)” 領(lǐng)取完整代碼文章來源地址http://www.zghlxwxcb.cn/news/detail-815015.html
到了這里,關(guān)于【使用go開發(fā)區(qū)塊鏈】之獲取鏈上數(shù)據(jù)(01)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!