%%%------------------------------------------------------------------- %%% @copyright (C) 2025, QPQ AG %%% @copyright (C) 2017, Aeternity Anstalt %%% %%% @doc Hive worker configuration logic, based on aec_mining.erl %%% in the Gajumaru platform (https://git.qpq.swiss/QPQ-AG/gajumaru) %%% @end %%%------------------------------------------------------------------- -module(gmhc_workers). -export([ get_worker_configs/0 , generate_from_hash/5 ]). -include_lib("kernel/include/logger.hrl"). -define(DEFAULT_EXECUTABLE_GROUP , <<"cpu">>). -define(DEFAULT_EXTRA_ARGS , <<>>). -define(DEFAULT_HEX_ENCODED_HEADER , false). -define(DEFAULT_REPEATS , 1). -define(DEFAULT_EDGE_BITS , 29). %%------------------------------------------------------------------------------ %% Read and parse worker configs. %% %% Workers defined in gajumaru.{json,yaml} user config file take precedence. %% If there are no workers defined in the user config, sys.config cuckoo %% workers are read. If there are neither user config nor sys.config workers %% ?DEFAULT_CUCKOO_ENV is used as the last resort option (i.e. mean29-generic %% without any extra args). %%------------------------------------------------------------------------------ -spec get_worker_configs() -> [gmhw_pow_cuckoo:config()]. get_worker_configs() -> ConfigMaps = worker_config_map(), ?LOG_DEBUG("ConfigMaps = ~p", [ConfigMaps]), lists:foldl( fun(Cfg, Configs) -> [build_worker_config(Cfg) | Configs] end, [], ConfigMaps). -spec generate_from_hash(gmhw_pow_cuckoo:hash(), gmhw_pow:sci_target(), gmhw_pow:nonce(), gmhw_pow_cuckoo:config(), gmhw_pow:instance() | undefined) -> {ok, [{gmhw_pow:nonce(), gmhw_pow_cuckoo:solution()}]} | {error, term()}. generate_from_hash(Hash, Target, Nonce, Config, WorkerInstance) -> gmhw_pow_cuckoo:generate_from_hash(Hash, Target, Nonce, Config, WorkerInstance, true). %% Internal functions. %%------------------------------------------------------------------------------ %% Config handling %%------------------------------------------------------------------------------ build_worker_config(Config) when is_map(Config) -> Exec = maps:get(<<"executable">>, Config), ExecGroup = maps:get(<<"executable_group">>, Config, ?DEFAULT_EXECUTABLE_GROUP), ExtraArgs = maps:get(<<"extra_args">>, Config, ?DEFAULT_EXTRA_ARGS), HexEncHdr = maps:get(<<"hex_encoded_header">>, Config, hex_encoding_default(ExecGroup, Exec)), Repeats = maps:get(<<"repeats">>, Config, ?DEFAULT_REPEATS), Instances = maps:get(<<"addressed_instances">>, Config, undefined), EdgeBits = ?DEFAULT_EDGE_BITS, gmhw_pow_cuckoo:config(Exec, ExecGroup, ExtraArgs, HexEncHdr, Repeats, EdgeBits, Instances); build_worker_config({Exec, ExtraArgs, HexEncHdr, Repeats, Instances, ExecGroup}) -> EdgeBits = ?DEFAULT_EDGE_BITS, gmhw_pow_cuckoo:config(Exec, ExecGroup, ExtraArgs, HexEncHdr, Repeats, EdgeBits, Instances). worker_config_map() -> gmhc_config:get_config([<<"workers">>]). hex_encoding_default(_, <<"cuda29">>) -> true; hex_encoding_default(_, _) -> ?DEFAULT_HEX_ENCODED_HEADER.