mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-05-22 14:56:44 +00:00

* Allow to configure consensus with a JSON file * Define everywhere maxBlockParents as KType * Move consensus default to consensus_defaults.go
48 lines
1.6 KiB
Go
48 lines
1.6 KiB
Go
package transactionvalidator
|
|
|
|
import (
|
|
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
|
|
"github.com/kaspanet/kaspad/domain/consensus/ruleerrors"
|
|
"github.com/kaspanet/kaspad/domain/consensus/utils/estimatedsize"
|
|
"github.com/kaspanet/kaspad/domain/consensus/utils/transactionhelper"
|
|
"github.com/kaspanet/kaspad/domain/consensus/utils/txscript"
|
|
)
|
|
|
|
func (v *transactionValidator) transactionMassStandalonePart(tx *externalapi.DomainTransaction) uint64 {
|
|
size := estimatedsize.TransactionEstimatedSerializedSize(tx)
|
|
|
|
totalScriptPubKeySize := uint64(0)
|
|
for _, output := range tx.Outputs {
|
|
totalScriptPubKeySize += uint64(len(output.ScriptPublicKey))
|
|
}
|
|
|
|
return size*v.massPerTxByte + totalScriptPubKeySize*v.massPerScriptPubKeyByte
|
|
}
|
|
|
|
func (v *transactionValidator) transactionMass(tx *externalapi.DomainTransaction) (uint64, error) {
|
|
if transactionhelper.IsCoinBase(tx) {
|
|
return 0, nil
|
|
}
|
|
|
|
standaloneMass := v.transactionMassStandalonePart(tx)
|
|
sigOpsCount := uint64(0)
|
|
var missingOutpoints []*externalapi.DomainOutpoint
|
|
for _, input := range tx.Inputs {
|
|
utxoEntry := input.UTXOEntry
|
|
if utxoEntry == nil {
|
|
missingOutpoints = append(missingOutpoints, &input.PreviousOutpoint)
|
|
continue
|
|
}
|
|
// Count the precise number of signature operations in the
|
|
// referenced public key script.
|
|
sigScript := input.SignatureScript
|
|
isP2SH := txscript.IsPayToScriptHash(utxoEntry.ScriptPublicKey())
|
|
sigOpsCount += uint64(txscript.GetPreciseSigOpCount(sigScript, utxoEntry.ScriptPublicKey(), isP2SH))
|
|
}
|
|
if len(missingOutpoints) > 0 {
|
|
return 0, ruleerrors.NewErrMissingTxOut(missingOutpoints)
|
|
}
|
|
|
|
return standaloneMass + sigOpsCount*v.massPerSigOp, nil
|
|
}
|