Im Ethash- Wiki wird erwähnt, dass ein 16-MB-Verifizierungscache verwendet werden kann, um Block-Hashes zu verifizieren, ohne den vollständigen DAG zu generieren, aber es gibt keine weiteren Details dazu, wie dies gemacht wird.
Was ist der Verifizierungsalgorithmus?
EDIT: Ich suche keine Lösung in Solidity, wo der Blockhash zugänglich ist. Ich suche nach einer Möglichkeit zu validieren, dass eine Ethash-Ausgabe außerhalb der Kette gültig ist.
Ich habe hier im Ethash-Wiki eine Antwort gefunden .
def calc_dataset_item(cache, i):
n = len(cache)
r = HASH_BYTES // WORD_BYTES
# initialize the mix
mix = copy.copy(cache[i % n])
mix[0] ^= i
mix = sha3_512(mix)
# fnv it with a lot of random cache nodes based on i
for j in range(DATASET_PARENTS):
cache_index = fnv(i ^ j, mix[j % r])
mix = map(fnv, mix, cache[cache_index % n])
return sha3_512(mix)
def hashimoto_light(full_size, cache, header, nonce):
return hashimoto(header, nonce, full_size, lambda x: calc_dataset_item(cache, x))
Anstatt den vollständigen Datensatz mit zu generieren calc_dataset_item
, werden nur die erforderlichen Datensatzelemente für den einzelnen Hash-Zyklus dynamisch generiert
Dieser Codeversuch:
function block_hash_validation(uint blockNumber, bytes32 blockHash)
constant returns(bool isValid)
{
return (block.blockhash(blockNumber) == blockHash);
}
Ich hoffe es hilft.
Philidor