Faits:
Faits:
A. Par jugement du 29 janvier 2004, le Tribunal correctionnel de l'arrondissement de Lausanne a reconnu X._, ressortissant de la Guinée Bissau, coupable d'infraction à la LStup et à la LArm, ainsi que de blanchiment d'argent. Il l'a condamné de ce fait à la peine de huit ans de réclusion, sous déduction de quatre-cent huit jours de détention préventive, ainsi qu'à l'expulsion à vie du territoire suisse. Le Tribunal correctionnel a retenu que X._ aurait acquis et possédé 2,750 kg de cocaïne présentant un haut degré de pureté. Il aurait coupé et conditionné la drogue, pour la confier à des revendeurs. Il en aurait lui-même écoulé plus de 300 g auprès de consommateurs réguliers. Il aurait également revendu et fumé de la marijuana, consommé de l'ecstasy et porté sans autorisation un couteau assimilé à une arme.
Par arrêt du 29 avril 2004, notifié le 11 août suivant, la Cour de cassation pénale du Tribunal cantonal du canton de Vaud a rejeté le recours formé par X._ contre le jugement du 29 janvier 2004, qu'elle a confirmé.
Par arrêt du 29 avril 2004, notifié le 11 août suivant, la Cour de cassation pénale du Tribunal cantonal du canton de Vaud a rejeté le recours formé par X._ contre le jugement du 29 janvier 2004, qu'elle a confirmé.
B. Agissant par la voie du recours de droit public, X._ demande au Tribunal fédéral d'annuler l'arrêt du 29 avril 2004. Il invoque les art. 9, 29 et 32 Cst., ainsi que l'art. 6 par. 2 CEDH. Il requiert l'assistance judiciaire.
La Cour de cassation se réfère à son arrêt. Le Ministère public propose le rejet du recours.

Le Tribunal fédéral considère en droit:
Le Tribunal fédéral considère en droit:
1. Invoquant les art. 32 al. 1 Cst. et 6 par. 2 CEDH, le recourant se plaint d'une appréciation arbitraire des preuves; ce grief est recevable dans le cadre du recours de droit public pour la violation des droits constitutionnels au sens de l'art. 84 al. 1 let. a OJ (<ref-ruling> consid. 2b p. 36 in fine et les arrêts cités).
En tant qu'elle concerne la constatation des faits et l'appréciation des preuves, la maxime "in dubio pro reo" est violée lorsque l'appréciation objective de l'ensemble des éléments de preuve laisse subsister un doute insurmontable quant à la culpabilité de l'accusé (<ref-ruling> consid. 2a p. 41; <ref-ruling> consid. 2a p. 88; <ref-ruling> consid. 2c p. 37). Une constatation de fait n'est pas arbitraire pour la seule raison que la version retenue par le juge ne coïncide pas avec celle de l'accusé; encore faut-il que l'appréciation des preuves soit manifestement insoutenable, en contradiction flagrante avec la situation effective, qu'elle constitue la violation d'une règle de droit ou d'un principe juridique clair et indiscuté, ou encore qu'elle heurte de façon grossière le sentiment de la justice et de l'équité (<ref-ruling> consid. 2a p. 41; <ref-ruling> consid. 2a p. 88; <ref-ruling> consid. 1b p. 30; <ref-ruling> consid. 2c p. 39, 292 consid. 3a p. 294). Saisi d'un recours de droit public ayant trait à l'appréciation des preuves, le Tribunal fédéral examine seulement si le juge cantonal a outrepassé son pouvoir d'appréciation et établi les faits de manière arbitraire (<ref-ruling> consid. 2a p. 41; <ref-ruling> consid. 2a p. 88; <ref-ruling> consid. 2d p. 37/38; <ref-ruling> consid. 1b p. 30, et les arrêts cités).
En tant qu'elle concerne la constatation des faits et l'appréciation des preuves, la maxime "in dubio pro reo" est violée lorsque l'appréciation objective de l'ensemble des éléments de preuve laisse subsister un doute insurmontable quant à la culpabilité de l'accusé (<ref-ruling> consid. 2a p. 41; <ref-ruling> consid. 2a p. 88; <ref-ruling> consid. 2c p. 37). Une constatation de fait n'est pas arbitraire pour la seule raison que la version retenue par le juge ne coïncide pas avec celle de l'accusé; encore faut-il que l'appréciation des preuves soit manifestement insoutenable, en contradiction flagrante avec la situation effective, qu'elle constitue la violation d'une règle de droit ou d'un principe juridique clair et indiscuté, ou encore qu'elle heurte de façon grossière le sentiment de la justice et de l'équité (<ref-ruling> consid. 2a p. 41; <ref-ruling> consid. 2a p. 88; <ref-ruling> consid. 1b p. 30; <ref-ruling> consid. 2c p. 39, 292 consid. 3a p. 294). Saisi d'un recours de droit public ayant trait à l'appréciation des preuves, le Tribunal fédéral examine seulement si le juge cantonal a outrepassé son pouvoir d'appréciation et établi les faits de manière arbitraire (<ref-ruling> consid. 2a p. 41; <ref-ruling> consid. 2a p. 88; <ref-ruling> consid. 2d p. 37/38; <ref-ruling> consid. 1b p. 30, et les arrêts cités).
2. Le jugement de condamnation repose pour l'essentiel sur le témoignage à charge de Y._. Celui-ci a déclaré avoir sous-loué son appartement à l'accusé qui se livrait au trafic de cocaïne. Il a dit avoir vu, à la fin du mois d'octobre ou au début du mois de novembre 2002, le recourant se partager avec un comparse 1,5 kg de cocaïne dans cet appartement. Il y aurait également trouvé, en avril 2002, 2 kg de cocaïne appartenant au recourant. Celui-ci a toujours contesté ces accusations, que Y._ a toujours maintenue, y compris à l'audience de jugement.
Le recourant fait valoir que le témoignage de Y._ ne serait confirmé par aucun autre élément. Il reproche au Tribunal correctionnel, puis à la Cour de cassation, confrontés à deux versions différentes des faits, d'avoir opté unilatéralement en faveur de celle de Y._. Or, ce dernier aurait fluctué dans ses déclarations et menti sciemment sur certains points de l'affaire, que le recourant ne tient pas pour secondaires, contrairement aux autorités cantonales. Cela priverait de toute crédibilité les accusations à charge portées par Y._.
Le juge pénal peut fonder sa conviction sur un témoignage ou sur des indices, pourvu que son appréciation à cet égard ne soit pas arbitraire. Il peut également, dans les mêmes conditions, tenir pour vraies et crédibles les déclarations d'un témoin, même si elles sont contestées par l'accusé. En l'occurrence, le recourant met en exergue le fait que Y._ aurait menti s'agissant de l'époque où il aurait mis son appartement à sa disposition, du montant du loyer, de sa présence dans l'appartement, de sa propre activité dans la vente de drogue, de sa consommation, ou de son train de vie. Force est de constater, avec la Cour de cassation, que ces éléments ne sont pas déterminants. Le témoin a effectivement varié sur ces points, sans doute pour minimiser sa propre activité délictuelle - pour laquelle, il a été condamné à une peine de trente mois de réclusion, au demeurant. Sur l'essentiel de ce qui concerne le recourant toutefois, ses déclarations ont été constantes et précises. On ne saurait dès lors reprocher au Tribunal correctionnel, puis à la Cour de cassation pénale, de leur avoir accordé une valeur probante plus grande qu'aux dénégations du recourant. Au demeurant, le recourant a reconnu lui-même avoir écoulé de la cocaïne dans les lieux publics qu'il fréquentait, pour une quantité d'au moins 310 g de cocaïne. Son train de vie était de surcroît sans rapport avec la très modeste allocation qu'il recevait des services sociaux. Outre le témoignage de Y._, il existait ainsi d'autres éléments à charge, dont les autorités cantonales pouvaient tenir compte dans une appréciation globale de la culpabilité du recourant. Eu égard à la cognition restreinte du Tribunal fédéral en la matière, la solution retenue par la cour cantonale n'est assurément pas arbitraire.
Le juge pénal peut fonder sa conviction sur un témoignage ou sur des indices, pourvu que son appréciation à cet égard ne soit pas arbitraire. Il peut également, dans les mêmes conditions, tenir pour vraies et crédibles les déclarations d'un témoin, même si elles sont contestées par l'accusé. En l'occurrence, le recourant met en exergue le fait que Y._ aurait menti s'agissant de l'époque où il aurait mis son appartement à sa disposition, du montant du loyer, de sa présence dans l'appartement, de sa propre activité dans la vente de drogue, de sa consommation, ou de son train de vie. Force est de constater, avec la Cour de cassation, que ces éléments ne sont pas déterminants. Le témoin a effectivement varié sur ces points, sans doute pour minimiser sa propre activité délictuelle - pour laquelle, il a été condamné à une peine de trente mois de réclusion, au demeurant. Sur l'essentiel de ce qui concerne le recourant toutefois, ses déclarations ont été constantes et précises. On ne saurait dès lors reprocher au Tribunal correctionnel, puis à la Cour de cassation pénale, de leur avoir accordé une valeur probante plus grande qu'aux dénégations du recourant. Au demeurant, le recourant a reconnu lui-même avoir écoulé de la cocaïne dans les lieux publics qu'il fréquentait, pour une quantité d'au moins 310 g de cocaïne. Son train de vie était de surcroît sans rapport avec la très modeste allocation qu'il recevait des services sociaux. Outre le témoignage de Y._, il existait ainsi d'autres éléments à charge, dont les autorités cantonales pouvaient tenir compte dans une appréciation globale de la culpabilité du recourant. Eu égard à la cognition restreinte du Tribunal fédéral en la matière, la solution retenue par la cour cantonale n'est assurément pas arbitraire.
3. Le recours doit ainsi être rejeté. La demande d'assistance judiciaire est admise (art. 152 OJ). Il est statué sans frais. Me Eric Cerottini, avocat à Lausanne, est désigné comme avocat d'office du recourant. Une indemnité de 1000 fr. à titre d'honoraires est allouée à Me Cerottini.

Par ces motifs, le Tribunal fédéral prononce:
Par ces motifs, le Tribunal fédéral prononce:
1. Le recours est rejeté.
1. Le recours est rejeté.
2. La demande d'assistance judiciaire est admise.
2. La demande d'assistance judiciaire est admise.
3. Il est statué sans frais.
3. Il est statué sans frais.
4. Me Eric Cerottini, avocat à Lausanne, est désigné comme avocat d'office du recourant. La Caisse du Tribunal fédéral versera une indemnité de 1000 fr. à Me Cerottini à titre d'honoraires.
4. Me Eric Cerottini, avocat à Lausanne, est désigné comme avocat d'office du recourant. La Caisse du Tribunal fédéral versera une indemnité de 1000 fr. à Me Cerottini à titre d'honoraires.
5. Le présent arrêt est communiqué en copie au mandataire du recourant, au Ministère public et à la Cour de cassation pénale du Tribunal cantonal du canton de Vaud.
Lausanne, le 11 novembre 2004
Au nom de la Ire Cour de droit public
du Tribunal fédéral suisse
Le président: Le greffier: