Completed
Push — master ( 29ec42...778040 )
by thomas
9s
created

BlockHeaderSerializer::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 2
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 4
ccs 3
cts 3
cp 1
crap 1
rs 10
1
<?php
2
3
namespace BitWasp\Bitcoin\Serializer\Block;
4
5
use BitWasp\Buffertools\Exceptions\ParserOutOfRange;
6
use BitWasp\Buffertools\Parser;
7
use BitWasp\Bitcoin\Block\BlockHeader;
8
use BitWasp\Bitcoin\Block\BlockHeaderInterface;
9
use BitWasp\Buffertools\TemplateFactory;
10
11
class BlockHeaderSerializer
12
{
13
    /**
14
     * @var \BitWasp\Buffertools\Template
15
     */
16
    private $template;
17
18 621
    public function __construct()
19
    {
20 621
        $this->template = $this->getTemplate();
21 621
    }
22
23
    /**
24
     * @param \BitWasp\Buffertools\BufferInterface|string $string
25
     * @return BlockHeader
26
     * @throws ParserOutOfRange
27
     */
28 15
    public function parse($string)
29
    {
30 15
        return $this->fromParser(new Parser($string));
31
    }
32
33
    /**
34
     * @return \BitWasp\Buffertools\Template
35
     */
36 621
    public function getTemplate()
37
    {
38 621
        return (new TemplateFactory())
39 621
            ->int32le()
40 621
            ->bytestringle(32)
41 621
            ->bytestringle(32)
42 621
            ->uint32le()
43 621
            ->uint32le()
44 621
            ->uint32le()
45 621
            ->getTemplate();
46
    }
47
48
    /**
49
     * @param Parser $parser
50
     * @return BlockHeader
51
     * @throws ParserOutOfRange
52
     */
53 54
    public function fromParser(Parser $parser)
54
    {
55
56
        try {
57 54
            list ($version, $prevHash, $merkleHash, $time, $nBits, $nonce) = $this->template->parse($parser);
58
59 45
            return new BlockHeader(
60 30
                $version,
61 30
                $prevHash,
62 30
                $merkleHash,
63 30
                $time,
64 45
                (int) $nBits,
65
                $nonce
66 30
            );
67 9
        } catch (ParserOutOfRange $e) {
68 9
            throw new ParserOutOfRange('Failed to extract full block header from parser');
69
        }
70
    }
71
72
    /**
73
     * @param BlockHeaderInterface $header
74
     * @return \BitWasp\Buffertools\BufferInterface
75
     */
76 594
    public function serialize(BlockHeaderInterface $header)
77
    {
78 594
        return $this->template->write([
79 594
            $header->getVersion(),
80 594
            $header->getPrevBlock(),
81 594
            $header->getMerkleRoot(),
82 594
            $header->getTimestamp(),
83 594
            $header->getBits(),
84 594
            $header->getNonce()
85 396
        ]);
86
    }
87
}
88