¿Por qué las direcciones pueden tener menos de 34 bytes?

La entrada de wiki en Dirección dice:

Algunas direcciones de Bitcoin pueden tener menos de 34 caracteres (tan solo 27 en teoría) y seguir siendo válidas. [...] Estas direcciones más cortas son válidas simplemente porque representan números que comienzan con ceros, y cuando se omiten los ceros, la dirección codificada se vuelve más corta.

Muy bien, pero de acuerdo con este diagrama , una dirección de red principal es:

Base58Check(00 ++ RIPEMD160(SHA256(04 ++ pubkeyX ++ pubkeyY)) ++ checksum)

A continuación, miramos la entrada de Base58Check y vemos que el paso 4 es:

4) Tratar los resultados del paso 3 (una serie de bytes) como un único gran número big-endian, convertir a base 58 usando los pasos matemáticos normales (división de números grandes) y el alfabeto base 58 que se describe a continuación. El resultado debe normalizarse para que no tenga ceros iniciales de base 58 (carácter '1').

Lo primero es extraño: si se trata como un solo número big-endian, ¿no debería 00tener ningún efecto anteponer el byte de la red principal? Dado que ese es el byte más significativo, sería como escribir 00123en lugar de 123en notación normal, ¿no?

Segunda cosa extraña: si el resultado debe normalizarse para que no tenga ceros a la izquierda, ¿no significa eso que la salida nunca debe tener ninguna 1s? El paso 5 parece contradictorio con esto

5) El carácter inicial '1', que tiene un valor de cero en base 58, está reservado para representar un byte cero inicial completo, ya que cuando está en una posición inicial, no tiene valor como símbolo de base 58. Puede haber uno o más '1' iniciales cuando sea necesario para representar uno o más bytes cero iniciales. Cuente la cantidad de bytes con cero inicial que fueron el resultado del paso 3 (para direcciones antiguas de Bitcoin, siempre habrá al menos uno para el byte de versión/aplicación; para direcciones nuevas, nunca habrá ninguno). Cada byte de cero inicial estará representado por su propio carácter '1' en el resultado final.

Parece que el paso 4 habría eliminado los posibles bytes iniciales. Sin embargo, en el caso de que no lo hiciera, y por alguna razón no lo hiciera con el 00byte antepuesto, ¿no debería una dirección tener múltiples 1 iniciales, por ejemplo, 11175tWpb...en lugar de ser simplemente más corta, por ejemplo, 175tWpb...?

EDITAR: Ok, parece que lo que dice es que la carga útil dada X, base58(X)se normaliza para eliminar los ceros, y luego se antepone un 1para cada byte inicial de X, no base58(X). Todavía surge la pregunta de por qué las direcciones son más cortas en lugar de tener múltiples 1s. ¿Es que RIPEMD160(SHA256(04 ++ pubkeyX ++ pubkeyY))sucede que nunca tiene demasiadas 0s iniciales (que se antepondrían como 1s) mientras que las base58(RIPEMD160(SHA256(04 ++ pubkeyX ++ pubkeyY)))tiene (y se eliminan del resultado final)?

Respuestas (1)

Sí, puede haber múltiples caracteres '1' iniciales, y cada '1' representa un byte cero inicial. Esto conduce a una dirección más corta porque normalmente cada carácter base58 representa un poco menos de 6 bits de información, pero un byte cero inicial contiene exactamente 8 bits de información.

Por ejemplo, la dirección más corta que puede tener es 11111111111111111111114oLvT2 (que representa un hash de 160 bits de 00000000000000000000000000000000000000000). Tiene 21 caracteres "1" iniciales que representan exactamente 21 bytes cero iniciales (el hash precedido por otro 00).

No, hay direcciones más cortas. Vea esta respuesta: bitcoin.stackexchange.com/a/36948