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 *
MainBlockHash: main.Seq.Hash,
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 {
return err
}
......
......@@ -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)
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() {
......@@ -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)))
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)
titleStatus.Title = commit.Status.Title
......@@ -526,18 +527,35 @@ func (a *action) Miner(miner *pt.ParacrossMinerAction) (*types.Receipt, error) {
logs = append(logs, log)
minerReceipt := &types.Receipt{Ty: types.ExecOk, KV: nil, Logs: logs}
//自共识后才挖矿
if miner.IsSelfConsensus {
//增发coins到paracross合约中,只处理发放,不做分配
reward := (types.MGInt("mver.consensus.coinReward", a.height) +
types.MGInt("mver.consensus.coinDevFund", a.height)) * types.Coin
issueReceipt, err := a.coinsAccount.ExecIssueCoins(a.execaddr, reward)
totalReward := int64(0)
coinReward := types.MGInt("mver.consensus.coinReward", a.height)
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 {
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
}
minerReceipt = mergeReceipt(minerReceipt, issueReceipt)
}
}
return mergeReceipt(minerReceipt, issueReceipt), nil
return minerReceipt, nil
}
func getTitleFrom(exec []byte) ([]byte, error) {
......
......@@ -449,7 +449,7 @@ func (s *VoteTestSuite) TestVoteTx() {
}
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")
if err != nil {
return nil, err
......
......@@ -16,12 +16,13 @@ func (a *action) reward(nodeStatus *pt.ParacrossNodeStatus, stat *pt.ParacrossHe
fundAddr := types.MGStr("mver.consensus.fundKeyAddr", nodeStatus.Height)
minerAddrs := getMiners(stat.Details, nodeStatus.BlockHash)
//分配给矿工的单位奖励,如果不等分转到发展基金
//分配给矿工的单位奖励
minerUnit := coinReward / int64(len(minerAddrs))
fundReward += coinReward % minerUnit
receipt := &types.Receipt{Ty: types.ExecOk}
if minerUnit > 0 {
//如果不等分转到发展基金
fundReward += coinReward % minerUnit
for _, addr := range minerAddrs {
rep, err := a.coinsAccount.ExecDeposit(addr, a.execaddr, minerUnit)
......@@ -32,15 +33,19 @@ func (a *action) reward(nodeStatus *pt.ParacrossNodeStatus, stat *pt.ParacrossHe
}
receipt = mergeReceipt(receipt, rep)
}
}
if fundReward > 0 {
rep, err := a.coinsAccount.ExecDeposit(fundAddr, a.execaddr, fundReward)
if err != nil {
clog.Error("paracross fund reward deposit err", "height", nodeStatus.Height,
"execAddr", a.execaddr, "fundAddr", fundAddr, "amount", fundReward, "err", err)
return nil, err
}
receipt = mergeReceipt(receipt, rep)
}
return mergeReceipt(receipt, rep), nil
return receipt, nil
}
// getMiners 获取提交共识消息的矿工地址
......
......@@ -124,6 +124,7 @@ message ParacrossCommitAction {
message ParacrossMinerAction {
ParacrossNodeStatus status = 1;
bool isSelfConsensus = 2;
}
message ParacrossAction {
......
......@@ -209,13 +209,11 @@ func CreateRawAssetTransferTx(param *types.CreateTx) (*types.Transaction, error)
}
// CreateRawMinerTx create miner tx
func CreateRawMinerTx(status *ParacrossNodeStatus) (*types.Transaction, error) {
v := &ParacrossMinerAction{
Status: status,
}
func CreateRawMinerTx(value *ParacrossMinerAction) (*types.Transaction, error) {
action := &ParacrossAction{
Ty: ParacrossActionMiner,
Value: &ParacrossAction_Miner{v},
Value: &ParacrossAction_Miner{value},
}
tx := &types.Transaction{
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