¿Cuál es la función hash más barata disponible en solidez?

AFAIK hay 3 funciones hash para elegir en solidez ( sha3, sha256y ripemd). sha3 es nativo mientras que los otros usan contratos precompilados.

¿Cuál de estos es más barato (en términos de gasolina)?

Tus preguntas son un poco ambiguas. Podría mejorar su pregunta especificando lo que quiere decir con "barato". Supongo que te refieres a "¿qué algoritmo hash tiene el costo de gas más bajo?" (Barato también puede significar en términos de poder computacional).
@JeffreyW. hecho

Respuestas (1)

keccak256(nuevo alias para sha3) es más barato.

Fuente: Papel Amarillo

El Apéndice G menciona que el costo del gas sha3es:

  • 30 gases + 6 gases por cada palabra (redondeado hacia arriba) para datos de entrada a una operación SHA3 Keccak-256.

El Apéndice E tiene los costos para los demás.

sha256(SHA2-256) costos:

  • 60 gases + 12 gases por cada palabra (redondeado hacia arriba) para datos de entrada a una operación SHA2-256.

ripemdes aún más caro:

  • 600 gas + 120 gas por cada palabra (redondeado hacia arriba) para datos de entrada a una operación RIPEMD-160.
Vale la pena señalar que las llamadas a la sha3función incorporada (a diferencia de la directiva de ensamblaje) actualmente parecen crear una invocación de contrato en Solidity, que es mucho más costosa de lo que debería ser.
@NickJohnson Parece una buena pregunta si se está invocando un contrato. (Mantuve mi respuesta al Libro Amarillo, ya que los valores en una respuesta empírica que depende de la implementación podrían cambiar con el tiempo).
@NickJohnson, ¿cómo sabemos cómo lo llamamos? ¿Es la diferencia entre blah = sha3(blah blah)y assembly { blah = sha3(blahblahblah) }?
@bekah Así es; pero la forma en que funciona bien puede haber cambiado desde que escribí ese comentario.
¿Alguien puede confirmar si esto sigue siendo así?
sha3no es exactamente keccak256. El código fuente de Ethereum keccak256lo confirma.
@TharinduMadushanka ¿Te refieres a ethereum.stackexchange.com/questions/550/… ?
Sí. Solo para señalar que no es lo mismo que sha3. "La función hash de Ethereum, keccak256, a veces (erróneamente) llamada sha3" github.com/ethereum/eth-hash
@NickJohnson Este ya no parece ser el caso. Intenté hash algo vía keccak256(abi.encodePacked(...))y vía assembly {c := keccak256(add(encoded, 0x20), 40)}. La versión de ensamblaje en realidad terminó costando 11 gasolina más.