MCPcopy Index your code
hub / github.com/petertodd/python-bitcoinlib / raw_iter

Method raw_iter

bitcoin/core/script.py:555–610  ·  view source on GitHub ↗

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)

Source from the content-addressed store, hash-verified

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):

Callers 6

__iter__Method · 0.95
is_push_onlyMethod · 0.95
has_canonical_pushesMethod · 0.95
GetSigOpCountMethod · 0.95
_EvalScriptFunction · 0.80
FindAndDeleteFunction · 0.80

Calls 2

CScriptInvalidErrorClass · 0.85

Tested by

no test coverage detected