Beispiel #1
0
    def setUp(self):
        self.mock_peers = Mock(Peers)
        self.mock_api_client = Mock(ApiClient)
        self.mock_validator = Mock(Validator)
        self.mock_blockchain = Mock(Blockchain)
        self.mock_mempool = Mock(Mempool)
        self.HOST = '123.456.789.012'
        self.WORKER_PROCESSES = 3

        self.subject = FullNode(self.mock_peers, self.mock_api_client, self.mock_blockchain, self.mock_mempool,
                                self.mock_validator)
        self.subject.HOST = self.HOST
        self.subject.WORKER_PROCESSES = self.WORKER_PROCESSES
Beispiel #2
0
def full():
    helptext = '''
        Available commands:
        ===================
        balance <public key (optional)>
        history <public key (optional)>
        getnodes
        getblock <index (optional)>
        getblocks <start index (optional)> <stop index (optional)>
        mempoolcount
        getmempool
        getunconfirmedtx <tx hash>
        mine <start | stop>
        quit or exit
    '''
    peers = Peers()
    api_client = ApiClient(peers)
    blockchain = Blockchain()
    mempool = Mempool()
    validator = Validator()
    ip = config['user']['ip']
    public_key = config['user']['public_key']
    if ip is None or public_key is None:
        print("\n\npublic key and IP must be provided.\n\n")
        sys.exit(1)
    else:
        print("\n\nfull node starting...\n\n")
        full_node = FullNode(peers, api_client, blockchain, mempool, validator)
        full_node.start()
        miner = Miner(blockchain, mempool)
        mining = False

    while True:
        cmd = input("{} ({}) full node > ".format(
            config['network']['name'], config['network']['ticker_symbol']))
        cmd_split = cmd.split()
        try:
            if cmd_split[0] == "balance":
                if len(cmd_split) == 2:
                    url = full_node.BALANCE_URL.format(
                        "localhost", full_node.FULL_NODE_PORT, cmd_split[1])
                else:
                    url = full_node.BALANCE_URL.format(
                        "localhost", full_node.FULL_NODE_PORT, public_key)
                response = requests.get(url)
                print(response.json())
            elif cmd_split[0] == "history":
                if len(cmd_split) == 2:
                    url = full_node.TRANSACTION_HISTORY_URL.format(
                        "localhost", full_node.FULL_NODE_PORT, cmd_split[1])
                    response = requests.get(url)
                else:
                    url = full_node.TRANSACTION_HISTORY_URL.format(
                        "localhost", full_node.FULL_NODE_PORT, public_key)
                    response = requests.get(url)
                print(response.json())
            elif cmd_split[0] == "getnodes":
                url = full_node.NODES_URL.format("localhost",
                                                 full_node.FULL_NODE_PORT)
                response = requests.get(url)
                print(response.json())
            elif cmd_split[0] == "getblock":
                if len(cmd_split) == 2:
                    url = full_node.BLOCKS_URL.format("localhost",
                                                      full_node.FULL_NODE_PORT,
                                                      cmd_split[1])
                else:
                    url = full_node.BLOCKS_URL.format("localhost",
                                                      full_node.FULL_NODE_PORT,
                                                      "latest")
                response = requests.get(url)
                print(response.json())
            elif cmd_split[0] == "getblocks":
                if len(cmd_split) == 3:
                    url = full_node.BLOCKS_INV_URL.format(
                        "localhost", full_node.FULL_NODE_PORT, cmd_split[1],
                        cmd_split[2])
                else:
                    url = full_node.BLOCKS_URL.format("localhost",
                                                      full_node.FULL_NODE_PORT,
                                                      "")
                response = requests.get(url)
                print(response.json())
            elif cmd_split[0] == "mempoolcount":
                url = full_node.UNCONFIRMED_TRANSACTIONS_URL.format(
                    "localhost", full_node.FULL_NODE_PORT, "count")
                response = requests.get(url)
                print(response.json())
            elif cmd_split[0] == "getmempool":
                url = full_node.UNCONFIRMED_TRANSACTIONS_URL.format(
                    "localhost", full_node.FULL_NODE_PORT, "")
                response = requests.get(url)
                print(response.json())
            elif cmd_split[0] == "getunconfirmedtx":
                if len(cmd_split) == 2:
                    url = full_node.UNCONFIRMED_TRANSACTIONS_URL.format(
                        "localhost", full_node.FULL_NODE_PORT, cmd_split[1])
                    response = requests.get(url)
                    print(response.json())
                else:
                    print("\nRequires tx hash\n")
            elif cmd_split[0] == "mine":
                if len(cmd_split) == 2:
                    if cmd_split[1] == "start":
                        if mining is False:
                            print("\n\nminer starting...\n\n")
                            mining = True
                            miner.start()
                    elif cmd_split[1] == "stop":
                        if mining is True:
                            print("\n\nminer shutting down...\n\n")
                            mining = False
                            miner.shutdown()
                    else:
                        print("\nRequires: start | stop")
                else:
                    print("\nRequires: start | stop")
            elif cmd_split[0] in ("quit", "exit"):
                if mining is True:
                    print("\n\nminer shutting down...\n\n")
                    miner.shutdown()
                    time.sleep(2)
                full_node.shutdown()
                time.sleep(2)
                sys.exit(0)
            else:  # help
                print(helptext)
        except IndexError:
            pass
Beispiel #3
0
class TestNode(unittest.TestCase):
    def setUp(self):
        self.mock_peers = Mock(Peers)
        self.mock_api_client = Mock(ApiClient)
        self.mock_validator = Mock(Validator)
        self.mock_blockchain = Mock(Blockchain)
        self.mock_mempool = Mock(Mempool)
        self.HOST = '123.456.789.012'
        self.WORKER_PROCESSES = 3

        self.subject = FullNode(self.mock_peers, self.mock_api_client,
                                self.mock_blockchain, self.mock_mempool,
                                self.mock_validator)
        self.subject.HOST = self.HOST
        self.subject.WORKER_PROCESSES = self.WORKER_PROCESSES

    def test_check_peers_Calls_check_peers_full(self):
        mock_discovered_peers = Mock()

        with patch.object(NodeMixin,
                          'discover_peers',
                          return_value=mock_discovered_peers
                          ) as patched_find_known_peers:
            self.subject.check_peers()

        expected_calls = [
            call.check_peers_full(self.HOST, mock_discovered_peers)
        ]
        self.assertEqual(self.mock_api_client.method_calls, expected_calls)
        patched_find_known_peers.assert_called_once_with()

    def test_discover_peers_Returns_discovered_peers(self):
        self.mock_peers.get_all_peers.return_value = [
            '111.222.333.444', '222.333.444.555'
        ]
        self.mock_api_client.request_nodes.return_value = {
            "full_nodes": ['333.444.555.777', '444.555.777.888']
        }

        result = self.subject.discover_peers()

        expected_request_nodes_calls = [
            call.request_nodes('111.222.333.444', 30013),
            call.request_nodes('222.333.444.555', 30013)
        ]
        self.assertEqual(self.mock_api_client.method_calls,
                         expected_request_nodes_calls)
        self.assertEqual(len(result), 4)
        self.assertEqual(
            set(result), {
                '111.222.333.444', '222.333.444.555', '333.444.555.777',
                '444.555.777.888'
            })

    def test_discover_peers_When_no_new_peers_Returns_known_peers(self):
        self.mock_peers.get_all_peers.return_value = [
            '111.222.333.444', '222.333.444.555'
        ]
        self.mock_api_client.request_nodes.return_value = {"full_nodes": []}

        result = self.subject.discover_peers()

        expected_request_nodes_calls = [
            call.request_nodes('111.222.333.444', 30013),
            call.request_nodes('222.333.444.555', 30013)
        ]
        self.assertEqual(self.mock_api_client.method_calls,
                         expected_request_nodes_calls)
        self.assertEqual(len(result), 2)
        self.assertEqual(set(result), {'111.222.333.444', '222.333.444.555'})

    def test_discover_peers_When_new_peers_none_Returns_known_peers(self):
        self.mock_peers.get_all_peers.return_value = [
            '111.222.333.444', '222.333.444.555'
        ]
        self.mock_api_client.request_nodes.return_value = None

        result = self.subject.discover_peers()

        expected_request_nodes_calls = [
            call.request_nodes('111.222.333.444', 30013),
            call.request_nodes('222.333.444.555', 30013)
        ]
        self.assertEqual(self.mock_api_client.method_calls,
                         expected_request_nodes_calls)
        self.assertEqual(len(result), 2)
        self.assertEqual(set(result), {'111.222.333.444', '222.333.444.555'})