PoolBlockReceptionMetadata binary marshaler
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing

This commit is contained in:
DataHoarder 2024-04-13 06:37:34 +02:00
parent 63bd8124a5
commit 6a7cb676aa
Signed by: DataHoarder
SSH key fingerprint: SHA256:OLTRf6Fl87G52SiR7sWLGNzlJt4WOX+tfI2yxo0z7xk
2 changed files with 101 additions and 0 deletions

View file

@ -16,6 +16,7 @@ import (
"git.gammaspectra.live/P2Pool/consensus/v3/types"
"git.gammaspectra.live/P2Pool/consensus/v3/utils"
fasthex "github.com/tmthrgd/go-hex"
"io"
"net/netip"
"slices"
"sync/atomic"
@ -102,6 +103,77 @@ type PoolBlockReceptionMetadata struct {
SoftwareVersion uint32 `json:"software_version"`
}
func (m *PoolBlockReceptionMetadata) UnmarshalBinary(buf []byte) error {
r := bytes.NewReader(buf)
s, err := binary.ReadUvarint(r)
if err != nil {
return err
}
ns, err := binary.ReadUvarint(r)
if err != nil {
return err
}
m.LocalTime = time.Unix(int64(s), int64(ns)).UTC()
l, err := binary.ReadUvarint(r)
if err != nil {
return err
}
ip := make([]byte, l)
_, err = io.ReadFull(r, ip)
if err != nil {
return err
}
err = m.AddressPort.UnmarshalBinary(ip)
if err != nil {
return err
}
m.PeerId, err = binary.ReadUvarint(r)
if err != nil {
return err
}
sId, err := binary.ReadUvarint(r)
if err != nil {
return err
}
sVer, err := binary.ReadUvarint(r)
if err != nil {
return err
}
m.SoftwareId = uint32(sId)
m.SoftwareVersion = uint32(sVer)
return nil
}
func (m *PoolBlockReceptionMetadata) MarshalBinary() ([]byte, error) {
s := uint64(m.LocalTime.Unix())
ns := uint64(m.LocalTime.Nanosecond())
ip, _ := m.AddressPort.MarshalBinary()
out := make([]byte, 0,
utils.UVarInt64Size(s)+utils.UVarInt64Size(ns)+
utils.UVarInt64Size(len(ip))+len(ip)+
utils.UVarInt64Size(m.PeerId)+
utils.UVarInt64Size(uint64(m.SoftwareId))+
utils.UVarInt64Size(uint64(m.SoftwareVersion)))
out = binary.AppendUvarint(out, s)
out = binary.AppendUvarint(out, ns)
out = binary.AppendUvarint(out, uint64(len(ip)))
out = append(out, ip...)
out = binary.AppendUvarint(out, m.PeerId)
out = binary.AppendUvarint(out, uint64(m.SoftwareId))
out = binary.AppendUvarint(out, uint64(m.SoftwareVersion))
return out, nil
}
func (b *PoolBlock) iteratorGetParent(getByTemplateId GetByTemplateIdFunc) *PoolBlock {
if b.iterationCache == nil {
return getByTemplateId(b.Side.Parent)

View file

@ -5,9 +5,13 @@ import (
"git.gammaspectra.live/P2Pool/consensus/v3/monero/client"
"git.gammaspectra.live/P2Pool/consensus/v3/monero/crypto"
"git.gammaspectra.live/P2Pool/consensus/v3/monero/randomx"
types2 "git.gammaspectra.live/P2Pool/consensus/v3/p2pool/types"
"git.gammaspectra.live/P2Pool/consensus/v3/types"
unsafeRandom "math/rand/v2"
"net/netip"
"os"
"testing"
"time"
)
func testPoolBlock(b *PoolBlock, t *testing.T, expectedBufferLength int, majorVersion, minorVersion uint8, sideHeight uint64, nonce uint32, templateId, mainId, expectedPowHash, privateKeySeed, coinbaseId types.Hash, privateKey crypto.PrivateKeyBytes) {
@ -77,6 +81,31 @@ func testPoolBlock(b *PoolBlock, t *testing.T, expectedBufferLength int, majorVe
}
}
func TestPoolBlockMetadata(t *testing.T) {
meta := PoolBlockReceptionMetadata{
LocalTime: time.Now().UTC(),
AddressPort: netip.AddrPortFrom(netip.AddrFrom4([4]byte{127, 0, 0, 1}), 1234),
PeerId: unsafeRandom.Uint64(),
SoftwareId: uint32(types2.CurrentSoftwareId),
SoftwareVersion: uint32(types2.CurrentSoftwareVersion),
}
blob, err := meta.MarshalBinary()
if err != nil {
t.Fatal(err)
}
var meta2 PoolBlockReceptionMetadata
err = meta2.UnmarshalBinary(blob)
if err != nil {
t.Fatal(err)
}
if meta != meta2 {
t.Errorf("different metadata: %v, %v", meta, meta2)
}
}
func TestPoolBlockDecode(t *testing.T) {
if buf, err := os.ReadFile("testdata/block.dat"); err != nil {