Faits: Faits: A. Par jugement du 21 novembre 2002, le Tribunal pénal de l'arrondissement de la Broye a reconnu A._ coupable d'avoir commis diverses infractions, en particulier d'avoir vendu deux fois 500 grammes d'héroïne et une fois 500 grammes d'un produit de coupage. Il l'a condamné à six ans de réclusion et il a attribué à l'Etat, contre lui, une créance compensatrice de 22'000 fr. Statuant le 30 janvier 2004 sur l'appel du condamné, la Cour d'appel pénal du Tribunal cantonal a réformé ce prononcé. Elle a acquitté l'appelant de l'une des préventions retenues contre lui mais elle a confirmé toutes les autres, en particulier celle concernant le trafic des stupéfiants. Elle a fixé la peine à quatre ans de réclusion et a confirmé la créance compensatrice. Statuant le 30 janvier 2004 sur l'appel du condamné, la Cour d'appel pénal du Tribunal cantonal a réformé ce prononcé. Elle a acquitté l'appelant de l'une des préventions retenues contre lui mais elle a confirmé toutes les autres, en particulier celle concernant le trafic des stupéfiants. Elle a fixé la peine à quatre ans de réclusion et a confirmé la créance compensatrice. B. Agissant par la voie du recours de droit public, A._ requiert le Tribunal fédéral d'annuler l'arrêt du Tribunal cantonal. Il conteste le verdict de culpabilité concernant le trafic des stupéfiants, qu'il tient pour arbitraire et contraire à la présomption d'innocence. Sans reconnaître les autres infractions en cause, il renonce expressément à mettre en doute la validité des constatations correspondantes. Une demande d'assistance judiciaire est jointe au recours. Invités à répondre, le Ministère public cantonal propose le rejet du recours; la juridiction intimée a renoncé à déposer des observations.