async def main(): random.seed(0) my_key_pair_nacl = nacl.signing.SigningKey.generate() conn = await connect(nodes[0].addr()) handshake = create_handshake(my_key_pair_nacl, nodes[0].node_key.pk, 12345) # Use future version handshake.HandshakeV2.version = 2**32 - 1 raw_message = BinarySerializer(schema).serialize(handshake) # Keep header (9 bytes) # - 1 byte PeerMessage::HandshakeV2 enum id # - 4 bytes version # - 4 bytes oldest_supported_version raw_message = raw_message[:9] + bytes( [random.randint(0, 255) for _ in range(random.randint(1, 32))]) # First handshake attempt. Should fail with Protocol Version Mismatch await conn.send_raw(raw_message) response = await conn.recv() print(obj_to_string(response)) assert response.enum == 'HandshakeFailure', response.enum assert response.HandshakeFailure[ 1].enum == 'ProtocolVersionMismatch', response.HandshakeFailure[1].enum pvm = response.HandshakeFailure[1].ProtocolVersionMismatch.version handshake.HandshakeV2.version = pvm
async def main(): my_key_pair_nacl = nacl.signing.SigningKey.generate() conn = await connect(nodes[0].addr()) handshake = create_handshake(my_key_pair_nacl, nodes[0].node_key.pk, 12345) handshake.Handshake.edge_info.nonce = 1505 # First handshake attempt. Should fail with Genesis Mismatch sign_handshake(my_key_pair_nacl, handshake.Handshake) await conn.send(handshake) response = await conn.recv() assert response.enum == 'HandshakeFailure', response.enum assert response.HandshakeFailure[ 1].enum == 'ProtocolVersionMismatch', response.HandshakeFailure[1].enum pvm = response.HandshakeFailure[1].ProtocolVersionMismatch.version handshake.Handshake.version = pvm # Second handshake attempt. Should fail with Protocol Version Mismatch sign_handshake(my_key_pair_nacl, handshake.Handshake) await conn.send(handshake) response = await conn.recv() assert response.enum == 'HandshakeFailure', response.enum assert response.HandshakeFailure[ 1].enum == 'GenesisMismatch', response.HandshakeFailure[1].enum gm = response.HandshakeFailure[1].GenesisMismatch handshake.Handshake.chain_info.genesis_id.chain_id = gm.chain_id handshake.Handshake.chain_info.genesis_id.hash = gm.hash # Third handshake attempt. sign_handshake(my_key_pair_nacl, handshake.Handshake) await conn.send(handshake) response = await conn.recv() # Connection should be closed by other peer because too large nonce on handshake. assert response is None
async def main(): my_key_pair_nacl = nacl.signing.SigningKey.generate() conn = await connect(nodes[0].addr()) # First handshake attempt. Should fail with Genesis Mismatch handshake = create_handshake(my_key_pair_nacl, nodes[0].node_key.pk, 12345) sign_handshake(my_key_pair_nacl, handshake.Handshake) await conn.send(handshake) response = await conn.recv() assert response.enum == 'HandshakeFailure', response.enum assert response.HandshakeFailure[ 1].enum == 'GenesisMismatch', response.HandshakeFailure[1].enum # Second handshake attempt. Should fail with Protocol Version Mismatch gm = response.HandshakeFailure[1].GenesisMismatch handshake.Handshake.chain_info.genesis_id.chain_id = gm.chain_id handshake.Handshake.chain_info.genesis_id.hash = gm.hash sign_handshake(my_key_pair_nacl, handshake.Handshake) await conn.send(handshake) response = await conn.recv() assert response.enum == 'HandshakeFailure', response.enum assert response.HandshakeFailure[ 1].enum == 'ProtocolVersionMismatch', response.HandshakeFailure[1].enum # Third handshake attempt. Should succeed pvm = response.HandshakeFailure[1].ProtocolVersionMismatch handshake.Handshake.version = pvm sign_handshake(my_key_pair_nacl, handshake.Handshake) await conn.send(handshake) response = await conn.recv() assert response.enum == 'Handshake', response.enum assert response.Handshake.chain_info.genesis_id.chain_id == handshake.Handshake.chain_info.genesis_id.chain_id assert response.Handshake.chain_info.genesis_id.hash == handshake.Handshake.chain_info.genesis_id.hash assert response.Handshake.edge_info.nonce == 1 assert response.Handshake.peer_id.keyType == 0 assert response.Handshake.peer_id.data == base58.b58decode( nodes[0].node_key.pk[len(ED_PREFIX):]) assert response.Handshake.target_peer_id.keyType == 0 assert response.Handshake.target_peer_id.data == bytes( my_key_pair_nacl.verify_key) assert response.Handshake.version == handshake.Handshake.version assert response.Handshake.listen_port == nodes[0].addr()[1]