Пример #1
0
    def test_tx_forward_on_host(self):
        peers = make_intersecting_committees_on_host(5, 1)
        value = 999

        submit_to = list(peers.keys())[0]
        target = None
        for port in peers:
            if peers[port].committee_id_a() != peers[submit_to].committee_id_a() \
                    and peers[port].committee_id_a() != peers[submit_to].committee_id_b() \
                    and peers[port].committee_id_b() != peers[submit_to].committee_id_a() \
                    and peers[port].committee_id_b() != peers[submit_to].committee_id_b():
                target = port
                break

        committee_id = peers[target].committee_id_a()
        tx = Transaction(quorum=committee_id, key="test_{}".format(value), value=str(value))
        url = "http://localhost:{port}/submit/".format(port=peers[submit_to].port)
        result = requests.post(url, json=tx.to_json())

        self.assertEqual(ROUTE_EXECUTED_CORRECTLY, get_plain_text(result))
        time.sleep(3)  # wait for network to confirm

        # get peers in committee
        committee_members = {}
        for port in peers:
            if peers[port].committee_id_a() == committee_id or peers[port].committee_id_b() == committee_id:
                committee_members[port] = peers[port]

        for member in committee_members:
            tx = Transaction(quorum=committee_id, key="test_{}".format(value), value=str(value))
            url = "http://localhost:{port}/get/".format(port=member)
            result = requests.post(url, json=tx.to_json())
            self.assertEqual(str(value), get_plain_text(result))
Пример #2
0
    def test_api_start(self):
        app = api.create_app()
        app.config['TESTING'] = True
        app.config['DEBUG'] = False
        client = app.test_client()

        # test that wrong url do nothing
        response = client.get('/start/')
        self.assertEqual(404, response.status_code)
        self.assertIsNone(app.config[PBFT_INSTANCES])
        self.assertEqual({}, app.config[QUORUMS])
        response = client.get('/start/a/')
        self.assertEqual(404, response.status_code)
        self.assertIsNone(app.config[PBFT_INSTANCES])
        self.assertEqual({}, app.config[QUORUMS])

        # test actual url works
        response = client.get('/start/a/b')
        self.assertEqual(200, response.status_code)
        self.assertIsNotNone(app.config[PBFT_INSTANCES])
        self.assertEqual({'a': [], 'b': []}, app.config[QUORUMS])
        docker = docker_api.from_env()
        self.assertEqual(2, len(docker.containers.list()))

        # get info on container a
        container_ip = docker.containers.list()[1].exec_run(
            "hostname -i").output.decode('utf-8').strip()
        container_val_key = docker.containers.list()[1].exec_run("cat {val_pub}".format(val_pub=VKEY["pub"])) \
            .output.decode('utf-8').strip()
        container_user_key = docker.containers.list()[1].exec_run("cat {user_pub}".format(user_pub=UKEY["pub"])) \
            .output.decode('utf-8').strip()

        self.assertEqual(get_plain_text(client.get('/ip/a')), container_ip)
        self.assertEqual(get_plain_text(client.get('/val+key/a')),
                         container_val_key)
        self.assertEqual(get_plain_text(client.get('/user+key/a')),
                         container_user_key)
        self.assertNotEqual(get_plain_text(client.get('/val+key/a')),
                            get_plain_text(client.get('/user+key/a')))

        # get info on container b
        container_ip = docker.containers.list()[0].exec_run(
            "hostname -i").output.decode('utf-8').strip()
        container_val_key = docker.containers.list()[0].exec_run("cat {val_pub}".format(val_pub=VKEY["pub"])) \
            .output.decode('utf-8').strip()
        container_user_key = docker.containers.list()[0].exec_run("cat {user_pub}".format(user_pub=UKEY["pub"])) \
            .output.decode('utf-8').strip()

        self.assertEqual(get_plain_text(client.get('/ip/b')), container_ip)
        self.assertEqual(get_plain_text(client.get('/val+key/b')),
                         container_val_key)
        self.assertEqual(get_plain_text(client.get('/user+key/b')),
                         container_user_key)
        self.assertNotEqual(get_plain_text(client.get('/val+key/b')),
                            get_plain_text(client.get('/user+key/b')))
Пример #3
0
    def test_start_committee(self):
        peer_api_one = api.create_app()
        peer_api_one.config['TESTING'] = True
        peer_api_one.config['DEBUG'] = False
        peer_api_two = api.create_app()
        peer_api_two.config['TESTING'] = True
        peer_api_two.config['DEBUG'] = False
        peer_api_three = api.create_app()
        peer_api_three.config['TESTING'] = True
        peer_api_three.config['DEBUG'] = False
        peer_api_four = api.create_app()
        peer_api_four.config['TESTING'] = True
        peer_api_four.config['DEBUG'] = False

        peers = [peer_api_one.test_client(), peer_api_two.test_client(),
                 peer_api_three.test_client(), peer_api_four.test_client()]

        peers[0].get('/start/a/b')
        peers[1].get('/start/a/c')
        peers[2].get('/start/a/d')
        peers[3].get('/start/a/e')
        docker = docker_api.from_env()
        self.assertEqual(8, len(docker.containers.list()))

        val_keys = [get_plain_text(p.get('/val+key/a')) for p in peers]
        usr_keys = [get_plain_text(p.get('/user+key/a')) for p in peers]

        genesis_json = json.loads(json.dumps({
            USER_KEY: usr_keys,
            VALIDATOR_KEY: val_keys
        }))

        peers[0].post('/make+genesis/a', json=genesis_json)

        join_request_data = {NEIGHBOURS: []}
        ip = 1
        quorum = 'b'
        for p in peers:
            # use pretend API address and ports because app is not actually running
            join_request_data[NEIGHBOURS].append(
                {API_IP: "192.168.1.{}".format(ip), DOCKER_IP: get_plain_text(p.get('/ip/a')),
                 PORT: "5000", QUORUM_ID: quorum})
            ip += 1
            quorum = chr(ord(quorum) + 1)

        data = json.loads(json.dumps(join_request_data))
        for p in peers:
            p.post('/join/a', json=data)

        peers[0].post('/submit/', json=TRANSACTION_A_JSON)
        time.sleep(3)

        for p in peers:
            self.assertEqual('999', get_plain_text(p.post('/get/', json=TRANSACTION_A_JSON)))
Пример #4
0
    def test_make_genesis(self):
        peer_api_one = api.create_app()
        peer_api_one.config['TESTING'] = True
        peer_api_one.config['DEBUG'] = False
        peer_api_two = api.create_app()
        peer_api_two.config['TESTING'] = True
        peer_api_two.config['DEBUG'] = False
        peer_api_three = api.create_app()
        peer_api_three.config['TESTING'] = True
        peer_api_three.config['DEBUG'] = False
        peer_api_four = api.create_app()
        peer_api_four.config['TESTING'] = True
        peer_api_four.config['DEBUG'] = False

        peers = [
            peer_api_one.test_client(),
            peer_api_two.test_client(),
            peer_api_three.test_client(),
            peer_api_four.test_client()
        ]

        peers[0].get('/start/a/b')
        peers[1].get('/start/a/c')
        peers[2].get('/start/a/d')
        peers[3].get('/start/a/e')
        docker = docker_api.from_env()
        self.assertEqual(8, len(docker.containers.list()))

        val_keys = [get_plain_text(p.get('/val+key/a')) for p in peers]
        usr_keys = [get_plain_text(p.get('/user+key/a')) for p in peers]

        genesis_json = json.loads(
            json.dumps({
                USER_KEY: usr_keys,
                VALIDATOR_KEY: val_keys
            }))

        peers[0].post('/make+genesis/a', json=genesis_json)

        pbft_settings = docker.containers.list()[-1].exec_run(
            "ls pbft-settings.batch").output.decode('utf-8').strip()
        config_consensus = docker.containers.list()[-1].exec_run(
            "ls config-consensus.batch").output.decode('utf-8').strip()
        config_genesis = docker.containers.list()[-1].exec_run(
            "ls config-genesis.batch").output.decode('utf-8').strip()

        self.assertEqual('pbft-settings.batch', pbft_settings)
        self.assertEqual('config-consensus.batch', config_consensus)
        self.assertEqual('config-genesis.batch', config_genesis)
Пример #5
0
    def test_start_with_peer(self):
        a = SawtoothContainer()
        b = SawtoothContainer()
        id_a = 'a'
        id_b = 'b'
        p = Intersection(a, b, id_a, id_b)

        app = api.create_app(p)
        app.config['TESTING'] = True
        app.config['DEBUG'] = False
        client = app.test_client()

        docker = docker_api.from_env()
        # get info on container a
        container_ip = docker.containers.list()[1].exec_run(
            "hostname -i").output.decode('utf-8').strip()
        container_val_key = docker.containers.list()[1].exec_run("cat {val_pub}".format(val_pub=VKEY["pub"])) \
            .output.decode('utf-8').strip()
        container_user_key = docker.containers.list()[1].exec_run("cat {user_pub}".format(user_pub=UKEY["pub"])) \
            .output.decode('utf-8').strip()

        self.assertEqual(get_plain_text(client.get('/ip/a')), container_ip)
        self.assertEqual(get_plain_text(client.get('/val+key/a')),
                         container_val_key)
        self.assertEqual(get_plain_text(client.get('/user+key/a')),
                         container_user_key)
        self.assertNotEqual(get_plain_text(client.get('/val+key/a')),
                            get_plain_text(client.get('/user+key/a')))

        # get info on container b
        container_ip = docker.containers.list()[0].exec_run(
            "hostname -i").output.decode('utf-8').strip()
        container_val_key = docker.containers.list()[0].exec_run("cat {val_pub}".format(val_pub=VKEY["pub"])) \
            .output.decode('utf-8').strip()
        container_user_key = docker.containers.list()[0].exec_run("cat {user_pub}".format(user_pub=UKEY["pub"])) \
            .output.decode('utf-8').strip()

        self.assertEqual(get_plain_text(client.get('/ip/b')), container_ip)
        self.assertEqual(get_plain_text(client.get('/val+key/b')),
                         container_val_key)
        self.assertEqual(get_plain_text(client.get('/user+key/b')),
                         container_user_key)
        self.assertNotEqual(get_plain_text(client.get('/val+key/b')),
                            get_plain_text(client.get('/user+key/b')))
def check_submitted_tx(waiting, sub, port):
    url = URL_HOST.format(ip=IP_ADDRESS, port=str(port) + "/get/")
    remove_from_sub = []
    for tx in sub:
        if sub[tx].value == get_plain_text(
                requests.post(url, json=sub[tx].to_json())):
            waiting.append(time.time() - tx)
            remove_from_sub.append(tx)

    for r in remove_from_sub:
        del sub[r]
Пример #7
0
    def test_setting_instances(self):
        a = SawtoothContainer()
        b = SawtoothContainer()
        inter = Intersection(a, b, 'a', 'b')
        peer = SmartShardPeer(inter)
        peer.start()
        client = peer.app.api.test_client()

        docker = docker_api.from_env()
        # get info on container a
        container_ip = docker.containers.list()[1].exec_run(
            "hostname -i").output.decode('utf-8').strip()
        container_val_key = docker.containers.list()[1].exec_run("cat {val_pub}".format(val_pub=VKEY["pub"])) \
            .output.decode('utf-8').strip()
        container_user_key = docker.containers.list()[1].exec_run("cat {user_pub}".format(user_pub=UKEY["pub"])) \
            .output.decode('utf-8').strip()

        self.assertEqual(get_plain_text(client.get('/ip/a')), container_ip)
        self.assertEqual(get_plain_text(client.get('/val+key/a')),
                         container_val_key)
        self.assertEqual(get_plain_text(client.get('/user+key/a')),
                         container_user_key)
        self.assertNotEqual(get_plain_text(client.get('/val+key/a')),
                            get_plain_text(client.get('/user+key/a')))

        # get info on container b
        container_ip = docker.containers.list()[0].exec_run(
            "hostname -i").output.decode('utf-8').strip()
        container_val_key = docker.containers.list()[0].exec_run("cat {val_pub}".format(val_pub=VKEY["pub"])) \
            .output.decode('utf-8').strip()
        container_user_key = docker.containers.list()[0].exec_run("cat {user_pub}".format(user_pub=UKEY["pub"])) \
            .output.decode('utf-8').strip()

        self.assertEqual(get_plain_text(client.get('/ip/b')), container_ip)
        self.assertEqual(get_plain_text(client.get('/val+key/b')),
                         container_val_key)
        self.assertEqual(get_plain_text(client.get('/user+key/b')),
                         container_user_key)
        self.assertNotEqual(get_plain_text(client.get('/val+key/b')),
                            get_plain_text(client.get('/user+key/b')))
Пример #8
0
def check_from_peers(submitted, confirmed, peers):
    url = URL_HOST.format(ip=IP_ADDRESS,
                          port=str(list(peers.keys())[0]) + "/get/")
    remove_from_sub = []
    for tx in submitted:
        if tx[1].value == get_plain_text(
                requests.post(url, json=tx[1].to_json())):
            remove_from_sub.append(tx)
            txID = (tx[1].key.split('_'))[2]
            confirmed[int(txID)].append(floor(time.time()))
    for r in remove_from_sub:
        i = 0
        for tx in submitted:
            if r[1].key == tx[1].key:
                del submitted[i]
                break
            i += 1
Пример #9
0
def getTxs(urlJsonList):
    return {
        urlJsonList[0]:
        get_plain_text(requests.post(urlJsonList[0], json=urlJsonList[1]))
    }