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
a9674899
Commit
a9674899
authored
Oct 23, 2019
by
mdj33
Committed by
vipwzw
Nov 15, 2019
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
self-consens stages
parent
4e39fe06
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
139 additions
and
90 deletions
+139
-90
chain33.para.toml
chain33.para.toml
+4
-3
para.go
plugin/consensus/para/para.go
+60
-26
paracommitmsg.go
plugin/consensus/para/paracommitmsg.go
+63
-38
parasync.go
plugin/consensus/para/parasync.go
+3
-1
action.go
plugin/dapp/paracross/executor/action.go
+5
-22
paracross.proto
plugin/dapp/paracross/proto/paracross.proto
+1
-0
type.go
plugin/dapp/paracross/types/type.go
+3
-0
No files found.
chain33.para.toml
View file @
a9674899
...
@@ -104,15 +104,16 @@ authAccount=""
...
@@ -104,15 +104,16 @@ authAccount=""
genesisAmount
=
100000000
genesisAmount
=
100000000
#主链支持平行链共识tx分叉高度,需要和主链保持严格一致,不可修改,2270000是bityuan主链对应高度, ycc或其他按实际修改
#主链支持平行链共识tx分叉高度,需要和主链保持严格一致,不可修改,2270000是bityuan主链对应高度, ycc或其他按实际修改
MainForkParacrossCommitTx
=
2270000
MainForkParacrossCommitTx
=
2270000
#平行链自共识开启对应的主链高度,需要大于等于MainForkParacrossCommitTx=2270000, -1 不开启
MainParaSelfConsensusForkHeight
=
-1
#主链开启循环检查共识交易done的fork高度,需要和主链保持严格一致,不可修改,4320000是bityuan主链对应高度, ycc或其他按实际修改
#主链开启循环检查共识交易done的fork高度,需要和主链保持严格一致,不可修改,4320000是bityuan主链对应高度, ycc或其他按实际修改
MainLoopCheckCommitTxDoneForkHeight
=
4320000
MainLoopCheckCommitTxDoneForkHeight
=
4320000
#主链每隔几个没有相关平行链交易的区块,平行链上打包空区块,缺省从平行链blockHeight=0开始,依次增长,空块间隔不能为0
#主链每隔几个没有相关平行链交易的区块,平行链上打包空区块,缺省从平行链blockHeight=0开始,依次增长,空块间隔不能为0
[[consensus.sub.para.emptyBlockInterval]]
[[consensus.sub.para.emptyBlockInterval]]
blockHeight
=
0
blockHeight
=
0
interval
=
50
interval
=
50
#平行链自共识开启对应的主链高度,必须大于等于MainForkParacrossCommitTx=2270000, -1 不开启,可以多个高度开启和关闭
[[consensus.sub.para.selfConsensusEnable]]
blockHeight
=
0
enable
=
false
[store]
[store]
...
...
plugin/consensus/para/para.go
View file @
a9674899
...
@@ -73,27 +73,32 @@ type emptyBlockInterval struct {
...
@@ -73,27 +73,32 @@ type emptyBlockInterval struct {
Interval
int64
`json:"interval,omitempty"`
Interval
int64
`json:"interval,omitempty"`
}
}
type
paraSelfConsEnable
struct
{
BlockHeight
int64
`json:"blockHeight,omitempty"`
Enable
bool
`json:"enable,omitempty"`
}
type
subConfig
struct
{
type
subConfig
struct
{
WriteBlockSeconds
int64
`json:"writeBlockSeconds,omitempty"`
WriteBlockSeconds
int64
`json:"writeBlockSeconds,omitempty"`
ParaRemoteGrpcClient
string
`json:"paraRemoteGrpcClient,omitempty"`
ParaRemoteGrpcClient
string
`json:"paraRemoteGrpcClient,omitempty"`
StartHeight
int64
`json:"startHeight,omitempty"`
StartHeight
int64
`json:"startHeight,omitempty"`
GenesisStartHeightSame
bool
`json:"genesisStartHeightSame,omitempty"`
GenesisStartHeightSame
bool
`json:"genesisStartHeightSame,omitempty"`
EmptyBlockInterval
[]
*
emptyBlockInterval
`json:"emptyBlockInterval,omitempty"`
EmptyBlockInterval
[]
*
emptyBlockInterval
`json:"emptyBlockInterval,omitempty"`
AuthAccount
string
`json:"authAccount,omitempty"`
AuthAccount
string
`json:"authAccount,omitempty"`
WaitBlocks4CommitMsg
int32
`json:"waitBlocks4CommitMsg,omitempty"`
WaitBlocks4CommitMsg
int32
`json:"waitBlocks4CommitMsg,omitempty"`
GenesisAmount
int64
`json:"genesisAmount,omitempty"`
GenesisAmount
int64
`json:"genesisAmount,omitempty"`
MainBlockHashForkHeight
int64
`json:"mainBlockHashForkHeight,omitempty"`
MainBlockHashForkHeight
int64
`json:"mainBlockHashForkHeight,omitempty"`
MainParaSelfConsensusForkHeight
int64
`json:"mainParaSelfConsensusForkHeight
,omitempty"`
selfConsensusEnable
[]
*
paraSelfConsEnable
`json:"selfConsensusEnable
,omitempty"`
WaitConsensStopTimes
uint32
`json:"waitConsensStopTimes,omitempty"`
WaitConsensStopTimes
uint32
`json:"waitConsensStopTimes,omitempty"`
MaxCacheCount
int64
`json:"maxCacheCount,omitempty"`
MaxCacheCount
int64
`json:"maxCacheCount,omitempty"`
MaxSyncErrCount
int32
`json:"maxSyncErrCount,omitempty"`
MaxSyncErrCount
int32
`json:"maxSyncErrCount,omitempty"`
FetchFilterParaTxsClose
bool
`json:"fetchFilterParaTxsClose,omitempty"`
FetchFilterParaTxsClose
bool
`json:"fetchFilterParaTxsClose,omitempty"`
BatchFetchBlockCount
int64
`json:"batchFetchBlockCount,omitempty"`
BatchFetchBlockCount
int64
`json:"batchFetchBlockCount,omitempty"`
ParaConsensStartHeight
int64
`json:"paraConsensStartHeight,omitempty"`
ParaConsensStartHeight
int64
`json:"paraConsensStartHeight,omitempty"`
MultiDownloadOpen
bool
`json:"multiDownloadOpen,omitempty"`
MultiDownloadOpen
bool
`json:"multiDownloadOpen,omitempty"`
MultiDownInvNumPerJob
int64
`json:"multiDownInvNumPerJob,omitempty"`
MultiDownInvNumPerJob
int64
`json:"multiDownInvNumPerJob,omitempty"`
MultiDownJobBuffNum
uint32
`json:"multiDownJobBuffNum,omitempty"`
MultiDownJobBuffNum
uint32
`json:"multiDownJobBuffNum,omitempty"`
MultiDownServerRspTime
uint32
`json:"multiDownServerRspTime,omitempty"`
MultiDownServerRspTime
uint32
`json:"multiDownServerRspTime,omitempty"`
}
}
// New function to init paracross env
// New function to init paracross env
...
@@ -123,8 +128,18 @@ func New(cfg *types.Consensus, sub []byte) queue.Module {
...
@@ -123,8 +128,18 @@ func New(cfg *types.Consensus, sub []byte) queue.Module {
subcfg
.
MainBlockHashForkHeight
=
defaultMainBlockHashForkHeight
subcfg
.
MainBlockHashForkHeight
=
defaultMainBlockHashForkHeight
}
}
if
subcfg
.
MainParaSelfConsensusForkHeight
<=
0
{
if
len
(
subcfg
.
selfConsensusEnable
)
==
0
{
subcfg
.
MainParaSelfConsensusForkHeight
=
mainParaSelfConsensusForkHeight
selfEnable
:=
&
paraSelfConsEnable
{
Enable
:
false
}
subcfg
.
selfConsensusEnable
=
append
(
subcfg
.
selfConsensusEnable
,
selfEnable
)
}
if
subcfg
.
selfConsensusEnable
[
0
]
.
BlockHeight
!=
0
{
selfEnable
:=
&
paraSelfConsEnable
{
Enable
:
false
}
subcfg
.
selfConsensusEnable
=
append
([]
*
paraSelfConsEnable
{
selfEnable
},
subcfg
.
selfConsensusEnable
...
)
}
err
=
checkSelfConsensEnable
(
subcfg
.
selfConsensusEnable
)
if
err
!=
nil
{
panic
(
"para selfConsensusEnable config not correct"
)
}
}
if
subcfg
.
BatchFetchBlockCount
<=
0
{
if
subcfg
.
BatchFetchBlockCount
<=
0
{
...
@@ -161,7 +176,8 @@ func New(cfg *types.Consensus, sub []byte) queue.Module {
...
@@ -161,7 +176,8 @@ func New(cfg *types.Consensus, sub []byte) queue.Module {
waitConsensStopTimes
:
waitConsensStopTimes
,
waitConsensStopTimes
:
waitConsensStopTimes
,
consensHeight
:
-
2
,
consensHeight
:
-
2
,
sendingHeight
:
-
1
,
sendingHeight
:
-
1
,
consensStartHeight
:
-
1
,
consensDoneHeight
:
-
1
,
selfConsensMap
:
make
(
map
[
int64
]
bool
),
resetCh
:
make
(
chan
interface
{},
1
),
resetCh
:
make
(
chan
interface
{},
1
),
quit
:
make
(
chan
struct
{}),
quit
:
make
(
chan
struct
{}),
}
}
...
@@ -173,10 +189,12 @@ func New(cfg *types.Consensus, sub []byte) queue.Module {
...
@@ -173,10 +189,12 @@ func New(cfg *types.Consensus, sub []byte) queue.Module {
para
.
commitMsgClient
.
waitConsensStopTimes
=
subcfg
.
WaitConsensStopTimes
para
.
commitMsgClient
.
waitConsensStopTimes
=
subcfg
.
WaitConsensStopTimes
}
}
para
.
commitMsgClient
.
setSelfConsensMap
(
subcfg
.
selfConsensusEnable
)
// 设置平行链共识起始高度,在共识高度为-1也就是从未共识过的环境中允许从设置的非0起始高度开始共识
// 设置平行链共识起始高度,在共识高度为-1也就是从未共识过的环境中允许从设置的非0起始高度开始共识
//note:只有在主链LoopCheckCommitTxDoneForkHeight之后才支持设置ParaConsensStartHeight
//note:只有在主链LoopCheckCommitTxDoneForkHeight之后才支持设置ParaConsensStartHeight
if
subcfg
.
ParaConsensStartHeight
>
0
{
if
subcfg
.
ParaConsensStartHeight
>
0
{
para
.
commitMsgClient
.
consens
Start
Height
=
subcfg
.
ParaConsensStartHeight
-
1
para
.
commitMsgClient
.
consens
Done
Height
=
subcfg
.
ParaConsensStartHeight
-
1
}
}
para
.
blockSyncClient
=
&
blockSyncClient
{
para
.
blockSyncClient
=
&
blockSyncClient
{
...
@@ -231,6 +249,17 @@ func checkEmptyBlockInterval(in []*emptyBlockInterval) error {
...
@@ -231,6 +249,17 @@ func checkEmptyBlockInterval(in []*emptyBlockInterval) error {
return
nil
return
nil
}
}
func
checkSelfConsensEnable
(
in
[]
*
paraSelfConsEnable
)
error
{
for
i
:=
0
;
i
<
len
(
in
);
i
++
{
if
i
>
0
&&
in
[
i
]
.
BlockHeight
<=
in
[
i
-
1
]
.
BlockHeight
{
plog
.
Error
(
"selfConsensEnable,blockHeight should be sequence"
,
"preHeight"
,
in
[
i
-
1
]
.
BlockHeight
,
"laterHeight"
,
in
[
i
]
.
BlockHeight
)
return
types
.
ErrInvalidParam
}
}
return
nil
}
//para 不检查任何的交易
//para 不检查任何的交易
func
(
client
*
client
)
CheckBlock
(
parent
*
types
.
Block
,
current
*
types
.
BlockDetail
)
error
{
func
(
client
*
client
)
CheckBlock
(
parent
*
types
.
Block
,
current
*
types
.
BlockDetail
)
error
{
err
:=
checkMinerTx
(
current
)
err
:=
checkMinerTx
(
current
)
...
@@ -371,8 +400,13 @@ func (client *client) CreateGenesisTx() (ret []*types.Transaction) {
...
@@ -371,8 +400,13 @@ func (client *client) CreateGenesisTx() (ret []*types.Transaction) {
return
return
}
}
func
(
client
*
client
)
isParaSelfConsensusForked
(
height
int64
)
bool
{
func
(
client
*
client
)
getSelfConsEnableStatus
(
height
int64
)
*
paraSelfConsEnable
{
return
height
>
client
.
subCfg
.
MainParaSelfConsensusForkHeight
for
i
:=
len
(
client
.
subCfg
.
selfConsensusEnable
)
-
1
;
i
>=
0
;
i
--
{
if
height
>=
client
.
subCfg
.
selfConsensusEnable
[
i
]
.
BlockHeight
{
return
client
.
subCfg
.
selfConsensusEnable
[
i
]
}
}
panic
(
fmt
.
Sprintf
(
"para selfConsensusEnable not set for height=%d"
,
height
))
}
}
func
(
client
*
client
)
ProcEvent
(
msg
*
queue
.
Message
)
bool
{
func
(
client
*
client
)
ProcEvent
(
msg
*
queue
.
Message
)
bool
{
...
...
plugin/consensus/para/paracommitmsg.go
View file @
a9674899
...
@@ -44,11 +44,13 @@ type commitMsgClient struct {
...
@@ -44,11 +44,13 @@ type commitMsgClient struct {
chainHeight
int64
chainHeight
int64
sendingHeight
int64
sendingHeight
int64
consensHeight
int64
consensHeight
int64
consensStartHeight
int64
consensDoneHeight
int64
selfConsensForked
int32
//自共识比主链共识更高的异常场景,需要等待自共识<=主链共识再发送
authAccountIn
bool
authAccountIn
bool
isRollBack
int32
isRollBack
int32
checkTxCommitTimes
int32
checkTxCommitTimes
int32
txFeeRate
int64
txFeeRate
int64
selfConsensMap
map
[
int64
]
bool
//selfConsensEnable 分段 map
privateKey
crypto
.
PrivKey
privateKey
crypto
.
PrivKey
quit
chan
struct
{}
quit
chan
struct
{}
mutex
sync
.
Mutex
mutex
sync
.
Mutex
...
@@ -153,8 +155,8 @@ func (client *commitMsgClient) sendCommitTx() {
...
@@ -153,8 +155,8 @@ func (client *commitMsgClient) sendCommitTx() {
consensHeight
:=
client
.
getConsensusHeight
()
consensHeight
:=
client
.
getConsensusHeight
()
//只有从未共识过,才可以设置从初始起始高度跳跃
//只有从未共识过,才可以设置从初始起始高度跳跃
if
consensHeight
==
-
1
&&
consensHeight
<
client
.
consens
Start
Height
{
if
consensHeight
==
-
1
&&
consensHeight
<
client
.
consens
Done
Height
{
consensHeight
=
client
.
consens
Start
Height
consensHeight
=
client
.
consens
Done
Height
}
}
chainHeight
:=
atomic
.
LoadInt64
(
&
client
.
chainHeight
)
chainHeight
:=
atomic
.
LoadInt64
(
&
client
.
chainHeight
)
...
@@ -294,6 +296,11 @@ func (client *commitMsgClient) isSync() bool {
...
@@ -294,6 +296,11 @@ func (client *commitMsgClient) isSync() bool {
return
false
return
false
}
}
if
atomic
.
LoadInt32
(
&
client
.
selfConsensForked
)
!=
0
{
plog
.
Info
(
"para is not Sync"
,
"selfConsensForked"
,
atomic
.
LoadInt32
(
&
client
.
selfConsensForked
))
return
false
}
if
!
client
.
authAccountIn
{
if
!
client
.
authAccountIn
{
plog
.
Info
(
"para is not Sync"
,
"authAccountIn"
,
client
.
authAccountIn
)
plog
.
Info
(
"para is not Sync"
,
"authAccountIn"
,
client
.
authAccountIn
)
return
false
return
false
...
@@ -397,7 +404,8 @@ func (client *commitMsgClient) batchCalcTxGroup(notifications []*pt.ParacrossNod
...
@@ -397,7 +404,8 @@ func (client *commitMsgClient) batchCalcTxGroup(notifications []*pt.ParacrossNod
cfg
:=
client
.
paraClient
.
GetAPI
()
.
GetConfig
()
cfg
:=
client
.
paraClient
.
GetAPI
()
.
GetConfig
()
for
_
,
status
:=
range
notifications
{
for
_
,
status
:=
range
notifications
{
execName
:=
pt
.
ParaX
execName
:=
pt
.
ParaX
if
client
.
paraClient
.
isParaSelfConsensusForked
(
status
.
MainBlockHeight
)
{
stat
:=
client
.
paraClient
.
getSelfConsEnableStatus
(
status
.
Height
)
if
stat
.
Enable
{
execName
=
paracross
.
GetExecName
(
cfg
)
execName
=
paracross
.
GetExecName
(
cfg
)
}
}
tx
,
err
:=
paracross
.
CreateRawCommitTx4MainChain
(
cfg
,
status
,
execName
,
feeRate
)
tx
,
err
:=
paracross
.
CreateRawCommitTx4MainChain
(
cfg
,
status
,
execName
,
feeRate
)
...
@@ -418,7 +426,8 @@ func (client *commitMsgClient) batchCalcTxGroup(notifications []*pt.ParacrossNod
...
@@ -418,7 +426,8 @@ func (client *commitMsgClient) batchCalcTxGroup(notifications []*pt.ParacrossNod
func
(
client
*
commitMsgClient
)
singleCalcTx
(
status
*
pt
.
ParacrossNodeStatus
,
feeRate
int64
)
(
*
types
.
Transaction
,
error
)
{
func
(
client
*
commitMsgClient
)
singleCalcTx
(
status
*
pt
.
ParacrossNodeStatus
,
feeRate
int64
)
(
*
types
.
Transaction
,
error
)
{
execName
:=
pt
.
ParaX
execName
:=
pt
.
ParaX
cfg
:=
client
.
paraClient
.
GetAPI
()
.
GetConfig
()
cfg
:=
client
.
paraClient
.
GetAPI
()
.
GetConfig
()
if
client
.
paraClient
.
isParaSelfConsensusForked
(
status
.
MainBlockHeight
)
{
stat
:=
client
.
paraClient
.
getSelfConsEnableStatus
(
status
.
Height
)
if
stat
.
Enable
{
execName
=
paracross
.
GetExecName
(
cfg
)
execName
=
paracross
.
GetExecName
(
cfg
)
}
}
tx
,
err
:=
paracross
.
CreateRawCommitTx4MainChain
(
cfg
,
status
,
execName
,
feeRate
)
tx
,
err
:=
paracross
.
CreateRawCommitTx4MainChain
(
cfg
,
status
,
execName
,
feeRate
)
...
@@ -591,6 +600,8 @@ func (client *commitMsgClient) getNodeStatus(start, end int64) ([]*pt.ParacrossN
...
@@ -591,6 +600,8 @@ func (client *commitMsgClient) getNodeStatus(start, end int64) ([]*pt.ParacrossN
return
nil
,
nil
return
nil
,
nil
}
}
client
.
setConsensStart
(
ret
)
//clear flag
//clear flag
for
_
,
v
:=
range
ret
{
for
_
,
v
:=
range
ret
{
v
.
NonCommitTxCounts
=
0
v
.
NonCommitTxCounts
=
0
...
@@ -600,6 +611,28 @@ func (client *commitMsgClient) getNodeStatus(start, end int64) ([]*pt.ParacrossN
...
@@ -600,6 +611,28 @@ func (client *commitMsgClient) getNodeStatus(start, end int64) ([]*pt.ParacrossN
}
}
// 主链共识可能从-1跃迁或者自共识可能分阶段开启场景,设置起始高度标志,主链只需要根据是否起始高度来允许跃迁
// 1. 主链ParaConsensStartHeight 在selfCons设置的Disable范围没问题,只有主链做共识,平行链收不到共识交易
// 2. 主链ParaConsensStartHeight 超过selfCons StartHeight也没问题, 自共识也从ParaConsensStartHeight 开始做自共识
func
(
client
*
commitMsgClient
)
setConsensStart
(
invs
[]
*
pt
.
ParacrossNodeStatus
)
{
for
_
,
v
:=
range
invs
{
//平行链自共识
v
.
IsStartHeight
=
client
.
selfConsensMap
[
v
.
Height
]
//主链共识起始高度,只允许从-1跃迁,否则可能存在未共识的asset withdraw交易
if
v
.
Height
==
client
.
paraClient
.
subCfg
.
ParaConsensStartHeight
{
v
.
IsStartHeight
=
true
}
}
}
func
(
client
*
commitMsgClient
)
setSelfConsensMap
(
invs
[]
*
paraSelfConsEnable
)
{
for
_
,
v
:=
range
invs
{
client
.
selfConsensMap
[
v
.
BlockHeight
]
=
v
.
Enable
}
}
func
(
client
*
commitMsgClient
)
getGenesisNodeStatus
()
(
*
pt
.
ParacrossNodeStatus
,
error
)
{
func
(
client
*
commitMsgClient
)
getGenesisNodeStatus
()
(
*
pt
.
ParacrossNodeStatus
,
error
)
{
var
status
pt
.
ParacrossNodeStatus
var
status
pt
.
ParacrossNodeStatus
req
:=
&
types
.
ReqBlocks
{
Start
:
0
,
End
:
0
}
req
:=
&
types
.
ReqBlocks
{
Start
:
0
,
End
:
0
}
...
@@ -656,17 +689,8 @@ out:
...
@@ -656,17 +689,8 @@ out:
isSync
=
true
isSync
=
true
}
}
status
,
err
:=
client
.
getMainConsensusStatus
()
if
client
.
paraClient
.
authAccount
!=
""
{
if
err
!=
nil
{
client
.
GetProperFeeRate
()
continue
}
//如果主链的共识高度产生了回滚,本地链也需要重新检查共识高度
if
status
.
Height
<
atomic
.
LoadInt64
(
&
client
.
consensHeight
)
{
atomic
.
StoreInt64
(
&
client
.
consensHeight
,
status
.
Height
)
client
.
resetNotify
()
}
else
{
atomic
.
StoreInt64
(
&
client
.
consensHeight
,
status
.
Height
)
}
}
selfHeight
:=
int64
(
-
2
)
selfHeight
:=
int64
(
-
2
)
...
@@ -675,12 +699,26 @@ out:
...
@@ -675,12 +699,26 @@ out:
selfHeight
=
selfStatus
.
Height
selfHeight
=
selfStatus
.
Height
}
}
if
client
.
paraClient
.
authAccount
!=
""
{
mainStatus
,
err
:=
client
.
getMainConsensusStatus
()
client
.
GetProperFeeRate
()
if
err
!=
nil
{
continue
}
//如果主链的共识高度小于自共识高度,需要等待自共识回滚
if
mainStatus
.
Height
<
selfHeight
{
atomic
.
StoreInt32
(
&
client
.
selfConsensForked
,
1
)
}
else
{
atomic
.
StoreInt32
(
&
client
.
selfConsensForked
,
0
)
}
}
plog
.
Info
(
"para consensusHeight"
,
"mainHeight"
,
status
.
Height
,
"selfHeight"
,
selfHeight
)
preHeight
:=
atomic
.
LoadInt64
(
&
client
.
consensHeight
)
atomic
.
StoreInt64
(
&
client
.
consensHeight
,
mainStatus
.
Height
)
//如果主链的共识高度产生了回滚,本地链也需要重新检查共识高度,不然可能会一直等待共识追赶上来
if
mainStatus
.
Height
<
preHeight
{
client
.
resetNotify
()
}
plog
.
Info
(
"para consensusHeight"
,
"mainHeight"
,
mainStatus
.
Height
,
"selfHeight"
,
selfHeight
)
}
}
}
}
...
@@ -708,7 +746,8 @@ func (client *commitMsgClient) getSelfConsensusStatus() (*pt.ParacrossStatus, er
...
@@ -708,7 +746,8 @@ func (client *commitMsgClient) getSelfConsensusStatus() (*pt.ParacrossStatus, er
return
nil
,
err
return
nil
,
err
}
}
cfg
:=
client
.
paraClient
.
GetAPI
()
.
GetConfig
()
cfg
:=
client
.
paraClient
.
GetAPI
()
.
GetConfig
()
if
client
.
paraClient
.
isParaSelfConsensusForked
(
block
.
MainHeight
)
{
selfCons
:=
client
.
paraClient
.
getSelfConsEnableStatus
(
block
.
Height
)
if
selfCons
.
Enable
{
//从本地查询共识高度
//从本地查询共识高度
ret
,
err
:=
client
.
paraClient
.
GetAPI
()
.
QueryChain
(
&
types
.
ChainExecutor
{
ret
,
err
:=
client
.
paraClient
.
GetAPI
()
.
QueryChain
(
&
types
.
ChainExecutor
{
Driver
:
"paracross"
,
Driver
:
"paracross"
,
...
@@ -719,29 +758,15 @@ func (client *commitMsgClient) getSelfConsensusStatus() (*pt.ParacrossStatus, er
...
@@ -719,29 +758,15 @@ func (client *commitMsgClient) getSelfConsensusStatus() (*pt.ParacrossStatus, er
plog
.
Error
(
"getSelfConsensusStatus "
,
"err"
,
err
.
Error
())
plog
.
Error
(
"getSelfConsensusStatus "
,
"err"
,
err
.
Error
())
return
nil
,
err
return
nil
,
err
}
}
resp
,
ok
:=
ret
.
(
*
pt
.
ParacrossStatus
)
status
,
ok
:=
ret
.
(
*
pt
.
ParacrossStatus
)
if
!
ok
{
if
!
ok
{
plog
.
Error
(
"getSelfConsensusStatus ParacrossStatus nok"
)
plog
.
Error
(
"getSelfConsensusStatus ParacrossStatus nok"
)
return
nil
,
err
return
nil
,
err
}
}
//开启自共识后也要等到自共识真正切换之后再使用,如果本地区块已经过了自共识高度,但自共识的高度还没达成,就会导致共识机制出错
//开启自共识后也要等到自共识真正切换之后再使用,如果本地区块已经过了自共识高度,但自共识的高度还没达成,就会导致共识机制出错
if
resp
.
Height
>
-
1
{
//本地共识高度一定要高于阶段共识高度的起始高度,为了适配平行链共识高度不连续场景,一定要设置新自共识起始高度高于当前主链共识高度,否则不生效
var
statusMainHeight
int64
if
status
.
Height
>=
selfCons
.
BlockHeight
{
if
pt
.
IsParaForkHeight
(
cfg
,
resp
.
MainHeight
,
pt
.
ForkLoopCheckCommitTxDone
)
{
return
status
,
nil
statusMainHeight
=
resp
.
MainHeight
}
else
{
block
,
err
:=
client
.
paraClient
.
GetBlockByHeight
(
resp
.
Height
)
if
err
!=
nil
{
plog
.
Error
(
"getSelfConsensusStatus GetBlocks"
,
"err"
,
err
.
Error
())
return
nil
,
err
}
statusMainHeight
=
block
.
MainHeight
}
//本地共识高度对应主链高度一定要高于自共识高度,为了适配平行链共识高度不连续场景
if
client
.
paraClient
.
isParaSelfConsensusForked
(
statusMainHeight
)
{
return
resp
,
nil
}
}
}
}
}
return
nil
,
types
.
ErrNotFound
return
nil
,
types
.
ErrNotFound
...
...
plugin/consensus/para/parasync.go
View file @
a9674899
...
@@ -369,9 +369,11 @@ func (client *blockSyncClient) addMinerTx(preStateHash []byte, block *types.Bloc
...
@@ -369,9 +369,11 @@ func (client *blockSyncClient) addMinerTx(preStateHash []byte, block *types.Bloc
status
.
PreBlockHash
=
block
.
ParentHash
status
.
PreBlockHash
=
block
.
ParentHash
status
.
PreStateHash
=
preStateHash
status
.
PreStateHash
=
preStateHash
}
}
selfCons
:=
client
.
paraClient
.
getSelfConsEnableStatus
(
status
.
Height
)
tx
,
err
:=
pt
.
CreateRawMinerTx
(
cfg
,
&
pt
.
ParacrossMinerAction
{
tx
,
err
:=
pt
.
CreateRawMinerTx
(
cfg
,
&
pt
.
ParacrossMinerAction
{
Status
:
status
,
Status
:
status
,
IsSelfConsensus
:
client
.
paraClient
.
isParaSelfConsensusForked
(
status
.
MainBlockHeight
)
,
IsSelfConsensus
:
selfCons
.
Enable
,
})
})
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
...
...
plugin/dapp/paracross/executor/action.go
View file @
a9674899
...
@@ -456,7 +456,7 @@ func (a *action) Commit(commit *pt.ParacrossCommitAction) (*types.Receipt, error
...
@@ -456,7 +456,7 @@ func (a *action) Commit(commit *pt.ParacrossCommitAction) (*types.Receipt, error
if
commit
.
Status
.
Height
>
titleStatus
.
Height
+
1
{
if
commit
.
Status
.
Height
>
titleStatus
.
Height
+
1
{
saveTitleHeight
(
a
.
db
,
calcTitleHeightKey
(
commit
.
Status
.
Title
,
commit
.
Status
.
Height
),
stat
)
saveTitleHeight
(
a
.
db
,
calcTitleHeightKey
(
commit
.
Status
.
Title
,
commit
.
Status
.
Height
),
stat
)
//平行链由主链共识无缝切换,即接收第一个收到的高度,可以不从0开始
//平行链由主链共识无缝切换,即接收第一个收到的高度,可以不从0开始
allowJump
,
err
:=
a
.
isAllowConsensJump
(
sta
t
,
titleStatus
)
allowJump
,
err
:=
a
.
isAllowConsensJump
(
commi
t
,
titleStatus
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
...
@@ -707,29 +707,12 @@ func (a *action) isAllowMainConsensJump(commit *pt.ParacrossHeightStatus, titleS
...
@@ -707,29 +707,12 @@ func (a *action) isAllowMainConsensJump(commit *pt.ParacrossHeightStatus, titleS
return
false
,
nil
return
false
,
nil
}
}
//平行链自共识无缝切换条件:1,平行链没有共识过,2:commit高度是大于自共识分叉高度且上一次共识的主链高度小于自共识分叉高度,保证只运行一次,
//平行链自共识无缝切换条件:commit height为自共识分段起始高度
// 这样在主链没有共识空洞前提下,平行链允许有条件的共识跳跃
func
(
a
*
action
)
isAllowParaConsensJump
(
commit
*
pt
.
ParacrossCommitAction
,
titleStatus
*
pt
.
ParacrossStatus
)
(
bool
,
error
)
{
func
(
a
*
action
)
isAllowParaConsensJump
(
commit
*
pt
.
ParacrossHeightStatus
,
titleStatus
*
pt
.
ParacrossStatus
)
(
bool
,
error
)
{
return
commit
.
Status
.
IsStartHeight
,
nil
if
titleStatus
.
Height
==
-
1
{
return
true
,
nil
}
cfg
:=
a
.
api
.
GetConfig
()
selfConsensForkHeight
:=
pt
.
GetDappForkHeight
(
cfg
,
pt
.
ParaSelfConsensForkHeight
)
lastStatusMainHeight
:=
int64
(
-
1
)
if
titleStatus
.
Height
>
-
1
{
s
,
err
:=
getTitleHeight
(
a
.
db
,
calcTitleHeightKey
(
commit
.
Title
,
titleStatus
.
Height
))
if
err
!=
nil
{
clog
.
Error
(
"paracross.Commit isAllowConsensJump getTitleHeight failed"
,
"err"
,
err
.
Error
())
return
false
,
err
}
lastStatusMainHeight
=
s
.
MainHeight
}
return
commit
.
MainHeight
>
selfConsensForkHeight
&&
lastStatusMainHeight
<
selfConsensForkHeight
,
nil
}
}
func
(
a
*
action
)
isAllowConsensJump
(
commit
*
pt
.
Paracross
HeightStatus
,
titleStatus
*
pt
.
ParacrossStatus
)
(
bool
,
error
)
{
func
(
a
*
action
)
isAllowConsensJump
(
commit
*
pt
.
Paracross
CommitAction
,
titleStatus
*
pt
.
ParacrossStatus
)
(
bool
,
error
)
{
cfg
:=
a
.
api
.
GetConfig
()
cfg
:=
a
.
api
.
GetConfig
()
if
cfg
.
IsPara
()
{
if
cfg
.
IsPara
()
{
return
a
.
isAllowParaConsensJump
(
commit
,
titleStatus
)
return
a
.
isAllowParaConsensJump
(
commit
,
titleStatus
)
...
...
plugin/dapp/paracross/proto/paracross.proto
View file @
a9674899
...
@@ -188,6 +188,7 @@ message ParacrossNodeStatus {
...
@@ -188,6 +188,7 @@ message ParacrossNodeStatus {
bytes
crossTxResult
=
12
;
bytes
crossTxResult
=
12
;
repeated
bytes
crossTxHashs
=
13
;
repeated
bytes
crossTxHashs
=
13
;
uint32
nonCommitTxCounts
=
14
;
uint32
nonCommitTxCounts
=
14
;
bool
isStartHeight
=
15
;
}
}
message
ParacrossCommitAction
{
message
ParacrossCommitAction
{
...
...
plugin/dapp/paracross/types/type.go
View file @
a9674899
...
@@ -26,6 +26,8 @@ var (
...
@@ -26,6 +26,8 @@ var (
ForkLoopCheckCommitTxDone
=
"ForkLoopCheckCommitTxDone"
ForkLoopCheckCommitTxDone
=
"ForkLoopCheckCommitTxDone"
// MainLoopCheckCommitTxDoneForkHeight 平行链的配置项,对应主链的ForkLoopCheckCommitTxDone高度
// MainLoopCheckCommitTxDoneForkHeight 平行链的配置项,对应主链的ForkLoopCheckCommitTxDone高度
MainLoopCheckCommitTxDoneForkHeight
=
"MainLoopCheckCommitTxDoneForkHeight"
MainLoopCheckCommitTxDoneForkHeight
=
"MainLoopCheckCommitTxDoneForkHeight"
// ForkConsensSupportJump 支持主链共识从-1开始跳跃一次
ForkConsensSupportJump
=
"ForkConsensSupportJump"
)
)
func
init
()
{
func
init
()
{
...
@@ -41,6 +43,7 @@ func InitFork(cfg *types.Chain33Config) {
...
@@ -41,6 +43,7 @@ func InitFork(cfg *types.Chain33Config) {
cfg
.
RegisterDappFork
(
ParaX
,
"ForkParacrossWithdrawFromParachain"
,
1298600
)
cfg
.
RegisterDappFork
(
ParaX
,
"ForkParacrossWithdrawFromParachain"
,
1298600
)
cfg
.
RegisterDappFork
(
ParaX
,
ForkCommitTx
,
1850000
)
cfg
.
RegisterDappFork
(
ParaX
,
ForkCommitTx
,
1850000
)
cfg
.
RegisterDappFork
(
ParaX
,
ForkLoopCheckCommitTxDone
,
3230000
)
cfg
.
RegisterDappFork
(
ParaX
,
ForkLoopCheckCommitTxDone
,
3230000
)
cfg
.
RegisterDappFork
(
ParaX
,
ForkConsensSupportJump
,
types
.
MaxHeight
)
}
}
func
InitExecutor
(
cfg
*
types
.
Chain33Config
)
{
func
InitExecutor
(
cfg
*
types
.
Chain33Config
)
{
...
...
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