Überprüfung der Ethash-Ausgabe Ethereum-Block-Hash

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.

Antworten (2)

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.

Tut mir leid, ich hätte klarstellen sollen, ich meinte die Verifizierung außerhalb der Kette wie bei Geth, nicht in Solidity.