找回密码
 立即注册

QQ登录

只需一步,快速开始

  • QQ空间
  • 回复
  • 收藏

Filecoin技术架构分析之九:支撑包分析(1/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(iinterface{}):error
[functions]
+NewMsgReader(rio.Reader):*MsgReader
package
cborutil
imports+MsgWriter:struct
[fields]
-w:*bufio.Writer
[methods]
+WriteMsg(iinterface{}):error
[functions]
+NewMsgWriter(wio.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.gopackage
address
imports
constants//Base32编码的字符集
+Base32Charset//地址的哈希部分,目前为20bytes
+HashLength,20bytes,160bit//地址长度,为HashLength+1+1=22bytes
+Length//地址格式的版本定义:当前为0
+Version:byte
variables//基于Base32Charset的Base32实例,用于编解码
+Base32//Base32Reverse集合
+Base32CharsetReverse//铸币地址,基于"filecoin"哈希生成
+NetworkAddress:Address//支付通道地址
+PaymentBrokerAddress:Address//存储市场地址
+StorageMarketAddress:Address//测试地址
+TestAddress:Address//测试地址
+TestAddress2:Address
functions
-init()
location:address/address.gopackage
address
imports
constants
+Mainnet:Network
+Testnet
variables//错误提示
+ErrInvalidBytes
+ErrUnknownNetwork
+ErrUnknownVersion
-generator//配置输入哈希长度20bytes
-hashConfig//Address为22字节字符串+Address:[]byte
[methods]//转换为编码前地址切片输出
+Bytes():[]byte
//判断地址是否为空
+Empty():bool//打印地址信息
+Format(ffmt.State,crune)//输出地址中的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(inputstring):Address//通过字符串网络类型转换为byte网络类型
//fc:主网转化为0
//tf:测试网化为1
+NetworkFromString(inputstring):Network,error//通过byte网络类型转换为字符串网络类型
//0:主网转化为fc
//1:测试网化为tf
+NetworkToString(nNetwork):string//构建新地址:输入为原始20bytes哈希+网络类型+地址版本
+New(networkNetwork,hash[]byte):Address//构建新地址:输入为22bytes的原始切片
+NewFromBytes(raw[]byte):Address,error//通过41bytes的字串串生成22bytes的原始地址
+NewFromString(sstring):Address,error//构建新地址:输入为原始20bytes哈希,调用New
+NewMainnet(hash[]byte):Address//生成测试网络地址,输入为原始哈希再次哈希,被MakeTestAddress调用
+NewTestnet(hash[]byte):Address//校验41bytes地址的合法性
+ParseError(addrstring):error//base32编码校验码生成,结果为6bytes
-createChecksum(hrpstring,data[]byte):[]byte
//解码
-decode(addrstring):string,byte,[]byte,error//编码
-encode(hrpstring,versionbyte,data[]byte):string,error
-hrpExpand(hrpstring):[]byte
-init()
-polymod(values[]byte):uint32//校验和验证
-verifyChecksum(hrpstring,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(keystring):interface{},error//设置配置,参数为API的上述子结构
+Set(dottedKeystring,jsonStringstring):error//写对应目录的配置文件
+WriteFile(filestring):error
[functions]//实例化配置,会调用各字节口的实例化
+NewDefaultConfig():*Config//读对应目录的配置文件
+ReadFile(filestring):*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(dottedKeystring,jsonStringstring):error
-validateLettersOnly(keystring,valuestring):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(seedio.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提交版本号
varCommitstring
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(ctxcontext.Context)//停止节点
+Stop()//如果启动节点不够,将会尝试连接随机节点。
-bootstrap(currentPeers[]peer.ID)
[functions]//实例化
+NewBootstrapper(bootstrapPeers[]pstore.PeerInfo,hhost.Host,dinet.Dialer,rrouting.IpfsRouting,minPeerint,periodtime.Duration):*Bootstrapper
functions
-hasPID(pids[]peer.ID,pidpeer.ID):bool

xqf4ptann4i.png

xqf4ptann4i.png
回复

使用道具 举报

说点什么

您需要登录后才可以回帖 登录 | 立即注册