1 from p2pool.bitcoin import data as bitcoin_data
2 from p2pool.util import bases
7 return lambda f: bitcoin_data.read(f, length)
8 def protoPUSHDATA(size_len):
10 length_str, f = bitcoin_data.read(f, size_len)
11 length = bases.string_to_natural(length_str[::-1].lstrip(chr(0)))
12 data, f = bitcoin_data.read(f, length)
18 opcodes[i] = 'UNK_' + str(i), reads_nothing
20 opcodes[0] = '0', reads_nothing
21 for i in xrange(1, 76):
22 opcodes[i] = 'PUSH%i' % i, protoPUSH(i)
23 opcodes[76] = 'PUSHDATA1', protoPUSHDATA(1)
24 opcodes[77] = 'PUSHDATA2', protoPUSHDATA(2)
25 opcodes[78] = 'PUSHDATA4', protoPUSHDATA(4)
26 opcodes[79] = '-1', reads_nothing
27 for i in xrange(81, 97):
28 opcodes[i] = str(i - 80), reads_nothing
30 opcodes[172] = 'CHECKSIG', reads_nothing
31 opcodes[173] = 'CHECKSIGVERIFY', reads_nothing
32 opcodes[174] = 'CHECKMULTISIG', reads_nothing
33 opcodes[175] = 'CHECKMULTISIGVERIFY', reads_nothing
37 while bitcoin_data.size(f):
38 opcode_str, f = bitcoin_data.read(f, 1)
39 opcode = ord(opcode_str)
40 opcode_name, read_func = opcodes[opcode]
41 opcode_arg, f = read_func(f)
42 yield opcode_name, opcode_arg
44 def get_sigop_count(script):
49 'CHECKMULTISIGVERIFY': 20,
51 return sum(weights.get(opcode_name, 0) for opcode_name, opcode_arg in parse(script))