PoolBlockReceptionMetadata binary marshaler
This commit is contained in:
parent
63bd8124a5
commit
6a7cb676aa
|
@ -16,6 +16,7 @@ import (
|
||||||
"git.gammaspectra.live/P2Pool/consensus/v3/types"
|
"git.gammaspectra.live/P2Pool/consensus/v3/types"
|
||||||
"git.gammaspectra.live/P2Pool/consensus/v3/utils"
|
"git.gammaspectra.live/P2Pool/consensus/v3/utils"
|
||||||
fasthex "github.com/tmthrgd/go-hex"
|
fasthex "github.com/tmthrgd/go-hex"
|
||||||
|
"io"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
"slices"
|
"slices"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
|
@ -102,6 +103,77 @@ type PoolBlockReceptionMetadata struct {
|
||||||
SoftwareVersion uint32 `json:"software_version"`
|
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 {
|
func (b *PoolBlock) iteratorGetParent(getByTemplateId GetByTemplateIdFunc) *PoolBlock {
|
||||||
if b.iterationCache == nil {
|
if b.iterationCache == nil {
|
||||||
return getByTemplateId(b.Side.Parent)
|
return getByTemplateId(b.Side.Parent)
|
||||||
|
|
|
@ -5,9 +5,13 @@ import (
|
||||||
"git.gammaspectra.live/P2Pool/consensus/v3/monero/client"
|
"git.gammaspectra.live/P2Pool/consensus/v3/monero/client"
|
||||||
"git.gammaspectra.live/P2Pool/consensus/v3/monero/crypto"
|
"git.gammaspectra.live/P2Pool/consensus/v3/monero/crypto"
|
||||||
"git.gammaspectra.live/P2Pool/consensus/v3/monero/randomx"
|
"git.gammaspectra.live/P2Pool/consensus/v3/monero/randomx"
|
||||||
|
types2 "git.gammaspectra.live/P2Pool/consensus/v3/p2pool/types"
|
||||||
"git.gammaspectra.live/P2Pool/consensus/v3/types"
|
"git.gammaspectra.live/P2Pool/consensus/v3/types"
|
||||||
|
unsafeRandom "math/rand/v2"
|
||||||
|
"net/netip"
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"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) {
|
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) {
|
func TestPoolBlockDecode(t *testing.T) {
|
||||||
|
|
||||||
if buf, err := os.ReadFile("testdata/block.dat"); err != nil {
|
if buf, err := os.ReadFile("testdata/block.dat"); err != nil {
|
||||||
|
|
Loading…
Reference in a new issue