forked from cerc-io/plugeth
289b30715d
This commit converts the dependency management from Godeps to the vendor folder, also switching the tool from godep to trash. Since the upstream tool lacks a few features proposed via a few PRs, until those PRs are merged in (if), use github.com/karalabe/trash. You can update dependencies via trash --update. All dependencies have been updated to their latest version. Parts of the build system are reworked to drop old notions of Godeps and invocation of the go vet command so that it doesn't run against the vendor folder, as that will just blow up during vetting. The conversion drops OpenCL (and hence GPU mining support) from ethash and our codebase. The short reasoning is that there's noone to maintain and having opencl libs in our deps messes up builds as go install ./... tries to build them, failing with unsatisfied link errors for the C OpenCL deps. golang.org/x/net/context is not vendored in. We expect it to be fetched by the user (i.e. using go get). To keep ci.go builds reproducible the package is "vendored" in build/_vendor.
148 lines
4.8 KiB
C
148 lines
4.8 KiB
C
/*
|
|
This file is part of ethash.
|
|
|
|
ethash is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
ethash is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with ethash. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/** @file ethash.h
|
|
* @date 2015
|
|
*/
|
|
#pragma once
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#include <string.h>
|
|
#include <stddef.h>
|
|
#include "compiler.h"
|
|
|
|
#define ETHASH_REVISION 23
|
|
#define ETHASH_DATASET_BYTES_INIT 1073741824U // 2**30
|
|
#define ETHASH_DATASET_BYTES_GROWTH 8388608U // 2**23
|
|
#define ETHASH_CACHE_BYTES_INIT 1073741824U // 2**24
|
|
#define ETHASH_CACHE_BYTES_GROWTH 131072U // 2**17
|
|
#define ETHASH_EPOCH_LENGTH 30000U
|
|
#define ETHASH_MIX_BYTES 128
|
|
#define ETHASH_HASH_BYTES 64
|
|
#define ETHASH_DATASET_PARENTS 256
|
|
#define ETHASH_CACHE_ROUNDS 3
|
|
#define ETHASH_ACCESSES 64
|
|
#define ETHASH_DAG_MAGIC_NUM_SIZE 8
|
|
#define ETHASH_DAG_MAGIC_NUM 0xFEE1DEADBADDCAFE
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/// Type of a seedhash/blockhash e.t.c.
|
|
typedef struct ethash_h256 { uint8_t b[32]; } ethash_h256_t;
|
|
|
|
// convenience macro to statically initialize an h256_t
|
|
// usage:
|
|
// ethash_h256_t a = ethash_h256_static_init(1, 2, 3, ... )
|
|
// have to provide all 32 values. If you don't provide all the rest
|
|
// will simply be unitialized (not guranteed to be 0)
|
|
#define ethash_h256_static_init(...) \
|
|
{ {__VA_ARGS__} }
|
|
|
|
struct ethash_light;
|
|
typedef struct ethash_light* ethash_light_t;
|
|
struct ethash_full;
|
|
typedef struct ethash_full* ethash_full_t;
|
|
typedef int(*ethash_callback_t)(unsigned);
|
|
|
|
typedef struct ethash_return_value {
|
|
ethash_h256_t result;
|
|
ethash_h256_t mix_hash;
|
|
bool success;
|
|
} ethash_return_value_t;
|
|
|
|
/**
|
|
* Allocate and initialize a new ethash_light handler
|
|
*
|
|
* @param block_number The block number for which to create the handler
|
|
* @return Newly allocated ethash_light handler or NULL in case of
|
|
* ERRNOMEM or invalid parameters used for @ref ethash_compute_cache_nodes()
|
|
*/
|
|
ethash_light_t ethash_light_new(uint64_t block_number);
|
|
/**
|
|
* Frees a previously allocated ethash_light handler
|
|
* @param light The light handler to free
|
|
*/
|
|
void ethash_light_delete(ethash_light_t light);
|
|
/**
|
|
* Calculate the light client data
|
|
*
|
|
* @param light The light client handler
|
|
* @param header_hash The header hash to pack into the mix
|
|
* @param nonce The nonce to pack into the mix
|
|
* @return an object of ethash_return_value_t holding the return values
|
|
*/
|
|
ethash_return_value_t ethash_light_compute(
|
|
ethash_light_t light,
|
|
ethash_h256_t const header_hash,
|
|
uint64_t nonce
|
|
);
|
|
|
|
/**
|
|
* Allocate and initialize a new ethash_full handler
|
|
*
|
|
* @param light The light handler containing the cache.
|
|
* @param callback A callback function with signature of @ref ethash_callback_t
|
|
* It accepts an unsigned with which a progress of DAG calculation
|
|
* can be displayed. If all goes well the callback should return 0.
|
|
* If a non-zero value is returned then DAG generation will stop.
|
|
* Be advised. A progress value of 100 means that DAG creation is
|
|
* almost complete and that this function will soon return succesfully.
|
|
* It does not mean that the function has already had a succesfull return.
|
|
* @return Newly allocated ethash_full handler or NULL in case of
|
|
* ERRNOMEM or invalid parameters used for @ref ethash_compute_full_data()
|
|
*/
|
|
ethash_full_t ethash_full_new(ethash_light_t light, ethash_callback_t callback);
|
|
|
|
/**
|
|
* Frees a previously allocated ethash_full handler
|
|
* @param full The light handler to free
|
|
*/
|
|
void ethash_full_delete(ethash_full_t full);
|
|
/**
|
|
* Calculate the full client data
|
|
*
|
|
* @param full The full client handler
|
|
* @param header_hash The header hash to pack into the mix
|
|
* @param nonce The nonce to pack into the mix
|
|
* @return An object of ethash_return_value to hold the return value
|
|
*/
|
|
ethash_return_value_t ethash_full_compute(
|
|
ethash_full_t full,
|
|
ethash_h256_t const header_hash,
|
|
uint64_t nonce
|
|
);
|
|
/**
|
|
* Get a pointer to the full DAG data
|
|
*/
|
|
void const* ethash_full_dag(ethash_full_t full);
|
|
/**
|
|
* Get the size of the DAG data
|
|
*/
|
|
uint64_t ethash_full_dag_size(ethash_full_t full);
|
|
|
|
/**
|
|
* Calculate the seedhash for a given block number
|
|
*/
|
|
ethash_h256_t ethash_get_seedhash(uint64_t block_number);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|