mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-03-30 15:08:33 +00:00

* [NOD-222] Added constant: UnacceptedBlueScore. * [NOD-222] Made it so that block transactions always have UnacceptedBlueScore. * [NOD-222] Implemented updating unaccepted UTXO entries with accepted ones in the virtual. * [NOD-222] Fixed an unclear comment. * [NOD-222] Fixed diffFromAcceptanceData not receiving the right blue score. * [NOD-222] Fixed various issues with the implementation. It appears to work now. * [NOD-222] Removed debug logs. * [NOD-222] Fixed tests that relied on utxoCollection.String(). * [NOD-222] Fixed TestChainedTransactions. * [NOD-222] Fixed tests that relied on GetVirtualFromParentsForTest. * [NOD-222] Fixed having identical entries in toAdd and toRemove. * [NOD-222] Fixed logic in diffFrom that I previously broke. * [NOD-222] Fixed a wrong check. * [NOD-222] Figured out the magical invocation to make everything work. * [NOD-222] Fixed blockDB tests. * [NOD-222] Removed debug method. * [NOD-222] Fixed comments related to setting coinbase maturity to 0. * [NOD-222] Fixed a typo in a comment. * [NOD-222] Added a comment that explains the new addition in GetVirtualFromParentsForTest. * [NOD-222] Added a comment to DiffUTXOSet.Get(). * [NOD-222] Fixed a nuance in DiffUTXOSet.containsInputs. * [NOD-222] Replaced nonsense in GetVirtualFromParentsForTest with diffFromAcceptanceData. * [NOD-222] Renamed newVirtualUTXO -> newVirtualPastUTXO. * [NOD-222] Fixed a comment. * [NOD-222] Extracted checking utxoCollection with blueScore to a method. * [NOD-222] Added tests where the same entry is in both toAdd and toRemove. * [NOD-222] Used Add/RemoveEntry inside diffFromAcceptedTx. * [NOD-222] Removed superfluous test for UnacceptedBlueScore. * [NOD-222] Added/Updated comments. * [NOD-222] Added tests to TestUTXODiffRules. * [NOD-222] Added appropriate protection against impossible "from"s in diffFrom. * [NOD-222] Added a comment explaining why we diffFrom acceptanceData in verifyAndBuildUTXO. * [NOD-222] Fixed comments and equal() in utxoset.
129 lines
3.5 KiB
Go
129 lines
3.5 KiB
Go
package mining
|
|
|
|
// This file functions are not considered safe for regular use, and should be used for test purposes only.
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/daglabs/btcd/dagconfig"
|
|
|
|
"github.com/daglabs/btcd/blockdag"
|
|
"github.com/daglabs/btcd/txscript"
|
|
"github.com/daglabs/btcd/util"
|
|
"github.com/daglabs/btcd/util/daghash"
|
|
"github.com/daglabs/btcd/wire"
|
|
)
|
|
|
|
// fakeTxSource is a simple implementation of TxSource interface
|
|
type fakeTxSource struct {
|
|
txDescs []*TxDesc
|
|
}
|
|
|
|
func (txs *fakeTxSource) LastUpdated() time.Time {
|
|
return time.Unix(0, 0)
|
|
}
|
|
|
|
func (txs *fakeTxSource) MiningDescs() []*TxDesc {
|
|
return txs.txDescs
|
|
}
|
|
|
|
func (txs *fakeTxSource) HaveTransaction(txID *daghash.TxID) bool {
|
|
for _, desc := range txs.txDescs {
|
|
if *desc.Tx.ID() == *txID {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// PrepareBlockForTest generates a block with the proper merkle roots, coinbase transaction etc. This function is used for test purposes only
|
|
func PrepareBlockForTest(dag *blockdag.BlockDAG, params *dagconfig.Params, parentHashes []*daghash.Hash, transactions []*wire.MsgTx, forceTransactions bool) (*wire.MsgBlock, error) {
|
|
newVirtual, err := blockdag.GetVirtualFromParentsForTest(dag, parentHashes)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
oldVirtual := blockdag.SetVirtualForTest(dag, newVirtual)
|
|
defer blockdag.SetVirtualForTest(dag, oldVirtual)
|
|
policy := Policy{
|
|
BlockMaxSize: 50000,
|
|
}
|
|
|
|
txSource := &fakeTxSource{
|
|
txDescs: make([]*TxDesc, len(transactions)),
|
|
}
|
|
|
|
for i, tx := range transactions {
|
|
txSource.txDescs[i] = &TxDesc{
|
|
Tx: util.NewTx(tx),
|
|
}
|
|
}
|
|
|
|
blockTemplateGenerator := NewBlkTmplGenerator(&policy,
|
|
params, txSource, dag, blockdag.NewMedianTime(), txscript.NewSigCache(100000))
|
|
|
|
OpTrueAddr, err := OpTrueAddress(params.Prefix)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
template, err := blockTemplateGenerator.NewBlockTemplate(OpTrueAddr)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// In order of creating deterministic coinbase tx ids.
|
|
err = blockTemplateGenerator.UpdateExtraNonce(template.Block, GenerateDeterministicExtraNonceForTest())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
txsToAdd := make([]*wire.MsgTx, 0)
|
|
for _, tx := range transactions {
|
|
found := false
|
|
for _, blockTx := range template.Block.Transactions {
|
|
if blockTx.TxHash().IsEqual(tx.TxHash()) {
|
|
found = true
|
|
break
|
|
}
|
|
}
|
|
if !found {
|
|
if !forceTransactions {
|
|
return nil, fmt.Errorf("tx %s wasn't found in the block", tx.TxHash())
|
|
}
|
|
txsToAdd = append(txsToAdd, tx)
|
|
}
|
|
}
|
|
if forceTransactions && len(txsToAdd) > 0 {
|
|
for _, tx := range txsToAdd {
|
|
template.Block.Transactions = append(template.Block.Transactions, tx)
|
|
}
|
|
}
|
|
updateHeaderFields := forceTransactions && len(txsToAdd) > 0
|
|
if updateHeaderFields {
|
|
utilTxs := make([]*util.Tx, len(template.Block.Transactions))
|
|
for i, tx := range template.Block.Transactions {
|
|
utilTxs[i] = util.NewTx(tx)
|
|
}
|
|
template.Block.Header.HashMerkleRoot = blockdag.BuildHashMerkleTreeStore(utilTxs).Root()
|
|
|
|
template.Block.Header.UTXOCommitment, err = blockTemplateGenerator.buildUTXOCommitment(template.Block.Transactions)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
return template.Block, nil
|
|
}
|
|
|
|
// GenerateDeterministicExtraNonceForTest returns a unique deterministic extra nonce for coinbase data, in order to create unique coinbase transactions.
|
|
func GenerateDeterministicExtraNonceForTest() uint64 {
|
|
extraNonceForTest++
|
|
return extraNonceForTest
|
|
}
|
|
|
|
func OpTrueAddress(prefix util.Bech32Prefix) (util.Address, error) {
|
|
return util.NewAddressScriptHash(blockdag.OpTrueScript, prefix)
|
|
}
|
|
|
|
var extraNonceForTest = uint64(0)
|