])
class Share(object):
- __slots__ = 'header previous_block share_info merkle_branch other_txs timestamp share_data new_script subsidy previous_hash previous_share_hash target nonce pow_hash header_hash hash time_seen peer donation net'.split(' ')
+ __slots__ = 'header share_info merkle_branch other_txs timestamp share_data previous_hash target pow_hash header_hash hash time_seen peer net'.split(' ')
@classmethod
def from_share(cls, share, net):
raise ValueError('merkle_branch too long!')
self.header = header
- self.previous_block = header['previous_block']
self.share_info = share_info
self.merkle_branch = merkle_branch
self.target = self.share_info['bits'].target
self.timestamp = self.share_info['timestamp']
- self.new_script = self.share_data['new_script']
- self.subsidy = self.share_data['subsidy']
- self.donation = self.share_data['donation']
-
- if len(self.new_script) > 100:
+ if len(self.share_data['new_script']) > 100:
raise ValueError('new_script too long!')
+ if script.get_sigop_count(self.share_data['new_script']) > 1:
+ raise ValueError('too many sigops!')
- self.previous_hash = self.previous_share_hash = self.share_data['previous_share_hash']
- self.nonce = self.share_data['nonce']
+ self.previous_hash = self.share_data['previous_share_hash']
- if len(self.nonce) > 100:
+ if len(self.share_data['nonce']) > 100:
raise ValueError('nonce too long!')
if len(self.share_data['coinbase']) > 100:
return '<Share %s>' % (' '.join('%s=%r' % (k, getattr(self, k)) for k in self.__slots__),)
def check(self, tracker):
- if script.get_sigop_count(self.new_script) > 1:
- raise ValueError('too many sigops!')
-
share_info, gentx = generate_transaction(tracker, self.share_info['share_data'], self.header['bits'].target, self.share_info['timestamp'], self.net)
if share_info != self.share_info:
raise ValueError('share difficulty invalid')
decorated_heads = sorted(((
self.verified.get_work(self.verified.get_nth_parent_hash(h, min(5, self.verified.get_height(h)))),
#self.verified.shares[h].peer is None,
- (self.verified.shares[h].previous_block, self.verified.shares[h].header['bits']) == (previous_block, bits) or self.verified.shares[h].peer is None,
+ (self.verified.shares[h].header['previous_block'], self.verified.shares[h].header['bits']) == (previous_block, bits) or self.verified.shares[h].peer is None,
-self.verified.shares[h].time_seen,
), h) for h in self.verified.tails.get(best_tail, []))
if p2pool.DEBUG:
from p2pool.bitcoin import data as bitcoin_data
share = self.tracker.shares[element]
att = bitcoin_data.target_to_average_attempts(share.target)
- return 1, {share.new_script: att*(65535-share.donation)}, att*65535, att*share.donation
+ return 1, {share.share_data['new_script']: att*(65535-share.share_data['donation'])}, att*65535, att*share.share_data['donation']
def combine_deltas(self, (share_count1, weights1, total_weight1, total_donation_weight1), (share_count2, weights2, total_weight2, total_donation_weight2)):
return share_count1 + share_count2, math.add_dicts(weights1, weights2), total_weight1 + total_weight2, total_donation_weight1 + total_donation_weight2