Commit a02f9889 authored by jiangpeng's avatar jiangpeng Committed by vipwzw

fix parachain mining

parent 03552689
...@@ -703,7 +703,10 @@ func (client *client) addMinerTx(preStateHash []byte, block *types.Block, main * ...@@ -703,7 +703,10 @@ func (client *client) addMinerTx(preStateHash []byte, block *types.Block, main *
MainBlockHash: main.Seq.Hash, MainBlockHash: main.Seq.Hash,
MainBlockHeight: main.Detail.Block.Height, MainBlockHeight: main.Detail.Block.Height,
} }
tx, err := paracross.CreateRawMinerTx(status) tx, err := paracross.CreateRawMinerTx(&pt.ParacrossMinerAction{
Status:status,
IsSelfConsensus:isParaSelfConsensusForked(status.MainBlockHeight),
})
if err != nil { if err != nil {
return err return err
} }
......
...@@ -359,6 +359,10 @@ func (a *action) Commit(commit *pt.ParacrossCommitAction) (*types.Receipt, error ...@@ -359,6 +359,10 @@ func (a *action) Commit(commit *pt.ParacrossCommitAction) (*types.Receipt, error
saveTitleHeight(a.db, calcTitleHeightKey(commit.Status.Title, commit.Status.Height), stat) saveTitleHeight(a.db, calcTitleHeightKey(commit.Status.Title, commit.Status.Height), stat)
return receipt, nil return receipt, nil
} }
//add commit done receipt
receiptDone := makeDoneReceipt(a.fromaddr, commit, stat, int32(most), int32(commitCount), int32(len(nodes)))
receipt.KV = append(receipt.KV, receiptDone.KV...)
receipt.Logs = append(receipt.Logs, receiptDone.Logs...)
//平行连进行奖励分配,考虑可能的失败,需要在保存共识高度等数据之前处理 //平行连进行奖励分配,考虑可能的失败,需要在保存共识高度等数据之前处理
if types.IsPara() { if types.IsPara() {
...@@ -376,9 +380,6 @@ func (a *action) Commit(commit *pt.ParacrossCommitAction) (*types.Receipt, error ...@@ -376,9 +380,6 @@ func (a *action) Commit(commit *pt.ParacrossCommitAction) (*types.Receipt, error
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)))
stat.Status = pt.ParacrossStatusCommitDone stat.Status = pt.ParacrossStatusCommitDone
receiptDone := makeDoneReceipt(a.fromaddr, commit, stat, int32(most), int32(commitCount), int32(len(nodes)))
receipt.KV = append(receipt.KV, receiptDone.KV...)
receipt.Logs = append(receipt.Logs, receiptDone.Logs...)
saveTitleHeight(a.db, calcTitleHeightKey(commit.Status.Title, commit.Status.Height), stat) saveTitleHeight(a.db, calcTitleHeightKey(commit.Status.Title, commit.Status.Height), stat)
titleStatus.Title = commit.Status.Title titleStatus.Title = commit.Status.Title
...@@ -526,18 +527,35 @@ func (a *action) Miner(miner *pt.ParacrossMinerAction) (*types.Receipt, error) { ...@@ -526,18 +527,35 @@ func (a *action) Miner(miner *pt.ParacrossMinerAction) (*types.Receipt, error) {
logs = append(logs, log) logs = append(logs, log)
minerReceipt := &types.Receipt{Ty: types.ExecOk, KV: nil, Logs: logs} minerReceipt := &types.Receipt{Ty: types.ExecOk, KV: nil, Logs: logs}
//自共识后才挖矿
if miner.IsSelfConsensus {
//增发coins到paracross合约中,只处理发放,不做分配 //增发coins到paracross合约中,只处理发放,不做分配
reward := (types.MGInt("mver.consensus.coinReward", a.height) + totalReward := int64(0)
types.MGInt("mver.consensus.coinDevFund", a.height)) * types.Coin coinReward := types.MGInt("mver.consensus.coinReward", a.height)
issueReceipt, err := a.coinsAccount.ExecIssueCoins(a.execaddr, reward) fundReward := types.MGInt("mver.consensus.coinDevFund", a.height)
if coinReward > 0 {
totalReward += coinReward
}
if fundReward > 0 {
totalReward += fundReward
}
totalReward *= types.Coin
if totalReward > 0 {
issueReceipt, err := a.coinsAccount.ExecIssueCoins(a.execaddr, totalReward)
if err != nil { if err != nil {
clog.Error("paracross miner issue err", "height", miner.Status.Height, clog.Error("paracross miner issue err", "height", miner.Status.Height,
"execAddr", a.execaddr, "amount", reward/types.Coin) "execAddr", a.execaddr, "amount", totalReward/types.Coin)
return nil, err return nil, err
} }
minerReceipt = mergeReceipt(minerReceipt, issueReceipt)
}
}
return mergeReceipt(minerReceipt, issueReceipt), nil return minerReceipt, nil
} }
func getTitleFrom(exec []byte) ([]byte, error) { func getTitleFrom(exec []byte) ([]byte, error) {
......
...@@ -449,7 +449,7 @@ func (s *VoteTestSuite) TestVoteTx() { ...@@ -449,7 +449,7 @@ func (s *VoteTestSuite) TestVoteTx() {
} }
func (s *VoteTestSuite) createVoteTx(status *pt.ParacrossNodeStatus, privFrom string) (*types.Transaction, error) { func (s *VoteTestSuite) createVoteTx(status *pt.ParacrossNodeStatus, privFrom string) (*types.Transaction, error) {
tx, err := pt.CreateRawMinerTx(status) tx, err := pt.CreateRawMinerTx(&pt.ParacrossMinerAction{Status: status})
assert.Nil(s.T(), err, "create asset transfer failed") assert.Nil(s.T(), err, "create asset transfer failed")
if err != nil { if err != nil {
return nil, err return nil, err
......
...@@ -16,12 +16,13 @@ func (a *action) reward(nodeStatus *pt.ParacrossNodeStatus, stat *pt.ParacrossHe ...@@ -16,12 +16,13 @@ func (a *action) reward(nodeStatus *pt.ParacrossNodeStatus, stat *pt.ParacrossHe
fundAddr := types.MGStr("mver.consensus.fundKeyAddr", nodeStatus.Height) fundAddr := types.MGStr("mver.consensus.fundKeyAddr", nodeStatus.Height)
minerAddrs := getMiners(stat.Details, nodeStatus.BlockHash) minerAddrs := getMiners(stat.Details, nodeStatus.BlockHash)
//分配给矿工的单位奖励
//分配给矿工的单位奖励,如果不等分转到发展基金
minerUnit := coinReward / int64(len(minerAddrs)) minerUnit := coinReward / int64(len(minerAddrs))
fundReward += coinReward % minerUnit
receipt := &types.Receipt{Ty: types.ExecOk} receipt := &types.Receipt{Ty: types.ExecOk}
if minerUnit > 0 {
//如果不等分转到发展基金
fundReward += coinReward % minerUnit
for _, addr := range minerAddrs { for _, addr := range minerAddrs {
rep, err := a.coinsAccount.ExecDeposit(addr, a.execaddr, minerUnit) rep, err := a.coinsAccount.ExecDeposit(addr, a.execaddr, minerUnit)
...@@ -32,15 +33,19 @@ func (a *action) reward(nodeStatus *pt.ParacrossNodeStatus, stat *pt.ParacrossHe ...@@ -32,15 +33,19 @@ func (a *action) reward(nodeStatus *pt.ParacrossNodeStatus, stat *pt.ParacrossHe
} }
receipt = mergeReceipt(receipt, rep) receipt = mergeReceipt(receipt, rep)
} }
}
if fundReward > 0 {
rep, err := a.coinsAccount.ExecDeposit(fundAddr, a.execaddr, fundReward) rep, err := a.coinsAccount.ExecDeposit(fundAddr, a.execaddr, fundReward)
if err != nil { if err != nil {
clog.Error("paracross fund reward deposit err", "height", nodeStatus.Height, clog.Error("paracross fund reward deposit err", "height", nodeStatus.Height,
"execAddr", a.execaddr, "fundAddr", fundAddr, "amount", fundReward, "err", err) "execAddr", a.execaddr, "fundAddr", fundAddr, "amount", fundReward, "err", err)
return nil, err return nil, err
} }
receipt = mergeReceipt(receipt, rep)
}
return mergeReceipt(receipt, rep), nil return receipt, nil
} }
// getMiners 获取提交共识消息的矿工地址 // getMiners 获取提交共识消息的矿工地址
......
...@@ -124,6 +124,7 @@ message ParacrossCommitAction { ...@@ -124,6 +124,7 @@ message ParacrossCommitAction {
message ParacrossMinerAction { message ParacrossMinerAction {
ParacrossNodeStatus status = 1; ParacrossNodeStatus status = 1;
bool isSelfConsensus = 2;
} }
message ParacrossAction { message ParacrossAction {
......
...@@ -209,13 +209,11 @@ func CreateRawAssetTransferTx(param *types.CreateTx) (*types.Transaction, error) ...@@ -209,13 +209,11 @@ func CreateRawAssetTransferTx(param *types.CreateTx) (*types.Transaction, error)
} }
// CreateRawMinerTx create miner tx // CreateRawMinerTx create miner tx
func CreateRawMinerTx(status *ParacrossNodeStatus) (*types.Transaction, error) { func CreateRawMinerTx(value *ParacrossMinerAction) (*types.Transaction, error) {
v := &ParacrossMinerAction{
Status: status,
}
action := &ParacrossAction{ action := &ParacrossAction{
Ty: ParacrossActionMiner, Ty: ParacrossActionMiner,
Value: &ParacrossAction_Miner{v}, Value: &ParacrossAction_Miner{value},
} }
tx := &types.Transaction{ tx := &types.Transaction{
Execer: []byte(types.ExecName(ParaX)), Execer: []byte(types.ExecName(ParaX)),
......
This diff is collapsed.
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