Пример #1
0
 def setUp(self, annotate=True):
     yield super(TestMarketConversion, self).setUp(annotate=annotate)
     self.market_community = MarketCommunity(self.dispersy,
                                             self.master_member,
                                             self.member)
     self.market_community.initialize()
     self.conversion = MarketConversion(self.market_community)
Пример #2
0
    def setUp(self, annotate=True):
        yield super(CommunityTestSuite, self).setUp(annotate=annotate)

        dummy1_wallet = DummyWallet1()
        dummy2_wallet = DummyWallet2()

        self.market_community = MarketCommunity(self.dispersy,
                                                self.master_member,
                                                self.member)
        self.market_community.initialize(wallets={
            dummy1_wallet.get_identifier():
            dummy1_wallet,
            dummy2_wallet.get_identifier():
            dummy2_wallet
        },
                                         use_database=False)
        self.market_community.use_local_address = True
        self.dispersy._lan_address = ("127.0.0.1", 1234)
        self.dispersy._endpoint.open(self.dispersy)

        self.dispersy.attach_community(self.market_community)

        eccrypto = ECCrypto()
        ec = eccrypto.generate_key(u"curve25519")
        member = Member(self.dispersy, ec, 1)

        trader_id = hashlib.sha1(member.public_key).digest().encode('hex')
        self.ask = Ask(
            MessageId(TraderId('0'), MessageNumber('message_number')),
            OrderId(TraderId(trader_id), OrderNumber(1234)),
            Price(63400, 'DUM1'), Quantity(30, 'DUM2'), Timeout(3600),
            Timestamp.now())
        self.ask.sign(member)

        self.bid = Bid(
            MessageId(TraderId('1'), MessageNumber('message_number')),
            OrderId(TraderId(trader_id), OrderNumber(1235)),
            Price(343, 'DUM1'), Quantity(22, 'DUM2'), Timeout(3600),
            Timestamp.now())
        self.bid.sign(member)
        self.order = Order(
            OrderId(TraderId(self.market_community.mid), OrderNumber(24)),
            Price(20, 'DUM1'), Quantity(30, 'DUM2'), Timeout(3600.0),
            Timestamp.now(), False)
        self.proposed_trade = Trade.propose(
            MessageId(TraderId('0'), MessageNumber('message_number')),
            OrderId(TraderId('0'), OrderNumber(23)),
            OrderId(TraderId(self.market_community.mid), OrderNumber(24)),
            Price(20, 'DUM1'), Quantity(30, 'DUM2'), Timestamp.now())
Пример #3
0
 def test_get_master_members(self):
     """
     Test retrieval of the master members of the Market community
     """
     self.assertTrue(MarketCommunity.get_master_members(self.dispersy))
Пример #4
0
class CommunityTestSuite(AbstractTestCommunity):
    """Community test cases."""
    @blocking_call_on_reactor_thread
    @inlineCallbacks
    def setUp(self, annotate=True):
        yield super(CommunityTestSuite, self).setUp(annotate=annotate)

        dummy1_wallet = DummyWallet1()
        dummy2_wallet = DummyWallet2()

        self.market_community = MarketCommunity(self.dispersy,
                                                self.master_member,
                                                self.member)
        self.market_community.initialize(wallets={
            dummy1_wallet.get_identifier():
            dummy1_wallet,
            dummy2_wallet.get_identifier():
            dummy2_wallet
        },
                                         use_database=False)
        self.market_community.use_local_address = True
        self.dispersy._lan_address = ("127.0.0.1", 1234)
        self.dispersy._endpoint.open(self.dispersy)

        self.dispersy.attach_community(self.market_community)

        eccrypto = ECCrypto()
        ec = eccrypto.generate_key(u"curve25519")
        member = Member(self.dispersy, ec, 1)

        trader_id = hashlib.sha1(member.public_key).digest().encode('hex')
        self.ask = Ask(
            MessageId(TraderId('0'), MessageNumber('message_number')),
            OrderId(TraderId(trader_id), OrderNumber(1234)),
            Price(63400, 'DUM1'), Quantity(30, 'DUM2'), Timeout(3600),
            Timestamp.now())
        self.ask.sign(member)

        self.bid = Bid(
            MessageId(TraderId('1'), MessageNumber('message_number')),
            OrderId(TraderId(trader_id), OrderNumber(1235)),
            Price(343, 'DUM1'), Quantity(22, 'DUM2'), Timeout(3600),
            Timestamp.now())
        self.bid.sign(member)
        self.order = Order(
            OrderId(TraderId(self.market_community.mid), OrderNumber(24)),
            Price(20, 'DUM1'), Quantity(30, 'DUM2'), Timeout(3600.0),
            Timestamp.now(), False)
        self.proposed_trade = Trade.propose(
            MessageId(TraderId('0'), MessageNumber('message_number')),
            OrderId(TraderId('0'), OrderNumber(23)),
            OrderId(TraderId(self.market_community.mid), OrderNumber(24)),
            Price(20, 'DUM1'), Quantity(30, 'DUM2'), Timestamp.now())

    @blocking_call_on_reactor_thread
    def test_get_master_members(self):
        """
        Test retrieval of the master members of the Market community
        """
        self.assertTrue(MarketCommunity.get_master_members(self.dispersy))

    @blocking_call_on_reactor_thread
    def test_proposed_trade_cache_timeout(self):
        """
        Test the timeout method of a proposed trade request in the cache
        """
        ask = Ask(
            MessageId(TraderId('0'), MessageNumber('message_number')),
            OrderId(TraderId(self.market_community.mid), OrderNumber(24)),
            Price(63400, 'DUM1'), Quantity(30, 'DUM2'), Timeout(3600),
            Timestamp.now())
        order = Order(OrderId(TraderId("0"), OrderNumber(23)),
                      Price(20, 'DUM1'), Quantity(30, 'DUM2'), Timeout(3600.0),
                      Timestamp.now(), False)
        self.market_community.order_book.insert_ask(ask)
        self.assertEqual(len(self.market_community.order_book.asks), 1)
        self.market_community.order_manager.order_repository.add(order)
        order.reserve_quantity_for_tick(self.proposed_trade.recipient_order_id,
                                        Quantity(30, 'DUM2'))
        self.market_community.order_manager.order_repository.update(order)
        cache = ProposedTradeRequestCache(self.market_community,
                                          self.proposed_trade)
        cache.on_timeout()
        self.assertEqual(len(self.market_community.order_book.asks), 0)

    def get_tick_message(self, tick):
        meta = self.market_community.get_meta_message(
            u"ask" if isinstance(tick, Ask) else u"bid")
        return meta.impl(
            authentication=(self.market_community.my_member, ),
            distribution=(self.market_community.claim_global_time(), ),
            payload=tick.to_network() + (Ttl.default(), "127.0.0.1", 1234))

    def get_offer_sync(self, tick):
        meta = self.market_community.get_meta_message(u"offer-sync")
        candidate = Candidate(
            self.market_community.lookup_ip(TraderId(
                self.market_community.mid)), False)
        return meta.impl(
            authentication=(self.market_community.my_member, ),
            distribution=(self.market_community.claim_global_time(), ),
            destination=(candidate, ),
            payload=tick.to_network() + (Ttl(1), ) + ("127.0.0.1", 1234) +
            (isinstance(tick, Ask), ))

    @blocking_call_on_reactor_thread
    def test_verify_offer_creation(self):
        """
        Test creation of an offer in the community
        """
        self.assertRaises(RuntimeError,
                          self.market_community.verify_offer_creation,
                          Price(3, 'MC'), 'ABC', Quantity(4, 'BTC'), 'ABC')
        self.assertRaises(RuntimeError,
                          self.market_community.verify_offer_creation,
                          Price(3, 'MC'), 'ABC', Quantity(4, 'BTC'), 'MC')
        self.assertRaises(RuntimeError,
                          self.market_community.verify_offer_creation,
                          Price(1, 'DUM1'), 'DUM1', Quantity(1, 'BTC'), 'BTC')
        self.assertRaises(RuntimeError,
                          self.market_community.verify_offer_creation,
                          Price(0.1, 'DUM1'), 'DUM1', Quantity(1,
                                                               'DUM2'), 'DUM2')
        self.assertRaises(RuntimeError,
                          self.market_community.verify_offer_creation,
                          Price(1, 'DUM1'), 'DUM1', Quantity(0.1,
                                                             'DUM2'), 'DUM2')

    @blocking_call_on_reactor_thread
    def test_check_message(self):
        """
        Test the general check of the validity of a message in the market community
        """
        self.market_community.update_ip(TraderId(self.market_community.mid),
                                        ('2.2.2.2', 2))
        proposed_trade_msg = self.get_proposed_trade_msg()
        self.market_community.timeline.check = lambda _: (True, None)
        [
            self.assertIsInstance(msg, Message.Implementation) for msg in
            self.market_community.check_message([proposed_trade_msg])
        ]

        self.market_community.timeline.check = lambda _: (False, None)
        [
            self.assertIsInstance(msg, DelayMessageByProof) for msg in
            self.market_community.check_message([proposed_trade_msg])
        ]

    @blocking_call_on_reactor_thread
    def test_check_tick_message(self):
        """
        Test the general check of the validity of a tick message in the market community
        """
        self.ask._signature = EMPTY_SIG
        [
            self.assertIsInstance(msg, DropMessage)
            for msg in self.market_community.check_tick_message(
                [self.get_tick_message(self.ask)])
        ]

        self.market_community.timeline.check = lambda _: (False, None)
        [
            self.assertIsInstance(msg, DelayMessageByProof)
            for msg in self.market_community.check_tick_message(
                [self.get_tick_message(self.ask)])
        ]

        self.market_community.timeline.check = lambda _: (True, None)
        self.ask.order_id._trader_id = TraderId(self.market_community.mid)
        [
            self.assertIsInstance(msg, DropMessage)
            for msg in self.market_community.check_tick_message(
                [self.get_tick_message(self.ask)])
        ]

    @blocking_call_on_reactor_thread
    def test_check_trade_message(self):
        """
        Test the general check of the validity of a trade message in the market community
        """
        self.proposed_trade.recipient_order_id._trader_id = TraderId("abcdef")
        self.market_community.update_ip(TraderId(self.market_community.mid),
                                        ('2.2.2.2', 2))
        self.market_community.update_ip(TraderId("abcdef"), ('2.2.2.2', 2))
        self.market_community.timeline.check = lambda _: (False, None)
        [
            self.assertIsInstance(msg, DelayMessageByProof)
            for msg in self.market_community.check_trade_message(
                [self.get_proposed_trade_msg()])
        ]

        self.market_community.timeline.check = lambda _: (True, None)
        [
            self.assertIsInstance(msg, DropMessage)
            for msg in self.market_community.check_trade_message(
                [self.get_proposed_trade_msg()])
        ]

        self.proposed_trade.recipient_order_id._trader_id = TraderId(
            self.market_community.mid)
        self.market_community.timeline.check = lambda _: (True, None)
        [
            self.assertIsInstance(msg, DropMessage)
            for msg in self.market_community.check_trade_message(
                [self.get_proposed_trade_msg()])
        ]

        self.market_community.order_manager.order_repository.add(self.order)
        self.market_community.timeline.check = lambda _: (True, None)
        [
            self.assertIsInstance(msg, Message.Implementation)
            for msg in self.market_community.check_trade_message(
                [self.get_proposed_trade_msg()])
        ]

    @blocking_call_on_reactor_thread
    def test_send_offer_sync(self):
        """
        Test sending an offer sync
        """
        self.market_community.update_ip(TraderId('0'), ("127.0.0.1", 1234))
        self.market_community.update_ip(TraderId('1'), ("127.0.0.1", 1234))
        self.market_community.update_ip(self.ask.order_id.trader_id,
                                        ("127.0.0.1", 1234))
        candidate = WalkCandidate(("127.0.0.1", 1234), False,
                                  ("127.0.0.1", 1234), ("127.0.0.1", 1234),
                                  u"public")
        self.assertTrue(
            self.market_community.send_offer_sync(candidate, self.ask))

    @blocking_call_on_reactor_thread
    def test_send_proposed_trade(self):
        """
        Test sending a proposed trade
        """
        self.market_community.update_ip(TraderId(self.market_community.mid),
                                        ('127.0.0.1', 1234))
        self.assertEqual(
            self.market_community.send_proposed_trade_messages(
                [self.proposed_trade]), [True])

    @blocking_call_on_reactor_thread
    def test_send_counter_trade(self):
        """
        Test sending a counter trade
        """
        self.market_community.update_ip(TraderId('b'), ('127.0.0.1', 1234))
        counter_trade = CounterTrade(
            MessageId(TraderId('a'), MessageNumber('2')), self.order.order_id,
            OrderId(TraderId('b'), OrderNumber(3)), 1235, Price(3, 'MC'),
            Quantity(4, 'BTC'), Timestamp.now())
        self.market_community.send_counter_trade(counter_trade)

    @blocking_call_on_reactor_thread
    def test_start_transaction(self):
        """
        Test the start transaction method
        """
        self.market_community.order_manager.order_repository.add(self.order)
        self.market_community.update_ip(TraderId('0'), ("127.0.0.1", 1234))
        self.market_community.start_transaction(self.proposed_trade)
        self.assertEqual(
            len(self.market_community.transaction_manager.find_all()), 1)

    @blocking_call_on_reactor_thread
    def test_create_intro_request(self):
        """
        Test the creation of an introduction request
        """
        self.market_community.order_book.insert_ask(self.ask)
        self.market_community.order_book.insert_bid(self.bid)
        candidate = WalkCandidate(("127.0.0.1", 1234), False,
                                  ("127.0.0.1", 1234), ("127.0.0.1", 1234),
                                  u"public")
        request = self.market_community.create_introduction_request(
            candidate, True)
        self.assertTrue(request)
        self.assertTrue(request.payload.orders_bloom_filter)

    @blocking_call_on_reactor_thread
    def test_on_introduction_request(self):
        """
        Test that when we receive an intro request with a orders bloom filter, we send an order sync back
        """
        def on_send_offer_sync(_, tick):
            self.assertIsInstance(tick, Tick)
            on_send_offer_sync.called = True

        on_send_offer_sync.called = False

        candidate = WalkCandidate(("127.0.0.1", 1234), False,
                                  ("127.0.0.1", 1234), ("127.0.0.1", 1234),
                                  u"public")
        candidate.associate(self.market_community.my_member)
        payload = self.market_community.create_introduction_request(
            candidate, True).payload

        self.market_community.order_book.insert_ask(self.ask)
        self.market_community.order_book.insert_bid(self.bid)
        self.market_community.update_ip(TraderId('0'), ("127.0.0.1", 1234))
        self.market_community.update_ip(TraderId('1'), ("127.0.0.1", 1234))
        self.market_community.send_offer_sync = on_send_offer_sync

        message = MockObject()
        message.payload = payload
        message.candidate = candidate
        self.market_community.on_introduction_request([message])
        self.assertTrue(on_send_offer_sync.called)

    @blocking_call_on_reactor_thread
    def test_lookup_ip(self):
        # Test for lookup ip
        self.market_community.update_ip(TraderId('0'), ("1.1.1.1", 0))
        self.assertEquals(("1.1.1.1", 0),
                          self.market_community.lookup_ip(TraderId('0')))

    @blocking_call_on_reactor_thread
    def test_get_wallet_address(self):
        """
        Test the retrieval of a wallet address
        """
        self.assertRaises(ValueError, self.market_community.get_wallet_address,
                          'ABCD')
        self.assertTrue(self.market_community.get_wallet_address('DUM1'))

    @blocking_call_on_reactor_thread
    def test_create_ask(self):
        # Test for create ask
        self.assertRaises(RuntimeError, self.market_community.create_ask, 20,
                          'DUM2', 100, 'DUM2', 0.0)
        self.assertRaises(RuntimeError, self.market_community.create_ask, 20,
                          'NOTEXIST', 100, 'DUM2', 0.0)
        self.assertRaises(RuntimeError, self.market_community.create_ask, 20,
                          'DUM2', 100, 'NOTEXIST', 0.0)
        self.assertTrue(
            self.market_community.create_ask(20, 'DUM1', 100, 'DUM2', 3600))
        self.assertEquals(1, len(self.market_community.order_book._asks))
        self.assertEquals(0, len(self.market_community.order_book._bids))

    @blocking_call_on_reactor_thread
    def test_on_tick(self):
        """
        Test whether a tick is inserted in the order book when we receive one
        """
        self.market_community.on_tick(
            [self.get_tick_message(self.ask),
             self.get_tick_message(self.bid)])
        self.assertEquals(1, len(self.market_community.order_book.asks))
        self.assertEquals(1, len(self.market_community.order_book.bids))

        # Update the timestamp of the ticks
        ask_timestamp = float(self.ask.timestamp)
        self.ask.update_timestamp()
        self.market_community.on_tick([self.get_tick_message(self.ask)])
        self.assertEquals(1, len(self.market_community.order_book.asks))
        new_timestamp = self.market_community.order_book.get_tick(
            self.ask.order_id).tick.timestamp
        self.assertGreater(new_timestamp, ask_timestamp)

    @blocking_call_on_reactor_thread
    def test_create_bid(self):
        # Test for create bid
        self.assertRaises(RuntimeError, self.market_community.create_bid, 20,
                          'DUM2', 100, 'DUM2', 0.0)
        self.assertRaises(RuntimeError, self.market_community.create_bid, 20,
                          'NOTEXIST', 100, 'DUM2', 0.0)
        self.assertRaises(RuntimeError, self.market_community.create_bid, 20,
                          'DUM2', 100, 'NOTEXIST', 0.0)
        self.assertTrue(
            self.market_community.create_bid(20, 'DUM1', 100, 'DUM2', 3600))
        self.assertEquals(0, len(self.market_community.order_book.asks))
        self.assertEquals(1, len(self.market_community.order_book.bids))

    def get_proposed_trade_msg(self):
        destination, payload = self.proposed_trade.to_network()
        payload += ("127.0.0.1", 1234)
        candidate = Candidate(self.market_community.lookup_ip(destination),
                              False)
        meta = self.market_community.get_meta_message(u"proposed-trade")
        message = meta.impl(
            authentication=(self.market_community.my_member, ),
            distribution=(self.market_community.claim_global_time(), ),
            destination=(candidate, ),
            payload=payload)
        return message

    @blocking_call_on_reactor_thread
    def test_on_proposed_trade_accept(self):
        """
        Test whether we accept a trade when we receive a correct proposed trade message
        """
        def mocked_start_transaction(*_):
            mocked_start_transaction.called = True

        mocked_start_transaction.called = False

        self.market_community.update_ip(TraderId(self.market_community.mid),
                                        ('2.2.2.2', 2))
        self.market_community.start_transaction = mocked_start_transaction
        self.market_community.order_manager.order_repository.add(self.order)

        self.market_community.on_proposed_trade(
            [self.get_proposed_trade_msg()])
        self.assertTrue(mocked_start_transaction.called)

    @blocking_call_on_reactor_thread
    def test_on_proposed_trade_decline(self):
        """
        Test whether we decline a trade when we receive an invalid proposed trade message
        """
        def mocked_send_decline_trade(*_):
            mocked_send_decline_trade.called = True

        mocked_send_decline_trade.called = False

        self.market_community.update_ip(TraderId(self.market_community.mid),
                                        ('2.2.2.2', 2))
        self.market_community.send_declined_trade = mocked_send_decline_trade
        self.market_community.order_manager.order_repository.add(self.order)

        self.proposed_trade._price = Price(900, 'DUM1')
        self.market_community.on_proposed_trade(
            [self.get_proposed_trade_msg()])
        self.assertTrue(mocked_send_decline_trade.called)

    @blocking_call_on_reactor_thread
    def test_on_proposed_trade_counter(self):
        """
        Test whether we send a counter trade when we receive a proposed trade message
        """
        def mocked_send_counter_trade(*_):
            mocked_send_counter_trade.called = True

        mocked_send_counter_trade.called = False

        self.market_community.update_ip(TraderId(self.market_community.mid),
                                        ('2.2.2.2', 2))
        self.market_community.send_counter_trade = mocked_send_counter_trade
        self.market_community.order_manager.order_repository.add(self.order)

        self.proposed_trade._quantity = Quantity(100000, 'DUM2')
        self.market_community.on_proposed_trade(
            [self.get_proposed_trade_msg()])
        self.assertTrue(mocked_send_counter_trade.called)

    @blocking_call_on_reactor_thread
    def test_on_offer_sync(self):
        """
        Test whether the right operations happen when we receive an offer sync
        """
        self.assertEqual(len(self.market_community.order_book.asks), 0)
        self.assertEqual(len(self.market_community.order_book.bids), 0)

        self.market_community.update_ip(TraderId(self.market_community.mid),
                                        ('2.2.2.2', 2))
        self.market_community.on_offer_sync([self.get_offer_sync(self.ask)])
        self.assertEqual(len(self.market_community.order_book.asks), 1)
        self.market_community.order_book.remove_tick(self.ask.order_id)
        self.market_community.on_offer_sync([self.get_offer_sync(self.bid)])
        self.assertEqual(len(self.market_community.order_book.bids), 1)

    @blocking_call_on_reactor_thread
    def test_compute_reputation(self):
        """
        Test the compute_reputation method
        """
        self.market_community.tradechain_community = MockObject()
        self.market_community.tradechain_community.persistence = MockObject()
        self.market_community.tradechain_community.persistence.get_all_blocks = lambda: [
        ]
        self.market_community.compute_reputation()
        self.assertFalse(self.market_community.reputation_dict)

    @blocking_call_on_reactor_thread
    def test_abort_transaction(self):
        """
        Test aborting a transaction
        """
        self.order.reserve_quantity_for_tick(
            OrderId(TraderId('0'), OrderNumber(23)), Quantity(30, 'DUM2'))
        self.market_community.order_manager.order_repository.add(self.order)
        self.market_community.update_ip(TraderId('0'), ("127.0.0.1", 1234))
        self.market_community.start_transaction(self.proposed_trade)
        transaction = self.market_community.transaction_manager.find_all()[0]
        self.assertTrue(transaction)
        self.assertEqual(self.order.reserved_quantity, Quantity(30, 'DUM2'))
        self.market_community.abort_transaction(transaction)

        order = self.market_community.order_manager.order_repository.find_by_id(
            transaction.order_id)
        self.assertEqual(order.reserved_quantity, Quantity(0, 'DUM2'))
Пример #5
0
    def load_ipv8_overlays(self):
        # Discovery Community
        with open(self.session.config.get_permid_keypair_filename(),
                  'r') as key_file:
            content = key_file.read()
        content = content[31:-30].replace('\n', '').decode("BASE64")
        peer = Peer(M2CryptoSK(keystring=content))
        discovery_community = DiscoveryCommunity(peer, self.ipv8.endpoint,
                                                 self.ipv8.network)
        discovery_community.resolve_dns_bootstrap_addresses()
        self.ipv8.overlays.append(discovery_community)
        self.ipv8.strategies.append((RandomChurn(discovery_community), -1))

        if not self.session.config.get_dispersy_enabled():
            self.ipv8.strategies.append((RandomWalk(discovery_community), 20))

        # TriblerChain Community
        if self.session.config.get_trustchain_enabled():
            triblerchain_peer = Peer(self.session.trustchain_keypair)

            from Tribler.community.triblerchain.community import TriblerChainCommunity
            self.triblerchain_community = TriblerChainCommunity(
                triblerchain_peer,
                self.ipv8.endpoint,
                self.ipv8.network,
                tribler_session=self.session,
                working_directory=self.session.config.get_state_dir())
            self.ipv8.overlays.append(self.triblerchain_community)
            self.ipv8.strategies.append(
                (EdgeWalk(self.triblerchain_community), 20))

        # Tunnel Community
        if self.session.config.get_tunnel_community_enabled():
            tunnel_peer = Peer(self.session.trustchain_keypair)

            from Tribler.community.triblertunnel.community import TriblerTunnelCommunity
            self.tunnel_community = TriblerTunnelCommunity(
                tunnel_peer,
                self.ipv8.endpoint,
                self.ipv8.network,
                tribler_session=self.session,
                dht_provider=MainlineDHTProvider(
                    self.mainline_dht,
                    self.session.config.get_dispersy_port()),
                triblerchain_community=self.triblerchain_community)
            self.ipv8.overlays.append(self.tunnel_community)
            self.ipv8.strategies.append(
                (RandomWalk(self.tunnel_community), 20))

        # Market Community
        if self.session.config.get_market_community_enabled():
            wallets = {}

            try:
                from Tribler.community.market.wallet.btc_wallet import BitcoinWallet, BitcoinTestnetWallet
                wallet_type = BitcoinTestnetWallet if self.session.config.get_btc_testnet(
                ) else BitcoinWallet
                btc_wallet = wallet_type(
                    os.path.join(self.session.config.get_state_dir(),
                                 'wallet'))
                wallets[btc_wallet.get_identifier()] = btc_wallet
            except ImportError:
                self._logger.error(
                    "Electrum wallet cannot be found, Bitcoin trading not available!"
                )

            mc_wallet = TrustchainWallet(self.triblerchain_community)
            wallets[mc_wallet.get_identifier()] = mc_wallet

            if self.session.config.get_dummy_wallets_enabled():
                # For debugging purposes, we create dummy wallets
                dummy_wallet1 = DummyWallet1()
                wallets[dummy_wallet1.get_identifier()] = dummy_wallet1

                dummy_wallet2 = DummyWallet2()
                wallets[dummy_wallet2.get_identifier()] = dummy_wallet2

            from Tribler.community.market.community import MarketCommunity
            market_peer = Peer(self.session.tradechain_keypair)

            self.market_community = MarketCommunity(
                market_peer,
                self.ipv8.endpoint,
                self.ipv8.network,
                tribler_session=self.session,
                wallets=wallets,
                working_directory=self.session.config.get_state_dir())

            self.ipv8.overlays.append(self.market_community)

            self.ipv8.strategies.append(
                (RandomWalk(self.market_community), 20))
Пример #6
0
class TestMarketConversion(AbstractTestCommunity):

    @blocking_call_on_reactor_thread
    @inlineCallbacks
    def setUp(self, annotate=True):
        yield super(TestMarketConversion, self).setUp(annotate=annotate)
        self.market_community = MarketCommunity(self.dispersy, self.master_member, self.member)
        self.market_community.initialize()
        self.conversion = MarketConversion(self.market_community)

    @blocking_call_on_reactor_thread
    @inlineCallbacks
    def tearDown(self, annotate=True):
        # Don't unload_community() as it never got registered in dispersy on the first place.
        self.market_community.cancel_all_pending_tasks()
        self.market_community = None
        yield super(TestMarketConversion, self).tearDown(annotate=annotate)

    def get_placeholder_msg(self, meta_name):
        """
        Return a placeholder message with a specific meta name
        """
        meta_msg = self.market_community.get_meta_message(meta_name)
        msg = MockObject()
        msg.meta = meta_msg
        return msg

    def test_decode_payload(self):
        """
        Test decoding of a payload
        """
        message = MockObject()
        meta_msg = self.market_community.get_meta_message(u"ask")

        offer_payload = OfferPayload.Implementation(meta_msg, TraderId('abc'), MessageNumber('3'), OrderNumber(4),
                                                    Price(5, 'BTC'), Quantity(6, 'MC'), Timeout(3600), Timestamp.now(),
                                                    'a', 'b', Ttl(3), "1.2.3.4", 1234)
        message.payload = offer_payload

        packet = encode((3.14, 100))
        placeholder = self.get_placeholder_msg(u"ask")
        self.assertRaises(DropPacket, self.conversion._decode_payload, placeholder, 0, packet, [Price])
        self.assertRaises(DropPacket, self.conversion._decode_payload, placeholder, 0, "a2zz", [Price])

    def test_encode_decode_intro_request(self):
        """
        Test encoding and decoding of an introduction request
        """
        message = MockObject()
        meta_msg = self.market_community.get_meta_message(u"dispersy-introduction-request")

        bloomfilter = BloomFilter(0.005, 30, prefix=' ')
        intro_payload = MarketIntroPayload.Implementation(meta_msg, ("127.0.0.1", 1324), ("127.0.0.1", 1234),
                                                          ("127.0.0.1", 1234), True, u"public", None, 3, bloomfilter)
        message.payload = intro_payload
        packet_str = ''.join(self.conversion._encode_introduction_request(message))
        self.assertTrue(packet_str)

        placeholder = self.get_placeholder_msg(u"dispersy-introduction-request")
        _, decoded = self.conversion._decode_introduction_request(placeholder, 0, packet_str)
        self.assertTrue(decoded)

        self.assertRaises(DropPacket, self.conversion._decode_introduction_request, placeholder, 0, 'abc')
        self.assertRaises(DropPacket, self.conversion._decode_introduction_request, placeholder, 0, packet_str + 'b')

        # Add a malformed bloomfilter
        intro_payload = MarketIntroPayload.Implementation(meta_msg, ("127.0.0.1", 1324), ("127.0.0.1", 1234),
                                                          ("127.0.0.1", 1234), True, u"public", None, 3, None)
        message.payload = intro_payload
        packet_str = ''.join(self.conversion._encode_introduction_request(message))
        self.assertRaises(DropPacket, self.conversion._decode_introduction_request, placeholder, 0, packet_str + 'a')
        bf_encoding = pack("!BH", 3, 0) + 'aa'
        self.assertRaises(DropPacket, self.conversion._decode_introduction_request, placeholder, 0,
                          packet_str + bf_encoding)

    def test_encode_decode_offer(self):
        """
        Test encoding and decoding of an offer
        """
        message = MockObject()
        meta_msg = self.market_community.get_meta_message(u"ask")

        offer_payload = OfferPayload.Implementation(meta_msg, TraderId('abc'), MessageNumber('3'), OrderNumber(4),
                                                    Price(5, 'BTC'), Quantity(6, 'MC'), Timeout(3600), Timestamp.now(),
                                                    'a', 'b', Ttl(3), "1.2.3.4", 1234)
        message.payload = offer_payload
        packet, = self.conversion._encode_offer(message)
        self.assertTrue(packet)

        _, decoded = self.conversion._decode_offer(self.get_placeholder_msg(u"ask"), 0, packet)

        self.assertTrue(decoded)
        self.assertEqual(decoded.price, Price(5, 'BTC'))
        self.assertEqual(int(decoded.ttl), 3)

    def test_encode_decode_cancel_order(self):
        """
        Test encoding and decoding of a cancel order
        """
        message = MockObject()
        meta_msg = self.market_community.get_meta_message(u"cancel-order")

        cancel_order_payload = CancelOrderPayload.Implementation(meta_msg, TraderId('abc'), MessageNumber('3'),
                                                                 Timestamp.now(), OrderNumber(4), Ttl(2))
        message.payload = cancel_order_payload
        packet, = self.conversion._encode_cancel_order(message)
        self.assertTrue(packet)

        _, decoded = self.conversion._decode_cancel_order(self.get_placeholder_msg(u"cancel-order"), 0, packet)

        self.assertTrue(decoded)
        self.assertEqual(decoded.order_number, OrderNumber(4))
        self.assertEqual(int(decoded.ttl), 2)

    def test_encode_decode_offer_sync(self):
        """
        Test encoding and decoding of an offer sync
        """
        message = MockObject()
        meta_msg = self.market_community.get_meta_message(u"offer-sync")

        offer_payload = OfferSyncPayload.Implementation(meta_msg, TraderId('abc'), MessageNumber('3'), OrderNumber(4),
                                                        Price(5, 'BTC'), Quantity(6, 'MC'), Timeout(3600),
                                                        Timestamp.now(), 'a', 'b', Ttl(3), "1.2.3.4", 1234, True)
        message.payload = offer_payload
        packet, = self.conversion._encode_offer_sync(message)
        self.assertTrue(packet)

        _, decoded = self.conversion._decode_offer_sync(self.get_placeholder_msg(u"offer-sync"), 0, packet)

        self.assertTrue(decoded)
        self.assertEqual(decoded.price, Price(5, 'BTC'))
        self.assertEqual(int(decoded.ttl), 3)
        self.assertTrue(decoded.is_ask)

    def test_encode_decode_declined_trade(self):
        """
        Test encoding and decoding of an declined trade
        """
        message = MockObject()
        meta_msg = self.market_community.get_meta_message(u"declined-trade")

        trade_payload = DeclinedTradePayload.Implementation(meta_msg, TraderId('abc'), MessageNumber('3'),
                                                            OrderNumber(4), TraderId('def'), OrderNumber(5), 1234,
                                                            Timestamp.now())
        message.payload = trade_payload
        packet, = self.conversion._encode_declined_trade(message)
        self.assertTrue(packet)

        _, decoded = self.conversion._decode_declined_trade(self.get_placeholder_msg(u"declined-trade"), 0, packet)

        self.assertTrue(decoded)
        self.assertEqual(decoded.trader_id, TraderId('abc'))
        self.assertEqual(decoded.recipient_trader_id, TraderId('def'))

    def test_encode_decode_start_transaction(self):
        """
        Test encoding and decoding of a start transaction message
        """
        message = MockObject()
        meta_msg = self.market_community.get_meta_message(u"start-transaction")

        transaction_payload = StartTransactionPayload.Implementation(meta_msg, TraderId('abc'), MessageNumber('3'),
                                                                     TraderId('def'), TransactionNumber(5),
                                                                     TraderId('def'), OrderNumber(3), TraderId('abc'),
                                                                     OrderNumber(4), 1235, Price(5, 'BTC'),
                                                                     Quantity(4, 'MC'), Timestamp.now())
        message.payload = transaction_payload
        packet, = self.conversion._encode_start_transaction(message)
        self.assertTrue(packet)

        _, decoded = self.conversion._decode_start_transaction(
            self.get_placeholder_msg(u"start-transaction"), 0, packet)

        self.assertTrue(decoded)
        self.assertEqual(decoded.trader_id, TraderId('abc'))
        self.assertEqual(decoded.transaction_trader_id, TraderId('def'))

    def test_encode_decode_transaction(self):
        """
        Test encoding and decoding of a transaction message
        """
        message = MockObject()
        meta_msg = self.market_community.get_meta_message(u"end-transaction")

        transaction_payload = TransactionPayload.Implementation(meta_msg, TraderId('abc'), MessageNumber('3'),
                                                                TraderId('def'), TransactionNumber(5), Timestamp.now())
        message.payload = transaction_payload
        packet, = self.conversion._encode_transaction(message)
        self.assertTrue(packet)

        _, decoded = self.conversion._decode_transaction(self.get_placeholder_msg(u"end-transaction"), 0, packet)

        self.assertTrue(decoded)
        self.assertEqual(decoded.trader_id, TraderId('abc'))
        self.assertEqual(decoded.transaction_trader_id, TraderId('def'))

    def test_encode_decode_wallet_info(self):
        """
        Test encoding and decoding of wallet info
        """
        message = MockObject()
        meta_msg = self.market_community.get_meta_message(u"wallet-info")

        wallet_payload = WalletInfoPayload.Implementation(meta_msg, TraderId('abc'), MessageNumber('3'),
                                                          TraderId('def'), TransactionNumber(5), WalletAddress('a'),
                                                          WalletAddress('b'), Timestamp.now())
        message.payload = wallet_payload
        packet, = self.conversion._encode_wallet_info(message)
        self.assertTrue(packet)

        _, decoded = self.conversion._decode_wallet_info(self.get_placeholder_msg(u"wallet-info"), 0, packet)

        self.assertTrue(decoded)
        self.assertEqual(decoded.trader_id, TraderId('abc'))
        self.assertEqual(decoded.transaction_trader_id, TraderId('def'))

    def test_encode_decode_payment(self):
        """
        Test encoding and decoding of a payment
        """
        message = MockObject()
        meta_msg = self.market_community.get_meta_message(u"payment")

        payment_payload = PaymentPayload.Implementation(meta_msg, TraderId('abc'), MessageNumber('3'),
                                                        TraderId('def'), TransactionNumber(5), Quantity(5, 'MC'),
                                                        Price(6, 'BTC'), WalletAddress('a'),
                                                        WalletAddress('b'), PaymentId('abc'), Timestamp.now(), False)
        message.payload = payment_payload
        packet, = self.conversion._encode_payment(message)
        self.assertTrue(packet)

        _, decoded = self.conversion._decode_payment(self.get_placeholder_msg(u"payment"), 0, packet)

        self.assertTrue(decoded)
        self.assertEqual(decoded.trader_id, TraderId('abc'))
        self.assertEqual(decoded.transaction_trader_id, TraderId('def'))
        self.assertEqual(decoded.payment_id, PaymentId('abc'))
        self.assertEqual(decoded.success, False)
Пример #7
0
    def load_ipv8_overlays(self):
        # Discovery Community
        with open(self.session.config.get_permid_keypair_filename(),
                  'r') as key_file:
            content = key_file.read()
        content = content[31:-30].replace('\n', '').decode("BASE64")
        peer = Peer(M2CryptoSK(keystring=content))
        discovery_community = DiscoveryCommunity(peer, self.ipv8.endpoint,
                                                 self.ipv8.network)
        discovery_community.resolve_dns_bootstrap_addresses()
        self.ipv8.overlays.append(discovery_community)
        self.ipv8.strategies.append((RandomChurn(discovery_community), -1))

        if not self.session.config.get_dispersy_enabled():
            self.ipv8.strategies.append((RandomWalk(discovery_community), 20))

        # TrustChain Community
        if self.session.config.get_trustchain_enabled():
            from Tribler.pyipv8.ipv8.attestation.trustchain.community import TrustChainCommunity
            trustchain_peer = Peer(self.session.trustchain_keypair)

            self.trustchain_community = TrustChainCommunity(
                trustchain_peer,
                self.ipv8.endpoint,
                self.ipv8.network,
                working_directory=self.session.config.get_state_dir(),
                testnet=self.session.config.get_trustchain_testnet())
            self.ipv8.overlays.append(self.trustchain_community)
            self.ipv8.strategies.append(
                (EdgeWalk(self.trustchain_community), 20))

            tc_wallet = TrustchainWallet(self.trustchain_community)
            self.wallets[tc_wallet.get_identifier()] = tc_wallet

        # Tunnel Community
        if self.session.config.get_tunnel_community_enabled():
            tunnel_peer = Peer(self.session.trustchain_keypair)

            from Tribler.community.triblertunnel.community import TriblerTunnelCommunity
            self.tunnel_community = TriblerTunnelCommunity(
                tunnel_peer,
                self.ipv8.endpoint,
                self.ipv8.network,
                tribler_session=self.session,
                dht_provider=MainlineDHTProvider(
                    self.mainline_dht,
                    self.session.config.get_dispersy_port()),
                bandwidth_wallet=self.wallets["MB"])
            self.ipv8.overlays.append(self.tunnel_community)
            self.ipv8.strategies.append(
                (RandomWalk(self.tunnel_community), 20))

        # Market Community
        if self.session.config.get_market_community_enabled():
            from Tribler.community.market.community import MarketCommunity
            market_peer = Peer(self.session.trustchain_keypair)

            self.market_community = MarketCommunity(
                market_peer,
                self.ipv8.endpoint,
                self.ipv8.network,
                tribler_session=self.session,
                trustchain=self.trustchain_community,
                wallets=self.wallets,
                working_directory=self.session.config.get_state_dir())

            self.ipv8.overlays.append(self.market_community)

            self.ipv8.strategies.append(
                (RandomWalk(self.market_community), 20))

        # Popular Community
        if self.session.config.get_popularity_community_enabled():
            from Tribler.community.popularity.community import PopularityCommunity

            local_peer = Peer(self.session.trustchain_keypair)

            self.popularity_community = PopularityCommunity(
                local_peer,
                self.ipv8.endpoint,
                self.ipv8.network,
                torrent_db=self.session.lm.torrent_db,
                session=self.session)

            self.ipv8.overlays.append(self.popularity_community)

            self.ipv8.strategies.append(
                (RandomWalk(self.popularity_community), 20))

            self.popularity_community.start()
Пример #8
0
class TestMarketConversion(AbstractTestCommunity):
    @blocking_call_on_reactor_thread
    @inlineCallbacks
    def setUp(self, annotate=True):
        yield super(TestMarketConversion, self).setUp(annotate=annotate)
        self.market_community = MarketCommunity(self.dispersy,
                                                self.master_member,
                                                self.member)
        self.market_community.initialize()
        self.conversion = MarketConversion(self.market_community)

    @blocking_call_on_reactor_thread
    @inlineCallbacks
    def tearDown(self, annotate=True):
        # Don't unload_community() as it never got registered in dispersy on the first place.
        self.market_community.cancel_all_pending_tasks()
        self.market_community = None
        yield super(TestMarketConversion, self).tearDown(annotate=annotate)

    def get_placeholder_msg(self, meta_name):
        """
        Return a placeholder message with a specific meta name
        """
        meta_msg = self.market_community.get_meta_message(meta_name)
        msg = MockObject()
        msg.meta = meta_msg
        return msg

    def test_decode_payload(self):
        """
        Test decoding of a payload
        """
        message = MockObject()
        meta_msg = self.market_community.get_meta_message(
            u"order-status-request")

        offer_payload = OrderStatusRequestPayload.Implementation(
            meta_msg, TraderId('abc'), MessageNumber('3'), Timestamp(1000),
            TraderId('def'), OrderNumber(4), 5)
        message.payload = offer_payload

        packet = encode((3.14, 100))
        placeholder = self.get_placeholder_msg(u"order-status-request")
        self.assertRaises(DropPacket, self.conversion._decode_payload,
                          placeholder, 0, packet, [Price])
        self.assertRaises(DropPacket, self.conversion._decode_payload,
                          placeholder, 0, "a2zz", [Price])

    def test_encode_match(self):
        """
        Test encoding and decoding of a match message
        """
        message = MockObject()
        meta_msg = self.market_community.get_meta_message(u"match")

        match_payload = MatchPayload.Implementation(meta_msg, TraderId('abc'),
                                                    MessageNumber('3'),
                                                    OrderNumber(4),
                                                    Price(1, 'BTC'),
                                                    Quantity(2, 'MC'),
                                                    Timeout(3600),
                                                    Timestamp.now(),
                                                    '192.168.1.1', 1234,
                                                    OrderNumber(3),
                                                    Quantity(2, 'MC'),
                                                    TraderId('abc'),
                                                    TraderId('def'),
                                                    'match_id')
        message.payload = match_payload
        packet, = self.conversion._encode_match(message)
        self.assertTrue(packet)

        _, decoded = self.conversion._decode_match(
            self.get_placeholder_msg(u"match"), 0, packet)

        self.assertTrue(decoded)
        self.assertEqual(decoded.match_id, 'match_id')

    def test_encode_accept_match(self):
        """
        Test encoding and decoding of an accept-match message
        """
        message = MockObject()
        meta_msg = self.market_community.get_meta_message(u"accept-match")

        match_payload = AcceptMatchPayload.Implementation(
            meta_msg, TraderId('abc'), MessageNumber('3'), Timestamp.now(),
            'match_id', Quantity(2, 'MC'))
        message.payload = match_payload
        packet, = self.conversion._encode_accept_match(message)
        self.assertTrue(packet)

        _, decoded = self.conversion._decode_accept_match(
            self.get_placeholder_msg(u"accept-match"), 0, packet)

        self.assertTrue(decoded)
        self.assertEqual(decoded.match_id, 'match_id')

    def test_encode_decline_match(self):
        """
        Test encoding and decoding of a decline-match message
        """
        message = MockObject()
        meta_msg = self.market_community.get_meta_message(u"decline-match")

        match_payload = DeclineMatchPayload.Implementation(
            meta_msg, TraderId('abc'), MessageNumber('3'), Timestamp.now(),
            'match_id', DeclinedTradeReason.ORDER_COMPLETED)
        message.payload = match_payload
        packet, = self.conversion._encode_decline_match(message)
        self.assertTrue(packet)

        _, decoded = self.conversion._decode_decline_match(
            self.get_placeholder_msg(u"decline-match"), 0, packet)

        self.assertTrue(decoded)
        self.assertEqual(decoded.match_id, 'match_id')
        self.assertEqual(decoded.decline_reason,
                         DeclinedTradeReason.ORDER_COMPLETED)

    def test_encode_decode_declined_trade(self):
        """
        Test encoding and decoding of an declined trade
        """
        message = MockObject()
        meta_msg = self.market_community.get_meta_message(u"declined-trade")

        trade_payload = DeclinedTradePayload.Implementation(
            meta_msg, TraderId('abc'), MessageNumber('3'), OrderNumber(4),
            TraderId('def'), OrderNumber(5), 1234, Timestamp.now(),
            DeclinedTradeReason.ORDER_COMPLETED)
        message.payload = trade_payload
        packet, = self.conversion._encode_declined_trade(message)
        self.assertTrue(packet)

        _, decoded = self.conversion._decode_declined_trade(
            self.get_placeholder_msg(u"declined-trade"), 0, packet)

        self.assertTrue(decoded)
        self.assertEqual(decoded.trader_id, TraderId('abc'))
        self.assertEqual(decoded.recipient_trader_id, TraderId('def'))

    def test_encode_decode_start_transaction(self):
        """
        Test encoding and decoding of a start transaction message
        """
        message = MockObject()
        meta_msg = self.market_community.get_meta_message(u"start-transaction")

        transaction_payload = StartTransactionPayload.Implementation(
            meta_msg, TraderId('abc'), MessageNumber('3'), TraderId('def'),
            TransactionNumber(5), TraderId('def'), OrderNumber(3),
            TraderId('abc'), OrderNumber(4), 1235, Price(5, 'BTC'),
            Quantity(4, 'MC'), Timestamp.now())
        message.payload = transaction_payload
        packet, = self.conversion._encode_start_transaction(message)
        self.assertTrue(packet)

        _, decoded = self.conversion._decode_start_transaction(
            self.get_placeholder_msg(u"start-transaction"), 0, packet)

        self.assertTrue(decoded)
        self.assertEqual(decoded.trader_id, TraderId('abc'))
        self.assertEqual(decoded.transaction_trader_id, TraderId('def'))

    def test_encode_decode_wallet_info(self):
        """
        Test encoding and decoding of wallet info
        """
        message = MockObject()
        meta_msg = self.market_community.get_meta_message(u"wallet-info")

        wallet_payload = WalletInfoPayload.Implementation(
            meta_msg, TraderId('abc'), MessageNumber('3'), TraderId('def'),
            TransactionNumber(5), WalletAddress('a'), WalletAddress('b'),
            Timestamp.now())
        message.payload = wallet_payload
        packet, = self.conversion._encode_wallet_info(message)
        self.assertTrue(packet)

        _, decoded = self.conversion._decode_wallet_info(
            self.get_placeholder_msg(u"wallet-info"), 0, packet)

        self.assertTrue(decoded)
        self.assertEqual(decoded.trader_id, TraderId('abc'))
        self.assertEqual(decoded.transaction_trader_id, TraderId('def'))

    def test_encode_decode_payment(self):
        """
        Test encoding and decoding of a payment
        """
        message = MockObject()
        meta_msg = self.market_community.get_meta_message(u"payment")

        payment_payload = PaymentPayload.Implementation(
            meta_msg, TraderId('abc'), MessageNumber('3'), TraderId('def'),
            TransactionNumber(5), Quantity(5, 'MC'), Price(6, 'BTC'),
            WalletAddress('a'), WalletAddress('b'), PaymentId('abc'),
            Timestamp.now(), False)
        message.payload = payment_payload
        packet, = self.conversion._encode_payment(message)
        self.assertTrue(packet)

        _, decoded = self.conversion._decode_payment(
            self.get_placeholder_msg(u"payment"), 0, packet)

        self.assertTrue(decoded)
        self.assertEqual(decoded.trader_id, TraderId('abc'))
        self.assertEqual(decoded.transaction_trader_id, TraderId('def'))
        self.assertEqual(decoded.payment_id, PaymentId('abc'))
        self.assertEqual(decoded.success, False)

    def test_encode_decode_order_status_request(self):
        """
        Test encoding and decoding of a order status request
        """
        message = MockObject()
        meta_msg = self.market_community.get_meta_message(
            u"order-status-request")

        payload = OrderStatusRequestPayload.Implementation(
            meta_msg, TraderId('abc'), MessageNumber('3'), Timestamp.now(),
            TraderId('def'), OrderNumber(5), 1234)
        message.payload = payload
        packet, = self.conversion._encode_order_status_request(message)
        self.assertTrue(packet)

        _, decoded = self.conversion._decode_order_status_request(
            self.get_placeholder_msg(u"order-status-request"), 0, packet)

        self.assertTrue(decoded)
        self.assertEqual(decoded.trader_id, TraderId('abc'))
        self.assertEqual(decoded.identifier, 1234)