Python伪代码

import random  
  
# 通过seed计算cache  
# seed每30000块重新生成  
# cache初始大小16M,每30000块添加128k  
def mkcache(cache_size, seed):  
    o = [hash(seed)]  
    for i in range(1, cache_size):  
        o.append(hash(o[-2]))  
    return o  
  
  
# 通过cache生成DAG中第i个元素  
# DAG同样每30000块添加8M  
# get_int_from_item根据mix获取下一个cache数组中值的索引  
# make_item求得新mix  
def cal_dataset_item(cache, i):  
    cache_size = cache.size  
    mix = hash(cache[i % cache_size] ^ i)  
    for j in range(256):  
        cache_index = get_int_from_item(mix)  
        mix = make_item(mix, cache[cache_index % cache_size])  
    return mix  
  
  
# 生成整个DAG  
def calc_dataset(full_size, cache):  
    return [cal_dataset_item(cache, i) for i in range(full_size)]  
  
  
# 通过区块头、nonce、DAG求出一个与target比较的值  
# 全节点版本  
def hashimoto_full(header, nonce, full_size, dataset):  
    mix = hash(header, nonce)  
    for i in range(64):  
        dataset_index = get_int_from_item(mix) % full_size  
        mix = make_item(mix, dataset[dataset_index])  
        mix = make_item(mix, dataset[dataset_index + 1])  
    return hash(mix)  
  
  
# 轻节点版本  
def hashimoto_light(header, nonce, full_size, cache):  
    mix = hash(header, nonce)  
    for i in range(64):  
        dataset_index = get_int_from_item(mix) % full_size  
        mix = make_item(mix, cal_dataset_item(cache, dataset_index))  
        mix = make_item(mix, cal_dataset_item(cache, dataset_index + 1))  
    return hash(mix)  
  
  
# 挖矿  
def mine(full_size, dataset, header, target):  
    nonce = random.randint(0, 2 ** 64)  
    while hashimoto_full(header, nonce, full_size, dataset) > target  
        nonce = (nonce + 1) % (2 ** 64)  
    return nonce