Bumps Canónicos
El bump es el único byte que empuja una PDA fuera de la curva ed25519. El bump canónico es el primero que se encuentra contando hacia atrás desde 255 — y usar cualquier otro es un fallo de seguridad.
Qué es
Al derivar una PDA, aproximadamente la mitad de los hashes candidatos caen sobre la curva ed25519 (y por tanto son PDA inválidas). El bump es una semilla de un byte añadida para empujar el hash hasta que caiga fuera de la curva. El bump canónico es el primero válido encontrado contando hacia atrás desde 255.
Por qué existe
Para cualquier conjunto de semillas suele haber varios valores de bump que producen una dirección válida fuera de la curva. Si un programa aceptara cualquiera de ellos, un atacante podría aportar un bump no canónico para derivar una PDA válida distinta para las mismas semillas lógicas — eludiendo una suposición de unicidad. Estandarizar el bump canónico (el más alto) hace que cada conjunto de semillas mapee exactamente a una dirección.
Diseño de bytes
| Offset | Tamaño | Campo | Tipo | Notas |
|---|---|---|---|---|
| (última semilla) | 1 | bump |
u8 |
Añadido tras las semillas del usuario, antes del id del programa, en la preimagen del hash de la PDA. |
find_program_address ejecuta:
para bump en 255, 254, 253, … 0:
candidato = create_program_address(seeds + [bump], program_id)
si candidato está fuera de la curva: devolver (candidato, bump) # canónico = primer acierto
El bump devuelto es el canónico. Los programas lo almacenan (a menudo en la propia cuenta) para no repetir la búsqueda en cada llamada.
Dónde lo encuentras
Cada programa que usa PDA. El #[account(seeds = …, bump)] de Anchor encuentra e impone el bump canónico por ti; los programas en bruto llaman a find_program_address y luego pasan el bump a invoke_signed.
Errores comunes
- Valida siempre el bump canónico. Si tu programa acepta un bump aportado por el invocador sin comprobar que es canónico, un atacante puede derivar una PDA válida alternativa. La restricción
bumpde Anchor (sin valor) re-deriva e impone el canónico;bump = algun_bump_almacenadoconfía en un valor que debiste validar al inicializar. find_program_addresses caro;create_program_addresses barato. Buscar el bump cuesta cómputo. Los programas lo encuentran una vez (al inicializar), almacenan el bump y a partir de ahí usancreate_program_addresscon el bump almacenado.- El más alto primero, no el más bajo. Canónico = el primer acierto fuera de la curva contando hacia abajo desde 255, así que los bumps canónicos suelen ser 255, 254, etc. Un bump de, digamos, 251 significa que 255–252 cayeron todos sobre la curva.
Fuentes
Última verificación: 2026-05-20