Completed
Pull Request — master (#324)
by thomas
18:01
created

BlockHeaderSerializer   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 77
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 6

Test Coverage

Coverage 100%

Importance

Changes 3
Bugs 0 Features 0
Metric Value
c 3
b 0
f 0
dl 0
loc 77
ccs 34
cts 34
cp 1
rs 10
wmc 6
lcom 1
cbo 6

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A parse() 0 4 1
A getTemplate() 0 11 1
A fromParser() 0 18 2
A serialize() 0 11 1
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