美文网首页IPFS/filecoin技术架构分析区块链研习社区块链大学
filecoin技术架构分析之九:filecoin源码分析之支撑

filecoin技术架构分析之九:filecoin源码分析之支撑

作者: 杨尉 | 来源:发表于2019-03-06 16:14 被阅读24次

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

    [上一篇链接] filecoin技术架构分析之八:8 filecoin源码协议层分析之检索协议
    [下一篇链接] filecoin技术架构分析之二:待续

    目录

    • 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技术架构分析之二:待续

    相关文章

      网友评论

        本文标题:filecoin技术架构分析之九:filecoin源码分析之支撑

        本文链接:https://www.haomeiwen.com/subject/tqhxpqtx.html