diff --git a/lib/bitcoin_rpc.py b/lib/bitcoin_rpc.py index 701f28e..ff87f40 100644 --- a/lib/bitcoin_rpc.py +++ b/lib/bitcoin_rpc.py @@ -39,7 +39,24 @@ class BitcoinRPC(object): 'params': params, 'id': '1', })) - + + @defer.inlineCallbacks + def check_submitblock(self): + try: + log.info("Checking for submitblock") + resp = (yield self._call('submitblock', [])) + defer.returnValue(None) + except Exception, e: + if (str(e) == "404 Not Found"): + log.debug("No submitblock detected.") + defer.returnValue(False) + elif (str(e) == "500 Internal Server Error"): + log.debug("submitblock detected.") + defer.returnValue(True) + else: + log.debug("unknown submitblock check result.") + defer.returnValue(None) + @defer.inlineCallbacks def submitblock(self, block_hex, hash_hex): # Try submitblock if that fails, go to getblocktemplate diff --git a/lib/bitcoin_rpc_manager.py b/lib/bitcoin_rpc_manager.py index 1bb866c..012760b 100644 --- a/lib/bitcoin_rpc_manager.py +++ b/lib/bitcoin_rpc_manager.py @@ -89,6 +89,12 @@ class BitcoinRPCManager(object): return self.conns[self.curr_conn]._call(method,params) except: self.next_connection() + def check_submitblock(self): + while True: + try: + return self.conns[self.curr_conn].check_submitblock() + except: + self.next_connection() def submitblock(self, block_hex, hash_hex): while True: diff --git a/lib/ircbot.py.save b/lib/ircbot.py.save new file mode 100644 index 0000000..da76f2c --- /dev/null +++ b/lib/ircbot.py.save @@ -0,0 +1,44 @@ + + if args.irc_announce: + from twisted.words.protocols import irc + class IRCClient(irc.IRCClient): + nickname = 'xpool%02i' % (random.randrange(100),) + channel = net.ANNOUNCE_CHANNEL + def lineReceived(self, line): + if p2pool.DEBUG: + print repr(line) + irc.IRCClient.lineReceived(self, line) + def signedOn(self): + self.in_channel = False + irc.IRCClient.signedOn(self) + self.factory.resetDelay() + self.join(self.channel) + @defer.inlineCallbacks + def new_share(share): + if not self.in_channel: + return + if share.pow_hash <= share.header['bits'].target and abs(share.timestamp - time.time()) < 10*60: + yield deferral.sleep(random.expovariate(1/60)) + message = '\x02%s BLOCK FOUND by %s! %s%064x' % (net.NAME.upper(), bitcoin_data.script2_to_address(share.new_script, net.PARENT), net.PARENT.BLOCK_EXPLORER_URL_PREFIX, share.header_hash) + if all('%x' % (share.header_hash,) not in old_message for old_message in self.recent_messages): + self.say(self.channel, message) + self._remember_message(message) + self.watch_id = node.tracker.verified.added.watch(new_share) + self.recent_messages = [] + def joined(self, channel): + self.in_channel = True + def left(self, channel): + self.in_channel = False + def _remember_message(self, message): + self.recent_messages.append(message) + while len(self.recent_messages) > 100: + self.recent_messages.pop(0) + def privmsg(self, user, channel, message): + if channel == self.channel: + self._remember_message(message) + def connectionLost(self, reason): + node.tracker.verified.added.unwatch(self.watch_id) + print 'IRC connection lost:', reason.getErrorMessage() + class IRCClientFactory(protocol.ReconnectingClientFactory): + protocol = IRCClient + reactor.connectTCP("irc.freenode.net", 6667, IRCClientFactory()) diff --git a/mining/__init__.py b/mining/__init__.py index 197e231..9544e3a 100644 --- a/mining/__init__.py +++ b/mining/__init__.py @@ -39,6 +39,22 @@ def setup(on_startup): # - we are not still downloading the blockchain (Sleep) log.info("Connecting to litecoind...") while True: + try: + result = (yield bitcoin_rpc.check_submitblock()) + if result == True: + log.info("Found submitblock") + elif result == False: + log.info("Did not find submitblock") + else: + log.info("unknown submitblock result") + except ConnectionRefusedError, e: + log.error("Connection refused while trying to connect to the coind (are your COIND_* settings correct?)") + reactor.stop() + break + + except Exception, e: + log.debug(str(e)) + try: result = (yield bitcoin_rpc.getblocktemplate()) if isinstance(result, dict):