filecoin技術架構分析之九:filecoin原始碼分析之支撐包分析(1)
本文作者:先河系統楊尉;原創作品,轉載請註明出處
[上一篇連結] 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技術架構分析之二:待續