Skip to content

Commit ecac16c

Browse files
committed
inv, genesis hash
1 parent 6d1dffe commit ecac16c

File tree

5 files changed

+253
-22
lines changed

5 files changed

+253
-22
lines changed

bitcoin.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,13 +99,12 @@ def initialize_configuration():
9999
"external_ip" : options.external_ip,
100100
"irc_timeout" : options.irc_timeout,
101101
"dns_seed" : options.dns.split(",") if options.dns else [],
102-
"genesis_hash" : genesis_hash.decode("hex_codec")[::-1],
102+
"genesis_hash" : genesis_hash.decode("hex_codec"),
103103
"event_loop_sleep" : 0.01,
104104
"event_loop_timeout" : 10,
105105
"nodes" : nodes,
106106
"irc" : irc,
107107
}
108-
109108
return config
110109

111110
def main():

context.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,18 @@
1212
class Context:
1313
def __init__(self, config):
1414
self.config = config
15-
self.blocks = []
16-
self.nodes = []
15+
self.blocks = {}
16+
self.transactions = {}
17+
self.nodes = set()
1718
self.addresses = [set(), set()] # Pending, All
1819
self.time_offset = 0
1920
self.time_ip_set = set()
2021
self.time_offset_list = [0]
2122
self.time_offset_median_tolerance = 70 * 60
2223
self.clock_error_displayed = False
2324
self.parser = parser.BParser()
24-
self.nodes = set()
25+
26+
#def load_blocks(self):
2527

2628
def get_dns_nodes(self):
2729
for host in self.config["dns_seed"]:
@@ -51,7 +53,6 @@ def event_loop(self):
5153
if self.config.get("irc", None):
5254
birc = irc.BIRCSeeder(self)
5355
uptime_wait = 10
54-
nodes = []
5556
if self.config["nodes"]:
5657
for node in self.config["nodes"]:
5758
self.add_node_address(node)

interface.glade

Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<glade-interface>
3+
<!-- interface-requires gtk+ 2.16 -->
4+
<!-- interface-naming-policy project-wide -->
5+
<widget class="GtkWindow" id="window1">
6+
<child>
7+
<widget class="GtkVBox" id="vbox1">
8+
<property name="visible">True</property>
9+
<child>
10+
<widget class="GtkMenuBar" id="menubar1">
11+
<property name="visible">True</property>
12+
<property name="ubuntu_local">True</property>
13+
<child>
14+
<widget class="GtkMenuItem" id="menuitem1">
15+
<property name="visible">True</property>
16+
<property name="label" translatable="yes">_File</property>
17+
<property name="use_underline">True</property>
18+
<child>
19+
<widget class="GtkMenu" id="menu1">
20+
<property name="visible">True</property>
21+
<property name="ubuntu_local">True</property>
22+
<child>
23+
<widget class="GtkImageMenuItem" id="imagemenuitem1">
24+
<property name="label">gtk-new</property>
25+
<property name="visible">True</property>
26+
<property name="use_underline">True</property>
27+
<property name="use_stock">True</property>
28+
</widget>
29+
</child>
30+
<child>
31+
<widget class="GtkImageMenuItem" id="imagemenuitem2">
32+
<property name="label">gtk-open</property>
33+
<property name="visible">True</property>
34+
<property name="use_underline">True</property>
35+
<property name="use_stock">True</property>
36+
</widget>
37+
</child>
38+
<child>
39+
<widget class="GtkImageMenuItem" id="imagemenuitem3">
40+
<property name="label">gtk-save</property>
41+
<property name="visible">True</property>
42+
<property name="use_underline">True</property>
43+
<property name="use_stock">True</property>
44+
</widget>
45+
</child>
46+
<child>
47+
<widget class="GtkImageMenuItem" id="imagemenuitem4">
48+
<property name="label">gtk-save-as</property>
49+
<property name="visible">True</property>
50+
<property name="use_underline">True</property>
51+
<property name="use_stock">True</property>
52+
</widget>
53+
</child>
54+
<child>
55+
<widget class="GtkSeparatorMenuItem" id="separatormenuitem1">
56+
<property name="visible">True</property>
57+
</widget>
58+
</child>
59+
<child>
60+
<widget class="GtkImageMenuItem" id="imagemenuitem5">
61+
<property name="label">gtk-quit</property>
62+
<property name="visible">True</property>
63+
<property name="use_underline">True</property>
64+
<property name="use_stock">True</property>
65+
</widget>
66+
</child>
67+
</widget>
68+
</child>
69+
</widget>
70+
</child>
71+
<child>
72+
<widget class="GtkMenuItem" id="menuitem2">
73+
<property name="visible">True</property>
74+
<property name="label" translatable="yes">_Edit</property>
75+
<property name="use_underline">True</property>
76+
<child>
77+
<widget class="GtkMenu" id="menu2">
78+
<property name="visible">True</property>
79+
<property name="ubuntu_local">True</property>
80+
<child>
81+
<widget class="GtkImageMenuItem" id="imagemenuitem6">
82+
<property name="label">gtk-cut</property>
83+
<property name="visible">True</property>
84+
<property name="use_underline">True</property>
85+
<property name="use_stock">True</property>
86+
</widget>
87+
</child>
88+
<child>
89+
<widget class="GtkImageMenuItem" id="imagemenuitem7">
90+
<property name="label">gtk-copy</property>
91+
<property name="visible">True</property>
92+
<property name="use_underline">True</property>
93+
<property name="use_stock">True</property>
94+
</widget>
95+
</child>
96+
<child>
97+
<widget class="GtkImageMenuItem" id="imagemenuitem8">
98+
<property name="label">gtk-paste</property>
99+
<property name="visible">True</property>
100+
<property name="use_underline">True</property>
101+
<property name="use_stock">True</property>
102+
</widget>
103+
</child>
104+
<child>
105+
<widget class="GtkImageMenuItem" id="imagemenuitem9">
106+
<property name="label">gtk-delete</property>
107+
<property name="visible">True</property>
108+
<property name="use_underline">True</property>
109+
<property name="use_stock">True</property>
110+
</widget>
111+
</child>
112+
</widget>
113+
</child>
114+
</widget>
115+
</child>
116+
<child>
117+
<widget class="GtkMenuItem" id="menuitem3">
118+
<property name="visible">True</property>
119+
<property name="label" translatable="yes">_View</property>
120+
<property name="use_underline">True</property>
121+
</widget>
122+
</child>
123+
<child>
124+
<widget class="GtkMenuItem" id="menuitem4">
125+
<property name="visible">True</property>
126+
<property name="label" translatable="yes">_Help</property>
127+
<property name="use_underline">True</property>
128+
<child>
129+
<widget class="GtkMenu" id="menu3">
130+
<property name="visible">True</property>
131+
<property name="ubuntu_local">True</property>
132+
<child>
133+
<widget class="GtkImageMenuItem" id="imagemenuitem10">
134+
<property name="label">gtk-about</property>
135+
<property name="visible">True</property>
136+
<property name="use_underline">True</property>
137+
<property name="use_stock">True</property>
138+
</widget>
139+
</child>
140+
</widget>
141+
</child>
142+
</widget>
143+
</child>
144+
</widget>
145+
<packing>
146+
<property name="expand">False</property>
147+
<property name="position">0</property>
148+
</packing>
149+
</child>
150+
<child>
151+
<widget class="GtkToolbar" id="toolbar1">
152+
<property name="visible">True</property>
153+
</widget>
154+
<packing>
155+
<property name="expand">False</property>
156+
<property name="position">1</property>
157+
</packing>
158+
</child>
159+
<child>
160+
<widget class="GtkEventBox" id="eventbox1">
161+
<property name="visible">True</property>
162+
<child>
163+
<placeholder/>
164+
</child>
165+
</widget>
166+
<packing>
167+
<property name="position">2</property>
168+
</packing>
169+
</child>
170+
<child>
171+
<widget class="GtkStatusbar" id="statusbar1">
172+
<property name="visible">True</property>
173+
<property name="spacing">2</property>
174+
</widget>
175+
<packing>
176+
<property name="expand">False</property>
177+
<property name="position">3</property>
178+
</packing>
179+
</child>
180+
</widget>
181+
</child>
182+
</widget>
183+
</glade-interface>

net.py

Lines changed: 59 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ def __init__(self, addr, context):
2121
"verack" : self.pop_verack,
2222
"addr" : self.pop_addr,
2323
"block" : self.pop_block,
24+
"inv" : self.pop_inv,
2425
}
2526
self.incoming_handler = None
2627
self.reset_incoming_data()
@@ -36,7 +37,15 @@ def checksum(self, data):
3637
h = base58.checksum(data)
3738
return h[:4]
3839

40+
def verify_checksum(self, data):
41+
checksum, data = self.pop_checksum(data)
42+
real_checksum = self.checksum(data)
43+
if checksum == real_checksum:
44+
return data
45+
return None
46+
3947
def collect_incoming_data(self, data):
48+
#logging.debug("collect_incoming_data %s", len(data))
4049
self.incoming_data += data
4150
self.last_seen = self.context.get_system_time()
4251

@@ -59,14 +68,15 @@ def found_terminator(self):
5968
try:
6069
if self.incoming_handler():
6170
self.close()
71+
#logging.debug("set_terminator %s", self.header_size)
6272
self.set_terminator(self.header_size)
6373
except:
6474
logging.exception("incoming handler")
6575
self.close()
6676
return
6777
network, command, paylen = self.unpack_incoming_header()
6878
if network != self.context.config["network"]:
69-
logging.error("received garbage from %s", connection.addr)
79+
logging.error("received garbage from %s", self.addr)
7080
self.close()
7181
return
7282
handler = self.incoming_handlers.get(command, None)
@@ -77,6 +87,7 @@ def found_terminator(self):
7787
logging.debug("received %s paylen %s", command, paylen)
7888
if paylen == 0:
7989
handler()
90+
self.set_terminator(self.header_size)
8091
else:
8192
self.incoming_handler = handler
8293
csize = 0
@@ -88,11 +99,14 @@ def push_packet(self, command, data=""):
8899
size = len(data)
89100
header = struct.pack("<L12sL", self.context.config["network"], command, size)
90101
if size > 0 and command not in ("version", "verack"):
91-
header += self.checksum(data)
102+
c = self.checksum(data)
103+
#logging.debug("checksum: %s", c.encode("hex_codec"))
104+
header += c
92105
self.push(header)
93-
logging.debug("push_packet header: %s (%s)", command, len(header))
106+
#logging.debug("push_packet header: %s (%s)", command, len(header))
94107
if size > 0:
95108
self.push(data)
109+
#logging.debug("push_packet data: \n%s", data.encode("hex_codec"))
96110

97111
def push_version(self):
98112
remote = self.context.parser.pack_address(
@@ -140,7 +154,7 @@ def push_verack(self):
140154
def pop_verack(self):
141155
logging.debug("pop_verack")
142156
self.incoming_handler = None
143-
#self.push_getaddr()
157+
logging.debug
144158
self.push_getblocks([self.context.config["genesis_hash"]])
145159

146160
def push_getaddr(self):
@@ -150,32 +164,61 @@ def push_getaddr(self):
150164
def pop_addr(self):
151165
logging.debug("pop_addr")
152166
self.incoming_handler = None
153-
checksum, data = self.incoming_data[:4], self.incoming_data[4:]
154-
if checksum != self.checksum(data):
155-
logging.error("checksum mismatch")
167+
data = self.verify_checksum(self.incoming_data)
168+
if not data:
169+
logging.error("checksum failure")
156170
return True
157-
logging.debug("checksum matches")
158171

159172
def push_getblocks(self,hash_starts,hash_stop=None):
160173
if not hash_stop:
161174
hash_stop = "\0" * 32
162-
starts = "".join(hash_starts)
175+
starts = ""
176+
for start in hash_starts:
177+
starts += start[::-1]
163178
vector = self.context.parser.pack_variable_int(len(hash_starts)) + starts
164179
data = struct.pack("<i", self.context.config["version"])
165-
self.push_packet("getblocks", data + vector + hash_stop)
180+
packet = data + vector + hash_stop
181+
self.push_packet("getblocks", packet)
182+
183+
def pop_checksum(self, data):
184+
return data[:4], data[4:]
166185

167186
def pop_block(self):
168187
logging.debug("pop_block")
169188
self.incoming_handler = None
170-
checksum, data = self.incoming_data[:4], self.incoming_data[4:]
171-
real_checksum = self.checksum(data)
172-
logging.debug("%s %s", checksum.encode("hex_codec"), real_checksum.encode("hex_codec"))
173-
if checksum != real_checksum:
174-
logging.error("checksum mismatch")
189+
data = self.verify_checksum(self.incoming_data)
190+
if not data:
191+
logging.error("checksum failure")
175192
return True
176-
logging.debug("checksum matches")
177193
h = base58.checksum(data[:4+32+32+4+4+4])
178194
block, data = self.context.parser.unpack_block(data)
179195
logging.debug("block: %s %s", h.encode("hex_codec"), block)
180196
self.incoming_data = data
181197

198+
def push_inv(self):
199+
pass
200+
201+
def pop_inv(self):
202+
logging.debug("pop_inv")
203+
self.incoming_handler = None
204+
data = self.verify_checksum(self.incoming_data)
205+
if not data:
206+
logging.error("checksum failure")
207+
return True
208+
size, data = self.context.parser.unpack_variable_int(data)
209+
logging.debug("inv size: %s", size)
210+
invs = []
211+
for i in range(size):
212+
inv, data = self.context.parser.unpack_inv(data)
213+
if inv[0] == 0:
214+
logging.error("invalid invector vector")
215+
self.close()
216+
return
217+
if inv[0] == 1:
218+
storage = self.context.transactions
219+
if inv[0] == 2:
220+
storage = self.context.blocks
221+
storage[inv[1]] = storage.get(inv[1], {})
222+
logging.debug("received inv %s %s", inv[0], inv[1].encode("hex_codec"))
223+
self.incoming_data = data
224+

parser.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,8 @@ def unpack_transaction(self, data):
8989
tx = (version, tx_in, tx_out, lock_time)
9090
return tx, data
9191

92+
def unpack_inv(self, data):
93+
(hash_type,), data = self.unpack("<L", data)
94+
hash_val = data[:32]
95+
return (hash_type, hash_val[::-1]), data[32:]
96+

0 commit comments

Comments
 (0)