import bitcoin
import time
class Application:
def __init__(self):
self.stopped = False
self.net = bitcoin.network()
self.channel = None
def start(self):
self.net.connect("localhost", 8333, self.handle_connect)
def stop(self):
self.stopped = True
def is_stopped(self):
return self.stopped
def create_version_message(self):
vers = bitcoin.version()
vers.version = 60000
vers.services = 1
vers.address_me.servies = 1
vers.address_me.ip = \
[0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 255, 255, 127, 0, 0, 1]
vers.address_me.port = 8333
vers.address_you.services = 1
vers.address_you.ip = \
[0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 255, 255, 127, 0, 0, 1]
vers.address_you.port = 8333
vers.user_agent = "/libbitcoin:0.4/example:1/";
vers.start_height = 0
vers.nonce = 42
return vers
# First we send our version message then the node will reply back
def handle_connect(self, ec, channel):
# check the error_code
if ec:
print 'Could not connect:', ec
self.stop()
return
self.channel = channel
version_message = self.create_version_message()
self.channel.send_version(version_message, self.handle_send)
self.channel.subscribe_version(self.read_version_reply)
def handle_send(self, ec):
if ec:
print 'Problem sending:', ec
self.stop()
def read_version_reply(self, ec, vers):
if ec:
print 'Problem in reply:', ec
self.stop()
return
# Display the version message back
print vers.address_me.ip
self.stop()
if __name__ == "__main__":
app = Application()
app.start()
while not app.is_stopped():
time.sleep(0.1)
aW1wb3J0IGJpdGNvaW4KaW1wb3J0IHRpbWUKCmNsYXNzIEFwcGxpY2F0aW9uOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLnN0b3BwZWQgPSBGYWxzZQogICAgICAgIHNlbGYubmV0ID0gYml0Y29pbi5uZXR3b3JrKCkKICAgICAgICBzZWxmLmNoYW5uZWwgPSBOb25lCgogICAgZGVmIHN0YXJ0KHNlbGYpOgogICAgICAgIHNlbGYubmV0LmNvbm5lY3QoImxvY2FsaG9zdCIsIDgzMzMsIHNlbGYuaGFuZGxlX2Nvbm5lY3QpCgogICAgZGVmIHN0b3Aoc2VsZik6CiAgICAgICAgc2VsZi5zdG9wcGVkID0gVHJ1ZQoKICAgIGRlZiBpc19zdG9wcGVkKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnN0b3BwZWQKCiAgICBkZWYgY3JlYXRlX3ZlcnNpb25fbWVzc2FnZShzZWxmKToKICAgICAgICB2ZXJzID0gYml0Y29pbi52ZXJzaW9uKCkKICAgICAgICB2ZXJzLnZlcnNpb24gPSA2MDAwMAogICAgICAgIHZlcnMuc2VydmljZXMgPSAxCiAgICAgICAgdmVycy5hZGRyZXNzX21lLnNlcnZpZXMgPSAxCiAgICAgICAgdmVycy5hZGRyZXNzX21lLmlwID0gXAogICAgICAgICAgICBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgCiAgICAgICAgICAgICAwLCAwLCAyNTUsIDI1NSwgMTI3LCAwLCAwLCAxXQogICAgICAgIHZlcnMuYWRkcmVzc19tZS5wb3J0ID0gODMzMwogICAgICAgIHZlcnMuYWRkcmVzc195b3Uuc2VydmljZXMgPSAxCiAgICAgICAgdmVycy5hZGRyZXNzX3lvdS5pcCA9IFwKICAgICAgICAgICAgWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIAogICAgICAgICAgICAgMCwgMCwgMjU1LCAyNTUsIDEyNywgMCwgMCwgMV0KICAgICAgICB2ZXJzLmFkZHJlc3NfeW91LnBvcnQgPSA4MzMzCiAgICAgICAgdmVycy51c2VyX2FnZW50ID0gIi9saWJiaXRjb2luOjAuNC9leGFtcGxlOjEvIjsKICAgICAgICB2ZXJzLnN0YXJ0X2hlaWdodCA9IDAKICAgICAgICB2ZXJzLm5vbmNlID0gNDIKICAgICAgICByZXR1cm4gdmVycwoKICAgICMgRmlyc3Qgd2Ugc2VuZCBvdXIgdmVyc2lvbiBtZXNzYWdlIHRoZW4gdGhlIG5vZGUgd2lsbCByZXBseSBiYWNrCiAgICBkZWYgaGFuZGxlX2Nvbm5lY3Qoc2VsZiwgZWMsIGNoYW5uZWwpOgogICAgICAgICMgY2hlY2sgdGhlIGVycm9yX2NvZGUKICAgICAgICBpZiBlYzoKICAgICAgICAgICAgcHJpbnQgJ0NvdWxkIG5vdCBjb25uZWN0OicsIGVjCiAgICAgICAgICAgIHNlbGYuc3RvcCgpCiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuY2hhbm5lbCA9IGNoYW5uZWwKICAgICAgICB2ZXJzaW9uX21lc3NhZ2UgPSBzZWxmLmNyZWF0ZV92ZXJzaW9uX21lc3NhZ2UoKQogICAgICAgIHNlbGYuY2hhbm5lbC5zZW5kX3ZlcnNpb24odmVyc2lvbl9tZXNzYWdlLCBzZWxmLmhhbmRsZV9zZW5kKQogICAgICAgIHNlbGYuY2hhbm5lbC5zdWJzY3JpYmVfdmVyc2lvbihzZWxmLnJlYWRfdmVyc2lvbl9yZXBseSkKCiAgICBkZWYgaGFuZGxlX3NlbmQoc2VsZiwgZWMpOgogICAgICAgIGlmIGVjOgogICAgICAgICAgICBwcmludCAnUHJvYmxlbSBzZW5kaW5nOicsIGVjCiAgICAgICAgICAgIHNlbGYuc3RvcCgpCgogICAgZGVmIHJlYWRfdmVyc2lvbl9yZXBseShzZWxmLCBlYywgdmVycyk6CiAgICAgICAgaWYgZWM6CiAgICAgICAgICAgIHByaW50ICdQcm9ibGVtIGluIHJlcGx5OicsIGVjCiAgICAgICAgICAgIHNlbGYuc3RvcCgpCiAgICAgICAgICAgIHJldHVybgogICAgICAgICMgRGlzcGxheSB0aGUgdmVyc2lvbiBtZXNzYWdlIGJhY2sKICAgICAgICBwcmludCB2ZXJzLmFkZHJlc3NfbWUuaXAKICAgICAgICBzZWxmLnN0b3AoKQoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIGFwcCA9IEFwcGxpY2F0aW9uKCkKICAgIGFwcC5zdGFydCgpCiAgICB3aGlsZSBub3QgYXBwLmlzX3N0b3BwZWQoKToKICAgICAgICB0aW1lLnNsZWVwKDAuMSkK