X-Git-Url: http://git.osdn.net/view?p=bytom%2Fvapor.git;a=blobdiff_plain;f=proposal%2Fproposal.go;h=50d85d1bf788f32e9d222597bf0793a1bd0cb255;hp=46382e2c196b564c3573adf6a1013f578d3a1b0b;hb=refs%2Fheads%2Ffix_log;hpb=54373c1a3efe0e373ec1605840a4363e4b246c46 diff --git a/proposal/proposal.go b/proposal/proposal.go index 46382e2c..50d85d1b 100644 --- a/proposal/proposal.go +++ b/proposal/proposal.go @@ -24,10 +24,8 @@ const logModule = "mining" // createCoinbaseTx returns a coinbase transaction paying an appropriate subsidy // based on the passed block height to the provided address. When the address // is nil, the coinbase transaction will instead be redeemable by anyone. -func createCoinbaseTx(accountManager *account.Manager, amount uint64, blockHeight uint64) (tx *types.Tx, err error) { - amount += consensus.BlockSubsidy(blockHeight) +func createCoinbaseTx(accountManager *account.Manager, blockHeight uint64, rewards []state.CoinbaseReward) (tx *types.Tx, err error) { arbitrary := append([]byte{0x00}, []byte(strconv.FormatUint(blockHeight, 10))...) - var script []byte if accountManager == nil { script, err = vmutil.DefaultCoinbaseProgram() @@ -39,7 +37,7 @@ func createCoinbaseTx(accountManager *account.Manager, amount uint64, blockHeigh return nil, err } - if len(arbitrary) > consensus.CoinbaseArbitrarySizeLimit { + if len(arbitrary) > consensus.ActiveNetParams.CoinbaseArbitrarySizeLimit { return nil, validation.ErrCoinbaseArbitraryOversize } @@ -47,9 +45,16 @@ func createCoinbaseTx(accountManager *account.Manager, amount uint64, blockHeigh if err = builder.AddInput(types.NewCoinbaseInput(arbitrary), &txbuilder.SigningInstruction{}); err != nil { return nil, err } - if err = builder.AddOutput(types.NewIntraChainOutput(*consensus.BTMAssetID, amount, script)); err != nil { + if err = builder.AddOutput(types.NewIntraChainOutput(*consensus.BTMAssetID, 0, script)); err != nil { return nil, err } + + for _, r := range rewards { + if err = builder.AddOutput(types.NewIntraChainOutput(*consensus.BTMAssetID, r.Amount, r.ControlProgram)); err != nil { + return nil, err + } + } + _, txData, err := builder.Build() if err != nil { return nil, err @@ -59,8 +64,8 @@ func createCoinbaseTx(accountManager *account.Manager, amount uint64, blockHeigh if err != nil { return nil, err } - txData.SerializedSize = uint64(len(byteData)) + txData.SerializedSize = uint64(len(byteData)) tx = &types.Tx{ TxData: *txData, Tx: types.MapTx(txData), @@ -77,7 +82,6 @@ func NewBlockTemplate(c *protocol.Chain, txPool *protocol.TxPool, accountManager } txEntries := []*bc.Tx{nil} gasUsed := uint64(0) - txFee := uint64(0) // get preblock info for generate next block preBlockHeader := c.BestBlockHeader() @@ -91,7 +95,7 @@ func NewBlockTemplate(c *protocol.Chain, txPool *protocol.TxPool, accountManager PreviousBlockHash: preBlockHash, Timestamp: timestamp, BlockCommitment: types.BlockCommitment{}, - BlockWitness: types.BlockWitness{Witness: make([][]byte, consensus.NumOfConsensusNode)}, + BlockWitness: types.BlockWitness{Witness: make([][]byte, consensus.ActiveNetParams.NumOfConsensusNode)}, }, } bcBlock := &bc.Block{BlockHeader: &bc.BlockHeader{Height: nextBlockHeight}} @@ -99,17 +103,20 @@ func NewBlockTemplate(c *protocol.Chain, txPool *protocol.TxPool, accountManager txs := txPool.GetTransactions() sort.Sort(byTime(txs)) + + entriesTxs := []*bc.Tx{} for _, txDesc := range txs { + entriesTxs = append(entriesTxs, txDesc.Tx.Tx) + } + + validateResults := validation.ValidateTxs(entriesTxs, bcBlock) + for i, validateResult := range validateResults { + txDesc := txs[i] tx := txDesc.Tx.Tx gasOnlyTx := false - if err := c.GetTransactionsUtxo(view, []*bc.Tx{tx}); err != nil { - blkGenSkipTxForErr(txPool, &tx.ID, err) - continue - } - - gasStatus, err := validation.ValidateTx(tx, bcBlock) - if err != nil { + gasStatus := validateResult.GetGasState() + if validateResult.GetError() != nil { if !gasStatus.GasValid { blkGenSkipTxForErr(txPool, &tx.ID, err) continue @@ -117,7 +124,12 @@ func NewBlockTemplate(c *protocol.Chain, txPool *protocol.TxPool, accountManager gasOnlyTx = true } - if gasUsed+uint64(gasStatus.GasUsed) > consensus.MaxBlockGas { + if err := c.GetTransactionsUtxo(view, []*bc.Tx{tx}); err != nil { + blkGenSkipTxForErr(txPool, &tx.ID, err) + continue + } + + if gasUsed+uint64(gasStatus.GasUsed) > consensus.ActiveNetParams.MaxBlockGas { break } @@ -133,20 +145,29 @@ func NewBlockTemplate(c *protocol.Chain, txPool *protocol.TxPool, accountManager b.Transactions = append(b.Transactions, txDesc.Tx) txEntries = append(txEntries, tx) gasUsed += uint64(gasStatus.GasUsed) - txFee += txDesc.Fee - - if gasUsed == consensus.MaxBlockGas { + if gasUsed == consensus.ActiveNetParams.MaxBlockGas { break } + + } + + consensusResult, err := c.GetConsensusResultByHash(&preBlockHash) + if err != nil { + return nil, err + } + + rewards, err := consensusResult.GetCoinbaseRewards(preBlockHeader.Height) + if err != nil { + return nil, err } - // creater coinbase transaction - b.Transactions[0], err = createCoinbaseTx(accountManager, txFee, nextBlockHeight) + // create coinbase transaction + b.Transactions[0], err = createCoinbaseTx(accountManager, nextBlockHeight, rewards) if err != nil { return nil, errors.Wrap(err, "fail on createCoinbaseTx") } - txEntries[0] = b.Transactions[0].Tx + txEntries[0] = b.Transactions[0].Tx b.BlockHeader.BlockCommitment.TransactionsMerkleRoot, err = types.TxMerkleRoot(txEntries) if err != nil { return nil, err