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)
| 696 | return super(CScript, cls).__new__(cls, b''.join(coerce_iterable(value))) |
| 697 | |
| 698 | def raw_iter(self): |
| 699 | """Raw iteration |
| 700 | |
| 701 | Yields tuples of (opcode, data, sop_idx) so that the different possible |
| 702 | PUSHDATA encodings can be accurately distinguished, as well as |
| 703 | determining the exact opcode byte indexes. (sop_idx) |
| 704 | """ |
| 705 | i = 0 |
| 706 | while i < len(self): |
| 707 | sop_idx = i |
| 708 | opcode = bord(self[i]) |
| 709 | i += 1 |
| 710 | |
| 711 | if opcode > OP_PUSHDATA4: |
| 712 | yield (opcode, None, sop_idx) |
| 713 | else: |
| 714 | datasize = None |
| 715 | pushdata_type = None |
| 716 | if opcode < OP_PUSHDATA1: |
| 717 | pushdata_type = 'PUSHDATA(%d)' % opcode |
| 718 | datasize = opcode |
| 719 | |
| 720 | elif opcode == OP_PUSHDATA1: |
| 721 | pushdata_type = 'PUSHDATA1' |
| 722 | if i >= len(self): |
| 723 | raise CScriptInvalidError('PUSHDATA1: missing data length') |
| 724 | datasize = bord(self[i]) |
| 725 | i += 1 |
| 726 | |
| 727 | elif opcode == OP_PUSHDATA2: |
| 728 | pushdata_type = 'PUSHDATA2' |
| 729 | if i + 1 >= len(self): |
| 730 | raise CScriptInvalidError('PUSHDATA2: missing data length') |
| 731 | datasize = bord(self[i]) + (bord(self[i+1]) << 8) |
| 732 | i += 2 |
| 733 | |
| 734 | elif opcode == OP_PUSHDATA4: |
| 735 | pushdata_type = 'PUSHDATA4' |
| 736 | if i + 3 >= len(self): |
| 737 | raise CScriptInvalidError('PUSHDATA4: missing data length') |
| 738 | datasize = bord(self[i]) + (bord(self[i+1]) << 8) + (bord(self[i+2]) << 16) + (bord(self[i+3]) << 24) |
| 739 | i += 4 |
| 740 | |
| 741 | else: |
| 742 | assert False # shouldn't happen |
| 743 | |
| 744 | |
| 745 | data = bytes(self[i:i+datasize]) |
| 746 | |
| 747 | # Check for truncation |
| 748 | if len(data) < datasize: |
| 749 | raise CScriptTruncatedPushDataError('%s: truncated data' % pushdata_type, data) |
| 750 | |
| 751 | i += datasize |
| 752 | |
| 753 | yield (opcode, data, sop_idx) |
| 754 | |
| 755 | def __iter__(self): |
no test coverage detected