Raw iteration Yields tuples of (opcode, data, sop_idx) so that the different possible PUSHDATA encodings can be accurately distinguished, as well as determining the exact opcode byte indexes. (sop_idx)
(self)
| 553 | return super(CScript, cls).__new__(cls, b''.join(coerce_iterable(value))) |
| 554 | |
| 555 | def raw_iter(self): |
| 556 | """Raw iteration |
| 557 | |
| 558 | Yields tuples of (opcode, data, sop_idx) so that the different possible |
| 559 | PUSHDATA encodings can be accurately distinguished, as well as |
| 560 | determining the exact opcode byte indexes. (sop_idx) |
| 561 | """ |
| 562 | i = 0 |
| 563 | while i < len(self): |
| 564 | sop_idx = i |
| 565 | opcode = self[i] |
| 566 | i += 1 |
| 567 | |
| 568 | if opcode > OP_PUSHDATA4: |
| 569 | yield (opcode, None, sop_idx) |
| 570 | else: |
| 571 | datasize = None |
| 572 | pushdata_type = None |
| 573 | if opcode < OP_PUSHDATA1: |
| 574 | pushdata_type = 'PUSHDATA(%d)' % opcode |
| 575 | datasize = opcode |
| 576 | |
| 577 | elif opcode == OP_PUSHDATA1: |
| 578 | pushdata_type = 'PUSHDATA1' |
| 579 | if i >= len(self): |
| 580 | raise CScriptInvalidError('PUSHDATA1: missing data length') |
| 581 | datasize = self[i] |
| 582 | i += 1 |
| 583 | |
| 584 | elif opcode == OP_PUSHDATA2: |
| 585 | pushdata_type = 'PUSHDATA2' |
| 586 | if i + 1 >= len(self): |
| 587 | raise CScriptInvalidError('PUSHDATA2: missing data length') |
| 588 | datasize = self[i] + (self[i+1] << 8) |
| 589 | i += 2 |
| 590 | |
| 591 | elif opcode == OP_PUSHDATA4: |
| 592 | pushdata_type = 'PUSHDATA4' |
| 593 | if i + 3 >= len(self): |
| 594 | raise CScriptInvalidError('PUSHDATA4: missing data length') |
| 595 | datasize = self[i] + (self[i+1] << 8) + (self[i+2] << 16) + (self[i+3] << 24) |
| 596 | i += 4 |
| 597 | |
| 598 | else: |
| 599 | assert False # shouldn't happen |
| 600 | |
| 601 | |
| 602 | data = bytes(self[i:i+datasize]) |
| 603 | |
| 604 | # Check for truncation |
| 605 | if len(data) < datasize: |
| 606 | raise CScriptTruncatedPushDataError('%s: truncated data' % pushdata_type, data) |
| 607 | |
| 608 | i += datasize |
| 609 | |
| 610 | yield (opcode, data, sop_idx) |
| 611 | |
| 612 | def __iter__(self): |
no test coverage detected