Exemple #1
0
def submit_block_p2p(block, factory, net):
    if factory.conn.value is None:
        print >> sys.stderr, 'No bitcoind connection when block submittal attempted! %s%064x' % (
            net.PARENT.BLOCK_EXPLORER_URL_PREFIX,
            bitcoin_data.hashx11(
                bitcoin_data.block_header_type.pack(block['header'])))
        raise deferral.RetrySilentlyException()
    factory.conn.value.send_block(block=block)
Exemple #2
0
 def __init__(self, net, peer_addr, contents):
     self.net = net
     self.peer_addr = peer_addr
     self.contents = contents
     
     self.min_header = contents['min_header']
     self.share_info = contents['share_info']
     self.hash_link = contents['hash_link']
     self.merkle_link = contents['merkle_link']
     
     if not (2 <= len(self.share_info['share_data']['coinbase']) <= 100):
         raise ValueError('''bad coinbase size! %i bytes''' % (len(self.share_info['share_data']['coinbase']),))
     
     if len(self.merkle_link['branch']) > 16:
         raise ValueError('merkle branch too long!')
     
     assert not self.hash_link['extra_data'], repr(self.hash_link['extra_data'])
     
     self.share_data = self.share_info['share_data']
     self.max_target = self.share_info['max_bits'].target
     self.target = self.share_info['bits'].target
     self.timestamp = self.share_info['timestamp']
     self.previous_hash = self.share_data['previous_share_hash']
     self.new_script = bitcoin_data.pubkey_hash_to_script2(self.share_data['pubkey_hash'])
     self.desired_version = self.share_data['desired_version']
     self.absheight = self.share_info['absheight']
     self.abswork = self.share_info['abswork']
     
     n = set()
     for share_count, tx_count in self.iter_transaction_hash_refs():
         assert share_count < 110
         if share_count == 0:
             n.add(tx_count)
     assert n == set(range(len(self.share_info['new_transaction_hashes'])))
     
     self.gentx_hash = check_hash_link(
         self.hash_link,
         self.get_ref_hash(net, self.share_info, contents['ref_merkle_link']) + pack.IntType(64).pack(self.contents['last_txout_nonce']) + pack.IntType(32).pack(0),
         self.gentx_before_refhash,
     )
     merkle_root = bitcoin_data.check_merkle_link(self.gentx_hash, self.merkle_link)
     self.header = dict(self.min_header, merkle_root=merkle_root)
     self.pow_hash = self.hash = self.header_hash = bitcoin_data.hashx11(bitcoin_data.block_header_type.pack(self.header))
     
     if self.target > net.MAX_TARGET:
         from p2pool import p2p
         raise p2p.PeerMisbehavingError('share target invalid')
     
     if self.pow_hash > self.target:
         from p2pool import p2p
         raise p2p.PeerMisbehavingError('share PoW invalid')
     
     self.new_transaction_hashes = self.share_info['new_transaction_hashes']
     
     # XXX eww
     self.time_seen = time.time()
Exemple #3
0
def submit_block_rpc(block, ignore_failure, bitcoind, bitcoind_work, net):
    if bitcoind_work.value['use_getblocktemplate']:
        result = yield bitcoind.rpc_submitblock(bitcoin_data.block_type.pack(block).encode('hex'))
        success = result is None
    else:
        result = yield bitcoind.rpc_getmemorypool(bitcoin_data.block_type.pack(block).encode('hex'))
        success = result
    success_expected = bitcoin_data.hashx11(bitcoin_data.block_header_type.pack(block['header'])) <= block['header']['bits'].target
    if (not success and success_expected and not ignore_failure) or (success and not success_expected):
        print >>sys.stderr, 'Block submittal result: %s (%r) Expected: %s' % (success, result, success_expected)
Exemple #4
0
        def handle_header(new_header):
            self.pow_bits = self.bitcoind_work.value['bits']
            self.pow_subsidy = self.bitcoind_work.value['subsidy']

            # check that header matches current target
            if not (bitcoin_data.hashx11(
                    bitcoin_data.block_header_type.pack(new_header)) <=
                    self.bitcoind_work.value['bits'].target):
                return
            bitcoind_best_block = self.bitcoind_work.value['previous_block']
            if (self.best_block_header.value is None or
                (new_header['previous_block'] == bitcoind_best_block
                 and bitcoin_data.hashx11(
                     bitcoin_data.block_header_type.pack(
                         self.best_block_header.value)) == bitcoind_best_block
                 )  # new is child of current and previous is current
                    or (bitcoin_data.hashx11(
                        bitcoin_data.block_header_type.pack(new_header))
                        == bitcoind_best_block
                        and self.best_block_header.value['previous_block'] !=
                        bitcoind_best_block)
                ):  # new is current and previous is not a child of current
                self.best_block_header.set(new_header)
Exemple #5
0
        def handle_header(new_header):
            self.pow_bits = self.bitcoind_work.value["bits"]
            self.pow_subsidy = self.bitcoind_work.value["subsidy"]

            # check that header matches current target
            if not (
                bitcoin_data.hashx11(bitcoin_data.block_header_type.pack(new_header))
                <= self.bitcoind_work.value["bits"].target
            ):
                return
            bitcoind_best_block = self.bitcoind_work.value["previous_block"]
            if (
                self.best_block_header.value is None
                or (
                    new_header["previous_block"] == bitcoind_best_block
                    and bitcoin_data.hashx11(bitcoin_data.block_header_type.pack(self.best_block_header.value))
                    == bitcoind_best_block
                )  # new is child of current and previous is current
                or (
                    bitcoin_data.hashx11(bitcoin_data.block_header_type.pack(new_header)) == bitcoind_best_block
                    and self.best_block_header.value["previous_block"] != bitcoind_best_block
                )
            ):  # new is current and previous is not a child of current
                self.best_block_header.set(new_header)
Exemple #6
0
def submit_block_rpc(block, ignore_failure, bitcoind, bitcoind_work, net):
    if bitcoind_work.value['use_getblocktemplate']:
        result = yield bitcoind.rpc_submitblock(
            bitcoin_data.block_type.pack(block).encode('hex'))
        success = result is None
    else:
        result = yield bitcoind.rpc_getmemorypool(
            bitcoin_data.block_type.pack(block).encode('hex'))
        success = result
    success_expected = bitcoin_data.hashx11(
        bitcoin_data.block_header_type.pack(
            block['header'])) <= block['header']['bits'].target
    if (not success and success_expected
            and not ignore_failure) or (success and not success_expected):
        print >> sys.stderr, 'Block submittal result: %s (%r) Expected: %s' % (
            success, result, success_expected)
Exemple #7
0
 def handle_bestblock(self, header, peer):
     if bitcoin_data.hashx11(bitcoin_data.block_header_type.pack(header)) > header["bits"].target:
         raise p2p.PeerMisbehavingError("received block header fails PoW test")
     self.node.handle_header(header)
Exemple #8
0
def submit_block_p2p(block, factory, net):
    if factory.conn.value is None:
        print >>sys.stderr, 'No bitcoind connection when block submittal attempted! %s%064x' % (net.PARENT.BLOCK_EXPLORER_URL_PREFIX, bitcoin_data.hashx11(bitcoin_data.block_header_type.pack(block['header'])))
        raise deferral.RetrySilentlyException()
    factory.conn.value.send_block(block=block)
Exemple #9
0
 def handle_bestblock(self, header, peer):
     if bitcoin_data.hashx11(bitcoin_data.block_header_type.pack(
             header)) > header['bits'].target:
         raise p2p.PeerMisbehavingError(
             'received block header fails PoW test')
     self.node.handle_header(header)