1 from p2pool.util import math, pack
6 return lambda f: pack.read(f, length)
7 def protoPUSHDATA(size_len):
9 length_str, f = pack.read(f, size_len)
10 length = math.string_to_natural(length_str[::-1].lstrip(chr(0)))
11 data, f = pack.read(f, length)
17 opcodes[i] = 'UNK_' + str(i), reads_nothing
19 opcodes[0] = '0', reads_nothing
20 for i in xrange(1, 76):
21 opcodes[i] = 'PUSH%i' % i, protoPUSH(i)
22 opcodes[76] = 'PUSHDATA1', protoPUSHDATA(1)
23 opcodes[77] = 'PUSHDATA2', protoPUSHDATA(2)
24 opcodes[78] = 'PUSHDATA4', protoPUSHDATA(4)
25 opcodes[79] = '-1', reads_nothing
26 for i in xrange(81, 97):
27 opcodes[i] = str(i - 80), reads_nothing
29 opcodes[172] = 'CHECKSIG', reads_nothing
30 opcodes[173] = 'CHECKSIGVERIFY', reads_nothing
31 opcodes[174] = 'CHECKMULTISIG', reads_nothing
32 opcodes[175] = 'CHECKMULTISIGVERIFY', reads_nothing
37 opcode_str, f = pack.read(f, 1)
38 opcode = ord(opcode_str)
39 opcode_name, read_func = opcodes[opcode]
40 opcode_arg, f = read_func(f)
41 yield opcode_name, opcode_arg
43 def get_sigop_count(script):
48 'CHECKMULTISIGVERIFY': 20,
50 return sum(weights.get(opcode_name, 0) for opcode_name, opcode_arg in parse(script))