Explicación del código Shabal256

¿Alguien puede explicar el siguiente código con comentarios?

¿Qué son pbegin& pend?

Qué es (creo que son datos, ¿de dónde provienen?):(pbegin == pend ? pblank : static_cast<const void*>(&pbegin[0]))

¿Qué es (creo que es el tamaño de los datos 80?):(pend - pbegin) * sizeof(pbegin[0])

Qué es :pblank[1]

template<typename T1>
inline uint256 HashShabal(const T1 pbegin, const T1 pend)
{    
    sph_shabal256_context ctx_shabal;
    static unsigned char pblank[1];
    uint256 hash[1];
    sph_shabal256_init(&ctx_shabal);
    // ZSHABAL;
    sph_shabal256 (&ctx_shabal, (pbegin == pend ? pblank : static_cast<const void*>(&pbegin[0])), (pend - pbegin) * sizeof(pbegin[0]));
    sph_shabal256_close(&ctx_shabal, static_cast<void*>(&hash[0]));

    return hash[0];
}
Por curiosidad, ¿dónde encontraste esto?
@NickODell esto se puede encontrar en la mayoría de las monedas alternativas que usan sphlib

Respuestas (1)

¿Qué son pbegin y pend?

Punteros al principio de los datos y un byte más allá del final de los datos, respectivamente. La función que envuelve lleva un puntero al principio más el tamaño, por lo que necesita hacer algunos cálculos con los punteros.

¿Qué es (creo que son datos, de dónde viene?)

Presumiblemente, si encontró este código en un derivado de Bitcoin, los datos son un encabezado de bloque. Esta función también podría usarse para construir un árbol merkle. (Shabal256 parece ser lo suficientemente rápido para eso).

Qué es :pblank[1]

Una cadena de longitud cero. Presumiblemente, a veces esta función se llama como HashShabal(NULL, NULL), por lo que esto es para evitar una excepción de puntero nulo.

¿Alguien puede explicar el siguiente código con comentarios?

El propósito de esta función parece ser envolver las funciones Shabal256 de Projet RNRT SAPHIR para que sean más fáciles de usar.