diff --git a/kernel/block_header.go b/kernel/block_header.go index 9553fa3..9e2770e 100644 --- a/kernel/block_header.go +++ b/kernel/block_header.go @@ -83,3 +83,17 @@ func (bh *BlockHeader) Version() int32 { func (bh *BlockHeader) Nonce() uint32 { return uint32(C.btck_block_header_get_nonce((*C.btck_BlockHeader)(bh.ptr))) } + +// Bytes returns the consensus serialized representation of the block header. +// +// Returns an error if the serialization fails. +func (bh *BlockHeader) Bytes() ([80]byte, error) { + var buf [80]byte + if C.btck_block_header_to_bytes( + (*C.btck_BlockHeader)(bh.ptr), + (*C.uchar)(unsafe.Pointer(&buf[0])), + ) != 0 { + return [80]byte{}, &SerializationError{"Failed to serialize block header"} + } + return buf, nil +} diff --git a/kernel/block_header_test.go b/kernel/block_header_test.go index 5ec259f..4cda89a 100644 --- a/kernel/block_header_test.go +++ b/kernel/block_header_test.go @@ -120,4 +120,15 @@ func TestBlockHeader(t *testing.T) { t.Errorf("Expected nonce %d, got %d", expectedNonce, nonce) } }) + + t.Run("Bytes", func(t *testing.T) { + serialized, err := header.Bytes() + if err != nil { + t.Fatalf("Bytes() error = %v", err) + } + serializedStr := hex.EncodeToString(serialized[:]) + if serializedStr != genesisHeaderHex { + t.Errorf("Serialized header doesn't match original.\nExpected: %s\nGot: %s", genesisHeaderHex, serializedStr) + } + }) }