¿Es posible verificar que un 'hash de bloque' dado sea válido en un contrato?

Dentro de mi contrato, quiero verificar si un dato block hashes válido o no.

block_hash_validation(string blockhash) returns (bool){
   ...//check()
   return true; || return false;
}

P1: En caso afirmativo, a partir del block hashvalor, ¿podría también aprender su número de bloque?

P2: ¿O también debo proporcionar el número de bloque block_hash_validation(uint blockNumber, string blockhash)para ver si el número de bloque apunta al correcto block hash?

block_hash_validation(uint blockNumber, string blockhash) returns (bool) {
   if (block.blockhash(blockNumber) == blockhash)
       return true;
   else
       return false;
}

Respuestas (1)

P1 : No veo una forma obvia de hacerlo sin entrar en un proceso descabellado que consume mucha gasolina y que no escalará. En mi opinión , un cliente web3 sería más adecuado para buscarlo .

P2 : Me inclinaría por este enfoque si es necesario.

Parece que debería ser bytes32 en lugar de cadena. De acuerdo con esto: http://solidity.readthedocs.io/en/develop/units-and-global-variables.html devolverá bytes32, por lo que probablemente sea mejor compararlo con el mismo tipo.

Observe la advertencia sobre el alcance limitado: hash del bloque dado: solo funciona para los 256 bloques más recientes, excluyendo el actual.

Parece que puede reducir el if/else a una sola línea, por lo que me parece correcto:

function block_hash_validation(uint blockNumber, bytes32 blockHash) 
    constant returns(bool isValid) 
{
    return (block.blockhash(blockNumber) == blockHash);
}

No hay tiempo para probar. Sin garantía :-)

Espero eso ayude.

Es posible probar que un hash existió hace más de 256 bloques, si proporciona los encabezados de bloque de ese bloque, pero comienza a ser bastante costoso.
Tal vez, ¿podríamos implementar nuestro propio contrato personalizado para almacenar hashes de bloques anteriores? que puede tener que activarse en cada bloque (usando ethereum alarm clock) para impulsar el hash recién generado.
Suena muy caro para mí. Estaría buscando una forma diferente de resolver el propósito de la misma. Es difícil decir qué sugerir. Tengo curiosidad sobre el caso de uso.
En lugar de definir blockHashcomo bytes32, supongo que debemos definirlo como string, ya que el formato de byte se almacena como una cadena, por ejemplo: "0x... b = web3.eth.getBlock(0).hash; block_hash_validation(b, 0)"esto funciona cuando blockHash se define como string@RobHitchens
Hay una conversión de tipo en la API de javascript ... toHex() (también, fromAscii parece funcionar). Puede convertir "myStringVal" a Hex. Entonces tendrá una representación bytes32 de una cadena para trabajar. Mi pensamiento sigue siendo que blockHash devuelve bytes32, por lo que eso es lo que querrías comparar. Solo mi impresión de leer los documentos.