mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-05-30 02:36:42 +00:00

* [NOD-1420] Start working on ConsensusStateManager. Might be redundant due to recent changes * [NOD-1420] Convert model to externalapi in utxo_algerbra helpers * [NOD-1420] Add UTXO-diff algebra * [NOD-1420] Prepare skeleton of calculateAcceptanceDataAndMultiset * [NOD-1420] Added skeleton for AddBlockToVirtual * [NOD-1420] Implement PopulateTransactionWithUTXOEntries * [NOD-1420] Implement restorePastUTXO * [NOD-1420] Implement finality check * [NOD-1420] Move handling of tips to consensusStateManager * [NOD-1420] Implement calculateAcceptanceDataAndMultiset * [NOD-1420] Start implementing resolveBlockStatus * [NOD-1420] Implement resolveBlockStatus * [NOD-1420] Update related fields in end of resolveSingleBlockStatus * [NOD-1420] Start working on selectVirtualParents * [NOD-1420] Implemented BlockHeap * [NOD-1420] Implement selectVirtualParents * [NOD-1420] Implement updateVirtual * [NOD-1420] Added comments where they were missing * [NOD-1420] Place all consensusStateManager functions in correct files * [NOD-1420] Return the missing outpoints from populateTransactionWithUTXOEntriesFromVirtualOrDiff * [NOD-1420] Outpoint.ID -> TransactionID * [NOD-1420] Fix Stringer tests * [NOD-1420] Copy hash.FromString into utils * [NOD-1420] SetParents should return an error * [NOD-1420] Remove all reachabilityManager references from consensusStateManager * [NOD-1420] Remove VirtualData. Get the info from the stores where needed * [NOD-1420] Invert parameters to IsAncestorOf * [NOD-1420] Use model.AcceptanceData * [NOD-1420] Don't return accumulatedMassBefore in error cases * [NOD-1420] Don't expect store functions to return nil when the requested data was found - instead add HasXXX functions * [NOD-1420] addTransactionToMultiset sets isCoinbase properly * [NOD-1420] expected hash string length is externalapi.DomainHashSize * 2 * [NOD-1420] Rename reachabilityTree -> reachabilityManager + updateReindexRoot if isNextVirtualSelectedParent * [NOD-1420] ValidateCoinbaseTransaction in csm.verifyAndBuildUTXO * [NOD-1420] Re-write HAsUTXODiffChild * [NOD-1420] delete past_utxo.go.bak * [NOD-1420] Implement validateCoinbaseTransaction in CSM * [NOD-1420] Imlemented missing functionality in ValidateTransactionAndPopulateWithConsensusData * [NOD-1420] Moved merge depth logic to MergeDepthManager * [NOD-1420] Add logs
88 lines
1.9 KiB
Go
88 lines
1.9 KiB
Go
package hashserialization
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/binary"
|
|
"io"
|
|
|
|
"github.com/pkg/errors"
|
|
|
|
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
|
|
)
|
|
|
|
// outpointIndexByteOrder is the byte order for serializing the outpoint index.
|
|
// It uses big endian to ensure that when outpoint is used as database key, the
|
|
// keys will be iterated in an ascending order by the outpoint index.
|
|
var outpointIndexByteOrder = binary.BigEndian
|
|
|
|
// SerializeUTXO returns the byte-slice representation for given UTXOEntry
|
|
func SerializeUTXO(entry *externalapi.UTXOEntry, outpoint *externalapi.DomainOutpoint) ([]byte, error) {
|
|
w := &bytes.Buffer{}
|
|
|
|
err := serializeOutpoint(w, outpoint)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
err = serializeUTXOEntry(w, entry)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return w.Bytes(), nil
|
|
}
|
|
|
|
func serializeOutpoint(w io.Writer, outpoint *externalapi.DomainOutpoint) error {
|
|
_, err := w.Write(outpoint.TransactionID[:])
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var buf [4]byte
|
|
outpointIndexByteOrder.PutUint32(buf[:], outpoint.Index)
|
|
_, err = w.Write(buf[:])
|
|
if err != nil {
|
|
return errors.WithStack(err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func serializeUTXOEntry(w io.Writer, entry *externalapi.UTXOEntry) error {
|
|
buf := [8 + 1 + 8]byte{}
|
|
// Encode the blueScore.
|
|
binary.LittleEndian.PutUint64(buf[:8], entry.BlockBlueScore)
|
|
|
|
buf[8] = serializeUTXOEntryFlags(entry)
|
|
|
|
binary.LittleEndian.PutUint64(buf[9:], entry.Amount)
|
|
|
|
_, err := w.Write(buf[:])
|
|
if err != nil {
|
|
return errors.WithStack(err)
|
|
}
|
|
|
|
count := uint64(len(entry.ScriptPublicKey))
|
|
err = WriteElement(w, count)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
_, err = w.Write(entry.ScriptPublicKey)
|
|
if err != nil {
|
|
return errors.WithStack(err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func serializeUTXOEntryFlags(entry *externalapi.UTXOEntry) uint8 {
|
|
var serializedFlags uint8 = 0
|
|
|
|
if entry.IsCoinbase {
|
|
serializedFlags |= 1
|
|
}
|
|
|
|
return serializedFlags
|
|
}
|