kaspad/domain/utxoindex/serialization.go
Ori Newman 2adb4f5d0f
Fix UTXO index (#1548)
* Add VirtualUTXODiff and VirtualParents to block insertion result

* Add GetVirtualUTXOs

* Add OnPruningPointUTXOSetOverrideHandler

* Add recovery to UTXO index

* Add UTXO set override notification

* Fix compilation error

* Fix iterators in UTXO index and fix TestUTXOIndex

* Change Dialing to DEBUG

* Change LogBlock location

* Rename StopNotify to StopNotifying

* Add sanity check

* Add comment

* Remove receiver from serialization functions

Co-authored-by: Elichai Turkel <elichai.turkel@gmail.com>
2021-02-23 16:51:51 +02:00

75 lines
2.3 KiB
Go

package utxoindex
import (
"encoding/binary"
"github.com/kaspanet/kaspad/domain/consensus/database/serialization"
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
"github.com/pkg/errors"
"google.golang.org/protobuf/proto"
"io"
)
func serializeOutpoint(outpoint *externalapi.DomainOutpoint) ([]byte, error) {
dbOutpoint := serialization.DomainOutpointToDbOutpoint(outpoint)
return proto.Marshal(dbOutpoint)
}
func deserializeOutpoint(serializedOutpoint []byte) (*externalapi.DomainOutpoint, error) {
var dbOutpoint serialization.DbOutpoint
err := proto.Unmarshal(serializedOutpoint, &dbOutpoint)
if err != nil {
return nil, err
}
return serialization.DbOutpointToDomainOutpoint(&dbOutpoint)
}
func serializeUTXOEntry(utxoEntry externalapi.UTXOEntry) ([]byte, error) {
dbUTXOEntry := serialization.UTXOEntryToDBUTXOEntry(utxoEntry)
return proto.Marshal(dbUTXOEntry)
}
func deserializeUTXOEntry(serializedUTXOEntry []byte) (externalapi.UTXOEntry, error) {
var dbUTXOEntry serialization.DbUtxoEntry
err := proto.Unmarshal(serializedUTXOEntry, &dbUTXOEntry)
if err != nil {
return nil, err
}
return serialization.DBUTXOEntryToUTXOEntry(&dbUTXOEntry)
}
const hashesLengthSize = 8
func serializeHashes(hashes []*externalapi.DomainHash) []byte {
serializedHashes := make([]byte, hashesLengthSize+externalapi.DomainHashSize*len(hashes))
binary.LittleEndian.PutUint64(serializedHashes[:hashesLengthSize], uint64(len(hashes)))
for i, hash := range hashes {
start := hashesLengthSize + externalapi.DomainHashSize*i
end := start + externalapi.DomainHashSize
copy(serializedHashes[start:end],
hash.ByteSlice())
}
return serializedHashes
}
func deserializeHashes(serializedHashes []byte) ([]*externalapi.DomainHash, error) {
length := binary.LittleEndian.Uint64(serializedHashes[:hashesLengthSize])
hashes := make([]*externalapi.DomainHash, length)
for i := uint64(0); i < length; i++ {
start := hashesLengthSize + externalapi.DomainHashSize*i
end := start + externalapi.DomainHashSize
if end > uint64(len(serializedHashes)) {
return nil, errors.Wrapf(io.ErrUnexpectedEOF, "unexpected EOF while deserializing hashes")
}
var err error
hashes[i], err = externalapi.
NewDomainHashFromByteSlice(serializedHashes[start:end])
if err != nil {
return nil, err
}
}
return nil, nil
}