filecoin技术架构分析之九:filecoin源码分析之支撑包分析(1/2)

本文作者:杨尉;原创作品,转载请注明出处

[上一篇链接] filecoin技术架构分析之八:8 filecoin源码协议层分析之检索协议
[下一篇链接] filecoin技术架构分析之十:10 filecoin源码分析之支撑包分析(2/2)

目录

  • 9 filecoin源码分析之支撑包分析(1)
    • 9.1 目的
    • 9.2 编译相关
    • 9.3 cborutil
    • 9.4 address
    • 9.5 config
    • 9.6 crypto
    • 9.7 util/convert
    • 9.8 functional-tests
    • 9.9 flags
    • 9.10 fixtures
    • 9.11 filnet

9.1 目的

简析一些支撑包,便于后面分析的理解

为了不至于篇幅过长,分为多章发布。

9.2 编译相关

  • bin目录:主要为编译用shell脚本
  • bls-signatures: 通过cgo编译,导出库及头文件
  • build: 编译相关
  • util/version:版本检查
  • scripts:相关脚本

9.3 cborutil

  • 对外提供功能
    • 读取流消息
    • 写入流消息
    • 主要被协议层使用
 package
    cborutil

 imports

 constants
   +MaxMessageSize

 variables
   +ErrMessageTooLarge

+MsgReader : struct
    [fields]
   -br : *bufio.Reader
    [methods]
   +ReadMsg(i interface{}) : error
    [functions]
   +NewMsgReader(r io.Reader) : *MsgReader
 package
    cborutil

 imports

+MsgWriter : struct
    [fields]
   -w : *bufio.Writer
    [methods]
   +WriteMsg(i interface{}) : error
    [functions]
   +NewMsgWriter(w io.Writer) : *MsgWriter

9.4 address

  • 对外提供功能
    • 地址相关操作功能
    • 实例化铸币地址、存储市场地址、支付通道地址
    • 实例化两个测试地址
    • 提供主网地址、测试网地址创建接口
    • 提供地址格式转换功能,包含22bytes与41bytes、切片字符串转换、打印。
    • 提供地址的合法性检查功能
  • 地址格式
    • 要与id区分开,id用的是ipfs中的cid,而地址则是filecoin独立定义的。
    • 22 bytes地址:包含1byte网络类型、1byte地址版本、20bytes哈希
    • 41 bytes地址:包含2bytes网络类型、1byte地址版本、32bytes编码值、6bytes校验和
    • 用命令显示的是41bytes格式的地址,address包提供了22bytes与41bytes地址的转换接口
location: address/constants.go

 package
    address

 imports

 constants
    // Base32编码的字符集
   +Base32Charset
    // 地址的哈希部分,目前为20 bytes
   +HashLength, 20bytes,160bit
    // 地址长度,为HashLength+1+1= 22 bytes
   +Length
    // 地址格式的版本定义:当前为0
   +Version : byte

 variables
    // 基于Base32Charset的Base32实例,用于编解码
   +Base32
    // Base32 Reverse集合
   +Base32CharsetReverse
    // 铸币地址,基于"filecoin"哈希生成
   +NetworkAddress : Address
    // 支付通道地址
   +PaymentBrokerAddress : Address
    // 存储市场地址
   +StorageMarketAddress : Address
    // 测试地址
   +TestAddress : Address
    // 测试地址
   +TestAddress2 : Address

 functions
   -init()
location: address/address.go

 package
    address

 imports

 constants
   +Mainnet : Network
   +Testnet

 variables
    // 错误提示
   +ErrInvalidBytes
   +ErrUnknownNetwork
   +ErrUnknownVersion
   -generator
    // 配置输入哈希长度20bytes
   -hashConfig

   // Address为22字节字符串
+Address : []byte
    [methods]
    // 转换为编码前地址切片输出
   +Bytes() : []byte
    // 判断地址是否为空
   +Empty() : bool
    // 打印地址信息
   +Format(f fmt.State, c rune)
    // 输出地址中的20bytes哈希值
   +Hash() : []byte
    // 转换为编码后地址切片输出
   +MarshalText() : []byte, error
    // 输出地址的网络类型
   +Network() : Network
    // 转换为41bytes的编码输出
    // 2(网络类型)+1(地址版本)+32(base32编码)+6(base32校验位)
   +String() : string
    // 编码后地址切片输出转换为字符
   +UnmarshalText(in []byte) : error
    // 获取地址版本号
   +Version() : byte

    // 类型定义
 +Network : byte

 functions
    // 采用blake2b-160再次哈希
   +Hash(input []byte) : []byte
    // 生成测试网络地址,输入为原始哈希,会执行blake2b-160再次哈希
   +MakeTestAddress(input string) : Address
    // 通过字符串网络类型转换为byte网络类型
    // fc:主网转化为0
    // tf:测试网化为1
   +NetworkFromString(input string) : Network, error
    // 通过byte网络类型转换为字符串网络类型
    // 0:主网转化为fc
    // 1:测试网化为tf
   +NetworkToString(n Network) : string
    // 构建新地址:输入为原始20bytes哈希+网络类型+地址版本
   +New(network Network, hash []byte) : Address
    // 构建新地址:输入为22bytes的原始切片
   +NewFromBytes(raw []byte) : Address, error
    // 通过41bytes的字串串生成22bytes的原始地址
   +NewFromString(s string) : Address, error
    // 构建新地址:输入为原始20bytes哈希,调用New
   +NewMainnet(hash []byte) : Address
    // 生成测试网络地址,输入为原始哈希再次哈希,被MakeTestAddress调用
   +NewTestnet(hash []byte) : Address
    // 校验41bytes地址的合法性
   +ParseError(addr string) : error

    // base32编码校验码生成,结果为6bytes
   -createChecksum(hrp string, data []byte) : []byte
    // 解码
   -decode(addr string) : string, byte, []byte, error
    // 编码
   -encode(hrp string, version byte, data []byte) : string, error
   -hrpExpand(hrp string) : []byte
   -init()
   -polymod(values []byte) : uint32
    // 校验和验证
   -verifyChecksum(hrp string, data []byte) : bool

location: address/set.go

 package
    address

 imports

 variables
   -addrSetEntry

   // 地址集合
 +Set : map[Address]

 functions
   -init()

9.5 config

  • 对外提供功能
    • 提供对内存中配置的实例化操作
    • 对具体实例的设置和读取
    • 对配置文件的读写
    • 包含API、启动、数据存储、网络连接、挖矿、钱包、心跳相关配置
 package
    config

 imports

 variables
    // 对特定参数的合法性校验规则集合
    // 1 目前只是限定昵称为字符
   +Validators

+APIConfig : struct
    [fields]
    // 是否允许跨域请求
   +AccessControlAllowCredentials : bool
    // 允许的方法列表
   +AccessControlAllowMethods : []string
    // 允许的元列表
   +AccessControlAllowOrigin : []string
    // 地址
   +Address : string
    [functions]
    // 实例化APIconfig
   -newDefaultAPIConfig() : *APIConfig

+BootstrapConfig : struct
    [fields]
    // 启动地址集合
   +Addresses : []string
    // 最小节点阈值
   +MinPeerThreshold : int
    // 启动时间阈值,目前为10s
   +Period : string
    [functions]
    // 实例化启动配置的接口
   -newDefaultBootstrapConfig() : *BootstrapConfig

    // 存储在内存之中的filecoin配置
+Config : struct
    [fields]
    // API相关
   +API : *APIConfig
    // 启动相关
   +Bootstrap : *BootstrapConfig
    // 数据存储相关
   +Datastore : *DatastoreConfig
    // 心跳相关
   +Heartbeat : *HeartbeatConfig
    // 挖矿相关
   +Mining : *MiningConfig
    // 网络连接相关
   +Swarm : *SwarmConfig
    // 钱包相关
   +Wallet : *WalletConfig
    [methods]
    // 获取配置,参数为API的上述子结构
   +Get(key string) : interface{}, error
    // 设置配置,参数为API的上述子结构
   +Set(dottedKey string, jsonString string) : error
    // 写对应目录的配置文件
   +WriteFile(file string) : error
    [functions]
    // 实例化配置,会调用各字节口的实例化
   +NewDefaultConfig() : *Config
    // 读对应目录的配置文件
   +ReadFile(file string) : *Config, error

+DatastoreConfig : struct
    [fields]
    // 路径
   +Path : string
    // 类型
   +Type : string
    [functions]
   -newDefaultDatastoreConfig() : *DatastoreConfig

+HeartbeatConfig : struct
    [fields]
    // 心跳周期
   +BeatPeriod : string
    // 心跳目标
   +BeatTarget : string
    // 昵称
   +Nickname : string
    // 重连时间
   +ReconnectPeriod : string
    [functions]
   -newDefaultHeartbeatConfig() : *HeartbeatConfig

+MiningConfig : struct
    [fields]
    // 自动密封间隔周期
   +AutoSealIntervalSeconds : uint
    // 区块签名地址
   +BlockSignerAddress : address.Address
    // 矿工地址
   +MinerAddress : address.Address
    // 存储报价
   +StoragePrice : *types.AttoFIL
    [functions]
   -newDefaultMiningConfig() : *MiningConfig

+SwarmConfig : struct
    [fields]
    // 地址
   +Address : string
    // 转发地址
   +PublicRelayAddress : string
    [functions]
   -newDefaultSwarmConfig() : *SwarmConfig

+WalletConfig : struct
    [fields]
    // 默认钱包地址
   +DefaultAddress : address.Address
    [functions]
   -newDefaultWalletConfig() : *WalletConfig

 functions
   -validate(dottedKey string, jsonString string) : error
   -validateLettersOnly(key string, value string) : error

9.6 crypto

  • 对外提供功能
    • 生成私钥接口
    • 签名接口
    • 私钥转公钥接口
    • 从签名消息中提取公钥接口
    • 验证消息合法性接口
    • 主要用于地址生成、钱包相关
 package
    crypto

 imports

 constants
    // 定义私钥长度32位
   +PrivateKeyBytes
    // 定义公钥长度65位
   +PublicKeyBytes

 functions
    // 从签名消息中恢复公钥
   +EcRecover(msg, signature []byte) : []byte, error
    // 比较私钥是否相同
   +Equals(sk, other []byte) : bool
    // 生成私钥,调用GenerateKeyFromSeed
   +GenerateKey() : []byte, error
    // 生成私钥
   +GenerateKeyFromSeed(seed io.Reader) : []byte, error
    // 由私钥得到公钥
   +PublicKey(sk []byte) : []byte
    // 使用私钥签名
   +Sign(sk, msg []byte) : []byte, error
    // 验证签名合法性
   +Verify(pk, msg, signature []byte) : bool

9.7 util/convert

  • 提供功能
    ToCid:转cid功能

9.8 functional-tests

  • 测试脚本

9.9 flags

  • 通过ldflags注入,表示git提交版本号
var Commit string

9.10 fixtures

  • 提供功能
    • 定义不同网络启动相关地址
    • 预先分配初始网络状态,比如代币的预先分配
 package
    fixtures

 imports

 constants
    // 开发人员,开发网络启动相关地址
   -nightlyFilecoinBootstrap0 : string
   -nightlyFilecoinBootstrap1 : string
   -nightlyFilecoinBootstrap2 : string
   -nightlyFilecoinBootstrap3 : string
   -nightlyFilecoinBootstrap4 : string
    // 测试网络启动相关地址
   -testFilecoinBootstrap0 : string
   -testFilecoinBootstrap1 : string
   -testFilecoinBootstrap2 : string
   -testFilecoinBootstrap3 : string
   -testFilecoinBootstrap4 : string
    // 用户,开发网络启动相关地址
   -userFilecoinBootstrap0 : string
   -userFilecoinBootstrap1 : string
   -userFilecoinBootstrap2 : string
   -userFilecoinBootstrap3 : string
   -userFilecoinBootstrap4 : string

 variables
    // 开发人员,开发网络启动相关地址
   +DevnetNightlyBootstrapAddrs
    // 测试网络启动相关地址
   +DevnetTestBootstrapAddrs
    // 用户,开发网络启动相关地址
   +DevnetUserBootstrapAddrs
    // 预生成测试网络地址集合
   +TestAddresses : []string
    // 预生成测试矿工账户集合
   +TestMiners : []string
    // 预生成地址的私钥
   -testKeys : []string

-detailsStruct : struct
    [fields]
    // 创世区块cid
   +GenesisCid : cid.Cid
   +Keys : []*types.KeyInfo
   +Miners : []

 functions
    // 预生成的Key文件路径
   +KeyFilePaths() : []string

    // 预生成信息
    // 1 解析gen.json文件到detailsStruct结构体
    // 2 追击Miners信息到TestMiners中
   -init()
  • 如下为gen.json文件,可据此预先给特定矿工分配代币
{
  "keys": 5,
  "preAlloc": [
    "1000000000000",
    "1000000000000",
    "1000000000000",
    "1000000000000",
    "1000000000000"
  ],
  "miners": [{
    "owner": 0,
    "power": 1
  }]
}

9.11 filnet

  • 提供功能
    • 节点启动
    • 定期检查连接节点,如果数量不够会链接随机节点
location: filnet/address.go

 package
    filnet

 imports
    gx/ipfs/QmNTCey11oxhb1AxDnQBRHtdhap6Ctud872NjAYPYYXPuc/go-multiaddr
    gx/ipfs/QmRhFARzTHcFh8wUxwN5KvyTGq73FLC65EfFAhz8Ng7aGb/go-libp2p-peerstore

 functions
    // 节点id转换为完整的节点信息,包括所有的多地址格式
   +PeerAddrsToPeerInfos(addrs []string) : []pstore.PeerInfo, error
location: filnet/bootstrap.go

 package
    filnet

 imports

 variables
   -log

+Bootstrapper : struct
    [fields]
    // 对应bootstrap
   +Bootstrap : func([]peer.ID)
    // 连接超时时间,用于连接随机节点
   +ConnectionTimeout : time.Duration
    // 最小连接节点数量阈值
   +MinPeerThreshold : int
    // 定时检查连接节点数量,小于阈值会处理
   +Period : time.Duration
    // 随机节点切片
   -bootstrapPeers : []pstore.PeerInfo
   -cancel : context.CancelFunc
   -ctx : context.Context
   -d : inet.Dialer
   -dhtBootStarted : bool
   -h : host.Host
   -r : routing.IpfsRouting
   -ticker : *time.Ticker
    [methods]
    // 定时调用Bootstrap 检查连接节点数量,小于阈值会处理
   +Start(ctx context.Context)
    // 停止节点
   +Stop()
    // 如果启动节点不够,将会尝试连接随机节点。
   -bootstrap(currentPeers []peer.ID)
    [functions]
    // 实例化
   +NewBootstrapper(bootstrapPeers []pstore.PeerInfo, h host.Host, d inet.Dialer, r routing.IpfsRouting, minPeer int, period time.Duration) : *Bootstrapper

 functions
   -hasPID(pids []peer.ID, pid peer.ID) : bool

[上一篇链接] filecoin技术架构分析之八:8 filecoin源码协议层分析之检索协议
[下一篇链接] filecoin技术架构分析之十:10 filecoin源码分析之支撑包分析(2/2)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容