예제 #1
0
파일: test_Wallet.py 프로젝트: kstuart/QRL
    def test_encrypt(self):
        with set_wallet_dir("no_data"):
            with set_wallet_dir("no_data"):
                wallet = Wallet()
                wallet.add_new_address(height=4)

                wallet_b = Wallet()

                self.assertEqual(1, len(wallet_b.address_items))
                self.assertEqual(wallet.address_items[0],
                                 wallet_b.address_items[0])

                TEST_KEY = 'mytestkey'

                wallet_b.encrypt(TEST_KEY)
                wallet_b.save()

                self.assertEqual(1, len(wallet_b.address_items))
                self.assertNotEqual(wallet.address_items[0],
                                    wallet_b.address_items[0])

                wallet_c = Wallet()
                self.assertEqual(1, len(wallet_c.address_items))
                self.assertTrue(wallet_c.address_items[0].encrypted)

                wallet_c.decrypt(TEST_KEY)
                self.assertFalse(wallet_c.address_items[0].encrypted)
                self.assertEqual(wallet.address_items[0],
                                 wallet_c.address_items[0])
예제 #2
0
    def test_last_block(self):
        with set_wallet_dir("test_wallet"):
            with State() as state:
                self.assertIsNotNone(state)

                chain = Chain(state)
                alice_xmss = get_alice_xmss()
                staking_address = bytes(alice_xmss.get_address().encode())

                address_state_dict = dict()
                address_state_dict[staking_address] = AddressState.create(address=staking_address,
                                                                          nonce=0,
                                                                          balance=100,
                                                                          pubhashes=[])

                tmp_block1 = Block.create(staking_address=staking_address,
                                          block_number=0,
                                          reveal_hash=bytes(),
                                          prevblock_headerhash=bytes(),
                                          transactions=[],
                                          duplicate_transactions=OrderedDict(),
                                          vote=VoteMetadata(),
                                          signing_xmss=alice_xmss,
                                          nonce=address_state_dict[staking_address].nonce + 1)

                res = chain.add_block(tmp_block1, address_state_dict, None)
                address_state_dict[staking_address].increase_nonce()
                address_state_dict[staking_address].balance += tmp_block1.block_reward
                self.assertTrue(res)
                self.assertEqual(0, chain.height)           # FIXME: wrong name, it is not height but max_index

                last_block = chain.get_last_block()
                self.assertEqual(tmp_block1, last_block)
예제 #3
0
 def test_create_wallet(self):
     with set_wallet_dir("no_wallet"):
         wallet = Wallet()
         self.assertIsNotNone(wallet)
         wallet_file_path = os.path.join(config.user.wallet_path,
                                         "wallet.qrl")
         self.assertTrue(isfile(wallet_file_path))
예제 #4
0
    def test_transferCoins_get_unsigned(self):
        with set_data_dir('no_data'):
            with State() as db_state:
                with set_wallet_dir("test_wallet"):
                    p2p_factory = Mock(spec=P2PFactory)
                    p2p_factory.pow = Mock(spec=POW)
                    chain_manager = ChainManager(db_state)

                    qrlnode = QRLNode(db_state, slaves=[])
                    qrlnode.set_chain_manager(chain_manager)
                    qrlnode._p2pfactory = p2p_factory
                    qrlnode._pow = p2p_factory.pow
                    qrlnode._peer_addresses = ['127.0.0.1', '192.168.1.1']

                    service = PublicAPIService(qrlnode)

                    context = Mock(spec=ServicerContext)

                    alice = get_alice_xmss()
                    bob = get_bob_xmss()

                    request = qrl_pb2.TransferCoinsReq(
                        address_from=alice.address,
                        addresses_to=[bob.address],
                        amounts=[101],
                        fee=12,
                        xmss_pk=alice.pk)

                    response = service.TransferCoins(request=request,
                                                     context=context)
                    context.set_code.assert_not_called()
                    context.set_details.assert_not_called()

                    self.assertIsNotNone(response)
                    self.assertIsNotNone(response.transaction_unsigned)
                    self.assertEqual(
                        'transfer',
                        response.transaction_unsigned.WhichOneof(
                            'transactionType'))

                    self.assertEqual(alice.address,
                                     response.transaction_unsigned.addr_from)
                    self.assertEqual(12, response.transaction_unsigned.fee)
                    self.assertEqual(alice.pk,
                                     response.transaction_unsigned.public_key)
                    self.assertEqual(0, response.transaction_unsigned.nonce)

                    self.assertEqual(b'',
                                     response.transaction_unsigned.signature)
                    self.assertEqual(
                        b'', response.transaction_unsigned.transaction_hash)

                    self.assertEqual(
                        bob.address,
                        response.transaction_unsigned.transfer.addrs_to[0])
                    self.assertEqual(
                        101, response.transaction_unsigned.transfer.amounts[0])
예제 #5
0
파일: test_Wallet.py 프로젝트: kstuart/QRL
    def test_create_load(self):
        with set_wallet_dir("no_data"):
            wallet = Wallet()
            wallet.add_new_address(height=4)

            wallet_b = Wallet()
            self.assertEqual(1, len(wallet_b.address_items))

            self.assertEqual(wallet.address_items[0],
                             wallet_b.address_items[0])
예제 #6
0
 def test_getnewaddress(self):
     with set_wallet_dir("test_wallet"):
         wallet = Wallet()
         S1 = hstr2bin(
             '7bf1e7c1c84be2c820211572d990c0430e09401053ce2af489ee3e4d030c027464d9cac1fff449a2405b7f3fc63018a4'
         )
         address = wallet.get_new_address(seed=S1)
         self.assertIsNotNone(address.address)
         self.assertEqual(
             b'Q56e5d6410a5716e548d89ca27b8f057122af9560ba3cd8aa99879f32758330267811af83',
             address.address)
예제 #7
0
파일: test_Wallet.py 프로젝트: kstuart/QRL
    def test_create(self):
        with set_wallet_dir("no_data"):
            wallet = Wallet()
            self.assertEqual(0, len(wallet.address_items))

            xmss1 = wallet.add_new_address(4)
            self.assertEqual(1, len(wallet.address_items))

            xmss2 = wallet.get_xmss_by_index(0)

            self.assertEqual(xmss1.address, xmss2.address)
            self.assertEqual(xmss1.mnemonic, xmss2.mnemonic)
예제 #8
0
    def test_create(self):
        with set_wallet_dir("test_wallet"):
            with State() as state:
                self.assertIsNotNone(state)

                chain = Chain(state)
                self.assertIsNotNone(chain)

                self.assertEqual(chain.staking_address,
                                 b'Q1d6222fe3e53fafe8ce33acd2f8385c6dc044ab55452f0ebceb4d00233935ffaa72dd826')

                self.assertEqual(chain.wallet.address_bundle[0].address,
                                 b'Q1d6222fe3e53fafe8ce33acd2f8385c6dc044ab55452f0ebceb4d00233935ffaa72dd826')
예제 #9
0
    def test_add_many_and_save(self):
        with set_wallet_dir("test_wallet"):
            with State() as state:
                self.assertIsNotNone(state)

                chain = Chain(state)
                alice_xmss = get_alice_xmss()
                staking_address = bytes(alice_xmss.get_address().encode())

                with patch('qrl.core.config.dev.disk_writes_after_x_blocks'):
                    qrl.core.config.dev.disk_writes_after_x_blocks = 4

                    prev = bytes()
                    address_state_dict = dict()
                    address_state_dict[staking_address] = AddressState.create(
                        address=staking_address,
                        nonce=0,
                        balance=100,
                        pubhashes=[])
                    for i in range(10):
                        tmp_block1 = Block.create(
                            staking_address=staking_address,
                            block_number=i,
                            reveal_hash=bytes(),
                            prevblock_headerhash=prev,
                            transactions=[],
                            duplicate_transactions=OrderedDict(),
                            vote=VoteMetadata(),
                            signing_xmss=alice_xmss,
                            nonce=address_state_dict[staking_address].nonce +
                            1)
                        prev = tmp_block1.headerhash

                        res = chain.add_block(tmp_block1, address_state_dict,
                                              StakeValidatorsTracker(),
                                              b'1001', alice_xmss)

                        address_state_dict[staking_address].increase_nonce()
                        address_state_dict[
                            staking_address].balance += tmp_block1.block_reward

                        self.assertEqual(
                            i, chain.height
                        )  # FIXME: wrong name, it is not height but max_index

                        self.assertTrue(res)

                print(qrl.core.config.dev.disk_writes_after_x_blocks)
예제 #10
0
    def test_add_genesis(self):
        with State() as state:
            with set_wallet_dir("test_wallet"):
                chain = Mock(spec=Chain)
                chain.height = 0
                chain.get_block = MagicMock(return_value=None)
                chain.wallet = Wallet()
                chain.pstate = state

                buffered_chain = BufferedChain(chain)

                b0 = buffered_chain.get_block(0)
                buffered_chain._chain.get_block.assert_called()
                self.assertIsNone(b0)

                res = buffered_chain.add_block(block=GenesisBlock())
                self.assertTrue(res)
예제 #11
0
    def test_create(self):
        with set_wallet_dir("test_wallet"):
            # FIXME: cross-dependency
            chain = Mock(spec=Chain)
            chain.height = 0
            chain.get_block = MagicMock(return_value=None)
            chain.get_last_block = MagicMock(return_value=None)
            chain.wallet = Wallet()
            cb = BufferedChain(chain)

            self.assertEqual(0, cb.height)

            tmp_block = cb.get_block(0)
            self.assertIsNone(tmp_block)
            chain.get_block.assert_called()

            tmp_block = cb.get_last_block()
            self.assertIsNone(tmp_block)
예제 #12
0
    def test_add_empty(self):
        destroy_state()
        with State() as state:
            with set_wallet_dir("test_wallet"):
                chain = Mock(spec=Chain)
                chain.height = 0
                chain.get_block = MagicMock(return_value=None)
                chain.wallet = Wallet()
                chain.pstate = state

                buffered_chain = BufferedChain(chain)

                b0 = buffered_chain.get_block(0)
                buffered_chain._chain.get_block.assert_called()
                self.assertIsNone(b0)

                tmp_block = Block()
                res = buffered_chain.add_block(block=tmp_block)
                self.assertFalse(res)
예제 #13
0
파일: test_Wallet.py 프로젝트: kstuart/QRL
    def test_read(self):
        with set_wallet_dir("test_wallet"):
            wallet = Wallet()
            self.assertEqual(1, len(wallet.address_items))

            addr_item = wallet.address_items[0]
            self.assertFalse(addr_item.encrypted)

            self.assertEqual(
                'Q010400d9f1efe5b272e042dcc8ef690f0e90ca8b0b6edba0d26f81e7aff12a6754b21788169f7f',
                addr_item.address)

            xmss0 = wallet.get_xmss_by_index(0)
            self.assertEqual(
                '010400d9f1efe5b272e042dcc8ef690f0e90ca8b0b6edba0d26f81e7aff12a6754b21788169f7f',
                bin2hstr(xmss0.address))

            xmss0b = wallet.get_xmss_by_address(xmss0.address)
            self.assertEqual(
                '010400d9f1efe5b272e042dcc8ef690f0e90ca8b0b6edba0d26f81e7aff12a6754b21788169f7f',
                bin2hstr(xmss0b.address))
예제 #14
0
파일: test_Wallet.py 프로젝트: kstuart/QRL
    def test_read_secure(self):
        with set_wallet_dir("wallet_secure"):
            wallet = Wallet()
            self.assertEqual(1, len(wallet.address_items))

            self.assertTrue(wallet.address_items[0].encrypted)

            wallet.decrypt_item(0, 'test1234')
            addr_item = wallet.address_items[0]

            self.assertEqual(
                'Q010400d9f1efe5b272e042dcc8ef690f0e90ca8b0b6edba0d26f81e7aff12a6754b21788169f7f',
                addr_item.address)

            xmss0 = wallet.get_xmss_by_index(0)
            self.assertEqual(
                '010400d9f1efe5b272e042dcc8ef690f0e90ca8b0b6edba0d26f81e7aff12a6754b21788169f7f',
                bin2hstr(xmss0.address))

            xmss0b = wallet.get_xmss_by_address(xmss0.address)
            self.assertEqual(
                '010400d9f1efe5b272e042dcc8ef690f0e90ca8b0b6edba0d26f81e7aff12a6754b21788169f7f',
                bin2hstr(xmss0b.address))
예제 #15
0
    def test_add_4(self):
        destroy_state()
        with State() as state:
            with set_wallet_dir("test_wallet"):
                chain = Chain(state)
                buffered_chain = BufferedChain(chain)

                alice_xmss = get_alice_xmss()
                slave_xmss = XMSS(alice_xmss.height, alice_xmss.get_seed())
                random_xmss1 = get_random_xmss()
                random_xmss2 = get_random_xmss()
                staking_address = bytes(alice_xmss.get_address().encode())

                # FIXME: Replace this with a call to create a hash_chain
                h0 = sha256(b'hashchain_seed')
                h1 = sha256(h0)
                h2 = sha256(h1)
                h3 = sha256(h2)
                h4 = sha256(h3)

                with mocked_genesis() as custom_genesis:
                    custom_genesis.genesis_balance.extend([
                        qrl_pb2.GenesisBalance(
                            address=alice_xmss.get_address(),
                            balance=700000000000000)
                    ])

                    res = buffered_chain.add_block(block=GenesisBlock())
                    self.assertTrue(res)
                    stake_transaction = StakeTransaction.create(
                        activation_blocknumber=1,
                        xmss=alice_xmss,
                        slavePK=slave_xmss.pk(),
                        hashchain_terminator=h4)
                    stake_transaction._data.nonce = 1  # FIXME: The test needs private access.. This is an API issue
                    stake_transaction.sign(alice_xmss)

                    vote = Vote.create(
                        addr_from=alice_xmss.get_address().encode(),
                        blocknumber=0,
                        headerhash=GenesisBlock().headerhash,
                        xmss=slave_xmss)
                    vote.sign(slave_xmss)
                    buffered_chain.add_vote(vote)
                    vote_metadata = buffered_chain.get_consensus(0)

                    chain.pstate.stake_validators_tracker.add_sv(
                        balance=700000000000000,
                        stake_txn=stake_transaction,
                        blocknumber=1)

                    sv = chain.pstate.stake_validators_tracker.sv_dict[
                        staking_address]
                    self.assertEqual(0, sv.nonce)

                    # Token Transaction to create a token for test
                    token_transaction = get_token_transaction(
                        random_xmss1, random_xmss2)
                    token_transaction._data.nonce = 1
                    token_transaction.sign(random_xmss1)

                    # Transfer Token Transaction
                    transfer_token1 = TransferTokenTransaction.create(
                        addr_from=random_xmss1.get_address().encode(),
                        token_txhash=token_transaction.txhash,
                        addr_to=alice_xmss.get_address().encode(),
                        amount=100000000,
                        fee=1,
                        xmss_pk=random_xmss1.pk(),
                        xmss_ots_index=random_xmss1.get_index())
                    transfer_token1._data.nonce = 2
                    transfer_token1.sign(random_xmss1)

                    transfer_token2 = TransferTokenTransaction.create(
                        addr_from=random_xmss2.get_address().encode(),
                        token_txhash=token_transaction.txhash,
                        addr_to=alice_xmss.get_address().encode(),
                        amount=200000000,
                        fee=1,
                        xmss_pk=random_xmss2.pk(),
                        xmss_ots_index=random_xmss2.get_index())
                    transfer_token2._data.nonce = 1
                    transfer_token2.sign(random_xmss2)

                    # Transfer Coin Transaction
                    transfer_transaction = TransferTransaction.create(
                        addr_from=random_xmss1.get_address().encode(),
                        addr_to=random_xmss2.get_address().encode(),
                        amount=10,
                        fee=1,
                        xmss_pk=random_xmss1.pk(),
                        xmss_ots_index=random_xmss1.get_index())
                    transfer_transaction._data.nonce = 3
                    transfer_transaction.sign(random_xmss1)

                    tmp_block1 = Block.create(
                        staking_address=staking_address,
                        block_number=1,
                        reveal_hash=h3,
                        prevblock_headerhash=GenesisBlock().headerhash,
                        transactions=[stake_transaction, token_transaction],
                        duplicate_transactions=OrderedDict(),
                        vote=vote_metadata,
                        signing_xmss=slave_xmss,
                        nonce=1)

                    res = buffered_chain.add_block(block=tmp_block1)
                    self.assertTrue(res)

                    # Need to move forward the time to align with block times
                    with mock.patch('qrl.core.ntp.getTime') as time_mock:
                        time_mock.return_value = tmp_block1.timestamp + config.dev.minimum_minting_delay

                        vote = Vote.create(
                            addr_from=alice_xmss.get_address().encode(),
                            blocknumber=1,
                            headerhash=tmp_block1.headerhash,
                            xmss=slave_xmss)
                        vote.sign(slave_xmss)
                        buffered_chain.add_vote(vote)
                        vote_metadata = buffered_chain.get_consensus(1)

                        tmp_block2 = Block.create(
                            staking_address=staking_address,
                            block_number=2,
                            reveal_hash=h2,
                            prevblock_headerhash=tmp_block1.headerhash,
                            transactions=[
                                transfer_token1, transfer_token2,
                                transfer_transaction
                            ],
                            duplicate_transactions=OrderedDict(),
                            vote=vote_metadata,
                            signing_xmss=slave_xmss,
                            nonce=2)

                    res = buffered_chain.add_block(block=tmp_block2)
                    self.assertTrue(res)

                    # Need to move forward the time to align with block times
                    with mock.patch('qrl.core.ntp.getTime') as time_mock:
                        time_mock.return_value = tmp_block2.timestamp + config.dev.minimum_minting_delay

                        vote = Vote.create(
                            addr_from=alice_xmss.get_address().encode(),
                            blocknumber=2,
                            headerhash=tmp_block2.headerhash,
                            xmss=slave_xmss)
                        vote.sign(slave_xmss)
                        buffered_chain.add_vote(vote)
                        vote_metadata = buffered_chain.get_consensus(2)

                        tmp_block3 = Block.create(
                            staking_address=staking_address,
                            block_number=3,
                            reveal_hash=h1,
                            prevblock_headerhash=tmp_block2.headerhash,
                            transactions=[],
                            duplicate_transactions=OrderedDict(),
                            vote=vote_metadata,
                            signing_xmss=slave_xmss,
                            nonce=3)

                    res = buffered_chain.add_block(block=tmp_block3)
                    self.assertTrue(res)

                    chain = buffered_chain._chain
                    random_xmss1_state = chain.pstate._get_address_state(
                        random_xmss1.get_address().encode())
                    random_xmss2_state = chain.pstate._get_address_state(
                        random_xmss2.get_address().encode())

                    self.assertEqual(
                        random_xmss1_state.tokens[bin2hstr(
                            token_transaction.txhash).encode()], 400000000)
                    self.assertEqual(
                        random_xmss2_state.tokens[bin2hstr(
                            token_transaction.txhash).encode()], 200000000)

                    # Need to move forward the time to align with block times
                    with mock.patch('qrl.core.ntp.getTime') as time_mock:
                        time_mock.return_value = tmp_block3.timestamp + config.dev.minimum_minting_delay

                        vote = Vote.create(
                            addr_from=alice_xmss.get_address().encode(),
                            blocknumber=3,
                            headerhash=tmp_block3.headerhash,
                            xmss=slave_xmss)
                        vote.sign(slave_xmss)
                        buffered_chain.add_vote(vote)
                        vote_metadata = buffered_chain.get_consensus(3)

                        tmp_block4 = Block.create(
                            staking_address=staking_address,
                            block_number=4,
                            reveal_hash=h0,
                            prevblock_headerhash=tmp_block3.headerhash,
                            transactions=[],
                            duplicate_transactions=OrderedDict(),
                            vote=vote_metadata,
                            signing_xmss=slave_xmss,
                            nonce=4)

                    res = buffered_chain.add_block(block=tmp_block4)
                    self.assertTrue(res)

                    token_metadata = buffered_chain.get_token_metadata(
                        token_transaction.txhash)

                    self.assertEqual(token_metadata.token_txhash,
                                     token_transaction.txhash)
                    self.assertEqual(
                        len(token_metadata.transfer_token_tx_hashes), 3)
                    self.assertEqual(
                        token_metadata.transfer_token_tx_hashes[0],
                        token_transaction.txhash)

                    random_xmss1_state = chain.pstate._get_address_state(
                        random_xmss1.get_address().encode())
                    random_xmss2_state = chain.pstate._get_address_state(
                        random_xmss2.get_address().encode())
                    alice_state = chain.pstate._get_address_state(
                        alice_xmss.get_address().encode())

                    self.assertEqual(
                        random_xmss1_state.tokens[bin2hstr(
                            token_transaction.txhash).encode()], 300000000)
                    self.assertEqual(
                        random_xmss2_state.tokens[bin2hstr(
                            token_transaction.txhash).encode()], 0)
                    self.assertEqual(
                        alice_state.tokens[bin2hstr(
                            token_transaction.txhash).encode()], 300000000)
                    self.assertEqual(random_xmss1_state.balance,
                                     config.dev.default_account_balance - 13)
                    self.assertEqual(random_xmss2_state.balance,
                                     config.dev.default_account_balance + 9)
예제 #16
0
    def test_add_3(self):
        destroy_state()
        with State() as state:
            with set_wallet_dir("test_wallet"):
                chain = Chain(state)
                buffered_chain = BufferedChain(chain)

                alice_xmss = get_alice_xmss()
                slave_xmss = XMSS(alice_xmss.height, alice_xmss.get_seed())

                staking_address = bytes(alice_xmss.get_address().encode())

                # FIXME: Replace this with a call to create a hash_chain
                h0 = sha256(b'hashchain_seed')
                h1 = sha256(h0)
                h2 = sha256(h1)
                h3 = sha256(h2)

                with mocked_genesis() as custom_genesis:
                    custom_genesis.genesis_balance.extend([
                        qrl_pb2.GenesisBalance(
                            address=alice_xmss.get_address(),
                            balance=700000000000000)
                    ])

                    res = buffered_chain.add_block(block=GenesisBlock())
                    self.assertTrue(res)
                    stake_transaction = StakeTransaction.create(
                        activation_blocknumber=1,
                        xmss=alice_xmss,
                        slavePK=slave_xmss.pk(),
                        hashchain_terminator=h3)
                    stake_transaction._data.nonce = 1  # FIXME: The test needs private access.. This is an API issue
                    stake_transaction.sign(alice_xmss)

                    vote = Vote.create(
                        addr_from=alice_xmss.get_address().encode(),
                        blocknumber=0,
                        headerhash=GenesisBlock().headerhash,
                        xmss=slave_xmss)
                    vote.sign(slave_xmss)
                    buffered_chain.add_vote(vote)
                    vote_metadata = buffered_chain.get_consensus(0)

                    chain.pstate.stake_validators_tracker.add_sv(
                        balance=700000000000000,
                        stake_txn=stake_transaction,
                        blocknumber=1)

                    sv = chain.pstate.stake_validators_tracker.sv_dict[
                        staking_address]
                    self.assertEqual(0, sv.nonce)

                    tmp_block1 = Block.create(
                        staking_address=staking_address,
                        block_number=1,
                        reveal_hash=h2,
                        prevblock_headerhash=GenesisBlock().headerhash,
                        transactions=[stake_transaction],
                        duplicate_transactions=OrderedDict(),
                        vote=vote_metadata,
                        signing_xmss=slave_xmss,
                        nonce=1)

                    res = buffered_chain.add_block(block=tmp_block1)
                    self.assertTrue(res)

                    # Need to move forward the time to align with block times
                    with mock.patch('qrl.core.ntp.getTime') as time_mock:
                        time_mock.return_value = tmp_block1.timestamp + config.dev.minimum_minting_delay

                        vote = Vote.create(
                            addr_from=alice_xmss.get_address().encode(),
                            blocknumber=1,
                            headerhash=tmp_block1.headerhash,
                            xmss=slave_xmss)
                        vote.sign(slave_xmss)
                        buffered_chain.add_vote(vote)
                        vote_metadata = buffered_chain.get_consensus(1)

                        tmp_block2 = Block.create(
                            staking_address=staking_address,
                            block_number=2,
                            reveal_hash=h1,
                            prevblock_headerhash=tmp_block1.headerhash,
                            transactions=[],
                            duplicate_transactions=OrderedDict(),
                            vote=vote_metadata,
                            signing_xmss=slave_xmss,
                            nonce=2)

                    res = buffered_chain.add_block(block=tmp_block2)
                    self.assertTrue(res)

                    # Need to move forward the time to align with block times
                    with mock.patch('qrl.core.ntp.getTime') as time_mock:
                        time_mock.return_value = tmp_block2.timestamp + config.dev.minimum_minting_delay

                        vote = Vote.create(
                            addr_from=alice_xmss.get_address().encode(),
                            blocknumber=2,
                            headerhash=tmp_block2.headerhash,
                            xmss=slave_xmss)
                        vote.sign(slave_xmss)
                        buffered_chain.add_vote(vote)
                        vote_metadata = buffered_chain.get_consensus(2)

                        tmp_block3 = Block.create(
                            staking_address=staking_address,
                            block_number=3,
                            reveal_hash=h0,
                            prevblock_headerhash=tmp_block2.headerhash,
                            transactions=[],
                            duplicate_transactions=OrderedDict(),
                            vote=vote_metadata,
                            signing_xmss=slave_xmss,
                            nonce=3)

                    res = buffered_chain.add_block(block=tmp_block3)
                    self.assertTrue(res)
예제 #17
0
    def test_add_4(self, mock_difficulty_tracker_get):
        with set_data_dir('no_data'):
            with State() as state:
                with set_wallet_dir("test_wallet"):
                    with mocked_genesis() as custom_genesis:
                        chain_manager = ChainManager(state)

                        chain_manager._difficulty_tracker = Mock()
                        tmp_difficulty = StringToUInt256('2')
                        tmp_target = DifficultyTracker.get_target(
                            tmp_difficulty)
                        mock_difficulty_tracker_get.return_value = [
                            tmp_difficulty, tmp_target
                        ]

                        alice_xmss = get_alice_xmss()
                        slave_xmss = XMSS(
                            XmssFast(alice_xmss.seed, alice_xmss.height))
                        random_xmss1 = get_random_xmss()
                        random_kyber1 = Kyber()
                        random_dilithium1 = Dilithium()
                        random_xmss2 = get_random_xmss()
                        random_kyber2 = Kyber()
                        random_dilithium2 = Dilithium()

                        message = b'Hello World How are you?'
                        prf512_seed = b'10192'

                        custom_genesis.genesis_balance.extend([
                            qrl_pb2.GenesisBalance(
                                address=random_xmss1.address,
                                balance=65000000000000000)
                        ])
                        custom_genesis.genesis_balance.extend([
                            qrl_pb2.GenesisBalance(
                                address=random_xmss2.address,
                                balance=65000000000000000)
                        ])
                        chain_manager.load(custom_genesis)

                        with mock.patch(
                                'qrl.core.misc.ntp.getTime') as time_mock:
                            time_mock.return_value = 1615270948

                            lattice_public_key_txn = LatticePublicKey.create(
                                fee=1,
                                kyber_pk=random_kyber1.getPK(),
                                dilithium_pk=random_dilithium1.getPK(),
                                xmss_pk=random_xmss1.pk)
                            lattice_public_key_txn._data.nonce = 1
                            lattice_public_key_txn.sign(random_xmss1)

                            tmp_block1 = Block.create(
                                block_number=1,
                                prevblock_headerhash=GenesisBlock().headerhash,
                                transactions=[lattice_public_key_txn],
                                miner_address=slave_xmss.address)

                            #  Mine the nonce
                            while not PoWValidator().validate_mining_nonce(
                                    state, tmp_block1.blockheader, False):
                                tmp_block1.set_mining_nonce(
                                    tmp_block1.mining_nonce + 1)

                            res = chain_manager.add_block(block=tmp_block1)
                            self.assertTrue(res)

                            # Need to move forward the time to align with block times
                            time_mock.return_value += config.dev.minimum_minting_delay * 2

                            encrypted_eph_message = create_ephemeral_channel(
                                msg_id=lattice_public_key_txn.txhash,
                                ttl=time_mock.return_value,
                                ttr=0,
                                addr_from=random_xmss2.address,
                                kyber_pk=random_kyber2.getPK(),
                                kyber_sk=random_kyber2.getSK(),
                                receiver_kyber_pk=random_kyber1.getPK(),
                                dilithium_pk=random_dilithium2.getPK(),
                                dilithium_sk=random_dilithium2.getSK(),
                                prf512_seed=prf512_seed,
                                data=message,
                                nonce=1)

                            chain_manager.state.update_ephemeral(
                                encrypted_eph_message)
                            eph_metadata = chain_manager.state.get_ephemeral_metadata(
                                lattice_public_key_txn.txhash)

                            # Decrypting Payload

                            encrypted_eph_message = eph_metadata.encrypted_ephemeral_message_list[
                                0]
                            encrypted_payload = encrypted_eph_message.payload

                            random_kyber1.kem_decode(encrypted_eph_message.
                                                     channel.enc_aes256_symkey)
                            aes_key = bytes(random_kyber1.getMyKey())
                            myAES = AES(aes_key)
                            decrypted_payload = myAES.decrypt(
                                encrypted_payload)
                            ephemeral_channel_payload = EphemeralChannelPayload.from_json(
                                decrypted_payload)

                            self.assertEqual(
                                ephemeral_channel_payload.prf512_seed,
                                b'10192')
                            self.assertEqual(ephemeral_channel_payload.data,
                                             b'Hello World How are you?')

                            # TODO (cyyber): Add Ephemeral Testing code using Naive RNG

                            tmp_block2 = Block.create(
                                block_number=2,
                                prevblock_headerhash=tmp_block1.headerhash,
                                transactions=[],
                                miner_address=slave_xmss.address)

                            #  Mine the nonce
                            while not PoWValidator().validate_mining_nonce(
                                    state, tmp_block2.blockheader, False):
                                tmp_block2.set_mining_nonce(
                                    tmp_block2.mining_nonce + 1)

                            res = chain_manager.add_block(block=tmp_block2)
                            self.assertTrue(res)

                            # Need to move forward the time to align with block times
                            time_mock.return_value += config.dev.minimum_minting_delay * 2

                            tmp_block3 = Block.create(
                                block_number=3,
                                prevblock_headerhash=tmp_block2.headerhash,
                                transactions=[],
                                miner_address=slave_xmss.address)

                            #  Mine the nonce
                            while not PoWValidator().validate_mining_nonce(
                                    state, tmp_block3.blockheader, False):
                                tmp_block3.set_mining_nonce(
                                    tmp_block3.mining_nonce + 1)

                            res = chain_manager.add_block(block=tmp_block3)
                            self.assertTrue(res)

                            time_mock.return_value += config.dev.minimum_minting_delay

                            tmp_block4 = Block.create(
                                block_number=4,
                                prevblock_headerhash=tmp_block3.headerhash,
                                transactions=[],
                                miner_address=slave_xmss.address)

                            #  Mine the nonce
                            while not PoWValidator().validate_mining_nonce(
                                    state, tmp_block4.blockheader, False):
                                tmp_block4.set_mining_nonce(
                                    tmp_block4.mining_nonce + 1)

                            res = chain_manager.add_block(block=tmp_block4)
                            self.assertTrue(res)

                            address_state = chain_manager.get_address(
                                random_xmss1.address)

                            self.assertEqual(
                                address_state.latticePK_list[0].kyber_pk,
                                lattice_public_key_txn.kyber_pk)
                            self.assertEqual(
                                address_state.latticePK_list[0].dilithium_pk,
                                lattice_public_key_txn.dilithium_pk)

                            self.assertEqual(address_state.address,
                                             lattice_public_key_txn.addr_from)

                            random_xmss1_state = chain_manager.get_address(
                                random_xmss1.address)

                            self.assertEqual(64999999999999999,
                                             random_xmss1_state.balance)
예제 #18
0
    def test_transferCoins_sign(self):
        with set_data_dir('no_data'):
            with State() as db_state:
                with set_wallet_dir("test_wallet"):
                    p2p_factory = Mock(spec=P2PFactory)
                    p2p_factory.pow = Mock(spec=POW)
                    chain_manager = ChainManager(db_state)

                    qrlnode = QRLNode(db_state, slaves=[])
                    qrlnode.set_chain_manager(chain_manager)
                    qrlnode._p2pfactory = p2p_factory
                    qrlnode._pow = p2p_factory.pow
                    qrlnode._peer_addresses = ['127.0.0.1', '192.168.1.1']

                    service = PublicAPIService(qrlnode)

                    context = Mock(spec=ServicerContext)

                    alice = get_alice_xmss()
                    bob = get_bob_xmss()

                    request = qrl_pb2.TransferCoinsReq(
                        address_from=alice.address,
                        addresses_to=[bob.address],
                        amounts=[101],
                        fee=12,
                        xmss_pk=alice.pk)

                    response = service.TransferCoins(request=request,
                                                     context=context)
                    context.set_code.assert_not_called()
                    context.set_details.assert_not_called()

                    self.assertIsNotNone(response)
                    self.assertIsNotNone(response.transaction_unsigned)
                    self.assertEqual(
                        'transfer',
                        response.transaction_unsigned.WhichOneof(
                            'transactionType'))

                    self.assertEqual(alice.address,
                                     response.transaction_unsigned.addr_from)
                    self.assertEqual(12, response.transaction_unsigned.fee)
                    self.assertEqual(alice.pk,
                                     response.transaction_unsigned.public_key)
                    self.assertEqual(0, response.transaction_unsigned.nonce)
                    self.assertEqual(b'',
                                     response.transaction_unsigned.signature)
                    self.assertEqual(
                        b'', response.transaction_unsigned.transaction_hash)
                    self.assertEqual(
                        bob.address,
                        response.transaction_unsigned.transfer.addrs_to[0])
                    self.assertEqual(
                        101, response.transaction_unsigned.transfer.amounts[0])

                    tmp_hash_pre = response.transaction_unsigned.addr_from
                    tmp_hash_pre += str(
                        response.transaction_unsigned.fee).encode()
                    tmp_hash_pre += response.transaction_unsigned.transfer.addrs_to[
                        0]
                    tmp_hash_pre += str(response.transaction_unsigned.transfer.
                                        amounts[0]).encode()

                    self.assertEqual(
                        '010300a1da274e68c88b0ccf448e0b1916fa789b01eb2ed4e9ad565ce264c939078'
                        '2a9c61ac02f31320103001d65d7e59aed5efbeae64246e0f3184d7c42411421eb38'
                        '5ba30f2c1c005a85ebc4419cfd313031',
                        bin2hstr(tmp_hash_pre))

                    tmp_hash = sha256(tmp_hash_pre)

                    self.assertEqual(
                        '3645f2819aba65479f9a7fad3f5d7a41a9357410a595fa02fb947bfe3ed96e0f',
                        bin2hstr(tmp_hash))

                    signed_transaction = response.transaction_unsigned
                    signed_transaction.signature = alice.sign(tmp_hash)

                    req_push = qrl_pb2.PushTransactionReq(
                        transaction_signed=signed_transaction)

                    resp_push = service.PushTransaction(req_push,
                                                        context=context)
                    context.set_code.assert_not_called()
                    context.set_details.assert_not_called()

                    self.assertIsNotNone(resp_push)
                    self.assertEqual(qrl_pb2.PushTransactionResp.SUBMITTED,
                                     resp_push.error_code)
                    self.assertEqual(
                        '832c0fe9819992cc0d1d97f8d6579ca28e210c7884488a3858376a9c0cec279d',
                        bin2hstr(resp_push.tx_hash))
예제 #19
0
파일: test_Wallet.py 프로젝트: kstuart/QRL
 def test_init(self):
     with set_wallet_dir("test_wallet"):
         wallet = Wallet()
         self.assertIsNotNone(wallet)
예제 #20
0
    def test_add_2(self):
        destroy_state()
        with State() as state:
            with set_wallet_dir("test_wallet"):
                chain = Chain(state)
                buffered_chain = BufferedChain(chain)

                alice_xmss = get_alice_xmss()
                slave_xmss = XMSS(alice_xmss.height, alice_xmss.get_seed())
                staking_address = bytes(alice_xmss.get_address().encode())

                h0 = sha256(b'hashchain_seed')
                h1 = sha256(h0)

                with mocked_genesis() as custom_genesis:
                    custom_genesis.genesis_balance.extend([
                        qrl_pb2.GenesisBalance(
                            address=alice_xmss.get_address(),
                            balance=700000000000000)
                    ])

                    res = buffered_chain.add_block(block=custom_genesis)
                    self.assertTrue(res)

                    stake_transaction = StakeTransaction.create(
                        activation_blocknumber=1,
                        xmss=alice_xmss,
                        slavePK=slave_xmss.pk(),
                        hashchain_terminator=h1)
                    vote = Vote.create(
                        addr_from=alice_xmss.get_address().encode(),
                        blocknumber=0,
                        headerhash=custom_genesis.headerhash,
                        xmss=slave_xmss)
                    vote.sign(slave_xmss)
                    buffered_chain.add_vote(vote)
                    vote_metadata = buffered_chain.get_consensus(0)

                    # FIXME: The test needs private access.. This is an API issue
                    stake_transaction._data.nonce = 1

                    stake_transaction.sign(alice_xmss)

                    chain.pstate.stake_validators_tracker.add_sv(
                        balance=700000000000000,
                        stake_txn=stake_transaction,
                        blocknumber=1)
                    sv = chain.pstate.stake_validators_tracker.sv_dict[
                        staking_address]
                    self.assertEqual(0, sv.nonce)

                    tmp_block = Block.create(
                        staking_address=bytes(
                            alice_xmss.get_address().encode()),
                        block_number=1,
                        reveal_hash=h0,
                        prevblock_headerhash=custom_genesis.headerhash,
                        transactions=[stake_transaction],
                        duplicate_transactions=OrderedDict(),
                        vote=vote_metadata,
                        signing_xmss=alice_xmss,
                        nonce=1)

                    res = buffered_chain.add_block(block=tmp_block)
                    self.assertTrue(res)
예제 #21
0
    def test_transferCoins_sign(self):
        with set_data_dir('no_data'):
            with State() as db_state:
                with set_wallet_dir("test_wallet"):
                    p2p_factory = Mock(spec=P2PFactory)
                    p2p_factory.pow = Mock(spec=POW)
                    chain_manager = ChainManager(db_state)

                    qrlnode = QRLNode(db_state, mining_credit_wallet=b'')
                    qrlnode.set_chain_manager(chain_manager)
                    qrlnode._p2pfactory = p2p_factory
                    qrlnode._pow = p2p_factory.pow
                    qrlnode._peer_addresses = ['127.0.0.1', '192.168.1.1']

                    service = PublicAPIService(qrlnode)

                    context = Mock(spec=ServicerContext)

                    alice = get_alice_xmss()
                    bob = get_bob_xmss()

                    request = qrl_pb2.TransferCoinsReq(
                        addresses_to=[bob.address],
                        amounts=[101],
                        fee=12,
                        xmss_pk=alice.pk)

                    response = service.TransferCoins(request=request,
                                                     context=context)
                    context.set_code.assert_not_called()
                    context.set_details.assert_not_called()

                    self.assertIsNotNone(response)
                    self.assertIsNotNone(
                        response.extended_transaction_unsigned.tx)
                    self.assertEqual(
                        'transfer',
                        response.extended_transaction_unsigned.tx.WhichOneof(
                            'transactionType'))

                    self.assertEqual(
                        12, response.extended_transaction_unsigned.tx.fee)
                    self.assertEqual(
                        alice.pk,
                        response.extended_transaction_unsigned.tx.public_key)
                    self.assertEqual(
                        0, response.extended_transaction_unsigned.tx.nonce)
                    self.assertEqual(
                        b'',
                        response.extended_transaction_unsigned.tx.signature)
                    self.assertEqual(
                        b'', response.extended_transaction_unsigned.tx.
                        transaction_hash)
                    self.assertEqual(
                        bob.address, response.extended_transaction_unsigned.tx.
                        transfer.addrs_to[0])
                    self.assertEqual(
                        101, response.extended_transaction_unsigned.tx.
                        transfer.amounts[0])

                    tmp_hash_pre = bytes(
                        QRLHelper.getAddress(
                            response.extended_transaction_unsigned.tx.
                            public_key))
                    tmp_hash_pre += str(response.extended_transaction_unsigned.
                                        tx.fee).encode()
                    tmp_hash_pre += response.extended_transaction_unsigned.tx.transfer.addrs_to[
                        0]
                    tmp_hash_pre += str(response.extended_transaction_unsigned.
                                        tx.transfer.amounts[0]).encode()

                    self.assertEqual(
                        '010300a1da274e68c88b0ccf448e0b1916fa789b01eb2ed4e9ad565ce264c939078'
                        '2a9c61ac02f31320103001d65d7e59aed5efbeae64246e0f3184d7c42411421eb38'
                        '5ba30f2c1c005a85ebc4419cfd313031',
                        bin2hstr(tmp_hash_pre))

                    tmp_hash = sha256(tmp_hash_pre)

                    self.assertEqual(
                        '3645f2819aba65479f9a7fad3f5d7a41a9357410a595fa02fb947bfe3ed96e0f',
                        bin2hstr(tmp_hash))

                    signed_transaction = response.extended_transaction_unsigned.tx
                    signed_transaction.signature = alice.sign(tmp_hash)

                    req_push = qrl_pb2.PushTransactionReq(
                        transaction_signed=signed_transaction)

                    resp_push = service.PushTransaction(req_push,
                                                        context=context)
                    context.set_code.assert_not_called()
                    context.set_details.assert_not_called()

                    self.assertIsNotNone(resp_push)
                    self.assertEqual(qrl_pb2.PushTransactionResp.SUBMITTED,
                                     resp_push.error_code)
                    self.assertEqual(
                        '30955fdc5e2d9dbe5fb9bf812f2e1b6c4b409a8a7c7a75f1c3e9ba1ffdd8e60e',
                        bin2hstr(resp_push.tx_hash))