コード例 #1
0
ファイル: test_ledger.py プロジェクト: cheechdiddy78/lbry-sdk
 async def asyncSetUp(self):
     self.ledger = Ledger({
         'db': Database(':memory:'),
         'headers': Headers(':memory:')
     })
     self.account = Account.generate(self.ledger, Wallet(), "lbryum")
     await self.ledger.db.open()
コード例 #2
0
ファイル: test_account.py プロジェクト: zhyniq/lbry-sdk
 async def asyncSetUp(self):
     self.ledger = Ledger({
         'db': Database(':memory:'),
         'headers': Headers(':memory:')
     })
     await self.ledger.db.open()
     self.account = Account.generate(self.ledger, Wallet(), "torba", {'name': 'single-address'})
コード例 #3
0
ファイル: test_account.py プロジェクト: zhyniq/lbry-sdk
 async def test_save_max_gap(self):
     account = Account.generate(
         self.ledger, Wallet(), 'lbryum', {
                 'name': 'deterministic-chain',
                 'receiving': {'gap': 3, 'maximum_uses_per_address': 2},
                 'change': {'gap': 4, 'maximum_uses_per_address': 2}
             }
     )
     self.assertEqual(account.receiving.gap, 3)
     self.assertEqual(account.change.gap, 4)
     await account.save_max_gap()
     self.assertEqual(account.receiving.gap, 20)
     self.assertEqual(account.change.gap, 6)
     # doesn't fail for single-address account
     account2 = Account.generate(self.ledger, Wallet(), 'lbryum', {'name': 'single-address'})
     await account2.save_max_gap()
コード例 #4
0
ファイル: test_account.py プロジェクト: kodxana/lbry-sdk
    async def test_get_or_create_usable_address(self):
        account = Account.generate(self.ledger, Wallet(), 'lbryum')

        keys = await account.receiving.get_addresses()
        self.assertEqual(len(keys), 0)

        address = await account.receiving.get_or_create_usable_address()
        self.assertIsNotNone(address)

        keys = await account.receiving.get_addresses()
        self.assertEqual(len(keys), 20)
コード例 #5
0
    async def test_update_history(self):
        account = Account.generate(self.ledger, Wallet(), "torba")
        address = await account.receiving.get_or_create_usable_address()
        address_details = await self.ledger.db.get_address(address=address)
        self.assertIsNone(address_details['history'])

        self.add_header(block_height=0, merkle_root=b'abcd04')
        self.add_header(block_height=1, merkle_root=b'abcd04')
        self.add_header(block_height=2, merkle_root=b'abcd04')
        self.add_header(block_height=3, merkle_root=b'abcd04')
        self.ledger.network = MockNetwork([
            {'tx_hash': 'abcd01', 'height': 0},
            {'tx_hash': 'abcd02', 'height': 1},
            {'tx_hash': 'abcd03', 'height': 2},
        ], {
            'abcd01': hexlify(get_transaction(get_output(1)).raw),
            'abcd02': hexlify(get_transaction(get_output(2)).raw),
            'abcd03': hexlify(get_transaction(get_output(3)).raw),
        })
        await self.ledger.update_history(address, '')
        self.assertListEqual(self.ledger.network.get_history_called, [address])
        self.assertListEqual(self.ledger.network.get_transaction_called, ['abcd01', 'abcd02', 'abcd03'])

        address_details = await self.ledger.db.get_address(address=address)
        self.assertEqual(
            address_details['history'],
            '252bda9b22cc902ca2aa2de3548ee8baf06b8501ff7bfb3b0b7d980dbd1bf792:0:'
            'ab9c0654dd484ac20437030f2034e25dcb29fc507e84b91138f80adc3af738f9:1:'
            'a2ae3d1db3c727e7d696122cab39ee20a7f81856dab7019056dd539f38c548a0:2:'
        )

        self.ledger.network.get_history_called = []
        self.ledger.network.get_transaction_called = []
        await self.ledger.update_history(address, '')
        self.assertListEqual(self.ledger.network.get_history_called, [address])
        self.assertListEqual(self.ledger.network.get_transaction_called, [])

        self.ledger.network.history.append({'tx_hash': 'abcd04', 'height': 3})
        self.ledger.network.transaction['abcd04'] = hexlify(get_transaction(get_output(4)).raw)
        self.ledger.network.get_history_called = []
        self.ledger.network.get_transaction_called = []
        await self.ledger.update_history(address, '')
        self.assertListEqual(self.ledger.network.get_history_called, [address])
        self.assertListEqual(self.ledger.network.get_transaction_called, ['abcd04'])
        address_details = await self.ledger.db.get_address(address=address)
        self.assertEqual(
            address_details['history'],
            '252bda9b22cc902ca2aa2de3548ee8baf06b8501ff7bfb3b0b7d980dbd1bf792:0:'
            'ab9c0654dd484ac20437030f2034e25dcb29fc507e84b91138f80adc3af738f9:1:'
            'a2ae3d1db3c727e7d696122cab39ee20a7f81856dab7019056dd539f38c548a0:2:'
            '047cf1d53ef68f0fd586d46f90c09ff8e57a4180f67e7f4b8dd0135c3741e828:3:'
        )
コード例 #6
0
ファイル: test_account.py プロジェクト: kodxana/lbry-sdk
 async def test_unused_address_on_account_creation_does_not_cause_a_race(
         self):
     account = Account.generate(self.ledger, Wallet(), 'lbryum')
     await account.ledger.db.db.executescript(
         "update pubkey_address set used_times=10")
     await account.receiving.address_generator_lock.acquire()
     delayed1 = asyncio.ensure_future(
         account.receiving.ensure_address_gap())
     delayed = asyncio.ensure_future(
         account.receiving.get_or_create_usable_address())
     await asyncio.sleep(0)
     # wallet being created and queried at the same time
     account.receiving.address_generator_lock.release()
     await delayed1
     await delayed
コード例 #7
0
ファイル: test_account.py プロジェクト: kodxana/lbry-sdk
    async def test_generate_account(self):
        account = Account.generate(self.ledger, Wallet(), 'lbryum')
        self.assertEqual(account.ledger, self.ledger)
        self.assertIsNotNone(account.seed)
        self.assertEqual(account.public_key.ledger, self.ledger)
        self.assertEqual(account.private_key.public_key, account.public_key)

        self.assertEqual(account.public_key.ledger, self.ledger)
        self.assertEqual(account.private_key.public_key, account.public_key)

        addresses = await account.receiving.get_addresses()
        self.assertEqual(len(addresses), 0)
        addresses = await account.change.get_addresses()
        self.assertEqual(len(addresses), 0)

        await account.ensure_address_gap()

        addresses = await account.receiving.get_addresses()
        self.assertEqual(len(addresses), 20)
        addresses = await account.change.get_addresses()
        self.assertEqual(len(addresses), 6)
コード例 #8
0
ファイル: test_account.py プロジェクト: zhyniq/lbry-sdk
    async def test_ensure_address_gap(self):
        account = Account.generate(self.ledger, Wallet(), 'lbryum')

        self.assertIsInstance(account.receiving, HierarchicalDeterministic)

        async with account.receiving.address_generator_lock:
            await account.receiving._generate_keys(4, 7)
            await account.receiving._generate_keys(0, 3)
            await account.receiving._generate_keys(8, 11)
        records = await account.receiving.get_address_records()
        self.assertListEqual(
            [r['pubkey'].n for r in records],
            [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
        )

        # we have 12, but default gap is 20
        new_keys = await account.receiving.ensure_address_gap()
        self.assertEqual(len(new_keys), 8)
        records = await account.receiving.get_address_records()
        self.assertListEqual(
            [r['pubkey'].n for r in records],
            [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
        )

        # case #1: no new addresses needed
        empty = await account.receiving.ensure_address_gap()
        self.assertEqual(len(empty), 0)

        # case #2: only one new addressed needed
        records = await account.receiving.get_address_records()
        await self.ledger.db.set_address_history(records[0]['address'], 'a:1:')
        new_keys = await account.receiving.ensure_address_gap()
        self.assertEqual(len(new_keys), 1)

        # case #3: 20 addresses needed
        await self.ledger.db.set_address_history(new_keys[0], 'a:1:')
        new_keys = await account.receiving.ensure_address_gap()
        self.assertEqual(len(new_keys), 20)
コード例 #9
0
 async def create_account(self, wallet=None):
     account = Account.generate(self.ledger, wallet or self.wallet)
     await account.ensure_address_gap()
     return account
コード例 #10
0
ファイル: test_account.py プロジェクト: kodxana/lbry-sdk
 async def test_generate_keys_over_batch_threshold_saves_it_properly(self):
     account = Account.generate(self.ledger, Wallet(), 'lbryum')
     async with account.receiving.address_generator_lock:
         await account.receiving._generate_keys(0, 200)
     records = await account.receiving.get_address_records()
     self.assertEqual(len(records), 201)
コード例 #11
0
ファイル: test_ledger.py プロジェクト: cheechdiddy78/lbry-sdk
    async def test_update_history(self):
        txid1 = '252bda9b22cc902ca2aa2de3548ee8baf06b8501ff7bfb3b0b7d980dbd1bf792'
        txid2 = 'ab9c0654dd484ac20437030f2034e25dcb29fc507e84b91138f80adc3af738f9'
        txid3 = 'a2ae3d1db3c727e7d696122cab39ee20a7f81856dab7019056dd539f38c548a0'
        txid4 = '047cf1d53ef68f0fd586d46f90c09ff8e57a4180f67e7f4b8dd0135c3741e828'

        account = Account.generate(self.ledger, Wallet(), "torba")
        address = await account.receiving.get_or_create_usable_address()
        address_details = await self.ledger.db.get_address(address=address)
        self.assertIsNone(address_details['history'])

        self.add_header(block_height=0, merkle_root=b'abcd04')
        self.add_header(block_height=1, merkle_root=b'abcd04')
        self.add_header(block_height=2, merkle_root=b'abcd04')
        self.add_header(block_height=3, merkle_root=b'abcd04')
        self.ledger.network = MockNetwork(
            [
                {
                    'tx_hash': txid1,
                    'height': 0
                },
                {
                    'tx_hash': txid2,
                    'height': 1
                },
                {
                    'tx_hash': txid3,
                    'height': 2
                },
            ], {
                txid1: hexlify(get_transaction(get_output(1)).raw),
                txid2: hexlify(get_transaction(get_output(2)).raw),
                txid3: hexlify(get_transaction(get_output(3)).raw),
            })
        await self.ledger.update_history(address, '')
        self.assertListEqual(self.ledger.network.get_history_called, [address])
        self.assertListEqual(self.ledger.network.get_transaction_called,
                             [txid1, txid2, txid3])

        address_details = await self.ledger.db.get_address(address=address)

        self.assertEqual(address_details['history'], f'{txid1}:0:'
                         f'{txid2}:1:'
                         f'{txid3}:2:')

        self.ledger.network.get_history_called = []
        self.ledger.network.get_transaction_called = []
        for cache_item in self.ledger._tx_cache.values():
            cache_item.tx.is_verified = True
        await self.ledger.update_history(address, '')
        self.assertListEqual(self.ledger.network.get_history_called, [address])
        self.assertListEqual(self.ledger.network.get_transaction_called, [])

        self.ledger.network.history.append({'tx_hash': txid4, 'height': 3})
        self.ledger.network.transaction[txid4] = hexlify(
            get_transaction(get_output(4)).raw)
        self.ledger.network.get_history_called = []
        self.ledger.network.get_transaction_called = []
        await self.ledger.update_history(address, '')
        self.assertListEqual(self.ledger.network.get_history_called, [address])
        self.assertListEqual(self.ledger.network.get_transaction_called,
                             [txid4])
        address_details = await self.ledger.db.get_address(address=address)
        self.assertEqual(
            address_details['history'], f'{txid1}:0:'
            f'{txid2}:1:'
            f'{txid3}:2:'
            f'{txid4}:3:')