except:
__version__ = 'unknown'
os.chdir(prev)
+
+DEBUG = False
import warnings
from . import base58
-from p2pool.util import bases, math, skiplist
+from p2pool.util import bases, math, skiplist, intern2
+import p2pool
class EarlyEnd(Exception):
pass
def unpack(self, data):
obj = self._unpack(data)
- if __debug__:
+ if p2pool.DEBUG:
data2 = self._pack(obj)
if data2 != data:
- assert self._unpack(data2) == obj
+ if self._unpack(data2) != obj:
+ raise AssertionError()
return obj
def pack(self, obj):
data = self._pack(obj)
- assert self._unpack(data) == obj
+ if p2pool.DEBUG:
+ if self._unpack(data) != obj:
+ raise AssertionError()
return data
def read(self, file):
bits, file = self._inner.read(file)
target = self._bits_to_target(bits)
- if __debug__:
+ if p2pool.DEBUG:
if self._target_to_bits(target) != bits:
raise ValueError('bits in non-canonical form')
+ target = intern2.intern2(target)
return target, file
def write(self, file, item):
def _bits_to_target(self, bits2):
target = math.shift_left(bits2 & 0x00ffffff, 8 * ((bits2 >> 24) - 3))
- assert target == self._bits_to_target1(struct.pack('<I', bits2))
- assert self._target_to_bits(target, _check=False) == bits2
+ if p2pool.DEBUG:
+ assert target == self._bits_to_target1(struct.pack('<I', bits2))
+ assert self._target_to_bits(target, _check=False) == bits2
return target
def _bits_to_target1(self, bits):
if not self.reverse_shares[share.previous_hash]:
self.reverse_shares.pop(share.previous_hash)
- assert self.test() is None
+ #assert self.test() is None
def get_height(self, share_hash):
height, work, last = self.get_height_work_and_last(share_hash)
return attempts//time
def generate_transaction(tracker, previous_share_hash, new_script, subsidy, nonce, block_target, net):
- if __debug__:
- print "start generate_transaction"
height, last = tracker.get_height_and_last(previous_share_hash)
if height < net.TARGET_LOOKBEHIND:
target = bitcoin_data.FloatingIntegerType().truncate_to(2**256//2**20 - 1)
dests = sorted(pre_dests, key=lambda script: (script == new_script, script))
assert dests[-1] == new_script
- if __debug__:
- print "end generate_transaction"
-
return dict(
version=1,
tx_ins=[dict(
return True
def think(self, ht, previous_block, now):
- if __debug__:
- print "start think"
-
desired = set()
# O(len(self.heads))
if best is not None:
best_share = self.verified.shares[best]
if ht.get_min_height(best_share.header['previous_block']) < ht.get_min_height(previous_block) and best_share.bitcoin_hash != previous_block and best_share.peer is not None:
- if __debug__:
- print "stale detected!"
+ print "Stale detected!"
best = best_share.previous_hash
- if __debug__:
- print "end think"
-
return best, desired
@memoize.memoize_with_backing(expiring_dict.ExpiringDict(5, get_touches=False))
share.flag_shared()
def p2p_shares(shares, peer=None):
+ if len(shares) > 5:
+ print "Processing %i shares..." % (len(shares),)
+
for share in shares:
if share.hash in tracker.shares:
#print 'Got duplicate share, ignoring. Hash: %x' % (share.hash % 2**32,)
w = dict(current_work.value)
w['best_share_hash'] = best
current_work.set(w)
+
+ if len(shares) > 5:
+ print "... done processing %i shares." % (len(shares),)
def p2p_share_hashes(share_hashes, peer):
get_hashes = []
def compute(state, all_targets):
start = time.time()
- start = time.time()
pre_extra_txs = [tx for tx in tx_pool.itervalues() if tx.is_good()]
pre_extra_txs = pre_extra_txs[:2**16 - 1] # merkle_branch limit
extra_txs = []
return False
share = p2pool.Share.from_block(block)
my_shares.add(share.hash)
- print 'GOT SHARE! %x %x' % (share.hash, 0 if share.previous_hash is None else share.previous_hash), "DEAD ON ARRIVAL" if share.previous_hash != current_work.value['best_share_hash'] else "", time.time() - times[share.nonce]
+ print 'GOT SHARE! %x %x' % (share.hash % 2**32, 0 if share.previous_hash is None else share.previous_hash), "DEAD ON ARRIVAL" if share.previous_hash != current_work.value['best_share_hash'] else "", time.time() - times[share.nonce]
p2p_shares([share])
except:
print
reactor.stop()
def run():
- if __debug__:
- defer.setDebugging(True)
-
parser = argparse.ArgumentParser(description='p2pool (version %s)' % (p2pool_init.__version__,))
parser.add_argument('--version', action='version', version=p2pool_init.__version__)
parser.add_argument('--testnet',
help='use the testnet',
action='store_const', const=p2pool.Testnet, default=p2pool.Mainnet, dest='net')
+ parser.add_argument('--debug',
+ help='debugging mode',
+ action='store_const', const=True, default=False, dest='debug')
parser.add_argument('-a', '--address',
help='generate to this address (defaults to requesting one from bitcoind)',
type=str, action='store', default=None, dest='address')
args = parser.parse_args()
+ if args.debug:
+ p2pool_init.DEBUG = True
+
if args.bitcoind_p2p_port is None:
args.bitcoind_p2p_port = args.net.BITCOIN_P2P_PORT