コード例 #1
0
ファイル: endpoints.py プロジェクト: BadPirateX/yadacoin
    def on_newtransaction(self, data):
        #print("new transaction ", data)
        config = app.config['yada_config']
        mongo = app.config['yada_mongo']
        try:
            incoming_txn = Transaction.from_dict(
                config, mongo,
                BU.get_latest_block(config, mongo)['index'], data)
        except Exception as e:
            print "transaction is bad"
            print e
            raise Exception("transaction is bad")
        except BaseException as e:
            print "transaction is bad"
            print e
            raise Exception("transaction is bad")

        try:
            print incoming_txn.transaction_signature
            dup_check = mongo.db.miner_transactions.find(
                {'id': incoming_txn.transaction_signature})
            if dup_check.count():
                print 'found duplicate'
                raise Exception("duplicate")
            mongo.db.miner_transactions.update(incoming_txn.to_dict(),
                                               incoming_txn.to_dict(),
                                               upsert=True)
        except Exception as e:
            print e
            raise Exception("transaction is bad")
        except BaseException as e:
            print e
            raise Exception("transaction is bad")
コード例 #2
0
ファイル: endpoints.py プロジェクト: BadPirateX/yadacoin
    def dispatch_request(self):
        config = app.config['yada_config']
        mongo = app.config['yada_mongo']
        if request.method == 'POST':
            items = request.json
            if not isinstance(items, list):
                items = [
                    items,
                ]
            else:
                items = [item for item in items]
            transactions = []
            for txn in items:
                transaction = Transaction.from_dict(
                    config, mongo,
                    BU.get_latest_block(config, mongo)['index'], txn)
                try:
                    transaction.verify()
                except InvalidTransactionException:
                    mongo.db.failed_transactions.insert({
                        'exception': 'InvalidTransactionException',
                        'txn': txn
                    })
                    print 'InvalidTransactionException'
                    return 'InvalidTransactionException', 400
                except InvalidTransactionSignatureException:
                    print 'InvalidTransactionSignatureException'
                    mongo.db.failed_transactions.insert({
                        'exception': 'InvalidTransactionSignatureException',
                        'txn': txn
                    })
                    return 'InvalidTransactionSignatureException', 400
                except MissingInputTransactionException:
                    pass
                except:
                    raise
                    print 'uknown error'
                    return 'uknown error', 400
                transactions.append(transaction)

            for x in transactions:
                mongo.db.miner_transactions.insert(x.to_dict())
            job = Process(target=TxnBroadcaster.txn_broadcast_job,
                          args=(transaction, ))
            job.start()
            return json.dumps(request.get_json())
        else:
            rid = request.args.get('rid')
            if rid:
                transactions = BU.get_transactions_by_rid(
                    config,
                    mongo,
                    rid,
                    config.bulletin_secret,
                    rid=True,
                    raw=True)
            else:
                transactions = []
            return json.dumps([x for x in transactions])
コード例 #3
0
    def dispatch_request(self):
        if request.method == 'POST':
            items = request.json
            if not isinstance(items, list):
                items = [items, ]
            else:
                items = [item for item in items]
            transactions = []
            for txn in items:
                transaction = Transaction.from_dict(txn)
                try:
                    transaction.verify()
                except InvalidTransactionException:
                    Mongo.db.failed_transactions.insert({
                        'exception': 'InvalidTransactionException',
                        'txn': txn
                    })
                    print 'InvalidTransactionException'
                    return 'InvalidTransactionException', 400
                except InvalidTransactionSignatureException:
                    print 'InvalidTransactionSignatureException'
                    Mongo.db.failed_transactions.insert({
                        'exception': 'InvalidTransactionSignatureException',
                        'txn': txn
                    })
                    return 'InvalidTransactionSignatureException', 400
                except MissingInputTransactionException:
                    pass
                except:
                    raise
                    print 'uknown error'
                    return 'uknown error', 400
                transactions.append(transaction)

            for x in transactions:
                Mongo.db.miner_transactions.insert(x.to_dict())
            job = Process(target=TxnBroadcaster.txn_broadcast_job, args=(transaction,))
            job.start()
            if Config.fcm_key:
                for txn in transactions:
                    job = Process(
                        target=self.do_push,
                        args=(txn.to_dict(), request.args.get('bulletin_secret'))
                    )
                    job.start()
            return json.dumps(request.get_json())
        else:
            rid = request.args.get('rid')
            if rid:
                transactions = BU.get_transactions_by_rid(rid, rid=True, raw=True)
            else:
                transactions = []
            return json.dumps([x for x in transactions])
コード例 #4
0
        def newtransaction(sid, data):
            #print("new transaction ", data)
            try:
                incoming_txn = Transaction.from_dict(data)
            except Exception as e:
                print "transaction is bad"
                print e
            except BaseException as e:
                print "transaction is bad"
                print e

            try:
                dup_check = Mongo.db.miner_transactions.find(
                    {'id': incoming_txn.transaction_signature})
                if dup_check.count():
                    print 'found duplicate'
                    return
                Mongo.db.miner_transactions.update(incoming_txn.to_dict(),
                                                   incoming_txn.to_dict(),
                                                   upsert=True)
            except Exception as e:
                print e
            except BaseException as e:
                print e
コード例 #5
0
def node(nonces=None, config=None):
    Config.from_dict(json.loads(config))
    Peers.init()
    latest_block_index = Value('i', 0)
    my_peer = Config.peer_host + ":" + str(Config.peer_port)
    Config.max_duration = 300000
    Config.block_version = 1
    #p = Process(target=new_block_checker, args=(latest_block_index,))
    status = Array('c', 'asldkjf')
    #p.start()
    Mongo.init()
    # default run state will be to mine some blocks!
    block = BU.get_latest_block()
    if block:
        latest_block_index.value = block.get('index') + 1
    else:
        genesis_block = BlockFactory.get_genesis_block()
        genesis_block.save()
        Mongo.db.consensus.insert({
            'block': genesis_block.to_dict(),
            'peer': 'me',
            'id': genesis_block.signature,
            'index': 0
        })
        block = BU.get_latest_block()
        latest_block_index.value = block.get('index')

    dup_test = Mongo.db.consensus.find({
        'peer':
        'me',
        'index':
        latest_block_index.value,
        'block.version':
        BU.get_version_for_height(latest_block_index.value + 1)
    }).sort([('index', -1)])
    if dup_test.count():
        #print 'returning', latest_block_index.value + 1, BU.get_version_for_height(latest_block_index.value + 1)
        return

    transactions = Mongo.db.miner_transactions.find()
    transaction_objs = []
    unspent_indexed = {}
    for txn in transactions:
        try:
            transaction = Transaction.from_dict(txn)
            transaction.verify()
            #check double spend
            address = str(
                P2PKHBitcoinAddress.from_pubkey(
                    transaction.public_key.decode('hex')))
            if address in unspent_indexed:
                unspent_ids = unspent_indexed[address]
            else:
                needed_value = sum(
                    [float(x.value)
                     for x in transaction.outputs]) + float(transaction.fee)
                res = BU.get_wallet_unspent_transactions(
                    address, needed_value=needed_value)
                unspent_ids = [x['id'] for x in res]
                unspent_indexed[address] = unspent_ids
            failed1 = False
            failed2 = False
            used_ids_in_this_txn = []

            for x in transaction.inputs:
                if x.id not in unspent_ids:
                    failed1 = True
                if x.id in used_ids_in_this_txn:
                    failed2 = True
                used_ids_in_this_txn.append(x.id)
            if failed1:
                Mongo.db.miner_transactions.remove(
                    {'id': transaction.transaction_signature})
                print 'transaction removed: input presumably spent already, not in unspent outputs', transaction.transaction_signature
                Mongo.db.failed_transactions.insert({
                    'reason':
                    'input presumably spent already',
                    'txn':
                    transaction.to_dict()
                })
            elif failed2:
                Mongo.db.miner_transactions.remove(
                    {'id': transaction.transaction_signature})
                print 'transaction removed: using an input used by another transaction in this block', transaction.transaction_signature
                Mongo.db.failed_transactions.insert({
                    'reason':
                    'using an input used by another transaction in this block',
                    'txn':
                    transaction.to_dict()
                })
            else:
                transaction_objs.append(transaction)
        except MissingInputTransactionException as e:
            #print 'missing this input transaction, will try again later'
            pass
        except InvalidTransactionSignatureException as e:
            print 'InvalidTransactionSignatureException: transaction removed'
            Mongo.db.miner_transactions.remove(
                {'id': transaction.transaction_signature})
            Mongo.db.failed_transactions.insert({
                'reason': 'InvalidTransactionSignatureException',
                'txn': transaction.to_dict()
            })
        except InvalidTransactionException as e:
            print 'InvalidTransactionException: transaction removed'
            Mongo.db.miner_transactions.remove(
                {'id': transaction.transaction_signature})
            Mongo.db.failed_transactions.insert({
                'reason': 'InvalidTransactionException',
                'txn': transaction.to_dict()
            })
        except Exception as e:
            #print e
            #print 'rejected transaction', txn['id']
            pass
        except BaseException as e:
            #print e
            #print 'rejected transaction', txn['id']
            pass
    try:
        block = BlockFactory.mine(transaction_objs, Config.public_key,
                                  Config.private_key, Config.max_duration,
                                  output, latest_block_index, status, nonces)
    except Exception as e:
        raise
    if block:
        dup_test = Mongo.db.consensus.find_one({
            'peer':
            'me',
            'index':
            block.index,
            'block.version':
            BU.get_version_for_height(block.index)
        })
        if not dup_test:
            print '\r\nCandidate submitted for index:', block.index
            print '\r\nTransactions:'
            for x in block.transactions:
                print x.transaction_signature
            Mongo.db.consensus.insert({
                'peer': 'me',
                'index': block.index,
                'id': block.signature,
                'block': block.to_dict()
            })
            print '\r\nSent block to:'
            for peer in Peers.peers:
                try:
                    block_dict = block.to_dict()
                    block_dict['peer'] = my_peer
                    requests.post('http://{peer}/newblock'.format(
                        peer=peer.host + ":" + str(peer.port)),
                                  json=block_dict,
                                  timeout=3,
                                  headers={'Connection': 'close'})
                    print peer.host + ":" + str(peer.port)
                except Exception as e:
                    print e
                    try:
                        print 'reporting bad peer'
                        requests.post('https://yadacoin.io/peers',
                                      json={
                                          'host': peer.host,
                                          'port': str(peer.port),
                                          'failed': True
                                      },
                                      timeout=3,
                                      headers={'Connection': 'close'})
                    except:
                        print 'failed to report bad peer'
                        pass
コード例 #6
0
    picked_sum = 0
    for inp in inputs:
        picked.append(inp)
        picked_sum += inp['value']
        if picked_sum >= float(args.value):
            break

    print("picked {:,} inputs totaling {:,} to send for tx"
            .format(len(inputs), spendable))

    # this
    transaction = Transaction(
        block_height=BU.get_latest_block(config, mongo)['index'],
        fee=0.01,
        public_key=config.public_key,
        outputs=[
            {'to': config.address, 'value': float(args.value)}
        ],
        inputs=picked,
    )
    transaction.hash = transaction.generate_hash()
    transaction.transaction_signature = TU.generate_signature(transaction.hash, config.private_key)
    transaction.verify()
    index = BU.get_latest_block(config, mongo)['index'] + 1
    block = BlockFactory([transaction], config.public_key, config.private_key, index=index)
    block.block.special_min = True
    block.block.target = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
    block.block.nonce = 0
    header = BlockFactory.generate_header(block.block)
    block.block.hash = BlockFactory.generate_hash_from_header(header, block.block.nonce)
    block.block.signature = BU.generate_signature(block.block.hash, config.private_key)