Commit 748ba0cb authored by vipwzw's avatar vipwzw

auto ci

parent 29629ee7
...@@ -162,21 +162,21 @@ func makeRecordReceipt(addr string, commit *pt.ParacrossCommitAction) *types.Rec ...@@ -162,21 +162,21 @@ func makeRecordReceipt(addr string, commit *pt.ParacrossCommitAction) *types.Rec
} }
func makeDoneReceipt(execMainHeight int64, commit *pt.ParacrossNodeStatus, func makeDoneReceipt(execMainHeight int64, commit *pt.ParacrossNodeStatus,
most, commitCount, totalCount int32) *types.Receipt { most, commitCount, totalCount int32) *types.Receipt {
log := &pt.ReceiptParacrossDone{ log := &pt.ReceiptParacrossDone{
TotalNodes: totalCount, TotalNodes: totalCount,
TotalCommit: commitCount, TotalCommit: commitCount,
MostSameCommit: most, MostSameCommit: most,
Title: commit.Title, Title: commit.Title,
Height: commit.Height, Height: commit.Height,
StateHash: commit.StateHash, StateHash: commit.StateHash,
BlockHash: commit.BlockHash, BlockHash: commit.BlockHash,
TxCounts: commit.TxCounts, TxCounts: commit.TxCounts,
TxResult: commit.TxResult, TxResult: commit.TxResult,
TxHashs: commit.TxHashs, TxHashs: commit.TxHashs,
CrossTxHashs: commit.CrossTxHashs, CrossTxHashs: commit.CrossTxHashs,
CrossTxResult: commit.CrossTxResult, CrossTxResult: commit.CrossTxResult,
MainBlockHeight: commit.MainBlockHeight, MainBlockHeight: commit.MainBlockHeight,
MainBlockHash: commit.MainBlockHash, MainBlockHash: commit.MainBlockHash,
} }
...@@ -226,16 +226,15 @@ func getMostCommit(stat *pt.ParacrossHeightStatus) (int, string) { ...@@ -226,16 +226,15 @@ func getMostCommit(stat *pt.ParacrossHeightStatus) (int, string) {
} }
//需要在ForkLoopCheckCommitTxDone后使用 //需要在ForkLoopCheckCommitTxDone后使用
func getMostResults(mostHash []byte, stat *pt.ParacrossHeightStatus) ([]byte,[]byte,[]byte,[]byte) { func getMostResults(mostHash []byte, stat *pt.ParacrossHeightStatus) ([]byte, []byte, []byte, []byte) {
for i,hash := range stat.Details.BlockHash{ for i, hash := range stat.Details.BlockHash {
if bytes.Equal(mostHash,hash){ if bytes.Equal(mostHash, hash) {
return stat.Details.TxResult[i],stat.Details.TxHashs[i],stat.Details.CrossTxResult[i],stat.Details.CrossTxHashs[i] return stat.Details.TxResult[i], stat.Details.TxHashs[i], stat.Details.CrossTxResult[i], stat.Details.CrossTxHashs[i]
} }
} }
return nil,nil,nil,nil return nil, nil, nil, nil
} }
func hasCommited(addrs []string, addr string) (bool, int) { func hasCommited(addrs []string, addr string) (bool, int) {
for i, a := range addrs { for i, a := range addrs {
if a == addr { if a == addr {
...@@ -403,14 +402,13 @@ func (a *action) Commit(commit *pt.ParacrossCommitAction) (*types.Receipt, error ...@@ -403,14 +402,13 @@ func (a *action) Commit(commit *pt.ParacrossCommitAction) (*types.Receipt, error
stat.MainHeight = commit.Status.MainBlockHeight stat.MainHeight = commit.Status.MainBlockHeight
stat.MainHash = commit.Status.MainBlockHash stat.MainHash = commit.Status.MainBlockHash
} }
if a.exec.GetMainHeight() >= getDappForkHeight(pt.ForkLoopCheckCommitTxDone){ if a.exec.GetMainHeight() >= getDappForkHeight(pt.ForkLoopCheckCommitTxDone) {
stat.Details.TxResult = append(stat.Details.TxResult, commit.Status.TxResult) stat.Details.TxResult = append(stat.Details.TxResult, commit.Status.TxResult)
stat.Details.TxHashs = append(stat.Details.TxHashs, commit.Status.TxHashs[0]) stat.Details.TxHashs = append(stat.Details.TxHashs, commit.Status.TxHashs[0])
stat.Details.CrossTxResult = append(stat.Details.CrossTxResult, commit.Status.CrossTxResult) stat.Details.CrossTxResult = append(stat.Details.CrossTxResult, commit.Status.CrossTxResult)
stat.Details.CrossTxHashs = append(stat.Details.CrossTxHashs, commit.Status.CrossTxHashs[0]) stat.Details.CrossTxHashs = append(stat.Details.CrossTxHashs, commit.Status.CrossTxHashs[0])
} }
receipt = makeCommitReceipt(a.fromaddr, commit, nil, stat) receipt = makeCommitReceipt(a.fromaddr, commit, nil, stat)
} else { } else {
var copyStat pt.ParacrossHeightStatus var copyStat pt.ParacrossHeightStatus
...@@ -423,7 +421,7 @@ func (a *action) Commit(commit *pt.ParacrossCommitAction) (*types.Receipt, error ...@@ -423,7 +421,7 @@ func (a *action) Commit(commit *pt.ParacrossCommitAction) (*types.Receipt, error
found, index := hasCommited(stat.Details.Addrs, a.fromaddr) found, index := hasCommited(stat.Details.Addrs, a.fromaddr)
if found { if found {
stat.Details.BlockHash[index] = commit.Status.BlockHash stat.Details.BlockHash[index] = commit.Status.BlockHash
if a.exec.GetMainHeight() >= getDappForkHeight(pt.ForkLoopCheckCommitTxDone){ if a.exec.GetMainHeight() >= getDappForkHeight(pt.ForkLoopCheckCommitTxDone) {
stat.Details.TxResult[index] = commit.Status.TxResult stat.Details.TxResult[index] = commit.Status.TxResult
stat.Details.TxHashs[index] = commit.Status.TxHashs[0] stat.Details.TxHashs[index] = commit.Status.TxHashs[0]
stat.Details.CrossTxResult[index] = commit.Status.CrossTxResult stat.Details.CrossTxResult[index] = commit.Status.CrossTxResult
...@@ -432,7 +430,7 @@ func (a *action) Commit(commit *pt.ParacrossCommitAction) (*types.Receipt, error ...@@ -432,7 +430,7 @@ func (a *action) Commit(commit *pt.ParacrossCommitAction) (*types.Receipt, error
} else { } else {
stat.Details.Addrs = append(stat.Details.Addrs, a.fromaddr) stat.Details.Addrs = append(stat.Details.Addrs, a.fromaddr)
stat.Details.BlockHash = append(stat.Details.BlockHash, commit.Status.BlockHash) stat.Details.BlockHash = append(stat.Details.BlockHash, commit.Status.BlockHash)
if a.exec.GetMainHeight() >= getDappForkHeight(pt.ForkLoopCheckCommitTxDone){ if a.exec.GetMainHeight() >= getDappForkHeight(pt.ForkLoopCheckCommitTxDone) {
stat.Details.TxResult = append(stat.Details.TxResult, commit.Status.TxResult) stat.Details.TxResult = append(stat.Details.TxResult, commit.Status.TxResult)
stat.Details.TxHashs = append(stat.Details.TxHashs, commit.Status.TxHashs[0]) stat.Details.TxHashs = append(stat.Details.TxHashs, commit.Status.TxHashs[0])
stat.Details.CrossTxResult = append(stat.Details.CrossTxResult, commit.Status.CrossTxResult) stat.Details.CrossTxResult = append(stat.Details.CrossTxResult, commit.Status.CrossTxResult)
...@@ -444,13 +442,13 @@ func (a *action) Commit(commit *pt.ParacrossCommitAction) (*types.Receipt, error ...@@ -444,13 +442,13 @@ func (a *action) Commit(commit *pt.ParacrossCommitAction) (*types.Receipt, error
} }
//平行链fork pt.ForkCommitTx=0,主链在ForkCommitTx后支持nodegroup,这里平行链dappFork一定为true //平行链fork pt.ForkCommitTx=0,主链在ForkCommitTx后支持nodegroup,这里平行链dappFork一定为true
if types.IsDappFork(commit.Status.MainBlockHeight, pt.ParaX, pt.ForkCommitTx) { if types.IsDappFork(commit.Status.MainBlockHeight, pt.ParaX, pt.ForkCommitTx) {
updateCommitAddrs(stat, nodes,a.exec.GetMainHeight()) updateCommitAddrs(stat, nodes, a.exec.GetMainHeight())
} }
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开始
paraSwitch, err := isParaSelfConsensSwitch(a.db,stat, titleStatus) paraSwitch, err := isParaSelfConsensSwitch(a.db, stat, titleStatus)
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -458,11 +456,11 @@ func (a *action) Commit(commit *pt.ParacrossCommitAction) (*types.Receipt, error ...@@ -458,11 +456,11 @@ func (a *action) Commit(commit *pt.ParacrossCommitAction) (*types.Receipt, error
return receipt, nil return receipt, nil
} }
} }
return a.commitTxDone(commit.Status,stat,titleStatus,nodes,receipt) return a.commitTxDone(commit.Status, stat, titleStatus, nodes, receipt)
} }
func (a *action)commitTxDone(nodeStatus *pt.ParacrossNodeStatus, stat *pt.ParacrossHeightStatus,titleStatus *pt.ParacrossStatus, func (a *action) commitTxDone(nodeStatus *pt.ParacrossNodeStatus, stat *pt.ParacrossHeightStatus, titleStatus *pt.ParacrossStatus,
nodes map[string]struct{},receipt *types.Receipt) (*types.Receipt, error){ nodes map[string]struct{}, receipt *types.Receipt) (*types.Receipt, error) {
clog.Info("paracross.Commit commit", "stat.title", stat.Title, "stat.height", stat.Height, "notes", len(nodes)) clog.Info("paracross.Commit commit", "stat.title", stat.Title, "stat.height", stat.Height, "notes", len(nodes))
for i, v := range stat.Details.Addrs { for i, v := range stat.Details.Addrs {
clog.Info("paracross.Commit commit detail", "addr", v, "hash", hex.EncodeToString(stat.Details.BlockHash[i])) clog.Info("paracross.Commit commit detail", "addr", v, "hash", hex.EncodeToString(stat.Details.BlockHash[i]))
...@@ -482,12 +480,11 @@ func (a *action)commitTxDone(nodeStatus *pt.ParacrossNodeStatus, stat *pt.Paracr ...@@ -482,12 +480,11 @@ func (a *action)commitTxDone(nodeStatus *pt.ParacrossNodeStatus, stat *pt.Paracr
receiptDone := makeDoneReceipt(a.exec.GetMainHeight(), nodeStatus, int32(most), int32(commitCount), int32(len(nodes))) receiptDone := makeDoneReceipt(a.exec.GetMainHeight(), nodeStatus, int32(most), int32(commitCount), int32(len(nodes)))
receipt = mergeReceipt(receipt, receiptDone) receipt = mergeReceipt(receipt, receiptDone)
return a.commitTxDoneStep2(nodeStatus,stat,titleStatus,receipt) return a.commitTxDoneStep2(nodeStatus, stat, titleStatus, receipt)
} }
func (a *action) commitTxDoneStep2(nodeStatus *pt.ParacrossNodeStatus, stat *pt.ParacrossHeightStatus, titleStatus *pt.ParacrossStatus,
func (a *action)commitTxDoneStep2(nodeStatus *pt.ParacrossNodeStatus, stat *pt.ParacrossHeightStatus,titleStatus *pt.ParacrossStatus, receipt *types.Receipt) (*types.Receipt, error) {
receipt *types.Receipt) (*types.Receipt, error){
titleStatus.Title = nodeStatus.Title titleStatus.Title = nodeStatus.Title
titleStatus.Height = nodeStatus.Height titleStatus.Height = nodeStatus.Height
...@@ -503,7 +500,7 @@ func (a *action)commitTxDoneStep2(nodeStatus *pt.ParacrossNodeStatus, stat *pt.P ...@@ -503,7 +500,7 @@ func (a *action)commitTxDoneStep2(nodeStatus *pt.ParacrossNodeStatus, stat *pt.P
//parallel chain not need to process cross commit tx here //parallel chain not need to process cross commit tx here
if types.IsPara() { if types.IsPara() {
//平行连进行奖励分配 //平行连进行奖励分配
rewardReceipt, err := a.reward(nodeStatus,stat) rewardReceipt, err := a.reward(nodeStatus, stat)
//错误会导致和主链处理的共识结果不一致 //错误会导致和主链处理的共识结果不一致
if err != nil { if err != nil {
clog.Error("paracross mining reward err", "height", nodeStatus.Height, clog.Error("paracross mining reward err", "height", nodeStatus.Height,
...@@ -515,16 +512,15 @@ func (a *action)commitTxDoneStep2(nodeStatus *pt.ParacrossNodeStatus, stat *pt.P ...@@ -515,16 +512,15 @@ func (a *action)commitTxDoneStep2(nodeStatus *pt.ParacrossNodeStatus, stat *pt.P
} }
//主链,处理跨链交易 //主链,处理跨链交易
r,err := a.procCrossTxs(nodeStatus) r, err := a.procCrossTxs(nodeStatus)
if err != nil{ if err != nil {
return nil,err return nil, err
} }
receipt = mergeReceipt(receipt,r) receipt = mergeReceipt(receipt, r)
return receipt, nil return receipt, nil
} }
func (a *action) procCrossTxs(status *pt.ParacrossNodeStatus) (*types.Receipt, error) {
func (a *action) procCrossTxs(status *pt.ParacrossNodeStatus)(*types.Receipt, error){
haveCrossTxs := len(status.CrossTxHashs) > 0 haveCrossTxs := len(status.CrossTxHashs) > 0
if status.Height > 0 && types.IsDappFork(status.MainBlockHeight, pt.ParaX, pt.ForkCommitTx) && len(status.CrossTxHashs[0]) == 0 { if status.Height > 0 && types.IsDappFork(status.MainBlockHeight, pt.ParaX, pt.ForkCommitTx) && len(status.CrossTxHashs[0]) == 0 {
haveCrossTxs = false haveCrossTxs = false
...@@ -536,14 +532,13 @@ func (a *action) procCrossTxs(status *pt.ParacrossNodeStatus)(*types.Receipt, er ...@@ -536,14 +532,13 @@ func (a *action) procCrossTxs(status *pt.ParacrossNodeStatus)(*types.Receipt, er
if err != nil { if err != nil {
return nil, err return nil, err
} }
return crossTxReceipt,nil return crossTxReceipt, nil
} }
return nil, nil return nil, nil
} }
//由于可能对当前块的共识交易进行处理,需要全部数据保存到statedb,通过tx获取数据无法处理当前块的场景 //由于可能对当前块的共识交易进行处理,需要全部数据保存到statedb,通过tx获取数据无法处理当前块的场景
func (a *action) loopCommitTxDone(title string)(*types.Receipt, error){ func (a *action) loopCommitTxDone(title string) (*types.Receipt, error) {
receipt := &types.Receipt{} receipt := &types.Receipt{}
nodes, _, err := getParacrossNodes(a.db, title) nodes, _, err := getParacrossNodes(a.db, title)
...@@ -556,14 +551,14 @@ func (a *action) loopCommitTxDone(title string)(*types.Receipt, error){ ...@@ -556,14 +551,14 @@ func (a *action) loopCommitTxDone(title string)(*types.Receipt, error){
return nil, errors.Wrapf(err, "getTitle:%s", title) return nil, errors.Wrapf(err, "getTitle:%s", title)
} }
//当前共识高度还未到分叉高度,则不处理 //当前共识高度还未到分叉高度,则不处理
if titleStatus.GetMainHeight() < getDappForkHeight(pt.ForkLoopCheckCommitTxDone){ if titleStatus.GetMainHeight() < getDappForkHeight(pt.ForkLoopCheckCommitTxDone) {
return nil,errors.Wrapf(pt.ErrForkHeightNotReach, return nil, errors.Wrapf(pt.ErrForkHeightNotReach,
"titleHeight:%d,forkHeight", titleStatus.MainHeight,getDappForkHeight(pt.ForkLoopCheckCommitTxDone)) "titleHeight:%d,forkHeight", titleStatus.MainHeight, getDappForkHeight(pt.ForkLoopCheckCommitTxDone))
} }
loopHeight := titleStatus.Height loopHeight := titleStatus.Height
for{ for {
loopHeight++ loopHeight++
stat, err := getTitleHeight(a.db, calcTitleHeightKey(title, loopHeight)) stat, err := getTitleHeight(a.db, calcTitleHeightKey(title, loopHeight))
...@@ -572,28 +567,27 @@ func (a *action) loopCommitTxDone(title string)(*types.Receipt, error){ ...@@ -572,28 +567,27 @@ func (a *action) loopCommitTxDone(title string)(*types.Receipt, error){
return receipt, err return receipt, err
} }
//防止无限循环 //防止无限循环
if stat.MainHeight > a.exec.GetMainHeight(){ if stat.MainHeight > a.exec.GetMainHeight() {
return receipt,nil return receipt, nil
} }
r,err := a.checkCommitTxDone(title,stat,nodes) r, err := a.checkCommitTxDone(title, stat, nodes)
if err != nil{ if err != nil {
clog.Error("paracross.Commit checkExecCommitTxDone", "para title", title, "height", stat.Height,"error", err, ) clog.Error("paracross.Commit checkExecCommitTxDone", "para title", title, "height", stat.Height, "error", err)
return receipt,nil return receipt, nil
} }
if r == nil{ if r == nil {
return receipt,nil return receipt, nil
} }
receipt = mergeReceipt(receipt,r) receipt = mergeReceipt(receipt, r)
} }
return receipt,nil return receipt, nil
} }
func (a *action) checkCommitTxDone(title string, stat *pt.ParacrossHeightStatus, nodes map[string]struct{}) (*types.Receipt, error) {
func (a *action) checkCommitTxDone(title string,stat *pt.ParacrossHeightStatus,nodes map[string]struct{})(*types.Receipt, error){
receipt := &types.Receipt{} receipt := &types.Receipt{}
status, err := getTitle(a.db, calcTitleKey(title)) status, err := getTitle(a.db, calcTitleKey(title))
if err != nil { if err != nil {
...@@ -605,20 +599,19 @@ func (a *action) checkCommitTxDone(title string,stat *pt.ParacrossHeightStatus,n ...@@ -605,20 +599,19 @@ func (a *action) checkCommitTxDone(title string,stat *pt.ParacrossHeightStatus,n
return nil, nil return nil, nil
} }
updateCommitAddrs(stat, nodes,a.exec.GetMainHeight()) updateCommitAddrs(stat, nodes, a.exec.GetMainHeight())
most, _ := getMostCommit(stat) most, _ := getMostCommit(stat)
if !isCommitDone(nodes, most) { if !isCommitDone(nodes, most) {
return nil, nil return nil, nil
} }
return a.commitTxDoneByStat(stat,status,nodes,receipt) return a.commitTxDoneByStat(stat, status, nodes, receipt)
} }
//只根据stat的信息在commitDone之后重构一个commitStatus做后续处理 //只根据stat的信息在commitDone之后重构一个commitStatus做后续处理
func (a *action) commitTxDoneByStat(stat *pt.ParacrossHeightStatus,titleStatus *pt.ParacrossStatus, func (a *action) commitTxDoneByStat(stat *pt.ParacrossHeightStatus, titleStatus *pt.ParacrossStatus,
nodes map[string]struct{},receipt *types.Receipt) (*types.Receipt, error){ nodes map[string]struct{}, receipt *types.Receipt) (*types.Receipt, error) {
clog.Info("paracross.Commit commit", "stat.title", stat.Title, "stat.height", stat.Height, "notes", len(nodes)) clog.Info("paracross.Commit commit", "stat.title", stat.Title, "stat.height", stat.Height, "notes", len(nodes))
for i, v := range stat.Details.Addrs { for i, v := range stat.Details.Addrs {
...@@ -635,25 +628,25 @@ func (a *action) commitTxDoneByStat(stat *pt.ParacrossHeightStatus,titleStatus * ...@@ -635,25 +628,25 @@ func (a *action) commitTxDoneByStat(stat *pt.ParacrossHeightStatus,titleStatus *
stat.Status = pt.ParacrossStatusCommitDone stat.Status = pt.ParacrossStatusCommitDone
saveTitleHeight(a.db, calcTitleHeightKey(stat.Title, stat.Height), stat) saveTitleHeight(a.db, calcTitleHeightKey(stat.Title, stat.Height), stat)
txRst,txHash,crossTxRst,crossTxHash := getMostResults([]byte(mostHash),stat) txRst, txHash, crossTxRst, crossTxHash := getMostResults([]byte(mostHash), stat)
finalStatus := &pt.ParacrossNodeStatus{ finalStatus := &pt.ParacrossNodeStatus{
MainBlockHash: stat.MainHash, MainBlockHash: stat.MainHash,
MainBlockHeight: stat.MainHeight, MainBlockHeight: stat.MainHeight,
Title: stat.Title, Title: stat.Title,
Height: stat.Height, Height: stat.Height,
BlockHash: []byte(mostHash), BlockHash: []byte(mostHash),
TxResult: txRst, TxResult: txRst,
TxHashs: [][]byte{txHash}, TxHashs: [][]byte{txHash},
CrossTxResult: crossTxRst, CrossTxResult: crossTxRst,
CrossTxHashs: [][]byte{crossTxHash}, CrossTxHashs: [][]byte{crossTxHash},
} }
//stat.ConsensBlockHash = []byte(mostHash) //stat.ConsensBlockHash = []byte(mostHash)
//add commit done receipt //add commit done receipt
receiptDone := makeDoneReceipt(a.exec.GetMainHeight(), finalStatus,int32(most), int32(commitCount), int32(len(nodes))) receiptDone := makeDoneReceipt(a.exec.GetMainHeight(), finalStatus, int32(most), int32(commitCount), int32(len(nodes)))
receipt = mergeReceipt(receipt, receiptDone) receipt = mergeReceipt(receipt, receiptDone)
clog.Info("paracross.Commit commit ----pass", "most", most, "mostHash", hex.EncodeToString([]byte(mostHash))) clog.Info("paracross.Commit commit ----pass", "most", most, "mostHash", hex.EncodeToString([]byte(mostHash)))
return a.commitTxDoneStep2(finalStatus,stat,titleStatus,receipt) return a.commitTxDoneStep2(finalStatus, stat, titleStatus, receipt)
} }
//平行链自共识无缝切换条件:1,平行链没有共识过,2:commit高度是大于自共识分叉高度且上一次共识的主链高度小于自共识分叉高度,保证只运行一次, //平行链自共识无缝切换条件:1,平行链没有共识过,2:commit高度是大于自共识分叉高度且上一次共识的主链高度小于自共识分叉高度,保证只运行一次,
...@@ -700,16 +693,15 @@ func (a *action) execCrossTx(tx *types.TransactionDetail, crossTxHash []byte) (* ...@@ -700,16 +693,15 @@ func (a *action) execCrossTx(tx *types.TransactionDetail, crossTxHash []byte) (*
return nil, errors.Cause(err) return nil, errors.Cause(err)
} }
clog.Info("paracross.Commit WithdrawCoins", "txHash", hex.EncodeToString(crossTxHash)) clog.Info("paracross.Commit WithdrawCoins", "txHash", hex.EncodeToString(crossTxHash))
return receiptWithdraw, nil return receiptWithdraw, nil
} }
return nil, nil return nil, nil
} }
func getCrossTxHashs(api client.QueueProtocolAPI, status *pt.ParacrossNodeStatus) ([][]byte, []byte, error) { func getCrossTxHashs(api client.QueueProtocolAPI, status *pt.ParacrossNodeStatus) ([][]byte, []byte, error) {
if !types.IsDappFork(status.MainBlockHeight, pt.ParaX, pt.ForkCommitTx){ if !types.IsDappFork(status.MainBlockHeight, pt.ParaX, pt.ForkCommitTx) {
return status.CrossTxHashs, status.CrossTxResult, nil return status.CrossTxHashs, status.CrossTxResult, nil
} }
...@@ -719,7 +711,6 @@ func getCrossTxHashs(api client.QueueProtocolAPI, status *pt.ParacrossNodeStatus ...@@ -719,7 +711,6 @@ func getCrossTxHashs(api client.QueueProtocolAPI, status *pt.ParacrossNodeStatus
return nil, nil, types.ErrCheckTxHash return nil, nil, types.ErrCheckTxHash
} }
blockDetail, err := GetBlock(api, status.MainBlockHash) blockDetail, err := GetBlock(api, status.MainBlockHash)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
...@@ -760,7 +751,6 @@ func getCrossTxHashs(api client.QueueProtocolAPI, status *pt.ParacrossNodeStatus ...@@ -760,7 +751,6 @@ func getCrossTxHashs(api client.QueueProtocolAPI, status *pt.ParacrossNodeStatus
} }
func (a *action) execCrossTxs(status *pt.ParacrossNodeStatus) (*types.Receipt, error) { func (a *action) execCrossTxs(status *pt.ParacrossNodeStatus) (*types.Receipt, error) {
var receipt types.Receipt var receipt types.Receipt
...@@ -774,23 +764,23 @@ func (a *action) execCrossTxs(status *pt.ParacrossNodeStatus) (*types.Receipt, e ...@@ -774,23 +764,23 @@ func (a *action) execCrossTxs(status *pt.ParacrossNodeStatus) (*types.Receipt, e
} }
for i := 0; i < len(crossTxHashs); i++ { for i := 0; i < len(crossTxHashs); i++ {
clog.Info("paracross.Commit commitDone", "do cross number", i, "hash",hex.EncodeToString(crossTxHashs[i]), clog.Info("paracross.Commit commitDone", "do cross number", i, "hash", hex.EncodeToString(crossTxHashs[i]),
"res", util.BitMapBit(crossTxResult, uint32(i))) "res", util.BitMapBit(crossTxResult, uint32(i)))
if util.BitMapBit(crossTxResult, uint32(i)) { if util.BitMapBit(crossTxResult, uint32(i)) {
tx, err := GetTx(a.api, crossTxHashs[i]) tx, err := GetTx(a.api, crossTxHashs[i])
if err != nil { if err != nil {
clog.Crit("paracross.Commit Load Tx failed", "para title", title, "para height", status.Height, clog.Crit("paracross.Commit Load Tx failed", "para title", title, "para height", status.Height,
"para tx index", i, "error", err, "txHash", hex.EncodeToString(crossTxHashs[i])) "para tx index", i, "error", err, "txHash", hex.EncodeToString(crossTxHashs[i]))
return nil, err return nil, err
} }
if tx == nil { if tx == nil {
clog.Error("paracross.Commit Load Tx failed", "para title", title, "para height", status.Height, clog.Error("paracross.Commit Load Tx failed", "para title", title, "para height", status.Height,
"para tx index", i, "error", err, "txHash", hex.EncodeToString(crossTxHashs[i])) "para tx index", i, "error", err, "txHash", hex.EncodeToString(crossTxHashs[i]))
return nil, types.ErrHashNotExist return nil, types.ErrHashNotExist
} }
receiptCross, err := a.execCrossTx(tx, crossTxHashs[i]) receiptCross, err := a.execCrossTx(tx, crossTxHashs[i])
if err != nil { if err != nil {
clog.Error("paracross.Commit execCrossTx", "para title", title,"para height", status.Height, clog.Error("paracross.Commit execCrossTx", "para title", title, "para height", status.Height,
"para tx index", i, "error", err) "para tx index", i, "error", err)
return nil, errors.Cause(err) return nil, errors.Cause(err)
} }
......
...@@ -77,7 +77,7 @@ func (e *Paracross) ExecDelLocal_NodeConfig(payload *pt.ParaNodeAddrConfig, tx * ...@@ -77,7 +77,7 @@ func (e *Paracross) ExecDelLocal_NodeConfig(payload *pt.ParaNodeAddrConfig, tx *
} }
key := calcLocalNodeTitleDone(g.Title, g.TargetAddr) key := calcLocalNodeTitleDone(g.Title, g.TargetAddr)
set.KV = append(set.KV, &types.KeyValue{Key: key, Value: nil}) set.KV = append(set.KV, &types.KeyValue{Key: key, Value: nil})
}else if log.Ty == pt.TyLogParacrossCommitDone { } else if log.Ty == pt.TyLogParacrossCommitDone {
var g pt.ReceiptParacrossDone var g pt.ReceiptParacrossDone
types.Decode(log.Log, &g) types.Decode(log.Log, &g)
g.Height = g.Height - 1 g.Height = g.Height - 1
......
...@@ -81,7 +81,7 @@ func (e *Paracross) ExecLocal_NodeConfig(payload *pt.ParaNodeAddrConfig, tx *typ ...@@ -81,7 +81,7 @@ func (e *Paracross) ExecLocal_NodeConfig(payload *pt.ParaNodeAddrConfig, tx *typ
} }
key := calcLocalNodeTitleDone(g.Title, g.TargetAddr) key := calcLocalNodeTitleDone(g.Title, g.TargetAddr)
set.KV = append(set.KV, &types.KeyValue{Key: key, Value: types.Encode(&g)}) set.KV = append(set.KV, &types.KeyValue{Key: key, Value: types.Encode(&g)})
}else if log.Ty == pt.TyLogParacrossCommitDone { } else if log.Ty == pt.TyLogParacrossCommitDone {
var g pt.ReceiptParacrossDone var g pt.ReceiptParacrossDone
types.Decode(log.Log, &g) types.Decode(log.Log, &g)
......
...@@ -69,7 +69,6 @@ func (c *Paracross) checkTxGroup(tx *types.Transaction, index int) ([]*types.Tra ...@@ -69,7 +69,6 @@ func (c *Paracross) checkTxGroup(tx *types.Transaction, index int) ([]*types.Tra
func (c *Paracross) saveLocalParaTxs(tx *types.Transaction, isDel bool) (*types.LocalDBSet, error) { func (c *Paracross) saveLocalParaTxs(tx *types.Transaction, isDel bool) (*types.LocalDBSet, error) {
var payload pt.ParacrossAction var payload pt.ParacrossAction
err := types.Decode(tx.Payload, &payload) err := types.Decode(tx.Payload, &payload)
if err != nil { if err != nil {
...@@ -85,22 +84,22 @@ func (c *Paracross) saveLocalParaTxs(tx *types.Transaction, isDel bool) (*types. ...@@ -85,22 +84,22 @@ func (c *Paracross) saveLocalParaTxs(tx *types.Transaction, isDel bool) (*types.
return nil, err return nil, err
} }
return c.udpateLocalParaTxs(commit.Status.Title, commit.Status.Height,crossTxHashs,crossTxResult,isDel) return c.udpateLocalParaTxs(commit.Status.Title, commit.Status.Height, crossTxHashs, crossTxResult, isDel)
} }
//无法获取到commit tx信息,从commitDone 结构里面构建 //无法获取到commit tx信息,从commitDone 结构里面构建
func (c *Paracross) saveLocalParaTxsFork(commitDone *pt.ReceiptParacrossDone,isDel bool) (*types.LocalDBSet, error) { func (c *Paracross) saveLocalParaTxsFork(commitDone *pt.ReceiptParacrossDone, isDel bool) (*types.LocalDBSet, error) {
status := &pt.ParacrossNodeStatus{ status := &pt.ParacrossNodeStatus{
MainBlockHash: commitDone.MainBlockHash, MainBlockHash: commitDone.MainBlockHash,
MainBlockHeight: commitDone.MainBlockHeight, MainBlockHeight: commitDone.MainBlockHeight,
Title: commitDone.Title, Title: commitDone.Title,
Height: commitDone.Height, Height: commitDone.Height,
BlockHash:commitDone.BlockHash, BlockHash: commitDone.BlockHash,
TxResult: commitDone.TxResult, TxResult: commitDone.TxResult,
TxHashs: commitDone.TxHashs, TxHashs: commitDone.TxHashs,
CrossTxResult: commitDone.CrossTxResult, CrossTxResult: commitDone.CrossTxResult,
CrossTxHashs: commitDone.CrossTxHashs, CrossTxHashs: commitDone.CrossTxHashs,
} }
crossTxHashs, crossTxResult, err := getCrossTxHashs(c.GetAPI(), status) crossTxHashs, crossTxResult, err := getCrossTxHashs(c.GetAPI(), status)
...@@ -108,11 +107,11 @@ func (c *Paracross) saveLocalParaTxsFork(commitDone *pt.ReceiptParacrossDone,isD ...@@ -108,11 +107,11 @@ func (c *Paracross) saveLocalParaTxsFork(commitDone *pt.ReceiptParacrossDone,isD
return nil, err return nil, err
} }
return c.udpateLocalParaTxs(commitDone.Title, commitDone.Height,crossTxHashs,crossTxResult,isDel) return c.udpateLocalParaTxs(commitDone.Title, commitDone.Height, crossTxHashs, crossTxResult, isDel)
} }
func (c *Paracross) udpateLocalParaTxs(paraTitle string, paraHeight int64,crossTxHashs [][]byte, crossTxResult []byte, isDel bool) (*types.LocalDBSet, error) { func (c *Paracross) udpateLocalParaTxs(paraTitle string, paraHeight int64, crossTxHashs [][]byte, crossTxResult []byte, isDel bool) (*types.LocalDBSet, error) {
var set types.LocalDBSet var set types.LocalDBSet
if len(crossTxHashs) == 0 { if len(crossTxHashs) == 0 {
...@@ -139,7 +138,7 @@ func (c *Paracross) udpateLocalParaTxs(paraTitle string, paraHeight int64,crossT ...@@ -139,7 +138,7 @@ func (c *Paracross) udpateLocalParaTxs(paraTitle string, paraHeight int64,crossT
return nil, err return nil, err
} }
if payload.Ty == pt.ParacrossActionAssetTransfer { if payload.Ty == pt.ParacrossActionAssetTransfer {
kv, err := c.updateLocalAssetTransfer(paraHeight,paraTx.Tx ,success, isDel) kv, err := c.updateLocalAssetTransfer(paraHeight, paraTx.Tx, success, isDel)
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -267,7 +266,7 @@ func (c *Paracross) initLocalAssetWithdraw(paraHeight int64, tx *types.Transacti ...@@ -267,7 +266,7 @@ func (c *Paracross) initLocalAssetWithdraw(paraHeight int64, tx *types.Transacti
return &types.KeyValue{Key: key, Value: types.Encode(&asset)}, nil return &types.KeyValue{Key: key, Value: types.Encode(&asset)}, nil
} }
func (c *Paracross) updateLocalAssetTransfer(paraHeight int64, tx *types.Transaction, success, isDel bool) (*types.KeyValue, error) { func (c *Paracross) updateLocalAssetTransfer(paraHeight int64, tx *types.Transaction, success, isDel bool) (*types.KeyValue, error) {
clog.Debug("para execLocal", "tx hash", hex.EncodeToString(tx.Hash())) clog.Debug("para execLocal", "tx hash", hex.EncodeToString(tx.Hash()))
key := calcLocalAssetKey(tx.Hash()) key := calcLocalAssetKey(tx.Hash())
......
...@@ -612,11 +612,11 @@ func (a *action) nodeVote(config *pt.ParaNodeAddrConfig) (*types.Receipt, error) ...@@ -612,11 +612,11 @@ func (a *action) nodeVote(config *pt.ParaNodeAddrConfig) (*types.Receipt, error)
} }
receipt = mergeReceipt(receipt, r) receipt = mergeReceipt(receipt, r)
if a.exec.GetMainHeight() > getDappForkHeight(pt.ForkLoopCheckCommitTxDone){ if a.exec.GetMainHeight() > getDappForkHeight(pt.ForkLoopCheckCommitTxDone) {
//node quit后,如果committx满足2/3目标,自动触发commitDone //node quit后,如果committx满足2/3目标,自动触发commitDone
r,err = a.loopCommitTxDone(config.Title) r, err = a.loopCommitTxDone(config.Title)
if err != nil{ if err != nil {
clog.Error("unpdateNodeGroup.loopCommitTxDone", "title", title,"err",err.Error()) clog.Error("unpdateNodeGroup.loopCommitTxDone", "title", title, "err", err.Error())
} }
receipt = mergeReceipt(receipt, r) receipt = mergeReceipt(receipt, r)
} }
...@@ -673,9 +673,9 @@ func unpdateNodeGroup(db dbm.KV, title, addr string, add bool) (*types.Receipt, ...@@ -673,9 +673,9 @@ func unpdateNodeGroup(db dbm.KV, title, addr string, add bool) (*types.Receipt,
} }
} }
} }
err = db.Set(key,types.Encode(&item)) err = db.Set(key, types.Encode(&item))
if err != nil { if err != nil {
return nil, errors.Wrapf(err,"unpdateNodeGroup set dbkey=%s",key) return nil, errors.Wrapf(err, "unpdateNodeGroup set dbkey=%s", key)
} }
return makeParaNodeGroupReceipt(title, &copyItem, &item), nil return makeParaNodeGroupReceipt(title, &copyItem, &item), nil
} }
......
...@@ -28,6 +28,10 @@ const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package ...@@ -28,6 +28,10 @@ const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
type ParacrossStatusDetails struct { type ParacrossStatusDetails struct {
Addrs []string `protobuf:"bytes,1,rep,name=addrs,proto3" json:"addrs,omitempty"` Addrs []string `protobuf:"bytes,1,rep,name=addrs,proto3" json:"addrs,omitempty"`
BlockHash [][]byte `protobuf:"bytes,2,rep,name=blockHash,proto3" json:"blockHash,omitempty"` BlockHash [][]byte `protobuf:"bytes,2,rep,name=blockHash,proto3" json:"blockHash,omitempty"`
TxResult [][]byte `protobuf:"bytes,3,rep,name=txResult,proto3" json:"txResult,omitempty"`
TxHashs [][]byte `protobuf:"bytes,4,rep,name=txHashs,proto3" json:"txHashs,omitempty"`
CrossTxResult [][]byte `protobuf:"bytes,5,rep,name=crossTxResult,proto3" json:"crossTxResult,omitempty"`
CrossTxHashs [][]byte `protobuf:"bytes,6,rep,name=crossTxHashs,proto3" json:"crossTxHashs,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
...@@ -72,6 +76,34 @@ func (m *ParacrossStatusDetails) GetBlockHash() [][]byte { ...@@ -72,6 +76,34 @@ func (m *ParacrossStatusDetails) GetBlockHash() [][]byte {
return nil return nil
} }
func (m *ParacrossStatusDetails) GetTxResult() [][]byte {
if m != nil {
return m.TxResult
}
return nil
}
func (m *ParacrossStatusDetails) GetTxHashs() [][]byte {
if m != nil {
return m.TxHashs
}
return nil
}
func (m *ParacrossStatusDetails) GetCrossTxResult() [][]byte {
if m != nil {
return m.CrossTxResult
}
return nil
}
func (m *ParacrossStatusDetails) GetCrossTxHashs() [][]byte {
if m != nil {
return m.CrossTxHashs
}
return nil
}
type ParacrossHeightStatus struct { type ParacrossHeightStatus struct {
// ing, done // ing, done
Status int32 `protobuf:"varint,1,opt,name=status,proto3" json:"status,omitempty"` Status int32 `protobuf:"varint,1,opt,name=status,proto3" json:"status,omitempty"`
...@@ -243,6 +275,8 @@ type ParacrossStatus struct { ...@@ -243,6 +275,8 @@ type ParacrossStatus struct {
Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"`
Height int64 `protobuf:"varint,2,opt,name=height,proto3" json:"height,omitempty"` Height int64 `protobuf:"varint,2,opt,name=height,proto3" json:"height,omitempty"`
BlockHash []byte `protobuf:"bytes,3,opt,name=blockHash,proto3" json:"blockHash,omitempty"` BlockHash []byte `protobuf:"bytes,3,opt,name=blockHash,proto3" json:"blockHash,omitempty"`
MainHeight int64 `protobuf:"varint,4,opt,name=mainHeight,proto3" json:"mainHeight,omitempty"`
MainHash []byte `protobuf:"bytes,5,opt,name=mainHash,proto3" json:"mainHash,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
...@@ -294,6 +328,20 @@ func (m *ParacrossStatus) GetBlockHash() []byte { ...@@ -294,6 +328,20 @@ func (m *ParacrossStatus) GetBlockHash() []byte {
return nil return nil
} }
func (m *ParacrossStatus) GetMainHeight() int64 {
if m != nil {
return m.MainHeight
}
return 0
}
func (m *ParacrossStatus) GetMainHash() []byte {
if m != nil {
return m.MainHash
}
return nil
}
type ParacrossConsensusStatus struct { type ParacrossConsensusStatus struct {
Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"`
ChainHeight int64 `protobuf:"varint,2,opt,name=chainHeight,proto3" json:"chainHeight,omitempty"` ChainHeight int64 `protobuf:"varint,2,opt,name=chainHeight,proto3" json:"chainHeight,omitempty"`
...@@ -2054,6 +2102,12 @@ type ReceiptParacrossDone struct { ...@@ -2054,6 +2102,12 @@ type ReceiptParacrossDone struct {
StateHash []byte `protobuf:"bytes,6,opt,name=stateHash,proto3" json:"stateHash,omitempty"` StateHash []byte `protobuf:"bytes,6,opt,name=stateHash,proto3" json:"stateHash,omitempty"`
TxCounts uint32 `protobuf:"varint,7,opt,name=txCounts,proto3" json:"txCounts,omitempty"` TxCounts uint32 `protobuf:"varint,7,opt,name=txCounts,proto3" json:"txCounts,omitempty"`
TxResult []byte `protobuf:"bytes,8,opt,name=txResult,proto3" json:"txResult,omitempty"` TxResult []byte `protobuf:"bytes,8,opt,name=txResult,proto3" json:"txResult,omitempty"`
BlockHash []byte `protobuf:"bytes,9,opt,name=blockHash,proto3" json:"blockHash,omitempty"`
TxHashs [][]byte `protobuf:"bytes,10,rep,name=txHashs,proto3" json:"txHashs,omitempty"`
CrossTxResult []byte `protobuf:"bytes,11,opt,name=crossTxResult,proto3" json:"crossTxResult,omitempty"`
CrossTxHashs [][]byte `protobuf:"bytes,12,rep,name=crossTxHashs,proto3" json:"crossTxHashs,omitempty"`
MainBlockHash []byte `protobuf:"bytes,13,opt,name=mainBlockHash,proto3" json:"mainBlockHash,omitempty"`
MainBlockHeight int64 `protobuf:"varint,14,opt,name=mainBlockHeight,proto3" json:"mainBlockHeight,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
...@@ -2140,6 +2194,48 @@ func (m *ReceiptParacrossDone) GetTxResult() []byte { ...@@ -2140,6 +2194,48 @@ func (m *ReceiptParacrossDone) GetTxResult() []byte {
return nil return nil
} }
func (m *ReceiptParacrossDone) GetBlockHash() []byte {
if m != nil {
return m.BlockHash
}
return nil
}
func (m *ReceiptParacrossDone) GetTxHashs() [][]byte {
if m != nil {
return m.TxHashs
}
return nil
}
func (m *ReceiptParacrossDone) GetCrossTxResult() []byte {
if m != nil {
return m.CrossTxResult
}
return nil
}
func (m *ReceiptParacrossDone) GetCrossTxHashs() [][]byte {
if m != nil {
return m.CrossTxHashs
}
return nil
}
func (m *ReceiptParacrossDone) GetMainBlockHash() []byte {
if m != nil {
return m.MainBlockHash
}
return nil
}
func (m *ReceiptParacrossDone) GetMainBlockHeight() int64 {
if m != nil {
return m.MainBlockHeight
}
return 0
}
type ReceiptParacrossRecord struct { type ReceiptParacrossRecord struct {
Addr string `protobuf:"bytes,1,opt,name=addr,proto3" json:"addr,omitempty"` Addr string `protobuf:"bytes,1,opt,name=addr,proto3" json:"addr,omitempty"`
Status *ParacrossNodeStatus `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` Status *ParacrossNodeStatus `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"`
...@@ -2620,121 +2716,125 @@ func init() { ...@@ -2620,121 +2716,125 @@ func init() {
func init() { proto.RegisterFile("paracross.proto", fileDescriptor_6a397e38c9ea6747) } func init() { proto.RegisterFile("paracross.proto", fileDescriptor_6a397e38c9ea6747) }
var fileDescriptor_6a397e38c9ea6747 = []byte{ var fileDescriptor_6a397e38c9ea6747 = []byte{
// 1819 bytes of a gzipped FileDescriptorProto // 1878 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x59, 0xcd, 0x6f, 0x24, 0x47, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x59, 0x4f, 0x73, 0x23, 0x47,
0x15, 0x9f, 0x9e, 0x4f, 0xcf, 0xb3, 0x3d, 0x6b, 0x57, 0xd6, 0xde, 0x61, 0x48, 0x36, 0xa3, 0x56, 0x15, 0xd7, 0xe8, 0x9f, 0xad, 0x67, 0x5b, 0x6b, 0x77, 0xd6, 0x5e, 0x21, 0x92, 0x8d, 0x6a, 0x2a,
0x40, 0x06, 0x56, 0x0e, 0xf1, 0x42, 0x10, 0x8a, 0x10, 0x6c, 0x9c, 0xc4, 0x63, 0x25, 0x1b, 0x45, 0x50, 0x06, 0xb6, 0x1c, 0xe2, 0x85, 0x50, 0x54, 0x8a, 0x82, 0x8d, 0x93, 0x58, 0xae, 0xb0, 0xa9,
0x6d, 0x07, 0x4e, 0x48, 0xf4, 0xce, 0x94, 0x3d, 0x2d, 0x66, 0xba, 0x7b, 0xbb, 0x6a, 0x12, 0x9b, 0xd4, 0xd8, 0x81, 0x2b, 0xb3, 0x52, 0xdb, 0x9e, 0x42, 0x9a, 0x99, 0x9d, 0x6e, 0x25, 0x36, 0x37,
0x1b, 0x02, 0xee, 0x9c, 0x90, 0x38, 0xc3, 0x99, 0x3f, 0x81, 0x3f, 0x80, 0xdc, 0xf8, 0x0f, 0xb8, 0x8a, 0xe2, 0xce, 0x89, 0xaa, 0x9c, 0xe1, 0xcc, 0x47, 0xe0, 0x03, 0x10, 0x4e, 0x1c, 0xb8, 0x73,
0x71, 0xe7, 0xc0, 0x15, 0xbd, 0x57, 0x55, 0xdd, 0x55, 0x35, 0x1f, 0x6b, 0x2d, 0x7b, 0xc9, 0xcd, 0xe3, 0xce, 0x81, 0x2b, 0xf5, 0x5e, 0x77, 0xcf, 0x74, 0xb7, 0x46, 0x5a, 0xb3, 0xec, 0x85, 0x9b,
0xef, 0xd5, 0xab, 0xf7, 0xf1, 0xab, 0xf7, 0xd5, 0x63, 0xb8, 0x97, 0xc7, 0x45, 0x3c, 0x2e, 0x32, 0xde, 0xeb, 0xd7, 0xaf, 0xdf, 0x7b, 0xfd, 0x7b, 0x7f, 0x7a, 0x04, 0xf7, 0xf2, 0xb8, 0x88, 0x27,
0x21, 0x8e, 0xf3, 0x22, 0x93, 0x19, 0x6b, 0xc9, 0xdb, 0x9c, 0x8b, 0xc1, 0xbe, 0x2c, 0xe2, 0x54, 0x45, 0x26, 0xc4, 0x51, 0x5e, 0x64, 0x32, 0x63, 0x1d, 0x79, 0x9b, 0x73, 0x31, 0xdc, 0x93, 0x45,
0xc4, 0x63, 0x99, 0x64, 0xa9, 0x3a, 0x19, 0xec, 0x8c, 0xb3, 0xf9, 0xbc, 0xa4, 0xf6, 0x9e, 0xcd, 0x9c, 0x8a, 0x78, 0x22, 0x93, 0x2c, 0x55, 0x2b, 0xc3, 0xed, 0x49, 0x36, 0x9f, 0x97, 0xd4, 0xee,
0xb2, 0xf1, 0xaf, 0xc7, 0xd3, 0x38, 0x31, 0x9c, 0x1e, 0xbf, 0xe1, 0xe3, 0x85, 0xcc, 0x0a, 0x45, 0xb3, 0x59, 0x36, 0xf9, 0xe5, 0xe4, 0x3a, 0x4e, 0x0c, 0xa7, 0xcf, 0x6f, 0xf8, 0x64, 0x21, 0xb3,
0x87, 0x9f, 0xc0, 0xe1, 0x67, 0x46, 0xf9, 0x85, 0x8c, 0xe5, 0x42, 0x7c, 0xc0, 0x65, 0x9c, 0xcc, 0x42, 0xd1, 0xe1, 0x5f, 0x03, 0x38, 0xf8, 0xd4, 0x68, 0x3f, 0x97, 0xb1, 0x5c, 0x88, 0x0f, 0xb8,
0x04, 0xbb, 0x0f, 0xad, 0x78, 0x32, 0x29, 0x44, 0x3f, 0x18, 0x36, 0x8e, 0xba, 0x91, 0x22, 0xd8, 0x8c, 0x93, 0x99, 0x60, 0xf7, 0xa1, 0x13, 0x4f, 0xa7, 0x85, 0x18, 0x04, 0xa3, 0xd6, 0x61, 0x2f,
0xeb, 0xd0, 0x25, 0x9d, 0xa3, 0x58, 0x4c, 0xfb, 0xf5, 0x61, 0xe3, 0x68, 0x27, 0xaa, 0x18, 0xe1, 0x52, 0x04, 0x7b, 0x1d, 0x7a, 0xa4, 0x74, 0x1c, 0x8b, 0xeb, 0x41, 0x73, 0xd4, 0x3a, 0xdc, 0x8e,
0x3f, 0x03, 0x38, 0x28, 0xd5, 0x8d, 0x78, 0x72, 0x3d, 0x95, 0x4a, 0x29, 0x3b, 0x84, 0xb6, 0xa0, 0x2a, 0x06, 0x1b, 0xc2, 0xa6, 0xbc, 0x89, 0xb8, 0x58, 0xcc, 0xe4, 0xa0, 0x45, 0x8b, 0x25, 0xcd,
0xbf, 0xfa, 0xc1, 0x30, 0x38, 0x6a, 0x45, 0x9a, 0x42, 0x2b, 0x32, 0x91, 0x33, 0xde, 0xaf, 0x0f, 0x06, 0xb0, 0x21, 0x6f, 0x50, 0x4a, 0x0c, 0xda, 0xb4, 0x64, 0x48, 0xf6, 0x16, 0xec, 0xd0, 0xf9,
0x03, 0xb4, 0x42, 0x04, 0x4a, 0x4f, 0xe9, 0x76, 0xbf, 0x31, 0x0c, 0x8e, 0x1a, 0x91, 0xa6, 0xd8, 0x17, 0x66, 0x6b, 0x87, 0xd6, 0x5d, 0x26, 0x0b, 0x61, 0x5b, 0x33, 0x94, 0x92, 0x2e, 0x09, 0x39,
0x8f, 0xa0, 0x33, 0x51, 0xee, 0xf5, 0x9b, 0xc3, 0xe0, 0x68, 0xfb, 0xe4, 0x8d, 0x63, 0x42, 0xe2, 0xbc, 0xf0, 0x6f, 0x01, 0xec, 0x97, 0xee, 0x8c, 0x79, 0x72, 0x75, 0x2d, 0x95, 0x53, 0xec, 0x00,
0x78, 0x75, 0x0c, 0x91, 0x91, 0x66, 0x0f, 0x01, 0xe6, 0x71, 0x92, 0x2a, 0x97, 0xfa, 0x2d, 0x52, 0xba, 0x82, 0x7e, 0x0d, 0x82, 0x51, 0x70, 0xd8, 0x89, 0x34, 0x85, 0x5e, 0xca, 0x44, 0xce, 0xf8,
0x6a, 0x71, 0xd8, 0x00, 0xb6, 0x88, 0xc2, 0xa8, 0xda, 0xc3, 0xe0, 0x68, 0x27, 0x2a, 0xe9, 0xf0, 0xa0, 0x39, 0x0a, 0xd0, 0x4b, 0x22, 0x50, 0xfa, 0x9a, 0x76, 0x0f, 0x5a, 0xa3, 0xe0, 0xb0, 0x15,
0xdf, 0x01, 0xf4, 0x57, 0x06, 0x15, 0x89, 0xfc, 0x15, 0xc5, 0xe5, 0xba, 0xd7, 0xdc, 0xe8, 0x5e, 0x69, 0x8a, 0xfd, 0x00, 0x36, 0xa6, 0x2a, 0x3c, 0x83, 0xf6, 0x28, 0x38, 0xdc, 0x3a, 0x7e, 0xe3,
0x8b, 0x14, 0x96, 0x34, 0x1b, 0xc2, 0x36, 0xbe, 0x79, 0x22, 0x9f, 0xd0, 0x6b, 0xb5, 0xe9, 0xb5, 0x88, 0xae, 0xe2, 0xa8, 0x3e, 0x86, 0x91, 0x91, 0x66, 0x0f, 0x01, 0xe6, 0x71, 0x92, 0x2a, 0x93,
0x6c, 0x16, 0x3b, 0x82, 0x7b, 0x8a, 0x7c, 0xbf, 0x7c, 0xb9, 0x0e, 0x49, 0xf9, 0xec, 0xf0, 0x97, 0x06, 0x1d, 0x52, 0x6a, 0x71, 0x30, 0x70, 0x44, 0x61, 0x54, 0xbb, 0xa3, 0x00, 0x03, 0x67, 0xe8,
0x70, 0xcf, 0x43, 0xb2, 0x0a, 0x24, 0x58, 0x1d, 0x48, 0xdd, 0x09, 0xc4, 0x49, 0x8f, 0x06, 0x01, 0xf0, 0x9f, 0x01, 0x0c, 0x6a, 0x9d, 0x8a, 0x44, 0xfe, 0x8a, 0xfc, 0x72, 0xcd, 0x6b, 0xaf, 0x35,
0x69, 0xa5, 0xc7, 0x5f, 0x6d, 0x24, 0x4f, 0xb3, 0x54, 0xf0, 0x54, 0x2c, 0x36, 0x1b, 0xc2, 0xe8, 0xaf, 0x43, 0x0a, 0x4b, 0x9a, 0x8d, 0x60, 0x0b, 0x41, 0x97, 0xc8, 0x27, 0x84, 0x96, 0x2e, 0xa1,
0xa6, 0x15, 0x34, 0xca, 0x9a, 0xcd, 0x62, 0x6f, 0xc1, 0xee, 0x58, 0xa9, 0x1a, 0xd9, 0xd0, 0xba, 0xc5, 0x66, 0xb1, 0x43, 0xb8, 0xa7, 0xc8, 0xf7, 0x4b, 0xe4, 0x6c, 0x90, 0x94, 0xcf, 0x0e, 0xbf,
0x4c, 0xf6, 0x5d, 0xd8, 0xd3, 0x8c, 0x0a, 0x84, 0x26, 0x19, 0x5a, 0xe2, 0x87, 0x7f, 0x0a, 0x80, 0x0c, 0xe0, 0x9e, 0x17, 0xca, 0xca, 0x93, 0xa0, 0xde, 0x93, 0xa6, 0xe3, 0x89, 0x83, 0xcf, 0x16,
0xa1, 0x9b, 0x9f, 0x66, 0x13, 0x8e, 0x08, 0x9e, 0x66, 0xe9, 0x55, 0x72, 0xbd, 0xc6, 0xc1, 0x1e, 0x45, 0xd2, 0xc2, 0xe7, 0x7f, 0xeb, 0xa7, 0x7d, 0x0d, 0x7f, 0xb4, 0xaf, 0xe1, 0x24, 0x4b, 0x05,
0xd4, 0xb3, 0x9c, 0xfc, 0xda, 0x8d, 0xea, 0x59, 0x8e, 0x74, 0x32, 0x21, 0x1f, 0xba, 0x51, 0x3d, 0x4f, 0xc5, 0x62, 0xbd, 0x91, 0x18, 0x9a, 0xeb, 0xea, 0x3c, 0x65, 0xa9, 0xcd, 0x22, 0xe8, 0x2b,
0x99, 0x30, 0x06, 0x4d, 0xac, 0x1c, 0x6d, 0x8c, 0xfe, 0x46, 0x4d, 0x5f, 0xc4, 0xb3, 0x05, 0xa7, 0x55, 0x63, 0xfb, 0x5e, 0x5c, 0x26, 0xfb, 0x36, 0xec, 0x6a, 0x46, 0x15, 0xc1, 0x36, 0x1d, 0xb4,
0xb7, 0xdc, 0x8d, 0x14, 0xa1, 0x1e, 0x32, 0x49, 0xc5, 0x47, 0x45, 0xf6, 0x1b, 0x9e, 0x52, 0x1a, 0xc4, 0x0f, 0x7f, 0x1f, 0x00, 0x43, 0x33, 0x3f, 0xc9, 0xa6, 0x1c, 0xc3, 0x7f, 0x92, 0xa5, 0x97,
0x62, 0xa8, 0x15, 0x2b, 0xfc, 0x59, 0xe5, 0xd7, 0xcf, 0x33, 0xc9, 0x55, 0x96, 0xaf, 0x29, 0x54, 0xc9, 0xd5, 0x0a, 0x03, 0xfb, 0xd0, 0xcc, 0x72, 0xb2, 0x6b, 0x27, 0x6a, 0x66, 0x39, 0xd2, 0xc9,
0xb4, 0x91, 0x49, 0x2e, 0xa8, 0x48, 0xbb, 0x91, 0x22, 0xc2, 0x3f, 0x06, 0x70, 0xdf, 0x0e, 0xed, 0x94, 0x6c, 0xe8, 0x45, 0xcd, 0x64, 0xca, 0x18, 0xb4, 0x31, 0xed, 0xf5, 0x61, 0xf4, 0x1b, 0x35,
0x7c, 0xa2, 0xd1, 0x37, 0x6e, 0x06, 0x96, 0x9b, 0x0f, 0x01, 0xf2, 0x22, 0xcb, 0x33, 0x11, 0xcf, 0x7d, 0x1e, 0xcf, 0x16, 0x9c, 0x02, 0xb4, 0x13, 0x29, 0x42, 0xa1, 0x20, 0x49, 0xc5, 0x47, 0x45,
0xce, 0x27, 0x3a, 0x91, 0x2d, 0x0e, 0x26, 0xc1, 0xf3, 0x45, 0x22, 0xcf, 0x4d, 0xb8, 0x9a, 0xb2, 0xf6, 0x2b, 0x9e, 0x12, 0x86, 0xd1, 0xd5, 0x8a, 0x15, 0xfe, 0xa4, 0xb2, 0xeb, 0x67, 0x99, 0xe4,
0x6a, 0xa2, 0xb9, 0xba, 0x26, 0x5a, 0x16, 0x80, 0xe1, 0x7f, 0x03, 0xd8, 0x33, 0x2e, 0x95, 0xee, 0x2a, 0x45, 0x56, 0x54, 0x19, 0x3c, 0x23, 0x93, 0x5c, 0x50, 0x85, 0xe9, 0x45, 0x8a, 0x08, 0x7f,
0x28, 0x14, 0x83, 0x12, 0xc5, 0x4a, 0x65, 0x7d, 0xb5, 0xca, 0x86, 0xfd, 0x26, 0x0f, 0x01, 0x64, 0x17, 0xc0, 0x7d, 0xdb, 0xb5, 0xb3, 0xa9, 0x8e, 0xbe, 0x31, 0x33, 0xb0, 0xcc, 0x7c, 0x08, 0x90,
0x5c, 0x5c, 0x73, 0xca, 0x7f, 0x8d, 0xbc, 0xc5, 0xf1, 0x91, 0x6e, 0x2d, 0x21, 0xcd, 0xde, 0x36, 0x17, 0x59, 0x9e, 0x89, 0x78, 0x76, 0x36, 0xd5, 0x59, 0x60, 0x71, 0x10, 0x40, 0xcf, 0x17, 0x89,
0xe8, 0xb5, 0xa9, 0xcd, 0x7c, 0xc3, 0x6a, 0x33, 0x2e, 0xfa, 0x1a, 0x58, 0xac, 0xd0, 0xab, 0x22, 0x3c, 0x33, 0xee, 0x6a, 0xca, 0x4a, 0xa8, 0x76, 0x7d, 0x42, 0x75, 0xac, 0x00, 0x86, 0xff, 0x0e,
0x9b, 0x93, 0xc1, 0x8e, 0xaa, 0x50, 0x43, 0x5b, 0xc5, 0xb2, 0x65, 0x17, 0x4b, 0xf8, 0xf7, 0x00, 0x60, 0xd7, 0x98, 0x54, 0x9a, 0xa3, 0xa2, 0x18, 0x94, 0x51, 0xac, 0x54, 0x36, 0xeb, 0x55, 0xb6,
0x0e, 0x22, 0x3e, 0xe6, 0x49, 0x2e, 0x8d, 0x62, 0x9d, 0x6a, 0xab, 0x5e, 0xe3, 0x1d, 0x68, 0x8f, 0xec, 0x3b, 0x79, 0x08, 0x20, 0xe3, 0xe2, 0x8a, 0x53, 0xf2, 0xe8, 0xc8, 0x5b, 0x1c, 0x3f, 0xd2,
0xe9, 0x94, 0x20, 0x58, 0xf6, 0xa9, 0xca, 0xd4, 0x48, 0x0b, 0xb2, 0xef, 0x41, 0x33, 0x2f, 0xf8, 0x9d, 0xa5, 0x48, 0xb3, 0xb7, 0x4d, 0xf4, 0xba, 0x54, 0xa3, 0xbe, 0x66, 0xd5, 0x28, 0x37, 0xfa,
0x17, 0x04, 0xce, 0xf6, 0xc9, 0x03, 0xef, 0x82, 0x01, 0x3b, 0x22, 0x21, 0xf6, 0x0e, 0x74, 0xc6, 0x3a, 0xb0, 0x08, 0xfb, 0xcb, 0x22, 0x9b, 0xd3, 0x81, 0x1b, 0x2a, 0xbd, 0x0d, 0x6d, 0x25, 0xda,
0x8b, 0xa2, 0xe0, 0xa9, 0xd4, 0xbd, 0x75, 0xad, 0xbc, 0x91, 0x0b, 0xff, 0x12, 0xc0, 0x1b, 0x5e, 0xa6, 0x9d, 0x68, 0xe1, 0x9f, 0x03, 0xd8, 0x8f, 0xf8, 0x84, 0x27, 0xb9, 0x34, 0x8a, 0x35, 0xd4,
0x00, 0xe8, 0x05, 0x8a, 0x7d, 0x9e, 0x4f, 0x62, 0xc9, 0x1d, 0x58, 0x02, 0x0f, 0x96, 0xb7, 0xb5, 0xea, 0x6e, 0xe3, 0x1d, 0xe8, 0x4e, 0x68, 0x95, 0x42, 0xb0, 0x6c, 0x53, 0x85, 0xd4, 0x48, 0x0b,
0x77, 0x2a, 0x9c, 0x6f, 0xae, 0x08, 0xc7, 0xf3, 0xf0, 0x87, 0x95, 0x87, 0x8d, 0x17, 0xdf, 0x29, 0xb2, 0xef, 0x40, 0x3b, 0x2f, 0xf8, 0xe7, 0x14, 0x9c, 0xad, 0xe3, 0x07, 0xde, 0x06, 0x13, 0xec,
0xbd, 0xfc, 0x4f, 0x00, 0x0f, 0x3c, 0x2f, 0xe9, 0xfd, 0xb2, 0x94, 0x2f, 0xe5, 0xd9, 0xea, 0xb6, 0x88, 0x84, 0xd8, 0x3b, 0xb0, 0x31, 0x59, 0x14, 0x05, 0x4f, 0xa5, 0x2e, 0xcc, 0x2b, 0xe5, 0x8d,
0xed, 0xe6, 0x53, 0x63, 0x29, 0x9f, 0xf0, 0x3c, 0x93, 0xf1, 0x0c, 0x55, 0x9b, 0xa4, 0xb7, 0x38, 0x5c, 0xf8, 0x87, 0x00, 0xde, 0xf0, 0x1c, 0x40, 0x2b, 0x50, 0xec, 0xb3, 0x7c, 0x1a, 0x4b, 0xee,
0xd8, 0x15, 0x89, 0x42, 0xb3, 0x94, 0x6d, 0xad, 0xa8, 0x62, 0x50, 0x73, 0xcf, 0x84, 0xa4, 0xc3, 0x84, 0x25, 0xf0, 0xc2, 0xf2, 0xb6, 0xb6, 0x4e, 0xb9, 0xf3, 0xf5, 0x1a, 0x77, 0x3c, 0x0b, 0xbf,
0x36, 0x1d, 0x96, 0x34, 0xeb, 0x43, 0x07, 0xf3, 0x2b, 0x12, 0x52, 0x67, 0x95, 0x21, 0xd1, 0xe6, 0x5f, 0x59, 0xd8, 0x7a, 0xf1, 0x9e, 0xd2, 0xca, 0x7f, 0x05, 0xf0, 0xc0, 0xb3, 0x92, 0xee, 0x2f,
0x24, 0x4b, 0xb9, 0x0a, 0x96, 0x12, 0xab, 0x15, 0x59, 0x9c, 0xf0, 0x77, 0x01, 0xbc, 0x66, 0xc2, 0x4b, 0xf9, 0x12, 0xce, 0xea, 0x6b, 0xbe, 0x8b, 0xa7, 0xd6, 0x12, 0x9e, 0x70, 0x3d, 0x93, 0xf1,
0x3d, 0x2b, 0xb2, 0x45, 0xfe, 0x7f, 0x75, 0xb1, 0xb2, 0xc7, 0xa8, 0x62, 0xd2, 0x3d, 0xe6, 0x85, 0x0c, 0x55, 0x1b, 0xd0, 0x5b, 0x1c, 0xac, 0xa8, 0x44, 0xe1, 0xb1, 0x84, 0xb6, 0x4e, 0x54, 0x31,
0x75, 0x14, 0x7e, 0xe5, 0x7b, 0xf1, 0x4a, 0xea, 0x7b, 0x08, 0xdb, 0x15, 0xfa, 0xc6, 0x27, 0x9b, 0xa8, 0x62, 0x66, 0x42, 0xd2, 0x62, 0x97, 0x16, 0x4b, 0x1a, 0x3b, 0x3e, 0xe2, 0x2b, 0x12, 0x52,
0x75, 0x87, 0x0a, 0xb7, 0x33, 0xb3, 0xbd, 0xb6, 0x60, 0x3b, 0x4e, 0xc1, 0xfe, 0x23, 0x80, 0x81, 0xa3, 0xca, 0x90, 0x78, 0xe6, 0x34, 0x4b, 0xb9, 0x72, 0x96, 0x80, 0xd5, 0x89, 0x2c, 0x4e, 0xf8,
0x97, 0x49, 0x36, 0xb4, 0xab, 0xaa, 0xf6, 0xc4, 0xab, 0xda, 0x81, 0x97, 0xb2, 0xd6, 0xfd, 0xb2, 0x9b, 0x00, 0x5e, 0x33, 0xee, 0x9e, 0x16, 0xd9, 0x22, 0xff, 0x9f, 0xaa, 0x58, 0x59, 0x63, 0x54,
0x6c, 0x8f, 0x9d, 0xb2, 0x5d, 0x79, 0xc3, 0xa9, 0x8b, 0x1f, 0xf8, 0x95, 0xbb, 0xe9, 0x4a, 0x59, 0x32, 0xe9, 0x1a, 0xf3, 0xc2, 0x3c, 0x0a, 0xbf, 0xf2, 0xad, 0x78, 0x25, 0xf9, 0x3d, 0x82, 0xad,
0x16, 0x53, 0xb8, 0x1f, 0xf1, 0xe7, 0xe5, 0x38, 0xa6, 0x0a, 0x4f, 0xaf, 0xb2, 0xf5, 0x09, 0x92, 0x2a, 0xfa, 0xc6, 0x26, 0x9b, 0x75, 0x87, 0x0c, 0xb7, 0x91, 0xd9, 0x5d, 0x99, 0xb0, 0x1b, 0x4e,
0x98, 0x19, 0x60, 0x8f, 0xb5, 0x86, 0x15, 0xeb, 0x9a, 0xbe, 0x1f, 0x9e, 0xc2, 0x61, 0xc4, 0x45, 0xc2, 0xfe, 0x25, 0x80, 0xa1, 0x87, 0x24, 0x3b, 0xb4, 0x75, 0x59, 0x7b, 0xec, 0x65, 0xed, 0xd0,
0xee, 0x98, 0x52, 0xcf, 0xf4, 0x1d, 0x68, 0x24, 0x13, 0x35, 0xb8, 0x36, 0xf4, 0x1b, 0x94, 0x09, 0x83, 0xac, 0xb5, 0xbf, 0x4c, 0xdb, 0x23, 0x27, 0x6d, 0x6b, 0x77, 0x38, 0x79, 0xf1, 0x3d, 0x3f,
0xcf, 0xb0, 0x88, 0x3d, 0x25, 0x14, 0x97, 0x60, 0x8f, 0x6c, 0x2d, 0x9b, 0x62, 0x27, 0x45, 0x7f, 0x73, 0xd7, 0x6d, 0x29, 0xd3, 0xe2, 0x1a, 0xee, 0x47, 0xfc, 0x79, 0xd9, 0x8e, 0x29, 0xc3, 0xd3,
0x08, 0x60, 0x1f, 0x0f, 0x69, 0xde, 0x9f, 0x3c, 0x8d, 0x93, 0xf4, 0x69, 0x9c, 0x5b, 0x4f, 0x1e, 0xcb, 0x6c, 0x35, 0x40, 0x12, 0xd3, 0x03, 0xec, 0xb6, 0xd6, 0xb2, 0x7c, 0x5d, 0x51, 0xf7, 0xc3,
0xac, 0x5f, 0x68, 0x54, 0xf8, 0x15, 0xc3, 0xdb, 0xdb, 0x1a, 0x1b, 0xf7, 0xb6, 0xa6, 0xbb, 0xb7, 0x13, 0x38, 0x88, 0xb8, 0xc8, 0x9d, 0xa3, 0xd4, 0x35, 0x7d, 0x0b, 0x5a, 0xc9, 0x54, 0x35, 0xae,
0x85, 0x1f, 0xa8, 0x61, 0x5e, 0xb9, 0x41, 0xe8, 0x1f, 0x43, 0x2b, 0x91, 0x7c, 0x6e, 0xa2, 0xe9, 0x35, 0xf5, 0x06, 0x65, 0xc2, 0x53, 0x4c, 0x62, 0x4f, 0x09, 0xf9, 0x25, 0xd8, 0x23, 0x5b, 0xcb,
0x5b, 0xd1, 0x38, 0x0e, 0x47, 0x4a, 0x2c, 0xfc, 0x57, 0x43, 0x15, 0x58, 0x89, 0x89, 0x2e, 0xb0, 0x3a, 0xdf, 0x49, 0xd1, 0x6f, 0x03, 0xd8, 0xc3, 0x45, 0xea, 0xf7, 0xc7, 0x4f, 0xe3, 0x24, 0x7d,
0xb7, 0x60, 0x17, 0x2d, 0x55, 0xcb, 0x4e, 0x40, 0xcb, 0x98, 0xcb, 0xc4, 0xcd, 0xb0, 0x62, 0xd8, 0x1a, 0xe7, 0xd6, 0x95, 0x07, 0xab, 0x87, 0x21, 0xe5, 0xfe, 0xca, 0x61, 0xa8, 0xb5, 0x76, 0x18,
0x1b, 0x96, 0xcf, 0x5e, 0x53, 0x88, 0x15, 0x6a, 0x4d, 0x07, 0xb5, 0x10, 0x76, 0xf2, 0x82, 0x57, 0x6a, 0xbb, 0x43, 0x5f, 0xf8, 0x81, 0x6a, 0xe6, 0x95, 0x19, 0x14, 0xfd, 0x23, 0xe8, 0x24, 0x92,
0xc6, 0x5b, 0x64, 0xdc, 0xe1, 0xb9, 0xc8, 0xb6, 0xbd, 0x55, 0x51, 0x6b, 0xc0, 0x60, 0xb8, 0x5e, 0xcf, 0x8d, 0x37, 0x03, 0xcb, 0x1b, 0xc7, 0xe0, 0x48, 0x89, 0x85, 0xff, 0x68, 0xa9, 0x04, 0x2b,
0x58, 0x8d, 0x86, 0x92, 0x87, 0x1a, 0x44, 0x29, 0xb0, 0xa5, 0x34, 0x94, 0x0c, 0xc4, 0x5e, 0xde, 0x63, 0xa2, 0x13, 0xec, 0x2d, 0xd8, 0xc1, 0x93, 0xaa, 0x61, 0x27, 0xa0, 0x59, 0xcc, 0x65, 0xe2,
0x9c, 0x66, 0x8b, 0x54, 0x8a, 0x7e, 0x97, 0x1a, 0x5b, 0x49, 0xab, 0xb3, 0x88, 0x8b, 0xc5, 0x4c, 0x58, 0x59, 0x31, 0xec, 0x09, 0xcb, 0x67, 0xaf, 0x48, 0xc4, 0x2a, 0x6a, 0x6d, 0x27, 0x6a, 0x21,
0xf6, 0x41, 0xad, 0xfb, 0x86, 0xc6, 0x96, 0x2b, 0x6f, 0x50, 0x83, 0xe8, 0x6f, 0xd3, 0xf7, 0x8d, 0x6c, 0xe7, 0x05, 0xaf, 0x0e, 0x57, 0x83, 0xa0, 0xc3, 0x73, 0x23, 0xdb, 0xf5, 0xc7, 0x4c, 0xa5,
0x21, 0x69, 0xd3, 0x44, 0x98, 0x2f, 0xcd, 0xd5, 0x1d, 0x85, 0xa9, 0xc3, 0x44, 0xcf, 0x35, 0x43, 0x01, 0x9d, 0xe1, 0x7a, 0xda, 0x35, 0x1a, 0x4a, 0x1e, 0x6a, 0x10, 0xa5, 0xc0, 0xa6, 0xd2, 0x50,
0x29, 0xd9, 0x25, 0x25, 0x0e, 0x8f, 0x3d, 0x82, 0xfd, 0x34, 0x4b, 0x4f, 0x69, 0xfb, 0xbe, 0x34, 0x32, 0xd4, 0x43, 0xea, 0x24, 0x5b, 0xa4, 0x52, 0x0c, 0x7a, 0x54, 0xd8, 0x4a, 0xda, 0x79, 0x64,
0x4e, 0xf6, 0xc8, 0xc9, 0xe5, 0x83, 0xf0, 0x63, 0xeb, 0xa3, 0x4a, 0x1d, 0x3d, 0xa1, 0x4f, 0x3e, 0x81, 0x1a, 0x52, 0xeb, 0x1e, 0x59, 0x5b, 0x2f, 0x78, 0x64, 0x6d, 0xab, 0x98, 0xae, 0x7f, 0x64,
0x6c, 0x2e, 0xd6, 0xc7, 0x87, 0x9b, 0xfb, 0x5e, 0x42, 0x94, 0xc5, 0x28, 0xd5, 0x02, 0x48, 0xc7, 0xed, 0x2c, 0x3f, 0xb2, 0xd8, 0x23, 0xd8, 0x4b, 0xb3, 0xf4, 0x84, 0x46, 0xf7, 0x0b, 0x63, 0x64,
0x4f, 0x93, 0x94, 0x17, 0x2f, 0xaf, 0x0b, 0xd3, 0x27, 0x11, 0x17, 0x7c, 0x76, 0x55, 0xee, 0xf2, 0x9f, 0x8c, 0x5c, 0x5e, 0x08, 0x3f, 0xb6, 0x5e, 0x64, 0x6a, 0xe9, 0x09, 0x3d, 0x58, 0xb1, 0xb8,
0x94, 0x3e, 0x5b, 0x91, 0xcf, 0x0e, 0xbf, 0x6a, 0x5a, 0x5f, 0x16, 0xda, 0xe2, 0xbb, 0xd8, 0x1a, 0x58, 0x2f, 0x17, 0x17, 0xfb, 0x1e, 0x20, 0xca, 0x64, 0x94, 0x6a, 0x00, 0xa4, 0xe5, 0xa7, 0x49,
0x31, 0x1a, 0x6d, 0xf1, 0x75, 0xdf, 0xa2, 0x1d, 0xeb, 0xa8, 0x16, 0x69, 0x69, 0xf6, 0x18, 0x5a, 0xca, 0x8b, 0x97, 0xd7, 0x85, 0xf0, 0x49, 0xc4, 0x39, 0x9f, 0x5d, 0x96, 0xb3, 0x3c, 0xc1, 0x67,
0x73, 0x74, 0x7c, 0xc5, 0x12, 0xe0, 0x47, 0x35, 0xaa, 0x45, 0x4a, 0x96, 0xfd, 0x04, 0x76, 0x63, 0x33, 0xf2, 0xd9, 0xe1, 0x57, 0x6d, 0xeb, 0x55, 0xa2, 0x4f, 0x7c, 0x17, 0x4b, 0x23, 0x7a, 0xa3,
0x21, 0xb8, 0xbc, 0xc4, 0x2f, 0xe6, 0x2b, 0x5e, 0xe8, 0x4e, 0x79, 0xa0, 0x2f, 0x3f, 0xc1, 0x33, 0x4f, 0x7c, 0xdd, 0x3f, 0xd1, 0xf6, 0x75, 0xdc, 0x88, 0xb4, 0x34, 0x7b, 0x0c, 0x9d, 0x39, 0x1a,
0x61, 0x0e, 0x47, 0xb5, 0xc8, 0x95, 0x2e, 0xaf, 0xff, 0x22, 0x91, 0xd3, 0x49, 0x11, 0x7f, 0x49, 0x5e, 0x33, 0x04, 0xf8, 0x5e, 0x8d, 0x1b, 0x91, 0x92, 0x65, 0x3f, 0x82, 0x9d, 0x58, 0x08, 0x2e,
0x19, 0xed, 0x5f, 0x37, 0x87, 0xe5, 0x75, 0xc3, 0x60, 0x8f, 0x61, 0x4b, 0x1a, 0xc3, 0xed, 0xcd, 0x2f, 0xf0, 0xbd, 0x7f, 0xc9, 0x0b, 0x5d, 0x29, 0xf7, 0xf5, 0xe6, 0x27, 0xb8, 0x26, 0xcc, 0xe2,
0x86, 0x4b, 0x41, 0xbc, 0xf4, 0xa5, 0x31, 0xd7, 0xd9, 0x6c, 0xae, 0x14, 0x64, 0x1f, 0x42, 0xcf, 0xb8, 0x11, 0xb9, 0xd2, 0xe5, 0xf6, 0x9f, 0x27, 0xf2, 0x7a, 0x5a, 0xc4, 0x5f, 0x10, 0xa2, 0xfd,
0x28, 0xb8, 0xcc, 0x3e, 0xbc, 0xe1, 0x63, 0x2a, 0x8c, 0x0a, 0x25, 0xd7, 0x9e, 0x12, 0x19, 0xd5, 0xed, 0x66, 0xb1, 0xdc, 0x6e, 0x18, 0xec, 0x31, 0x6c, 0x4a, 0x73, 0x70, 0x77, 0xfd, 0xc1, 0xa5,
0x22, 0xef, 0x12, 0x7b, 0x0f, 0x20, 0x2d, 0xd7, 0x51, 0x2a, 0x9f, 0x4d, 0x0b, 0xe7, 0xa8, 0x16, 0x20, 0x6e, 0xfa, 0xc2, 0x1c, 0xb7, 0xb1, 0xfe, 0xb8, 0x52, 0x90, 0x7d, 0x08, 0x7d, 0xa3, 0xe0,
0x59, 0xe2, 0xec, 0x23, 0xb8, 0x97, 0xba, 0xa3, 0x8d, 0x8a, 0x6c, 0xe3, 0xf0, 0x1b, 0xd5, 0x22, 0x22, 0xfb, 0xf0, 0x86, 0x4f, 0x28, 0x31, 0xaa, 0x28, 0xb9, 0xe7, 0x29, 0x91, 0x71, 0x23, 0xf2,
0xff, 0x12, 0xce, 0x1c, 0x79, 0xab, 0x17, 0x82, 0xba, 0xbc, 0x7d, 0xbf, 0xa3, 0x3f, 0x9b, 0x70, 0x36, 0xb1, 0xf7, 0x00, 0xd2, 0x72, 0x1c, 0xa5, 0xf4, 0x59, 0x37, 0x70, 0x8e, 0x1b, 0x91, 0x25,
0x0e, 0x1f, 0x5a, 0x73, 0xd8, 0x4a, 0x96, 0x75, 0x33, 0xd8, 0x5a, 0x2e, 0xee, 0x96, 0xda, 0xdf, 0xce, 0x3e, 0x82, 0x7b, 0xa9, 0xdb, 0xda, 0x28, 0xc9, 0xd6, 0x36, 0xbf, 0x71, 0x23, 0xf2, 0x37,
0x77, 0x66, 0xf0, 0x52, 0x6a, 0x3a, 0x3f, 0x03, 0xa8, 0x29, 0xfc, 0xae, 0x3f, 0x85, 0x37, 0x5f, 0x61, 0xcf, 0x91, 0xb7, 0x7a, 0x20, 0x68, 0xca, 0xdb, 0xf7, 0x37, 0xf4, 0xb3, 0x09, 0xfb, 0xf0,
0x2a, 0xe7, 0xf0, 0xc7, 0xce, 0x47, 0x40, 0x95, 0xc1, 0x2f, 0x55, 0xdd, 0xbf, 0xaf, 0xe3, 0x54, 0x81, 0xd5, 0x87, 0x2d, 0xb0, 0xac, 0xea, 0xc1, 0xd6, 0x70, 0x71, 0x37, 0x68, 0x7f, 0xd7, 0xe9,
0x77, 0xb5, 0xd1, 0xa2, 0xeb, 0xae, 0xa8, 0xc1, 0xd2, 0x8a, 0x8a, 0x2b, 0x15, 0x52, 0x0a, 0x46, 0xc1, 0x4b, 0xd0, 0x74, 0xbe, 0x21, 0xa8, 0x2e, 0xfc, 0xae, 0xdf, 0x85, 0xd7, 0x6f, 0x2a, 0xfb,
0x0d, 0xba, 0xcd, 0x62, 0xdf, 0x86, 0x1e, 0xae, 0xa5, 0x17, 0xf1, 0x9c, 0x6b, 0xa1, 0x06, 0x09, 0xf0, 0xc7, 0xce, 0x23, 0xa0, 0x42, 0xf0, 0x4b, 0x65, 0xf7, 0xdf, 0x5b, 0xd8, 0xd5, 0x5d, 0x6d,
0x79, 0xdc, 0x6a, 0x52, 0x34, 0x57, 0x4f, 0x8a, 0x96, 0x3f, 0x5f, 0xab, 0x1e, 0xde, 0xde, 0xd4, 0x34, 0xe8, 0xba, 0x23, 0x6a, 0xb0, 0x34, 0xa2, 0xe2, 0x48, 0x85, 0x94, 0x0a, 0xa3, 0x0e, 0xba,
0xc3, 0x3b, 0x1b, 0x7a, 0xf8, 0x96, 0xdb, 0xc3, 0xc3, 0x5f, 0x2d, 0xe7, 0x47, 0xc4, 0xc7, 0x59, 0xcd, 0x62, 0xdf, 0x84, 0x3e, 0x8e, 0xa5, 0xe7, 0xf1, 0x9c, 0x6b, 0xa1, 0x16, 0x09, 0x79, 0xdc,
0x31, 0x79, 0x55, 0xf9, 0x11, 0x7e, 0x0b, 0xb6, 0xcb, 0xe3, 0xcb, 0x1b, 0x0c, 0x4f, 0x4d, 0x09, 0xaa, 0x53, 0xb4, 0xeb, 0x3b, 0x45, 0xc7, 0xef, 0xaf, 0x55, 0x0d, 0xef, 0xae, 0xab, 0xe1, 0x1b,
0xad, 0x58, 0x53, 0x6a, 0x6b, 0xa9, 0x96, 0xac, 0x4b, 0xc4, 0xc2, 0x9f, 0xa8, 0x77, 0xf9, 0x61, 0x6b, 0x6a, 0xf8, 0xa6, 0x57, 0xc3, 0x9d, 0xde, 0xd2, 0xf3, 0x7b, 0x8b, 0x55, 0xe1, 0xe1, 0x05,
0x25, 0xfc, 0x6d, 0x1d, 0xf6, 0x9d, 0xfd, 0xe7, 0xeb, 0xf5, 0xaa, 0xdd, 0x97, 0x7d, 0xd5, 0xae, 0x15, 0x7e, 0xeb, 0x2e, 0x15, 0x7e, 0xbb, 0xa6, 0xc2, 0x2f, 0xf5, 0xdf, 0x9d, 0x3b, 0xf6, 0xdf,
0xf5, 0xaa, 0x67, 0xf0, 0x9a, 0x03, 0x01, 0xa1, 0x89, 0xa5, 0xda, 0x26, 0x6f, 0xfc, 0x9d, 0x69, 0x7e, 0x6d, 0xff, 0x0d, 0x7f, 0xb1, 0x8c, 0xf8, 0x88, 0x4f, 0xb2, 0x62, 0xfa, 0xaa, 0x10, 0x1f,
0x09, 0xae, 0x48, 0xcb, 0xa9, 0x92, 0xf3, 0x5f, 0x05, 0x3d, 0x5b, 0xfd, 0x26, 0x4b, 0x3b, 0xa0, 0x7e, 0x03, 0xb6, 0xca, 0xe5, 0x8b, 0x1b, 0xbc, 0x30, 0x15, 0x15, 0xad, 0x58, 0x53, 0x6a, 0x0e,
0xf3, 0xa3, 0xd6, 0xdf, 0xea, 0xd0, 0xab, 0x46, 0x1b, 0xb6, 0x57, 0x4c, 0x32, 0xfc, 0x96, 0x30, 0xab, 0xc6, 0xc6, 0x0b, 0xbc, 0x5d, 0x7f, 0x46, 0xb8, 0xcb, 0x67, 0xa6, 0xf0, 0xd7, 0x4d, 0xd8,
0x49, 0x86, 0x7f, 0x53, 0x33, 0xcb, 0xcc, 0x02, 0x2d, 0x33, 0x7c, 0xba, 0xa4, 0x6c, 0xe1, 0x04, 0x73, 0x26, 0xba, 0xff, 0x2f, 0x9c, 0xf6, 0x5e, 0x16, 0xa7, 0xbd, 0x0a, 0xa7, 0xe1, 0x29, 0xbc,
0xfa, 0x56, 0x64, 0x71, 0xac, 0x8c, 0x6a, 0x92, 0x45, 0x4d, 0x21, 0x3f, 0x9e, 0x23, 0x56, 0x06, 0xe6, 0x84, 0x80, 0xa2, 0x89, 0xc5, 0xa7, 0x4b, 0xd6, 0xf8, 0x53, 0xe0, 0x52, 0xb8, 0x22, 0x2d,
0x72, 0x45, 0xa1, 0x4d, 0x8e, 0xed, 0x5e, 0xa1, 0x4d, 0x7f, 0xd3, 0x42, 0x7e, 0x3b, 0x7f, 0x96, 0xa7, 0x8a, 0x88, 0x7f, 0x2b, 0x68, 0x59, 0xfd, 0x9d, 0x2c, 0x4d, 0xb5, 0x76, 0x7e, 0x84, 0x7f,
0xcd, 0xf4, 0xc7, 0xa3, 0xa6, 0xac, 0x67, 0x03, 0xe7, 0xd9, 0xe8, 0x47, 0x32, 0x7c, 0x6e, 0x44, 0x6a, 0x42, 0xbf, 0x6a, 0xd6, 0xd8, 0x30, 0x10, 0x64, 0xf8, 0x3a, 0x32, 0x20, 0xc3, 0xdf, 0x54,
0x4b, 0xef, 0x83, 0x07, 0x24, 0xb1, 0xc4, 0xa7, 0x1f, 0x87, 0xe2, 0x22, 0xd6, 0x52, 0x87, 0x6a, 0x9e, 0x33, 0xf3, 0x24, 0x90, 0x19, 0x5e, 0x5d, 0x52, 0x36, 0x25, 0x0a, 0xfa, 0x66, 0x64, 0x71,
0xf5, 0xad, 0x38, 0xb8, 0x46, 0x89, 0xc5, 0x78, 0xcc, 0x85, 0xe8, 0x3f, 0xa0, 0xe0, 0x0c, 0x79, 0x2c, 0x44, 0xb5, 0xe9, 0x44, 0x4d, 0x21, 0x3f, 0x9e, 0x63, 0xac, 0x4c, 0xc8, 0x15, 0x85, 0x67,
0xf2, 0xe7, 0x06, 0x74, 0xcb, 0x1f, 0xb4, 0xd9, 0x4f, 0x61, 0xeb, 0x8c, 0x4b, 0x7a, 0x02, 0xb6, 0x72, 0x6c, 0x60, 0x2a, 0xda, 0xf4, 0x9b, 0x9e, 0x18, 0xb7, 0xf3, 0x67, 0xd9, 0x4c, 0x3f, 0x87,
0x57, 0xbe, 0xdc, 0xf3, 0x0b, 0x59, 0x24, 0xe9, 0xf5, 0xe0, 0xcd, 0xe5, 0x9d, 0xc0, 0xf9, 0xd5, 0x35, 0x65, 0x5d, 0x1b, 0x38, 0xd7, 0x46, 0x9f, 0xfd, 0xf0, 0xba, 0x31, 0x5a, 0x3a, 0xc3, 0xf6,
0x30, 0xac, 0xb1, 0x1f, 0x03, 0x7c, 0x92, 0x08, 0xa9, 0x93, 0x61, 0xb7, 0x52, 0xf1, 0x69, 0x32, 0x49, 0x62, 0x89, 0x4f, 0x9f, 0xbb, 0xe2, 0x22, 0xd6, 0x52, 0x07, 0x6a, 0x98, 0xaf, 0x38, 0x58,
0x1b, 0x0c, 0x56, 0xe5, 0x82, 0x12, 0x0d, 0x6b, 0xec, 0x33, 0x60, 0x67, 0x9c, 0x82, 0xb2, 0x0b, 0x36, 0xc4, 0x62, 0x32, 0xe1, 0x42, 0x0c, 0x1e, 0x90, 0x73, 0x86, 0x3c, 0xfe, 0xb2, 0x05, 0xbd,
0xf3, 0x61, 0xa5, 0x62, 0x55, 0xe1, 0x0e, 0xd6, 0xe6, 0x57, 0x58, 0x63, 0x17, 0xd0, 0x33, 0xd1, 0xf2, 0x0f, 0x06, 0xf6, 0x63, 0xd8, 0x3c, 0xe5, 0x92, 0xae, 0x80, 0xed, 0x96, 0x37, 0xf7, 0xfc,
0xdc, 0x51, 0xdb, 0x9b, 0x1b, 0xa7, 0x84, 0xc8, 0xc3, 0x1a, 0x7b, 0x0f, 0xf6, 0xce, 0xb8, 0xa4, 0x5c, 0x16, 0x49, 0x7a, 0x35, 0x7c, 0x73, 0x79, 0xca, 0x71, 0xbe, 0x83, 0x86, 0x0d, 0xf6, 0x43,
0xd4, 0x2a, 0xb7, 0xcc, 0x5e, 0xa5, 0x16, 0xd3, 0x62, 0x70, 0xe0, 0xab, 0x21, 0xf1, 0xb0, 0xc6, 0x80, 0x9f, 0x26, 0x42, 0x6a, 0x30, 0xec, 0x54, 0x2a, 0x3e, 0x49, 0x66, 0xc3, 0x61, 0x1d, 0x16,
0x1e, 0x41, 0xfb, 0x5c, 0x5c, 0xdc, 0xa6, 0x63, 0x1f, 0x9a, 0x7d, 0x4d, 0x9e, 0x8b, 0xd3, 0x78, 0x94, 0x68, 0xd8, 0x60, 0x9f, 0x02, 0x3b, 0xe5, 0xe4, 0x94, 0x9d, 0x98, 0x0f, 0x2b, 0x15, 0x75,
0x71, 0x3d, 0x95, 0x9f, 0xe7, 0x61, 0xed, 0x59, 0x9b, 0xfe, 0x2b, 0xf0, 0xf8, 0x7f, 0x01, 0x00, 0x89, 0x3b, 0x5c, 0x89, 0xaf, 0xb0, 0xc1, 0xce, 0xa1, 0x6f, 0xbc, 0xb9, 0xa3, 0xb6, 0x37, 0xd7,
0x00, 0xff, 0xff, 0xed, 0xd7, 0xdd, 0x61, 0x72, 0x18, 0x00, 0x00, 0xf6, 0x3d, 0x91, 0x87, 0x0d, 0xf6, 0x1e, 0xec, 0x9e, 0x72, 0x49, 0xd0, 0x2a, 0xab, 0x6a, 0xbf,
0x52, 0x8b, 0xb0, 0x18, 0xee, 0xfb, 0x6a, 0x48, 0x3c, 0x6c, 0xb0, 0x47, 0xd0, 0x3d, 0x13, 0xe7,
0xb7, 0xe9, 0xc4, 0x0f, 0xcd, 0x9e, 0x26, 0xcf, 0xc4, 0x49, 0xbc, 0xb8, 0xba, 0x96, 0x9f, 0xe5,
0x61, 0xe3, 0x59, 0x97, 0xfe, 0xa5, 0x79, 0xfc, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x9c,
0x04, 0x0e, 0x02, 0x1a, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
......
...@@ -19,13 +19,13 @@ var ( ...@@ -19,13 +19,13 @@ var (
// ForkCommitTx main chain support paracross commit tx // ForkCommitTx main chain support paracross commit tx
ForkCommitTx = "ForkParacrossCommitTx" ForkCommitTx = "ForkParacrossCommitTx"
//平行链配置项对应主链的ForkCommitTx 高度 //平行链配置项对应主链的ForkCommitTx 高度
MainForkParacrossCommitTx="MainForkParacrossCommitTx" MainForkParacrossCommitTx = "MainForkParacrossCommitTx"
// ParaSelfConsensForkHeight para self consens height string // ParaSelfConsensForkHeight para self consens height string
ParaSelfConsensForkHeight = "MainParaSelfConsensusForkHeight" ParaSelfConsensForkHeight = "MainParaSelfConsensusForkHeight"
//ForkLoopCheckCommitTxDone 循环检查共识交易done的fork //ForkLoopCheckCommitTxDone 循环检查共识交易done的fork
ForkLoopCheckCommitTxDone ="ForkLoopCheckCommitTxDone" ForkLoopCheckCommitTxDone = "ForkLoopCheckCommitTxDone"
//MainLoopCheckCommitTxDoneForkHeight 平行链的配置项,对应主链的ForkLoopCheckCommitTxDone高度 //MainLoopCheckCommitTxDoneForkHeight 平行链的配置项,对应主链的ForkLoopCheckCommitTxDone高度
MainLoopCheckCommitTxDoneForkHeight="MainLoopCheckCommitTxDoneForkHeight" MainLoopCheckCommitTxDoneForkHeight = "MainLoopCheckCommitTxDoneForkHeight"
) )
func init() { func init() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment