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