軟件環(huán)境
go:1.9.2
ethereum&GETH:v1.8.11-unstable
名詞解釋:
以太坊有三種同步的模式,full, fast, light
full 模式
從開始到結(jié)束,獲取區(qū)塊的header,獲取區(qū)塊的body,從創(chuàng)始塊開始校驗每一個元素,需要下載所有區(qū)塊數(shù)據(jù)信息。速度最慢,但是能獲取到所有的歷史數(shù)據(jù)。
//命令:
geth --syncmode full
fast模式
獲取區(qū)塊的header,獲取區(qū)塊的body,在同步到當前塊之前不處理任何事務。下載的數(shù)據(jù)大小約為50GB(截止2018-02-04)。然后獲得一個快照,此后,像full節(jié)點一樣進行后面的同步操作。這種方法用得最多,目的在不要在意歷史數(shù)據(jù),將歷史數(shù)據(jù)按照快照的方式,不逐一驗證,沿著區(qū)塊下載最近數(shù)據(jù)庫中的交易,有可能丟失歷史數(shù)據(jù)。此方法可能會對歷史數(shù)據(jù)有部分丟失,但是不影響今后的使用。
(注意:挖礦節(jié)點必須是 full ,否則會增加塊廣播給其他人的風險)
//命令:
//使用此模式時注意需要設置–cache,默認16M,建議設置為1G(1024)到2G(2048)
geth –fast –cache 512
light模式
僅獲取當前狀態(tài)。驗證元素需要向full節(jié)點發(fā)起相應的請求。
//命令:
geth --light
重點說明:
> geth help
DEPRECATED OPTIONS:
--fast Enable fast syncing through state downloads (replaced by --syncmode)
--light Enable light client mode (replaced by --syncmode)
在Geth1.5以上版本,--fast參數(shù)已經(jīng)改為--syncmode=fast,當然--fast依舊有效。 大家應該注意到?jīng)]有--full選項,因為以太坊同步區(qū)塊默認是full。
--syncmode "fast" Blockchain sync mode ("fast", "full", or "light")
注意:默認情況下full模式,在以太坊源碼中,如果本地當前塊是number 0 (創(chuàng)始區(qū)塊),不管指定的哪種模式都默認是 --fast模式,當geth第二次啟動的時候,默認情況下full模式同步。
因此很多小伙伴在沒有指定同步模式的時候,在同步區(qū)塊的前期非常快,當再次重啟機器或者斷掉geth再啟動發(fā)現(xiàn)更新區(qū)塊速度非常慢,就是這個原因
此判斷代碼片段位置
handler.go 代碼中 新建以太坊子協(xié)議管理器
func NewProtocolManager()
// Figure out whether to allow fast sync or not
if mode == downloader.FastSync && blockchain.CurrentBlock().NumberU64() > 0 {
log.Warn("Blockchain not empty, fast sync disabled")
mode = downloader.FullSync
}
if mode == downloader.FastSync {
manager.fastSync = uint32(1)
}