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
gasOnlyTx = true
}
+ if err := c.GetTransactionsUtxo(view, []*bc.Tx{tx}); err != nil {
+ blkGenSkipTxForErr(txPool, &tx.ID, err)
+ continue
+ }
+
if gasUsed+uint64(gasStatus.GasUsed) > consensus.MaxBlockGas {
break
}
if gasUsed == consensus.MaxBlockGas {
break
}
+
}
// creater coinbase transaction
err error
}
+func (r *validateTxResult) GetGasState() *GasState {
+ return r.gasStatus
+}
+
+func (r *validateTxResult) GetError() error {
+ return r.err
+}
+
func validateTxWorker(workCh chan *validateTxWork, resultCh chan *validateTxResult, closeCh chan struct{}, wg *sync.WaitGroup) {
for {
select {