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 (84.2 KB, 下载次数: 18)

下载附件

xqf4ptann4i.png

2019-4-30 11:51 上传

版权声明:
作者:bitchina.net
链接:http://www.bitchina.net/archives/644.html
来源:比特中国
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>