|
5 | 5 | namespace AndKom\Bitcoin\Blockchain\Script; |
6 | 6 |
|
7 | 7 | use AndKom\BCDataStream\Reader; |
| 8 | +use AndKom\Bitcoin\Blockchain\Exception\ScriptException; |
8 | 9 |
|
9 | 10 | /** |
10 | 11 | * Class Script |
@@ -87,31 +88,39 @@ public function parse(): array |
87 | 88 | return $this->operations; |
88 | 89 | } |
89 | 90 |
|
| 91 | + if (!$this->data) { |
| 92 | + throw new ScriptException('Empty script.'); |
| 93 | + } |
| 94 | + |
90 | 95 | $this->operations = []; |
91 | 96 | $stream = new Reader($this->data); |
92 | 97 |
|
93 | | - while ($stream->getPosition() < $stream->getSize()) { |
94 | | - $code = ord($stream->read(1)); |
95 | | - $data = null; |
96 | | - $size = 0; |
97 | | - |
98 | | - if ($code == Opcodes::OP_0) { |
99 | | - $data = ''; |
100 | | - } elseif ($code >= 0x01 && $code <= 0x4b) { |
101 | | - $data = $stream->read($code); |
102 | | - $size = $code; |
103 | | - } elseif ($code >= Opcodes::OP_PUSHDATA1 && $code <= Opcodes::OP_PUSHDATA4) { |
104 | | - $size = $stream->readCompactSize(); |
105 | | - $data = $stream->read($size); |
106 | | - } elseif ($code == Opcodes::OP_1NEGATE) { |
107 | | - $data = chr(-1); |
108 | | - $size = 1; |
109 | | - } elseif ($code >= Opcodes::OP_1 && $code <= Opcodes::OP_16) { |
110 | | - $data = chr($code - Opcodes::OP_1 + 1); |
111 | | - $size = 1; |
| 98 | + try { |
| 99 | + while ($stream->getPosition() < $stream->getSize()) { |
| 100 | + $code = ord($stream->read(1)); |
| 101 | + $data = null; |
| 102 | + $size = 0; |
| 103 | + |
| 104 | + if ($code == Opcodes::OP_0) { |
| 105 | + $data = ''; |
| 106 | + } elseif ($code >= 0x01 && $code <= 0x4b) { |
| 107 | + $data = $stream->read($code); |
| 108 | + $size = $code; |
| 109 | + } elseif ($code >= Opcodes::OP_PUSHDATA1 && $code <= Opcodes::OP_PUSHDATA4) { |
| 110 | + $size = $stream->readCompactSize(); |
| 111 | + $data = $stream->read($size); |
| 112 | + } elseif ($code == Opcodes::OP_1NEGATE) { |
| 113 | + $data = chr(-1); |
| 114 | + $size = 1; |
| 115 | + } elseif ($code >= Opcodes::OP_1 && $code <= Opcodes::OP_16) { |
| 116 | + $data = chr($code - Opcodes::OP_1 + 1); |
| 117 | + $size = 1; |
| 118 | + } |
| 119 | + |
| 120 | + $this->operations[] = new Operation($code, $data, $size); |
112 | 121 | } |
113 | | - |
114 | | - $this->operations[] = new Operation($code, $data, $size); |
| 122 | + } catch (\Exception $exception) { |
| 123 | + throw new ScriptException('Script parse error.', 0, $exception); |
115 | 124 | } |
116 | 125 |
|
117 | 126 | return $this->operations; |
|
0 commit comments