Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
plugin
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
link33
plugin
Commits
1ae720fe
Commit
1ae720fe
authored
Mar 23, 2019
by
vipwzw
Committed by
mdj33
Mar 25, 2019
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修改blockchain 模块的全局变量,尽量减少全局变量,防止多个实例启动后出问题
parent
3507c095
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
145 additions
and
139 deletions
+145
-139
blockstore.go
vendor/github.com/33cn/chain33/blockchain/blockstore.go
+18
-16
blocksyn.go
vendor/github.com/33cn/chain33/blockchain/blocksyn.go
+59
-72
chain.go
vendor/github.com/33cn/chain33/blockchain/chain.go
+44
-23
download.go
vendor/github.com/33cn/chain33/blockchain/download.go
+11
-14
ntp.go
vendor/github.com/33cn/chain33/blockchain/ntp.go
+6
-7
proc.go
vendor/github.com/33cn/chain33/blockchain/proc.go
+4
-4
process.go
vendor/github.com/33cn/chain33/blockchain/process.go
+2
-2
sequences.go
vendor/github.com/33cn/chain33/blockchain/sequences.go
+1
-1
No files found.
vendor/github.com/33cn/chain33/blockchain/blockstore.go
View file @
1ae720fe
...
@@ -37,7 +37,6 @@ var (
...
@@ -37,7 +37,6 @@ var (
seqCBPrefix
=
[]
byte
(
"SCB:"
)
seqCBPrefix
=
[]
byte
(
"SCB:"
)
seqCBLastNumPrefix
=
[]
byte
(
"SCBL:"
)
seqCBLastNumPrefix
=
[]
byte
(
"SCBL:"
)
storeLog
=
chainlog
.
New
(
"submodule"
,
"store"
)
storeLog
=
chainlog
.
New
(
"submodule"
,
"store"
)
lastheaderlock
sync
.
Mutex
AddBlock
int64
=
1
AddBlock
int64
=
1
DelBlock
int64
=
2
DelBlock
int64
=
2
)
)
...
@@ -106,10 +105,12 @@ type BlockStore struct {
...
@@ -106,10 +105,12 @@ type BlockStore struct {
client
queue
.
Client
client
queue
.
Client
height
int64
height
int64
lastBlock
*
types
.
Block
lastBlock
*
types
.
Block
lastheaderlock
sync
.
Mutex
chain
*
BlockChain
}
}
//NewBlockStore new
//NewBlockStore new
func
NewBlockStore
(
db
dbm
.
DB
,
client
queue
.
Client
)
*
BlockStore
{
func
NewBlockStore
(
chain
*
BlockChain
,
db
dbm
.
DB
,
client
queue
.
Client
)
*
BlockStore
{
height
,
err
:=
LoadBlockStoreHeight
(
db
)
height
,
err
:=
LoadBlockStoreHeight
(
db
)
if
err
!=
nil
{
if
err
!=
nil
{
chainlog
.
Info
(
"init::LoadBlockStoreHeight::database may be crash"
,
"err"
,
err
.
Error
())
chainlog
.
Info
(
"init::LoadBlockStoreHeight::database may be crash"
,
"err"
,
err
.
Error
())
...
@@ -121,6 +122,7 @@ func NewBlockStore(db dbm.DB, client queue.Client) *BlockStore {
...
@@ -121,6 +122,7 @@ func NewBlockStore(db dbm.DB, client queue.Client) *BlockStore {
height
:
height
,
height
:
height
,
db
:
db
,
db
:
db
,
client
:
client
,
client
:
client
,
chain
:
chain
,
}
}
if
height
==
-
1
{
if
height
==
-
1
{
chainlog
.
Info
(
"load block height error, may be init database"
,
"height"
,
height
)
chainlog
.
Info
(
"load block height error, may be init database"
,
"height"
,
height
)
...
@@ -354,8 +356,8 @@ func (bs *BlockStore) UpdateHeight2(height int64) {
...
@@ -354,8 +356,8 @@ func (bs *BlockStore) UpdateHeight2(height int64) {
//LastHeader 返回BlockStore保存的当前blockheader
//LastHeader 返回BlockStore保存的当前blockheader
func
(
bs
*
BlockStore
)
LastHeader
()
*
types
.
Header
{
func
(
bs
*
BlockStore
)
LastHeader
()
*
types
.
Header
{
lastheaderlock
.
Lock
()
bs
.
lastheaderlock
.
Lock
()
defer
lastheaderlock
.
Unlock
()
defer
bs
.
lastheaderlock
.
Unlock
()
// 通过lastBlock获取lastheader
// 通过lastBlock获取lastheader
var
blockheader
=
types
.
Header
{}
var
blockheader
=
types
.
Header
{}
...
@@ -382,8 +384,8 @@ func (bs *BlockStore) UpdateLastBlock(hash []byte) {
...
@@ -382,8 +384,8 @@ func (bs *BlockStore) UpdateLastBlock(hash []byte) {
storeLog
.
Error
(
"UpdateLastBlock"
,
"hash"
,
common
.
ToHex
(
hash
),
"error"
,
err
)
storeLog
.
Error
(
"UpdateLastBlock"
,
"hash"
,
common
.
ToHex
(
hash
),
"error"
,
err
)
return
return
}
}
lastheaderlock
.
Lock
()
bs
.
lastheaderlock
.
Lock
()
defer
lastheaderlock
.
Unlock
()
defer
bs
.
lastheaderlock
.
Unlock
()
if
blockdetail
!=
nil
{
if
blockdetail
!=
nil
{
bs
.
lastBlock
=
blockdetail
.
Block
bs
.
lastBlock
=
blockdetail
.
Block
}
}
...
@@ -392,16 +394,16 @@ func (bs *BlockStore) UpdateLastBlock(hash []byte) {
...
@@ -392,16 +394,16 @@ func (bs *BlockStore) UpdateLastBlock(hash []byte) {
//UpdateLastBlock2 更新LastBlock到缓存中
//UpdateLastBlock2 更新LastBlock到缓存中
func
(
bs
*
BlockStore
)
UpdateLastBlock2
(
block
*
types
.
Block
)
{
func
(
bs
*
BlockStore
)
UpdateLastBlock2
(
block
*
types
.
Block
)
{
lastheaderlock
.
Lock
()
bs
.
lastheaderlock
.
Lock
()
defer
lastheaderlock
.
Unlock
()
defer
bs
.
lastheaderlock
.
Unlock
()
bs
.
lastBlock
=
block
bs
.
lastBlock
=
block
storeLog
.
Debug
(
"UpdateLastBlock"
,
"UpdateLastBlock"
,
block
.
Height
,
"LastHederhash"
,
common
.
ToHex
(
block
.
Hash
()))
storeLog
.
Debug
(
"UpdateLastBlock"
,
"UpdateLastBlock"
,
block
.
Height
,
"LastHederhash"
,
common
.
ToHex
(
block
.
Hash
()))
}
}
//LastBlock 获取最新的block信息
//LastBlock 获取最新的block信息
func
(
bs
*
BlockStore
)
LastBlock
()
*
types
.
Block
{
func
(
bs
*
BlockStore
)
LastBlock
()
*
types
.
Block
{
lastheaderlock
.
Lock
()
bs
.
lastheaderlock
.
Lock
()
defer
lastheaderlock
.
Unlock
()
defer
bs
.
lastheaderlock
.
Unlock
()
if
bs
.
lastBlock
!=
nil
{
if
bs
.
lastBlock
!=
nil
{
return
bs
.
lastBlock
return
bs
.
lastBlock
}
}
...
@@ -545,7 +547,7 @@ func (bs *BlockStore) SaveBlock(storeBatch dbm.Batch, blockdetail *types.BlockDe
...
@@ -545,7 +547,7 @@ func (bs *BlockStore) SaveBlock(storeBatch dbm.Batch, blockdetail *types.BlockDe
//存储block height和block hash的对应关系,便于通过height查询block
//存储block height和block hash的对应关系,便于通过height查询block
storeBatch
.
Set
(
calcHeightToHashKey
(
height
),
hash
)
storeBatch
.
Set
(
calcHeightToHashKey
(
height
),
hash
)
if
isRecordBlockSequence
||
isParaChain
{
if
bs
.
chain
.
isRecordBlockSequence
||
bs
.
chain
.
isParaChain
{
//存储记录block序列执行的type add
//存储记录block序列执行的type add
lastSequence
,
err
=
bs
.
saveBlockSequence
(
storeBatch
,
hash
,
height
,
AddBlock
,
sequence
)
lastSequence
,
err
=
bs
.
saveBlockSequence
(
storeBatch
,
hash
,
height
,
AddBlock
,
sequence
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -574,7 +576,7 @@ func (bs *BlockStore) DelBlock(storeBatch dbm.Batch, blockdetail *types.BlockDet
...
@@ -574,7 +576,7 @@ func (bs *BlockStore) DelBlock(storeBatch dbm.Batch, blockdetail *types.BlockDet
storeBatch
.
Delete
(
calcHeightToHashKey
(
height
))
storeBatch
.
Delete
(
calcHeightToHashKey
(
height
))
storeBatch
.
Delete
(
calcHeightToBlockHeaderKey
(
height
))
storeBatch
.
Delete
(
calcHeightToBlockHeaderKey
(
height
))
if
isRecordBlockSequence
||
isParaChain
{
if
bs
.
chain
.
isRecordBlockSequence
||
bs
.
chain
.
isParaChain
{
//存储记录block序列执行的type del
//存储记录block序列执行的type del
lastSequence
,
err
:=
bs
.
saveBlockSequence
(
storeBatch
,
hash
,
height
,
DelBlock
,
sequence
)
lastSequence
,
err
:=
bs
.
saveBlockSequence
(
storeBatch
,
hash
,
height
,
DelBlock
,
sequence
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -944,7 +946,7 @@ func (bs *BlockStore) saveBlockSequence(storeBatch dbm.Batch, hash []byte, heigh
...
@@ -944,7 +946,7 @@ func (bs *BlockStore) saveBlockSequence(storeBatch dbm.Batch, hash []byte, heigh
var
blockSequence
types
.
BlockSequence
var
blockSequence
types
.
BlockSequence
var
newSequence
int64
var
newSequence
int64
if
isRecordBlockSequence
{
if
bs
.
chain
.
isRecordBlockSequence
{
Sequence
,
err
:=
bs
.
LoadBlockLastSequence
()
Sequence
,
err
:=
bs
.
LoadBlockLastSequence
()
if
err
!=
nil
{
if
err
!=
nil
{
storeLog
.
Error
(
"SaveBlockSequence"
,
"LoadBlockLastSequence err"
,
err
)
storeLog
.
Error
(
"SaveBlockSequence"
,
"LoadBlockLastSequence err"
,
err
)
...
@@ -959,7 +961,7 @@ func (bs *BlockStore) saveBlockSequence(storeBatch dbm.Batch, hash []byte, heigh
...
@@ -959,7 +961,7 @@ func (bs *BlockStore) saveBlockSequence(storeBatch dbm.Batch, hash []byte, heigh
storeLog
.
Error
(
"isRecordBlockSequence is true must Synchronizing data from zero block"
,
"height"
,
height
)
storeLog
.
Error
(
"isRecordBlockSequence is true must Synchronizing data from zero block"
,
"height"
,
height
)
panic
(
errors
.
New
(
"isRecordBlockSequence is true must Synchronizing data from zero block"
))
panic
(
errors
.
New
(
"isRecordBlockSequence is true must Synchronizing data from zero block"
))
}
}
}
else
if
isParaChain
{
}
else
if
bs
.
chain
.
isParaChain
{
newSequence
=
sequence
newSequence
=
sequence
}
}
blockSequence
.
Hash
=
hash
blockSequence
.
Hash
=
hash
...
@@ -1091,7 +1093,7 @@ func (bs *BlockStore) SetUpgradeMeta(meta *types.UpgradeMeta) error {
...
@@ -1091,7 +1093,7 @@ func (bs *BlockStore) SetUpgradeMeta(meta *types.UpgradeMeta) error {
}
}
//isRecordBlockSequence配置的合法性检测
//isRecordBlockSequence配置的合法性检测
func
(
bs
*
BlockStore
)
isRecordBlockSequenceValid
()
{
func
(
bs
*
BlockStore
)
isRecordBlockSequenceValid
(
chain
*
BlockChain
)
{
lastHeight
:=
bs
.
Height
()
lastHeight
:=
bs
.
Height
()
lastSequence
,
err
:=
bs
.
LoadBlockLastSequence
()
lastSequence
,
err
:=
bs
.
LoadBlockLastSequence
()
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -1101,7 +1103,7 @@ func (bs *BlockStore) isRecordBlockSequenceValid() {
...
@@ -1101,7 +1103,7 @@ func (bs *BlockStore) isRecordBlockSequenceValid() {
}
}
}
}
//使能isRecordBlockSequence时的检测
//使能isRecordBlockSequence时的检测
if
isRecordBlockSequence
{
if
chain
.
isRecordBlockSequence
{
//中途开启isRecordBlockSequence报错
//中途开启isRecordBlockSequence报错
if
lastSequence
==
-
1
&&
lastHeight
!=
-
1
{
if
lastSequence
==
-
1
&&
lastHeight
!=
-
1
{
storeLog
.
Error
(
"isRecordBlockSequenceValid"
,
"lastHeight"
,
lastHeight
,
"lastSequence"
,
lastSequence
)
storeLog
.
Error
(
"isRecordBlockSequenceValid"
,
"lastHeight"
,
lastHeight
,
"lastSequence"
,
lastSequence
)
...
...
vendor/github.com/33cn/chain33/blockchain/blocksyn.go
View file @
1ae720fe
...
@@ -8,7 +8,6 @@ import (
...
@@ -8,7 +8,6 @@ import (
"bytes"
"bytes"
"math/big"
"math/big"
"sort"
"sort"
"sync"
"sync/atomic"
"sync/atomic"
"time"
"time"
...
@@ -18,17 +17,6 @@ import (
...
@@ -18,17 +17,6 @@ import (
//var
//var
var
(
var
(
synBlocklock
sync
.
Mutex
peerMaxBlklock
sync
.
Mutex
castlock
sync
.
Mutex
ntpClockSynclock
sync
.
Mutex
faultpeerlock
sync
.
Mutex
bestpeerlock
sync
.
Mutex
isNtpClockSync
=
true
//ntp时间是否同步
MaxFetchBlockNum
int64
=
128
*
6
//一次最多申请获取block个数
TimeoutSeconds
int64
=
2
BackBlockNum
int64
=
128
//节点高度不增加时向后取blocks的个数
BackBlockNum
int64
=
128
//节点高度不增加时向后取blocks的个数
BackwardBlockNum
int64
=
16
//本节点高度不增加时并且落后peer的高度数
BackwardBlockNum
int64
=
16
//本节点高度不增加时并且落后peer的高度数
checkHeightNoIncSeconds
int64
=
5
*
60
//高度不增长时的检测周期目前暂定5分钟
checkHeightNoIncSeconds
int64
=
5
*
60
//高度不增长时的检测周期目前暂定5分钟
...
@@ -36,7 +24,6 @@ var (
...
@@ -36,7 +24,6 @@ var (
fetchPeerListSeconds
int64
=
5
//5 秒获取一个peerlist
fetchPeerListSeconds
int64
=
5
//5 秒获取一个peerlist
MaxRollBlockNum
int64
=
10000
//最大回退block数量
MaxRollBlockNum
int64
=
10000
//最大回退block数量
//TODO
//TODO
blockSynInterVal
=
time
.
Duration
(
TimeoutSeconds
)
batchsyncblocknum
int64
=
5000
//同步阶段,如果自己高度小于最大高度5000个时,saveblock到db时批量处理不刷盘
batchsyncblocknum
int64
=
5000
//同步阶段,如果自己高度小于最大高度5000个时,saveblock到db时批量处理不刷盘
synlog
=
chainlog
.
New
(
"submodule"
,
"syn"
)
synlog
=
chainlog
.
New
(
"submodule"
,
"syn"
)
...
@@ -101,7 +88,7 @@ func (chain *BlockChain) SynRoutine() {
...
@@ -101,7 +88,7 @@ func (chain *BlockChain) SynRoutine() {
fetchPeerListTicker
:=
time
.
NewTicker
(
time
.
Duration
(
fetchPeerListSeconds
)
*
time
.
Second
)
fetchPeerListTicker
:=
time
.
NewTicker
(
time
.
Duration
(
fetchPeerListSeconds
)
*
time
.
Second
)
//向peer请求同步block的定时器,默认2s
//向peer请求同步block的定时器,默认2s
blockSynTicker
:=
time
.
NewTicker
(
blockSynInterVal
*
time
.
Second
)
blockSynTicker
:=
time
.
NewTicker
(
chain
.
blockSynInterVal
*
time
.
Second
)
//5分钟检测一次bestchain主链高度是否有增长,如果没有增长可能是目前主链在侧链上,
//5分钟检测一次bestchain主链高度是否有增长,如果没有增长可能是目前主链在侧链上,
//需要从最高peer向后同步指定的headers用来获取分叉点,再后从指定peer获取分叉点以后的blocks
//需要从最高peer向后同步指定的headers用来获取分叉点,再后从指定peer获取分叉点以后的blocks
...
@@ -131,7 +118,7 @@ func (chain *BlockChain) SynRoutine() {
...
@@ -131,7 +118,7 @@ func (chain *BlockChain) SynRoutine() {
return
return
case
<-
blockSynTicker
.
C
:
case
<-
blockSynTicker
.
C
:
//synlog.Info("blockSynTicker")
//synlog.Info("blockSynTicker")
if
!
GetDownloadSyncStatus
()
{
if
!
chain
.
GetDownloadSyncStatus
()
{
go
chain
.
SynBlocksFromPeers
()
go
chain
.
SynBlocksFromPeers
()
}
}
...
@@ -153,7 +140,7 @@ func (chain *BlockChain) SynRoutine() {
...
@@ -153,7 +140,7 @@ func (chain *BlockChain) SynRoutine() {
//定时检查系统时间,如果系统时间有问题,那么会有一个报警
//定时检查系统时间,如果系统时间有问题,那么会有一个报警
case
<-
checkClockDriftTicker
.
C
:
case
<-
checkClockDriftTicker
.
C
:
// ntp可能存在一直没有回应的情况导致go线程不退出,暂时不在WaitGroup中处理
// ntp可能存在一直没有回应的情况导致go线程不退出,暂时不在WaitGroup中处理
go
checkClockDrift
()
go
ch
ain
.
ch
eckClockDrift
()
//定时检查故障peer,如果执行出错高度的blockhash值有变化,说明故障peer已经纠正
//定时检查故障peer,如果执行出错高度的blockhash值有变化,说明故障peer已经纠正
case
<-
recoveryFaultPeerTicker
.
C
:
case
<-
recoveryFaultPeerTicker
.
C
:
...
@@ -195,8 +182,8 @@ func (chain *BlockChain) FetchBlock(start int64, end int64, pid []string, syncOr
...
@@ -195,8 +182,8 @@ func (chain *BlockChain) FetchBlock(start int64, end int64, pid []string, syncOr
requestblock
.
Pid
=
pid
requestblock
.
Pid
=
pid
//同步block一次请求128个
//同步block一次请求128个
if
blockcount
>=
MaxFetchBlockNum
{
if
blockcount
>=
chain
.
MaxFetchBlockNum
{
requestblock
.
End
=
start
+
MaxFetchBlockNum
-
1
requestblock
.
End
=
start
+
chain
.
MaxFetchBlockNum
-
1
}
else
{
}
else
{
requestblock
.
End
=
end
requestblock
.
End
=
end
}
}
...
@@ -209,7 +196,7 @@ func (chain *BlockChain) FetchBlock(start int64, end int64, pid []string, syncOr
...
@@ -209,7 +196,7 @@ func (chain *BlockChain) FetchBlock(start int64, end int64, pid []string, syncOr
}
}
chain
.
UpdateDownLoadStartHeight
(
requestblock
.
End
+
1
)
chain
.
UpdateDownLoadStartHeight
(
requestblock
.
End
+
1
)
//快速下载时需要及时更新bestpeer,防止下载侧链的block
//快速下载时需要及时更新bestpeer,防止下载侧链的block
if
GetDownloadSyncStatus
()
{
if
chain
.
GetDownloadSyncStatus
()
{
chain
.
UpdateDownLoadPids
()
chain
.
UpdateDownLoadPids
()
}
}
}
else
{
// 所有DownLoad block已请求结束,恢复DownLoadInfo为默认值
}
else
{
// 所有DownLoad block已请求结束,恢复DownLoadInfo为默认值
...
@@ -304,9 +291,9 @@ func (chain *BlockChain) fetchPeerList() error {
...
@@ -304,9 +291,9 @@ func (chain *BlockChain) fetchPeerList() error {
subInfoList
:=
peerInfoList
subInfoList
:=
peerInfoList
peerMaxBlklock
.
Lock
()
chain
.
peerMaxBlklock
.
Lock
()
chain
.
peerList
=
subInfoList
chain
.
peerList
=
subInfoList
peerMaxBlklock
.
Unlock
()
chain
.
peerMaxBlklock
.
Unlock
()
//获取到peerlist之后,需要判断是否已经发起了最优链的检测。如果没有就触发一次最优链的检测
//获取到peerlist之后,需要判断是否已经发起了最优链的检测。如果没有就触发一次最优链的检测
if
atomic
.
LoadInt32
(
&
chain
.
firstcheckbestchain
)
==
0
{
if
atomic
.
LoadInt32
(
&
chain
.
firstcheckbestchain
)
==
0
{
...
@@ -318,36 +305,36 @@ func (chain *BlockChain) fetchPeerList() error {
...
@@ -318,36 +305,36 @@ func (chain *BlockChain) fetchPeerList() error {
//GetRcvLastCastBlkHeight 存储广播的block最新高度
//GetRcvLastCastBlkHeight 存储广播的block最新高度
func
(
chain
*
BlockChain
)
GetRcvLastCastBlkHeight
()
int64
{
func
(
chain
*
BlockChain
)
GetRcvLastCastBlkHeight
()
int64
{
castlock
.
Lock
()
c
hain
.
c
astlock
.
Lock
()
defer
castlock
.
Unlock
()
defer
c
hain
.
c
astlock
.
Unlock
()
return
chain
.
rcvLastBlockHeight
return
chain
.
rcvLastBlockHeight
}
}
//UpdateRcvCastBlkHeight 更新广播的block最新高度
//UpdateRcvCastBlkHeight 更新广播的block最新高度
func
(
chain
*
BlockChain
)
UpdateRcvCastBlkHeight
(
height
int64
)
{
func
(
chain
*
BlockChain
)
UpdateRcvCastBlkHeight
(
height
int64
)
{
castlock
.
Lock
()
c
hain
.
c
astlock
.
Lock
()
defer
castlock
.
Unlock
()
defer
c
hain
.
c
astlock
.
Unlock
()
chain
.
rcvLastBlockHeight
=
height
chain
.
rcvLastBlockHeight
=
height
}
}
//GetsynBlkHeight 存储已经同步到db的block高度
//GetsynBlkHeight 存储已经同步到db的block高度
func
(
chain
*
BlockChain
)
GetsynBlkHeight
()
int64
{
func
(
chain
*
BlockChain
)
GetsynBlkHeight
()
int64
{
synBlocklock
.
Lock
()
chain
.
synBlocklock
.
Lock
()
defer
synBlocklock
.
Unlock
()
defer
chain
.
synBlocklock
.
Unlock
()
return
chain
.
synBlockHeight
return
chain
.
synBlockHeight
}
}
//UpdatesynBlkHeight 更新已经同步到db的block高度
//UpdatesynBlkHeight 更新已经同步到db的block高度
func
(
chain
*
BlockChain
)
UpdatesynBlkHeight
(
height
int64
)
{
func
(
chain
*
BlockChain
)
UpdatesynBlkHeight
(
height
int64
)
{
synBlocklock
.
Lock
()
chain
.
synBlocklock
.
Lock
()
defer
synBlocklock
.
Unlock
()
defer
chain
.
synBlocklock
.
Unlock
()
chain
.
synBlockHeight
=
height
chain
.
synBlockHeight
=
height
}
}
//GetPeerMaxBlkHeight 获取peerlist中合法的最新block高度
//GetPeerMaxBlkHeight 获取peerlist中合法的最新block高度
func
(
chain
*
BlockChain
)
GetPeerMaxBlkHeight
()
int64
{
func
(
chain
*
BlockChain
)
GetPeerMaxBlkHeight
()
int64
{
peerMaxBlklock
.
Lock
()
chain
.
peerMaxBlklock
.
Lock
()
defer
peerMaxBlklock
.
Unlock
()
defer
chain
.
peerMaxBlklock
.
Unlock
()
//获取peerlist中最高的高度,peerlist是已经按照高度排序了的。
//获取peerlist中最高的高度,peerlist是已经按照高度排序了的。
if
chain
.
peerList
!=
nil
{
if
chain
.
peerList
!=
nil
{
...
@@ -372,8 +359,8 @@ func (chain *BlockChain) GetPeerMaxBlkHeight() int64 {
...
@@ -372,8 +359,8 @@ func (chain *BlockChain) GetPeerMaxBlkHeight() int64 {
//GetPeerInfo 通过peerid获取peerinfo
//GetPeerInfo 通过peerid获取peerinfo
func
(
chain
*
BlockChain
)
GetPeerInfo
(
pid
string
)
*
PeerInfo
{
func
(
chain
*
BlockChain
)
GetPeerInfo
(
pid
string
)
*
PeerInfo
{
peerMaxBlklock
.
Lock
()
chain
.
peerMaxBlklock
.
Lock
()
defer
peerMaxBlklock
.
Unlock
()
defer
chain
.
peerMaxBlklock
.
Unlock
()
//获取peerinfo
//获取peerinfo
if
chain
.
peerList
!=
nil
{
if
chain
.
peerList
!=
nil
{
...
@@ -388,8 +375,8 @@ func (chain *BlockChain) GetPeerInfo(pid string) *PeerInfo {
...
@@ -388,8 +375,8 @@ func (chain *BlockChain) GetPeerInfo(pid string) *PeerInfo {
//GetMaxPeerInfo 获取peerlist中最高节点的peerinfo
//GetMaxPeerInfo 获取peerlist中最高节点的peerinfo
func
(
chain
*
BlockChain
)
GetMaxPeerInfo
()
*
PeerInfo
{
func
(
chain
*
BlockChain
)
GetMaxPeerInfo
()
*
PeerInfo
{
peerMaxBlklock
.
Lock
()
chain
.
peerMaxBlklock
.
Lock
()
defer
peerMaxBlklock
.
Unlock
()
defer
chain
.
peerMaxBlklock
.
Unlock
()
//获取peerlist中高度最高的peer,peerlist是已经按照高度排序了的。
//获取peerlist中高度最高的peer,peerlist是已经按照高度排序了的。
if
chain
.
peerList
!=
nil
{
if
chain
.
peerList
!=
nil
{
...
@@ -414,8 +401,8 @@ func (chain *BlockChain) GetMaxPeerInfo() *PeerInfo {
...
@@ -414,8 +401,8 @@ func (chain *BlockChain) GetMaxPeerInfo() *PeerInfo {
//GetPeers 获取所有peers
//GetPeers 获取所有peers
func
(
chain
*
BlockChain
)
GetPeers
()
PeerInfoList
{
func
(
chain
*
BlockChain
)
GetPeers
()
PeerInfoList
{
peerMaxBlklock
.
Lock
()
chain
.
peerMaxBlklock
.
Lock
()
defer
peerMaxBlklock
.
Unlock
()
defer
chain
.
peerMaxBlklock
.
Unlock
()
//获取peerinfo
//获取peerinfo
var
peers
PeerInfoList
var
peers
PeerInfoList
...
@@ -428,8 +415,8 @@ func (chain *BlockChain) GetPeers() PeerInfoList {
...
@@ -428,8 +415,8 @@ func (chain *BlockChain) GetPeers() PeerInfoList {
//GetPeersMap 获取peers的map列表方便查找
//GetPeersMap 获取peers的map列表方便查找
func
(
chain
*
BlockChain
)
GetPeersMap
()
map
[
string
]
bool
{
func
(
chain
*
BlockChain
)
GetPeersMap
()
map
[
string
]
bool
{
peerMaxBlklock
.
Lock
()
chain
.
peerMaxBlklock
.
Lock
()
defer
peerMaxBlklock
.
Unlock
()
defer
chain
.
peerMaxBlklock
.
Unlock
()
peersmap
:=
make
(
map
[
string
]
bool
)
peersmap
:=
make
(
map
[
string
]
bool
)
if
chain
.
peerList
!=
nil
{
if
chain
.
peerList
!=
nil
{
...
@@ -442,16 +429,16 @@ func (chain *BlockChain) GetPeersMap() map[string]bool {
...
@@ -442,16 +429,16 @@ func (chain *BlockChain) GetPeersMap() map[string]bool {
//IsFaultPeer 判断指定pid是否在故障faultPeerList中
//IsFaultPeer 判断指定pid是否在故障faultPeerList中
func
(
chain
*
BlockChain
)
IsFaultPeer
(
pid
string
)
bool
{
func
(
chain
*
BlockChain
)
IsFaultPeer
(
pid
string
)
bool
{
faultpeerlock
.
Lock
()
chain
.
faultpeerlock
.
Lock
()
defer
faultpeerlock
.
Unlock
()
defer
chain
.
faultpeerlock
.
Unlock
()
return
chain
.
faultPeerList
[
pid
]
!=
nil
return
chain
.
faultPeerList
[
pid
]
!=
nil
}
}
//IsErrExecBlock 判断此block是否被记录在本节点执行错误。
//IsErrExecBlock 判断此block是否被记录在本节点执行错误。
func
(
chain
*
BlockChain
)
IsErrExecBlock
(
height
int64
,
hash
[]
byte
)
(
bool
,
error
)
{
func
(
chain
*
BlockChain
)
IsErrExecBlock
(
height
int64
,
hash
[]
byte
)
(
bool
,
error
)
{
faultpeerlock
.
Lock
()
chain
.
faultpeerlock
.
Lock
()
defer
faultpeerlock
.
Unlock
()
defer
chain
.
faultpeerlock
.
Unlock
()
//循环遍历故障peerlist,尝试检测故障peer是否已经恢复
//循环遍历故障peerlist,尝试检测故障peer是否已经恢复
for
_
,
faultpeer
:=
range
chain
.
faultPeerList
{
for
_
,
faultpeer
:=
range
chain
.
faultPeerList
{
...
@@ -464,8 +451,8 @@ func (chain *BlockChain) IsErrExecBlock(height int64, hash []byte) (bool, error)
...
@@ -464,8 +451,8 @@ func (chain *BlockChain) IsErrExecBlock(height int64, hash []byte) (bool, error)
//GetFaultPeer 获取指定pid是否在故障faultPeerList中
//GetFaultPeer 获取指定pid是否在故障faultPeerList中
func
(
chain
*
BlockChain
)
GetFaultPeer
(
pid
string
)
*
FaultPeerInfo
{
func
(
chain
*
BlockChain
)
GetFaultPeer
(
pid
string
)
*
FaultPeerInfo
{
faultpeerlock
.
Lock
()
chain
.
faultpeerlock
.
Lock
()
defer
faultpeerlock
.
Unlock
()
defer
chain
.
faultpeerlock
.
Unlock
()
return
chain
.
faultPeerList
[
pid
]
return
chain
.
faultPeerList
[
pid
]
}
}
...
@@ -473,8 +460,8 @@ func (chain *BlockChain) GetFaultPeer(pid string) *FaultPeerInfo {
...
@@ -473,8 +460,8 @@ func (chain *BlockChain) GetFaultPeer(pid string) *FaultPeerInfo {
//RecoveryFaultPeer 尝试恢复故障peer节点,定时从出错的peer获取出错block的头信息。
//RecoveryFaultPeer 尝试恢复故障peer节点,定时从出错的peer获取出错block的头信息。
//看对应的block是否有更新。有更新就说明故障peer节点已经恢复ok
//看对应的block是否有更新。有更新就说明故障peer节点已经恢复ok
func
(
chain
*
BlockChain
)
RecoveryFaultPeer
()
{
func
(
chain
*
BlockChain
)
RecoveryFaultPeer
()
{
faultpeerlock
.
Lock
()
chain
.
faultpeerlock
.
Lock
()
defer
faultpeerlock
.
Unlock
()
defer
chain
.
faultpeerlock
.
Unlock
()
defer
chain
.
tickerwg
.
Done
()
defer
chain
.
tickerwg
.
Done
()
...
@@ -501,8 +488,8 @@ func (chain *BlockChain) RecoveryFaultPeer() {
...
@@ -501,8 +488,8 @@ func (chain *BlockChain) RecoveryFaultPeer() {
//AddFaultPeer 添加故障节点到故障FaultPeerList中
//AddFaultPeer 添加故障节点到故障FaultPeerList中
func
(
chain
*
BlockChain
)
AddFaultPeer
(
faultpeer
*
FaultPeerInfo
)
{
func
(
chain
*
BlockChain
)
AddFaultPeer
(
faultpeer
*
FaultPeerInfo
)
{
faultpeerlock
.
Lock
()
chain
.
faultpeerlock
.
Lock
()
defer
faultpeerlock
.
Unlock
()
defer
chain
.
faultpeerlock
.
Unlock
()
//此节点已经存在故障peerlist中打印信息
//此节点已经存在故障peerlist中打印信息
faultnode
:=
chain
.
faultPeerList
[
faultpeer
.
Peer
.
Name
]
faultnode
:=
chain
.
faultPeerList
[
faultpeer
.
Peer
.
Name
]
...
@@ -515,8 +502,8 @@ func (chain *BlockChain) AddFaultPeer(faultpeer *FaultPeerInfo) {
...
@@ -515,8 +502,8 @@ func (chain *BlockChain) AddFaultPeer(faultpeer *FaultPeerInfo) {
//RemoveFaultPeer 此pid对应的故障已经修复,将此pid从故障列表中移除
//RemoveFaultPeer 此pid对应的故障已经修复,将此pid从故障列表中移除
func
(
chain
*
BlockChain
)
RemoveFaultPeer
(
pid
string
)
{
func
(
chain
*
BlockChain
)
RemoveFaultPeer
(
pid
string
)
{
faultpeerlock
.
Lock
()
chain
.
faultpeerlock
.
Lock
()
defer
faultpeerlock
.
Unlock
()
defer
chain
.
faultpeerlock
.
Unlock
()
synlog
.
Debug
(
"RemoveFaultPeer"
,
"pid"
,
pid
)
synlog
.
Debug
(
"RemoveFaultPeer"
,
"pid"
,
pid
)
delete
(
chain
.
faultPeerList
,
pid
)
delete
(
chain
.
faultPeerList
,
pid
)
...
@@ -524,8 +511,8 @@ func (chain *BlockChain) RemoveFaultPeer(pid string) {
...
@@ -524,8 +511,8 @@ func (chain *BlockChain) RemoveFaultPeer(pid string) {
//UpdateFaultPeer 更新此故障peer的请求标志位
//UpdateFaultPeer 更新此故障peer的请求标志位
func
(
chain
*
BlockChain
)
UpdateFaultPeer
(
pid
string
,
reqFlag
bool
)
{
func
(
chain
*
BlockChain
)
UpdateFaultPeer
(
pid
string
,
reqFlag
bool
)
{
faultpeerlock
.
Lock
()
chain
.
faultpeerlock
.
Lock
()
defer
faultpeerlock
.
Unlock
()
defer
chain
.
faultpeerlock
.
Unlock
()
faultpeer
:=
chain
.
faultPeerList
[
pid
]
faultpeer
:=
chain
.
faultPeerList
[
pid
]
if
faultpeer
!=
nil
{
if
faultpeer
!=
nil
{
...
@@ -554,8 +541,8 @@ func (chain *BlockChain) RecordFaultPeer(pid string, height int64, hash []byte,
...
@@ -554,8 +541,8 @@ func (chain *BlockChain) RecordFaultPeer(pid string, height int64, hash []byte,
//PrintFaultPeer 打印出错的节点
//PrintFaultPeer 打印出错的节点
func
(
chain
*
BlockChain
)
PrintFaultPeer
()
{
func
(
chain
*
BlockChain
)
PrintFaultPeer
()
{
faultpeerlock
.
Lock
()
chain
.
faultpeerlock
.
Lock
()
defer
faultpeerlock
.
Unlock
()
defer
chain
.
faultpeerlock
.
Unlock
()
//循环遍历故障peerlist,尝试检测故障peer是否已经恢复
//循环遍历故障peerlist,尝试检测故障peer是否已经恢复
for
pid
,
faultpeer
:=
range
chain
.
faultPeerList
{
for
pid
,
faultpeer
:=
range
chain
.
faultPeerList
{
...
@@ -777,7 +764,7 @@ func (chain *BlockChain) ProcBlockHeaders(headers *types.Headers, pid string) er
...
@@ -777,7 +764,7 @@ func (chain *BlockChain) ProcBlockHeaders(headers *types.Headers, pid string) er
return
nil
return
nil
}
}
//在快速下载block阶段不处理fork的处理
//在快速下载block阶段不处理fork的处理
if
!
GetDownloadSyncStatus
()
{
if
!
chain
.
GetDownloadSyncStatus
()
{
go
chain
.
ProcDownLoadBlocks
(
ForkHeight
,
peermaxheight
,
[]
string
{
pid
})
go
chain
.
ProcDownLoadBlocks
(
ForkHeight
,
peermaxheight
,
[]
string
{
pid
})
}
}
return
nil
return
nil
...
@@ -894,17 +881,17 @@ func (chain *BlockChain) IsCaughtUp() bool {
...
@@ -894,17 +881,17 @@ func (chain *BlockChain) IsCaughtUp() bool {
}
}
//GetNtpClockSyncStatus 获取ntp时间是否同步状态
//GetNtpClockSyncStatus 获取ntp时间是否同步状态
func
GetNtpClockSyncStatus
()
bool
{
func
(
chain
*
BlockChain
)
GetNtpClockSyncStatus
()
bool
{
ntpClockSynclock
.
Lock
()
chain
.
ntpClockSynclock
.
Lock
()
defer
ntpClockSynclock
.
Unlock
()
defer
chain
.
ntpClockSynclock
.
Unlock
()
return
isNtpClockSync
return
chain
.
isNtpClockSync
}
}
//UpdateNtpClockSyncStatus 定时更新ntp时间同步状态
//UpdateNtpClockSyncStatus 定时更新ntp时间同步状态
func
UpdateNtpClockSyncStatus
(
Sync
bool
)
{
func
(
chain
*
BlockChain
)
UpdateNtpClockSyncStatus
(
Sync
bool
)
{
ntpClockSynclock
.
Lock
()
chain
.
ntpClockSynclock
.
Lock
()
defer
ntpClockSynclock
.
Unlock
()
defer
chain
.
ntpClockSynclock
.
Unlock
()
isNtpClockSync
=
Sync
chain
.
isNtpClockSync
=
Sync
}
}
//CheckBestChain 定时确保本节点在最优链上,定时向peer请求指定高度的header
//CheckBestChain 定时确保本节点在最优链上,定时向peer请求指定高度的header
...
@@ -924,8 +911,8 @@ func (chain *BlockChain) CheckBestChain(isFirst bool) {
...
@@ -924,8 +911,8 @@ func (chain *BlockChain) CheckBestChain(isFirst bool) {
tipheight
:=
chain
.
bestChain
.
Height
()
tipheight
:=
chain
.
bestChain
.
Height
()
bestpeerlock
.
Lock
()
chain
.
bestpeerlock
.
Lock
()
defer
bestpeerlock
.
Unlock
()
defer
chain
.
bestpeerlock
.
Unlock
()
for
_
,
peer
:=
range
peers
{
for
_
,
peer
:=
range
peers
{
bestpeer
:=
chain
.
bestChainPeerList
[
peer
.
Name
]
bestpeer
:=
chain
.
bestChainPeerList
[
peer
.
Name
]
...
@@ -958,16 +945,16 @@ func (chain *BlockChain) CheckBestChain(isFirst bool) {
...
@@ -958,16 +945,16 @@ func (chain *BlockChain) CheckBestChain(isFirst bool) {
//GetBestChainPeer 获取最优节点
//GetBestChainPeer 获取最优节点
func
(
chain
*
BlockChain
)
GetBestChainPeer
(
pid
string
)
*
BestPeerInfo
{
func
(
chain
*
BlockChain
)
GetBestChainPeer
(
pid
string
)
*
BestPeerInfo
{
bestpeerlock
.
Lock
()
chain
.
bestpeerlock
.
Lock
()
defer
bestpeerlock
.
Unlock
()
defer
chain
.
bestpeerlock
.
Unlock
()
return
chain
.
bestChainPeerList
[
pid
]
return
chain
.
bestChainPeerList
[
pid
]
}
}
//GetBestChainPids 定时确保本节点在最优链上,定时向peer请求指定高度的header
//GetBestChainPids 定时确保本节点在最优链上,定时向peer请求指定高度的header
func
(
chain
*
BlockChain
)
GetBestChainPids
()
[]
string
{
func
(
chain
*
BlockChain
)
GetBestChainPids
()
[]
string
{
var
PeerPids
[]
string
var
PeerPids
[]
string
bestpeerlock
.
Lock
()
chain
.
bestpeerlock
.
Lock
()
defer
bestpeerlock
.
Unlock
()
defer
chain
.
bestpeerlock
.
Unlock
()
peersmap
:=
chain
.
GetPeersMap
()
peersmap
:=
chain
.
GetPeersMap
()
for
key
,
value
:=
range
chain
.
bestChainPeerList
{
for
key
,
value
:=
range
chain
.
bestChainPeerList
{
...
@@ -997,8 +984,8 @@ func (chain *BlockChain) CheckBestChainProc(headers *types.Headers, pid string)
...
@@ -997,8 +984,8 @@ func (chain *BlockChain) CheckBestChainProc(headers *types.Headers, pid string)
return
return
}
}
bestpeerlock
.
Lock
()
chain
.
bestpeerlock
.
Lock
()
defer
bestpeerlock
.
Unlock
()
defer
chain
.
bestpeerlock
.
Unlock
()
bestchainpeer
:=
chain
.
bestChainPeerList
[
pid
]
bestchainpeer
:=
chain
.
bestChainPeerList
[
pid
]
if
bestchainpeer
==
nil
{
if
bestchainpeer
==
nil
{
...
...
vendor/github.com/33cn/chain33/blockchain/chain.go
View file @
1ae720fe
...
@@ -24,17 +24,11 @@ import (
...
@@ -24,17 +24,11 @@ import (
//var
//var
var
(
var
(
//cache 存贮的block个数
//cache 存贮的block个数
DefCacheSize
int64
=
128
MaxSeqCB
int64
=
20
MaxSeqCB
int64
=
20
cachelock
sync
.
Mutex
zeroHash
[
32
]
byte
zeroHash
[
32
]
byte
InitBlockNum
int64
=
10240
//节点刚启动时从db向index和bestchain缓存中添加的blocknode数,和blockNodeCacheLimit保持一致
InitBlockNum
int64
=
10240
//节点刚启动时从db向index和bestchain缓存中添加的blocknode数,和blockNodeCacheLimit保持一致
isStrongConsistency
=
false
chainlog
=
log
.
New
(
"module"
,
"blockchain"
)
chainlog
=
log
.
New
(
"module"
,
"blockchain"
)
FutureBlockDelayTime
int64
=
1
FutureBlockDelayTime
int64
=
1
isRecordBlockSequence
=
false
//是否记录add或者del block的序列,方便blcokchain的恢复通过记录的序列表
isParaChain
=
false
//是否是平行链。平行链需要记录Sequence信息
)
)
const
maxFutureBlocks
=
256
const
maxFutureBlocks
=
256
...
@@ -100,18 +94,44 @@ type BlockChain struct {
...
@@ -100,18 +94,44 @@ type BlockChain struct {
//downLoad block info
//downLoad block info
downLoadInfo
*
DownLoadInfo
downLoadInfo
*
DownLoadInfo
isFastDownloadSync
bool
//当本节点落后很多时,可以先下载区块到db,启动单独的goroutine去执行block
isRecordBlockSequence
bool
//是否记录add或者del block的序列,方便blcokchain的恢复通过记录的序列表
isParaChain
bool
//是否是平行链。平行链需要记录Sequence信息
isStrongConsistency
bool
//lock
cachelock
sync
.
Mutex
synBlocklock
sync
.
Mutex
peerMaxBlklock
sync
.
Mutex
castlock
sync
.
Mutex
ntpClockSynclock
sync
.
Mutex
faultpeerlock
sync
.
Mutex
bestpeerlock
sync
.
Mutex
downLoadlock
sync
.
Mutex
downLoadlock
sync
.
Mutex
fastDownLoadSynLock
sync
.
Mutex
isNtpClockSync
bool
//ntp时间是否同步
//cfg
MaxFetchBlockNum
int64
//一次最多申请获取block个数
TimeoutSeconds
int64
blockSynInterVal
time
.
Duration
DefCacheSize
int64
failed
int32
}
}
//New new
//New new
func
New
(
cfg
*
types
.
BlockChain
)
*
BlockChain
{
func
New
(
cfg
*
types
.
BlockChain
)
*
BlockChain
{
initConfig
(
cfg
)
futureBlocks
,
err
:=
lru
.
New
(
maxFutureBlocks
)
futureBlocks
,
err
:=
lru
.
New
(
maxFutureBlocks
)
if
err
!=
nil
{
if
err
!=
nil
{
panic
(
"when New BlockChain lru.New return err"
)
panic
(
"when New BlockChain lru.New return err"
)
}
}
defCacheSize
:=
int64
(
128
)
if
cfg
.
DefCacheSize
>
0
{
defCacheSize
=
cfg
.
DefCacheSize
}
blockchain
:=
&
BlockChain
{
blockchain
:=
&
BlockChain
{
cache
:
NewBlockCache
(
DefCacheSize
),
cache
:
NewBlockCache
(
defCacheSize
),
DefCacheSize
:
defCacheSize
,
rcvLastBlockHeight
:
-
1
,
rcvLastBlockHeight
:
-
1
,
synBlockHeight
:
-
1
,
synBlockHeight
:
-
1
,
peerList
:
nil
,
peerList
:
nil
,
...
@@ -134,30 +154,31 @@ func New(cfg *types.BlockChain) *BlockChain {
...
@@ -134,30 +154,31 @@ func New(cfg *types.BlockChain) *BlockChain {
bestChainPeerList
:
make
(
map
[
string
]
*
BestPeerInfo
),
bestChainPeerList
:
make
(
map
[
string
]
*
BestPeerInfo
),
futureBlocks
:
futureBlocks
,
futureBlocks
:
futureBlocks
,
downLoadInfo
:
&
DownLoadInfo
{},
downLoadInfo
:
&
DownLoadInfo
{},
isNtpClockSync
:
true
,
MaxFetchBlockNum
:
128
*
6
,
//一次最多申请获取block个数
TimeoutSeconds
:
2
,
isFastDownloadSync
:
true
,
}
}
blockchain
.
initConfig
(
cfg
)
return
blockchain
return
blockchain
}
}
func
initConfig
(
cfg
*
types
.
BlockChain
)
{
func
(
chain
*
BlockChain
)
initConfig
(
cfg
*
types
.
BlockChain
)
{
if
cfg
.
DefCacheSize
>
0
{
if
types
.
IsEnable
(
"TxHeight"
)
&&
chain
.
DefCacheSize
<=
(
types
.
LowAllowPackHeight
+
types
.
HighAllowPackHeight
+
1
)
{
DefCacheSize
=
cfg
.
DefCacheSize
}
if
types
.
IsEnable
(
"TxHeight"
)
&&
DefCacheSize
<=
(
types
.
LowAllowPackHeight
+
types
.
HighAllowPackHeight
+
1
)
{
panic
(
"when Enable TxHeight DefCacheSize must big than types.LowAllowPackHeight"
)
panic
(
"when Enable TxHeight DefCacheSize must big than types.LowAllowPackHeight"
)
}
}
if
cfg
.
MaxFetchBlockNum
>
0
{
if
cfg
.
MaxFetchBlockNum
>
0
{
MaxFetchBlockNum
=
cfg
.
MaxFetchBlockNum
chain
.
MaxFetchBlockNum
=
cfg
.
MaxFetchBlockNum
}
}
if
cfg
.
TimeoutSeconds
>
0
{
if
cfg
.
TimeoutSeconds
>
0
{
TimeoutSeconds
=
cfg
.
TimeoutSeconds
chain
.
TimeoutSeconds
=
cfg
.
TimeoutSeconds
}
}
isStrongConsistency
=
cfg
.
IsStrongConsistency
chain
.
blockSynInterVal
=
time
.
Duration
(
chain
.
TimeoutSeconds
)
isRecordBlockSequence
=
cfg
.
IsRecordBlockSequence
chain
.
isStrongConsistency
=
cfg
.
IsStrongConsistency
isParaChain
=
cfg
.
IsParaChain
chain
.
isRecordBlockSequence
=
cfg
.
IsRecordBlockSequence
chain
.
isParaChain
=
cfg
.
IsParaChain
types
.
S
(
"quickIndex"
,
cfg
.
EnableTxQuickIndex
)
types
.
S
(
"quickIndex"
,
cfg
.
EnableTxQuickIndex
)
}
}
...
@@ -193,7 +214,7 @@ func (chain *BlockChain) SetQueueClient(client queue.Client) {
...
@@ -193,7 +214,7 @@ func (chain *BlockChain) SetQueueClient(client queue.Client) {
chain
.
client
.
Sub
(
"blockchain"
)
chain
.
client
.
Sub
(
"blockchain"
)
blockStoreDB
:=
dbm
.
NewDB
(
"blockchain"
,
chain
.
cfg
.
Driver
,
chain
.
cfg
.
DbPath
,
chain
.
cfg
.
DbCache
)
blockStoreDB
:=
dbm
.
NewDB
(
"blockchain"
,
chain
.
cfg
.
Driver
,
chain
.
cfg
.
DbPath
,
chain
.
cfg
.
DbCache
)
blockStore
:=
NewBlockStore
(
blockStoreDB
,
client
)
blockStore
:=
NewBlockStore
(
chain
,
blockStoreDB
,
client
)
chain
.
blockStore
=
blockStore
chain
.
blockStore
=
blockStore
stateHash
:=
chain
.
getStateHash
()
stateHash
:=
chain
.
getStateHash
()
chain
.
query
=
NewQuery
(
blockStoreDB
,
chain
.
client
,
stateHash
)
chain
.
query
=
NewQuery
(
blockStoreDB
,
chain
.
client
,
stateHash
)
...
@@ -226,7 +247,7 @@ func (chain *BlockChain) GetOrphanPool() *OrphanPool {
...
@@ -226,7 +247,7 @@ func (chain *BlockChain) GetOrphanPool() *OrphanPool {
func
(
chain
*
BlockChain
)
InitBlockChain
()
{
func
(
chain
*
BlockChain
)
InitBlockChain
()
{
//isRecordBlockSequence配置的合法性检测
//isRecordBlockSequence配置的合法性检测
if
!
chain
.
cfg
.
IsParaChain
{
if
!
chain
.
cfg
.
IsParaChain
{
chain
.
blockStore
.
isRecordBlockSequenceValid
()
chain
.
blockStore
.
isRecordBlockSequenceValid
(
chain
)
}
}
//先缓存最新的128个block信息到cache中
//先缓存最新的128个block信息到cache中
curheight
:=
chain
.
GetBlockHeight
()
curheight
:=
chain
.
GetBlockHeight
()
...
@@ -394,7 +415,7 @@ func (chain *BlockChain) InitCache(height int64) {
...
@@ -394,7 +415,7 @@ func (chain *BlockChain) InitCache(height int64) {
if
height
<
0
{
if
height
<
0
{
return
return
}
}
for
i
:=
height
-
DefCacheSize
;
i
<=
height
;
i
++
{
for
i
:=
height
-
chain
.
DefCacheSize
;
i
<=
height
;
i
++
{
if
i
<
0
{
if
i
<
0
{
i
=
0
i
=
0
}
}
...
...
vendor/github.com/33cn/chain33/blockchain/download.go
View file @
1ae720fe
...
@@ -6,7 +6,6 @@ package blockchain
...
@@ -6,7 +6,6 @@ package blockchain
import
(
import
(
"fmt"
"fmt"
"sync"
"sync/atomic"
"sync/atomic"
"time"
"time"
...
@@ -19,8 +18,6 @@ import (
...
@@ -19,8 +18,6 @@ import (
var
(
var
(
tempBlockKey
=
[]
byte
(
"TB:"
)
tempBlockKey
=
[]
byte
(
"TB:"
)
lastTempBlockKey
=
[]
byte
(
"LTB:"
)
lastTempBlockKey
=
[]
byte
(
"LTB:"
)
isFastDownloadSync
=
true
//当本节点落后很多时,可以先下载区块到db,启动单独的goroutine去执行block
fastDownLoadSynLock
sync
.
Mutex
)
)
//const
//const
...
@@ -56,17 +53,17 @@ func calcLastTempBlockHeightKey() []byte {
...
@@ -56,17 +53,17 @@ func calcLastTempBlockHeightKey() []byte {
}
}
//GetDownloadSyncStatus 获取下载区块的同步模式
//GetDownloadSyncStatus 获取下载区块的同步模式
func
GetDownloadSyncStatus
()
bool
{
func
(
chain
*
BlockChain
)
GetDownloadSyncStatus
()
bool
{
fastDownLoadSynLock
.
Lock
()
chain
.
fastDownLoadSynLock
.
Lock
()
defer
fastDownLoadSynLock
.
Unlock
()
defer
chain
.
fastDownLoadSynLock
.
Unlock
()
return
isFastDownloadSync
return
chain
.
isFastDownloadSync
}
}
//UpdateDownloadSyncStatus 更新下载区块的同步模式
//UpdateDownloadSyncStatus 更新下载区块的同步模式
func
UpdateDownloadSyncStatus
(
Sync
bool
)
{
func
(
chain
*
BlockChain
)
UpdateDownloadSyncStatus
(
Sync
bool
)
{
fastDownLoadSynLock
.
Lock
()
chain
.
fastDownLoadSynLock
.
Lock
()
defer
fastDownLoadSynLock
.
Unlock
()
defer
chain
.
fastDownLoadSynLock
.
Unlock
()
isFastDownloadSync
=
Sync
chain
.
isFastDownloadSync
=
Sync
}
}
//FastDownLoadBlocks 开启快速下载区块的模式
//FastDownLoadBlocks 开启快速下载区块的模式
...
@@ -93,7 +90,7 @@ func (chain *BlockChain) FastDownLoadBlocks() {
...
@@ -93,7 +90,7 @@ func (chain *BlockChain) FastDownLoadBlocks() {
pids
:=
chain
.
GetBestChainPids
()
pids
:=
chain
.
GetBestChainPids
()
//节点启动时只有落后最优链batchsyncblocknum个区块时才开启这种下载模式
//节点启动时只有落后最优链batchsyncblocknum个区块时才开启这种下载模式
if
pids
!=
nil
&&
peerMaxBlkHeight
!=
-
1
&&
curheight
+
batchsyncblocknum
>=
peerMaxBlkHeight
{
if
pids
!=
nil
&&
peerMaxBlkHeight
!=
-
1
&&
curheight
+
batchsyncblocknum
>=
peerMaxBlkHeight
{
UpdateDownloadSyncStatus
(
false
)
chain
.
UpdateDownloadSyncStatus
(
false
)
synlog
.
Info
(
"FastDownLoadBlocks:quit!"
,
"curheight"
,
curheight
,
"peerMaxBlkHeight"
,
peerMaxBlkHeight
)
synlog
.
Info
(
"FastDownLoadBlocks:quit!"
,
"curheight"
,
curheight
,
"peerMaxBlkHeight"
,
peerMaxBlkHeight
)
break
break
}
else
if
curheight
+
batchsyncblocknum
<
peerMaxBlkHeight
&&
len
(
pids
)
>=
bestPeerCount
{
}
else
if
curheight
+
batchsyncblocknum
<
peerMaxBlkHeight
&&
len
(
pids
)
>=
bestPeerCount
{
...
@@ -102,7 +99,7 @@ func (chain *BlockChain) FastDownLoadBlocks() {
...
@@ -102,7 +99,7 @@ func (chain *BlockChain) FastDownLoadBlocks() {
go
chain
.
ReadBlockToExec
(
peerMaxBlkHeight
,
true
)
go
chain
.
ReadBlockToExec
(
peerMaxBlkHeight
,
true
)
break
break
}
else
if
types
.
Since
(
startTime
)
>
waitTimeDownLoad
*
time
.
Second
||
chain
.
cfg
.
SingleMode
{
}
else
if
types
.
Since
(
startTime
)
>
waitTimeDownLoad
*
time
.
Second
||
chain
.
cfg
.
SingleMode
{
UpdateDownloadSyncStatus
(
false
)
chain
.
UpdateDownloadSyncStatus
(
false
)
synlog
.
Info
(
"FastDownLoadBlocks:waitTimeDownLoad:quit!"
,
"curheight"
,
curheight
,
"peerMaxBlkHeight"
,
peerMaxBlkHeight
,
"pids"
,
pids
)
synlog
.
Info
(
"FastDownLoadBlocks:waitTimeDownLoad:quit!"
,
"curheight"
,
curheight
,
"peerMaxBlkHeight"
,
peerMaxBlkHeight
,
"pids"
,
pids
)
break
break
}
else
{
}
else
{
...
@@ -183,7 +180,7 @@ func (chain *BlockChain) ReadBlockToExec(height int64, isNewStart bool) {
...
@@ -183,7 +180,7 @@ func (chain *BlockChain) ReadBlockToExec(height int64, isNewStart bool) {
//CancelFastDownLoadFlag 清除快速下载模式的一些标志
//CancelFastDownLoadFlag 清除快速下载模式的一些标志
func
(
chain
*
BlockChain
)
cancelFastDownLoadFlag
(
isNewStart
bool
)
{
func
(
chain
*
BlockChain
)
cancelFastDownLoadFlag
(
isNewStart
bool
)
{
if
isNewStart
{
if
isNewStart
{
UpdateDownloadSyncStatus
(
false
)
chain
.
UpdateDownloadSyncStatus
(
false
)
}
}
chain
.
DelLastTempBlockHeight
()
chain
.
DelLastTempBlockHeight
()
synlog
.
Info
(
"cancelFastDownLoadFlag"
,
"isNewStart"
,
isNewStart
)
synlog
.
Info
(
"cancelFastDownLoadFlag"
,
"isNewStart"
,
isNewStart
)
...
...
vendor/github.com/33cn/chain33/blockchain/ntp.go
View file @
1ae720fe
...
@@ -21,12 +21,11 @@ const (
...
@@ -21,12 +21,11 @@ const (
var
(
var
(
ntpLog
=
chainlog
.
New
(
"submodule"
,
"ntp"
)
ntpLog
=
chainlog
.
New
(
"submodule"
,
"ntp"
)
failed
int32
)
)
// checkClockDrift queries an NTP server for clock drifts and warns the user if
// checkClockDrift queries an NTP server for clock drifts and warns the user if
// one large enough is detected.
// one large enough is detected.
func
checkClockDrift
()
{
func
(
chain
*
BlockChain
)
checkClockDrift
()
{
realnow
:=
common
.
GetRealTimeRetry
(
types
.
NtpHosts
,
10
)
realnow
:=
common
.
GetRealTimeRetry
(
types
.
NtpHosts
,
10
)
if
realnow
.
IsZero
()
{
if
realnow
.
IsZero
()
{
ntpLog
.
Info
(
"checkClockDrift"
,
"sntpDrift err"
,
"get ntptime error"
)
ntpLog
.
Info
(
"checkClockDrift"
,
"sntpDrift err"
,
"get ntptime error"
)
...
@@ -42,14 +41,14 @@ func checkClockDrift() {
...
@@ -42,14 +41,14 @@ func checkClockDrift() {
ntpLog
.
Warn
(
fmt
.
Sprint
(
warning
))
ntpLog
.
Warn
(
fmt
.
Sprint
(
warning
))
ntpLog
.
Warn
(
fmt
.
Sprint
(
howtofix
))
ntpLog
.
Warn
(
fmt
.
Sprint
(
howtofix
))
ntpLog
.
Warn
(
fmt
.
Sprint
(
separator
))
ntpLog
.
Warn
(
fmt
.
Sprint
(
separator
))
atomic
.
AddInt32
(
&
failed
,
1
)
atomic
.
AddInt32
(
&
chain
.
failed
,
1
)
if
atomic
.
LoadInt32
(
&
failed
)
==
ntpChecks
{
if
atomic
.
LoadInt32
(
&
chain
.
failed
)
==
ntpChecks
{
ntpLog
.
Error
(
"System clock seems ERROR"
)
ntpLog
.
Error
(
"System clock seems ERROR"
)
UpdateNtpClockSyncStatus
(
false
)
chain
.
UpdateNtpClockSyncStatus
(
false
)
}
}
}
else
{
}
else
{
atomic
.
StoreInt32
(
&
failed
,
0
)
atomic
.
StoreInt32
(
&
chain
.
failed
,
0
)
UpdateNtpClockSyncStatus
(
true
)
chain
.
UpdateNtpClockSyncStatus
(
true
)
ntpLog
.
Info
(
fmt
.
Sprintf
(
"Sanity NTP check reported %v drift, all ok"
,
drift
))
ntpLog
.
Info
(
fmt
.
Sprintf
(
"Sanity NTP check reported %v drift, all ok"
,
drift
))
}
}
}
}
vendor/github.com/33cn/chain33/blockchain/proc.go
View file @
1ae720fe
...
@@ -61,7 +61,7 @@ func (chain *BlockChain) ProcRecvMsg() {
...
@@ -61,7 +61,7 @@ func (chain *BlockChain) ProcRecvMsg() {
case
types
.
EventIsSync
:
case
types
.
EventIsSync
:
go
chain
.
processMsg
(
msg
,
reqnum
,
chain
.
isSync
)
go
chain
.
processMsg
(
msg
,
reqnum
,
chain
.
isSync
)
case
types
.
EventIsNtpClockSync
:
case
types
.
EventIsNtpClockSync
:
go
chain
.
processMsg
(
msg
,
reqnum
,
chain
.
isNtpClockSync
)
go
chain
.
processMsg
(
msg
,
reqnum
,
chain
.
isNtpClockSync
Func
)
case
types
.
EventGetLastBlockSequence
:
case
types
.
EventGetLastBlockSequence
:
go
chain
.
processMsg
(
msg
,
reqnum
,
chain
.
getLastBlockSequence
)
go
chain
.
processMsg
(
msg
,
reqnum
,
chain
.
getLastBlockSequence
)
...
@@ -161,7 +161,7 @@ func (chain *BlockChain) addBlock(msg *queue.Message) {
...
@@ -161,7 +161,7 @@ func (chain *BlockChain) addBlock(msg *queue.Message) {
reply
.
IsOk
=
true
reply
.
IsOk
=
true
blockpid
:=
msg
.
Data
.
(
*
types
.
BlockPid
)
blockpid
:=
msg
.
Data
.
(
*
types
.
BlockPid
)
//chainlog.Error("addBlock", "height", blockpid.Block.Height, "pid", blockpid.Pid)
//chainlog.Error("addBlock", "height", blockpid.Block.Height, "pid", blockpid.Pid)
if
GetDownloadSyncStatus
()
{
if
chain
.
GetDownloadSyncStatus
()
{
//downLoadTask 运行时设置对应的blockdone
//downLoadTask 运行时设置对应的blockdone
if
chain
.
downLoadTask
.
InProgress
()
{
if
chain
.
downLoadTask
.
InProgress
()
{
chain
.
downLoadTask
.
Done
(
blockpid
.
Block
.
GetHeight
())
chain
.
downLoadTask
.
Done
(
blockpid
.
Block
.
GetHeight
())
...
@@ -366,8 +366,8 @@ func (chain *BlockChain) getLastBlock(msg *queue.Message) {
...
@@ -366,8 +366,8 @@ func (chain *BlockChain) getLastBlock(msg *queue.Message) {
}
}
}
}
func
(
chain
*
BlockChain
)
isNtpClockSync
(
msg
*
queue
.
Message
)
{
func
(
chain
*
BlockChain
)
isNtpClockSync
Func
(
msg
*
queue
.
Message
)
{
ok
:=
GetNtpClockSyncStatus
()
ok
:=
chain
.
GetNtpClockSyncStatus
()
msg
.
Reply
(
chain
.
client
.
NewMessage
(
""
,
types
.
EventReplyIsNtpClockSync
,
&
types
.
IsNtpClockSync
{
Isntpclocksync
:
ok
}))
msg
.
Reply
(
chain
.
client
.
NewMessage
(
""
,
types
.
EventReplyIsNtpClockSync
,
&
types
.
IsNtpClockSync
{
Isntpclocksync
:
ok
}))
}
}
...
...
vendor/github.com/33cn/chain33/blockchain/process.go
View file @
1ae720fe
...
@@ -402,7 +402,7 @@ func (b *BlockChain) connectBlock(node *blockNode, blockdetail *types.BlockDetai
...
@@ -402,7 +402,7 @@ func (b *BlockChain) connectBlock(node *blockNode, blockdetail *types.BlockDetai
}
}
}
}
//目前非平行链并开启isRecordBlockSequence功能
//目前非平行链并开启isRecordBlockSequence功能
if
isRecordBlockSequence
&&
!
isParaChain
{
if
b
.
isRecordBlockSequence
&&
!
b
.
isParaChain
{
b
.
pushseq
.
updateSeq
(
lastSequence
)
b
.
pushseq
.
updateSeq
(
lastSequence
)
}
}
return
blockdetail
,
nil
return
blockdetail
,
nil
...
@@ -471,7 +471,7 @@ func (b *BlockChain) disconnectBlock(node *blockNode, blockdetail *types.BlockDe
...
@@ -471,7 +471,7 @@ func (b *BlockChain) disconnectBlock(node *blockNode, blockdetail *types.BlockDe
chainlog
.
Debug
(
"disconnectBlock success"
,
"newtipnode.hash"
,
common
.
ToHex
(
newtipnode
.
hash
),
"delblock.parent.hash"
,
common
.
ToHex
(
blockdetail
.
Block
.
GetParentHash
()))
chainlog
.
Debug
(
"disconnectBlock success"
,
"newtipnode.hash"
,
common
.
ToHex
(
newtipnode
.
hash
),
"delblock.parent.hash"
,
common
.
ToHex
(
blockdetail
.
Block
.
GetParentHash
()))
//目前非平行链并开启isRecordBlockSequence功能
//目前非平行链并开启isRecordBlockSequence功能
if
isRecordBlockSequence
&&
!
isParaChain
{
if
b
.
isRecordBlockSequence
&&
!
b
.
isParaChain
{
b
.
pushseq
.
updateSeq
(
lastSequence
)
b
.
pushseq
.
updateSeq
(
lastSequence
)
}
}
return
nil
return
nil
...
...
vendor/github.com/33cn/chain33/blockchain/sequences.go
View file @
1ae720fe
...
@@ -96,7 +96,7 @@ func (chain *BlockChain) ProcAddBlockSeqCB(cb *types.BlockSeqCB) error {
...
@@ -96,7 +96,7 @@ func (chain *BlockChain) ProcAddBlockSeqCB(cb *types.BlockSeqCB) error {
return
types
.
ErrInvalidParam
return
types
.
ErrInvalidParam
}
}
if
!
isRecordBlockSequence
{
if
!
chain
.
isRecordBlockSequence
{
return
types
.
ErrRecordBlockSequence
return
types
.
ErrRecordBlockSequence
}
}
if
chain
.
blockStore
.
seqCBNum
()
>=
MaxSeqCB
&&
!
chain
.
blockStore
.
isSeqCBExist
(
cb
.
Name
)
{
if
chain
.
blockStore
.
seqCBNum
()
>=
MaxSeqCB
&&
!
chain
.
blockStore
.
isSeqCBExist
(
cb
.
Name
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment