diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index e93d94ab..924e949c 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1 +1 @@ -custom: ['https://duinocoin.com/donate', 'https://paypal.me/duinocoin'] +custom: ['https://duinocoin.com/donate', 'https://paypal.me/revoxhere'] diff --git a/.gitignore b/.gitignore index 95c3303f..2e315104 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,8 @@ Wallet_*/ PCMiner_*/ AVRMiner_*/ +Duino-Coin PC Miner */ +Duino-Coin AVR Miner */ # Byte-compiled and optimized files __pycache__/ diff --git a/AVR_Miner.py b/AVR_Miner.py index 286f583f..824086d2 100644 --- a/AVR_Miner.py +++ b/AVR_Miner.py @@ -1,15 +1,15 @@ #!/usr/bin/env python3 """ -Duino-Coin Official AVR Miner 3.18 © MIT licensed +Duino-Coin Official AVR Miner 4.3 © MIT licensed https://duinocoin.com https://github.com/revoxhere/duino-coin -Duino-Coin Team & Community 2019-2022 +Duino-Coin Team & Community 2019-2025 """ from os import _exit, mkdir from os import name as osname from os import path -from os import system as ossystem +from os import system as ossystem from platform import machine as osprocessor from platform import system import sys @@ -18,7 +18,7 @@ from pathlib import Path from json import load as jsonload -import json +from random import choice from locale import LC_ALL, getdefaultlocale, getlocale, setlocale import zipfile @@ -27,18 +27,16 @@ from datetime import datetime from statistics import mean from signal import SIGINT, signal +from collections import deque from time import ctime, sleep, strptime, time import pip from subprocess import DEVNULL, Popen, check_call, call -from threading import Thread -from threading import Lock as thread_lock -from threading import Semaphore - +from threading import Thread, Lock import base64 as b64 - import os -printlock = Semaphore(value=1) + +printlock = Lock() # Python <3.5 check @@ -109,15 +107,16 @@ def port_num(com): class Settings: - VER = '3.18' - SOC_TIMEOUT = 15 - REPORT_TIME = 120 - AVR_TIMEOUT = 7 # diff 16 * 100 / 258 h/s = 6.2 s + VER = '4.3' + SOC_TIMEOUT = 10 + REPORT_TIME = 300 + AVR_TIMEOUT = 10 BAUDRATE = 115200 DATA_DIR = "Duino-Coin AVR Miner " + str(VER) SEPARATOR = "," ENCODING = "utf-8" TEMP_FOLDER = "Temp" + disable_title = False try: # Raspberry Pi latin users can't display this character @@ -182,7 +181,6 @@ def check_updates(): "avr_timeout": float(config["AVR Miner"]["avr_timeout"]), "discord_presence": config["AVR Miner"]["discord_presence"], "periodic_report": int(config["AVR Miner"]["periodic_report"]), - "shuffle_ports": config["AVR Miner"]["shuffle_ports"], "mining_key": config["AVR Miner"]["mining_key"] } @@ -267,20 +265,31 @@ def check_updates(): print(e) sys.exit() + +def has_mining_key(username): + response = requests.get( + "https://server.duinocoin.com/mining_key" + + "?u=" + username, + timeout=10 + ).json() + return response["has_key"] + + def check_mining_key(user_settings): user_settings = user_settings["AVR Miner"] if user_settings["mining_key"] != "None": - key = b64.b64decode(user_settings["mining_key"]).decode('utf-8') + key = "&k=" + b64.b64decode(user_settings["mining_key"]).decode('utf-8') else: key = '' response = requests.get( "https://server.duinocoin.com/mining_key" + "?u=" + user_settings["username"] - + "&k=" + key, + + key, timeout=10 ).json() + debug_output(response) if response["success"] and not response["has_key"]: # if the user doesn't have a mining key user_settings["mining_key"] = "None" @@ -292,10 +301,13 @@ def check_mining_key(user_settings): print("sys0", Style.RESET_ALL + get_string("config_saved"), "info") - sleep(1.5) return if not response["success"]: + if response["message"] == "Too many requests": + debug_output("Skipping mining key check - getting 429") + return + if user_settings["mining_key"] == "None": pretty_print( "sys0", @@ -312,7 +324,6 @@ def check_mining_key(user_settings): print("sys0", Style.RESET_ALL + get_string("config_saved"), "info") - sleep(1.5) check_mining_key(config) else: pretty_print( @@ -320,7 +331,7 @@ def check_mining_key(user_settings): get_string("invalid_mining_key"), "error") - retry = input("You want to retry? (y/n): ") + retry = input("Do you want to retry? (y/n): ") if retry == "y" or retry == "Y": mining_key = input("Enter your mining key: ") user_settings["mining_key"] = b64.b64encode(mining_key.encode("utf-8")).decode('utf-8') @@ -460,10 +471,9 @@ def start(donation_level): shares = [0, 0, 0] -hashrate_mean = [] -ping_mean = [] +hashrate_mean = deque(maxlen=25) +ping_mean = deque(maxlen=25) diff = 0 -shuffle_ports = "y" donator_running = False job = '' debug = 'n' @@ -511,12 +521,16 @@ def start(donation_level): lang = 'german' elif locale.startswith('fr'): lang = 'french' + elif locale.startswith('jp'): + lang = 'japanese' elif locale.startswith('tr'): lang = 'turkish' elif locale.startswith('it'): lang = 'italian' elif locale.startswith('pt'): lang = 'portuguese' + if locale.startswith("zh_TW"): + lang = "chinese_Traditional" elif locale.startswith('zh'): lang = 'chinese_simplified' elif locale.startswith('th'): @@ -531,6 +545,8 @@ def start(donation_level): lang = "indonesian" elif locale.startswith("cz"): lang = "czech" + elif locale.startswith("fi"): + lang = "finnish" else: lang = 'english' else: @@ -582,24 +598,26 @@ def debug_output(text: str): def title(title: str): - if osname == 'nt': - """ - Changing the title in Windows' cmd - is easy - just use the built-in - title command - """ - ossystem('title ' + title) - else: - """ - Most *nix terminals use - this escape sequence to change - the console window title - """ - try: - print('\33]0;' + title + '\a', end='') - sys.stdout.flush() - except Exception as e: - print(e) + if not Settings.disable_title: + if osname == 'nt': + """ + Changing the title in Windows' cmd + is easy - just use the built-in + title command + """ + ossystem('title ' + title) + else: + """ + Most *nix terminals use + this escape sequence to change + the console window title + """ + try: + print('\33]0;' + title + '\a', end='') + sys.stdout.flush() + except Exception as e: + debug_output("Error setting title: " +str(e)) + Settings.disable_title = True def handler(signal_received, frame): @@ -623,7 +641,6 @@ def load_config(): global debug global rig_identifier global discord_presence - global shuffle_ports global SOC_TIMEOUT if not Path(str(Settings.DATA_DIR) + '/Settings.cfg').is_file(): @@ -637,17 +654,26 @@ def load_config(): + Fore.YELLOW + get_string('wallet') + Fore.RESET + get_string('register_warning')) - username = input( - Style.RESET_ALL + Fore.YELLOW - + get_string('ask_username') - + Fore.RESET + Style.BRIGHT) - - mining_key = input(Style.RESET_ALL + Fore.YELLOW + correct_username = False + while not correct_username: + username = input( + Style.RESET_ALL + Fore.YELLOW + + get_string('ask_username') + + Fore.RESET + Style.BRIGHT) + if not username: + username = choice(["revox", "Bilaboz"]) + + r = requests.get(f"https://server.duinocoin.com/users/{username}", + timeout=Settings.SOC_TIMEOUT).json() + correct_username = r["success"] + if not correct_username: + print(get_string("incorrect_username")) + + mining_key = "None" + if has_mining_key(username): + mining_key = input(Style.RESET_ALL + Fore.YELLOW + get_string("ask_mining_key") + Fore.RESET + Style.BRIGHT) - if not mining_key: - mining_key = "None" - else: mining_key = b64.b64encode(mining_key.encode("utf-8")).decode('utf-8') print(Style.RESET_ALL + Fore.YELLOW @@ -666,6 +692,7 @@ def load_config(): port_names.append(port.device) avrport = '' + rig_identifier = '' while True: current_port = input( Style.RESET_ALL + Fore.YELLOW @@ -673,29 +700,33 @@ def load_config(): + Fore.RESET + Style.BRIGHT) if current_port in port_names: + confirm_identifier = input( + Style.RESET_ALL + Fore.YELLOW + + get_string('ask_rig_identifier') + + Fore.RESET + Style.BRIGHT) + if confirm_identifier == 'y' or confirm_identifier == 'Y': + current_identifier = input( + Style.RESET_ALL + Fore.YELLOW + + get_string('ask_rig_name') + + Fore.RESET + Style.BRIGHT) + rig_identifier += current_identifier + else: + rig_identifier += "None" + avrport += current_port confirmation = input( Style.RESET_ALL + Fore.YELLOW + get_string('ask_anotherport') + Fore.RESET + Style.BRIGHT) - if confirmation == 'y' or confirmation == 'Y': avrport += ',' + rig_identifier += ',' else: break else: print(Style.RESET_ALL + Fore.RED + 'Please enter a valid COM port from the list above') - rig_identifier = input( - Style.RESET_ALL + Fore.YELLOW - + get_string('ask_rig_identifier') - + Fore.RESET + Style.BRIGHT) - if rig_identifier == 'y' or rig_identifier == 'Y': - rig_identifier = input( - Style.RESET_ALL + Fore.YELLOW - + get_string('ask_rig_name') - + Fore.RESET + Style.BRIGHT) else: rig_identifier = 'None' @@ -722,11 +753,10 @@ def load_config(): 'language': lang, 'identifier': rig_identifier, 'debug': 'n', - "soc_timeout": 45, - "avr_timeout": 7, + "soc_timeout": 10, + "avr_timeout": 10, "discord_presence": "y", - "periodic_report": 60, - "shuffle_ports": "y", + "periodic_report": 300, "mining_key": mining_key} with open(str(Settings.DATA_DIR) @@ -734,6 +764,7 @@ def load_config(): config.write(configfile) avrport = avrport.split(',') + rig_identifier = rig_identifier.split(',') print(Style.RESET_ALL + get_string('config_saved')) hashrate_list = [0] * len(avrport) @@ -744,11 +775,10 @@ def load_config(): avrport = avrport.replace(" ", "").split(',') donation_level = int(config["AVR Miner"]['donate']) debug = config["AVR Miner"]['debug'] - rig_identifier = config["AVR Miner"]['identifier'] + rig_identifier = config["AVR Miner"]['identifier'].split(',') Settings.SOC_TIMEOUT = int(config["AVR Miner"]["soc_timeout"]) Settings.AVR_TIMEOUT = float(config["AVR Miner"]["avr_timeout"]) discord_presence = config["AVR Miner"]["discord_presence"] - shuffle_ports = config["AVR Miner"]["shuffle_ports"] Settings.REPORT_TIME = int(config["AVR Miner"]["periodic_report"]) hashrate_list = [0] * len(avrport) @@ -775,7 +805,7 @@ def greeting(): + Style.BRIGHT + get_string('banner') + Style.RESET_ALL + Fore.MAGENTA + f' {Settings.VER}' + Fore.RESET - + ' 2019-2022') + + ' 2019-2025') print( Style.DIM + Fore.MAGENTA @@ -795,7 +825,7 @@ def greeting(): + Settings.BLOCK + Style.NORMAL + Fore.RESET + get_string('avr_on_port') + Style.BRIGHT + Fore.YELLOW - + ' '.join(avrport)) + + ', '.join(avrport)) if osname == 'nt' or osname == 'posix': print( @@ -811,12 +841,19 @@ def greeting(): + Style.BRIGHT + Fore.YELLOW + 'DUCO-S1A ⚙ AVR diff') - if rig_identifier != "None": + if rig_identifier[0] != "None" or len(rig_identifier) > 1: print( Style.DIM + Fore.MAGENTA + Settings.BLOCK + Style.NORMAL + Fore.RESET + get_string('rig_identifier') - + Style.BRIGHT + Fore.YELLOW + rig_identifier) + + Style.BRIGHT + Fore.YELLOW + ", ".join(rig_identifier)) + + print( + Style.DIM + Fore.MAGENTA + + Settings.BLOCK + Style.NORMAL + + Fore.RESET + get_string("using_config") + + Style.BRIGHT + Fore.YELLOW + + str(Settings.DATA_DIR + '/Settings.cfg')) print( Style.DIM + Fore.MAGENTA @@ -885,27 +922,20 @@ def pretty_print(sender: str = "sys0", else: fg_color = Fore.YELLOW - with thread_lock(): - print(Fore.WHITE + datetime.now().strftime(Style.DIM + "%H:%M:%S ") - + bg_color + Style.BRIGHT + " " + sender + " " - + Back.RESET + " " + fg_color + msg.strip()) + + print_queue.append(Fore.RESET + datetime.now().strftime(Style.DIM + "%H:%M:%S ") + + Style.RESET_ALL + Fore.WHITE + bg_color + Style.BRIGHT + f" {sender} " + + Style.RESET_ALL + " " + fg_color + msg.strip()) -def share_print(id, type, accept, reject, total_hashrate, - computetime, diff, ping, reject_cause=None): +def share_print(id, type, accept, reject, thread_hashrate, + total_hashrate, computetime, diff, ping, reject_cause=None): """ Produces nicely formatted CLI output for shares: HH:MM:S |avrN| ⛏ Accepted 0/0 (100%) ∙ 0.0s ∙ 0 kH/s ⚙ diff 0 k ∙ ping 0ms """ - try: - diff = get_prefix("", int(diff), 0) - except: - diff = "?" - - try: - total_hashrate = get_prefix("H/s", total_hashrate, 2) - except: - total_hashrate = "? H/s" + thread_hashrate = get_prefix("H/s", thread_hashrate, 2) + total_hashrate = get_prefix("H/s", total_hashrate, 1) if type == "accept": share_str = get_string("accepted") @@ -919,38 +949,41 @@ def share_print(id, type, accept, reject, total_hashrate, share_str += f"{Style.NORMAL}({reject_cause}) " fg_color = Fore.RED - with thread_lock(): - print(Fore.WHITE + datetime.now().strftime(Style.DIM + "%H:%M:%S ") - + Fore.WHITE + Style.BRIGHT + Back.MAGENTA + Fore.RESET - + " avr" + str(id) + " " + Back.RESET - + fg_color + Settings.PICK + share_str + Fore.RESET - + str(accept) + "/" + str(accept + reject) + Fore.MAGENTA - + " (" + str(round(accept / (accept + reject) * 100)) + "%)" - + Style.NORMAL + Fore.RESET - + " ∙ " + str("%04.1f" % float(computetime)) + "s" - + Style.NORMAL + " ∙ " + Fore.BLUE + Style.BRIGHT - + str(total_hashrate) + Fore.RESET + Style.NORMAL - + Settings.COG + f" diff {diff} ∙ " + Fore.CYAN - + f"ping {(int(ping))}ms") - - -def mine_avr(com, threadid, fastest_pool): - global hashrate + print_queue.append( + Fore.RESET + datetime.now().strftime(Style.DIM + "%H:%M:%S ") + + Style.RESET_ALL + Fore.WHITE + Style.BRIGHT + Back.MAGENTA + + " avr" + str(id) + " " + Style.RESET_ALL + fg_color + + Settings.PICK + share_str + Fore.RESET + + str(accept) + "/" + str(accept + reject) + Fore.MAGENTA + + " (" + str(round(accept / (accept + reject) * 100)) + "%)" + + Style.NORMAL + Fore.RESET + + " ∙ " + str("%04.1f" % float(computetime)) + "s" + + Style.NORMAL + " ∙ " + Fore.BLUE + Style.BRIGHT + + f"{thread_hashrate}" + Style.DIM + + f" ({total_hashrate} {get_string('hashrate_total')})" + Fore.RESET + Style.NORMAL + + Settings.COG + f" {get_string('diff')} {diff} ∙ " + Fore.CYAN + + f"ping {(int(ping))}ms") + + +def mine_avr(com, threadid, fastest_pool, thread_rigid): + global hashrate, shares start_time = time() report_shares = 0 last_report_share = 0 while True: + shares = [0, 0, 0] while True: try: ser.close() pretty_print('sys' + port_num(com), - f"Closed COM port {com}", 'success') + f"No response from the board. Closed port {com}", + 'success') sleep(2) except: pass try: ser = Serial(com, baudrate=int(Settings.BAUDRATE), - timeout=float(Settings.AVR_TIMEOUT)) + timeout=int(Settings.AVR_TIMEOUT)) """ Sleep after opening the port to make sure the board resets properly after @@ -992,7 +1025,7 @@ def mine_avr(com, threadid, fastest_pool): 'success') else: pretty_print( - 'sys0', f' Miner is outdated (v{Settings.VER}) -' + 'sys0', f"{get_string('miner_is_outdated')} (v{Settings.VER}) -" + get_string('server_is_on_version') + server_version + Style.NORMAL + Fore.RESET + get_string('update_warning'), @@ -1006,7 +1039,7 @@ def mine_avr(com, threadid, fastest_pool): motd = motd.replace("\n", "\n\t\t") pretty_print("net" + str(threadid), - " MOTD: " + Fore.RESET + get_string("motd") + Fore.RESET + Style.NORMAL + str(motd), "success") break @@ -1022,9 +1055,66 @@ def mine_avr(com, threadid, fastest_pool): + get_string('mining_algorithm') + str(com) + ')', 'success') - while True: + # Perform a hash test to assign the starting diff + prev_hash = "ba29a15896fd2d792d5c4b60668bf2b9feebc51d" + exp_hash = "d0beba883d7e8cd119ea2b0e09b78f60f29e0968" + exp_result = 50 + retries = 0 + while retries < 3: try: + debug_output(com + ': Sending hash test to the board') + ser.write(bytes(str(prev_hash + + Settings.SEPARATOR + + exp_hash + + Settings.SEPARATOR + + "10" + + Settings.SEPARATOR), + encoding=Settings.ENCODING)) + debug_output(com + ': Reading hash test from the board') + result = ser.read_until(b'\n').decode().strip().split(',') + ser.flush() + + if result[0] and result[1]: + _ = int(result[0], 2) + debug_output(com + f': Result: {result[0]}') + else: + raise Exception("No data received from the board") + if int(result[0], 2) != exp_result: + raise Exception(com + f': Incorrect result received!') + computetime = round(int(result[1], 2) / 1000000, 5) + num_res = int(result[0], 2) + hashrate_test = round(num_res / computetime, 2) + break + except Exception as e: + debug_output(str(e)) + retries += 1 + else: + pretty_print('sys' + port_num(com), + f"Can't start mining on {com}" + Fore.RESET + + f" - board keeps responding improperly. " + + "Check if the code has been uploaded correctly " + + "and your device is supported by Duino-Coin.", + 'error') + break + + start_diff = "AVR" + if hashrate_test > 1000: + start_diff = "DUE" + elif hashrate_test > 550: + start_diff = "ARM" + elif hashrate_test > 380: + start_diff = "MEGA" + + pretty_print('sys' + port_num(com), + get_string('hashrate_test') + + get_prefix("H/s", hashrate_test, 2) + + Fore.RESET + Style.BRIGHT + + get_string('hashrate_test_diff') + + start_diff) + + while True: + try: if config["AVR Miner"]["mining_key"] != "None": key = b64.b64decode(config["AVR Miner"]["mining_key"]).decode() else: @@ -1035,7 +1125,7 @@ def mine_avr(com, threadid, fastest_pool): + Settings.SEPARATOR + str(username) + Settings.SEPARATOR - + 'AVR' + + start_diff + Settings.SEPARATOR + str(key) ) @@ -1072,7 +1162,6 @@ def mine_avr(com, threadid, fastest_pool): encoding=Settings.ENCODING)) debug_output(com + ': Reading result from the board') result = ser.read_until(b'\n').decode().strip().split(',') - ser.flush() if result[0] and result[1]: _ = int(result[0], 2) @@ -1082,6 +1171,7 @@ def mine_avr(com, threadid, fastest_pool): raise Exception("No data received from AVR") except Exception as e: debug_output(com + f': Retrying data read: {e}') + ser.flush() retry_counter += 1 continue @@ -1089,13 +1179,14 @@ def mine_avr(com, threadid, fastest_pool): break try: - computetime = round(int(result[1], 2) / 1000000, 3) + computetime = round(int(result[1], 2) / 1000000, 5) num_res = int(result[0], 2) hashrate_t = round(num_res / computetime, 2) hashrate_mean.append(hashrate_t) - hashrate = mean(hashrate_mean[-5:]) + hashrate = mean(hashrate_mean) hashrate_list[threadid] = hashrate + total_hashrate = sum(hashrate_list) except Exception as e: pretty_print('sys' + port_num(com), get_string('mining_avr_connection_error') @@ -1112,7 +1203,7 @@ def mine_avr(com, threadid, fastest_pool): + Settings.SEPARATOR + f'Official AVR Miner {Settings.VER}' + Settings.SEPARATOR - + str(rig_identifier) + + str(thread_rigid) + Settings.SEPARATOR + str(result[2])) @@ -1123,7 +1214,7 @@ def mine_avr(com, threadid, fastest_pool): time_delta = (responsetimestop - responsetimetart).microseconds ping_mean.append(round(time_delta / 1000)) - ping = mean(ping_mean[-10:]) + ping = mean(ping_mean) diff = get_prefix("", int(diff), 0) debug_output(com + f': retrieved feedback: {" ".join(feedback)}') except Exception as e: @@ -1137,32 +1228,32 @@ def mine_avr(com, threadid, fastest_pool): if feedback[0] == 'GOOD': shares[0] += 1 - printlock.acquire() share_print(port_num(com), "accept", - shares[0], shares[1], hashrate, + shares[0], shares[1], hashrate, total_hashrate, computetime, diff, ping) - printlock.release() + elif feedback[0] == 'BLOCK': shares[0] += 1 shares[2] += 1 - printlock.acquire() share_print(port_num(com), "block", - shares[0], shares[1], hashrate, + shares[0], shares[1], hashrate, total_hashrate, computetime, diff, ping) - printlock.release() + elif feedback[0] == 'BAD': shares[1] += 1 - printlock.acquire() share_print(port_num(com), "reject", - shares[0], shares[1], hashrate, + shares[0], shares[1], hashrate, total_hashrate, computetime, diff, ping, feedback[1]) - printlock.release() + else: - printlock.acquire() share_print(port_num(com), "reject", - shares[0], shares[1], hashrate, + shares[0], shares[1], hashrate, total_hashrate, computetime, diff, ping, feedback) - printlock.release() + + if shares[0] % 100 == 0 and shares[0] > 1: + pretty_print("sys0", + f"{get_string('surpassed')} {shares[0]} {get_string('surpassed_shares')}", + "success") title(get_string('duco_avr_miner') + str(Settings.VER) + f') - {shares[0]}/{(shares[0] + shares[1])}' @@ -1181,22 +1272,28 @@ def mine_avr(com, threadid, fastest_pool): def periodic_report(start_time, end_time, shares, - block, hashrate, uptime): + blocks, hashrate, uptime): + """ + Displays nicely formated uptime stats + """ seconds = round(end_time - start_time) - pretty_print("sys0", - " " + get_string('periodic_mining_report') + pretty_print("sys0", get_string("periodic_mining_report") + Fore.RESET + Style.NORMAL - + get_string('report_period') - + str(seconds) + get_string('report_time') - + get_string('report_body1') - + str(shares) + get_string('report_body2') + + get_string("report_period") + + str(seconds) + get_string("report_time") + + get_string("report_body1") + + str(shares) + get_string("report_body2") + str(round(shares/seconds, 1)) - + get_string('report_body3') - + get_string('report_body7') + str(block) - + get_string('report_body4') - + str(int(hashrate)) + " H/s" + get_string('report_body5') - + str(int(hashrate*seconds)) + get_string('report_body6') - + get_string('total_mining_time') + str(uptime), "success") + + get_string("report_body3") + + get_string("report_body7") + + str(blocks) + + get_string("report_body4") + + str(get_prefix("H/s", hashrate, 2)) + + get_string("report_body5") + + str(int(hashrate*seconds)) + + get_string("report_body6") + + get_string("total_mining_time") + + str(uptime) + "\n", "success") def calculate_uptime(start_time): @@ -1213,8 +1310,23 @@ def calculate_uptime(start_time): return str(round(uptime)) + get_string('uptime_seconds') +print_queue = [] +def print_queue_handler(): + """ + Prevents broken console logs with many threads + """ + while True: + if len(print_queue): + message = print_queue[0] + with printlock: + print(message) + print_queue.pop(0) + sleep(0.01) + + if __name__ == '__main__': init(autoreset=True) + Thread(target=print_queue_handler).start() title(f"{get_string('duco_avr_miner')}{str(Settings.VER)})") if sys.platform == "win32": @@ -1258,7 +1370,7 @@ def calculate_uptime(start_time): for port in avrport: Thread(target=mine_avr, args=(port, threadid, - fastest_pool)).start() + fastest_pool, rig_identifier[threadid])).start() threadid += 1 except Exception as e: debug_output(f'Error launching AVR thread(s): {e}') diff --git a/Arduino_Code/Arduino_Code.ino b/Arduino_Code/Arduino_Code.ino index cfb88f6d..1947373e 100644 --- a/Arduino_Code/Arduino_Code.ino +++ b/Arduino_Code/Arduino_Code.ino @@ -4,9 +4,9 @@ ( _ \( )( )(_ _)( \( )( _ )___ / __)( _ )(_ _)( \( ) )(_) ))(__)( _)(_ ) ( )(_)((___)( (__ )(_)( _)(_ ) ( (____/(______)(____)(_)\_)(_____) \___)(_____)(____)(_)\_) - Official code for Arduino boards version 3.0 + Official code for Arduino boards (and relatives) version 4.3 - Duino-Coin Team & Community 2019-2022 © MIT Licensed + Duino-Coin Team & Community 2019-2024 © MIT Licensed https://duinocoin.com https://github.com/revoxhere/duino-coin If you don't know where to start, visit official website and navigate to @@ -20,27 +20,31 @@ for default settings use -O0. -O may be a good tradeoff between both */ #ifndef LED_BUILTIN #define LED_BUILTIN 13 #endif +#define SEP_TOKEN "," +#define END_TOKEN "\n" /* For 8-bit microcontrollers we should use 16 bit variables since the difficulty is low, for all the other cases should be 32 bits. */ #if defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_MEGAAVR) -typedef uint16_t uintDiff; +typedef uint32_t uintDiff; #else typedef uint32_t uintDiff; #endif // Arduino identifier library - https://github.com/ricaun #include "uniqueID.h" -#include "sha1.h" -// Create globals -String lastblockhash = ""; -String newblockhash = ""; +#include "duco_hash.h" + +String get_DUCOID() { + String ID = "DUCOID"; + char buff[4]; + for (size_t i = 0; i < 8; i++) { + sprintf(buff, "%02X", (uint8_t)UniqueID8[i]); + ID += buff; + } + return ID; +} + String DUCOID = ""; -uintDiff difficulty = 0; -uintDiff ducos1result = 0; -// 40+40+20+3 is the maximum size of a job -const uint16_t job_maxsize = 104; -uint8_t job[job_maxsize]; -Sha1Wrapper Sha1_base; void setup() { // Prepare built-in led pin as output @@ -54,83 +58,107 @@ void setup() { Serial.flush(); } +void lowercase_hex_to_bytes(char const * hexDigest, uint8_t * rawDigest) { + for (uint8_t i = 0, j = 0; j < SHA1_HASH_LEN; i += 2, j += 1) { + uint8_t x = hexDigest[i]; + uint8_t b = x >> 6; + uint8_t r = ((x & 0xf) | (b << 3)) + b; + + x = hexDigest[i + 1]; + b = x >> 6; + + rawDigest[j] = (r << 4) | (((x & 0xf) | (b << 3)) + b); + } +} + // DUCO-S1A hasher -uintDiff ducos1a(String lastblockhash, String newblockhash, - uintDiff difficulty) { - newblockhash.toUpperCase(); - const char *c = newblockhash.c_str(); - uint8_t final_len = newblockhash.length() >> 1; - for (uint8_t i = 0, j = 0; j < final_len; i += 2, j++) - job[j] = ((((c[i] & 0x1F) + 9) % 25) << 4) + ((c[i + 1] & 0x1F) + 9) % 25; - - // Difficulty loop +uintDiff ducos1a(char const * prevBlockHash, char const * targetBlockHash, uintDiff difficulty) { #if defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_MEGAAVR) // If the difficulty is too high for AVR architecture then return 0 if (difficulty > 655) return 0; #endif - Sha1_base.init(); - Sha1_base.print(lastblockhash); - for (uintDiff ducos1res = 0; ducos1res < difficulty * 100 + 1; ducos1res++) { - Sha1 = Sha1_base; - Sha1.print(String(ducos1res)); - // Get SHA1 result - uint8_t *hash_bytes = Sha1.result(); - if (memcmp(hash_bytes, job, SHA1_HASH_LEN * sizeof(char)) == 0) { - // If expected hash is equal to the found hash, return the result - return ducos1res; - } - } - return 0; + + uint8_t target[SHA1_HASH_LEN]; + lowercase_hex_to_bytes(targetBlockHash, target); + + uintDiff const maxNonce = difficulty * 100 + 1; + return ducos1a_mine(prevBlockHash, target, maxNonce); } -String get_DUCOID() { - String ID = "DUCOID"; - char buff[4]; - for (size_t i = 0; i < 8; i++) { - sprintf(buff, "%02X", (uint8_t)UniqueID8[i]); - ID += buff; +uintDiff ducos1a_mine(char const * prevBlockHash, uint8_t const * target, uintDiff maxNonce) { + static duco_hash_state_t hash; + duco_hash_init(&hash, prevBlockHash); + + char nonceStr[10 + 1]; + for (uintDiff nonce = 0; nonce < maxNonce; nonce++) { + ultoa(nonce, nonceStr, 10); + + uint8_t const * hash_bytes = duco_hash_try_nonce(&hash, nonceStr); + if (memcmp(hash_bytes, target, SHA1_HASH_LEN) == 0) { + return nonce; + } } - return ID; + + return 0; } void loop() { // Wait for serial data - if (Serial.available() > 0) { - memset(job, 0, job_maxsize); - // Read last block hash - lastblockhash = Serial.readStringUntil(','); - // Read expected hash - newblockhash = Serial.readStringUntil(','); - // Read difficulty - difficulty = strtoul(Serial.readStringUntil(',').c_str(), NULL, 10); - // Clearing the receive buffer reading one job. - while (Serial.available()) Serial.read(); - // Turn on the built-in led - #if defined(ARDUINO_ARCH_AVR) - PORTB = PORTB | B00100000; - #else - digitalWrite(LED_BUILTIN, LOW); - #endif - // Start time measurement - uint32_t startTime = micros(); - // Call DUCO-S1A hasher - ducos1result = ducos1a(lastblockhash, newblockhash, difficulty); - // Calculate elapsed time - uint32_t elapsedTime = micros() - startTime; - // Turn on the built-in led - #if defined(ARDUINO_ARCH_AVR) - PORTB = PORTB & B11011111; - #else - digitalWrite(LED_BUILTIN, HIGH); - #endif - // Clearing the receive buffer before sending the result. - while (Serial.available()) Serial.read(); - // Send result back to the program with share time - Serial.print(String(ducos1result, 2) - + "," - + String(elapsedTime, 2) - + "," - + String(DUCOID) - + "\n"); + if (Serial.available() <= 0) { + return; + } + + // Reserve 1 extra byte for comma separator (and later zero) + char lastBlockHash[40 + 1]; + char newBlockHash[40 + 1]; + + // Read last block hash + if (Serial.readBytesUntil(',', lastBlockHash, 41) != 40) { + return; + } + lastBlockHash[40] = 0; + + // Read expected hash + if (Serial.readBytesUntil(',', newBlockHash, 41) != 40) { + return; } + newBlockHash[40] = 0; + + // Read difficulty + uintDiff difficulty = strtoul(Serial.readStringUntil(',').c_str(), NULL, 10); + // Clearing the receive buffer reading one job. + while (Serial.available()) Serial.read(); + // Turn off the built-in led + #if defined(ARDUINO_ARCH_AVR) + PORTB = PORTB | B00100000; + #else + digitalWrite(LED_BUILTIN, LOW); + #endif + + // Start time measurement + uint32_t startTime = micros(); + + // Call DUCO-S1A hasher + uintDiff ducos1result = ducos1a(lastBlockHash, newBlockHash, difficulty); + + // Calculate elapsed time + uint32_t elapsedTime = micros() - startTime; + + // Turn on the built-in led + #if defined(ARDUINO_ARCH_AVR) + PORTB = PORTB & B11011111; + #else + digitalWrite(LED_BUILTIN, HIGH); + #endif + + // Clearing the receive buffer before sending the result. + while (Serial.available()) Serial.read(); + + // Send result back to the program with share time + Serial.print(String(ducos1result, 2) + + SEP_TOKEN + + String(elapsedTime, 2) + + SEP_TOKEN + + String(DUCOID) + + END_TOKEN); } diff --git a/Arduino_Code/backend.cpp b/Arduino_Code/backend.cpp deleted file mode 100644 index 70c9d201..00000000 --- a/Arduino_Code/backend.cpp +++ /dev/null @@ -1,25 +0,0 @@ -// This file is part of cryptosuite2. // -// // -// cryptosuite2 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. // -// // -// cryptosuite2 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 cryptosuite2. If not, see . // -// // - -#pragma GCC optimize ("-Ofast") -#include "config.h" - -#ifndef SHA1_DISABLED -#include "sha1/constants.c" -#include "sha1/hash.c" -#include "sha1/types.c" -#include "sha1/sha1.c" -#endif diff --git a/Arduino_Code/config.h b/Arduino_Code/config.h deleted file mode 100644 index 4406388a..00000000 --- a/Arduino_Code/config.h +++ /dev/null @@ -1,28 +0,0 @@ -// This file is part of cryptosuite2. // -// // -// cryptosuite2 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. // -// // -// cryptosuite2 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 cryptosuite2. If not, see . // -// // - -#pragma GCC optimize ("-Ofast") - -// include the module config first, -// overwrite it in the arduino interface config. -#include "sha1/default.h" - -#ifndef SHA_CONFIG_H_ -#define SHA_CONFIG_H_ - -// No changes yet. - -#endif diff --git a/Arduino_Code/duco_hash.cpp b/Arduino_Code/duco_hash.cpp new file mode 100644 index 00000000..48113816 --- /dev/null +++ b/Arduino_Code/duco_hash.cpp @@ -0,0 +1,150 @@ +#include "duco_hash.h" + +#pragma GCC optimize ("-Ofast") + +#define sha1_rotl(bits,word) (((word) << (bits)) | ((word) >> (32 - (bits)))) + +void duco_hash_block(duco_hash_state_t * hasher) { + // NOTE: keeping this static improves performance quite a lot + static uint32_t w[16]; + + for (uint8_t i = 0, i4 = 0; i < 16; i++, i4 += 4) { + w[i] = (uint32_t(hasher->buffer[i4]) << 24) | + (uint32_t(hasher->buffer[i4 + 1]) << 16) | + (uint32_t(hasher->buffer[i4 + 2]) << 8) | + (uint32_t(hasher->buffer[i4 + 3])); + } + + uint32_t a = hasher->tempState[0]; + uint32_t b = hasher->tempState[1]; + uint32_t c = hasher->tempState[2]; + uint32_t d = hasher->tempState[3]; + uint32_t e = hasher->tempState[4]; + + for (uint8_t i = 10; i < 80; i++) { + if (i >= 16) { + w[i & 15] = sha1_rotl(1, w[(i-3) & 15] ^ w[(i-8) & 15] ^ w[(i-14) & 15] ^ w[(i-16) & 15]); + } + + uint32_t temp = sha1_rotl(5, a) + e + w[i & 15]; + if (i < 20) { + temp += (b & c) | ((~b) & d); + temp += 0x5a827999; + } else if(i < 40) { + temp += b ^ c ^ d; + temp += 0x6ed9eba1; + } else if(i < 60) { + temp += (b & c) | (b & d) | (c & d); + temp += 0x8f1bbcdc; + } else { + temp += b ^ c ^ d; + temp += 0xca62c1d6; + } + + e = d; + d = c; + c = sha1_rotl(30, b); + b = a; + a = temp; + } + + a += 0x67452301; + b += 0xefcdab89; + c += 0x98badcfe; + d += 0x10325476; + e += 0xc3d2e1f0; + + hasher->result[0 * 4 + 0] = a >> 24; + hasher->result[0 * 4 + 1] = a >> 16; + hasher->result[0 * 4 + 2] = a >> 8; + hasher->result[0 * 4 + 3] = a; + hasher->result[1 * 4 + 0] = b >> 24; + hasher->result[1 * 4 + 1] = b >> 16; + hasher->result[1 * 4 + 2] = b >> 8; + hasher->result[1 * 4 + 3] = b; + hasher->result[2 * 4 + 0] = c >> 24; + hasher->result[2 * 4 + 1] = c >> 16; + hasher->result[2 * 4 + 2] = c >> 8; + hasher->result[2 * 4 + 3] = c; + hasher->result[3 * 4 + 0] = d >> 24; + hasher->result[3 * 4 + 1] = d >> 16; + hasher->result[3 * 4 + 2] = d >> 8; + hasher->result[3 * 4 + 3] = d; + hasher->result[4 * 4 + 0] = e >> 24; + hasher->result[4 * 4 + 1] = e >> 16; + hasher->result[4 * 4 + 2] = e >> 8; + hasher->result[4 * 4 + 3] = e; +} + +void duco_hash_init(duco_hash_state_t * hasher, char const * prevHash) { + memcpy(hasher->buffer, prevHash, 40); + + if (prevHash == (void*)(0xffffffff)) { + // NOTE: THIS IS NEVER CALLED + // This is here to keep a live reference to hash_block + // Otherwise GCC tries to inline it entirely into the main loop + // Which causes massive perf degradation + duco_hash_block(nullptr); + } + + // Do first 10 rounds as these are going to be the same all time + + uint32_t a = 0x67452301; + uint32_t b = 0xefcdab89; + uint32_t c = 0x98badcfe; + uint32_t d = 0x10325476; + uint32_t e = 0xc3d2e1f0; + + static uint32_t w[10]; + + for (uint8_t i = 0, i4 = 0; i < 10; i++, i4 += 4) { + w[i] = (uint32_t(hasher->buffer[i4]) << 24) | + (uint32_t(hasher->buffer[i4 + 1]) << 16) | + (uint32_t(hasher->buffer[i4 + 2]) << 8) | + (uint32_t(hasher->buffer[i4 + 3])); + } + + for (uint8_t i = 0; i < 10; i++) { + uint32_t temp = sha1_rotl(5, a) + e + w[i & 15]; + temp += (b & c) | ((~b) & d); + temp += 0x5a827999; + + e = d; + d = c; + c = sha1_rotl(30, b); + b = a; + a = temp; + } + + hasher->tempState[0] = a; + hasher->tempState[1] = b; + hasher->tempState[2] = c; + hasher->tempState[3] = d; + hasher->tempState[4] = e; +} + +void duco_hash_set_nonce(duco_hash_state_t * hasher, char const * nonce) { + uint8_t * b = hasher->buffer; + + uint8_t off = SHA1_HASH_LEN * 2; + for (uint8_t i = 0; i < 10 && nonce[i] != 0; i++) { + b[off++] = nonce[i]; + } + + uint8_t total_bytes = off; + + b[off++] = 0x80; + while (off < 62) { + b[off++] = 0; + } + + b[62] = total_bytes >> 5; + b[63] = total_bytes << 3; +} + +uint8_t const * duco_hash_try_nonce(duco_hash_state_t * hasher, char const * nonce) { + duco_hash_set_nonce(hasher, nonce); + duco_hash_block(hasher); + + return hasher->result; +} diff --git a/Arduino_Code/duco_hash.h b/Arduino_Code/duco_hash.h new file mode 100644 index 00000000..462b75a9 --- /dev/null +++ b/Arduino_Code/duco_hash.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +#define SHA1_BLOCK_LEN 64 +#define SHA1_HASH_LEN 20 + +struct duco_hash_state_t { + uint8_t buffer[SHA1_BLOCK_LEN]; + uint8_t result[SHA1_HASH_LEN]; + uint32_t tempState[5]; + + uint8_t block_offset; + uint8_t total_bytes; +}; + +void duco_hash_init(duco_hash_state_t * hasher, char const * prevHash); + +uint8_t const * duco_hash_try_nonce(duco_hash_state_t * hasher, char const * nonce); diff --git a/Arduino_Code/sha1.cpp b/Arduino_Code/sha1.cpp deleted file mode 100644 index ed8eebf9..00000000 --- a/Arduino_Code/sha1.cpp +++ /dev/null @@ -1,58 +0,0 @@ -// This file is part of cryptosuite2. // -// // -// cryptosuite2 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. // -// // -// cryptosuite2 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 cryptosuite2. If not, see . // -// // - -#pragma GCC optimize ("-Ofast") - -#include "sha1.h" - -#ifndef SHA1_DISABLED -#ifndef SHA1_DISABLE_WRAPPER -void Sha1Wrapper::init(void) -{ - sha1_hasher_init(&_hasher); -} - -#ifdef SHA1_ENABLE_HMAC -void Sha1Wrapper::initHmac(const uint8_t * secret, uint16_t secretLength) -{ - sha1_hasher_init_hmac(&_hasher, secret, secretLength); -} - -uint8_t * Sha1Wrapper::resultHmac(void) -{ - return sha1_hasher_gethmac(&_hasher); -} -#endif - - -size_t Sha1Wrapper::write(uint8_t byte) -{ - if(sha1_hasher_putc(&_hasher, byte) == byte) - { - return 1; - } - return 0; -} - -uint8_t * Sha1Wrapper::result(void) -{ - return sha1_hasher_gethash(&_hasher); -} - -Sha1Wrapper Sha1; - -#endif -#endif diff --git a/Arduino_Code/sha1.h b/Arduino_Code/sha1.h deleted file mode 100644 index 50bfe622..00000000 --- a/Arduino_Code/sha1.h +++ /dev/null @@ -1,48 +0,0 @@ -// This file is part of cryptosuite2. // -// // -// cryptosuite2 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. // -// // -// cryptosuite2 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 cryptosuite2. If not, see . // -// // - -#pragma GCC optimize ("-Ofast") - -#include "config.h" - -#ifndef Sha1_h -#define Sha1_h - -#include -#include "Print.h" -#include "sha1/sha1.h" - -#ifndef SHA1_DISABLE_WRAPPER -class Sha1Wrapper : public Print -{ - public: - void init(void); - uint8_t * result(void); -#ifdef SHA1_ENABLE_HMAC - void initHmac(const uint8_t * secret, uint16_t secretLength); - uint8_t * resultHmac(void); -#endif - virtual size_t write(uint8_t); - using Print::write; - private: - struct sha1_hasher_s _hasher; - -}; - -extern Sha1Wrapper Sha1; -#endif - -#endif diff --git a/Arduino_Code/sha1/basic.h b/Arduino_Code/sha1/basic.h deleted file mode 100644 index 1f021c7c..00000000 --- a/Arduino_Code/sha1/basic.h +++ /dev/null @@ -1,26 +0,0 @@ -// This file is part of cryptosuite2. // -// // -// cryptosuite2 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. // -// // -// cryptosuite2 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 cryptosuite2. If not, see . // -// // - -#ifndef SHA1_BASIC_H_ -#define SHA1_BASIC_H_ - -#include "default.h" -#include - -#define sha1_rotl(bits,word) (((word) << (bits)) | ((word) >> (32 - (bits)))) - -#endif - diff --git a/Arduino_Code/sha1/constants.c b/Arduino_Code/sha1/constants.c deleted file mode 100644 index 4d044969..00000000 --- a/Arduino_Code/sha1/constants.c +++ /dev/null @@ -1,30 +0,0 @@ -// This file is part of cryptosuite2. // -// // -// cryptosuite2 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. // -// // -// cryptosuite2 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 cryptosuite2. If not, see . // -// // - -#include "constants.h" - -const uint32_t sha1_init_state[SHA1_HASH_LEN / 4] PROGMEM = -{ - 0x67452301, 0xefcdab89, 0x98badcfe, - 0x10325476, 0xc3d2e1f0 -}; - -const uint32_t sha1_constants[4] PROGMEM = -{ - 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6 -}; - - diff --git a/Arduino_Code/sha1/constants.h b/Arduino_Code/sha1/constants.h deleted file mode 100644 index 294d72d0..00000000 --- a/Arduino_Code/sha1/constants.h +++ /dev/null @@ -1,58 +0,0 @@ -// This file is part of cryptosuite2. // -// // -// cryptosuite2 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. // -// // -// cryptosuite2 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 cryptosuite2. If not, see . // -// // - -#ifndef SHA1_CONSTANTS_H_ -#define SHA1_CONSTANTS_H_ - -#include "default.h" -#include - -#define SHA1_BLOCK_LEN 64 -#define SHA1_HASH_LEN 20 - -#include "Arduino.h" - -extern const uint32_t sha1_init_state[SHA1_HASH_LEN / 4] PROGMEM; - -extern const uint32_t sha1_constants[4] PROGMEM; - - -// From RFC3174 (http://www.faqs.org/rfcs/rfc3174.html) -// (Section 5): -// -// A sequence of constant words K(0), K(1), ... , K(79) is used in the -// SHA-1. In hex these are given by -// -// K(t) = 5A827999 ( 0 <= t <= 19) -// -// K(t) = 6ED9EBA1 (20 <= t <= 39) -// -// K(t) = 8F1BBCDC (40 <= t <= 59) -// -// K(t) = CA62C1D6 (60 <= t <= 79). -// -// This can be achieved using an integer division by 20 and only 4 constants. - -#define sha1_k(i) pgm_read_dword(sha1_constants + (i / 20)) - - -#ifdef SHA1_ENABLE_HMAC -#define SHA1_HMAC_IPAD 0x36 -#define SHA1_HMAC_OPAD 0x5c -#endif - -#endif - diff --git a/Arduino_Code/sha1/default.h b/Arduino_Code/sha1/default.h deleted file mode 100644 index 2474e9e8..00000000 --- a/Arduino_Code/sha1/default.h +++ /dev/null @@ -1,31 +0,0 @@ -// This file is part of cryptosuite2. // -// // -// cryptosuite2 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. // -// // -// cryptosuite2 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 cryptosuite2. If not, see . // -// // - -// This file is the module config header -// when the arduino interface is NOT used. -// -// If you want to use the library with Arduino, -// edit sha/config.h. If you use a proper build system, -// use this config file for sha1 and sha/sha256/default.h -// for sha256. -#ifndef SHA1_DEFAULT_H_ -#define SHA1_DEFAULT_H_ - -#define SHA1_ENABLE_HMAC - - -#endif - diff --git a/Arduino_Code/sha1/hash.c b/Arduino_Code/sha1/hash.c deleted file mode 100644 index 143ed63e..00000000 --- a/Arduino_Code/sha1/hash.c +++ /dev/null @@ -1,222 +0,0 @@ -// This file is part of cryptosuite2. // -// // -// cryptosuite2 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. // -// // -// cryptosuite2 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 cryptosuite2. If not, see . // -// // - -#include "hash.h" -#include -#include - - -void sha1_hash_block(sha1_hasher_t hasher) -{ - uint8_t i; - uint32_t a, b, c, d, e, temp; - - // XXX: Omit initializing the message schedule. - // See how I did this below. - // Allocating the message schedule would eat 2k RAM - // which is a no-go on an AVR. - uint8_t i4; - // On x86 we have to change the byte order, because... - // I actually do not know. - for(i = i4 = 0; i < 16; i++, i4 += 4) - { - hasher->buffer.words[i] = (((uint32_t)hasher->buffer.bytes[i4]) << 24) | - (((uint32_t)hasher->buffer.bytes[i4 + 1]) << 16) | - (((uint32_t)hasher->buffer.bytes[i4 + 2]) << 8) | - (((uint32_t)hasher->buffer.bytes[i4 + 3])); - } - - a = hasher->state.words[0]; - b = hasher->state.words[1]; - c = hasher->state.words[2]; - d = hasher->state.words[3]; - e = hasher->state.words[4]; - - for(i = 0; i < 80; i++) - { - // XXX: - // This part of the computation omits the message schedule - // W as described in https://tools.ietf.org/html/rfc4634 - // The first 16 words of the message schedule is just the block - // anyways and the computation of the message schedule uses only - // the last 16 words, so we can do that. - if( i >= 16 ) - { - hasher->buffer.words[i & 15] = sha1_rotl(1 - , hasher->buffer.words[(i - 3)& 15] - ^ hasher->buffer.words[(i - 8)& 15] - ^ hasher->buffer.words[(i - 14)& 15] - ^ hasher->buffer.words[(i - 16)& 15]); - } - - temp = sha1_rotl(5, a) + e + hasher->buffer.words[i & 15] + sha1_k(i); - if(i < 20) - { - temp += (b & c) | ((~b) & d); - } - else if(i < 40) - { - temp += b ^ c ^ d; - } - else if(i < 60) - { - temp += (b & c) | (b & d) | (c & d); - } - else - { - temp += b ^ c ^ d; - } - - - - - - e = d; - d = c; - c = sha1_rotl(30, b); - b = a; - a = temp; - } - hasher->state.words[0] += a; - hasher->state.words[1] += b; - hasher->state.words[2] += c; - hasher->state.words[3] += d; - hasher->state.words[4] += e; - -} - - - -void sha1_hasher_add_byte(sha1_hasher_t hasher, uint8_t byte) -{ - hasher->buffer.bytes[hasher->block_offset] = byte; - hasher->block_offset++; - if(hasher->block_offset == SHA1_BLOCK_LEN) - { - sha1_hash_block(hasher); - hasher->block_offset = 0; - } -} - -/** - * NOTE: once the block has been pad'ed the hasher will - * produce nonsense data. Therefore putc will return EOF - * once the hasher has been pad'ed (this happens, when - * sha1_hasher_gethash or sha1_hasher_gethmac are invoced). - * */ -uint8_t sha1_hasher_putc(sha1_hasher_t hasher, uint8_t byte) -{ - if(hasher->_lock) - { - return EOF; - } - hasher->total_bytes++; - sha1_hasher_add_byte(hasher, byte); - return byte; - -} - - - -void sha1_hasher_pad(sha1_hasher_t hasher) -{ - hasher->_lock = 1; - sha1_hasher_add_byte(hasher, 0x80); - while(hasher->block_offset != 56) - { - sha1_hasher_add_byte(hasher, 0); - } - - // FIXME: - // Use a loop for this. - sha1_hasher_add_byte(hasher, hasher->total_bytes * 8 >> 56); - sha1_hasher_add_byte(hasher, hasher->total_bytes * 8 >> 48); - sha1_hasher_add_byte(hasher, hasher->total_bytes * 8 >> 40); - sha1_hasher_add_byte(hasher, hasher->total_bytes * 8 >> 32); - sha1_hasher_add_byte(hasher, hasher->total_bytes * 8 >> 24); - sha1_hasher_add_byte(hasher, hasher->total_bytes * 8 >> 16); - sha1_hasher_add_byte(hasher, hasher->total_bytes * 8 >> 8); - sha1_hasher_add_byte(hasher, hasher->total_bytes * 8); - -} - -uint8_t * sha1_hasher_gethash(sha1_hasher_t hasher) -{ - sha1_hasher_pad(hasher); - uint8_t i; - - // switch byte order. - for(i = 0; i < (SHA1_HASH_LEN / 4); i++) - { - uint32_t a, b; - a = hasher->state.words[i]; - b = a << 24; - b |= ( a << 8) & 0x00ff0000; - b |= ( a >> 8) & 0x0000ff00; - b |= a >> 24; - hasher->state.words[i] = b; - } - return hasher->state.bytes; -} - - -#ifdef SHA1_ENABLE_HMAC -void sha1_hasher_init_hmac(sha1_hasher_t hasher, const uint8_t * key, size_t key_len) -{ - uint8_t i; - memset(hasher->hmac_key_buffer, 0, SHA1_BLOCK_LEN); - - if(key_len > SHA1_BLOCK_LEN) - { - sha1_hasher_init(hasher); - while(key_len--) - { - sha1_hasher_putc(hasher, *key++); - } - memcpy(hasher->hmac_key_buffer, - sha1_hasher_gethash(hasher), - SHA1_HASH_LEN); - } - else - { - memcpy(hasher->hmac_key_buffer, key, key_len); - } - sha1_hasher_init(hasher); - for(i = 0; i < SHA1_BLOCK_LEN; i++) - { - sha1_hasher_putc(hasher, hasher->hmac_key_buffer[i] ^ SHA1_HMAC_IPAD); - } - -} -uint8_t * sha1_hasher_gethmac(sha1_hasher_t hasher) -{ - uint8_t i; - memcpy(hasher->hmac_inner_hash, sha1_hasher_gethash(hasher), - SHA1_HASH_LEN); - sha1_hasher_init(hasher); - - for(i = 0; i < SHA1_BLOCK_LEN; i++) - { - sha1_hasher_putc(hasher, hasher->hmac_key_buffer[i] ^ SHA1_HMAC_OPAD); - } - for(i = 0; i < SHA1_HASH_LEN; i++) - { - sha1_hasher_putc(hasher, hasher->hmac_inner_hash[i]); - } - return sha1_hasher_gethash(hasher); -} -#endif - diff --git a/Arduino_Code/sha1/hash.h b/Arduino_Code/sha1/hash.h deleted file mode 100644 index 28dc4850..00000000 --- a/Arduino_Code/sha1/hash.h +++ /dev/null @@ -1,56 +0,0 @@ -// This file is part of cryptosuite2. // -// // -// cryptosuite2 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. // -// // -// cryptosuite2 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 cryptosuite2. If not, see . // -// // - -#ifndef SHA1_HASH_H_ -#define SHA1_HASH_H_ - - -#include "default.h" -#include "constants.h" -#include "types.h" -#include "basic.h" - -void sha1_hash_block(sha1_hasher_t hasher); - -void sha1_hasher_add_byte(sha1_hasher_t hasher, uint8_t byte); - -/** - * NOTE: once the block has been pad'ed the hasher will - * produce nonsense data. Therefore putc will return EOF - * once the hasher has been pad'ed (this happens, when - * sha1_hasher_gethash or sha1_hasher_gethmac are invoced). - * */ -uint8_t sha1_hasher_putc(sha1_hasher_t hasher, uint8_t byte); - -void sha1_hasher_pad(sha1_hasher_t hasher); - -/** - * NOTE: this will NOT return a copy of the data but - * a REFERENCE! One MUST NOT free the result. - * - * Also this modifies the state of the hasher. The - * hasher has an internal lock ensuring that writing - * to the hasher fails after this operation. - * */ -uint8_t * sha1_hasher_gethash(sha1_hasher_t hasher); - -#ifdef SHA1_ENABLE_HMAC -void sha1_hasher_init_hmac(sha1_hasher_t hasher, const uint8_t * key, size_t key_len); -uint8_t * sha1_hasher_gethmac(sha1_hasher_t hasher); -#endif - -#endif - diff --git a/Arduino_Code/sha1/sha1.c b/Arduino_Code/sha1/sha1.c deleted file mode 100644 index 925374eb..00000000 --- a/Arduino_Code/sha1/sha1.c +++ /dev/null @@ -1,36 +0,0 @@ -// This file is part of cryptosuite2. // -// // -// cryptosuite2 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. // -// // -// cryptosuite2 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 cryptosuite2. If not, see . // -// // - -#include "sha1.h" - -ssize_t sha1_hasher_write(sha1_hasher_t hasher, const void * buf, size_t count) -{ - size_t written = 0; - uint8_t chk_result; - char c; - while(written < count) - { - c = ((char *) buf)[written]; - chk_result = sha1_hasher_putc(hasher, c); - if(chk_result != c) - { - return -1; - } - written++; - } - return written; -} - diff --git a/Arduino_Code/sha1/sha1.h b/Arduino_Code/sha1/sha1.h deleted file mode 100644 index 24544498..00000000 --- a/Arduino_Code/sha1/sha1.h +++ /dev/null @@ -1,33 +0,0 @@ -// This file is part of cryptosuite2. // -// // -// cryptosuite2 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. // -// // -// cryptosuite2 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 cryptosuite2. If not, see . // -// // - -#ifndef SHA1_SHA1_H_ -#define SHA1_SHA1_H_ - -#include "default.h" -#include "types.h" -#include "hash.h" -#include -//#include - -#ifndef ssize_t -#define ssize_t long int -#endif - -ssize_t sha1_hasher_write(sha1_hasher_t hasher, const void * buf, size_t count); - -#endif - diff --git a/Arduino_Code/sha1/types.c b/Arduino_Code/sha1/types.c deleted file mode 100644 index 0199bbfe..00000000 --- a/Arduino_Code/sha1/types.c +++ /dev/null @@ -1,52 +0,0 @@ -// This file is part of cryptosuite2. // -// // -// cryptosuite2 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. // -// // -// cryptosuite2 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 cryptosuite2. If not, see . // -// // - -#include "types.h" -#include -#include -#include "constants.h" - -sha1_hasher_t sha1_hasher_new(void) -{ - sha1_hasher_t hasher = (sha1_hasher_t) malloc(sizeof(struct sha1_hasher_s)); - if(!hasher) - { - return NULL; - } - sha1_hasher_init(hasher); - return hasher; -} - -void sha1_hasher_init(sha1_hasher_t hasher) -{ - uint8_t i; - for(i = 0; i < SHA1_HASH_LEN / 4; i++) - { - hasher->state.words[i] = pgm_read_dword(sha1_init_state + i); - } - hasher->block_offset = 0; - hasher->total_bytes = 0; - hasher->_lock = 0; - -} - - -void sha1_hasher_del(sha1_hasher_t hasher) -{ - free(hasher); -} - - diff --git a/Arduino_Code/sha1/types.h b/Arduino_Code/sha1/types.h deleted file mode 100644 index d0a681f5..00000000 --- a/Arduino_Code/sha1/types.h +++ /dev/null @@ -1,60 +0,0 @@ -// This file is part of cryptosuite2. // -// // -// cryptosuite2 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. // -// // -// cryptosuite2 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 cryptosuite2. If not, see . // -// // - -#ifndef SHA1_TYPES_H_ -#define SHA1_TYPES_H_ - -#include "default.h" -#include -#include -#include "constants.h" - - -typedef union -{ - uint8_t bytes[SHA1_HASH_LEN]; - uint32_t words[SHA1_HASH_LEN / 4]; - -} sha1_state_t; - -typedef union -{ - uint8_t bytes[SHA1_BLOCK_LEN]; - uint32_t words[SHA1_BLOCK_LEN / 4]; - -} sha1_block_t; - -typedef struct __attribute__((__packed__)) sha1_hasher_s -{ - sha1_state_t state; - sha1_block_t buffer; - - uint8_t block_offset; - uint64_t total_bytes; - uint8_t _lock; -#ifdef SHA1_ENABLE_HMAC - uint8_t hmac_key_buffer[SHA1_BLOCK_LEN]; - uint8_t hmac_inner_hash[SHA1_HASH_LEN]; -#endif -} * sha1_hasher_t; - -sha1_hasher_t sha1_hasher_new(void); -void sha1_hasher_del(sha1_hasher_t hasher); -void sha1_hasher_init(sha1_hasher_t hasher); - - -#endif - diff --git a/Arduino_Code/uniqueID.h b/Arduino_Code/uniqueID.h index a5c171b4..fde6140b 100644 --- a/Arduino_Code/uniqueID.h +++ b/Arduino_Code/uniqueID.h @@ -19,7 +19,7 @@ #elif defined(ARDUINO_ARCH_SAMD) #elif defined(ARDUINO_ARCH_STM32) #elif defined(TEENSYDUINO) -#elif defined(ARDUINO_ARCH_MBED_RP2040) +#elif defined(ARDUINO_ARCH_MBED_RP2040) || defined(ARDUINO_ARCH_RP2040) //#include #elif defined(ARDUINO_ARCH_MEGAAVR) #else @@ -57,7 +57,7 @@ #elif defined(TEENSYDUINO) #define UniqueIDsize 16 #define UniqueIDbuffer 16 -#elif defined(ARDUINO_ARCH_MBED_RP2040) +#elif defined(ARDUINO_ARCH_MBED_RP2040) || defined(ARDUINO_ARCH_RP2040) #define UniqueIDsize 32 #define UniqueIDbuffer 32 #elif defined(ARDUINO_ARCH_MEGAAVR) diff --git a/ESP_Code/Counter.h b/ESP_Code/Counter.h new file mode 100644 index 00000000..58a4a0e6 --- /dev/null +++ b/ESP_Code/Counter.h @@ -0,0 +1,53 @@ +#ifndef _COUNTER_H_ +#define _COUNTER_H_ + +#include +#include + +template +class Counter { + +public: + Counter() { reset(); } + + void reset() { + memset(buffer, '0', max_digits); + buffer[max_digits] = '\0'; + val = 0; + len = 1; + } + + inline Counter &operator++() { + inc_string(buffer + max_digits - 1); + ++val; + return *this; + } + + inline operator unsigned int() const { return val; } + inline const char *c_str() const { return buffer + max_digits - len; } + inline size_t strlen() const { return len; } + +protected: + inline void inc_string(char *c) { + // In theory, the line below should be uncommented to avoid writing outside the buffer. In practice however, + // with max_digits set to 10 or more, we can fit all possible unsigned 32-bit integers in the buffer. + // The check is skipped to gain a small extra speed improvement. + // if (c >= buffer) return; + + if (*c < '9') { + *c += 1; + } + else { + *c = '0'; + inc_string(c - 1); + len = max(max_digits - (c - buffer) + 1, len); + } + } + +protected: + char buffer[max_digits + 1]; + unsigned int val; + size_t len; +}; + +#endif diff --git a/ESP_Code/DSHA1.h b/ESP_Code/DSHA1.h new file mode 100644 index 00000000..58dc41b2 --- /dev/null +++ b/ESP_Code/DSHA1.h @@ -0,0 +1,201 @@ +#ifndef DSHA1_H +#define DSHA1_H + +#include + +class DSHA1 { + +public: + static const size_t OUTPUT_SIZE = 20; + + DSHA1() { + initialize(s); + } + + DSHA1 &write(const unsigned char *data, size_t len) { + size_t bufsize = bytes % 64; + if (bufsize && bufsize + len >= 64) { + memcpy(buf + bufsize, data, 64 - bufsize); + bytes += 64 - bufsize; + data += 64 - bufsize; + transform(s, buf); + bufsize = 0; + } + while (len >= 64) { + transform(s, data); + bytes += 64; + data += 64; + len -= 64; + } + if (len > 0) { + memcpy(buf + bufsize, data, len); + bytes += len; + } + return *this; + } + + void finalize(unsigned char hash[OUTPUT_SIZE]) { + const unsigned char pad[64] = {0x80}; + unsigned char sizedesc[8]; + writeBE64(sizedesc, bytes << 3); + write(pad, 1 + ((119 - (bytes % 64)) % 64)); + write(sizedesc, 8); + writeBE32(hash, s[0]); + writeBE32(hash + 4, s[1]); + writeBE32(hash + 8, s[2]); + writeBE32(hash + 12, s[3]); + writeBE32(hash + 16, s[4]); + } + + DSHA1 &reset() { + bytes = 0; + initialize(s); + return *this; + } + + // Warmup the cache and get a boost in performance + DSHA1 &warmup() { + uint8_t warmup[20]; + this->write((uint8_t *)"warmupwarmupwa", 20).finalize(warmup); + return *this; + } + +private: + uint32_t s[5]; + unsigned char buf[64]; + uint64_t bytes; + + const uint32_t k1 = 0x5A827999ul; + const uint32_t k2 = 0x6ED9EBA1ul; + const uint32_t k3 = 0x8F1BBCDCul; + const uint32_t k4 = 0xCA62C1D6ul; + + uint32_t inline f1(uint32_t b, uint32_t c, uint32_t d) { return d ^ (b & (c ^ d)); } + uint32_t inline f2(uint32_t b, uint32_t c, uint32_t d) { return b ^ c ^ d; } + uint32_t inline f3(uint32_t b, uint32_t c, uint32_t d) { return (b & c) | (d & (b | c)); } + + uint32_t inline left(uint32_t x) { return (x << 1) | (x >> 31); } + + void inline Round(uint32_t a, uint32_t &b, uint32_t c, uint32_t d, uint32_t &e, + uint32_t f, uint32_t k, uint32_t w) { + e += ((a << 5) | (a >> 27)) + f + k + w; + b = (b << 30) | (b >> 2); + } + + void initialize(uint32_t s[5]) { + s[0] = 0x67452301ul; + s[1] = 0xEFCDAB89ul; + s[2] = 0x98BADCFEul; + s[3] = 0x10325476ul; + s[4] = 0xC3D2E1F0ul; + } + + void transform(uint32_t *s, const unsigned char *chunk) { + uint32_t a = s[0], b = s[1], c = s[2], d = s[3], e = s[4]; + uint32_t w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15; + + Round(a, b, c, d, e, f1(b, c, d), k1, w0 = readBE32(chunk + 0)); + Round(e, a, b, c, d, f1(a, b, c), k1, w1 = readBE32(chunk + 4)); + Round(d, e, a, b, c, f1(e, a, b), k1, w2 = readBE32(chunk + 8)); + Round(c, d, e, a, b, f1(d, e, a), k1, w3 = readBE32(chunk + 12)); + Round(b, c, d, e, a, f1(c, d, e), k1, w4 = readBE32(chunk + 16)); + Round(a, b, c, d, e, f1(b, c, d), k1, w5 = readBE32(chunk + 20)); + Round(e, a, b, c, d, f1(a, b, c), k1, w6 = readBE32(chunk + 24)); + Round(d, e, a, b, c, f1(e, a, b), k1, w7 = readBE32(chunk + 28)); + Round(c, d, e, a, b, f1(d, e, a), k1, w8 = readBE32(chunk + 32)); + Round(b, c, d, e, a, f1(c, d, e), k1, w9 = readBE32(chunk + 36)); + Round(a, b, c, d, e, f1(b, c, d), k1, w10 = readBE32(chunk + 40)); + Round(e, a, b, c, d, f1(a, b, c), k1, w11 = readBE32(chunk + 44)); + Round(d, e, a, b, c, f1(e, a, b), k1, w12 = readBE32(chunk + 48)); + Round(c, d, e, a, b, f1(d, e, a), k1, w13 = readBE32(chunk + 52)); + Round(b, c, d, e, a, f1(c, d, e), k1, w14 = readBE32(chunk + 56)); + Round(a, b, c, d, e, f1(b, c, d), k1, w15 = readBE32(chunk + 60)); + + Round(e, a, b, c, d, f1(a, b, c), k1, w0 = left(w0 ^ w13 ^ w8 ^ w2)); + Round(d, e, a, b, c, f1(e, a, b), k1, w1 = left(w1 ^ w14 ^ w9 ^ w3)); + Round(c, d, e, a, b, f1(d, e, a), k1, w2 = left(w2 ^ w15 ^ w10 ^ w4)); + Round(b, c, d, e, a, f1(c, d, e), k1, w3 = left(w3 ^ w0 ^ w11 ^ w5)); + Round(a, b, c, d, e, f2(b, c, d), k2, w4 = left(w4 ^ w1 ^ w12 ^ w6)); + Round(e, a, b, c, d, f2(a, b, c), k2, w5 = left(w5 ^ w2 ^ w13 ^ w7)); + Round(d, e, a, b, c, f2(e, a, b), k2, w6 = left(w6 ^ w3 ^ w14 ^ w8)); + Round(c, d, e, a, b, f2(d, e, a), k2, w7 = left(w7 ^ w4 ^ w15 ^ w9)); + Round(b, c, d, e, a, f2(c, d, e), k2, w8 = left(w8 ^ w5 ^ w0 ^ w10)); + Round(a, b, c, d, e, f2(b, c, d), k2, w9 = left(w9 ^ w6 ^ w1 ^ w11)); + Round(e, a, b, c, d, f2(a, b, c), k2, w10 = left(w10 ^ w7 ^ w2 ^ w12)); + Round(d, e, a, b, c, f2(e, a, b), k2, w11 = left(w11 ^ w8 ^ w3 ^ w13)); + Round(c, d, e, a, b, f2(d, e, a), k2, w12 = left(w12 ^ w9 ^ w4 ^ w14)); + Round(b, c, d, e, a, f2(c, d, e), k2, w13 = left(w13 ^ w10 ^ w5 ^ w15)); + Round(a, b, c, d, e, f2(b, c, d), k2, w14 = left(w14 ^ w11 ^ w6 ^ w0)); + Round(e, a, b, c, d, f2(a, b, c), k2, w15 = left(w15 ^ w12 ^ w7 ^ w1)); + + Round(d, e, a, b, c, f2(e, a, b), k2, w0 = left(w0 ^ w13 ^ w8 ^ w2)); + Round(c, d, e, a, b, f2(d, e, a), k2, w1 = left(w1 ^ w14 ^ w9 ^ w3)); + Round(b, c, d, e, a, f2(c, d, e), k2, w2 = left(w2 ^ w15 ^ w10 ^ w4)); + Round(a, b, c, d, e, f2(b, c, d), k2, w3 = left(w3 ^ w0 ^ w11 ^ w5)); + Round(e, a, b, c, d, f2(a, b, c), k2, w4 = left(w4 ^ w1 ^ w12 ^ w6)); + Round(d, e, a, b, c, f2(e, a, b), k2, w5 = left(w5 ^ w2 ^ w13 ^ w7)); + Round(c, d, e, a, b, f2(d, e, a), k2, w6 = left(w6 ^ w3 ^ w14 ^ w8)); + Round(b, c, d, e, a, f2(c, d, e), k2, w7 = left(w7 ^ w4 ^ w15 ^ w9)); + Round(a, b, c, d, e, f3(b, c, d), k3, w8 = left(w8 ^ w5 ^ w0 ^ w10)); + Round(e, a, b, c, d, f3(a, b, c), k3, w9 = left(w9 ^ w6 ^ w1 ^ w11)); + Round(d, e, a, b, c, f3(e, a, b), k3, w10 = left(w10 ^ w7 ^ w2 ^ w12)); + Round(c, d, e, a, b, f3(d, e, a), k3, w11 = left(w11 ^ w8 ^ w3 ^ w13)); + Round(b, c, d, e, a, f3(c, d, e), k3, w12 = left(w12 ^ w9 ^ w4 ^ w14)); + Round(a, b, c, d, e, f3(b, c, d), k3, w13 = left(w13 ^ w10 ^ w5 ^ w15)); + Round(e, a, b, c, d, f3(a, b, c), k3, w14 = left(w14 ^ w11 ^ w6 ^ w0)); + Round(d, e, a, b, c, f3(e, a, b), k3, w15 = left(w15 ^ w12 ^ w7 ^ w1)); + + Round(c, d, e, a, b, f3(d, e, a), k3, w0 = left(w0 ^ w13 ^ w8 ^ w2)); + Round(b, c, d, e, a, f3(c, d, e), k3, w1 = left(w1 ^ w14 ^ w9 ^ w3)); + Round(a, b, c, d, e, f3(b, c, d), k3, w2 = left(w2 ^ w15 ^ w10 ^ w4)); + Round(e, a, b, c, d, f3(a, b, c), k3, w3 = left(w3 ^ w0 ^ w11 ^ w5)); + Round(d, e, a, b, c, f3(e, a, b), k3, w4 = left(w4 ^ w1 ^ w12 ^ w6)); + Round(c, d, e, a, b, f3(d, e, a), k3, w5 = left(w5 ^ w2 ^ w13 ^ w7)); + Round(b, c, d, e, a, f3(c, d, e), k3, w6 = left(w6 ^ w3 ^ w14 ^ w8)); + Round(a, b, c, d, e, f3(b, c, d), k3, w7 = left(w7 ^ w4 ^ w15 ^ w9)); + Round(e, a, b, c, d, f3(a, b, c), k3, w8 = left(w8 ^ w5 ^ w0 ^ w10)); + Round(d, e, a, b, c, f3(e, a, b), k3, w9 = left(w9 ^ w6 ^ w1 ^ w11)); + Round(c, d, e, a, b, f3(d, e, a), k3, w10 = left(w10 ^ w7 ^ w2 ^ w12)); + Round(b, c, d, e, a, f3(c, d, e), k3, w11 = left(w11 ^ w8 ^ w3 ^ w13)); + Round(a, b, c, d, e, f2(b, c, d), k4, w12 = left(w12 ^ w9 ^ w4 ^ w14)); + Round(e, a, b, c, d, f2(a, b, c), k4, w13 = left(w13 ^ w10 ^ w5 ^ w15)); + Round(d, e, a, b, c, f2(e, a, b), k4, w14 = left(w14 ^ w11 ^ w6 ^ w0)); + Round(c, d, e, a, b, f2(d, e, a), k4, w15 = left(w15 ^ w12 ^ w7 ^ w1)); + + Round(b, c, d, e, a, f2(c, d, e), k4, w0 = left(w0 ^ w13 ^ w8 ^ w2)); + Round(a, b, c, d, e, f2(b, c, d), k4, w1 = left(w1 ^ w14 ^ w9 ^ w3)); + Round(e, a, b, c, d, f2(a, b, c), k4, w2 = left(w2 ^ w15 ^ w10 ^ w4)); + Round(d, e, a, b, c, f2(e, a, b), k4, w3 = left(w3 ^ w0 ^ w11 ^ w5)); + Round(c, d, e, a, b, f2(d, e, a), k4, w4 = left(w4 ^ w1 ^ w12 ^ w6)); + Round(b, c, d, e, a, f2(c, d, e), k4, w5 = left(w5 ^ w2 ^ w13 ^ w7)); + Round(a, b, c, d, e, f2(b, c, d), k4, w6 = left(w6 ^ w3 ^ w14 ^ w8)); + Round(e, a, b, c, d, f2(a, b, c), k4, w7 = left(w7 ^ w4 ^ w15 ^ w9)); + Round(d, e, a, b, c, f2(e, a, b), k4, w8 = left(w8 ^ w5 ^ w0 ^ w10)); + Round(c, d, e, a, b, f2(d, e, a), k4, w9 = left(w9 ^ w6 ^ w1 ^ w11)); + Round(b, c, d, e, a, f2(c, d, e), k4, w10 = left(w10 ^ w7 ^ w2 ^ w12)); + Round(a, b, c, d, e, f2(b, c, d), k4, w11 = left(w11 ^ w8 ^ w3 ^ w13)); + Round(e, a, b, c, d, f2(a, b, c), k4, w12 = left(w12 ^ w9 ^ w4 ^ w14)); + Round(d, e, a, b, c, f2(e, a, b), k4, left(w13 ^ w10 ^ w5 ^ w15)); + Round(c, d, e, a, b, f2(d, e, a), k4, left(w14 ^ w11 ^ w6 ^ w0)); + Round(b, c, d, e, a, f2(c, d, e), k4, left(w15 ^ w12 ^ w7 ^ w1)); + + s[0] += a; + s[1] += b; + s[2] += c; + s[3] += d; + s[4] += e; + } + + uint32_t static inline readBE32(const unsigned char *ptr) { + return __builtin_bswap32(*(uint32_t *)ptr); + } + + void static inline writeBE32(unsigned char *ptr, uint32_t x) { + *(uint32_t *)ptr = __builtin_bswap32(x); + } + + void static inline writeBE64(unsigned char *ptr, uint64_t x) { + *(uint64_t *)ptr = __builtin_bswap64(x); + } +}; +#endif diff --git a/ESP_Code/Dashboard.h b/ESP_Code/Dashboard.h new file mode 100644 index 00000000..30c88924 --- /dev/null +++ b/ESP_Code/Dashboard.h @@ -0,0 +1,151 @@ +#ifndef DASHBOARD_H +#define DASHBOARD_H + +const char WEBSITE[] PROGMEM = R"=====( + + + + + + + Duino-Coin @@DEVICE@@ dashboard + + + + + +
+
+

+ + @@DEVICE@@ (@@ID@@) +

+

+ Self-hosted, lightweight, official dashboard for your Duino-Coin miner +

+
+
+
+
+
+
+

+ Mining statistics +

+
+
+
+ @@HASHRATE@@ kH/s +
+
+ Hashrate +
+
+
+
+ @@DIFF@@ +
+
+ Difficulty +
+
+
+
+ @@SHARES@@ +
+
+ Shares +
+
+
+
+ @@NODE@@ +
+
+ Node +
+
+
+
+
+
+
+

+ Device information +

+
+
+
+ @@DEVICE@@ +
+
+ Device type +
+
+
+
+ @@ID@@ +
+
+ Device ID +
+
+
+
+ @@MEMORY@@ +
+
+ Free memory +
+
+
+
+ @@VERSION@@ +
+
+ Miner version +
+
+
+
+ @@SENSOR@@ +
+
+ Sensor reading(s) +
+
+
+
+
+
+
+
+ +
+
+
+ + +)====="; + +#endif diff --git a/ESP_Code/DisplayHal.h b/ESP_Code/DisplayHal.h new file mode 100644 index 00000000..dfde2490 --- /dev/null +++ b/ESP_Code/DisplayHal.h @@ -0,0 +1,296 @@ +// Abstraction layer for handling various types of screens +// See Settings.h for enabling the screen of your choice +#ifndef DISPLAY_HAL_H +#define DISPLAY_HAL_H + +// Abstraction layer: custom fonts, images, etc. +#if defined(DISPLAY_SSD1306) + static const unsigned char image_check_contour_bits[] U8X8_PROGMEM = {0x00,0x04,0x00,0x0a,0x04,0x11,0x8a,0x08,0x51,0x04,0x22,0x02,0x04,0x01,0x88,0x00,0x50,0x00,0x20,0x00}; + static const unsigned char image_network_1_bar_bits[] U8X8_PROGMEM = {0x00,0x70,0x00,0x50,0x00,0x50,0x00,0x50,0x00,0x57,0x00,0x55,0x00,0x55,0x00,0x55,0x70,0x55,0x50,0x55,0x50,0x55,0x50,0x55,0x57,0x55,0x57,0x55,0x77,0x77,0x00,0x00}; + static const unsigned char image_network_2_bars_bits[] U8X8_PROGMEM = {0x00,0x70,0x00,0x50,0x00,0x50,0x00,0x50,0x00,0x57,0x00,0x55,0x00,0x55,0x00,0x55,0x70,0x55,0x70,0x55,0x70,0x55,0x70,0x55,0x77,0x55,0x77,0x55,0x77,0x77,0x00,0x00}; + static const unsigned char image_network_3_bars_bits[] U8X8_PROGMEM = {0x00,0x70,0x00,0x50,0x00,0x50,0x00,0x50,0x00,0x57,0x00,0x57,0x00,0x57,0x00,0x57,0x70,0x57,0x70,0x57,0x70,0x57,0x70,0x57,0x77,0x57,0x77,0x57,0x77,0x77,0x00,0x00}; + static const unsigned char image_network_4_bars_bits[] U8X8_PROGMEM = {0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x77,0x00,0x77,0x00,0x77,0x00,0x77,0x70,0x77,0x70,0x77,0x70,0x77,0x70,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x00,0x00}; + static const unsigned char image_duco_logo_bits[] U8X8_PROGMEM = {0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0xff,0x00,0xc0,0x01,0x9f,0x01,0x20,0x01,0x20,0x01,0x20,0x01,0x9f,0x01,0xc0,0x01,0xff,0x00,0x7f,0x00}; + static const unsigned char image_duco_logo_big_bits[] U8X8_PROGMEM = {0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0x01,0x00,0x00,0xfc,0xff,0xff,0x0f,0x00,0x00,0xfc,0xff,0xff,0x3f,0x00,0x00,0xfc,0xff,0xff,0x7f,0x00,0x00,0xfc,0xff,0xff,0xff,0x00,0x00,0xfc,0xff,0xff,0xff,0x01,0x00,0xfc,0xff,0xff,0xff,0x03,0x00,0xf8,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0xfe,0x0f,0x00,0xfc,0xff,0x03,0xf8,0x0f,0x00,0xfc,0xff,0x0f,0xf0,0x1f,0x00,0xfc,0xff,0x1f,0xe0,0x1f,0x00,0xfc,0xff,0x3f,0xe0,0x3f,0x00,0xfc,0xff,0x7f,0xc0,0x3f,0x00,0xfc,0xff,0xff,0xc0,0x7f,0x00,0xf8,0xff,0xff,0x80,0x7f,0x00,0x00,0x00,0xfe,0x80,0x7f,0x00,0x00,0x00,0xfc,0x81,0x7f,0x00,0x00,0x00,0xfc,0x01,0x7f,0x00,0x00,0x00,0xfc,0x01,0xff,0x00,0x00,0x00,0xfc,0x01,0xff,0x00,0x00,0x00,0xfc,0x01,0xff,0x00,0x00,0x00,0xfc,0x01,0xff,0x00,0x00,0x00,0xfc,0x01,0xff,0x00,0x00,0x00,0xfc,0x81,0x7f,0x00,0x00,0x00,0xfe,0x81,0x7f,0x00,0x00,0x80,0xff,0x80,0x7f,0x00,0xfc,0xff,0xff,0xc0,0x7f,0x00,0xfc,0xff,0xff,0xc0,0x7f,0x00,0xfc,0xff,0x7f,0xe0,0x3f,0x00,0xfc,0xff,0x3f,0xf0,0x3f,0x00,0xfc,0xff,0x1f,0xf8,0x1f,0x00,0xfc,0xff,0x0f,0xfc,0x1f,0x00,0xf8,0xff,0x01,0xfe,0x0f,0x00,0x00,0x00,0xc0,0xff,0x0f,0x00,0xfc,0xff,0xff,0xff,0x07,0x00,0xfc,0xff,0xff,0xff,0x03,0x00,0xfc,0xff,0xff,0xff,0x01,0x00,0xfc,0xff,0xff,0xff,0x00,0x00,0xfc,0xff,0xff,0x7f,0x00,0x00,0xfc,0xff,0xff,0x1f,0x00,0x00,0xfc,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; +#endif + +#if defined(DISPLAY_16X2) + static byte duco_logo[] = {0x1E, 0x01, 0x1D, 0x05, 0x1D, 0x01, 0x1E, 0x00}; + static byte check_mark[] = {0x00, 0x00, 0x00, 0x01, 0x02,0x14, 0x08, 0x00}; + static byte kh[] = {0x08, 0x0A, 0x0C, 0x0A, 0x00, 0x0A, 0x0E, 0x0A}; + static byte msec[] = {0x0A, 0x15, 0x11, 0x06, 0x08, 0x04, 0x02, 0x0C}; +#endif + + #if defined(DISPLAY_SSD1306) + void drawStrMultiline(const char *msg, int xloc, int yloc) { + //https://github.com/olikraus/u8g2/discussions/1479 + int dspwidth = u8g2.getDisplayWidth(); + int strwidth = 0; + char glyph[2]; glyph[1] = 0; + + for (const char *ptr = msg, *lastblank = NULL; *ptr; ++ptr) { + while (xloc == 0 && *msg == ' ') + if (ptr == msg++) ++ptr; + + glyph[0] = *ptr; + strwidth += u8g2.getStrWidth(glyph); + if (*ptr == ' ') lastblank = ptr; + else ++strwidth; + + if (xloc + strwidth > dspwidth) { + int starting_xloc = xloc; + while (msg < (lastblank ? lastblank : ptr)) { + glyph[0] = *msg++; + xloc += u8g2.drawStr(xloc, yloc, glyph); + } + + strwidth -= xloc - starting_xloc; + yloc += u8g2.getMaxCharHeight(); + xloc = 0; lastblank = NULL; + } + } + while (*msg) { + glyph[0] = *msg++; + xloc += u8g2.drawStr(xloc, yloc, glyph); + } + } +#endif + +#if defined(DISPLAY_SSD1306) || defined(DISPLAY_16X2) + void screen_setup() { + // Ran during setup() + // Abstraction layer: screen initialization + + #if defined(DISPLAY_SSD1306) + u8g2.begin(); + u8g2.clearBuffer(); + u8g2.setFontMode(1); + u8g2.setBitmapMode(1); + u8g2.sendBuffer(); + #endif + + #if defined(DISPLAY_16X2) + lcd.begin(16, 2); + lcd.createChar(0, duco_logo); + lcd.createChar(1, check_mark); + lcd.createChar(2, kh); + lcd.createChar(3, msec); + lcd.home(); + lcd.clear(); + #endif + } + + + void display_boot() { + // Abstraction layer: compilation time, features, etc. + + #if defined(DISPLAY_16X2) + lcd.clear(); + #if defined(ESP8266) + lcd.print("ESP8266 "); + #elif defined(CONFIG_FREERTOS_UNICORE) + lcd.print("ESP32S2 "); + #else + lcd.print("ESP32 "); + #endif + #if defined(ESP8266) + lcd.print(String(ESP.getCpuFreqMHz()).c_str()); + #else + lcd.print(String(getCpuFrequencyMhz()).c_str()); + #endif + lcd.print(" MHz"); + + lcd.setCursor(0, 1); + lcd.print(__DATE__); + #endif + + #if defined(DISPLAY_SSD1306) + u8g2.clearBuffer(); + + u8g2.setFont(u8g2_font_profont15_tr); + u8g2.setCursor(2, 13); + #if defined(ESP8266) + u8g2.print("ESP8266 "); + #elif defined(CONFIG_FREERTOS_UNICORE) + u8g2.print("ESP32S2/C3 "); + #else + u8g2.print("ESP32 "); + #endif + + #if defined(ESP8266) + u8g2.print(String(ESP.getCpuFreqMHz()).c_str()); + #else + u8g2.print(String(getCpuFrequencyMhz()).c_str()); + #endif + u8g2.print(" MHz"); + + u8g2.setFont(u8g2_font_profont10_tr); + u8g2.drawLine(1, 27, 126, 27); + u8g2.setCursor(2, 24); + u8g2.print("Compiled "); + u8g2.print(__DATE__); + + + u8g2.drawStr(2, 37, "Features:"); + u8g2.setCursor(2, 46); + String features_str = "OTA "; + #if defined(USE_LAN) + features_str += "LAN "; + #endif + #if defined(LED_BLINKING) + features_str += "Blink "; + #endif + #if defined(SERIAL_PRINTING) + features_str += "Serial "; + #endif + #if defined(WEB_DASHBOARD) + features_str += "Webserver "; + #endif + #if defined(DISPLAY_16X2) + features_str += "LCD16X2 "; + #endif + #if defined(DISPLAY_SSD1306) + features_str += "SSD1306 "; + #endif + #if defined(USE_INTERNAL_SENSOR) + features_str += "Int. sensor "; + #endif + #if defined(USE_DS18B20) + features_str += "DS18B20 "; + #endif + #if defined(USE_DHT) + features_str += "DHT "; + #endif + #if defined(USE_HSU07M) + features_str += "HSU07M "; + #endif + drawStrMultiline(features_str.c_str(), 2, 46); + u8g2.sendBuffer(); + #endif + } + + void display_info(String message) { + // Abstraction layer: info screens (setups) + + #if defined(DISPLAY_SSD1306) + u8g2.clearBuffer(); + u8g2.drawXBMP(-1, 3, 41, 45, image_duco_logo_big_bits); + u8g2.setFont(u8g2_font_t0_16b_tr); + #if defined(ESP8266) + u8g2.drawStr(42, 27, "ESP8266"); + #elif defined(CONFIG_FREERTOS_UNICORE) + u8g2.drawStr(42, 27, "ESP32S2/C3"); + #else + u8g2.drawStr(42, 27, "ESP32"); + #endif + u8g2.setFont(u8g2_font_t0_13b_tr); + u8g2.drawStr(41, 14, "Duino-Coin"); + u8g2.setFont(u8g2_font_6x10_tr); + u8g2.drawStr(98, 36, "MINER"); + u8g2.setFont(u8g2_font_6x13_tr); + u8g2.drawStr(1, 60, message.c_str()); + u8g2.setFont(u8g2_font_5x8_tr); + u8g2.drawStr(42, 46, "www.duinocoin.com"); + u8g2.setFont(u8g2_font_4x6_tr); + u8g2.drawStr(116, 14, String(SOFTWARE_VERSION).c_str()); + u8g2.sendBuffer(); + #endif + + #if defined(DISPLAY_16X2) + lcd.clear(); + lcd.setCursor(0, 0); + lcd.write(0); + lcd.print(" Duino-Coin "); + lcd.print(SOFTWARE_VERSION); + lcd.setCursor(0, 1); + lcd.print(message); + #endif + } + + + void display_mining_results(String hashrate, String accepted_shares, String total_shares, String uptime, String node, + String difficulty, String sharerate, String ping, String accept_rate) { + // Ran after each found share + // Abstraction layer: displaying mining results + Serial.println("Displaying mining results"); + + #if defined(DISPLAY_SSD1306) + u8g2.clearBuffer(); + u8g2.setFont(u8g2_font_profont10_tr); + u8g2.drawStr(67, 26, "kH"); + if (hashrate.toFloat() < 100.0) { + u8g2.setFont(u8g2_font_profont29_tr); + u8g2.drawStr(2, 36, hashrate.c_str()); + } else { + u8g2.setFont(u8g2_font_profont22_tr); + u8g2.drawStr(3, 35, hashrate.c_str()); + } + + u8g2.setFont(u8g2_font_haxrcorp4089_tr); + u8g2.drawStr(52, 12, node.c_str()); + + u8g2.setFont(u8g2_font_t0_11_tr); + u8g2.drawStr(17, 47, (accepted_shares + "/" + total_shares).c_str()); + u8g2.setFont(u8g2_font_5x7_tr); + u8g2.drawStr(88, 47, ("(" + accept_rate + "%)").c_str()); + + u8g2.setFont(u8g2_font_profont12_tr); + u8g2.drawStr(20, 12, (ping + "ms").c_str()); + u8g2.drawStr(69, 36, "s"); + + u8g2.setFont(u8g2_font_6x13_tr); + u8g2.drawStr(125-u8g2.getStrWidth(uptime.c_str()), 61, uptime.c_str()); + + u8g2.drawStr(85, 38, sharerate.c_str()); + u8g2.drawStr(85, 27, difficulty.c_str()); + u8g2.drawLine(67, 28, 75, 28); + + u8g2.drawXBMP(2, 38, 13, 10, image_check_contour_bits); + + if (WiFi.RSSI() > -40) { + u8g2.drawXBMP(1, 0, 15, 16, image_network_4_bars_bits); + } else if (WiFi.RSSI() > -60) { + u8g2.drawXBMP(1, 0, 15, 16, image_network_3_bars_bits); + } else if (WiFi.RSSI() > -75) { + u8g2.drawXBMP(1, 0, 15, 16, image_network_2_bars_bits); + } else { + u8g2.drawXBMP(1, 0, 15, 16, image_network_1_bar_bits); + } + + u8g2.setFont(u8g2_font_4x6_tr); + u8g2.drawStr(14, 61, String(WiFi.localIP().toString()).c_str()); + u8g2.drawStr(14, 55, ("Duino-Coin " + String(SOFTWARE_VERSION)).c_str()); + u8g2.drawXBMP(2, 11, 9, 50, image_duco_logo_bits); + u8g2.drawStr(111, 27, "diff"); + u8g2.drawStr(107, 38, "shr/s"); + + u8g2.sendBuffer(); + #endif + + #if defined(DISPLAY_16X2) + lcd.clear(); + lcd.setCursor(0,0); + lcd.print(hashrate); + lcd.setCursor(4,0); + lcd.write(2); // kh + + lcd.setCursor(7, 0); + lcd.print(difficulty); + lcd.print(" diff"); + + lcd.setCursor(0, 1); + lcd.write(1); // checkmark + lcd.print(accepted_shares); + + lcd.setCursor(7, 1); + lcd.print(ping); + lcd.write(3); // ms + + lcd.setCursor(12, 1); + lcd.print(sharerate); + lcd.print("s"); + #endif + } +#endif + +#endif diff --git a/ESP_Code/ESP_Code.ino b/ESP_Code/ESP_Code.ino new file mode 100644 index 00000000..c5161a84 --- /dev/null +++ b/ESP_Code/ESP_Code.ino @@ -0,0 +1,818 @@ +/* + ____ __ __ ____ _ _ _____ ___ _____ ____ _ _ + ( _ \( )( )(_ _)( \( )( _ )___ / __)( _ )(_ _)( \( ) + )(_) ))(__)( _)(_ ) ( )(_)((___)( (__ )(_)( _)(_ ) ( + (____/(______)(____)(_)\_)(_____) \___)(_____)(____)(_)\_) + Official code for all ESP8266/32 boards version 4.3 + Main .ino file + + The Duino-Coin Team & Community 2019-2024 © MIT Licensed + https://duinocoin.com + https://github.com/revoxhere/duino-coin + + If you don't know where to start, visit official website and navigate to + the Getting Started page. Have fun mining! + + To edit the variables (username, WiFi settings, etc.) use the Settings.h tab! +*/ + +/* If optimizations cause problems, change them to -O0 (the default) */ +#pragma GCC optimize("-Ofast") + +/* If during compilation the line below causes a + "fatal error: arduinoJson.h: No such file or directory" + message to occur; it means that you do NOT have the + ArduinoJSON library installed. To install it, + go to the below link and follow the instructions: + https://github.com/revoxhere/duino-coin/issues/832 */ +#include + +#if defined(ESP8266) + #include + #include + #include + #include +#else + #include + #include + #include + #include + #include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include "MiningJob.h" +#include "Settings.h" + +#ifdef USE_LAN + #include +#endif + +#if defined(WEB_DASHBOARD) + #include "Dashboard.h" +#endif + +#if defined(DISPLAY_SSD1306) || defined(DISPLAY_16X2) + #include "DisplayHal.h" +#endif + +#if !defined(ESP8266) && defined(DISABLE_BROWNOUT) + #include "soc/soc.h" + #include "soc/rtc_cntl_reg.h" +#endif + +// Auto adjust physical core count +// (ESP32-S2/C3 have 1 core, ESP32 has 2 cores, ESP8266 has 1 core) +#if defined(ESP8266) + #define CORE 1 + typedef ESP8266WebServer WebServer; +#elif defined(CONFIG_FREERTOS_UNICORE) + #define CORE 1 +#else + #define CORE 2 + // Install TridentTD_EasyFreeRTOS32 if you get an error + #include + + void Task1Code( void * parameter ); + void Task2Code( void * parameter ); + TaskHandle_t Task1; + TaskHandle_t Task2; +#endif + +#if defined(WEB_DASHBOARD) + WebServer server(80); +#endif + +#if defined(CAPTIVE_PORTAL) + #include // This needs to be first, or it all crashes and burns... + #include + #include + char duco_username[40]; + char duco_password[40]; + char duco_rigid[24]; + WiFiManager wifiManager; + Preferences preferences; + WiFiManagerParameter custom_duco_username("duco_usr", "Duino-Coin username", duco_username, 40); + WiFiManagerParameter custom_duco_password("duco_pwd", "Duino-Coin mining key (if enabled in the wallet)", duco_password, 40); + WiFiManagerParameter custom_duco_rigid("duco_rig", "Custom miner identifier (optional)", duco_rigid, 24); + + void saveConfigCallback() { + preferences.begin("duino_config", false); + preferences.putString("duco_username", custom_duco_username.getValue()); + preferences.putString("duco_password", custom_duco_password.getValue()); + preferences.putString("duco_rigid", custom_duco_rigid.getValue()); + preferences.end(); + RestartESP("Settings saved"); + } + + void reset_settings() { + server.send(200, "text/html", "Settings have been erased. Please redo the configuration by connecting to the WiFi network that will be created"); + delay(500); + wifiManager.resetSettings(); + RestartESP("Manual settings reset"); + } + + void saveParamCallback(){ + Serial.println("[CALLBACK] saveParamCallback fired"); + Serial.println("PARAM customfieldid = " + getParam("customfieldid")); + } + + String getParam(String name){ + //read parameter from server, for customhmtl input + String value; + if(wifiManager.server->hasArg(name)) { + value = wifiManager.server->arg(name); + } + return value; + } +#endif + +void RestartESP(String msg) { + #if defined(SERIAL_PRINTING) + Serial.println(msg); + Serial.println("Restarting ESP..."); + #endif + + #if defined(DISPLAY_SSD1306) || defined(DISPLAY_16X2) + display_info("Restarting ESP..."); + #endif + + #if defined(ESP8266) + ESP.reset(); + #else + ESP.restart(); + abort(); + #endif +} + +#if defined(BLUSHYBOX) + Ticker blinker; + bool lastLedState = false; + void changeState() { + analogWrite(LED_BUILTIN, lastLedState ? 255 : 0); + lastLedState = !lastLedState; + } +#endif + +#if defined(ESP8266) + // WDT Loop + // See lwdtcb() and lwdtFeed() below + Ticker lwdTimer; + + unsigned long lwdCurrentMillis = 0; + unsigned long lwdTimeOutMillis = LWD_TIMEOUT; + + void ICACHE_RAM_ATTR lwdtcb(void) { + if ((millis() - lwdCurrentMillis > LWD_TIMEOUT) || (lwdTimeOutMillis - lwdCurrentMillis != LWD_TIMEOUT)) + RestartESP("Loop WDT Failed!"); + } + + void lwdtFeed(void) { + lwdCurrentMillis = millis(); + lwdTimeOutMillis = lwdCurrentMillis + LWD_TIMEOUT; + } +#else + void lwdtFeed(void) { + Serial.println("lwdtFeed()"); + } +#endif + +namespace { + MiningConfig *configuration = new MiningConfig( + DUCO_USER, + RIG_IDENTIFIER, + MINER_KEY + ); + + #if defined(ESP32) && CORE == 2 + EasyMutex mutexClientData, mutexConnectToServer; + #endif + + #ifdef USE_LAN + static bool eth_connected = false; + #endif + + void UpdateHostPort(String input) { + // Thanks @ricaun for the code + DynamicJsonDocument doc(256); + deserializeJson(doc, input); + const char *name = doc["name"]; + + configuration->host = doc["ip"].as().c_str(); + configuration->port = doc["port"].as(); + node_id = String(name); + + #if defined(SERIAL_PRINTING) + Serial.println("Poolpicker selected the best mining node: " + node_id); + #endif + + #if defined(DISPLAY_SSD1306) || defined(DISPLAY_16X2) + display_info(node_id); + #endif + } + + void VerifyWifi() { + #ifdef USE_LAN + while ((!eth_connected) || (ETH.localIP() == IPAddress(0, 0, 0, 0))) { + #if defined(SERIAL_PRINTING) + Serial.println("Ethernet connection lost. Reconnect..." ); + #endif + SetupWifi(); + } + #else + while (WiFi.status() != WL_CONNECTED + || WiFi.localIP() == IPAddress(0, 0, 0, 0) + || WiFi.localIP() == IPAddress(192, 168, 4, 2) + || WiFi.localIP() == IPAddress(192, 168, 4, 3)) { + #if defined(SERIAL_PRINTING) + Serial.println("WiFi reconnecting..."); + #endif + WiFi.disconnect(); + delay(500); + WiFi.reconnect(); + delay(500); + } + #endif + } + + String httpGetString(String URL) { + String payload = ""; + + WiFiClientSecure client; + HTTPClient https; + client.setInsecure(); + + https.begin(client, URL); + https.addHeader("Accept", "*/*"); + + int httpCode = https.GET(); + #if defined(SERIAL_PRINTING) + Serial.printf("HTTP Response code: %d\n", httpCode); + #endif + + if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) { + payload = https.getString(); + } else { + #if defined(SERIAL_PRINTING) + Serial.printf("Error fetching node from poolpicker: %s\n", https.errorToString(httpCode).c_str()); + VerifyWifi(); + #endif + #if defined(DISPLAY_SSD1306) || defined(DISPLAY_16X2) + display_info(https.errorToString(httpCode)); + #endif + } + https.end(); + return payload; + } + + void SelectNode() { + String input = ""; + int waitTime = 1; + int poolIndex = 0; + + while (input == "") { + #if defined(SERIAL_PRINTING) + Serial.println("Fetching mining node from the poolpicker in " + String(waitTime) + "s"); + #endif + delay(waitTime * 1000); + + input = httpGetString("https://server.duinocoin.com/getPool"); + + // Increase wait time till a maximum of 32 seconds + // (addresses: Limit connection requests on failure in ESP boards #1041) + waitTime *= 2; + if (waitTime > 32) + RestartESP("Node fetch unavailable"); + } + + UpdateHostPort(input); + } + + #ifdef USE_LAN + void WiFiEvent(WiFiEvent_t event) { + switch (event) { + case ARDUINO_EVENT_ETH_START: + #if defined(SERIAL_PRINTING) + Serial.println("ETH Started"); + #endif + // The hostname must be set after the interface is started, but needs + // to be set before DHCP, so set it from the event handler thread. + ETH.setHostname("esp32-ethernet"); + break; + case ARDUINO_EVENT_ETH_CONNECTED: + #if defined(SERIAL_PRINTING) + Serial.println("ETH Connected"); + #endif + break; + case ARDUINO_EVENT_ETH_GOT_IP: + #if defined(SERIAL_PRINTING) + Serial.println("ETH Got IP"); + #endif + eth_connected = true; + break; + case ARDUINO_EVENT_ETH_DISCONNECTED: + #if defined(SERIAL_PRINTING) + Serial.println("ETH Disconnected"); + #endif + eth_connected = false; + break; + case ARDUINO_EVENT_ETH_STOP: + #if defined(SERIAL_PRINTING) + Serial.println("ETH Stopped"); + #endif + eth_connected = false; + break; + default: + break; + } + } + #endif + + void SetupWifi() { + #ifdef USE_LAN + #if defined(SERIAL_PRINTING) + Serial.println("Connecting to Ethernet..."); + #endif + WiFi.onEvent(WiFiEvent); // Will call WiFiEvent() from another thread. + ETH.begin(); + + while (!eth_connected) { + delay(500); + #if defined(SERIAL_PRINTING) + Serial.print("."); + #endif + } + + #if defined(SERIAL_PRINTING) + Serial.println("\n\nSuccessfully connected to Ethernet"); + Serial.println("Local IP address: " + ETH.localIP().toString()); + Serial.println("Rig name: " + String(RIG_IDENTIFIER)); + Serial.println(); + #endif + + #else + #if defined(SERIAL_PRINTING) + Serial.println("Connecting to: " + String(SSID)); + #endif + + WiFi.begin(SSID, PASSWORD); + while(WiFi.status() != WL_CONNECTED) { + Serial.print("."); + delay(100); + } + VerifyWifi(); + + #if !defined(ESP8266) + WiFi.config(WiFi.localIP(), WiFi.gatewayIP(), WiFi.subnetMask(), DNS_SERVER); + #endif + + #if defined(SERIAL_PRINTING) + Serial.println("\n\nSuccessfully connected to WiFi"); + Serial.println("Rig name: " + String(RIG_IDENTIFIER)); + Serial.println("Local IP address: " + WiFi.localIP().toString()); + Serial.println("Gateway: " + WiFi.gatewayIP().toString()); + Serial.println("DNS: " + WiFi.dnsIP().toString()); + Serial.println(); + #endif + + #endif + + #if defined(DISPLAY_SSD1306) || defined(DISPLAY_16X2) + display_info("Waiting for node..."); + #endif + SelectNode(); + } + + void SetupOTA() { + // Prepare OTA handler + ArduinoOTA.onStart([]() + { + #if defined(SERIAL_PRINTING) + Serial.println("Start"); + #endif + }); + ArduinoOTA.onEnd([]() + { + #if defined(SERIAL_PRINTING) + Serial.println("\nEnd"); + #endif + }); + ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) + { + #if defined(SERIAL_PRINTING) + Serial.printf("Progress: %u%%\r", (progress / (total / 100))); + #endif + }); + ArduinoOTA.onError([](ota_error_t error) + { + Serial.printf("Error[%u]: ", error); + #if defined(SERIAL_PRINTING) + if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); + else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); + else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); + else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); + else if (error == OTA_END_ERROR) Serial.println("End Failed"); + #endif + }); + + ArduinoOTA.setHostname(RIG_IDENTIFIER); // Give port a name + ArduinoOTA.begin(); + } + + #if defined(WEB_DASHBOARD) + void dashboard() { + #if defined(SERIAL_PRINTING) + Serial.println("Handling HTTP client"); + #endif + String s = WEBSITE; + #ifdef USE_LAN + s.replace("@@IP_ADDR@@", ETH.localIP().toString()); + #else + s.replace("@@IP_ADDR@@", WiFi.localIP().toString()); + #endif + + s.replace("@@HASHRATE@@", String((hashrate+hashrate_core_two) / 1000)); + s.replace("@@DIFF@@", String(difficulty / 100)); + s.replace("@@SHARES@@", String(share_count)); + s.replace("@@NODE@@", String(node_id)); + + #if defined(ESP8266) + s.replace("@@DEVICE@@", "ESP8266"); + #elif defined(CONFIG_FREERTOS_UNICORE) + s.replace("@@DEVICE@@", "ESP32-S2/C3"); + #else + s.replace("@@DEVICE@@", "ESP32"); + #endif + + s.replace("@@ID@@", String(RIG_IDENTIFIER)); + s.replace("@@MEMORY@@", String(ESP.getFreeHeap())); + s.replace("@@VERSION@@", String(SOFTWARE_VERSION)); + + #if defined(CAPTIVE_PORTAL) + s.replace("@@RESET_SETTINGS@@", "• Reset settings"); + #else + s.replace("@@RESET_SETTINGS@@", ""); + #endif + + #if defined(USE_DS18B20) + sensors.requestTemperatures(); + float temp = sensors.getTempCByIndex(0); + s.replace("@@SENSOR@@", "DS18B20: " + String(temp) + "*C"); + #elif defined(USE_DHT) + float temp = dht.readTemperature(); + float hum = dht.readHumidity(); + s.replace("@@SENSOR@@", "DHT11/22: " + String(temp) + "*C, " + String(hum) + "rh%"); + #elif defined(USE_HSU07M) + float temp = read_hsu07m(); + s.replace("@@SENSOR@@", "HSU07M: " + String(temp) + "*C"); + #elif defined(USE_INTERNAL_SENSOR) + float temp = 0; + temp_sensor_read_celsius(&temp); + s.replace("@@SENSOR@@", "CPU: " + String(temp) + "*C"); + #else + s.replace("@@SENSOR@@", "None"); + #endif + + server.send(200, "text/html", s); + } + #endif + +} // End of namespace + +MiningJob *job[CORE]; + +#if CORE == 2 + EasyFreeRTOS32 task1, task2; +#endif + +void task1_func(void *) { + #if defined(ESP32) && CORE == 2 + VOID SETUP() { } + + VOID LOOP() { + job[0]->mine(); + + #if defined(DISPLAY_SSD1306) || defined(DISPLAY_16X2) + float hashrate_float = (hashrate+hashrate_core_two) / 1000.0; + float accept_rate = (accepted_share_count / 0.01 / share_count); + + long millisecs = millis(); + int uptime_secs = int((millisecs / 1000) % 60); + int uptime_mins = int((millisecs / (1000 * 60)) % 60); + int uptime_hours = int((millisecs / (1000 * 60 * 60)) % 24); + String uptime = String(uptime_hours) + "h" + String(uptime_mins) + "m" + String(uptime_secs) + "s"; + + float sharerate = share_count / (millisecs / 1000.0); + + display_mining_results(String(hashrate_float, 1), String(accepted_share_count), String(share_count), String(uptime), + String(node_id), String(difficulty / 100), String(sharerate, 1), + String(ping), String(accept_rate, 1)); + #endif + } + #endif +} + +void task2_func(void *) { + #if defined(ESP32) && CORE == 2 + VOID SETUP() { + job[1] = new MiningJob(1, configuration); + } + + VOID LOOP() { + job[1]->mine(); + + #if defined(DISPLAY_SSD1306) || defined(DISPLAY_16X2) + float hashrate_float = (hashrate+hashrate_core_two) / 1000.0; + float accept_rate = (accepted_share_count / 0.01 / share_count); + + long millisecs = millis(); + int uptime_secs = int((millisecs / 1000) % 60); + int uptime_mins = int((millisecs / (1000 * 60)) % 60); + int uptime_hours = int((millisecs / (1000 * 60 * 60)) % 24); + String uptime = String(uptime_hours) + "h" + String(uptime_mins) + "m" + String(uptime_secs) + "s"; + + float sharerate = share_count / (millisecs / 1000.0); + + display_mining_results(String(hashrate_float, 1), String(accepted_share_count), String(share_count), String(uptime), + String(node_id), String(difficulty / 100), String(sharerate, 1), + String(ping), String(accept_rate, 1)); + #endif + } + #endif +} + +void setup() { + #if !defined(ESP8266) && defined(DISABLE_BROWNOUT) + WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); + #endif + + #if defined(SERIAL_PRINTING) + Serial.begin(SERIAL_BAUDRATE); + Serial.println("\n\nDuino-Coin " + String(configuration->MINER_VER)); + #endif + pinMode(LED_BUILTIN, OUTPUT); + + #if defined(BLUSHYBOX) + analogWrite(LED_BUILTIN, 255); + for (int i = 255; i > 0; i--) { + analogWrite(LED_BUILTIN, i); + delay(1); + } + pinMode(GAUGE_PIN, OUTPUT); + + // Gauge up and down effect on startup + for (int i = GAUGE_MIN; i < GAUGE_MAX; i++) { + analogWrite(GAUGE_PIN, i); + delay(10); + } + for (int i = GAUGE_MAX; i > GAUGE_MIN; i--) { + analogWrite(GAUGE_PIN, i); + delay(10); + } + #endif + + #if defined(DISPLAY_SSD1306) || defined(DISPLAY_16X2) + screen_setup(); + display_boot(); + delay(2500); + #endif + + assert(CORE == 1 || CORE == 2); + WALLET_ID = String(random(0, 2811)); // Needed for miner grouping in the wallet + job[0] = new MiningJob(0, configuration); + + #if defined(USE_DHT) + #if defined(SERIAL_PRINTING) + Serial.println("Initializing DHT sensor (Duino IoT)"); + #endif + dht.begin(); + #if defined(SERIAL_PRINTING) + Serial.println("Test reading: " + String(dht.readHumidity()) + "% humidity"); + Serial.println("Test reading: temperature " + String(dht.readTemperature()) + "°C"); + #endif + #endif + + #if defined(USE_DS18B20) + #if defined(SERIAL_PRINTING) + Serial.println("Initializing DS18B20 sensor (Duino IoT)"); + #endif + sensors.begin(); + sensors.requestTemperatures(); + #if defined(SERIAL_PRINTING) + Serial.println("Test reading: " + String(sensors.getTempCByIndex(0)) + "°C"); + #endif + #endif + + #if defined(USE_HSU07M) + #if defined(SERIAL_PRINTING) + Serial.println("Initializing HSU07M sensor (Duino IoT)"); + Serial.println("Test reading: " + String(read_hsu07m()) + "°C"); + #endif + #endif + + #if defined(USE_INTERNAL_SENSOR) + #if defined(SERIAL_PRINTING) + Serial.println("Initializing internal ESP32 temperature sensor (Duino IoT)"); + #endif + temp_sensor_config_t temp_sensor = TSENS_CONFIG_DEFAULT(); + temp_sensor.dac_offset = TSENS_DAC_L2; + temp_sensor_set_config(temp_sensor); + temp_sensor_start(); + float result = 0; + temp_sensor_read_celsius(&result); + #if defined(SERIAL_PRINTING) + Serial.println("Test reading: " + String(result) + "°C"); + #endif + #endif + + WiFi.mode(WIFI_STA); // Setup ESP in client mode + //WiFi.disconnect(true); + #if defined(ESP8266) + WiFi.setSleepMode(WIFI_NONE_SLEEP); + #else + WiFi.setSleep(false); + #endif + + #if defined(CAPTIVE_PORTAL) + preferences.begin("duino_config", false); + strcpy(duco_username, preferences.getString("duco_username", "username").c_str()); + strcpy(duco_password, preferences.getString("duco_password", "None").c_str()); + strcpy(duco_rigid, preferences.getString("duco_rigid", "None").c_str()); + preferences.end(); + configuration->DUCO_USER = duco_username; + configuration->RIG_IDENTIFIER = duco_rigid; + configuration->MINER_KEY = duco_password; + RIG_IDENTIFIER = duco_rigid; + + String captivePortalHTML = R"( + Duino BlushyBox + + )"; + + wifiManager.setCustomHeadElement(captivePortalHTML.c_str()); + + wifiManager.setSaveConfigCallback(saveConfigCallback); + wifiManager.addParameter(&custom_duco_username); + wifiManager.addParameter(&custom_duco_password); + wifiManager.addParameter(&custom_duco_rigid); + + #if defined(BLUSHYBOX) + blinker.attach_ms(200, changeState); + #endif + wifiManager.autoConnect("Duino-Coin"); + delay(1000); + VerifyWifi(); + #if defined(BLUSHYBOX) + blinker.detach(); + #endif + + #if defined(DISPLAY_SSD1306) || defined(DISPLAY_16X2) + display_info("Waiting for node..."); + #endif + #if defined(BLUSHYBOX) + blinker.attach_ms(500, changeState); + #endif + SelectNode(); + #if defined(BLUSHYBOX) + blinker.detach(); + #endif + #else + #if defined(DISPLAY_SSD1306) || defined(DISPLAY_16X2) + display_info("Waiting for WiFi..."); + #endif + SetupWifi(); + #endif + SetupOTA(); + + #if defined(WEB_DASHBOARD) + if (!MDNS.begin(RIG_IDENTIFIER)) { + #if defined(SERIAL_PRINTING) + Serial.println("mDNS unavailable"); + #endif + } + MDNS.addService("http", "tcp", 80); + #if defined(SERIAL_PRINTING) + #ifdef USE_LAN + Serial.println("Configured mDNS for dashboard on http://" + String(RIG_IDENTIFIER) + + ".local (or http://" + ETH.localIP().toString() + ")"); + #else + Serial.println("Configured mDNS for dashboard on http://" + String(RIG_IDENTIFIER) + + ".local (or http://" + WiFi.localIP().toString() + ")"); + #endif + #endif + + server.on("/", dashboard); + #if defined(CAPTIVE_PORTAL) + server.on("/reset", reset_settings); + #endif + server.begin(); + #endif + + #if defined(ESP8266) + // Start the WDT watchdog + lwdtFeed(); + lwdTimer.attach_ms(LWD_TIMEOUT, lwdtcb); + #endif + + #if defined(ESP8266) + // Fastest clock mode for 8266s + system_update_cpu_freq(160); + os_update_cpu_frequency(160); + // Feed the watchdog + lwdtFeed(); + #else + // Fastest clock mode for 32s + setCpuFrequencyMhz(240); + #endif + + job[0]->blink(BLINK_SETUP_COMPLETE); + + #if defined(ESP32) && CORE == 2 + mutexClientData = xSemaphoreCreateMutex(); + mutexConnectToServer = xSemaphoreCreateMutex(); + + xTaskCreatePinnedToCore(system_events_func, "system_events_func", 10000, NULL, 1, NULL, 0); + xTaskCreatePinnedToCore(task1_func, "task1_func", 10000, NULL, 1, &Task1, 0); + xTaskCreatePinnedToCore(task2_func, "task2_func", 10000, NULL, 1, &Task2, 1); + #endif +} + +void system_events_func(void* parameter) { + while (true) { + delay(10); + #if defined(WEB_DASHBOARD) + server.handleClient(); + #endif + ArduinoOTA.handle(); + } +} + +void single_core_loop() { + job[0]->mine(); + + lwdtFeed(); + + #if defined(DISPLAY_SSD1306) || defined(DISPLAY_16X2) + float hashrate_float = (hashrate+hashrate_core_two) / 1000.0; + float accept_rate = (accepted_share_count / 0.01 / share_count); + + long millisecs = millis(); + int uptime_secs = int((millisecs / 1000) % 60); + int uptime_mins = int((millisecs / (1000 * 60)) % 60); + int uptime_hours = int((millisecs / (1000 * 60 * 60)) % 24); + String uptime = String(uptime_hours) + "h" + String(uptime_mins) + "m" + String(uptime_secs) + "s"; + + float sharerate = share_count / (millisecs / 1000.0); + + display_mining_results(String(hashrate_float, 1), String(accepted_share_count), String(share_count), String(uptime), + String(node_id), String(difficulty / 100), String(sharerate, 1), + String(ping), String(accept_rate, 1)); + #endif + + VerifyWifi(); + ArduinoOTA.handle(); + #if defined(WEB_DASHBOARD) + server.handleClient(); + #endif +} + +void loop() { + #if defined(ESP8266) || defined(CONFIG_FREERTOS_UNICORE) + single_core_loop(); + #endif + delay(10); +} diff --git a/ESP_Code/MiningJob.h b/ESP_Code/MiningJob.h new file mode 100644 index 00000000..be205211 --- /dev/null +++ b/ESP_Code/MiningJob.h @@ -0,0 +1,432 @@ +#pragma GCC optimize("-Ofast") + +#ifndef MINING_JOB_H +#define MINING_JOB_H + +#include +#include +#include +#include +#include + +#include "DSHA1.h" +#include "Counter.h" +#include "Settings.h" + +// https://github.com/esp8266/Arduino/blob/master/cores/esp8266/TypeConversion.cpp +const char base36Chars[36] PROGMEM = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' +}; + +const uint8_t base36CharValues[75] PROGMEM{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, // 0 to 9 + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 0, 0, 0, 0, 0, 0, // Upper case letters + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35 // Lower case letters +}; + +#define SPC_TOKEN ' ' +#define END_TOKEN '\n' +#define SEP_TOKEN ',' +#define IOT_TOKEN '@' + +struct MiningConfig { + String host = ""; + int port = 0; + String DUCO_USER = ""; + String RIG_IDENTIFIER = ""; + String MINER_KEY = ""; + String MINER_VER = SOFTWARE_VERSION; + #if defined(ESP8266) + // "High-band" 8266 diff + String START_DIFF = "ESP8266H"; + #elif defined(CONFIG_FREERTOS_UNICORE) + // Single core 32 diff + String START_DIFF = "ESP32S"; + #else + // Normal 32 diff + String START_DIFF = "ESP32"; + #endif + + MiningConfig(String DUCO_USER, String RIG_IDENTIFIER, String MINER_KEY) + : DUCO_USER(DUCO_USER), RIG_IDENTIFIER(RIG_IDENTIFIER), MINER_KEY(MINER_KEY) {} +}; + +class MiningJob { + +public: + MiningConfig *config; + int core = 0; + + MiningJob(int core, MiningConfig *config) { + this->core = core; + this->config = config; + this->client_buffer = ""; + dsha1 = new DSHA1(); + dsha1->warmup(); + generateRigIdentifier(); + } + + void blink(uint8_t count, uint8_t pin = LED_BUILTIN) { + #if defined(LED_BLINKING) + uint8_t state = HIGH; + + for (int x = 0; x < (count << 1); ++x) { + digitalWrite(pin, state ^= HIGH); + delay(50); + } + #else + digitalWrite(LED_BUILTIN, HIGH); + #endif + } + + bool max_micros_elapsed(unsigned long current, unsigned long max_elapsed) { + static unsigned long _start = 0; + + if ((current - _start) > max_elapsed) { + _start = current; + return true; + } + return false; + } + + void handleSystemEvents(void) { + #if defined(ESP32) && CORE == 2 + esp_task_wdt_reset(); + #endif + delay(10); // Required vTaskDelay by ESP-IDF + yield(); + ArduinoOTA.handle(); + } + + void mine() { + connectToNode(); + askForJob(); + + dsha1->reset().write((const unsigned char *)getLastBlockHash().c_str(), getLastBlockHash().length()); + + int start_time = micros(); + max_micros_elapsed(start_time, 0); + #if defined(LED_BLINKING) + #if defined(BLUSHYBOX) + for (int i = 0; i < 72; i++) { + analogWrite(LED_BUILTIN, i); + delay(1); + } + #else + digitalWrite(LED_BUILTIN, LOW); + #endif + #endif + for (Counter<10> counter; counter < difficulty; ++counter) { + DSHA1 ctx = *dsha1; + ctx.write((const unsigned char *)counter.c_str(), counter.strlen()).finalize(hashArray); + + #ifndef CONFIG_FREERTOS_UNICORE + #if defined(ESP32) + #define SYSTEM_TIMEOUT 100000 // 10ms for esp32 looks like the lowest value without false watchdog triggers + #else + #define SYSTEM_TIMEOUT 500000 // 50ms for 8266 for same reason as above + #endif + if (max_micros_elapsed(micros(), SYSTEM_TIMEOUT)) { + handleSystemEvents(); + } + #endif + + if (memcmp(getExpectedHash(), hashArray, 20) == 0) { + unsigned long elapsed_time = micros() - start_time; + float elapsed_time_s = elapsed_time * .000001f; + share_count++; + + #if defined(LED_BLINKING) + #if defined(BLUSHYBOX) + for (int i = 72; i > 0; i--) { + analogWrite(LED_BUILTIN, i); + delay(1); + } + #else + digitalWrite(LED_BUILTIN, HIGH); + #endif + #endif + + if (String(core) == "0") { + hashrate = counter / elapsed_time_s; + submit(counter, hashrate, elapsed_time_s); + } else { + hashrate_core_two = counter / elapsed_time_s; + submit(counter, hashrate_core_two, elapsed_time_s); + } + + #if defined(BLUSHYBOX) + gauge_set(hashrate + hashrate_core_two); + #endif + + break; + } + } + } + +private: + String client_buffer; + uint8_t hashArray[20]; + String last_block_hash; + String expected_hash_str; + uint8_t expected_hash[20]; + DSHA1 *dsha1; + WiFiClient client; + String chipID = ""; + + #if defined(ESP8266) + #if defined(BLUSHYBOX) + String MINER_BANNER = "Official BlushyBox Miner (ESP8266)"; + #else + String MINER_BANNER = "Official ESP8266 Miner"; + #endif + #elif defined(CONFIG_FREERTOS_UNICORE) + String MINER_BANNER = "Official ESP32-S2 Miner"; + #else + #if defined(BLUSHYBOX) + String MINER_BANNER = "Official BlushyBox Miner (ESP32)"; + #else + String MINER_BANNER = "Official ESP32 Miner"; + #endif + #endif + + uint8_t *hexStringToUint8Array(const String &hexString, uint8_t *uint8Array, const uint32_t arrayLength) { + assert(hexString.length() >= arrayLength * 2); + const char *hexChars = hexString.c_str(); + for (uint32_t i = 0; i < arrayLength; ++i) { + uint8Array[i] = (pgm_read_byte(base36CharValues + hexChars[i * 2] - '0') << 4) + pgm_read_byte(base36CharValues + hexChars[i * 2 + 1] - '0'); + } + return uint8Array; + } + + void generateRigIdentifier() { + String AutoRigName = ""; + + #if defined(ESP8266) + chipID = String(ESP.getChipId(), HEX); + + if (strcmp(config->RIG_IDENTIFIER.c_str(), "Auto") != 0) + return; + + AutoRigName = "ESP8266-" + chipID; + AutoRigName.toUpperCase(); + config->RIG_IDENTIFIER = AutoRigName.c_str(); + #else + uint64_t chip_id = ESP.getEfuseMac(); + uint16_t chip = (uint16_t)(chip_id >> 32); // Prepare to print a 64 bit value into a char array + char fullChip[23]; + snprintf(fullChip, 23, "%04X%08X", chip, + (uint32_t)chip_id); // Store the (actually) 48 bit chip_id into a char array + + chipID = String(fullChip); + + if (strcmp(config->RIG_IDENTIFIER.c_str(), "Auto") != 0) + return; + // Autogenerate ID if required + AutoRigName = "ESP32-" + String(fullChip); + AutoRigName.toUpperCase(); + config->RIG_IDENTIFIER = AutoRigName.c_str(); + #endif + #if defined(SERIAL_PRINTING) + Serial.println("Core [" + String(core) + "] - Rig identifier: " + + config->RIG_IDENTIFIER); + #endif + } + + void connectToNode() { + if (client.connected()) return; + + unsigned int stopWatch = millis(); + #if defined(SERIAL_PRINTING) + Serial.println("Core [" + String(core) + "] - Connecting to a Duino-Coin node..."); + #endif + while (!client.connect(config->host.c_str(), config->port)) { + if (max_micros_elapsed(micros(), 100000)) { + handleSystemEvents(); + } + if (millis()-stopWatch>100000) ESP.restart(); + } + + waitForClientData(); + #if defined(SERIAL_PRINTING) + Serial.println("Core [" + String(core) + "] - Connected. Node reported version: " + + client_buffer); + #endif + + blink(BLINK_CLIENT_CONNECT); + + /* client.print("MOTD" + END_TOKEN); + waitForClientData(); + #if defined(SERIAL_PRINTING) + Serial.println("Core [" + String(core) + "] - MOTD: " + + client_buffer); + #endif */ + } + + void waitForClientData() { + client_buffer = ""; + unsigned int stopWatch = millis(); + while (client.connected()) { + if (client.available()) { + client_buffer = client.readStringUntil(END_TOKEN); + if (client_buffer.length() == 1 && client_buffer[0] == END_TOKEN) + client_buffer = "???\n"; // NOTE: Should never happen + break; + } + if (max_micros_elapsed(micros(), 100000)) { + handleSystemEvents(); + } + if (millis()-stopWatch>120000) { + Serial.println("Timeout after 120s. Forced restart.."); + ESP.restart(); + } + } + } + + void submit(unsigned long counter, float hashrate, float elapsed_time_s) { + client.print(String(counter) + + SEP_TOKEN + String(hashrate) + + SEP_TOKEN + MINER_BANNER + + SPC_TOKEN + config->MINER_VER + + SEP_TOKEN + config->RIG_IDENTIFIER + + SEP_TOKEN + "DUCOID" + String(chipID) + + SEP_TOKEN + String(WALLET_ID) + + END_TOKEN); + + unsigned long ping_start = millis(); + waitForClientData(); + ping = millis() - ping_start; + + if (client_buffer == "GOOD") { + accepted_share_count++; + } + + #if defined(SERIAL_PRINTING) + Serial.println("Core [" + String(core) + "] - " + + client_buffer + + " share #" + String(share_count) + + " (" + String(counter) + ")" + + " hashrate: " + String(hashrate / 1000, 2) + " kH/s (" + + String(elapsed_time_s) + "s) " + + "Ping: " + String(ping) + "ms " + + "(" + node_id + ")\n"); + #endif + } + + bool parse() { + // Create a non-constant copy of the input string + char *job_str_copy = strdup(client_buffer.c_str()); + + if (job_str_copy) { + String tokens[3]; + char *token = strtok(job_str_copy, ","); + for (int i = 0; token != NULL && i < 3; i++) { + tokens[i] = token; + token = strtok(NULL, ","); + } + + last_block_hash = tokens[0]; + expected_hash_str = tokens[1]; + hexStringToUint8Array(expected_hash_str, expected_hash, 20); + difficulty = tokens[2].toInt() * 100 + 1; + + // Free the memory allocated by strdup + free(job_str_copy); + + return true; + } + else { + // Handle memory allocation failure + return false; + } + } + + void askForJob() { + Serial.println("Core [" + String(core) + "] - Asking for a new job for user: " + + String(config->DUCO_USER)); + + #if defined(USE_DS18B20) + sensors.requestTemperatures(); + float temp = sensors.getTempCByIndex(0); + #if defined(SERIAL_PRINTING) + Serial.println("DS18B20 reading: " + String(temp) + "°C"); + #endif + + client.print("JOB," + + String(config->DUCO_USER) + + SEP_TOKEN + config->START_DIFF + + SEP_TOKEN + String(config->MINER_KEY) + + SEP_TOKEN + "Temp:" + String(temp) + "*C" + + END_TOKEN); + #elif defined(USE_DHT) + float temp = dht.readTemperature(); + float hum = dht.readHumidity(); + #if defined(SERIAL_PRINTING) + Serial.println("DHT reading: " + String(temp) + "°C"); + Serial.println("DHT reading: " + String(hum) + "%"); + #endif + + client.print("JOB," + + String(config->DUCO_USER) + + SEP_TOKEN + config->START_DIFF + + SEP_TOKEN + String(config->MINER_KEY) + + SEP_TOKEN + "Temp:" + String(temp) + "*C" + + IOT_TOKEN + "Hum:" + String(hum) + "%" + + END_TOKEN); + #elif defined(USE_HSU07M) + float temp = read_hsu07m(); + #if defined(SERIAL_PRINTING) + Serial.println("HSU reading: " + String(temp) + "°C"); + #endif + + client.print("JOB," + + String(config->DUCO_USER) + + SEP_TOKEN + config->START_DIFF + + SEP_TOKEN + String(config->MINER_KEY) + + SEP_TOKEN + "Temp:" + String(temp) + "*C" + + END_TOKEN); + #elif defined(USE_INTERNAL_SENSOR) + float temp = 0; + temp_sensor_read_celsius(&temp); + #if defined(SERIAL_PRINTING) + Serial.println("Internal temp sensor reading: " + String(temp) + "°C"); + #endif + + client.print("JOB," + + String(config->DUCO_USER) + + SEP_TOKEN + config->START_DIFF + + SEP_TOKEN + String(config->MINER_KEY) + + SEP_TOKEN + "CPU Temp:" + String(temp) + "*C" + + END_TOKEN); + #else + client.print("JOB," + + String(config->DUCO_USER) + + SEP_TOKEN + config->START_DIFF + + SEP_TOKEN + String(config->MINER_KEY) + + END_TOKEN); + #endif + + waitForClientData(); + #if defined(SERIAL_PRINTING) + Serial.println("Core [" + String(core) + "] - Received job with size of " + + String(client_buffer.length()) + + " bytes " + client_buffer); + #endif + + parse(); + #if defined(SERIAL_PRINTING) + Serial.println("Core [" + String(core) + "] - Parsed job: " + + getLastBlockHash() + " " + + getExpectedHashStr() + " " + + String(getDifficulty())); + #endif + } + + const String &getLastBlockHash() const { return last_block_hash; } + const String &getExpectedHashStr() const { return expected_hash_str; } + const uint8_t *getExpectedHash() const { return expected_hash; } + unsigned int getDifficulty() const { return difficulty; } +}; + +#endif diff --git a/ESP_Code/Settings.h b/ESP_Code/Settings.h new file mode 100644 index 00000000..41d0948a --- /dev/null +++ b/ESP_Code/Settings.h @@ -0,0 +1,226 @@ +// Settings.h +#ifndef SETTINGS_H +#define SETTINGS_H + +// ---------------------- General settings ---------------------- // +// Change the part in brackets to your Duino-Coin username +extern char *DUCO_USER = "my_cool_username"; +// Change the part in brackets to your mining key (if you have set it in the wallet) +extern char *MINER_KEY = "mySecretPass"; +// Change the part in brackets if you want to set a custom miner name +// Use Auto to autogenerate, None for no custom identifier +extern char *RIG_IDENTIFIER = "None"; +// Change the part in brackets to your WiFi name +extern const char SSID[] = "SSID"; +// Change the part in brackets to your WiFi password +extern const char PASSWORD[] = "PASSW0RD"; +// -------------------------------------------------------------- // + +// -------------------- Advanced options ------------------------ // +// Uncomment if you want to host the dashboard page (available on ESPs IP address and mDNS) +// #define WEB_DASHBOARD + +// Comment out the line below if you wish to disable LED blinking +#define LED_BLINKING + +// Uncomment if you want to use LAN8720. WLAN-credentials will be ignored using LAN +// Select correct Board in ArduinoIDE!!! Really! +// #define USE_LAN + +// Comment out the line below if you wish to disable Serial printing +#define SERIAL_PRINTING + +// Edit the line below if you wish to change the serial speed (low values may reduce performance but are less prone to interference) +#define SERIAL_BAUDRATE 500000 + +// ESP8266 WDT loop watchdog. Do not edit this value, but if you must - do not set it too low or it will falsely trigger during mining! +#define LWD_TIMEOUT 30000 + +// Uncomment to disable ESP32 brownout detector if you're suffering from faulty insufficient power detection +// #define DISABLE_BROWNOUT + +// Uncomment to enable WiFiManager captive portal in AP mode +// The board will create its own network you connect to and change the settings +// REQUIRES WiFiManager library by tzapu (https://github.com/tzapu/WiFiManager) +// #define CAPTIVE_PORTAL +// -------------------------------------------------------------- // + +// ------------------------ Displays ---------------------------- // + +// Uncomment to enable a SSD1306 OLED screen on the I2C bus to display mining info in real time +// Default connections (can be overriden by using a different u8g2 initializer, see line 140): +// GND - GND +// VCC - 5V or 3.3V depending on display +// SCL - GPIO22 (ESP32) or GPIO5 (D2 on ESP8266) or GPIO35 (ESP32-S2) +// SDA - GPIO21 (ESP32) or GPIO4 (D1 on ESP8266) or GPIO33 (ESP32-S2) +// #define DISPLAY_SSD1306 + +// Uncomment to enable a 16x2 LCD screen on a direct bus to display mining info in real time +// See line 150 for connections and initializer +// #define DISPLAY_16X2 + +// Uncomment if your device is a Duino BlushyBox device +// #define BLUSHYBOX +// -------------------------------------------------------------- // + +// ---------------------- IoT examples -------------------------- // +// https://github.com/revoxhere/duino-coin/wiki/Duino's-take-on-the-Internet-of-Things + +// Uncomment the line below if you wish to use the internal temperature sensor (Duino IoT example) +// Only ESP32-S2, -S3, -H2, -C2, -C3, -C6 and some old models have one! +// More info: https://www.espboards.dev/blog/esp32-inbuilt-temperature-sensor/ +// NOTE: Mining performance will decrease by about 20 kH/s! +// #define USE_INTERNAL_SENSOR + +// Uncomment the line below if you wish to use a DS18B20 temperature sensor (Duino IoT example) +// NOTE: Mining performance should stay the same +// #define USE_DS18B20 + +// Uncomment the line below if you wish to use a DHT11/22 temperature and humidity sensor (Duino IoT example) +// NOTE: Mining performance should stay the same +// #define USE_DHT + +// Uncomment the line below if you wish to use a HSU07M sensor (Duino IoT Example) +// NOTE: Untested as of right now +// #define USE_HSU07M +// -------------------------------------------------------------- // + +// ---------------- Variables and definitions ------------------- // +// You generally do not need to edit stuff below this line +// unless you're know what you're doing. + +#if defined(ESP8266) + // ESP8266 + #define LED_BUILTIN 2 +#elif defined(CONFIG_FREERTOS_UNICORE) + #if defined(CONFIG_IDF_TARGET_ESP32C3) + // ESP32-C3 + #define LED_BUILTIN 8 + #else + // ESP32-S2 + #define LED_BUILTIN 15 + #endif +#else + // ESP32 + #ifndef LED_BUILTIN + #define LED_BUILTIN 2 + #endif + #if defined(BLUSHYBOX) + #define LED_BUILTIN 4 + #endif +#endif + +#define BLINK_SETUP_COMPLETE 2 +#define BLINK_CLIENT_CONNECT 5 + +#define SOFTWARE_VERSION "4.3" +extern unsigned int hashrate = 0; +extern unsigned int hashrate_core_two = 0; +extern unsigned int difficulty = 0; +extern unsigned long share_count = 0; +extern unsigned long accepted_share_count = 0; +extern String node_id = ""; +extern String WALLET_ID = ""; +extern unsigned int ping = 0; + +#if defined(USE_INTERNAL_SENSOR) + #include "driver/temp_sensor.h" +#endif + +#if defined(USE_DS18B20) + // Install OneWire and DallasTemperature libraries if you get an error + #include + #include + // Change 12 to the pin you've connected your sensor to + const int DSPIN = 12; + + OneWire oneWire(DSPIN); + DallasTemperature extern sensors(&oneWire); +#endif + +#if defined(USE_DHT) + // Install "DHT sensor library" if you get an error + #include + // Change 12 to the pin you've connected your sensor to + #define DHTPIN 12 + // Set DHT11 or DHT22 type accordingly + #define DHTTYPE DHT11 + + DHT extern dht(DHTPIN, DHTTYPE); +#endif + +#if defined(DISPLAY_SSD1306) + // Install "u8g2" if you get an error + #include + #include + // Display definition from the U8G2 library. Edit if you use a different display + // For software I2C, use ..._F_SW_I2C and define the pins in the initializer + U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE); +#endif + +#if defined(DISPLAY_16X2) + #include "Wire.h" + // Install "Adafruit_LiquidCrystal" if you get an error + #include "Adafruit_LiquidCrystal.h" + + // initialize the library with the numbers of the interface pins + // RS E D4 D5 D6 D7 + Adafruit_LiquidCrystal lcd(1, 2, 3, 4, 5, 6); +#endif + +#if defined(USE_HSU07M) + #include "Wire.h" + #define HSU07M_ADDRESS 0x4B // Change this if your sensor has a different address + + float read_hsu07m() { + Wire.beginTransmission(HSU07M_ADDRESS); + Wire.write(0x00); + Wire.endTransmission(); + delay(100); + Wire.requestFrom(HSU07M_ADDRESS, 2); + if(Wire.available() >= 2) { + byte tempMSB = Wire.read(); + byte tempLSB = Wire.read(); + int tempRaw = (tempMSB << 8) | tempLSB; + float tempC = (tempRaw / 16.0) - 40.0; + return tempC; + } + return -1.0; + } +#endif + +#if defined(BLUSHYBOX) + #define GAUGE_PIN 5 + #define GAUGE_MAX 190 + #define GAUGE_MIN 0 + #if defined(ESP8266) + #define GAUGE_MAX_HR 80000 + #else + #define GAUGE_MAX_HR 200000 + #endif + extern float hashrate_old = 0.0; + + void gauge_set(float hashrate) { + float old = hashrate_old; + float new_val = hashrate; + + if (hashrate_old == 0) { + float delta = (new_val - old) / 50; + for (int x=0; x < 50; x++) { + analogWrite(5, map(old + x*delta, 0, GAUGE_MAX_HR, GAUGE_MIN, GAUGE_MAX) + random(0, 10)); + delay(20); + } + } else { + float delta = (new_val - old) / 10; + for (int x=0; x < 10; x++) { + analogWrite(5, map(old + x*delta, 0, GAUGE_MAX_HR, GAUGE_MIN, GAUGE_MAX) + random(0, 10)); + delay(10); + } + } + hashrate_old = hashrate; + } +#endif + +IPAddress DNS_SERVER(1, 1, 1, 1); // Cloudflare DNS server + +#endif // End of SETTINGS_H diff --git a/LICENSE b/LICENSE index fd6ef7b9..b2bc599c 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019-2022 Robert Piotrowski +Copyright (c) 2019-present Robert Piotrowski Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/CLI_Wallet.py b/Legacy codes/CLI_Wallet.py similarity index 100% rename from CLI_Wallet.py rename to Legacy codes/CLI_Wallet.py diff --git a/ESP32_Code/ESP32_Code.ino b/Legacy codes/ESP32_Code/ESP32_Code_3.5.ino similarity index 85% rename from ESP32_Code/ESP32_Code.ino rename to Legacy codes/ESP32_Code/ESP32_Code_3.5.ino index c03684ef..3c17b18b 100644 --- a/ESP32_Code/ESP32_Code.ino +++ b/Legacy codes/ESP32_Code/ESP32_Code_3.5.ino @@ -3,7 +3,7 @@ ( _ \( )( )(_ _)( \( )( _ )___ / __)( _ )(_ _)( \( ) )(_) ))(__)( _)(_ ) ( )(_)((___)( (__ )(_)( _)(_ ) ( (____/(______)(____)(_)\_)(_____) \___)(_____)(____)(_)\_) - Official code for ESP32 boards version 3.18 + Official code for ESP32 boards version 3.5 Duino-Coin Team & Community 2019-2022 © MIT Licensed https://duinocoin.com @@ -14,18 +14,28 @@ */ /***************** START OF MINER CONFIGURATION SECTION *****************/ +// Change the part in brackets to your Duino-Coin username +const char *DUCO_USER = "USERNAME"; +// Change the part in brackets to your mining key (if you enabled it in the wallet) +const char* MINER_KEY = "MINING_KEY"; // Change the part in brackets to your WiFi name -const char *SSID = "My cool Wi-Fi"; +const char *SSID = "WIFI_NAME"; // Change the part in brackets to your WiFi password -const char *WIFI_PASS = "My secret pass"; -// Change the part in brackets to your Duino-Coin username -const char *DUCO_USER = "my_cool_username"; +const char *WIFI_PASS = "WIFI_PASSWORD"; // Change the part in brackets if you want to set a custom miner name (use Auto to autogenerate, None for no name) const char *RIG_IDENTIFIER = "None"; -// Change the part in brackets to your mining key (if you enabled it in the wallet) -const char* MINER_KEY = "None"; // Change this if your board has built-in led on non-standard pin #define LED_BUILTIN 2 + +template +class DuinoIoT { + T sensor; +}; + +typedef struct { + String val; +} SensorData_t; + // Uncomment the line below if you wish to use a DHT sensor (Duino IoT beta) // #define USE_DHT #ifdef USE_DHT @@ -35,19 +45,116 @@ const char* MINER_KEY = "None"; #define DHTPIN 2 // Set DHT11 or DHT22 accordingly #define DHTTYPE DHT11 - DHT dht(DHTPIN, DHTTYPE); + + template<> + class DuinoIoT { + + DHT sensor; + + public: + + DuinoIoT() : sensor(DHTPIN, DHTTYPE) {} + + void begin() { + Serial.println("Initializing DHT sensor"); + sensor.begin(); + Serial.println("Test reading: " + String(sensor.readTemperature()) + "*C " + String(sensor.readHumidity()) + "% humidity"); + } + + void getSensorData(SensorData_t *data) { + String temp = String(sensor.readTemperature()); + String hum = String(sensor.readHumidity()); + Serial.println("DHT readings: " + temp + "*C, " + hum + "%"); + data->val = temp + "@" + hum; + } + }; + + DuinoIoT duinoIoT; #endif // Uncomment the line below if you wish to use an AHT10 or AHT20 sensor (Duino IoT beta) -// #define USE_AHT +//#define USE_AHT #ifdef USE_AHT // Install "Adafruit AHTX0 Library" if you get an error #include // AHT10/AHT20 should be connected to ESP32 default I2C pins // i.e. (I2C_SDA: GPIO_21 and I2C_SCL: GPIO_22) - Adafruit_AHTX0 aht; + + template<> + class DuinoIoT { + + Adafruit_AHTX0 sensor; + + public: + + DuinoIoT() : sensor() {} + + void begin() { + Serial.println("Initializing AHT sensor"); + if (! sensor.begin()) { + Serial.println("Could not find AHT Sensor. Check wiring?"); + while (1) delay(10); + } + sensors_event_t hum, temp; + sensor.getEvent(&hum, &temp); + Serial.println("Test reading: " + String(temp.temperature) + "*C, " + String(hum.relative_humidity) + "% rH"); + } + + void getSensorData(SensorData_t *data) { + sensors_event_t hum, temp; + sensor.getEvent(&hum, &temp); + Serial.println("AHT readings: " + String(temp.temperature) + "*C, " + String(hum.relative_humidity) + "% rH"); + data->val = String(temp.temperature) + "@" + String(hum.relative_humidity); + } + }; + + DuinoIoT duinoIoT; +#endif + +// Uncomment the line below if you wish to use an BMP280 sensor (Duino IoT beta) +//#define USE_BMP280 +#ifdef USE_BMP280 +// Install "Adafruit BMP280 Library" if you get an error +# include +# include +# define I2C_SDA_PIN 22 +# define I2C_SCL_PIN 23 +# define BMP280_I2C_ADDR 0x76 + template<> + class DuinoIoT { + + Adafruit_BMP280 sensor; + + public: + + DuinoIoT() : sensor() {} + + void begin() { + Serial.println("Initializing BMP280 sensor"); + Wire.begin(I2C_SDA_PIN, I2C_SCL_PIN); + if (!sensor.begin(BMP280_I2C_ADDR)) { + Serial.println("Could not find BMP280 Sensor. Check wiring?"); + while (1); delay(10); + } + sensor.setSampling(Adafruit_BMP280::MODE_NORMAL, + Adafruit_BMP280::SAMPLING_X2, + Adafruit_BMP280::SAMPLING_X16, + Adafruit_BMP280::FILTER_X16, + Adafruit_BMP280::STANDBY_MS_500); + + Serial.print(F("Test reading: "));Serial.print(sensor.readTemperature());Serial.print(sensor.readPressure()); + } + + void getSensorData(SensorData_t *data) { + String temp = String(sensor.readTemperature()); + String pressure = String(sensor.readPressure() / 100.0F); + Serial.println("BMP280 readings: " + temp + "*C, " + pressure + " hPa"); + data->val = "temperature:" + temp + "@pressure:" + pressure; + } + }; + + DuinoIoT duinoIoT; #endif -#define BLINK_SHARE_FOUND 1 #define BLINK_SETUP_COMPLETE 2 #define BLINK_CLIENT_CONNECT 3 #define BLINK_RESET_DEVICE 5 @@ -76,9 +183,12 @@ const int mqtt_port = 1883; /* If you're using the ESP32-CAM board or other board that doesn't support OTA (Over-The-Air programming) comment the ENABLE_OTA definition line (#define ENABLE_OTA) - NOTE: enabling OTA support could decrease hashrate (up to 40%) */ + NOTE: enabling OTA support may decrease the hashrate */ // #define ENABLE_OTA +/* If you want to use the web dashboard uncomment the line below */ +// #define WEB_DASHBOARD + /* If you don't want to use the Serial interface comment the ENABLE_SERIAL definition line (#define ENABLE_SERIAL)*/ #define ENABLE_SERIAL @@ -155,7 +265,7 @@ SemaphoreHandle_t xMutex; const char * DEVICE = "ESP32"; const char * POOLPICKER_URL[] = {"https://server.duinocoin.com/getPool"}; const char * MINER_BANNER = "Official ESP32 Miner"; -const char * MINER_VER = "3.18"; +const char * MINER_VER = "3.5"; String pool_name = ""; String host = ""; String node_id = ""; @@ -469,11 +579,13 @@ void WiFireconnect(void *pvParameters) { for (;;) { wifi_state = WiFi.status(); -#ifdef ENABLE_OTA - ArduinoOTA.handle(); -#endif - - server.handleClient(); + #ifdef ENABLE_OTA + ArduinoOTA.handle(); + #endif + + #ifdef WEB_DASHBOARD + server.handleClient(); + #endif if (ota_state) // If OTA is working, reset the watchdog esp_task_wdt_reset(); @@ -491,17 +603,19 @@ void WiFireconnect(void *pvParameters) { Serial.println("Rig name: " + String(RIG_IDENTIFIER)); Serial.println(); - if (!MDNS.begin(RIG_IDENTIFIER)) { - Serial.println("mDNS unavailable"); - } - MDNS.addService("http", "tcp", 80); - Serial.print("Configured mDNS for dashboard on http://" - + String(RIG_IDENTIFIER) - + ".local (or http://" - + WiFi.localIP().toString() - + ")"); - server.on("/", dashboard); - server.begin(); + #ifdef WEB_DASHBOARD + if (!MDNS.begin(RIG_IDENTIFIER)) { + Serial.println("mDNS unavailable"); + } + MDNS.addService("http", "tcp", 80); + Serial.print("Configured mDNS for dashboard on http://" + + String(RIG_IDENTIFIER) + + ".local (or http://" + + WiFi.localIP().toString() + + ")"); + server.on("/", dashboard); + server.begin(); + #endif // Notify Setup Complete blink(BLINK_SETUP_COMPLETE);// Sucessfull connection with wifi network @@ -640,20 +754,13 @@ void TaskMining(void *pvParameters) { Serial.println(String(taskCoreName + " asking for a new job for user: " + DUCO_USER)); jobClient.flush(); - #if !(defined(USE_DHT) || defined(USE_AHT)) + #if !(defined(USE_DHT) || defined(USE_AHT) || defined(USE_BMP280)) jobClient.print("JOB," + String(DUCO_USER) + ",ESP32," + String(MINER_KEY) + MSGNEWLINE); - #elif defined(USE_DHT) - int temp = dht.readTemperature(); - int hum = dht.readHumidity(); - Serial.println("DHT readings: " + String(temp) + "*C, " + String(hum) + "%"); - jobClient.print("JOB," + String(DUCO_USER) + ",ESP32," + String(MINER_KEY) + "," + - String(temp) + "@" + String(hum) + MSGNEWLINE); - #elif defined(USE_AHT) - sensors_event_t hum, temp; - aht.getEvent(&hum, &temp); - Serial.println("AHT readings: " + String(temp.temperature) + "*C, " + String(hum.relative_humidity) + "% rH"); + #else + SensorData_t data = {""}; + duinoIoT.getSensorData(&data); jobClient.print("JOB," + String(DUCO_USER) + ",ESP32," + String(MINER_KEY) + "," + - String(temp.temperature) + "@" + String(hum.relative_humidity) + MSGNEWLINE); + data.val + MSGNEWLINE); #endif while (!jobClient.available()) { @@ -700,6 +807,7 @@ void TaskMining(void *pvParameters) { bool ignoreHashrate = false; // Try to find the nonce which creates the expected hash + digitalWrite(LED_BUILTIN, HIGH); for (unsigned long nonceCalc = 0; nonceCalc <= TaskThreadData[taskId].difficulty; nonceCalc++) { // Define hash under Test hashUnderTest = previousHash + String(nonceCalc); @@ -716,12 +824,13 @@ void TaskMining(void *pvParameters) { // Check if we have found the nonce for the expected hash if ( memcmp( shaResult, expectedHashBytes, sizeof(shaResult) ) == 0 ) { - // Found the nonce submit it to the server - Serial.println(String(taskCoreName + " found a correct hash using nonce: " + nonceCalc )); - + // Found the nonce - submit it to the server + digitalWrite(LED_BUILTIN, LOW); + // Calculate mining time float elapsedTime = (micros() - startTime) / 1000.0 / 1000.0; // Total elapsed time in seconds TaskThreadData[taskId].hashrate = nonceCalc / elapsedTime; + Serial.println(String(taskCoreName + " found a correct hash (" + elapsedTime + "s)")); // Validate connection if (!jobClient.connected()) { @@ -757,20 +866,9 @@ void TaskMining(void *pvParameters) { TaskThreadData[taskId].shares++; if (LED_BLINKING) digitalWrite(LED_BUILTIN, HIGH); - // Validate Hashrate - if ( TaskThreadData[taskId].hashrate < 4000 && !ignoreHashrate) { - // Hashrate is low so restart esp - Serial.println(String(taskCoreName + " has low hashrate: " + (TaskThreadData[taskId].hashrate / 1000) + "kH/s, job feedback: " + feedback + " - restarting...")); - jobClient.flush(); - jobClient.stop(); - blink(BLINK_RESET_DEVICE); - esp_restart(); - } - else { - // Print statistics - Serial.println(String(taskCoreName + " retrieved job feedback: " + feedback + ", hashrate: " + (TaskThreadData[taskId].hashrate / 1000) + "kH/s, share #" + TaskThreadData[taskId].shares)); - } - + // Print statistics + Serial.println(String(taskCoreName + " retrieved job feedback: " + feedback + ", hashrate: " + (TaskThreadData[taskId].hashrate / 1000) + "kH/s, share #" + TaskThreadData[taskId].shares)); + // Stop current loop and ask for a new job break; } @@ -786,24 +884,10 @@ void TaskMining(void *pvParameters) { void setup() { Serial.begin(500000); // Start serial connection Serial.println("\n\nDuino-Coin " + String(MINER_BANNER)); - - #ifdef USE_DHT - Serial.println("Initializing DHT sensor"); - dht.begin(); - Serial.println("Test reading: " + String(dht.readHumidity()) + "% humidity"); - Serial.println("Test reading: temperature " + String(dht.readTemperature()) + "*C"); - #elif defined(USE_AHT) - Serial.println("Initializing AHT sensor"); - if (! aht.begin()) { - Serial.println("Could not find AHT Sensor. Check wiring?"); - while (1) delay(10); - } - sensors_event_t hum, temp; - aht.getEvent(&hum, &temp); - Serial.println("Test reading: " + String(hum.relative_humidity) + "% humidity"); - Serial.println("Test reading: temperature " + String(temp.temperature) + "*C"); - #endif - +#if (defined(USE_DHT) || defined(USE_AHT) || defined(USE_BMP280)) + duinoIoT.begin(); +#endif + WiFi.setSleep(false); // Better network responsiveness WiFi.mode(WIFI_STA); // Setup ESP in client mode btStop(); WiFi.begin(SSID, WIFI_PASS); // Connect to wifi @@ -879,7 +963,7 @@ void setup() { xMutex = xSemaphoreCreateMutex(); xTaskCreatePinnedToCore( WiFireconnect, "WiFirec", 10000, NULL, NUMBEROFCORES + 2, &WiFirec, - mqttCore); // create a task with highest priority and executed on core 0 + wifiCore); // create a task with highest priority and executed on core 0 delay(250); // If MQTT is enabled create a sending thread diff --git a/ESP8266_Code/ESP8266_Code.ino b/Legacy codes/ESP8266_Code/ESP8266_Code_3.5.ino similarity index 76% rename from ESP8266_Code/ESP8266_Code.ino rename to Legacy codes/ESP8266_Code/ESP8266_Code_3.5.ino index ab056a15..ffccd876 100644 --- a/ESP8266_Code/ESP8266_Code.ino +++ b/Legacy codes/ESP8266_Code/ESP8266_Code_3.5.ino @@ -1,9 +1,9 @@ /* - ____ __ __ ____ _ _ _____ ___ _____ ____ _ _ + ____ __ __ ____ _ _ _____ ___ _____ ____ _ _ ( _ \( )( )(_ _)( \( )( _ )___ / __)( _ )(_ _)( \( ) - )(_) ))(__)( _)(_ ) ( )(_)((___)( (__ )(_)( _)(_ ) ( + )(_) ))(__)( _)(_ ) ( )(_)((___)( (__ )(_)( _)(_ ) ( (____/(______)(____)(_)\_)(_____) \___)(_____)(____)(_)\_) - Official code for ESP8266 boards version 3.18 + Official code for ESP8266 boards version 3.5 Duino-Coin Team & Community 2019-2022 © MIT Licensed https://duinocoin.com @@ -22,8 +22,8 @@ /* If during compilation the line below causes a "fatal error: arduinoJson.h: No such file or directory" message to occur; it means that you do NOT have the - ArduinoJSON library installed. To install it, - go to the below link and follow the instructions: + ArduinoJSON library installed. To install it, + go to the below link and follow the instructions: https://github.com/revoxhere/duino-coin/issues/832 */ #include @@ -35,7 +35,7 @@ follow the instructions of the readme file: https://github.com/esp8266/Arduino */ #include -#include +//#include #include #include @@ -46,94 +46,111 @@ #include #include +// Uncomment the line below if you wish to use a DHT sensor (Duino IoT beta) +// #define USE_DHT + // Uncomment the line below if you wish to register for IOT updates with an MQTT broker // #define USE_MQTT -// Uncomment the line below if you wish to use a DHT sensor (Duino IoT beta) -// #define USE_DHT +// If you don't know what MQTT means check this link: +// https://www.techtarget.com/iotagenda/definition/MQTT-MQ-Telemetry-Transport -#ifdef USE_MQTT - #include - // update below mqtt broker parameters - #define mqtt_server "your_mqtt_server" - #define mqtt_port 1883 - #define mqtt_user "your_mqtt_username" - #define mqtt_password "your_super_secret_mqtt_password" - // update humidity_topic to your mqtt humidity topic - #define humidity_topic "sensor/humidity" - // update temperature_topic to your mqtt temperature topic - #define temperature_topic "sensor/temperature" - - WiFiClient espClient; - PubSubClient mqttClient(espClient); - - void mqttReconnect() { - // Loop until we're reconnected - while (!mqttClient.connected()) { - Serial.print("Attempting MQTT connection..."); - // Attempt to connect - // If you do not want to use a username and password, change next line to - // if (mqttClient.connect("ESP8266Client")) { - if (mqttClient.connect("ESP8266Client", mqtt_user, mqtt_password)) { - Serial.println("connected"); - } else { - Serial.print("failed, rc="); - Serial.print(mqttClient.state()); - Serial.println(" try again in 5 seconds"); - // Wait 5 seconds before retrying - delay(5000); - } - } - } - - bool checkBound(float newValue, float prevValue, float maxDiff) { - return !isnan(newValue) && - (newValue < prevValue - maxDiff || newValue > prevValue + maxDiff); - } - - long lastMsg = 0; - float diff = 0.01; // change this to the minimum difference considered for update +#ifdef USE_DHT +float temp = 0.0; +float hum = 0.0; + +// Install "DHT sensor library" if you get an error +#include +// Change D3 to the pin you've connected your sensor to +#define DHTPIN D3 +// Set DHT11 or DHT22 accordingly +#define DHTTYPE DHT11 +DHT dht(DHTPIN, DHTTYPE); #endif -#ifdef USE_DHT - - float temp = 0.0; - float hum = 0.0; - float temp_weight = 0.9; // 1 for absolute new value, 0-1 for smoothing the new reading with previous value - float temp_min_value = -20.0; - float temp_max_value = 70.0; - float hum_weight = 0.9; // 1 for absolute new value, 0-1 for smoothing the new reading with previous value - float hum_min_value = 0.1; - float hum_max_value = 100.0; - - // Install "DHT sensor library" if you get an error - #include - // Change D3 to the pin you've connected your sensor to - #define DHTPIN D3 - // Set DHT11 or DHT22 accordingly - #define DHTTYPE DHT11 - DHT dht(DHTPIN, DHTTYPE); +#ifdef USE_MQTT +// Install "PubSubClient" if you get an error +#include + +long lastMsg = 0; + +// Change the part in brackets to your MQTT broker address +#define mqtt_server "broker.hivemq.com" +// broker.hivemq.com is for testing purposes, change it to your broker address + +// Change this to your MQTT broker port +#define mqtt_port 1883 +// If you want to use user and password for your MQTT broker, uncomment the line below +// #define mqtt_use_credentials + +// Change the part in brackets to your MQTT broker username +#define mqtt_user "My cool mqtt username" +// Change the part in brackets to your MQTT broker password +#define mqtt_password "My secret mqtt pass" + +// Change this if you want to send data to the topic every X milliseconds +#define mqtt_update_time 5000 + +// Change the part in brackets to your MQTT humidity topic +#define humidity_topic "sensor/humidity" +// Change the part in brackets to your MQTT temperature topic +#define temperature_topic "sensor/temperature" + +WiFiClient espClient; +PubSubClient mqttClient(espClient); + +void mqttReconnect() +{ + // Loop until we're reconnected + while (!mqttClient.connected()) + { + Serial.print("Attempting MQTT connection..."); + + // Create a random client ID + String clientId = "ESP8266Client-"; + clientId += String(random(0xffff), HEX); + + // Attempt to connect +#ifdef mqtt_use_credentials + if (mqttClient.connect("ESP8266Client", mqtt_user, mqtt_password)) +#else + if (mqttClient.connect(clientId.c_str())) +#endif + { + Serial.println("connected"); + } + else + { + Serial.print("failed, rc="); + Serial.print(mqttClient.state()); + Serial.println(" try again in 5 seconds"); + // Wait 5 seconds before retrying + delay(5000); + } + } +} #endif -namespace { +namespace +{ +// Change the part in brackets to your Duino-Coin username +const char *DUCO_USER = "USERNAME"; +// Change the part in brackets to your mining key (if you have enabled it in the wallet) +const char *MINER_KEY = "MINING_KEY"; // Change the part in brackets to your WiFi name -const char* SSID = "My cool wifi name"; +const char *SSID = "WIFI_NAME"; // Change the part in brackets to your WiFi password -const char* PASSWORD = "My secret wifi pass"; -// Change the part in brackets to your Duino-Coin username -const char* USERNAME = "my_cool_username"; +const char *PASSWORD = "WIFI_PASSWORD"; // Change the part in brackets if you want to set a custom miner name (use Auto to autogenerate, None for no name) -const char* RIG_IDENTIFIER = "None"; -// Change the part in brackets to your mining key (if you enabled it in the wallet) -const char* MINER_KEY = "None"; -// Change false to true if using 160 MHz clock mode to not get the first share rejected -const bool USE_HIGHER_DIFF = false; -// Change true to false if you don't want to host the dashboard page -const bool WEB_DASHBOARD = true; -// Change false to true if you want to update hashrate in browser without reloading page +const char *RIG_IDENTIFIER = "None"; +// Set to true to use the 160 MHz overclock mode (and not get the first share rejected) +const bool USE_HIGHER_DIFF = true; +// Set to true if you want to host the dashboard page (available on ESPs IP address) +const bool WEB_DASHBOARD = false; +// Set to true if you want to update hashrate in browser without reloading the page const bool WEB_HASH_UPDATER = false; -// Change true to false if you want to disable led blinking(But the LED will work in the beginning until esp connects to the pool) +// Set to false if you want to disable the onboard led blinking when finding shares const bool LED_BLINKING = true; /* Do not change the lines below. These lines are static and dynamic variables @@ -141,7 +158,7 @@ const bool LED_BLINKING = true; const char * DEVICE = "ESP8266"; const char * POOLPICKER_URL[] = {"https://server.duinocoin.com/getPool"}; const char * MINER_BANNER = "Official ESP8266 Miner"; -const char * MINER_VER = "3.18"; +const char * MINER_VER = "3.5"; unsigned int share_count = 0; unsigned int port = 0; unsigned int difficulty = 0; @@ -160,7 +177,6 @@ const char WEBSITE[] PROGMEM = R"=====( https://github.com/revoxhere/duino-coin https://duinocoin.com --> - @@ -169,7 +185,6 @@ const char WEBSITE[] PROGMEM = R"=====( -
@@ -323,7 +338,6 @@ const char WEBSITE[] PROGMEM = R"=====(
- )====="; @@ -399,7 +413,7 @@ String START_DIFF = ""; // Loop WDT... please don't feed me... // See lwdtcb() and lwdtFeed() below Ticker lwdTimer; -#define LWD_TIMEOUT 60000 +#define LWD_TIMEOUT 20000 unsigned long lwdCurrentMillis = 0; unsigned long lwdTimeOutMillis = LWD_TIMEOUT; @@ -409,7 +423,6 @@ unsigned long lwdTimeOutMillis = LWD_TIMEOUT; #define LED_BUILTIN 2 -#define BLINK_SHARE_FOUND 1 #define BLINK_SETUP_COMPLETE 2 #define BLINK_CLIENT_CONNECT 3 #define BLINK_RESET_DEVICE 5 @@ -430,7 +443,7 @@ void SetupWifi() { } } - Serial.println("\n\nnSuccessfully connected to WiFi"); + Serial.println("\n\nSuccessfully connected to WiFi"); Serial.println("Local IP address: " + WiFi.localIP().toString()); Serial.println("Rig name: " + String(RIG_IDENTIFIER)); Serial.println(); @@ -470,6 +483,8 @@ void blink(uint8_t count, uint8_t pin = LED_BUILTIN) { digitalWrite(pin, state ^= HIGH); delay(50); } + } else { + digitalWrite(LED_BUILTIN, HIGH); } } @@ -503,23 +518,6 @@ void handleSystemEvents(void) { yield(); } -// https://stackoverflow.com/questions/9072320/split-string-into-string-array -String getValue(String data, char separator, int index) -{ - int found = 0; - int strIndex[] = {0, -1}; - int max_index = data.length() - 1; - - for (int i = 0; i <= max_index && found <= index; i++) { - if (data.charAt(i) == separator || i == max_index) { - found++; - strIndex[0] = strIndex[1] + 1; - strIndex[1] = (i == max_index) ? i + 1 : i; - } - } - return found > index ? data.substring(strIndex[0], strIndex[1]) : ""; -} - void waitForClientData(void) { client_buffer = ""; @@ -540,7 +538,7 @@ void ConnectToServer() { return; Serial.println("\n\nConnecting to the Duino-Coin server..."); - while (!client.connect(host, port)); + while (!client.connect(host.c_str(), port)); waitForClientData(); Serial.println("Connected to the server. Server version: " + client_buffer ); @@ -581,6 +579,47 @@ void dashboard() { } // namespace +// https://github.com/esp8266/Arduino/blob/master/cores/esp8266/TypeConversion.cpp +const char base36Chars[36] PROGMEM = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'}; +const uint8_t base36CharValues[75] PROGMEM {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, // 0 to 9 + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 0, 0, 0, 0, 0, 0, // Upper case letters + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35 // Lower case letters +}; +uint8_t *hexStringToUint8Array(const String &hexString, uint8_t *uint8Array, const uint32_t arrayLength) { + assert(hexString.length() >= arrayLength * 2); + for (uint32_t i = 0; i < arrayLength; ++i) { + uint8Array[i] = (pgm_read_byte(base36CharValues + hexString.charAt(i * 2) - '0') << 4) + pgm_read_byte(base36CharValues + hexString.charAt(i * 2 + 1) - '0'); + } + return uint8Array; +} + +struct MiningJob +{ + String last_block_hash; + String expected_hash_str; + uint8_t expected_hash[20]; + unsigned int difficulty; + + bool parse(char* job_str) + { + String tokens[3]; + char *token = strtok(job_str, ","); + for (int i = 0; token != NULL && i < 3; i++) + { + tokens[i] = token; + token = strtok(NULL, ","); + } + + last_block_hash = tokens[0]; + expected_hash_str = tokens[1]; + hexStringToUint8Array(expected_hash_str, expected_hash, 20); + difficulty = tokens[2].toInt() * 100 + 1; + + return true; + } +}; + + void setup() { Serial.begin(500000); Serial.println("\nDuino-Coin " + String(MINER_VER)); @@ -611,8 +650,8 @@ void setup() { lwdtFeed(); lwdTimer.attach_ms(LWD_TIMEOUT, lwdtcb); - if (USE_HIGHER_DIFF) START_DIFF = "ESP8266H"; - else START_DIFF = "ESP8266"; + if (USE_HIGHER_DIFF) START_DIFF = "ESP8266NH"; + else START_DIFF = "ESP8266N"; if(WEB_DASHBOARD) { if (!MDNS.begin(RIG_IDENTIFIER)) { @@ -646,32 +685,25 @@ void loop() { if(WEB_DASHBOARD) server.handleClient(); ConnectToServer(); - Serial.println("Asking for a new job for user: " + String(USERNAME)); + Serial.println("Asking for a new job for user: " + String(DUCO_USER)); #ifndef USE_DHT client.print("JOB," + - String(USERNAME) + SEP_TOKEN + + String(DUCO_USER) + SEP_TOKEN + String(START_DIFF) + SEP_TOKEN + String(MINER_KEY) + END_TOKEN); #endif + #ifdef USE_DHT - float newTemp = dht.readTemperature(); - float newHum = dht.readHumidity(); - if ((temp >= temp_min_value) && (temp <= temp_max_value)) { - if ((newTemp >= temp_min_value) && (newTemp <= temp_max_value)) { - newTemp = temp_weight * newTemp + (1.0f - temp_weight) * temp; // keep weighted measurement value - } else { - newTemp = temp; // keep current temp - } - } // else - keep newTemp as is - - if ((hum >= hum_min_value) && (hum <= hum_max_value)) { - if ((newHum >= hum_min_value) && (newHum <= hum_max_value)) { - newHum = hum_weight * newHum + (1.0 - hum_weight) * hum; // keep weighted measurement value - } else { - newHum = hum; // keep current hum - } - } // else - keep newHum as is + temp = dht.readTemperature(); + hum = dht.readHumidity(); + + Serial.println("DHT readings: " + String(temp) + "*C, " + String(hum) + "%"); + client.print("JOB," + + String(DUCO_USER) + SEP_TOKEN + + String(START_DIFF) + SEP_TOKEN + + String(MINER_KEY) + SEP_TOKEN + + String(temp) + "@" + String(hum) + END_TOKEN); #endif #ifdef USE_MQTT @@ -680,64 +712,51 @@ void loop() { mqttReconnect(); } mqttClient.loop(); - - long now = millis(); - if (now - lastMsg > 1000) { - lastMsg = now; #ifdef USE_DHT - if (checkBound(newTemp, temp, diff)) { - temp = newTemp; + long now = millis(); + if (now - lastMsg > mqtt_update_time) { + lastMsg = now; mqttClient.publish(temperature_topic, String(temp).c_str(), true); - } - if (checkBound(newHum, hum, diff)) { - hum = newHum; - mqttClient.publish(humidity_topic, String(hum).c_str(), true); + mqttClient.publish(humidity_topic, String(hum).c_str(), true); } #endif - } #endif - - #ifdef USE_DHT - - Serial.println("DHT readings: " + String(temp) + "*C, " + String(hum) + "%"); - client.print("JOB," + - String(USERNAME) + SEP_TOKEN + - String(START_DIFF) + SEP_TOKEN + - String(MINER_KEY) + SEP_TOKEN + - String(temp) + "@" + String(hum) + END_TOKEN); - #endif waitForClientData(); - String last_block_hash = getValue(client_buffer, SEP_TOKEN, 0); - String expected_hash = getValue(client_buffer, SEP_TOKEN, 1); - difficulty = getValue(client_buffer, SEP_TOKEN, 2).toInt() * 100 + 1; + Serial.println("Received job with size of " + String(client_buffer)); + + MiningJob job; + job.parse((char*)client_buffer.c_str()); + difficulty = job.difficulty; + + Serial.println("Parsed job: " + job.last_block_hash + " " + job.expected_hash_str + " " + String(job.difficulty)); + + if (USE_HIGHER_DIFF) system_update_cpu_freq(160); - int job_len = last_block_hash.length() + expected_hash.length() + String(difficulty).length(); - Serial.println("Received job with size of " + String(job_len) + " bytes"); - expected_hash.toUpperCase(); br_sha1_init(&sha1_ctx_base); - br_sha1_update(&sha1_ctx_base, last_block_hash.c_str(), last_block_hash.length()); + br_sha1_update(&sha1_ctx_base, job.last_block_hash.c_str(), job.last_block_hash.length()); float start_time = micros(); max_micros_elapsed(start_time, 0); String result = ""; - digitalWrite(LED_BUILTIN, HIGH); - for (unsigned int duco_numeric_result = 0; duco_numeric_result < difficulty; duco_numeric_result++) { + if (LED_BLINKING) digitalWrite(LED_BUILTIN, LOW); + for (unsigned int duco_numeric_result = 0; duco_numeric_result < job.difficulty; duco_numeric_result++) { // Difficulty loop sha1_ctx = sha1_ctx_base; duco_numeric_result_str = String(duco_numeric_result); + br_sha1_update(&sha1_ctx, duco_numeric_result_str.c_str(), duco_numeric_result_str.length()); br_sha1_out(&sha1_ctx, hashArray); - result = experimental::TypeConversion::uint8ArrayToHexString(hashArray, 20); - if (result == expected_hash) { + + if (memcmp(job.expected_hash, hashArray, 20) == 0) { // If result is found + if (LED_BLINKING) digitalWrite(LED_BUILTIN, HIGH); unsigned long elapsed_time = micros() - start_time; float elapsed_time_s = elapsed_time * .000001f; hashrate = duco_numeric_result / elapsed_time_s; share_count++; - blink(BLINK_SHARE_FOUND); client.print(String(duco_numeric_result) + "," + String(hashrate) @@ -766,8 +785,5 @@ void loop() { if (max_micros_elapsed(micros(), 500000)) { handleSystemEvents(); } - else { - delay(0); - } } } diff --git a/Wallet.py b/Legacy codes/Wallet.py similarity index 96% rename from Wallet.py rename to Legacy codes/Wallet.py index 9530a058..baba00f8 100644 --- a/Wallet.py +++ b/Legacy codes/Wallet.py @@ -2623,6 +2623,8 @@ def clear_amount_placeholder(self): lang = "thai" elif locale.startswith("ko"): lang = "korean" + elif locale.startswith("fi"): + lang = "finnish" else: lang = "english" except IndexError: diff --git a/PC_Miner.py b/PC_Miner.py index dd0a5c01..dc565fa4 100644 --- a/PC_Miner.py +++ b/PC_Miner.py @@ -1,23 +1,24 @@ #!/usr/bin/env python3 """ -Duino-Coin Official PC Miner 3.18 © MIT licensed +Duino-Coin Official PC Miner 4.3 © MIT licensed https://duinocoin.com https://github.com/revoxhere/duino-coin -Duino-Coin Team & Community 2019-2022 +Duino-Coin Team & Community 2019-2025 """ -from threading import Semaphore -from time import time, sleep, strptime, ctime +from time import time, sleep, strptime, ctime, time_ns from hashlib import sha1 from socket import socket from multiprocessing import cpu_count, current_process -from multiprocessing import Process, Manager -from threading import Thread +from multiprocessing import Process, Manager, Semaphore +from threading import Thread, Lock from datetime import datetime from random import randint from os import execl, mkdir, _exit +from os import name as osname +from os import system as ossystem from subprocess import DEVNULL, Popen, check_call, PIPE import pip import sys @@ -25,8 +26,9 @@ import os import json import zipfile +import traceback +import urllib.parse -import requests from pathlib import Path from re import sub from random import choice @@ -38,8 +40,12 @@ from locale import getdefaultlocale from configparser import ConfigParser +import io + +debug = "n" +running_on_rpi = False configparser = ConfigParser() -printlock = Semaphore(value=1) +printlock = Lock() # Python <3.5 check f"Your Python version is too old. Duino-Coin Miner requires version 3.6 or above. Update your packages and try again" @@ -56,11 +62,29 @@ def handler(signal_received, frame): + Fore.RESET + get_string("goodbye"), "warning") + + if not "raspi_leds" in user_settings: + user_settings["raspi_leds"] = "y" + + if running_on_rpi and user_settings["raspi_leds"] == "y": + # Reset onboard status LEDs + os.system( + 'echo mmc0 | sudo tee /sys/class/leds/led0/trigger >/dev/null 2>&1') + os.system( + 'echo 1 | sudo tee /sys/class/leds/led1/brightness >/dev/null 2>&1') if sys.platform == "win32": _exit(0) else: - Popen("kill $(ps awux | grep PC_Miner | grep -v grep | awk '{print $2}')", shell=True, stdout=PIPE) + Popen("kill $(ps aux | grep PC_Miner | awk '{print $2}')", + shell=True, stdout=PIPE) + + +def debug_output(text: str): + if debug == 'y': + print(Style.RESET_ALL + Fore.WHITE + + now().strftime(Style.DIM + '%H:%M:%S.%f ') + + Style.NORMAL + f'DEBUG: {text}') def install(package): @@ -74,6 +98,14 @@ def install(package): execl(sys.executable, sys.executable, *sys.argv) +try: + import requests +except ModuleNotFoundError: + print("Requests is not installed. " + + "Miner will try to automatically install it " + + "If it fails, please manually execute " + + "python3 -m pip install requests") + install("requests") try: from colorama import Back, Fore, Style, init @@ -119,7 +151,7 @@ class Settings: """ ENCODING = "UTF8" SEPARATOR = "," - VER = 3.18 + VER = 4.3 DATA_DIR = "Duino-Coin PC Miner " + str(VER) TRANSLATIONS = ("https://raw.githubusercontent.com/" + "revoxhere/" @@ -129,12 +161,15 @@ class Settings: SETTINGS_FILE = "/Settings.cfg" TEMP_FOLDER = "Temp" - SOC_TIMEOUT = 15 - REPORT_TIME = 5*60 + SOC_TIMEOUT = 10 + REPORT_TIME = 300 DONATE_LVL = 0 + RASPI_LEDS = "y" + RASPI_CPU_IOT = "y" + disable_title = False try: - # Raspberry Pi latin users can't display this character + # Raspberry Pi latin encoding users can't display this character BLOCK = " ‖ " "‖".encode(sys.stdout.encoding) except: @@ -145,7 +180,7 @@ class Settings: or bool(os.name == "nt" and os.environ.get("WT_SESSION"))): # Windows' cmd does not support emojis, shame! - # And some codecs same, for example the Latin-1 encoding don`t support emoji + # Same for different encodinsg, for example the latin encoding doesn't support them try: "⛏ ⚙".encode(sys.stdout.encoding) # if the terminal support emoji PICK = " ⛏" @@ -154,6 +189,30 @@ class Settings: PICK = "" COG = " @" + +def title(title: str): + if not Settings.disable_title: + if osname == 'nt': + """ + Changing the title in Windows' cmd + is easy - just use the built-in + title command + """ + ossystem('title ' + title) + else: + """ + Most *nix terminals use + this escape sequence to change + the console window title + """ + try: + print('\33]0;' + title + '\a', end='') + sys.stdout.flush() + except Exception as e: + debug_output("Error setting title: " +str(e)) + Settings.disable_title = True + + def check_updates(): """ Function that checks if the miner is updated. @@ -175,7 +234,7 @@ def check_updates(): if float(Settings.VER) < float(data["tag_name"]): # If is outdated update = input(Style.BRIGHT + get_string("new_version")) - if update == "Y" or update == "y": + if update.lower() == "y" or update == "": pretty_print(get_string("updating"), "warning", "sys0") DATA_DIR = "Duino-Coin PC Miner " + str(data["tag_name"]) # Create new version config folder @@ -283,7 +342,6 @@ def check_updates(): pretty_print("Update aborted", "warning", "sys0") except Exception as e: print(e) - sys.exit() class Algorithms: @@ -300,18 +358,21 @@ def DUCOS1(last_h: str, exp_h: str, diff: int, eff: int): fasthash_supported = False if fasthash_supported: - time_start = time() + time_start = time_ns() hasher = libducohasher.DUCOHasher(bytes(last_h, encoding='ascii')) nonce = hasher.DUCOS1( bytes(bytearray.fromhex(exp_h)), diff, int(eff)) - time_elapsed = time() - time_start - hashrate = nonce / time_elapsed + time_elapsed = time_ns() - time_start + if time_elapsed > 0: + hashrate = 1e9 * nonce / time_elapsed + else: + return [nonce,0] return [nonce, hashrate] else: - time_start = time() + time_start = time_ns() base_hash = sha1(last_h.encode('ascii')) for nonce in range(100 * diff + 1): @@ -324,8 +385,11 @@ def DUCOS1(last_h: str, exp_h: str, diff: int, eff: int): sleep(eff / 100) if d_res == exp_h: - time_elapsed = time() - time_start - hashrate = nonce / time_elapsed + time_elapsed = time_ns() - time_start + if time_elapsed > 0: + hashrate = 1e9 * nonce / time_elapsed + else: + return [nonce,0] return [nonce, hashrate] @@ -364,7 +428,7 @@ def fetch_pool(retry_count=1): "info", "net0") response = requests.get( "https://server.duinocoin.com/getPool", - timeout=10).json() + timeout=Settings.SOC_TIMEOUT).json() if response["success"] == True: pretty_print(get_string("connecting_node") @@ -404,7 +468,7 @@ def load(donation_level): f"{Settings.DATA_DIR}/Donate.exe").is_file(): url = ('https://server.duinocoin.com/' + 'donations/DonateExecutableWindows.exe') - r = requests.get(url, timeout=15) + r = requests.get(url, timeout=Settings.SOC_TIMEOUT) with open(f"{Settings.DATA_DIR}/Donate.exe", 'wb') as f: f.write(r.content) @@ -426,7 +490,7 @@ def load(donation_level): return if not Path( f"{Settings.DATA_DIR}/Donate").is_file(): - r = requests.get(url, timeout=15) + r = requests.get(url, timeout=Settings.SOC_TIMEOUT) with open(f"{Settings.DATA_DIR}/Donate", "wb") as f: f.write(r.content) @@ -484,11 +548,23 @@ def get_prefix(symbol: str, return val + symbol +def get_rpi_temperature(): + output = Popen(args='cat /sys/class/thermal/thermal_zone0/temp', + stdout=PIPE, + shell=True).communicate()[0].decode() + return round(int(output) / 1000, 2) + + def periodic_report(start_time, end_time, shares, blocks, hashrate, uptime): """ Displays nicely formated uptime stats """ + raspi_iot_reading = "" + + if running_on_rpi and user_settings["raspi_cpu_iot"] == "y": + raspi_iot_reading = f"{get_string('rpi_cpu_temp')} {get_rpi_temperature()}°C" + seconds = round(end_time - start_time) pretty_print(get_string("periodic_mining_report") + Fore.RESET + Style.NORMAL @@ -506,7 +582,8 @@ def periodic_report(start_time, end_time, shares, + str(int(hashrate*seconds)) + get_string("report_body6") + get_string("total_mining_time") - + str(uptime), "success") + + str(uptime) + + raspi_iot_reading + "\n", "success") def calculate_uptime(start_time): @@ -528,9 +605,8 @@ def calculate_uptime(start_time): def pretty_print(msg: str = None, state: str = "success", - sender: str = "sys0"): - global printlock - + sender: str = "sys0", + print_queue = None): """ Produces nicely formatted CLI output for messages: HH:MM:S |sender| msg @@ -551,39 +627,66 @@ def pretty_print(msg: str = None, else: fg_color = Fore.YELLOW - with printlock: - print(Fore.WHITE + datetime.now().strftime(Style.DIM + "%H:%M:%S ") - + Style.BRIGHT + bg_color + " " + sender + " " - + Back.RESET + " " + fg_color + msg.strip()) + if print_queue != None: + print_queue.append( + Fore.WHITE + datetime.now().strftime(Style.DIM + "%H:%M:%S ") + + Style.RESET_ALL + Style.BRIGHT + bg_color + " " + sender + " " + + Style.NORMAL + Back.RESET + " " + fg_color + msg.strip()) + else: + print( + Fore.WHITE + datetime.now().strftime(Style.DIM + "%H:%M:%S ") + + Style.RESET_ALL + Style.BRIGHT + bg_color + " " + sender + " " + + Style.NORMAL + Back.RESET + " " + fg_color + msg.strip()) def share_print(id, type, accept, reject, - total_hashrate, + thread_hashrate, total_hashrate, computetime, diff, ping, - back_color, reject_cause=None): + back_color, reject_cause=None, + print_queue = None): """ Produces nicely formatted CLI output for shares: HH:MM:S |cpuN| ⛏ Accepted 0/0 (100%) ∙ 0.0s ∙ 0 kH/s ⚙ diff 0 k ∙ ping 0ms """ - total_hashrate = get_prefix("H/s", total_hashrate, 2) + thread_hashrate = get_prefix("H/s", thread_hashrate, 2) + total_hashrate = get_prefix("H/s", total_hashrate, 1) diff = get_prefix("", int(diff), 0) + def _blink_builtin(led="green"): + if led == "green": + os.system( + 'echo 1 | sudo tee /sys/class/leds/led0/brightness >/dev/null 2>&1') + sleep(0.1) + os.system( + 'echo 0 | sudo tee /sys/class/leds/led0/brightness >/dev/null 2>&1') + else: + os.system( + 'echo 1 | sudo tee /sys/class/leds/led1/brightness >/dev/null 2>&1') + sleep(0.1) + os.system( + 'echo 0 | sudo tee /sys/class/leds/led1/brightness >/dev/null 2>&1') + if type == "accept": + if running_on_rpi and user_settings["raspi_leds"] == "y": + _blink_builtin() share_str = get_string("accepted") fg_color = Fore.GREEN elif type == "block": + if running_on_rpi and user_settings["raspi_leds"] == "y": + _blink_builtin() share_str = get_string("block_found") fg_color = Fore.YELLOW else: + if running_on_rpi and user_settings["raspi_leds"] == "y": + _blink_builtin("red") share_str = get_string("rejected") if reject_cause: share_str += f"{Style.NORMAL}({reject_cause}) " fg_color = Fore.RED - with printlock: - print(Fore.WHITE + datetime.now().strftime(Style.DIM + "%H:%M:%S ") - + Fore.WHITE + Style.BRIGHT + back_color + Fore.RESET + print_queue.append(Fore.WHITE + datetime.now().strftime(Style.DIM + "%H:%M:%S ") + + Style.RESET_ALL + Fore.WHITE + Style.BRIGHT + back_color + f" cpu{id} " + Back.RESET + fg_color + Settings.PICK + share_str + Fore.RESET + f"{accept}/{(accept + reject)}" + Fore.YELLOW @@ -591,11 +694,25 @@ def share_print(id, type, + Style.NORMAL + Fore.RESET + f" ∙ {('%04.1f' % float(computetime))}s" + Style.NORMAL + " ∙ " + Fore.BLUE + Style.BRIGHT - + str(total_hashrate) + Fore.RESET + Style.NORMAL - + Settings.COG + f" diff {diff} ∙ " + Fore.CYAN + + f"{thread_hashrate}" + Style.DIM + + f" ({total_hashrate} {get_string('hashrate_total')})" + Fore.RESET + Style.NORMAL + + Settings.COG + f" {get_string('diff')} {diff} ∙ " + Fore.CYAN + f"ping {(int(ping))}ms") +def print_queue_handler(print_queue): + """ + Prevents broken console logs with many threads + """ + while True: + if len(print_queue): + message = print_queue[0] + with printlock: + print(message) + print_queue.pop(0) + sleep(0.01) + + def get_string(string_name): """ Gets a string from the language file @@ -608,22 +725,37 @@ def get_string(string_name): return string_name +def has_mining_key(username): + try: + response = requests.get( + "https://server.duinocoin.com/mining_key" + + "?u=" + username, + timeout=10 + ).json() + return response["has_key"] + except Exception as e: + debug_output("Error checking for mining key: " + str(e)) + return False + + def check_mining_key(user_settings): if user_settings["mining_key"] != "None": - key = b64.b64decode(user_settings["mining_key"]).decode('utf-8') + key = '&k=' + urllib.parse.quote(b64.b64decode(user_settings["mining_key"]).decode('utf-8')) else: key = '' response = requests.get( "https://server.duinocoin.com/mining_key" + "?u=" + user_settings["username"] - + "&k=" + key, - timeout=10 + + key, + timeout=Settings.SOC_TIMEOUT ).json() + debug_output(response) + + if response["success"] and not response["has_key"]: + # If user doesn't have a mining key - if response["success"] and not response["has_key"]: # if the user doesn't have a mining key user_settings["mining_key"] = "None" - configparser["PC Miner"] = user_settings with open(Settings.DATA_DIR + Settings.SETTINGS_FILE, "w") as configfile: @@ -633,14 +765,16 @@ def check_mining_key(user_settings): return if not response["success"]: + if response["message"] == "Too many requests": + debug_output("Skipping mining key check - getting 429") + return if user_settings["mining_key"] == "None": - pretty_print( - get_string("mining_key_required"), - "warning" - ) - - mining_key = input("Enter your mining key: ") - user_settings["mining_key"] = b64.b64encode(mining_key.encode("utf-8")).decode('utf-8') + pretty_print(get_string("mining_key_required"), "warning") + mining_key = input("\t\t" + get_string("ask_mining_key") + + Style.BRIGHT + Fore.YELLOW) + if mining_key == "": mining_key = "None" #replace empty input with "None" key + user_settings["mining_key"] = b64.b64encode( + mining_key.encode("utf-8")).decode('utf-8') configparser["PC Miner"] = user_settings with open(Settings.DATA_DIR + Settings.SETTINGS_FILE, @@ -650,15 +784,13 @@ def check_mining_key(user_settings): sleep(1.5) check_mining_key(user_settings) else: - pretty_print( - get_string("invalid_mining_key"), - "error" - ) - - retry = input("You want to retry? (y/n): ") - if retry == "y" or retry == "Y": - mining_key = input("Enter your mining key: ") - user_settings["mining_key"] = b64.b64encode(mining_key.encode("utf-8")).decode('utf-8') + pretty_print(get_string("invalid_mining_key"), "error") + retry = input(get_string("key_retry")) + if not retry or retry == "y" or retry == "Y": + mining_key = input(get_string("ask_mining_key")) + if mining_key == "": mining_key = "None" #replace empty input with "None" key + user_settings["mining_key"] = b64.b64encode( + mining_key.encode("utf-8")).decode('utf-8') configparser["PC Miner"] = user_settings with open(Settings.DATA_DIR + Settings.SETTINGS_FILE, @@ -693,7 +825,7 @@ def greeting(): print("\n" + Style.DIM + Fore.YELLOW + Settings.BLOCK + Fore.YELLOW + Style.BRIGHT + get_string("banner") + Style.RESET_ALL + Fore.MAGENTA + " (" + str(Settings.VER) + ") " - + Fore.RESET + "2019-2022") + + Fore.RESET + "2019-2025") print(Style.DIM + Fore.YELLOW + Settings.BLOCK + Style.NORMAL + Fore.YELLOW + "https://github.com/revoxhere/duino-coin") @@ -731,6 +863,11 @@ def greeting(): + Style.NORMAL + Fore.RESET + get_string("rig_identifier") + Style.BRIGHT + Fore.YELLOW + user_settings["identifier"]) + print(Style.DIM + Fore.YELLOW + Settings.BLOCK + + Style.NORMAL + Fore.RESET + get_string("using_config") + + Style.BRIGHT + Fore.YELLOW + + str(Settings.DATA_DIR + Settings.SETTINGS_FILE)) + print(Style.DIM + Fore.YELLOW + Settings.BLOCK + Style.NORMAL + Fore.RESET + str(greeting) + ", " + Style.BRIGHT + Fore.YELLOW @@ -750,7 +887,7 @@ def preload(): with open(Settings.DATA_DIR + Settings.TRANSLATIONS_FILE, "wb") as f: f.write(requests.get(Settings.TRANSLATIONS, - timeout=10).content) + timeout=Settings.SOC_TIMEOUT).content) with open(Settings.DATA_DIR + Settings.TRANSLATIONS_FILE, "r", encoding=Settings.ENCODING) as file: @@ -765,6 +902,8 @@ def preload(): lang = "polish" elif locale.startswith("fr"): lang = "french" + elif locale.startswith("jp"): + lang = "japanese" elif locale.startswith("fa"): lang = "farsi" elif locale.startswith("mt"): @@ -783,8 +922,10 @@ def preload(): lang = "italian" elif locale.startswith("sk"): lang = "slovak" + if locale.startswith("zh_TW"): + lang = "chinese_Traditional" elif locale.startswith("zh"): - lang = "chinese_simplified" + lang = "chinese_simplified" elif locale.startswith("th"): lang = "thai" elif locale.startswith("ko"): @@ -793,6 +934,8 @@ def preload(): lang = "indonesian" elif locale.startswith("cz"): lang = "czech" + elif locale.startswith("fi"): + lang = "finnish" else: lang = "english" else: @@ -811,24 +954,35 @@ def load_cfg(): Loads miner settings file or starts the config tool """ if not Path(Settings.DATA_DIR + Settings.SETTINGS_FILE).is_file(): - print(get_string("basic_config_tool") + print(Style.BRIGHT + + get_string("basic_config_tool") + Settings.DATA_DIR + get_string("edit_config_file_warning") + "\n" + + Style.RESET_ALL + get_string("dont_have_account") + Fore.YELLOW + get_string("wallet") + Fore.RESET + get_string("register_warning")) - username = input(get_string("ask_username") + Style.BRIGHT) - if not username: - username = choice(["revox", "Bilaboz", "JoyBed", "Connor2"]) - - mining_key = input(Style.RESET_ALL + get_string("ask_mining_key") + Style.BRIGHT) - if not mining_key: - mining_key = "None" - else: + correct_username = False + while not correct_username: + username = input(get_string("ask_username") + Style.BRIGHT) + if not username: + username = choice(["revox", "Bilaboz"]) + + r = requests.get(f"https://server.duinocoin.com/users/{username}", + timeout=Settings.SOC_TIMEOUT).json() + correct_username = r["success"] + if not correct_username: + print(get_string("incorrect_username")) + + mining_key = "None" + if has_mining_key(username): + mining_key = input(Style.RESET_ALL + + get_string("ask_mining_key") + + Style.BRIGHT) mining_key = b64.b64encode(mining_key.encode("utf-8")).decode('utf-8') algorithm = "DUCO-S1" @@ -851,11 +1005,11 @@ def load_cfg(): if not threads: threads = cpu_count() - if int(threads) > 8: - threads = 8 - pretty_print( - Style.BRIGHT - + get_string("max_threads_notice")) + if int(threads) > 16: + threads = 16 + print(Style.BRIGHT + Fore.BLUE + + get_string("max_threads_notice") + + Style.RESET_ALL) elif int(threads) < 1: threads = 1 @@ -898,18 +1052,20 @@ def load_cfg(): donation_level = 0 configparser["PC Miner"] = { - "username": username, - "mining_key": mining_key, - "intensity": intensity, - "threads": threads, - "start_diff": start_diff, - "donate": int(donation_level), - "identifier": rig_id, - "algorithm": algorithm, - "language": lang, - "soc_timeout": Settings.SOC_TIMEOUT, - "report_sec": Settings.REPORT_TIME, - "discord_rp": "y"} + "username": username, + "mining_key": mining_key, + "intensity": intensity, + "threads": threads, + "start_diff": start_diff, + "donate": int(donation_level), + "identifier": rig_id, + "algorithm": algorithm, + "language": lang, + "soc_timeout": Settings.SOC_TIMEOUT, + "report_sec": Settings.REPORT_TIME, + "raspi_leds": Settings.RASPI_LEDS, + "raspi_cpu_iot": Settings.RASPI_CPU_IOT, + "discord_rp": "y"} with open(Settings.DATA_DIR + Settings.SETTINGS_FILE, "w") as configfile: @@ -935,16 +1091,15 @@ def m_connect(id, pool): Client.send("MOTD") motd = Client.recv(512).replace("\n", "\n\t\t") - pretty_print("MOTD: " + Fore.RESET + Style.NORMAL + pretty_print(get_string("motd") + Fore.RESET + Style.NORMAL + str(motd), "success", "net" + str(id)) if float(POOL_VER) <= Settings.VER: pretty_print(get_string("connected") + Fore.RESET + Style.NORMAL + get_string("connected_server") - + str(POOL_VER) + ", " + pool[0] + ":" - + str(pool[1]) + ")", "success", - "net" + str(id)) + + str(POOL_VER) + ", " + pool[0] +")", + "success", "net" + str(id)) else: pretty_print(get_string("outdated_miner") + str(Settings.VER) + ") -" @@ -966,22 +1121,24 @@ def mine(id: int, user_settings: list, blocks: int, pool: tuple, accept: int, reject: int, hashrate: list, - single_miner_id: str): + single_miner_id: str, + print_queue): """ Main section that executes the functionalities from the sections above. """ - using_algo = get_string("using_algo") pretty_print(get_string("mining_thread") + str(id) + get_string("mining_thread_starting") + Style.NORMAL + Fore.RESET + using_algo + Fore.YELLOW + str(user_settings["intensity"]) + "% " + get_string("efficiency"), - "success", "sys"+str(id)) + "success", "sys"+str(id), print_queue=print_queue) last_report = time() r_shares, last_shares = 0, 0 while True: + accept.value = 0 + reject.value = 0 try: Miner.m_connect(id, pool) while True: @@ -991,6 +1148,11 @@ def mine(id: int, user_settings: list, else: key = user_settings["mining_key"] + raspi_iot_reading = "" + if user_settings["raspi_cpu_iot"] == "y" and running_on_rpi: + # * instead of the degree symbol because nodes use basic encoding + raspi_iot_reading = f"CPU temperature:{get_rpi_temperature()}*C" + while True: job_req = "JOB" Client.send(job_req @@ -1000,7 +1162,8 @@ def mine(id: int, user_settings: list, + str(user_settings["start_diff"]) + Settings.SEPARATOR + str(key) - ) + + Settings.SEPARATOR + + str(raspi_iot_reading)) job = Client.recv().split(Settings.SEPARATOR) if len(job) == 3: @@ -1008,7 +1171,7 @@ def mine(id: int, user_settings: list, else: pretty_print( "Node message: " + str(job[1]), - "warning") + "warning", print_queue=print_queue) sleep(3) while True: @@ -1034,6 +1197,13 @@ def mine(id: int, user_settings: list, hashrate[id] = result[1] total_hashrate = sum(hashrate.values()) + prep_identifier = user_settings['identifier'] + if running_on_rpi: + if prep_identifier != "None": + prep_identifier += " - RPi" + else: + prep_identifier = "Raspberry Pi" + while True: Client.send(f"{result[0]}" + Settings.SEPARATOR @@ -1042,40 +1212,51 @@ def mine(id: int, user_settings: list, + "Official PC Miner" + f" {Settings.VER}" + Settings.SEPARATOR - + f"{user_settings['identifier']}" + + f"{prep_identifier}" + Settings.SEPARATOR + Settings.SEPARATOR + f"{single_miner_id}") time_start = time() - feedback = Client.recv( - ).split(Settings.SEPARATOR) + feedback = Client.recv().split(Settings.SEPARATOR) ping = (time() - time_start) * 1000 if feedback[0] == "GOOD": accept.value += 1 share_print(id, "accept", accept.value, reject.value, - total_hashrate, + hashrate[id],total_hashrate, computetime, job[2], ping, - back_color) + back_color, + print_queue=print_queue) elif feedback[0] == "BLOCK": accept.value += 1 blocks.value += 1 share_print(id, "block", accept.value, reject.value, - total_hashrate, + hashrate[id],total_hashrate, computetime, job[2], ping, - back_color) + back_color, + print_queue=print_queue) elif feedback[0] == "BAD": reject.value += 1 share_print(id, "reject", accept.value, reject.value, - total_hashrate, + hashrate[id], total_hashrate, computetime, job[2], ping, - back_color, feedback[1]) + back_color, feedback[1], + print_queue=print_queue) + + if accept.value % 100 == 0 and accept.value > 1: + pretty_print( + f"{get_string('surpassed')} {accept.value} {get_string('surpassed_shares')}", + "success", "sys0", print_queue=print_queue) + + title(get_string('duco_python_miner') + str(Settings.VER) + + f') - {accept.value}/{(accept.value + reject.value)}' + + get_string('accepted_shares')) if id == 0: end_time = time() @@ -1094,12 +1275,14 @@ def mine(id: int, user_settings: list, break except Exception as e: pretty_print(get_string("error_while_mining") - + " " + str(e), "error", "net" + str(id)) + + " " + str(e), "error", "net" + str(id), + print_queue=print_queue) sleep(5) break except Exception as e: pretty_print(get_string("error_while_mining") - + " " + str(e), "error", "net" + str(id)) + + " " + str(e), "error", "net" + str(id), + print_queue=print_queue) class Discord_rp: @@ -1110,7 +1293,10 @@ def connect(): RPC.connect() Thread(target=Discord_rp.update).start() except Exception as e: - pretty_print(get_string("Error launching Discord RPC thread: " + str(e))) + pretty_print( + get_string("discord_launch_error") + + Style.NORMAL + Fore.RESET + " " + str(e), + "warning") def update(): @@ -1125,13 +1311,16 @@ def update(): large_image="ducol", large_text="Duino-Coin, " + "a coin that can be mined with almost everything" - + ", including AVR boards", - buttons=[{"label": "Visit duinocoin.com", + + ", including Arduino boards", + buttons=[{"label": "Learn more", "url": "https://duinocoin.com"}, - {"label": "Join the Discord", + {"label": "Join the Duino Discord", "url": "https://discord.gg/k48Ht5y"}]) except Exception as e: - pretty_print(get_string("Error updating Discord RPC thread: " + str(e))) + pretty_print( + get_string("discord_update_error" + + Style.NORMAL + Fore.RESET + " " + str(e)), + "warning") sleep(15) @@ -1139,7 +1328,7 @@ class Fasthash: def init(): try: """ - Check wheter libducohash fasthash is available + Check whether libducohash fasthash is available to speed up the DUCOS1 work, created by @HGEpro """ import libducohasher @@ -1160,7 +1349,6 @@ def init(): + "How-to-compile-fasthash-accelerations\n" + f"(Libducohash couldn't be loaded: {str(e)})" ).replace("\n", "\n\t\t"), 'warning', 'sys0') - sleep(15) def load(): if os.name == 'nt': @@ -1168,7 +1356,7 @@ def load(): pretty_print(get_string("fasthash_download"), "info") url = ('https://server.duinocoin.com/' + 'fasthash/libducohashWindows.pyd') - r = requests.get(url, timeout=10) + r = requests.get(url, timeout=Settings.SOC_TIMEOUT) with open(f"libducohasher.pyd", 'wb') as f: f.write(r.content) return @@ -1193,11 +1381,10 @@ def load(): + "How-to-compile-fasthash-accelerations\n" + f"(Invalid processor architecture: {osprocessor()})" ).replace("\n", "\n\t\t"), 'warning', 'sys0') - sleep(15) return if not Path("libducohasher.so").is_file(): pretty_print(get_string("fasthash_download"), "info") - r = requests.get(url, timeout=10) + r = requests.get(url, timeout=Settings.SOC_TIMEOUT) with open("libducohasher.so", "wb") as f: f.write(r.content) return @@ -1209,7 +1396,6 @@ def load(): + "How-to-compile-fasthash-accelerations\n" + f"(Invalid OS: {os.name})" ).replace("\n", "\n\t\t"), 'warning', 'sys0') - sleep(15) return @@ -1221,6 +1407,7 @@ def load(): from multiprocessing import freeze_support freeze_support() signal(SIGINT, handler) + title(f"{get_string('duco_python_miner')}{str(Settings.VER)})") if sys.platform == "win32": os.system('') # Enable VT100 Escape Sequence for WINDOWS 10 Ver. 1607 @@ -1232,6 +1419,8 @@ def load(): reject = Manager().Value("i", 0) blocks = Manager().Value("i", 0) hashrate = Manager().dict() + print_queue = Manager().list() + Thread(target=print_queue_handler, args=[print_queue]).start() user_settings = Miner.load_cfg() Miner.greeting() @@ -1239,6 +1428,41 @@ def load(): Fasthash.load() Fasthash.init() + if not "raspi_leds" in user_settings: + user_settings["raspi_leds"] = "y" + if not "raspi_cpu_iot" in user_settings: + user_settings["raspi_cpu_iot"] = "y" + + if user_settings["raspi_leds"] == "y": + try: + with io.open('/sys/firmware/devicetree/base/model', 'r') as m: + if 'raspberry pi' in m.read().lower(): + running_on_rpi = True + pretty_print( + get_string("running_on_rpi") + + Style.NORMAL + Fore.RESET + " " + + get_string("running_on_rpi2"), "success") + except: + running_on_rpi = False + + if running_on_rpi: + # Prepare onboard LEDs to be controlled + os.system( + 'echo gpio | sudo tee /sys/class/leds/led1/trigger >/dev/null 2>&1') + os.system( + 'echo gpio | sudo tee /sys/class/leds/led0/trigger >/dev/null 2>&1') + + if user_settings["raspi_cpu_iot"] == "y" and running_on_rpi: + try: + temp = get_rpi_temperature() + pretty_print(get_string("iot_on_rpi") + + Style.NORMAL + Fore.RESET + " " + + f"{get_string('iot_on_rpi2')} {temp}°C", + "success") + except Exception as e: + print(e) + user_settings["raspi_cpu_iot"] = "n" + try: check_mining_key(user_settings) except Exception as e: @@ -1254,10 +1478,15 @@ def load(): single_miner_id = randint(0, 2811) threads = int(user_settings["threads"]) - if threads > 12: - threads = 12 + if threads > 16: + threads = 16 pretty_print(Style.BRIGHT + get_string("max_threads_notice")) + if threads > cpu_count(): + pretty_print(Style.BRIGHT + + get_string("system_threads_notice"), + "warning") + sleep(10) fastest_pool = Client.fetch_pool() @@ -1265,10 +1494,10 @@ def load(): p = Process(target=Miner.mine, args=[i, user_settings, blocks, fastest_pool, accept, reject, - hashrate, single_miner_id]) + hashrate, single_miner_id, + print_queue]) p_list.append(p) p.start() - sleep(0.05) if user_settings["discord_rp"] == 'y': Discord_rp.connect() diff --git a/README.md b/README.md index 750592e2..adb28ebd 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,27 @@ -

+

+

+ Simple, eco-friendly, centralized coin that can be mined with Arduinos, ESP boards, Raspberry Pis, computers, and many more + (including Wi-Fi routers, smart TVs, smartphones, smartwatches, SBCs and other MCUs). +


+ + @@ -42,10 +48,14 @@ - + + + + + - + @@ -57,32 +67,25 @@ -
- -

- Duino-Coin is a coin that can be mined with Arduinos, ESP8266/32 boards, Raspberry Pis, computers, and many more - (including Wi-Fi routers, smart TVs, smartphones, smartwatches, SBCs, MCUs or even GPUs) -

- +

| Key features | Technical specifications | (Some of many) supported boards | |-|-|-| -| 💻 Supported by a large number of platforms
👥 A fast-growing community
💱 Easy to use & exchange
(on DUCO Exchange, Node-S, JustSwap, SushiSwap)
🌎 Available everywhere
:new: Fully original & open-source project
🌳 Beginner & eco-friendly
💰 Cost-effective & easy to mine | ⚒️ Algorithm: DUCO-S1
♐ Rewards: supported by "Kolka system"
helping to reward miners fairly
⚡ Transaction time: Instant
🪙 Coin supply: Infinite
(with burning)
🔤 Ticker: DUCO (ᕲ)
🔢 Decimals: up to 20 | ♾️ Arduinos
(Uno, Nano, Mega, Due, Pro Mini, etc.)
📶 ESP8266s
(NodeMCU, Wemos, etc.)
📶 ESP32s
(ESP-WROOM, ESP32-CAM, etc.)
🍓 Raspberry Pis
(1, 2, Zero (W/WH), 3, 4, Pico, 400)
🍊 Orange Pis
(Zero, Zero 2, PC, Plus, etc.)
⚡ Teensy 4.1 boards | +| 💻 Supported by a large number of platforms
👥 A fast-growing community
💱 Easy to use & exchange
(on DUCO Exchange, JustSwap, SushiSwap)
🌎 Available everywhere
:new: Fully original & open-source project
🌳 Beginner & eco-friendly
💰 Cost-effective & easy to mine | ⚒️ Algorithm: DUCO-S1
♐ Rewards: supported by "Kolka system"
helping to reward miners fairly
⚡ Transaction time: Instant
🪙 Coin supply: Infinite
(with burning)
🔤 Ticker: DUCO (ᕲ)
🔢 Decimals: up to 20 | ♾️ Arduinos
(Uno, Nano, Mega, Due, Pro Mini, etc.)
📶 ESP8266s
(NodeMCU, Wemos, etc.)
📶 ESP32s
(ESP-WROOM, ESP32-CAM, etc.)
🍓 Raspberry Pis
(1, 2, Zero (W/WH), 3, 4, Pico, 400, 5)
🍊 Orange Pis
(Zero, Zero 2, PC, Plus, etc.)
⚡ Teensy 4.1 boards | ## Getting started -#### The easiest way to get started with Duino-Coin is to download [the latest release](https://github.com/revoxhere/duino-coin/releases/latest) for your OS.
-After downloading the release, unzip it and launch the desired program.
-There are no dependencies required. +### The easy way +Get started with Duino-Coin by downloading [the latest release](https://github.com/revoxhere/duino-coin/releases/latest) for your OS.
+Then unzip it and launch the desired program. There are no dependencies required. If you need help, you can take a look at the official getting started guides located on the official website.
FAQ and troubleshooting help can be found in the [Wikis](https://github.com/revoxhere/duino-coin/wiki).
+### The hard way -### Manual installation - -#### Linux +#### Linux (manual installation) ```BASH sudo apt update @@ -90,11 +93,11 @@ sudo apt install python3 python3-pip git python3-pil python3-pil.imagetk -y # In git clone https://github.com/revoxhere/duino-coin # Clone Duino-Coin repository cd duino-coin python3 -m pip install -r requirements.txt # Install pip dependencies -```` +``` After doing this, you are good to go with launching the software (e.g. `python3 PC_Miner.py`). -#### Windows +#### Windows (manual installation) 1. Download and install [Python 3](https://www.python.org/downloads/) (make sure you add Python and Pip to your PATH) 2. Download [the Duino-Coin repository](https://github.com/revoxhere/duino-coin/archive/master.zip) @@ -103,27 +106,17 @@ After doing this, you are good to go with launching the software (e.g. `python3 After doing this, you are good to go with launching the software (just double click on desired `.py` files or type `py PC_Miner.py` in the command prompt). -### Automatic installation - -#### Raspberry Pi - -Note: If this script doesn't work try installing manually. +#### Raspberry Pi (automatic installation) ```BASH -# Download the script file wget https://raw.githubusercontent.com/revoxhere/duino-coin/master/Tools/duco-install-rpi.sh - -# Change the file permissions sudo chmod a+x duco-install-rpi.sh - -# Run the script ./duco-install-rpi.sh ``` -## DUCO & wDUCO - -Duino-Coin is a hybrid currency, meaning that it can be converted to wDUCO which is DUCO wrapped on the [Tron](https://tron.network) network (as a token). Currently there aren't many uses for it, other than just storing funds in an external wallet or exchanging wDUCO to another token on JustSwap. A tutorial on using wDUCO is available in the [wDUCO wiki](https://github.com/revoxhere/duino-coin/wiki/wDUCO-tutorial). +## DUCO, wDUCO, bscDUCO, maticDUCO & celoDUCO +Duino-Coin is a hybrid currency providing support both to centralized and decentralized ways of storing funds. Duino-Coins can be converted to wDUCO, bscDUCO or others which are the same Duino-Coins but "wrapped" (stored) on other networks as tokens. An example tutorial on using wDUCO is available in the [wDUCO wiki](https://github.com/revoxhere/duino-coin/wiki/wDUCO-tutorial). Coins can be wrapped directly from your web Wallet - click the Wrap Coins button to start. ## Development @@ -141,54 +134,61 @@ How to help? Server source code, documentation for API calls and official libraries for developing your own apps for Duino-Coin are available in the [useful tools](https://github.com/revoxhere/duino-coin/tree/useful-tools) branch. -## Benchmarks of officially tested devices and boards +## Version 4.0 reward goals -
- - Since that table is getting really long, it's collapsed by default. Click this text to expand it! - +Captured at normal multiplier (no weekend boost) +| Device | Hashrate | Threads | DUCO/day | Power usage | +|-----------------------|---------------------|---------|----------|-------------| +| Arduino | 343 H/s | 1 | 12 | <0.5 W +| ESP32 | 170-180 kH/s | 2 | 10 | 1.5-2 W +| ESP32-S2/C3 | 85-96 kH/s | 1 | 8 | 1-1.5 W +| ESP8266 | 66 kH/s | 1 | 6 | 1-1.5 W +| Raspberry Pi 4 (LOW) | 1 MH/s (no fasthash)| 4 | 6-7 | 6.5 W +| Raspberry Pi 4 (MED) | 5.4 MH/s (fasthash) | 4 | 7-8 | 6.5 W +| Low power PCs | | 4 | 4-6 | - +| Medium | | 4-8 | 6-10 | - +| High end | | 8+ | 10-12 | - - ### Please note that the rewards depend on a lot of factors and the table below is just for orientation purposes. +
+ Other tested devices and their benchmarks - | Device/CPU/SBC/MCU/chip | Average hashrate
(all threads) | Mining
threads | Power
usage | Average
DUCO/day | - |-----------------------------------------------------------|-----------------------------------|-------------------|----------------|---------------------| - | Arduino Pro Mini, Uno, Nano etc.
(Atmega 328p/pb/16u2) | 196 H/s | 1 | 0.2 W | 9-10 | - | Teensy 4.1 (soft cryptography) | 80 kH/s | 1 | 0.5 W | - | - | NodeMCU, Wemos D1 etc.
(ESP8266) | 10 kH/s (160MHz) 4.9 kH/s (80Mhz) | 1 | 0.6 W | 6-7 | - | ESP32 | 33 kH/s | 2 | 1 W | 8-9 | - | Raspberry Pi Zero | 18 kH/s | 1 | 1.1 W | - | - | Raspberry Pi 3 | 440 kH/s | 4 | 5.1 W | 4-5 | - | Raspberry Pi 4 | 740 kH/s (32bit) | 4 | 6.4 W | 10 | - | ODROID XU4 | 1.0 MH/s | 8 | 5 W | 9 | - | Atomic Pi | 690 kH/s | 4 | 6 W | - | - | Orange Pi Zero 2 | 740 kH/s | 4 | 2.55 W | - | - | Khadas Vim 2 Pro | 1.12 MH/s | 8 | 6.2 W | - | - | Libre Computers Tritium H5CC | 480 kH/s | 4 | 5 W | - | - | Libre Computers Le Potato | 410 kH/s | 4 | 5 W | - | - | Pine64 ROCK64 | 640 kH/s | 4 | 5 W | - | - | Intel Celeron G1840 | 1.25 MH/s | 2 | - | 3.3 | - | Intel Core i5-2430M | 1.18 MH/s | 4 | - | 6.5 | - | Intel Core i5-3230M | 1.52 MH/s | 4 | - | 7.2 | - | Intel Core i5-5350U | 1.35 MH/s | 4 | - | 6.0 | - | Intel Core i5-7200U | 1.62 MH/s | 4 | - | 7.5 | - | Intel Core i5-8300H | 3.67 MH/s | 8 | - | 9.1 | - | Intel Core i3-4130 | 1.45 MH/s | 4 | - | 3.7 | - | AMD Ryzen 5 2600 | 4.9 MH/s | 12 | 67 W | 15.44 | - - All tests were performed using the DUCO-S1 algorithm. This table will be actively updated. -
+Please note the DUCO/day column has been removed since version 4.0 changed the reward system. +| Device/CPU/SBC/MCU/chip | Average hashrate
(all threads) | Mining
threads | Power
usage | +|-----------------------------------------------------------|-----------------------------------|-------------------|----------------| +| Raspberry Pi Pico | 18 kH/s | 1 | 0.3 W | +| Raspberry Pi Zero | 18 kH/s | 1 | 1.1 W | +| Raspberry Pi 3 **(32bit)** | 440 kH/s | 4 | 5.1 W | +| Raspberry Pi 4 **(32bit)** | 740 kH/s | 4 | 6.4 W | +| Raspberry Pi 4 **(64bit, fasthash)** | 6.8 MH/s | 4 | 6.4 W | +| ODROID XU4 | 1.0 MH/s | 8 | 5 W | +| Atomic Pi | 690 kH/s | 4 | 6 W | +| Orange Pi Zero 2 | 740 kH/s | 4 | 2.55 W | +| Khadas Vim 2 Pro | 1.12 MH/s | 8 | 6.2 W | +| Libre Computers Tritium H5CC | 480 kH/s | 4 | 5 W | +| Libre Computers Le Potato | 410 kH/s | 4 | 5 W | +| Pine64 ROCK64 | 640 kH/s | 4 | 5 W | +| Intel Celeron G1840 | 1.25 MH/s | 2 | 53 W | +| Intel Core i5-2430M | 1.18 MH/s | 4 | 35 W | +| Intel Core i5-3230M | 1.52 MH/s | 4 | 35 W | +| Intel Core i5-5350U | 1.35 MH/s | 4 | 15 W | +| Intel Core i5-7200U | 1.62 MH/s | 4 | 15 W | +| Intel Core i5-8300H | 3.67 MH/s | 8 | 45 W | +| Intel Core i3-4130 | 1.45 MH/s | 4 | 54 W | +| AMD Ryzen 5 2600 | 4.9 MH/s | 12 | 65 W | +| AMD Ryzen R1505G **(fasthash)** | 8.5 MH/s | 4 | 35 W | +| Intel Core i7-11370H **(fasthash)** | 17.3 MH/s | 8 | 35 W | +| Realtek RTD1295 | 490 kH/s | 4 | - | +| Realtek RTD1295 **(fasthash)** | 3.89 MH/s | 4 | - | +
## Community-made softwares -
- - Since that list is getting really long, it's collapsed by default. Click this text to expand it - - - Please note that these softwares are not developed by us and we do not give any guarantees that use of them will not result in an account getting banned. Treat them as a curiosity. It's worth noting that using [nonceMiner](https://github.com/colonelwatch/nonceMiner) by colonelwatch **will get you banned**. +### Please note that these softwares are not developed by us and we do not give any guarantees that use of them will not result in an account getting banned if they get changed in the future. - ### Other miners known to work with Duino-Coin: + ### Miners made by the Duino-Coin community: + * [Dockerized Duino-Coin Miner](https://github.com/simeononsecurity/docker-duino-coin) - A Dockerized version of the Duino-Coin Miner by simeononsecurity + * :point_right: [**RP2040-HAT-MINING-C**](https://github.com/Wiznet/RP2040-HAT-MINING-C) - **WIZnet RP2040 mining stack** * [DuinoCoinEthernetMiner](https://github.com/Pumafron/DuinoCoinEthernetMiner) - Arduino Ethernet shield Miner by Pumafron * [STM8 DUCO Miner](https://github.com/BBS215/STM8_DUCO_miner) - STM8S firmware for mining DUCO by BBS215 * [DuinoCoinbyLabVIEW](https://github.com/ericddm/DuinoCoinbyLabVIEW) - miner for LabVIEW family by ericddm @@ -213,83 +213,55 @@ Server source code, documentation for API calls and official libraries for devel * [Teensy 4.1 code for Arduino IDE](https://github.com/revoxhere/duino-coin/blob/master/Unofficial%20miners/Teensy_code/Teensy_code.ino) by joaquinbvw ### Other tools: - * [Lua duino-coin](https://github.com/alberiolima/duino-coin) - Duino-Coin tools and miners in Lua by alberiolima + * [**Duinogotchi**](https://github.com/OSRdesign/duinogotchi) - Duino-Coin virtual pet project by OSRdesign * [Duino Miner](https://github.com/g7ltt/Duino-Miner) - Arduino Nano based DUCO miner files and documentation by g7ltt * [DUINO Mining Rig](https://repalmakershop.com/pages/duino-mining-rig) - 3D files, PCB designs and instructions for creating your own Duino rig by ReP_AL * [DuinoCoin-balance-Home-Assistant](https://github.com/NL647/DuinoCoin-balance-Home-Assistant) - addon for home assistant displaying your balance by NL647 - * [Duino Coin Status Monitor](https://github.com/TSltd/duino_coin) for 128x64 SSD1306 OLED and ESP8266 by TSltd * [ducopanel](https://github.com/ponsato/ducopanel) - a GUI app for controling your Duino-Coin miners by ponsato * [Duino AVR Monitor](https://www.microsoft.com/store/apps/9NJ7HPFSR9V5) - GUI Windows App for monitoring AVR devices mining DUCO by niknak * [Duino-Coin Arduino library](https://github.com/ricaun/arduino-DuinoCoin) by ricaun * [DuinoCoinI2C](https://github.com/ricaun/DuinoCoinI2C) - Use ESP8266/ESP32 as a master for Arduinos by ricaun - * [Duino-Coin Mining Dashboard](https://lulaschkas.github.io/duco-mining-dashboard/) and troubleshooting helper by Lulaschkas * [duco-miners](https://github.com/dansinclair25/duco-miners) CLI mining dashboard made by dansinclair25 * [Duco-Coin Symbol Icon ttf](https://github.com/SandUhrGucker/Duco-Coin-Symbol-Icon-ttf-.h) by SandUhrGucker * [DUCO Monitor](https://siunus.github.io/duco-monitor/) account statistics website by siunus - * [duino-tools](https://github.com/kyngs/duino-tools) written in Java by kyngs * [Duino Stats](https://github.com/Bilaboz/duino-stats) official Discord bot by Bilaboz * [DuCoWallet](https://github.com/viktor02/DuCoWallet) GUI Wallet by viktor02 * [Duco-widget-ios](https://github.com/naphob/duco-widget-ios) - a Duino-Coin iOS widget by Naphob + * [Duino Lookup](https://axorax.github.io/duino-lookup/) by axorax + * [Duino Miner Hassio Add-on](https://github.com/mavotronik/hassio-addons/tree/main/duino_miner_hassio_addon) by mavotronik + * [Home Assistant sensors package](https://github.com/mavotronik/Duinocoin_homeassistant) by mavotronik + * [ESPGUITOOL](https://github.com/CGameDev/ESPGUITOOL) by kazutokirigaya + * [DUCO Hashrate Monitor](https://gitlab.com/IT-Berater/twhashrate) hashrate java swing speedometer gui by IT-Berater - You may also view a similar list on the [website](https://duinocoin.com/apps). -
+ You may also view a similar list on the [website](https://duinocoin.com/apps). ## License -Duino-Coin is mostly distributed under the MIT License. See the `LICENSE` file for more information. +Duino-Coin is mostly distributed under the MIT License. See the `LICENSE` file for more information.
Some third-party included files may have different licenses - please check their `LICENSE` statements (usually at the top of the source code files). ## Terms of service -1. Duino-Coins ("DUCOs") are earned by miners with a process called mining.
-2. Mining is described as using DUCO-S1 algorithm (as explained in the Duino-Coin Whitepaper), in which finding a correct result to a mathematical problem gives the miner a reward.
-3. Mining can be officially done using CPUs, AVR boards (e.g. Arduino boards), Single-board computers (e.g. Raspberry Pi boards), ESP32/8266 boards with the usage of official miners (other officially allowed miners are described in the upper part of README).
-4. All miners need to use the difficulty tier made and suitable for them. -5. Mining on GPUs, FPGAs and other high-efficiency hardware is allowed, but using only the `EXTREME` mining difficulty.
-6. Any users using miners on difficulty not suited for their hardware (see the difficulty list) will be automatically throttled by being moved to correct difficulty tier.
-7. Any user that keeps trying to use lower difficulty than it's suited for may get temporarily blocked or permanently banned.
-8. Banning involves blocking the user from accessing his coins along with the removal of an account.
-9. Only coins earned legally are eligible for the exchange.
-10. Accounts may be suspended temporarily to investigate ("investigations") ToS violations ("violation" or "abuse").
-11. An exchange request made to the offical DUCO-Exchange ("the offical exchange") may be delayed and/or declined during investigations.
-12. Exchange requests made to the offical exchange may be declined due to ToS violations and/or low funding.
-13. Mining with free cloud hosting services (or free VPS services - e.g. Repl.it, GitHub Actions, etc.) is not allowed as it's unfair for others.
-14. A user's DUCOs may be burnt if a violation can be proven.
-15. These terms of service can change at any time without prior notice.
-16. Having alt accounts without a rational reason (e.g. for multi-mining) are not allowed - multiple accounts used on a single computer/network will be blocked, unless whitelisted.
-17. Sending transactions that promote other services or advertise something in any form is not allowed.
-18. Sending a lot of transactions in a short amount of time can trigger the Kolka system which will rate limit and/or block the user.
-19. Community-made softwares need to comply with the rules (terms of service, difficulty tiers, etc.) - abusing the system will lead to blocking of the software and/or the user(s).
-20. Accounts proven to be misleading in name or usage (impersonation, fake bots, etc.) are not allowed.
-21. Every Duino-Coin user agrees to comply with the above rules. Improper behavior will lead to blocking of the account.
+Our terms of service is available here: duinocoin.com/terms
## Privacy policy -1. On the master server we only store usernames, hashed passwords (with the help of bcrypt), account creation dates, last login times and e-mails of users as their data.
-2. E-mails are not publicly available and are only used for contacting user when needed, confirming exchanges on the DUCO-Exchange and receiving an occasional newsletter (planned for the future).
-3. Balances, transactions and mining-related data is publicly available in the JSON APIs.
-4. The privacy policy may be changed in the future, although users will receive a notification prior to the changes. +Our privacy policy is available here: duinocoin.com/privacy
+## Disclaimer +Our disclaimer is available here: duinocoin.com/disclaimer
-## Active project maintainers -* [@revoxhere](https://github.com/revoxhere/) - robik123.345@gmail.com (Lead Python dev, project founder) -* [@Bilaboz](https://github.com/bilaboz/) (Lead NodeJS dev) -* [@connorhess](https://github.com/connorhess) (Lead Python dev, Node-S owner) -* [@JoyBed](https://github.com/JoyBed) (Lead AVR dev) -* [@Yennefer](https://www.instagram.com/vlegle/) (Lead social manager) -* [@Tech1k](https://github.com/Tech1k/) - kristian@beyondcoin.io (Lead Webmaster and DUCO Developer) -* [@ygboucherk](https://github.com/ygboucherk) ([wDUCO](https://github.com/ygboucherk/wrapped-duino-coin-v2) dev) -* [@Lulaschkas](https://github.com/Lulaschkas) (Dev) -* [@joaquinbvw](https://github.com/joaquinbvw) (AVR dev) +## Active project maintainers -Big thanks to all the [contributors](https://github.com/revoxhere/duino-coin/graphs/contributors) that helped to develop the Duino-Coin project. +Originally created and maintained by [@revoxhere](https://github.com/revoxhere).
+Big thanks to all the [contributors](https://github.com/revoxhere/duino-coin/graphs/contributors) that helped to develop the Duino-Coin project.
+Visit [duinocoin.com/team](https://duinocoin.com/team.html) to view more information about the Duino Team.
-Project Link: [https://github.com/revoxhere/duino-coin/](https://github.com/revoxhere/duino-coin/) -
-Website Link: [https://duinocoin.com/](https://duinocoin.com/) -
+Established August 2019
+Project Link: [https://github.com/revoxhere/duino-coin/](https://github.com/revoxhere/duino-coin/)
+Website Link: [https://duinocoin.com/](https://duinocoin.com/)
Duino-Coin Status Page: [https://status.duinocoin.com](https://status.duinocoin.com) diff --git a/Resources/AVR_Miner_langs.json b/Resources/AVR_Miner_langs.json index 35325889..1bb2db73 100644 --- a/Resources/AVR_Miner_langs.json +++ b/Resources/AVR_Miner_langs.json @@ -16,8 +16,8 @@ "basic_config_tool": "\nDuino-Coin basic configuration tool\nEdit ", "edit_config_file_warning": "/Miner_config.cfg file later if you want to change it.", "dont_have_account": "Don't have an Duino-Coin account yet? Use ", - "wallet": "Wallet", - "register_warning": " to register on server.\n", + "wallet": "https://wallet.duinocoin.com", + "register_warning": " to register on the network.\n", "ask_username": "Enter your Duino-Coin username: ", "ports_message": "Configuration tool has found the following ports:", "ports_notice": "If you can't see your board here, make sure the it is properly connected and the program has access to it (admin/sudo rights).", @@ -81,11 +81,22 @@ "node_picker_unavailable": "Node picker doesn't seem to be responding properly - retrying in ", "node_picker_error": "Fatal error fetching server from the node picker - retrying in ", "connecting_node": " Retrieved mining node: ", - "new_version": "A new version is available, you want to update miner [Y/n] ? ", + "new_version": "A new version is available, do you want to update the miner [Y/n] ? ", "updating": "The miner is outdated. Updating....", - "ask_mining_key": "Enter your mining key (only required if you activated this option in the webwallet - press enter to skip): ", + "ask_mining_key": "Enter your mining key: ", "mining_key_required": "Mining key is required to mine on this account", - "invalid_mining_key": "The mining key you provided is invalid!" + "invalid_mining_key": "The mining key you provided is invalid!", + "incorrect_username": "The username you provided doesn't exist!", + "system_threads_notice": "Warning: you're trying to use more threads than you have.\n\t\tThis will cause unintended side effects such as your system becoming unresponsive.\n\t\tStarting in 10s", + "using_config": "Config file: ", + "motd": "Server message of the day: ", + "hashrate_test": "Hashrate test ended with ", + "hashrate_test_diff": ", assigned starting difficulty: ", + "diff": "diff.", + "hashrate_total": "total", + "surpassed": "Congrats for surpassing", + "surpassed_shares": "correct shares!", + "miner_is_outdated": "Miner is outdated" }, "indonesian": { "translation_autor": "rezafauzan945", @@ -104,7 +115,7 @@ "basic_config_tool": "\nalat konfigurasi dasar Duino-Coin \nRubah ", "edit_config_file_warning": "file /Miner_config.cfg jika ingin merubahnya nanti.", "dont_have_account": "Belum memiliki akun Duino-Coin? Gunakan ", - "wallet": "Wallet", + "wallet": "https://wallet.duinocoin.com", "register_warning": " untuk mendaftar ke server.\n", "ask_username": "Masukan username Duino-Coinmu: ", "ports_message": "Alat konfigurasi telah menemukan port berikut:", @@ -181,7 +192,7 @@ "greeting_afternoon": "Krásné odpoledne vespolek!", "greeting_evening": "Nádherný večer", "greeting_back": "Vítej zpátky", - "banner": "Oficiální Duino-Coin © Python AVR těžař", + "banner": "Oficiální Duino-Coin © Python AVR těžební program", "donation_level": "Úroveň daru vývojářům: ", "avr_on_port": "AVR deska(y) v portu(ech): ", "algorithm": "Algoritmus: ", @@ -189,7 +200,7 @@ "basic_config_tool": "\nDuino-Coin základní konfigurační nástroj\nEdit ", "edit_config_file_warning": "/Miner_config.cfg soubor můžeš editovat později.", "dont_have_account": "Ještě nemáš Duino-Coin účet? Použij ", - "wallet": "Peněženka", + "wallet": "https://wallet.duinocoin.com", "register_warning": " aby ses registroval se na serveru.\n", "ask_username": "Zadej své Duino-Coin uživatelské jméno: ", "ports_message": "Konfigurační nástroj našel desky na následujících portech:", @@ -201,11 +212,11 @@ "ask_rig_name": "Zadej název těžebního rigu: ", "ask_donation_level": "Zadej úroveň daru vývojářům (0-5) (doporučeno: 1), toto nesníží své zisky z těžby: ", "config_saved": "Konfigurace uložena! Zapínám těžbu", - "free_network_warning": " Síť Duino-Coin je Duino-Coin je zcela bezplatná služba a tak to bude i do budoucna", + "free_network_warning": " Síť Duino-Coin je bezplatná služba a tak to bude i do budoucna", "donate_warning": "\nZ tvé těžby si nebereme žádné poplatky.\nMůžeš nám pomoci udržovat server, pokud nám přispěješ.\nNavštiv ", "learn_more_donate": " abys zjistil, jak nám můžeš pomoci :)", "starting_donation": "Zahajuji darovací proces", - "thanks_donation": " Díky, že ses rozhodl nám přispět <3 \nTvůj příspěvěk nám pomůže udržovat server a projekt dále vyvíjet", + "thanks_donation": " Díky, že ses rozhodl nám přispět ❤️ \nTvůj příspěvěk nám pomůže udržovat server a projekt dále vyvíjet", "data_error": " Chyba při získávání dat GitHubu! Zkusím to znovu za 10s.", "connected": " Připojeno", "connected_server": " k hlavnímu Duino-Coin serveru (v", @@ -231,7 +242,7 @@ "retrying": " Zkusím to znovu za 10s", "mining_user": " Uživatel ", "mining_not_exist": " neexistuje.", - "mining_not_exist_warning": " Ujisti se, že jsi zadal uživatelské jméno správně. Zkontroluj prosím soubor konfigurace. Zkusím to znovu za 10s", + "mining_not_exist_warning": " Ujisti se, že jsi zadal uživatelské jméno správně. Zkontroluj prosím soubor konfigurace. Zkusím to znovu za 10 sekund", "load_config_error": " Chyba při načítání konfiguračního souboru (", "load_config_error_warning": "/Miner_config.cfg). Zkus ho odstranit a program spustit znovu. Zavírám za 10s", "connection_search": "Hledám nejrychlejší těžební uzel", @@ -251,11 +262,25 @@ "report_body6": " hashů", "report_body7": "\n\t\t‖ Bloků nalezeno: ", "total_mining_time": "\n\t\t‖ Celková doba těžby: ", - "node_picker_unavailable": "Výběrčí uzlů nejspíš nedopovídá tak, jak by měl - zkusím to znovu za ", + "node_picker_unavailable": "Výběrčí uzlů nejspíš nepracuje tak, jak by měl - zkusím to znovu za ", "node_picker_error": "Fatální chyba při získávání serveru od výběrčího uzlů - zkusím to znovu za ", "connecting_node": " Získaný těžební uzel: ", - "new_version": "A new version is available, you want to update miner [Y/n] ? ", - "updating": "The miner is outdated. Updating...." + "new_version": "Je dostupná nová verze programu. Chceš ho hned teď aktualizovat [Y/n] ? ", + "updating": "Těžící program je zastaralý. Instaluji aktualizaci....", + "ask_mining_key": "Zadej svůj těžební klíč: ", + "mining_key_required": "Těžební klíč je nutný pro těžbu na tomto účtě", + "invalid_mining_key": "Zadaný těžební klíč není správný", + "incorrect_username": "Zadané uživatelské jméno neexistuje", + "system_threads_notice": "Varování: pokoušíš se k těžbě využít více jader, než které máš ve své těžební desce.\n\t\tTento krok způsobí nežádoucí efekty jako neresponzivnost systému.\n\t\tTěžba začne za 10s", + "using_config": "Konfigurační soubor: ", + "motd": "Serverová zpráva dne: ", + "hashrate_test": "Test hashratu skončil s výsledkem ", + "hashrate_test_diff": ", systém přiřadil těžební obtížnost: ", + "diff": "obtížnost", + "hashrate_total": "celkem", + "surpassed": "Gratulujeme k dosažení", + "surpassed_shares": "úspěšných operací!", + "miner_is_outdated": "Težební program je zastaralý" }, "korean": { "translation_autor": "hotmoist, roroxxn, hj-k66 ", @@ -274,7 +299,7 @@ "basic_config_tool": "\nDuino-Coin 기본 도구\n", "edit_config_file_warning": "/Miner_config.cfg 파일을 변경하려면 나중에 편집 하십시오.", "dont_have_account": "아직 Duino-Coin 계정이 없으신가요?", - "wallet": " Wallet", + "wallet": " https://wallet.duinocoin.com", "register_warning": "을 사용해서 계정을 생성(register)하세요.\n", "ask_username": "Duino-Coin 사용자 이름 입력하세요: ", "ports_message": "도구에서 다음 포트를 찾았습니다:", @@ -354,8 +379,8 @@ "rig_identifier": "Identyfikator koparki: ", "basic_config_tool": "\nKreator pliku konfiguracyjnego Duino-Coin\nEdytuj plik ", "edit_config_file_warning": "/Miner_config.cfg jeżeli chcesz coś poźniej zmienić.", - "dont_have_account": "Nie posiadasz konta Duino-Coin? Użyj ", - "wallet": "Wallet (Portfel)", + "dont_have_account": "Nie posiadasz konta Duino-Coin? Wejdź na ", + "wallet": "https://wallet.duinocoin.com", "register_warning": " aby zarejestrować się na sieci.\n", "ask_username": "Wprowadź swoją nazwę użytkownika Duino-Coin: ", "ports_message": "Kreator konfiguracji znalazł następujące porty:", @@ -416,8 +441,22 @@ "report_body5": "\n\t\t‖ Podczas tego czasu rozwiązałeś ", "report_body6": " hashy", "total_mining_time": "\n\t\t‖ Koparka działa przez: ", - "new_version": "A new version is available, you want to update miner [Y/n] ? ", - "updating": "The miner is outdated. Updating...." + "new_version": "Znalezino nową wersję, chcesz zaktualizować koparkę? [Y/n] ? ", + "updating": "Koparka jest nieaktualna, aktualizacja w trakcie....", + "ask_mining_key": "Wprowadź swoje hasło do kopania (mining key): ", + "mining_key_required": "Hasło do kopania jest wymagane do kopania na tym koncie", + "invalid_mining_key": "Podane hasło do kopania jest nieprawidłowe!", + "incorrect_username": "Podana nazwa użytkownika nie istnieje!", + "system_threads_notice": "Uwaga: próbujesz uruchomić więcej wątków niż twoje urządzenie fizycznie posiada.\n\t\tMoże to spowodować zawieszenie się systemu lub problemy z konsolą.\n\t\tUruchamiam koparkę za 10s", + "using_config": "Plik konfiguracyjny: ", + "motd": "Serwerowa wiadomość dnia: ", + "hashrate_test": "Test wydajności zakończony z wynikiem ", + "hashrate_test_diff": ", dopasowana trudność kopania: ", + "diff": "trudność", + "hashrate_total": "łącznie", + "surpassed": "Gratulujemy osiągnięcia", + "surpassed_shares": "zaakceptowanych share'ów!", + "miner_is_outdated": "Używasz starej wersji koparki" }, "russian": { "translation_autor": "5Q", @@ -436,7 +475,7 @@ "basic_config_tool": "\nИнструмент базовой настройки Duino-Coin\nОтредактируйте файл ", "edit_config_file_warning": "/Miner_config.cfg если вы захотите их изменить.", "dont_have_account": "Еще нет аккаунта Duino-Coin? Используйте ", - "wallet": "Кошелек", + "wallet": "https://wallet.duinocoin.com", "register_warning": " для регистрации на сервере.\n", "ask_username": "Введите ваше имя пользователя Duino-Coin: ", "ports_message": "Инструмент настройки нашел следующие порты:", @@ -501,7 +540,7 @@ "basic_config_tool": "\nHerramienta de configuración básica de Duino-Coin\nEdita ", "edit_config_file_warning": "el archivo /Miner_config.cfg si deseas cambiar después la configuración.", "dont_have_account": "¿No tienes una cuenta Duino-Coin todavía? Usa ", - "wallet": "Monedero", + "wallet": "https://wallet.duinocoin.com", "register_warning": " para registrarte en el servidor.\n", "ask_username": "Introduce tu usuario Duino-Coin: ", "ports_message": "La herramienta de configuración ha descubierto estos puertos:", @@ -566,7 +605,7 @@ "basic_config_tool": "\nDuino-Coin simples Konfigurationstool\nBearbeite ", "edit_config_file_warning": "/Miner_config.cfg wenn du Einstellungen ändern möchtest.", "dont_have_account": "Du hast noch keinen Duino-Coin Account? Benutze ", - "wallet": "Wallet", + "wallet": "https://wallet.duinocoin.com", "register_warning": " um dich zu registrieren.\n", "ask_username": "Gib deinen Duino-Coin Benutzernamen ein: ", "ports_message": "Das Konfigurationstool hat Arduinos auf folgenden Ports gefunden:", @@ -612,8 +651,41 @@ "load_config_error": " Fehler beim Laden der Konfigurationsdatei (", "load_config_error_warning": "/Miner_config.cfg). Versuche sie zu entfernen und neu zu konfigurieren. Miner schließt in 10s", "connection_search": "Suche nach der schnellsten Verbindung zu dem Server", - "new_version": "A new version is available, you want to update miner [Y/n] ? ", - "updating": "The miner is outdated. Updating...." + "uptime_seconds": " Sekunden", + "uptime_minute": " Minute", + "uptime_minutes": " Minuten", + "uptime_hour": " Stunde", + "uptime_hours": " Stunden", + "periodic_mining_report": "Periodische Mining Bericht: ", + "report_period": "\n\t\t‖ Während den letzten ", + "report_time": " Sekunden", + "report_body1": "\n\t\t‖ Wurden ", + "report_body2": " Shares geschürft (", + "report_body3": " Shares/s)", + "report_body4": "\n\t\t‖ Mit einer Hashrate von ", + "report_body5": "\n\t\t‖ In dieser Zeitdauer, hast du ", + "report_body6": " Hashes gelöst", + "report_body7": "\n\t\t‖ Gefundene Blöcke: ", + "total_mining_time": "\n\t\t‖ Totale Betriebszeit des Miners: ", + "node_picker_unavailable": "Node Picker scheint nicht richtig zu reagieren - versuche erneut in ", + "node_picker_error": "Schwerer Fehler beim Abruefn des Servers vom Node Picker - versuche erneut in ", + "connecting_node": " Abgerufener Mining Knoten: ", + "new_version": "Eine neue Version ist verfügbar. Möchtest du den Miner aktualisieren [Y/n]? ", + "updating": "Der Miner ist veraltet. Aktualisiere....", + "ask_mining_key": "Gib deinen Miningschlüssel an: ", + "mining_key_required": "Ein Miningschlüssel ist erforderlich um auf diesem Konto zu schürfen", + "invalid_mining_key": "Der angegebene Miningschlüssel ist inkorrekt!", + "incorrect_username": "Der angegebene Nutzername existiert nicht!", + "system_threads_notice": "Warnung: Du versucht mehr Threads zu verwenden, als du hast. \n\t\tDas wird zu nicht gewollten Nebeneffekten führen, wie z.B., dass das System nicht mehr reagiert. \n\t\tStarte in 10s", + "using_config": "Konfigurationsdatei: ", + "motd": "Server Nachricht des Tages: ", + "hashrate_test": "Hashrate Test endete mit ", + "hashrate_test_diff": ", zugeteilte Startschwierigkeit: ", + "diff": "diff.", + "hashrate_total": "Total", + "surpassed": "Glückwunsch zum Übertreffen von", + "surpassed_shares": "korrekten Shares!", + "miner_is_outdated": "Der Miner ist veraltet" }, "french": { "translation_autor": "Bilaboz", @@ -632,7 +704,7 @@ "basic_config_tool": "\nEditeur de configuration Duino-Coin\nEditez ", "edit_config_file_warning": "le fichier /Miner_config.cfg si vous voulez changer votre configuration ultérieurement.", "dont_have_account": "Vous n'avez pas encore de compte Duino-Coin? Utilisez ", - "wallet": "Wallet", + "wallet": "https://wallet.duinocoin.com", "register_warning": " pour en créer un.\n", "ask_username": "Entrez votre nom d'utilisateur Duino-Coin: ", "ports_message": "L'outil de configuration a trouvé les ports suivants:", @@ -682,69 +754,69 @@ "updating": "The miner is outdated. Updating...." }, "slovak": { - "translation_autor": "JoyBed", - "sigint_detected": " Ukoncujem.", + "translation_autor": "JoyBed & MatusOllah", + "sigint_detected": " Ukončujem.", "goodbye": " Dovidenia!", - "greeting_morning": "Prajem prijemne rano", - "greeting_noon": "Prajem chutny obed", - "greeting_afternoon": "Prajem mierumilovne poobedie", - "greeting_evening": "Prajem pohodlny vecer", - "greeting_back": "Vitaj naspat", - "banner": "Oficialny Duino-Coin © AVR Miner", - "donation_level": "Uroven prispevku pre vyvojarov: ", + "greeting_morning": "Prajem príjemné ráno", + "greeting_noon": "Prajem chutný obed", + "greeting_afternoon": "Prajem mierumilovné poobedie", + "greeting_evening": "Prajem pohodlný večer", + "greeting_back": "Vitaj späť", + "banner": "Oficiálny Duino-Coin © AVR Miner", + "donation_level": "Úroveň príspevku pre vývojárov: ", "avr_on_port": "AVR doska(y) na porte(och): ", "algorithm": "Algoritmus: ", - "rig_identifier": "Rig identifikator: ", - "basic_config_tool": "\nDuino-Coin zakladne nastavenie\nEdit ", - "edit_config_file_warning": "/Miner_config.cfg subor neskor pre zmenu.", - "dont_have_account": "Nemas Duino-Coin ucet? Pouzi ", - "wallet": "Penazenka", + "rig_identifier": "Rig identifikátor: ", + "basic_config_tool": "\nDuino-Coin základne nastavenie\nEdit ", + "edit_config_file_warning": "/Miner_config.cfg súbor neskôr pre zmenu.", + "dont_have_account": "Nemáš Duino-Coin účet? Použi ", + "wallet": "https://wallet.duinocoin.com", "register_warning": " na zaregistrovanie na serveri.\n", "ask_username": "Zadaj svoje Duino-Coin meno: ", - "ports_message": "Nastroj nasiel na nasledujucich portoch:", - "ports_notice": "Ked tu nevidite svoju dosku, uistite sa ze je spravne pripojena a program k nej ma pristup (admin/sudo prava).", - "ask_avrport": "Zapiste port svojej dosky (napr. COM1 (Windows) alebo /dev/ttyUSB1 (Unix/Linux)): ", - "ask_anotherport": "Chcete pridat dalsiu dosku? (y/N): ", - "ask_higherdiff": "Chcete pouzit vyssiu obtiaznost? (iba pre Arduino DUE dosku) (y/N): ", - "ask_rig_identifier": "Chcete priradit meno tomuto rigu? (y/N) ", + "ports_message": "Nástroj našiel na nasledujúcich portoch:", + "ports_notice": "Keď tu nevidíte svoju dosku, uistite sa že je správne pripojená a program k nej má pristup (admin/sudo práva).", + "ask_avrport": "Zapíšte port svojej dosky (napr. COM1 (Windows) alebo /dev/ttyUSB1 (Unix/Linux)): ", + "ask_anotherport": "Chcete pridať ďalšiu dosku? (y/N): ", + "ask_higherdiff": "Chcete použiť vyššiu obtiažnosť? (iba pre Arduino DUE dosku) (y/N): ", + "ask_rig_identifier": "Chcete priradiť meno tomuto rigu? (y/N) ", "ask_rig_name": "Zadajte meno rigu: ", - "ask_donation_level": "Zadajte uroven prispievania (0-5) (odporucane: 1), neznizi to vas zisk: ", - "config_saved": "Nastavenie ulozene! Spusta sa miner", - "free_network_warning": " Duino-Coin je uplne bez poplatkov a vzdy aj bude", - "donate_warning": "\nNeberieme ziadne poplatky z vasho miningu.\nNaozaj nam pomozete vasim stedrym prispevkom.\nNavstivte ", - "learn_more_donate": " aby ste zistili viac a aj ako nam mozete pomoct :)", - "starting_donation": "Zacina sa prispevkovy program", - "thanks_donation": " Dakujeme za vas stedry prispevok ❤️ Vas prispevok nam pomoze udrzat server v chode tak ako je teraz.", - "data_error": " Chyba stahovania dat z GitHubu! Odznova o 10s.", - "connected": " Pripojene", - "connected_server": " na hlavny Duino-Coin server (v", - "outdated_miner": " Miner je zastarany (v", + "ask_donation_level": "Zadajte úroveň prispievania (0-5) (odporúčane: 1), nezníži to vas zisk: ", + "config_saved": "Nastavenie uložené! Spúšťa sa miner", + "free_network_warning": " Duino-Coin je úplne bez poplatkov a vždy aj bude", + "donate_warning": "\nNeberieme žiadne poplatky z vášho miningu.\nNaozaj nám pomôžete vašim štedrým prispevkom.\nNavštívte ", + "learn_more_donate": " aby ste zistili viac a aj ako nám môžete pomôct :)", + "starting_donation": "Začína sa príspevkový program", + "thanks_donation": " Ďakujeme za vás štedrý príspevok ❤️ Váš príspevok nám pomôže udržať server v chode tak ako je teraz.", + "data_error": " Chyba sťahovania dát z GitHubu! Odznova o 10s.", + "connected": " Pripojené", + "connected_server": " na hlavný Duino-Coin server (v", + "outdated_miner": " Miner je zastaraný (v", "server_is_on_version": " server na v", - "update_warning": ", stiahnite si najnovsiu verziu z https://github.com/revoxhere/duino-coin/releases/", - "connecting_error": " Chyba pri pripajani na server. Odznova o 10s", + "update_warning": ", stiahnite si najnovšiu verziu z https://github.com/revoxhere/duino-coin/releases/", + "connecting_error": " Chyba pri pripájaní sa na server. Odznova o 10s", "duco_avr_miner": "Duino-Coin AVR Miner (v", - "accepted_shares": " prijate riesenia", - "accepted": " Prijate ", - "block_found": " Blok najdeny ", - "rejected": " Odmietnuty ", - "error_while_mining": " Chyba pocas miningu - pravdepodobne chyba pripojenia - restart za 5s.", + "accepted_shares": " prijaté riešenia", + "accepted": " Prijaté ", + "block_found": " Blok nájdený ", + "rejected": " Odmietnutý ", + "error_while_mining": " Chyba počas miningu - pravdepodobne chyba pripojenia - reštart za 5s.", "board_on_port": " AVR na porte ", - "board_is_connected": " je pripojena", - "board_connection_error": " AVR pripojenie chybne na porte ", - "board_connection_error2": ", skontrolujte ci je pripojene alebo nie.", - "mining_start": " AVR mining sa zacina na ", - "mining_algorithm": " pouzitim DUCO-S1A algoritmu (", + "board_is_connected": " je pripojená", + "board_connection_error": " AVR pripojenie chybné na porte ", + "board_connection_error2": ", skontrolujte či je pripojené alebo nie.", + "mining_start": " AVR mining sa začína na ", + "mining_algorithm": " použitím DUCO-S1A algoritmu (", "mining_avr_connection_error": " Chyba pripojenia k AVR! Odznova o 10s", - "mining_avr_not_responding": " Arduino dlho neodpoveda, posielam novu pracu ", - "internal_server_error": " Vnutorna chyba serveru.", + "mining_avr_not_responding": " Arduino dlho neodpovedá, posielam novú prácu ", + "internal_server_error": " Vnútorná chyba serveru.", "retrying": " Odznova o 10s", - "mining_user": " Uzivatel ", + "mining_user": " Uživateľ ", "mining_not_exist": " Neexistuje.", - "mining_not_exist_warning": " Skontrolujte ci mate spravne zadane meno. Skontrolujte konfiguracny subor. Odznova o 10s", - "load_config_error": " chyba nacitavania konfiguracneho suboru (", - "load_config_error_warning": "/Miner_config.cfg). Skuste ho odstranit a spustit odznova konfiguraciu. Ukoncenie o 10s", - "new_version": "A new version is available, you want to update miner [Y/n] ? ", - "updating": "The miner is outdated. Updating...." + "mining_not_exist_warning": " Skontrolujte či máte správne zadané meno. Skontrolujte konfiguračný súbor. Odznova o 10s", + "load_config_error": " chyba načítavania konfiguračného suboru (", + "load_config_error_warning": "/Miner_config.cfg). Skúste ho odstrániť a spustiť odznova konfiguráciu. Ukončenie o 10s", + "new_version": "K dispozícii je nová verzia, chcete aktualizovať miner [A/n] ? ", + "updating": "Miner je zastaraný. Aktualizujem...." }, "italian": { "translation_autor": "Il mastro Stefanuzzo (no spaces on GitHub)", @@ -763,7 +835,7 @@ "basic_config_tool": "\nStrumento base di configurazione Duino-Coin\nModifica ", "edit_config_file_warning": "/Miner_config.cfg più tardi se vuoi cambiarlo.", "dont_have_account": "Non hai ancora un account Duino-Coin? Usa ", - "wallet": "Portafoglio (Wallet)", + "wallet": "https://wallet.duinocoin.com", "register_warning": " per registrarti sul server.\n", "ask_username": "Inserisci il tuo nome utente di Duino-Coin: ", "ports_message": "Lo strumento di configurazione ha trovato le seguenti porte:", @@ -830,7 +902,7 @@ "basic_config_tool": "\nDuino-Coin 基础配置工具\n编辑 ", "edit_config_file_warning": "/如果要更改 Miner_config.cfg 文件,请稍后。", "dont_have_account": "还没有Duino-Coin帐户吗? 使用 ", - "wallet": "钱包", + "wallet": "https://wallet.duinocoin.com", "register_warning": " 在服务器上注册个。\n", "ask_username": "输入您的 Duino-Coin 用户名: ", "ports_message": "配置工具找到了如下端口:", @@ -897,7 +969,7 @@ "basic_config_tool": "\nFerramenta de configuração básica do Duino-Coin\nEdita ", "edit_config_file_warning": "Se você quiser trocar as configurações mais tarde /Miner_config.cfg é o arquivo.", "dont_have_account": "Você já tem uma conta no Duino-Coin? Se sim use-a.", - "wallet": "Carteira", + "wallet": "https://wallet.duinocoin.com", "register_warning": " Para se registrar no servidor.\n", "ask_username": "Seu nome na Duino-Coin: ", "ports_message": "Duranta a configuração foram descobertas essas portas:", @@ -978,7 +1050,7 @@ "basic_config_tool": "\nDuino-Coin yapılandırma aracı\nEğer daha sonra ayarları değiştirmek isterseniz ", "edit_config_file_warning": "/Miner_config.cfg dosyasını düzenleyin.", "dont_have_account": "Henüz bir Duino-Coin hesabınız yok mu? ", - "wallet": "Cüzdan", + "wallet": "https://wallet.duinocoin.com", "register_warning": " ile sunucuya kayıt olun.", "ask_username": "Duino-Coin kullanıcı adınızı girin: ", "ports_message": "Yapılandırma aracı belirtilen portları buldu:", @@ -1061,7 +1133,7 @@ "basic_config_tool": "\nDuino-Coin konfiqurasiya aracı\nAyarları daha sonra dəyişdirmək istəyirsinizsə", "edit_config_file_warning": "/Miner_config faylını dəyişdirin.", "dont_have_account": "Hələ Duino-Coin hesabınız yoxdur? ", - "wallet": "Cüzdan", + "wallet": "https://wallet.duinocoin.com", "register_warning": "ilə serverdə qeydiyyatdan keçin.", "ask_username": "Duino-Coin istifadəçi adınızı daxil edin: ", "ports_message": "Konfiqurasiya vasitəsi göstərilən portları tapdı:", @@ -1127,7 +1199,7 @@ "basic_config_tool": "\nDuino-Coin เครื่องมือการตั้งค่าพื้นฐาน\nแก้ไข ", "edit_config_file_warning": "ไฟล์ /Miner_config.cfg ภายหลังหากคุณต้องการแก้ไข", "dont_have_account": "ยังไม่มีบัญชี Duino-Coin ใช้งาน? ใช้ ", - "wallet": "วอลเล็ท", + "wallet": "https://wallet.duinocoin.com", "register_warning": " ลงทะเบียนบนเซิร์ฟเวอร์\n", "ask_username": "ใส่ชื่อผู้ใช้งาน Duino-Coin ของคุณ: ", "ports_message": "เครื่องมือการตั้งค่าถูกพบที่พอร์ตต่อไปนี้:", @@ -1208,7 +1280,7 @@ "basic_config_tool": "\nDuino-Coin basis configuratiehulpprogramma\nBewerk ", "edit_config_file_warning": "het bestand /Miner_config.cfg later.", "dont_have_account": "Nog geen Duino-Coin account? Ga naar ", - "wallet": "Wallet", + "wallet": "https://wallet.duinocoin.com", "register_warning": " voor het registeren van een account.\n", "ask_username": "Vul je Duino-Coin gebruikersnaam in: ", "ports_message": "Het configuratiehulpprogramma heeft de volgende poorten gevonden:", @@ -1246,7 +1318,7 @@ "mining_algorithm": " gebruikte algoritme is DUCO-S1A (", "mining_avr_connection_error": " Fout tijdens het verbinden met de AVR! Opnieuw proberen in 10s", "mining_avr_not_responding": " Antwoord duurt langer dan verwacht, er wordt een nieuwe opdracht gestuurd ", - "internal_server_error": " Interne server fout.", + "internal_server_error": " Interne serverfout.", "retrying": " Opnieuw proberen in 10s", "mining_user": " Gebruiker ", "mining_not_exist": " bestaat niet.", @@ -1271,5 +1343,193 @@ "total_mining_time": "\n\t\t‖ Totale mining tijd: ", "new_version": "A new version is available, you want to update miner [Y/n] ? ", "updating": "The miner is outdated. Updating...." + }, + "japanese": { + "translation_autor": "Ikko Ashimine", + "sigint_detected": " SIGINTが検出されました - 正常に終了しています。", + "goodbye": " では、また!", + "greeting_morning": "素敵な朝をお過ごしください", + "greeting_noon": "美味しいお昼をどうぞ", + "greeting_afternoon": "穏やかな午後をお過ごしください", + "greeting_evening": "快適な夜をお過ごしください", + "greeting_back": "おかえりなさい", + "banner": "公式Duino-Coin © AVRマイナー", + "donation_level": "デベロッパーの寄付レベル: ", + "avr_on_port": "ポートに搭載されたAVRボード: ", + "algorithm": "アルゴリズム: ", + "rig_identifier": "リグ識別子: ", + "basic_config_tool": "\nDuino-Coin基本設定ツール\n編集 ", + "edit_config_file_warning": "/Miner_config.cfgファイルを後で変更したい場合。", + "dont_have_account": "をまだお持ちでない方はこちらを使用 ", + "wallet": "https://wallet.duinocoin.com", + "register_warning": " をクリックしてサーバーに登録します。\n", + "ask_username": "Duino-Coinのユーザー名を入力します: ", + "ports_message": "コンフィグレーションツールは、以下のポートを検出しました:", + "ports_notice": "ボードが表示されない場合は、ボードが正しく接続されていること、プログラムがボードにアクセスできること(admin/sudo権限)を確認します。", + "ask_avrport": "ボードのシリアルポート(例:COM1(Windows)または/dev/ttyUSB1(Unix))を入力します: ", + "ask_anotherport": "ボードをもう一枚追加しますか? (y/N): ", + "ask_higherdiff": "高い難易度を使用しますか(Arduino DUEボードの場合のみ) (y/N): ", + "ask_rig_identifier": "このリグに識別子(名前)を追加しますか? (y/N) ", + "ask_rig_name": "ご希望のリグネームの入力: ", + "ask_donation_level": "開発者の寄付レベル(0~5)を設定します(推奨:1)、これによって収益が減少することはありません: ", + "config_saved": "コンフィグが保存されました マイナーを起動する", + "free_network_warning": " Duino-Coinネットワークは完全な無料サービスであり、今後も常に", + "donate_warning": "\nお客様のマイニングから手数料を取ることはありません。\n寄付をすることで、サーバーの維持や低料金での交換に本当に貢献できます。\n以下を訪れてください ", + "learn_more_donate": " をクリックすると、詳細が表示されます:)", + "starting_donation": "寄付の手続き開始", + "thanks_donation": " 素晴らしい寄付をしていただきありがとうございます ❤️ \nご寄付は、サーバーの維持とさらなる開発のために活用させていただきます", + "data_error": " GitHubからのデータ取得に失敗! 10秒後に再試行します。", + "connected": " 接続済み", + "connected_server": " マスターDuino-Coinサーバーへ (v", + "outdated_miner": " マイナーが古いです (v", + "server_is_on_version": " サーバーは v", + "update_warning": "、最新版は、https://github.com/revoxhere/duino-coin/releases/ からダウンロードしてください", + "connecting_error": " サーバーへの接続にエラーが発生しました。10秒後に再試行", + "duco_avr_miner": "Duino-Coin AVRマイナー (v", + "accepted_shares": " 受理されたシェア", + "accepted": " 受理 ", + "block_found": " ブロックが見つかりました ", + "rejected": " 却下 ", + "error_while_mining": " マイニング中にエラーが発生 - 接続エラーの可能性が高い - 5秒で再起動します。", + "board_on_port": " ポート上のAVR ", + "board_is_connected": " が接続されています", + "board_connection_error": " AVRのポート接続エラー ", + "board_connection_error2": "、プラグが差し込まれているかどうか確認してください", + "mining_start": " AVRマイニングスレッド開始", + "mining_algorithm": " DUCO-S1Aアルゴリズムを使用 (", + "mining_avr_connection_error": " AVRへの接続エラー! 10秒後に再試行", + "mining_avr_not_responding": " Arduinoが予想以上に時間がかかっているため、新しい仕事を送る ", + "internal_server_error": " 内部サーバーエラー。", + "retrying": " 10秒後に再試行", + "mining_user": " ユーザー ", + "mining_not_exist": " は存在しません。", + "mining_not_exist_warning": " ユーザー名が正しく入力されているか確認してください。設定ファイルを確認してください。10秒後に再試行", + "load_config_error": " configfileの読み込みエラー (", + "load_config_error_warning": "/Miner_config.cfg). 削除してコンフィグを再実行してみてください。10秒後に終了", + "connection_search": "最速で接続できるノードの検索", + "uptime_seconds": " 秒", + "uptime_minute": " 分", + "uptime_minutes": " 分", + "uptime_hour": " 時間", + "uptime_hours": " 時間", + "periodic_mining_report": "マイニング定期レポート: ", + "report_period": "\n\t\t‖ この間 ", + "report_time": " 秒", + "report_body1": "\n\t\t‖ あなたがマイニングしたのは ", + "report_body2": " シェア (", + "report_body3": " シェア/秒)", + "report_body4": "\n\t\t‖ のハッシュレートでは ", + "report_body5": "\n\t\t‖ この期間に、あなたは解決した ", + "report_body6": " ハッシュ", + "report_body7": "\n\t\t‖ ブロックが見つかりました: ", + "total_mining_time": "\n\t\t‖ マイナーの総稼働時間: ", + "node_picker_unavailable": "ノードピッカーが正しく応答しないようです - 以下で再試行します ", + "node_picker_error": "ノードピッカーからサーバーを取得する際の致命的なエラー - 以下で再試行する ", + "connecting_node": " 取得したマイニングノード: ", + "new_version": "新しいバージョンが利用可能です、マイナーをアップデートしますか[Y/n]? ", + "updating": "マイナーが古くなっています。アップデート中....", + "ask_mining_key": "マイニングキーを入力してください: ", + "mining_key_required": "このアカウントでマイニングを行うには、マイニングキーが必要です", + "invalid_mining_key": "入力されたマイニングキーは無効です!", + "incorrect_username": "入力されたユーザーネームは存在しません!", + "system_threads_notice": "警告:あなたは持っている以上のスレッドを使用しようとしています。\n\t\tこれは、システムが応答しなくなるなど、予期せぬ副作用を引き起こすことになります。\n\t\t10秒後に開始します", + "using_config": "設定ファイル: ", + "motd": "本日のサーバーメッセージ: ", + "hashrate_test": "ハッシュレートのテストは以下にて終了 ", + "hashrate_test_diff": "、開始時の難易度を設定: " + }, + "finnish": { + "translation_autor": "EeroVakiparta", + "sigint_detected": " SIGINT havaittu - Poistutaan siististi.", + "goodbye": " Nähdään pian!", + "greeting_morning": "Toivotamme sinulle ihanaa aamua", + "greeting_noon": "Toivotamme sinulle herkullista keskipäivää", + "greeting_afternoon": "Toivotamme sinulle rauhallista iltapäivää", + "greeting_evening": "Toivotamme sinulle kotoisaa iltaa", + "greeting_back": "Tervetuloa takaisin", + "banner": "Virallinen Duino-Coin © AVR Miner", + "donation_level": "Kehittäjien lahjoitustaso: ", + "avr_on_port": "AVR-piirilevy(t) portissa/porteissa: ", + "algorithm": "Algoritmi: ", + "rig_identifier": "Rig-tunniste: ", + "basic_config_tool": "\nDuino-Coinin perusasetusten työkalu\nMuokkaa ", + "edit_config_file_warning": "/Miner_config.cfg-tiedostoa myöhemmin, jos haluat muuttaa sitä.", + "dont_have_account": "Eikö sinulla ole vielä Duino-Coin-tiliä? Käytä ", + "wallet": "https://wallet.duinocoin.com", + "register_warning": " rekisteröityäksesi palvelimelle.\n", + "ask_username": "Syötä Duino-Coin-käyttäjätunnuksesi: ", + "ports_message": "Asetustyökalu on löytänyt seuraavat portit:", + "ports_notice": "Jos et näe kehitysalustaasi täällä, varmista, että se on kunnolla kytketty ja ohjelmalla on pääsy siihen (ylläpito-/sudo-oikeudet).", + "ask_avrport": "Syötä kehitysalustasi sarjaportti (esim. COM1 (Windows) tai /dev/ttyUSB1 (Unix)): ", + "ask_anotherport": "Haluatko lisätä toisen kehitysalustan? (y/N): ", + "ask_higherdiff": "Haluatko käyttää korkeampaa vaikeustasoa (vain Arduino DUE -boardeille) (y/N): ", + "ask_rig_identifier": "Haluatko lisätä tunnisteen (nimen) tälle rigille? (y/N) ", + "ask_rig_name": "Syötä haluttu rigin nimi: ", + "ask_donation_level": "Aseta kehittäjien lahjoitustaso (0-5) (suositus: 1), tämä ei vähennä tulojasi: ", + "config_saved": "Asetukset tallennettu! Käynnistetään louhija", + "free_network_warning": " Duino-Coin-verkko on täysin ilmainen palvelu ja tulee aina olemaan", + "donate_warning": "\nEmme ota mitään maksuja louhinnastasi.\nVoit todella auttaa meitä ylläpitämään palvelinta ja matalakuluisia vaihtoja lahjoittamalla.\nKäy osoitteessa ", + "learn_more_donate": " saadaksesi lisätietoja siitä, miten voit auttaa :)", + "starting_donation": "Aloitetaan lahjoitusprosessi", + "thanks_donation": " Kiitos, että olet mahtava lahjoittaja ❤️ \nLahjoituksesi auttaa meitä ylläpitämään palvelinta ja mahdollistamaan jatkokehityksen", + "data_error": " Virhe noudettaessa tietoja GitHubista! Yritetään uudelleen 10 sekunnin kuluttua.", + "connected": " Yhdistetty", + "connected_server": " yhdistetty pää-Duino-Coin-palvelimeen (v", + "outdated_miner": " Louhija on vanhentunut (v", + "server_is_on_version": " palvelin on versiossa v", + "update_warning": ", lataa uusin versio osoitteesta https://github.com/revoxhere/duino-coin/releases/", + "connecting_error": " Virhe yhteyden muodostamisessa palvelimeen. Yritetään uudelleen 10s päästä", + "duco_avr_miner": "Duino-Coin AVR Miner (v", + "accepted_shares": " hyväksytyt osakkeet", + "accepted": " Hyväksytty ", + "block_found": " Lohko löydetty ", + "rejected": " Hylätty ", + "error_while_mining": " Virhe louhinnassa - todennäköisesti yhteysvirhe - käynnistetään uudelleen 5s päästä.", + "board_on_port": " AVR lauta portissa ", + "board_is_connected": " on yhdistetty", + "board_connection_error": " AVR-yhteysvirhe portissa ", + "board_connection_error2": ", tarkista, onko se kytketty vai ei", + "mining_start": " AVR-louhintasäie käynnistyy", + "mining_algorithm": " käyttäen DUCO-S1A -algoritmia (", + "mining_avr_connection_error": " Virhe yhdistettäessä AVR:ään! Yritetään uudelleen 10s päästä", + "mining_avr_not_responding": " Arduino kestää odotettua kauemmin, lähetetään sille uusi työ ", + "internal_server_error": " Sisäinen palvelinvirhe.", + "retrying": " Yritetään uudelleen 10s päästä", + "mining_user": " Käyttäjä ", + "mining_not_exist": " ei ole olemassa.", + "mining_not_exist_warning": " Varmista, että olet syöttänyt käyttäjätunnuksen oikein. Tarkista asetustiedostosi. Yritetään uudelleen 10s päästä", + "load_config_error": " Virhe ladattaessa asetustiedostoa (", + "load_config_error_warning": "/Miner_config.cfg). Kokeile poistaa se ja suorittaa konfiguraatio uudelleen. Poistutaan 10s päästä", + "connection_search": "Etsitään nopeinta nodea, johon yhdistää", + "uptime_seconds": " sekuntia", + "uptime_minute": " minuutti", + "uptime_minutes": " minuuttia", + "uptime_hour": " tunti", + "uptime_hours": " tuntia", + "periodic_mining_report": "Periodinen louhintaraportti: ", + "report_period": "\n\t\t‖ Viimeisten ", + "report_time": " sekunnin aikana", + "report_body1": "\n\t\t‖ Olet louhinut ", + "report_body2": " osaketta (", + "report_body3": " osaketta/s)", + "report_body4": "\n\t\t‖ Hashrate: ", + "report_body5": "\n\t\t‖ Tänä aikana olet ratkaissut ", + "report_body6": " hasheja", + "report_body7": "\n\t\t‖ Löydetyt lohkot: ", + "total_mining_time": "\n\t\t‖ Louhijan kokonaiskäyttöaika: ", + "node_picker_unavailable": "Nodevalitsija ei näytä vastaavan kunnolla - yritetään uudelleen ", + "node_picker_error": "Vakava virhe haettaessa palvelinta nodenvalitsijasta - yritetään uudelleen ", + "connecting_node": " Haettu louhintanode: ", + "new_version": "Uusi versio on saatavilla, haluatko päivittää louhijan [Y/n] ? ", + "updating": "Louhija on vanhentunut. Päivitetään....", + "ask_mining_key": "Anna louhintatunnus: ", + "mining_key_required": "Louhintatunnus vaaditaan tälle tilille louhimiseen", + "invalid_mining_key": "Annettu louhintatunnus on virheellinen!", + "incorrect_username": "Annettu käyttäjätunnus ei ole olemassa!", + "system_threads_notice": "Varoitus: yrität käyttää enemmän säikeitä kuin sinulla on.\n\t\tTämä aiheuttaa ei-toivottuja sivuvaikutuksia, kuten järjestelmän vastaamattomuutta.\n\t\tAloitetaan 10s päästä", + "using_config": "Käytetään konfiguraatiotiedostoa: ", + "motd": "Palvelimen päivän viesti: ", + "hashrate_test": "Hashrate-testi päättyi ", + "hashrate_test_diff": ", määritetty aloitusvaikeustaso: " } } diff --git a/Resources/CLI_Wallet_langs.json b/Resources/CLI_Wallet_langs.json index 5daf16f5..af3b4081 100644 --- a/Resources/CLI_Wallet_langs.json +++ b/Resources/CLI_Wallet_langs.json @@ -808,5 +808,275 @@ "donate_3": " (adresse du Wrapper)", "donate_4": " (revox, DUCO lead developeur)", "donate_5": " (wDUCO developeur)" + }, + "japanese": { + "translation_autor": "Ikko Ashimine", + "cant_connect_to_server": "サーバーに接続できません。メンテナンス中か、一時的にダウンしている可能性があります。\n15秒後に再試行します。", + "cant_recieve_pool_ip_and_port": " プールアドレスとIPを受信できません。\n15秒後に終了します。", + "server_message": "サーバーメッセージ: ", + "success": "成功!", + "cancelled": "キャンセル...", + "duco_commands": " DUCOコマンド:", + "wrapper_commands": " Wrapper関連コマンド:", + "base64_not_installed": "Base64がインストールされていません。\"base64\"を手動でインストールしてください\n15秒後に終了します。", + "tronpy_not_installed": "Tronpyがインストールされていません。python3 -m pip install tr​​onpyを使用してインストールしてください。\ntronpyがインストールされていないため、Wrapperは無効になっています。", + "tronpy_not_installed_2": "Tronpyがインストールされていません。python3 -m pip install tr​​onpyを使用してインストールしてください。", + "cryptography_not_installed": "暗号化がインストールされていません。次を使用してインストールしてください: python3 -m pip install cryptography.\n15秒後に終了します。", + "secrets_not_installed": "Secretsがインストールされていません。次を使用してインストールしてください: python3 -m pip install secrets.\n15秒後に終了します。", + "websocket_not_installed": "Websocketクライアントがインストールされていません。次を使用してインストールしてください: python3 -m pip install websocket-client.\n15秒後に終了します。", + "colorama_not_installed": "Coloramaがインストールされていません。次を使用してインストールしてください: python3 -m pip install colorama.\n15秒後に終了します。", + "first_run": "Duino-Coin CLIウォレットの初回実行\n", + "select_option": "オプションを選択してください: ", + "choice_input": " 1 - ログイン\n 2 - 新規登録\n 3 - 終了\n", + "choice_input_wrapper": "1 - 新しいキーの生成\n2 - キーのインポート \n3 - キャンセル\n", + "value_not_numeric": "エラー、値は数値でなければならない", + "enter_username": "ユーザーネームの入力: ", + "enter_email": "メールアドレスの入力: ", + "enter_password": "パスワードの入力(プライバシーのため表示されません): ", + "confirm_password": "パスワードの確認(プライバシーのため表示されません): ", + "enter_current_password": "現在のパスワードを入力: ", + "enter_new_password": "新しいパスワードを入力: ", + "agree_requirments": "アカウントを新規に登録することにより、お客様は以下の利用規約およびプライバシーポリシーに同意したものとみなされます ", + "register_success": "新規アカウント登録に成功", + "register_failed": "新規ユーザー登録ができない理由: ", + "login_success": "ログインに成功", + "login_failed": "ログインできない理由: ", + "decrypt_private_key": "秘密鍵復号化用パスフレーズ: ", + "encrypt_private_key": "秘密鍵を暗号化するためのパスフレーズを入力します: ", + "invalid_passphrase_wrapper": "無効なパスフレーズのため、このセッションのラッパーを無効にする", + "input_private_key": "自分の秘密鍵を入力: ", + "incorrect_key": "不正なキーが提供された", + "incorrect_value": "不正な値が入力された", + "cli_wallet_text": "\nDuino-Coin CLIウォレット", + "you_have": "保有量 ", + "which_is_about": "おおよそ ", + "duco_price": "DUCO価格: ", + "pending_unwraps": "保留中のアンラップ ", + "tron_address": "受信用Tronアドレス: ", + "trx_balance": "TRXバランス(手数料に便利): ", + "how_encrypt_private_key": "設定ファイル内の秘密鍵の暗号化はどのように行いますか?", + "encryption_choice": "1 - DUCOパスワードを使って暗号化する\n2 - カスタムパスフレーズを使う(より安全)", + "amount_to_wrap": "ラッピングする金額を入力(最小値は10): ", + "no_amount_numeric": "いいえ、金額は数値でなければなりません...中止します", + "enter_tron_address_or_local": "tronアドレスを入力するか、空白にしてローカルウォレットを選択します: ", + "error_min_10_duco": "エラー、最低額は10DUCOです。", + "error_unsufficient_balance": "エラー、バランス不足", + "error_wrong_passphrase": "パスフレーズの入力に誤りがあるため、Wrapperが無効になっています。", + "error_configure_wrapperconf": "Wrapperは無効です。`wrapperconf`を使用して設定してください。", + "error_not_enough_energy_or_trx": "失敗、エネルギーが足りない、またはtrxが必要", + "enter_amount_unwrap": "アンラップする金額を入力してください: ", + "initiating_unwrap": "アンラップを開始しています...\nTXid :", + "error_initiating_unwrap": "アンラップの開始中にエラーが発生しました。中止しています", + "amount_over_pending_values": "金額が保留中の値を超えています。保留中の値を使用してトランザクション手数料を節約します", + "transaction_send_txid": "トランザクションが送信されました、txid :", + "finished_unwrapping": "アンラップ完了", + "confirm_export_private_key": "秘密鍵のエクスポートを確認するためにYESと入力します : ", + "private_key": "秘密鍵: ", + "cancelled_invalid_confirmation": "キャンセル、無効な確認", + "help_list_command": "`help`と入力して、使用可能なコマンドを一覧表示します", + "duco_console": "DUCOコンソールᕲ ", + "enter_recipients_name": "受信者のユーザー名を入力してください: ", + "enter_amount_transfer": "送金する金額を入力: ", + "enter_tron_recipients_name": "受信者のTRONアドレスを入力: ", + "enter_tron_amount_transfer": "送金する金額を入力: ", + "amount_numeric": "金額は数値でなければなりません...中止します", + "tron_transaction_submitted": "TRONネットワークに送信されたトランザクション\nTXID:", + "tron_successful_transaction": "トランザクション成功", + "tron_error_transaction": "トランザクション確認中のエラー", + "see_you_soon": " では、また!", + "sigint_detected": "\nSIGINTが検出されました - 正常に終了しています。", + "about_1": "Duino-Coin CLIウォレットは、Duino-Coinコミュニティによって <3を込めて作成されています", + "about_2": "バージョン ", + "about_3": "MITライセンスの下で配布されています", + "about_4": "サーバーバージョン: ", + "about_5": "サーバーはバージョン ", + "about_6": "しかし、クライアントはバージョン ", + "about_7": "よって、最後のリリースをダウンロードすることを検討する必要があります", + "about_8": "クライアントは最新です", + "donate_1": "DUCOとwDUCOのメンテンスを支援するための寄付はお気軽にどうぞ (ラップ/アンラップには維持費がかかります)", + "donate_2": "TRONとtokens: ", + "donate_3": " (wrapperのアドレス)", + "donate_4": " (revox, DUCO 主任開発者)", + "donate_5": " (wDUCO開発者)" + }, + "finnish": { + "translation_autor": "EeroVakiparta", + "cant_connect_to_server": "Ei voida muodostaa yhteyttä palvelimeen. Se on luultavasti huollossa tai tilapäisesti poissa käytöstä.\nYritetään uudelleen 15 sekunnin kuluttua.", + "cant_recieve_pool_ip_and_port": " Poolin osoitetta ja IP-osoitetta ei voi vastaanottaa.\nPoistutaan 15 sekunnin kuluttua.", + "server_message": "Palvelimen viesti: ", + "success": "Onnistui!", + "cancelled": "Peruutettu...", + "duco_commands": " DUCO komennot:", + "wrapper_commands": " Wrapperiin liittyvät komennot:", + "base64_not_installed": "Base64:ää ei ole asennettu. Asenna manuaalisesti \"base64\"\nPoistutaan 15 sekunnissa.", + "tronpy_not_installed": "Tronpya ei ole asennettu. Asenna se käyttämällä: python3 -m pip install tronpy.\nWrapperi on poistettu käytöstä, koska tronpya ei ole asennettu.", + "tronpy_not_installed_2": "Tronpya ei ole asennettu. Asenna se käyttämällä: python3 -m pip install tronpy.", + "cryptography_not_installed": "Cryptographyä ei ole asennettu. Asenna se käyttämällä: python3 -m pip install cryptography.\nPoistutaan 15 sekunnissa.", + "secrets_not_installed": "Secrets ei ole asennettu. Asenna se käyttämällä: python3 -m pip install secrets.\nPoistutaan 15 sekunnissa.", + "websocket_not_installed": "Websocket-client ei ole asennettu. Asenna se käyttämällä: python3 -m pip install websocket-client.\nPoistutaan 15s päästä.", + "colorama_not_installed": "Colorama ei ole asennettu. Asenna se käyttämällä: python3 -m pip install colorama.\nPoistutaan 15s päästä.", + "first_run": "Duino-Coin CLI Wallet ensimmäinen käynnistys\n", + "select_option": "Valitse vaihtoehto", + "choice_input": " 1 - Kirjaudu sisään\n 2 - Rekisteröidy\n 3 - Poistu\n", + "choice_input_wrapper": "1 - Luo uusi avain\n2 - Tuo avain \n3 - Peruuta\n", + "value_not_numeric": "Virhe, arvon tulee olla numeerinen", + "enter_username": "Syötä käyttäjätunnuksesi: ", + "enter_email": "Syötä sähköpostiosoitteesi: ", + "enter_password": "Syötä salasanasi (ei näytetä yksityisyyden vuoksi): ", + "confirm_password": "CVahvista salasanasi (ei näytetä yksityisyyden vuoksi): ", + "enter_current_password": "Syötä nykyinen salasanasi: ", + "enter_new_password": "Syötä uusi salasana: ", + "agree_requirments": "Rekisteröimällä uuden tilin hyväksyt käyttöehdot ja tietosuojakäytännön, jotka ovat saatavilla osoitteessa ", + "register_success": "Uuden tilin rekisteröinti onnistu", + "register_failed": "Uuden käyttäjän rekisteröinti epäonnistui, syy: ", + "login_success": "Onnistunut kirjautuminen", + "login_failed": "Kirjautuminen epäonnistui, syy: ", + "decrypt_private_key": "Lauseke yksityisen avaimen salauksen purkamiseen: ", + "encrypt_private_key": "Syötä salauslauseke yksityisen avaimen salaamiseen: ", + "invalid_passphrase_wrapper": "Virheellinen salauslauseke, wrapper poistetaan käytöstä tämän istunnon ajan", + "input_private_key": "Syötä oma yksityinen avaimesi: ", + "incorrect_key": "Annettu avain on virheellinen", + "incorrect_value": "Annettu arvo on virheellinen", + "cli_wallet_text": "\nDuino-Coin CLI-lompakko", + "you_have": "Sinulla on ", + "which_is_about": "Mikä on noin ", + "duco_price": "DUCO hinta: ", + "pending_unwraps": "Odottavat unwrapit ", + "tron_address": "Tron-osoite vastaanottoa varten: ", + "trx_balance": "TRX-saldo (hyödyllinen kuluissa): ", + "how_encrypt_private_key": "Miten haluat salata yksityisen avaimen asetustiedostossa?", + "encryption_choice": "1 - salaa se käyttämällä DUCO-salasanaa\n2 - käytä omaa salauslauseketta (turvallisempi)", + "amount_to_wrap": "Syötä wräpättävä määrä (vähintään 10): ", + "no_amount_numeric": "EI, määrän pitää olla numeerinen... keskeytetään", + "enter_tron_address_or_local": "Syötä tron-osoite tai jätä tyhjäksi valitaksesi paikallisen lompakon: ", + "error_min_10_duco": "Virhe, vähimmäismäärä on 10 DUCO:a", + "error_unsufficient_balance": "Virhe, riittämätön saldo", + "error_wrong_passphrase": "Wrapper poistettu käytöstä, syötit väärän salauslausekkeen", + "error_configure_wrapperconf": "Wrapper poistettu käytöstä, määritä se käyttämällä wrapperconf", + "error_not_enough_energy_or_trx": "Epäonnistui, sinulla pitäisi olla tarpeeksi energiaa tai trx:ää", + "enter_amount_unwrap": "Syötä määrä, jonka haluat wräpätä auki: ", + "initiating_unwrap": "Aloitetaan wrapin avaaminen...\nTXid:", + "error_initiating_unwrap": "Wrapperin avaamisen aloittamisessa tapahtui virhe, keskeytetään", + "amount_over_pending_values": "Määrä on odottavia arvoja suurempi, käytetään odottavia arvoja säästääksemme siirtokuluja", + "transaction_send_txid": "Siirto lähetetty, txid:", + "finished_unwrapping": "Unwräppäys valmis", + "confirm_export_private_key": "Kirjoita YES vahvistaaksesi yksityisen avaimen viennin: ", + "private_key": "Yksityinen avain: ", + "cancelled_invalid_confirmation": "Peruutettu, virheellinen vahvistus", + "help_list_command": "Kirjoita help nähdäksesi saatavilla olevat komennot", + "duco_console": "DUCO-konsoli ᕲ ", + "enter_recipients_name": "Syötä vastaanottajan käyttäjätunnus: ", + "enter_amount_transfer": "Syötä siirrettävä määrä: ", + "enter_tron_recipients_name": "Syötä vastaanottajan TRON-osoite: ", + "enter_tron_amount_transfer": "Syötä siirrettävä määrä: ", + "amount_numeric": "Määrän pitäisi olla numeerinen... keskeytetään", + "tron_transaction_submitted": "Siirto lähetetty TRON-verkkoon\nTXID:", + "tron_successful_transaction": "Onnistunut siirto", + "tron_error_transaction": "Virhe siirron vahvistamisessa", + "see_you_soon": " Nähdään pian!", + "sigint_detected": "\nSIGINT havaittu - Poistutaan hienovaraisesti.", + "about_1": "Duino-Coin CLI-lompakko on tehty <3 Duino-Coin-yhteisön toimesta", + "about_2": "Tämä on versio ", + "about_3": "Ja se on jaettu MIT-lisenssin alaisuudessa", + "about_4": "Palvelimen versio: ", + "about_5": "Palvelin on versiossa ", + "about_6": ", mutta clientti on versiossa ", + "about_7": ", sinun kannattaa harkita viimeisimmän julkaisun lataamista", + "about_8": "Client on ajan tasalla", + "donate_1": "Voit halutessasi lahjoittaa auttaaksesi DUCO:n ja wDUCO:n ylläpidossa (wrapping/unwrapping aiheuttaa ylläpitäjille kuluja)", + "donate_2": "TRON ja tokenit: ", + "donate_3": " (wrapperi osoite)", + "donate_4": " (revox, DUCO:n pääkehittäjä)", + "donate_5": " (wDUCO-kehittäjä)" + }, + "german": { + "translation_autor": "EinWildesPanda", + "cant_connect_to_server": "Verbindung zum Server fehlgeschlagen. Wahrscheinlich wird dieser gerade gewartet oder ist temporär nicht erreichbar.\nVersuche in 15 Sekunden nochmals.", + "cant_recieve_pool_ip_and_port": " Pooladresse und IP können nicht empfangen werden.\nSchliesse in 15 Sekunden.", + "server_message": "Server Nachricht: ", + "success": "Erfolg!", + "cancelled": "Abgebrochen...", + "duco_commands": " DUCO Befehle:", + "wrapper_commands": " Wrapper-bezogene Befehle:", + "base64_not_installed": "Base64 ist nicht installiert. Bitte installiere \"base64\" manuell.\nSchliesse in 15s.", + "tronpy_not_installed": "Tronpy ist nicht installiert. Bitte installiere es mittels: python3 -m pip install tronpy.\nWrapper ist deaktiviert, weil tronpy nicht installiert ist.", + "tronpy_not_installed_2": "Tronpy ist nicht installiert. Bitte installiere es mittels: python3 -m pip install tronpy.", + "cryptography_not_installed": "Cryptography ist nicht installiert. Bitte installiere es mittels: python3 -m pip install cryptography.\nSchliesse in 15s.", + "secrets_not_installed": "Secrets ist nicht installiert. Bitte installiere es mittels: python3 -m pip install secrets.\nSchliesse in 15s.", + "websocket_not_installed": "Websocket-client ist nicht installiert. Bitte installiere es mittels: python3 -m pip install websocket-client.\nSchliesse in 15s.", + "colorama_not_installed": "Colorama ist nicht installiert. Bitte installiere es mittels: python3 -m pip install colorama.\nSchliesse in 15s.", + "first_run": "Duino-Coin CLI Wallet Erstausführung\n", + "select_option": "Wähle eine Option", + "choice_input": " 1 - Login\n 2 - Registrieren\n 3 - Schliessen\n", + "choice_input_wrapper": "1 - Neuen Schlüssel generieren \n2 - Schlüssel importieren \n3 - Abbrechen\n", + "value_not_numeric": "Fehler, Wert muss numerisch sein", + "enter_username": "Gib deinen Nutzernamen ein: ", + "enter_email": "Gib deine E-Mail Adresse ein: ", + "enter_password": "Gib dein Passwort ein (aus Gründen des Datenschutzes nicht angezeigt): ", + "confirm_password": "Bestätige dein Passowrt (aus Gründen des Datenschutzes nicht angezeigt): ", + "enter_current_password": "Gib dein aktuelles Passwort ein: ", + "enter_new_password": "Gib ein neues Passwort ein: ", + "agree_requirments": "Durch die Registrierung akzeptierst du die Servicebedingungen und die Datenschutzbestimmungen, welche erhältlich sind unter ", + "register_success": "Erfolgreich ein neues Konto registriert", + "register_failed": "Neuer Nutzer konnte nicht regstriert werden. Grund: ", + "login_success": "Erfolgreiche Anmeldung", + "login_failed": "Anmeldung fehlgeschlagen. Grund: ", + "decrypt_private_key": "Passphrase um den persönlichen Schlüssel zu entschlüsseln: ", + "encrypt_private_key": "Gib deine Passphrase zur Verschlüsselung des persönlichen Schlüssels an: ", + "invalid_passphrase_wrapper": "Ungültige Passphrase, deaktiviere Wrapper für diese Sitzung", + "input_private_key": "Gib deinen eigenen persönlichen Schlüssen an: ", + "incorrect_key": "Ungültiger Schlüssel wurde angegeben", + "incorrect_value": "Ungültiger Wert wurde angegeben", + "cli_wallet_text": "\nDuino-Coin CLI Wallet", + "you_have": "Du hast ", + "which_is_about": "Das ist etwa ", + "duco_price": "DUCO Preis: ", + "pending_unwraps": "Ausstehende Unwraps ", + "tron_address": "Tron-Addresse für den Empfang: ", + "trx_balance": "TRX Saldo (nützlich für Gebühren): ", + "how_encrypt_private_key": "Wie möchtest du den persönlichen Schlüssel innerhalb der Konfigurationsdatei verschlüsseln?", + "encryption_choice": "1 - Verschlüsseln mittels DUCO-Passwort\n2 - Benutzerdefinierte Passphrase verwenden (sicherer)", + "amount_to_wrap": "Zu wrappenden Betrag angeben (Minimum ist 10): ", + "no_amount_numeric": "Nein, Anzahl sollte numerisch sein... Abbruch", + "enter_tron_address_or_local": "Gib eine Tron-Adresse an oder leer lassen um lokales Wallet auszuwählen: ", + "error_min_10_duco": "Fehler, Mindestmenge ist 10 DUCO", + "error_unsufficient_balance": "Fehler, unzureichender Kontostand", + "error_wrong_passphrase": "Wrapper deaktiviert, ein falsches Passwort wurde angegeben", + "error_configure_wrapperconf": "Wrapper deaktiviert, konfiguriere es mittels `wrapperconf`", + "error_not_enough_energy_or_trx": "Fehlgeschlagen, du solltest genug Energie oder TRX haben", + "enter_amount_unwrap": "Gib einen Betrag zum Unwrappen an: ", + "initiating_unwrap": "Initialisiere Unwrap...\nTXid :", + "error_initiating_unwrap": "Beim Initalisieren des Unwraps ist ein Fehler aufgetregen, Abbruch", + "amount_over_pending_values": "Der Betrag übersteigt die ausstehenden Werte, verwende ausstehende Werte um Transaktionsgebühren zu sparen", + "transaction_send_txid": "Transaktion gesendet, txid :", + "finished_unwrapping": "Unwrapping fertiggestellt", + "confirm_export_private_key": "Gib YES ein, um den Export des persönlichen Schlüssels zu bestätigen : ", + "private_key": "Persönlicher Schlüssel: ", + "cancelled_invalid_confirmation": "Abgebrochen, ungültige Bestätigung", + "help_list_command": "Gib `help` ein, um verfügbare Befehle anzuzeigen", + "duco_console": "DUCO Konsole ᕲ ", + "enter_recipients_name": "Gib den Nutzernamen des Empfängers an: ", + "enter_amount_transfer": "Gib die zu transferrierende Menge an: ", + "enter_tron_recipients_name": "Gib die Tron-Adresse des Empfängers ein: ", + "enter_tron_amount_transfer": "Gib die zu transferrierende Menge an: ", + "amount_numeric": "Menge sollte numerisch sein... Abbruch", + "tron_transaction_submitted": "Transaktion an TRON Netzwerk übermittelt\nTXID:", + "tron_successful_transaction": "Erfolgreiche Transaktion", + "tron_error_transaction": "Fehler beim Bestätigen der Transaktion", + "see_you_soon": " Auf Wiedersehen!", + "sigint_detected": "\nSIGINT erkannt - Schliesse.", + "about_1": "Duino-Coin CLI Wallet ist von der Duino-Coin Gemeinschaft mit <3 gemacht", + "about_2": "Dies ist die Version ", + "about_3": "Und wird verteilt unter der MIT Lizenz", + "about_4": "Server Version: ", + "about_5": "Server verwendet Version ", + "about_6": ", aber der Klient ist auf Version ", + "about_7": ", du solltest in Betracht ziehen, die neueste Version herunterzuladen", + "about_8": "Klient ist auf dem neuesten Stand", + "donate_1": "Es steht dir frei, für die Unterstützung der Entwicklung von DUCO und wDUCO zu spenden (für das Wrappen/Unwrappen fallen Gebühren für die Wartung an)", + "donate_2": "TRON und Tokens: ", + "donate_3": " (Wrapper Adresse)", + "donate_4": " (revox, DUCO Hauptentwickler)", + "donate_5": " (wDUCO Entwickler)" } } diff --git a/Resources/PC_Miner_langs.json b/Resources/PC_Miner_langs.json index a142848a..362c1eb6 100644 --- a/Resources/PC_Miner_langs.json +++ b/Resources/PC_Miner_langs.json @@ -13,9 +13,9 @@ "donation_level": "Developer donation level: ", "ask_algorithm": "Select mining algorithm you want to use (1-2): ", "ask_difficulty": "Select mining difficulty you want to use (1-3): ", - "low_diff": "Low difficulty (for Raspberry Pis, older computers)", - "medium_diff": "Medium difficulty (for typical computers)", - "net_diff": "Network difficulty (for powerful computers)", + "low_diff": "Low difficulty (Raspberry Pis and older computers)", + "medium_diff": "Medium difficulty (typical computers)", + "net_diff": "Network difficulty (powerful computers)", "low_diff_short": "Low diff", "medium_diff_short": "Medium diff", "net_diff_short": "Network diff", @@ -24,8 +24,8 @@ "basic_config_tool": "\nDuino-Coin basic configuration tool\nEdit ", "edit_config_file_warning": "/Miner_config.cfg file later if you want to change it.", "dont_have_account": "Don't have an Duino-Coin account yet? Use ", - "wallet": "Wallet", - "register_warning": " to register on server.\n", + "wallet": "https://wallet.duinocoin.com", + "register_warning": " to register on the network.\n", "ask_username": "Enter your Duino-Coin username: ", "ask_intensity": "Set mining intensity (1-100)% (recommended: 95): ", "ask_threads": "Set mining threads (recommended for your system: ", @@ -64,7 +64,7 @@ "mining_user": " User ", "mining_not_exist": " doesn't exist.", "mining_not_exist_warning": " Make sure you've entered the username correctly. Please check your config file. Retrying in 10s", - "max_threads_notice": "Mining Duino-Coin with a lot of threads will cause decrease in profit - mining threads decreased to 8", + "max_threads_notice": "Mining Duino-Coin with a lot of threads will cause decrease in profit - mining threads decreased to 16", "max_hashrate_notice": "Mining Duino-Coin with powerful equipment may not be very profitable for you - we suggest trying Coin Magi (https://xmg.network) - our 'sister' coin", "recommended": "recommended", "connection_search": "Searching for the fastest node to connect to", @@ -84,16 +84,32 @@ "report_body6": " hashes", "report_body7": "\n\t\t‖ Blocks found: ", "total_mining_time": "\n\t\t‖ Total miner uptime: ", + "rpi_cpu_temp": "\n\t\t‖ RPi CPU Temperature: ", "fasthash_available": "Using fasthash hashing accelerations", "fasthash_download": "Downloading fasthash accelerations module", "node_picker_unavailable": "Node picker doesn't seem to be responding properly - retrying in ", "node_picker_error": "Fatal error fetching server from the node picker - retrying in ", "connecting_node": " Retrieved mining node: ", - "new_version": "A new version is available, you want to update miner [Y/n] ? ", + "new_version": "A new version is available, do you want to update the miner (Y/n) ? ", "updating": "The miner is outdated. Updating....", - "ask_mining_key": "Enter your mining key (only required if you activated this option in the webwallet - press enter to skip): ", + "ask_mining_key": "Enter your mining key: ", "mining_key_required": "Mining key is required to mine on this account", - "invalid_mining_key": "The mining key you provided is invalid!" + "invalid_mining_key": "The mining key you provided is invalid!", + "running_on_rpi": "The miner seems to be running on a Raspberry Pi.", + "running_on_rpi2": "Onboard status LEDs will light up accordingly to the mining process status", + "discord_launch_error": "Error launching Discord RPC thread:", + "discord_update_error": "Error updating Discord RPC statistics:", + "key_retry": "Do you want to retry? (Y/n): ", + "incorrect_username": "The username you provided doesn't exist!", + "system_threads_notice": "Warning: you're trying to use more threads than you have.\n\t\tThis will cause unintended side effects such as your system becoming unresponsive.\n\t\tStarting in 10s", + "using_config": "Config file: ", + "motd": "Server message of the day: ", + "hashrate_total": "total", + "diff": "diff.", + "iot_on_rpi": "Duino IoT is enabled. Miner will send the CPU temperature of your Pi to your wallet.", + "iot_on_rpi2": "Test reading:", + "surpassed": "Congrats for surpassing", + "surpassed_shares": "correct shares!" }, "indonesian": { "translation_autor": "rezafauzan945", @@ -120,7 +136,7 @@ "basic_config_tool": "\nalat konfigurasi dasar Duino-Coin \nRubah ", "edit_config_file_warning": "file /Miner_config.cfg jika ingin merubahnya nanti.", "dont_have_account": "Belum memiliki akun Duino-Coin? Gunakan ", - "wallet": "Wallet", + "wallet": "https://wallet.duinocoin.com", "register_warning": " untuk mendaftar ke server.\n", "ask_username": "Masukan username Duino-Coinmu: ", "ask_intensity": "Atur intensitas miningmu (1-100)% (direkomendasikan: 95): ", @@ -160,7 +176,7 @@ "mining_user": " User ", "mining_not_exist": " tidak ada.", "mining_not_exist_warning": " Pastikan anda memasukan username dengan benar. Silahkan periksa file konfigurasi anda. Mencoba lagi dalam 10detik", - "max_threads_notice": "Menambang Duino-Coin dengan banyak thread akan menyebabkan berkurangnya keuntungan(profit) - mining threads dikurangi ke 8", + "max_threads_notice": "Menambang Duino-Coin dengan banyak thread akan menyebabkan berkurangnya keuntungan(profit) - mining threads dikurangi ke 16", "max_hashrate_notice": "Menambang Duino-Coin dengan peralatan berkekuatan tinggi(spek tinggi) mungkin sangat tidak menguntungkan untuk anda - kami sarankan untuk mencoba Coin Magi (https://xmg.network) - 'sister' coin kami", "recommended": "direkomendasikan", "connection_search": "Mencari node tercepat untuk disambungkan", @@ -187,7 +203,7 @@ "connecting_node": " mining node yang dipakai: ", "new_version": "A new version is available, you want to update miner [Y/n] ? ", "updating": "The miner is outdated. Updating....", - "ask_mining_key": "Enter your mining key (only required if you activated this option in the webwallet - press enter to skip): ", + "ask_mining_key": "Enter your mining key: ", "mining_key_required": "Mining key is required to mine on this account", "invalid_mining_key": "The mining key you provided is invalid!" }, @@ -216,7 +232,7 @@ "basic_config_tool": "\nDuino-Coin 기본 도구\n", "edit_config_file_warning": "/Miner_config.cfg 파일을 변경하려면 나중에 편집 하세요.", "dont_have_account": "아직 Duino-Coin 계정이 없으신가요? ", - "wallet": "Wallet", + "wallet": "https://wallet.duinocoin.com", "register_warning": "을 사용해서 계정을 생성(register)하세요.\n", "ask_username": "Duino-Coin 사용자 이름을 입력하세요: ", "ask_intensity": "채굴 강도 설정 (1-100)% (추천 : 95): ", @@ -256,7 +272,7 @@ "mining_user": " 사용자 ", "mining_not_exist": " 존재하지 않습니다.", "mining_not_exist_warning": " 사용자 이름을 올바르게 입력하였는지 확인하세요. config 파일을 확인하세요. 10초 내로 재시작할게요", - "max_threads_notice": "Duino-Coin 채굴에 너무 많은 쓰레드를 사용하면 오히려 불이익이 발생할 수 있어요 - 채굴 쓰레드의 갯수를 8로 낮춥니다", + "max_threads_notice": "Duino-Coin 채굴에 너무 많은 쓰레드를 사용하면 오히려 불이익이 발생할 수 있어요 - 채굴 쓰레드의 갯수를 16로 낮춥니다", "max_hashrate_notice": "Duino-Coin 채굴 시 과도하게 좋은 장비를 사용하실 필요는 없어요 - Coin Magi (https://xmg.network)를 사용하는 것을 추천드려요 - 자매 코인입니다", "recommended": "추천", "connection_search": "가장 연결이 빠른 노드를 탐색 중이에요", @@ -278,7 +294,7 @@ "total_mining_time": "\n\t\t‖ 총 채굴 기간: ", "new_version": "A new version is available, you want to update miner [Y/n] ? ", "updating": "The miner is outdated. Updating....", - "ask_mining_key": "Enter your mining key (only required if you activated this option in the webwallet - press enter to skip): ", + "ask_mining_key": "Enter your mining key: ", "mining_key_required": "Mining key is required to mine on this account", "invalid_mining_key": "The mining key you provided is invalid!" }, @@ -307,7 +323,7 @@ "basic_config_tool": "ابزار پیکربندی اولیه دوین کوین\n ویرایش ", "edit_config_file_warning": "/Miner_config.cfg اگر بعداًبخواهید آن را تغییر دهید.", "dont_have_account": "هنوز حساب دوین کوین ندارید؟ استفاده کنید", - "wallet": "حساب", + "wallet": "https://wallet.duinocoin.com", "register_warning": " برای ثبت نام در سرور.\n", "ask_username": " نام کاربری دوین کوین خود را وارد کنید: ", "ask_intensity": " تنظیم شدت استخراج (1-100)% (توصیه می شود: 95): ", @@ -347,7 +363,7 @@ "mining_user": " کاربر نام", "mining_not_exist": " وجود ندارد", "mining_not_exist_warning": " مطمئن شوید که نام کاربری را به درستی وارد کرده اید. لطفاً فایل پیکربندی خود را بررسی کنید. دوباره در 10 ثانیه تلاش می کنید ", - "max_threads_notice": " استخراج سکه دوقلو با تعداد زیادی نخ باعث کاهش سود می شود - رشته های استخراج به 8 کاهش می یابد ", + "max_threads_notice": " استخراج سکه دوقلو با تعداد زیادی نخ باعث کاهش سود می شود - رشته های استخراج به 16 کاهش می یابد ", "max_hashrate_notice": " استخراج معادن دوقلو با تجهیزات قدرتمند ممکن است برای شما چندان سودآور نباشد - پیشنهاد می کنیم Coin Magi (https://xmg.network) - سکه خواهر ما را امتحان کنید ", "recommended": " توصیه می شود ", "connection_search": " جستجوی سریعترین گره برای اتصال ", @@ -369,12 +385,12 @@ "total_mining_time": "\n\t\t‖ تمام وقت کارکرد: ", "new_version": "A new version is available, you want to update miner [Y/n] ? ", "updating": "The miner is outdated. Updating....", - "ask_mining_key": "Enter your mining key (only required if you activated this option in the webwallet - press enter to skip): ", + "ask_mining_key": "Enter your mining key: ", "mining_key_required": "Mining key is required to mine on this account", "invalid_mining_key": "The mining key you provided is invalid!" }, "slovak": { - "translation_autor": "backo", + "translation_autor": "backo & MatusOllah", "translation": "Slovenský preklad: ", "sigint_detected": " SIGINT detekovaný – ukončuje sa.", "goodbye": " Dovidenia!", @@ -398,7 +414,7 @@ "basic_config_tool": "\nZákladný konfiguračný nástroj Duino-Coin\nUpravte ", "edit_config_file_warning": "/Súbor Miner_config.cfg neskôr, ak ho chcete zmeniť.", "dont_have_account": "Ešte nemáte Duino-Coin účet? Použite ", - "wallet": "Peňaženka", + "wallet": "https://wallet.duinocoin.com", "register_warning": " na zaregistrovanie sa na serveri.\n", "ask_username": "Zadajte svoje používateľské meno Duino-Coin: ", "ask_intensity": "Nastaviť intenzitu ťažby (1 – 100) % (odporúčané: 95): ", @@ -433,12 +449,12 @@ "block_found": " Blok nájdený ", "internal_server_error": " Interná chyba servera.", "retrying": " opätovný pokus o 10s", - "rejected": " Odmietnuty ", + "rejected": " Odmietnutý ", "error_while_mining": " Chyba pri ťažbe - s najväčšou pravdepodobnosťou chyba pripojenia - reštartovanie o 5 s.", "mining_user": " Použivateľ ", "mining_not_exist": " neexistuje.", "mining_not_exist_warning": " uistite sa, že ste správne zadali používateľské meno. Skontrolujte svoj konfiguračný súbor. Opätovný pokus o 10 s", - "max_threads_notice": "Ťažba Duino-Coinu s množstvom vlákien spôsobí pokles zisku - ťažba vlákien klesla na 8", + "max_threads_notice": "Ťažba Duino-Coinu s množstvom vlákien spôsobí pokles zisku - ťažba vlákien klesla na 16", "max_hashrate_notice": "Ťažba Duino-Coinu s výkonným vybavením pre vás nemusí byť veľmi zisková – odporúčame vyskúšať Coin Magi (https://xmg.network) – našu „sesterskú“ mincu", "recommended": "odporúčané", "connection_search": "Hľadá sa najrýchlejší node na pripojenie", @@ -458,11 +474,11 @@ "report_body5": "\n\t\t‖ V tomto časovom období ste vyriešili ", "report_body6": " hashes", "total_mining_time": "\n\t\t‖ Celková doba prevádzky: ", - "new_version": "A new version is available, you want to update miner [Y/n] ? ", - "updating": "The miner is outdated. Updating....", - "ask_mining_key": "Enter your mining key (only required if you activated this option in the webwallet - press enter to skip): ", - "mining_key_required": "Mining key is required to mine on this account", - "invalid_mining_key": "The mining key you provided is invalid!" + "new_version": "K dispozícii je nová verzia, chcete aktualizovať miner [A/n] ? ", + "updating": "Miner je zastaraný. Aktualizujem....", + "ask_mining_key": "Zadajte svoj ťažobný kľúč: ", + "mining_key_required": "Na ťažbu na tomto účte je potrebný ťažobný kľúč", + "invalid_mining_key": "Zadaný ťažobný kľúč je neplatný!" }, "italian": { "translation_autor": "Il mastro Stefanuzzo", @@ -489,7 +505,7 @@ "basic_config_tool": "\nStrumento base di configurazione Duino-Coin\nModifica ", "edit_config_file_warning": "/Miner_config.cfg più tardi se vuoi cambiarlo.", "dont_have_account": "Non hai ancora un account Duino-Coin? Usa ", - "wallet": "Portafoglio (Wallet)", + "wallet": "https://wallet.duinocoin.com", "register_warning": " per registrarti sul server.\n", "ask_username": "Inserisci il tuo nome utente di Duino-Coin: ", "ask_intensity": "Imposta l'intensità di mining (1-100)% (raccomandato: 95): ", @@ -529,12 +545,12 @@ "mining_user": " Utente ", "mining_not_exist": " non esiste.", "mining_not_exist_warning": " Assicurati di aver inserito il nome utente correttamente. Per favore controlla il tuo file di configurazione. Nuovo tentativo in 10s", - "max_threads_notice": "Minare Duino-Coin con un sacco di thread causerà un peggioramento del profitto - thread di mining diminuiti a 8", + "max_threads_notice": "Minare Duino-Coin con un sacco di thread causerà un peggioramento del profitto - thread di mining diminuiti a 16", "max_hashrate_notice": "Minare Duino-Coin con un equipaggiamento potente potrebbe non essere molto profittevole per te - suggeriamo di provare Coin Magi (https://xmg.network) - la nostra moneta \"sorella\"", "recommended": "raccomandato", "new_version": "A new version is available, you want to update miner [Y/n] ? ", "updating": "The miner is outdated. Updating....", - "ask_mining_key": "Enter your mining key (only required if you activated this option in the webwallet - press enter to skip): ", + "ask_mining_key": "Enter your mining key: ", "mining_key_required": "Mining key is required to mine on this account", "invalid_mining_key": "The mining key you provided is invalid!" }, @@ -562,8 +578,8 @@ "rig_identifier": "Identyfikator koparki: ", "basic_config_tool": "\nKreator pliku konfiguracyjnego Duino-Coin\nEdytuj plik ", "edit_config_file_warning": "/Miner_config.cfg jeżeli chcesz coś poźniej zmienić.", - "dont_have_account": "Nie posiadasz konta Duino-Coin? Użyj ", - "wallet": "Wallet (Portfel)", + "dont_have_account": "Nie posiadasz konta Duino-Coin? Wejdź na ", + "wallet": "https://wallet.duinocoin.com", "register_warning": " aby zarejestrować się na sieci.\n", "ask_username": "Wprowadź swoją nazwę użytkownika Duino-Coin: ", "ask_intensity": "Wprowadź intensywność kopania (1-100)% (zalecane: 95): ", @@ -592,7 +608,7 @@ "using_algo": " używając algorytmu DUCO-S1 i ", "using_algo_xxh": " używając algorytmu XXHASH i ", "efficiency": "intensywności", - "duco_python_miner": "Duino-Coin Python Miner (v", + "duco_python_miner": "Koparka Duino-Coin (v", "accepted_shares": " zaakceptowanych share'ów", "accepted": " Zaakceptowano ", "block_found": " Znaleziono blok ", @@ -603,7 +619,7 @@ "mining_user": " Użytkownik ", "mining_not_exist": " nie jest zarejestrowany.", "mining_not_exist_warning": " Upewnij się że poprawnie wprowadziłeś nazwę użytkownika. Sprawdź swój plik konfiguracyjny. Ponowna próba za 10s", - "max_threads_notice": "Kopanie Duino-Coin z wysoką ilością wątków spowoduje spadek w zyskach - zmniejszono liczbę wątków do 8", + "max_threads_notice": "Kopanie Duino-Coin z wysoką ilością wątków spowoduje spadek w zyskach - zmniejszono liczbę wątków do 16", "max_hashrate_notice": "Kopanie Duino-Coin używając mocnego komputera może nie być bardzo opłacalne - proponujemy wpróbować Coin Magi (https://xmg.network) - naszą 'siostrzaną' monetę", "recommended": "zalecana opcja", "connection_search": "Szukanie najszybszego serwera", @@ -623,16 +639,27 @@ "report_body6": " hashy", "report_body7": "\n\t\t‖ Znalezione bloki: ", "total_mining_time": "\n\t\t‖ Koparka działa przez: ", + "rpi_cpu_temp": "\n\t\t‖ Temperatura procesora RPi: ", "fasthash_available": "Akceleracje fasthash są dostępne", "fasthash_download": "Pobieranie modułu akceleracji fasthash", "node_picker_unavailable": "Menedżer do wyboru serwerów nie odpowiada - ponowna próba za ", "node_picker_error": "Błąd przy wyborze serwera - ponowna próba za ", "connecting_node": " Wybrano najszybszy serwer: ", - "new_version": "A new version is available, you want to update miner [Y/n] ? ", - "updating": "The miner is outdated. Updating....", - "ask_mining_key": "Enter your mining key (only required if you activated this option in the webwallet - press enter to skip): ", - "mining_key_required": "Mining key is required to mine on this account", - "invalid_mining_key": "The mining key you provided is invalid!" + "new_version": "Znalezino nową wersję, chcesz zaktualizować koparkę? [Y/n] ? ", + "updating": "Koparka jest nieaktualna, aktualizacja w trakcie....", + "ask_mining_key": "Wprowadź swoje hasło do kopania (mining key): ", + "mining_key_required": "Hasło do kopania jest wymagane do kopania na tym koncie", + "invalid_mining_key": "Podane hasło do kopania jest nieprawidłowe!", + "incorrect_username": "Podana nazwa użytkownika nie istnieje!", + "system_threads_notice": "Uwaga: próbujesz uruchomić więcej wątków niż twoje urządzenie fizycznie posiada.\n\t\tMoże to spowodować zawieszenie się systemu lub problemy z konsolą.\n\t\tUruchamiam koparkę za 10s", + "using_config": "Plik konfiguracyjny: ", + "motd": "Serwerowa wiadomość dnia: ", + "hashrate_total": "łącznie", + "diff": "trudność", + "iot_on_rpi": "Duino IoT włączone - koparka będzie wysyłała temperaturę procesora do portfela.", + "iot_on_rpi2": "Testowy odczyt:", + "surpassed": "Gratulujemy osiągnięcia", + "surpassed_shares": "zaakceptowanych share'ów!" }, "spanish": { "translation_autor": "HGEpro", @@ -658,7 +685,7 @@ "basic_config_tool": "\nBásica herramienta de configuración de Duino-Coin\nEdita ", "edit_config_file_warning": "el archivo /Miner_config.cfg después si quieres cambiar algo..", "dont_have_account": "No tienes una cuenta Duino-Coin todavía? Usa ", - "wallet": "Monedero", + "wallet": "https://wallet.duinocoin.com", "register_warning": " para registrarse en el servidor.\n", "ask_username": "Introduce tu usuario de Duino-Coin: ", "ask_intensity": "Ajusta la intensidad de minado (1-100)% (recomendado: 95): ", @@ -700,44 +727,44 @@ "mining_not_exist_warning": " Asegurate de haber ingresado el nombre de usuario correcto. Revisa el archivo de configuraciones. Reintentando en 10s", "new_version": "Hay una nueva version del minero, Quieres actualizarlo? [Y/n] ? ", "updating": "El minero esta desactualizado. Actualizando....", - "ask_mining_key": "Ingresa tu llave de minado (Solo es necesario si lo activaste en la web-wallet - presiona enter para saltar): ", + "ask_mining_key": "Ingresa tu llave de minado: ", "mining_key_required": "Una llave de minado es necesaria para minar con esta cuenta", "invalid_mining_key": "La llave de minado ingresada no es válida!" }, "french": { - "translation_autor": "Bilaboz", + "translation_autor": "Bilaboz, TheFrenchTechMan", "translation": "Traduction française: ", "sigint_detected": " SIGINT détecté - Fermeture...", - "goodbye": " A bientôt!", - "greeting_morning": "J'espère que vous passez une bonne matinée!", - "greeting_noon": "J'espère que vous passez un bon après-midi", - "greeting_afternoon": "J'espère que vous passez un bon après-midi", - "greeting_evening": "Passez une bonne soirée!", - "greeting_back": "Content de te revoir", + "goodbye": " A bientôt !", + "greeting_morning": "J'espère que vous passez une bonne matinée !", + "greeting_noon": "J'espère que vous passez un bon après-midi !", + "greeting_afternoon": "J'espère que vous passez un bon après-midi !", + "greeting_evening": "Passez une bonne soirée !", + "greeting_back": "Content de vous revoir !", "banner": "Mineur Officiel (Python) Duino-Coin ©", - "donation_level": "Niveau de donation pour le développeur: ", - "ask_difficulty": "Veuillez sélectionner la difficulté de minage que vous souhaitez utiliser (1-3): ", - "low_diff": "Faible difficulté (pour les ordinateurs Raspberry Pis ou plus anciens)", + "donation_level": "Niveau de donation pour le développeur : ", + "ask_difficulty": "Veuillez sélectionner la difficulté de minage que vous souhaitez utiliser (1-3) : ", + "low_diff": "Difficulté faible (pour les ordinateurs Raspberry Pis ou plus anciens)", "medium_diff": "Difficulté moyenne (pour les ordinateurs normaux)", "net_diff": "Difficulté du réseau (pour les ordinateurs puissants)", - "low_diff_short": "Low Difficulty", + "low_diff_short": "Difficulté faible", "medium_diff_short": "Difficulté moyenne", - "net_diff_short": "Difficulté en réseau", - "algorithm": "Algorithme: ", - "rig_identifier": "Nom du mineur/rig: ", + "net_diff_short": "Difficulté du réseau", + "algorithm": "Algorithme : ", + "rig_identifier": "Nom du mineur/rig : ", "basic_config_tool": "\nEditeur de configuration Duino-Coin\nEditez ", "edit_config_file_warning": "le fichier /Miner_config.cfg si vous voulez changer votre configuration ultérieurement.", - "dont_have_account": "Vous n'avez pas encore de compte Duino-Coin? Utilisez ", - "wallet": "Porte-feuille", + "dont_have_account": "Vous n'avez pas encore de compte Duino-Coin ? Utilisez ", + "wallet": "https://wallet.duinocoin.com", "register_warning": " pour en créer un.\n", - "ask_username": "Entrez votre nom d'utilisateur Duino-Coin: ", - "ask_intensity": "Choisissez l'intensité de minage (1-100)% (recommandé: 95): ", + "ask_username": "Entrez votre nom d'utilisateur Duino-Coin : ", + "ask_intensity": "Choisissez l'intensité de minage (1-100)% (recommandé: 95) : ", "ask_threads": "Choisissez le nombre de threads (recommandé pour votre système: ", - "ask_lower_difficulty": "Voulez vous utiliser une difficulté de minage plus basse (pour les systèmes les plus lents)? (y/N): ", - "ask_rig_identifier": "Voulez vous ajouter un indentifieur (un nom) à ce mineur/rig? (y/N): ", - "ask_rig_name": "Entrez le nom du mineur/rig désiré: ", - "ask_donation_level": "Choisissez le niveau de donation (0-5) (recommandé: 1), cela ne réduira pas vos gains: ", - "config_saved": "Configuration sauvegardée! Lancement du mineur", + "ask_lower_difficulty": "Voulez vous utiliser une difficulté de minage plus basse (pour les systèmes les plus lents) ? (y/N) : ", + "ask_rig_identifier": "Voulez vous ajouter un indentifieur (un nom) à ce mineur/rig? (y/N) : ", + "ask_rig_name": "Entrez le nom du mineur/rig désiré : ", + "ask_donation_level": "Choisissez le niveau de donation (0-5) (recommandé : 1), cela ne réduira pas vos gains : ", + "config_saved": "Configuration sauvegardée ! Lancement du mineur", "load_config_error": " Erreur durant le chargement du fichier de configuration (", "load_config_error_warning": "/Miner_config.cfg). Essayez de le supprimer et relancez le mineur. Exiting in 10s", "free_network_warning": " Le réseau Duino-Coin est un service complètement gratuit et le sera toujours", @@ -745,7 +772,7 @@ "learn_more_donate": " pour en apprendre d'avantage sur comment vous pouvez nous aider :)", "starting_donation": "Démarrage du service de donation", "thanks_donation": " Merci d'être un super donateur ❤️ \nVotre don nous aidera a maintenir le serveur et permettra un développement ultérieur", - "data_error": " Erreur lors de la récupération des données depuis GitHub! Nouvel essai dans 10s.", + "data_error": " Erreur lors de la récupération des données depuis GitHub ! Nouvel essai dans 10s.", "connected": " Connecté", "connected_server": " au serveur principal Duino-Coin (v", "outdated_miner": " Mineur obsolète (v", @@ -775,7 +802,7 @@ "uptime_minutes": " minutes", "uptime_hour": " heure", "uptime_hours": " heures", - "periodic_mining_report": "Rapport de minage périodique: ", + "periodic_mining_report": "Rapport de minage périodique : ", "report_period": "\n\t\t‖ Durant les dernières ", "report_time": " secondes", "report_body1": "\n\t\t‖ Vous avez miné ", @@ -784,18 +811,18 @@ "report_body4": "\n\t\t‖ Avec un hashrate de ", "report_body5": "\n\t\t‖ Dans cette période, vous avez résolu ", "report_body6": " hashes", - "report_body7": "\n\t\t‖ Blocs trouvés: ", - "total_mining_time": "\n\t\t‖ Uptime total du mineur: ", + "report_body7": "\n\t\t‖ Blocs trouvés : ", + "total_mining_time": "\n\t\t‖ Uptime total du mineur : ", "fasthash_available": "Utilisation des accélérations de hachage fasthash", "fasthash_download": "Téléchargement du module d'accélération fasthash", - "node_picker_unavailable": "Node picker doesn't seem to be responding properly - retrying in ", - "node_picker_error": "Erreur fatale lors de la récupération du serveur à partir du sélecteur de node picker - nouvel essai dans ", - "connecting_node": " Mining node récupéré: ", - "new_version": "Une nouvelle version est disponnible, voulez vous faire la mise à jour [Y/n] ? ", - "updating": "Le mineur est obsolète. Mise a jour....", - "ask_mining_key": "Entrez votre clé de minage (mining key) - (Cela est seulement nécessaire si vous avez activé cette option dans le webwallet): ", + "node_picker_unavailable": "La sélecteur de node ne semble pas répondre corrctement - nouvel essai dans ", + "node_picker_error": "Erreur fatale lors de la récupération du serveur à partir du sélecteur de node - nouvel essai dans ", + "connecting_node": " Node de minage récupéré : ", + "new_version": "Une nouvelle version est disponible, voulez vous faire la mise à jour [Y/n] ? ", + "updating": "Le mineur est obsolète. Mise a jour...", + "ask_mining_key": "Entrez votre clé de minage: ", "mining_key_required": "Une clé de minage (mining key) est nécessaire pour miner sur ce compte", - "invalid_mining_key": "La clé de minage fournie est invalide!" + "invalid_mining_key": "La clé de minage fournie est invalide !" }, "russian": { "translation_autor": "5Q", @@ -821,7 +848,7 @@ "basic_config_tool": "\nИнструмент базовой настройки Duino-Coin\nОтредактируйте файл ", "edit_config_file_warning": "/Miner_config.cfg если вы захотите их изменить.", "dont_have_account": "Еще нет аккаунта Duino-Coin? Используйте ", - "wallet": "Кошелек", + "wallet": "https://wallet.duinocoin.com", "register_warning": " для регистрации на сервере.\n", "ask_username": "Введите ваше имя пользователя Duino-Coin: ", "ask_intensity": "Установите мощность майнинга (1-100)% (рекомендуется: 95): ", @@ -863,7 +890,7 @@ "mining_not_exist_warning": " Убедитесь в том, что вы правильно ввели имя пользователя. Пожалуйста, проверьте ваш файл настроек. Пробуем еще раз через 10с", "new_version": "A new version is available, you want to update miner [Y/n] ? ", "updating": "The miner is outdated. Updating....", - "ask_mining_key": "Enter your mining key (only required if you activated this option in the webwallet - press enter to skip): ", + "ask_mining_key": "Enter your mining key: ", "mining_key_required": "Mining key is required to mine on this account", "invalid_mining_key": "The mining key you provided is invalid!" }, @@ -892,7 +919,7 @@ "basic_config_tool": "\nІнструмент базових налаштувань Duino-Coin\nВідредагуйте файл ", "edit_config_file_warning": "/Miner_config.cfg якщо ви захочете їх змінити.", "dont_have_account": "Ще немає акаунту Duino-Coin? Використовуйте ", - "wallet": "Гаманець", + "wallet": "https://wallet.duinocoin.com", "register_warning": " для реєстрації на сервері.\n", "ask_username": "Введіть ім'я користувача Duino-Coin: ", "ask_intensity": "Встановіть потужність майнінгу (1-100)% (рекомендовано: 95): ", @@ -932,7 +959,7 @@ "mining_user": " Користувач ", "mining_not_exist": " не існує.", "mining_not_exist_warning": " Переконайтеся, що ви правильно ввели ім'я користувача. Будь-ласка, перевірте ваш файл налаштувань. Спробуємо ще раз через 10с", - "max_threads_notice": "Майнінг Duino-Coin з великою кількістю потоків призведе до зниження прибутку - Кількість потоків зменьшено до 8", + "max_threads_notice": "Майнінг Duino-Coin з великою кількістю потоків призведе до зниження прибутку - Кількість потоків зменьшено до 16", "max_hashrate_notice": "Майнінг Duino-Coin з потужним обладнанням може бути не дуже вигідним для вас - ми пропонуємо спробувати Coin Magi (https://xmg.network) - наша 'сестринська' монета", "recommended": "рекомендовано", "connection_search": "Пошук найшвидшого вузла для підключення", @@ -959,7 +986,7 @@ "connecting_node": " Отриманий вузол майнінгу: ", "new_version": "A new version is available, you want to update miner [Y/n] ? ", "updating": "The miner is outdated. Updating....", - "ask_mining_key": "Enter your mining key (only required if you activated this option in the webwallet - press enter to skip): ", + "ask_mining_key": "Enter your mining key: ", "mining_key_required": "Mining key is required to mine on this account", "invalid_mining_key": "The mining key you provided is invalid!" }, @@ -975,8 +1002,9 @@ "greeting_back": "Willkommen zurück", "banner": "Ofizieller Duino-Coin © Python Miner", "donation_level": "Entwickler-Spendenlevel: ", + "ask_algorithm": "Wähle welchen Schürfalgorithmus du verwenden möchtest (1-2): ", "ask_difficulty": "Bitte wähle die Schürfschwierigkeit aus, die du benutzen willst (1-3): ", - "low_diff": "Niedrige Schwierigkeit (für Raspberry Pis oder ältere Computer", + "low_diff": "Niedrige Schwierigkeit (für leistungsarme Raspberry Pis und ältere Computer)", "medium_diff": "Mittlere Schwierigkeit (für normale Computer)", "net_diff": "Netzwerkgesteurte Schwierigkeit (für leistungsstarke Computer)", "low_diff_short": "Niedrige Schw.", @@ -987,7 +1015,7 @@ "basic_config_tool": "\nDuino-Coin simples Konfigurationstool\nBearbeite ", "edit_config_file_warning": "/Miner_config.cfg wenn du später Einstellungen verändern möchtest.", "dont_have_account": "Du hast noch keinen Duino-Coin Account? Benutze ", - "wallet": "Wallet", + "wallet": "https://wallet.duinocoin.com", "register_warning": " um dich zu registrieren.\n", "ask_username": "Gib deinen Duino-Coin Nutzernamen ein: ", "ask_intensity": "Wie viel Prozent der Leistung soll Duino-Coin verwenden? (1-100)% (empfohlen: 95): ", @@ -1027,12 +1055,46 @@ "mining_user": " Benutzer ", "mining_not_exist": " existiert nicht.", "mining_not_exist_warning": " Stelle sicher, dass du den Nutzernamen korrekt geschrieben hast. Überprüfe deine Konfigurationsdatei. Neuversuch in 10s", + "max_threads_notice": "Das Schürfen von Duino-Coin verursacht einen verminderten Profit - Schürfthreads wurden auf 16 reduziert", + "max_hashrate_notice": "Das Schürfen von Duino-Coin mit leistungsstarkem Equipment könnte nicht so profitabel sein - wir empfehlen es mit Coin Magi zu versuchen (https://xmg.network) - unserer 'Schwester' Währung", + "recommended": "empfohlen", + "connection_search": "Suche nach dem schnellsten Knoten für die Verbindung", + "uptime_seconds": " Sekunden", + "uptime_minute": " Minute", + "uptime_minutes": " Minuten", + "uptime_hour": " Stunde", + "uptime_hours": " Stunden", + "periodic_mining_report": "Periodischer Schürfbericht: ", + "report_period": "\n\t\t‖ Während den letzten ", + "report_time": " Sekunden", + "report_body1": "\n\t\t‖ Du hast ", + "report_body2": " Anteile geschürft (", + "report_body3": " Anteile/s)", + "report_body4": "\n\t\t‖ Mit einer Hashrate von ", + "report_body5": "\n\t\t‖ Während dieser Zeitspanne hast du ", + "report_body6": " Hashes gelöst", + "report_body7": "\n\t\t‖ Blöcke gefunden: ", + "total_mining_time": "\n\t\t‖ Gesamte Betriebszeit des Schürfklienten: ", + "fasthash_available": "Verwende fasthash hashing Beschleunigung", + "fasthash_download": "Lade fasthash Beschleunigungsmodul herunter", + "node_picker_unavailable": "Der Knotenwähler scheint nicht korrekt zu reagieren - Neuversuch in ", + "node_picker_error": "Schwerwiegender Fehler beim Holen des Servers vom Knotenwähler - Neuversuch in ", + "connecting_node": " Abgerufener Mining-Knoten: ", "connection_search": "Suche nach der schnellsten Verbindung zu dem Server", "new_version": "Eine neue Version ist verfügbar, möchtest du den Miner updaten [Y/n] ?", "updating": "Der Miner ist nicht aktuell. Aktualisierung....", - "ask_mining_key": "Mining-Key eingeben (nur notwendig, wenn du diese Option in deinem Webwallet aktiviert hast - drücke Enter zum überspringen): ", + "ask_mining_key": "Mining-Key eingeben: ", "mining_key_required": "Es wird ein Mining-Key benötigt, um an diesem Account zu minen", - "invalid_mining_key": "Der eingegebene Mining-Key ist ungültig!" + "invalid_mining_key": "Der eingegebene Mining-Key ist ungültig!", + "running_on_rpi": "Der Schürfklient scheint auf einem Raspberry Pi zu laufen.", + "running_on_rpi2": "Die integrierten Status-LEDs leuchten entsprechend dem Schürfprozess auf.", + "discord_launch_error": "Fehler beim Starten des Discord RPC Threads:", + "discord_update_error": "Fehler beim Aktualisieren der Discord RPC Statistik:", + "key_retry": "Willst du es erneut versuchen? (Y/n): ", + "incorrect_username": "Der angegebene Nutzername existiert nicht!", + "system_threads_notice": "Warnung: Du verwendest mehr Threads als das Gerät hat.\n\t\tDas verursacht unbeabsichtige Nebeneffekte, wie z.B., dass dein System nicht mehr reagiert.\n\t\tStarting in 10s", + "using_config": "Konfigurationsdatei: ", + "motd": "Server-Nachricht des Tages: " }, "chinese_simplified": { "translation_autor": "suifengtec", @@ -1059,7 +1121,7 @@ "basic_config_tool": "\nDuino-Coin 基础配置工具\n编辑 ", "edit_config_file_warning": "/如果要更改 Miner_config.cfg 文件,请稍后。", "dont_have_account": "还没有Duino-Coin帐户吗? 使用 ", - "wallet": "钱包", + "wallet": "https://wallet.duinocoin.com", "register_warning": " 在服务器上注册个。\n", "ask_username": "输入您的 Duino-Coin 用户名: ", "ask_intensity": "设定挖矿强度(1-100)%(建议:95): ", @@ -1101,10 +1163,81 @@ "mining_not_exist_warning": " 确保您正确输入了用户名。请检查您的配置文件。 将在10秒内重试", "new_version": "A new version is available, you want to update miner [Y/n] ? ", "updating": "The miner is outdated. Updating....", - "ask_mining_key": "Enter your mining key (only required if you activated this option in the webwallet - press enter to skip): ", + "ask_mining_key": "Enter your mining key: ", "mining_key_required": "Mining key is required to mine on this account", "invalid_mining_key": "The mining key you provided is invalid!" }, + "chinese_Traditional": { + "translation_autor": "Microlan Steven.Chen", + "translation": "繁體中文翻譯:", + "sigint_detected": "檢測到使用者強制中斷訊號 - 將退出程式.", + "goodbye": " 再見", + "greeting_morning": "早安!", + "greeting_noon": "午安", + "greeting_afternoon": "晚安", + "greeting_evening": "祝您有個美好的夜晚", + "greeting_back": "歡迎回來", + "banner": "官方版 Duino-Coin © Python 挖礦程式", + "donation_level": "開發者貢獻等級: ", + "ask_algorithm": "請選擇挖礦演算法 (1-2): ", + "ask_difficulty": "請選擇挖礦難度 (1-3): ", + "low_diff": "低難度(適用樹梅派以及較陽春的電腦)", + "medium_diff": "中等難度(適用於一般電腦)", + "net_diff": "網路高難度(適用於高階電腦)", + "low_diff_short": "低難度", + "medium_diff_short": "中等難度", + "net_diff_short": "網路高難度", + "algorithm": "演算法: ", + "rig_identifier": "礦機標示符號: ", + "basic_config_tool": "\nDuino-Coin 基本設定工具\n編輯 ", + "edit_config_file_warning": "/如果要修改 Miner_config.cfg 文件,請稍等。", + "dont_have_account": "還沒有Duino-Coin帳號嗎? 使用 ", + "wallet": "https://wallet.duinocoin.com", + "register_warning": " 在伺服器上註冊。\n", + "ask_username": "輸入您的 Duino-Coin 用户名稱: ", + "ask_intensity": "設定挖礦難度(1-100)%(建議:95): ", + "ask_threads": "設定挖礦線程(推薦用在您的系统: ", + "ask_lower_difficulty": "您是否要使用較低的難度進行挖礦(對於較慢的系統)? (y/N): ", + "ask_rig_identifier": "您是否要向該礦機機加入標示名稱(名稱)? (y/N): ", + "ask_rig_name": "輸入您想要的礦機名稱(可含有英文及数字和下底線): ", + "ask_donation_level": "將開發者捐贈級別設置為(0-5)(建議:1),這將不會減少您的收入: ", + "config_saved": "設定檔已經儲存!可以開始挖礦了", + "load_config_error": "載入設定檔錯誤 (", + "load_config_error_warning": "/Miner_config.cfg)。請嘗試將此檔案刪除,並再次設定,將在10秒內退出軟體", + "free_network_warning": " Duino-Coin網路是一項完全免費的服務,而且永遠都是", + "donate_warning": "\n我們不會從您的挖礦過程中收取任何費用。\n您可以透過捐贈來真正幫我我們維護伺服器和低價交易易。\n連結 ", + "learn_more_donate": " 進一步了解如何提供協助 :)", + "starting_donation": "開始捐證過程", + "thanks_donation": " 感謝您的貢獻 ❤ \n您的捐贈將幫助我們維護伺服器及進一步的軟體開發", + "data_error": " 從GitHub檢索數據出錯! 將在10秒後重試。", + "connected": " 已連接", + "connected_server": " 連線至 Duino-Coin 主伺服器 (v", + "outdated_miner": " 挖礦軟體為舊版本 (v", + "server_is_on_version": " 伺服器上的版本是 v", + "update_warning": ", 請從 https://github.com/revoxhere/duino-coin/releases/ 下載最新版本", + "connecting_error": " 連接伺服器錯誤。 10s後重試。", + "mining_thread": " 挖礦線程 #", + "mining_thread_starting": " 正在開啟", + "using_algo": " 使用 DUCO-S1 演算法算法與 ", + "using_algo_xxh": " 使用 XXHASH 演算法算法與 ", + "efficiency": "效率", + "duco_python_miner": "Duino-Coin Python 版礦機程式 (v", + "accepted_shares": "已接受分配", + "accepted": " 已接受 ", + "block_found": " 找到區塊 ", + "internal_server_error": " 內部伺服器錯誤.", + "retrying": " 10s 重試", + "rejected": " 已拒絕 ", + "error_while_mining": " 挖礦時出錯 - 有可能是連線錯誤 - 將在5秒鐘內重新啟動。", + "mining_user": " 使用者 ", + "mining_not_exist": " 不存在。", + "mining_not_exist_warning": " 請確認您正確輸入了帳號名稱。請檢查您的設定檔。將在10秒後重試。", + "new_version": "線上有新版本可更新,您想更新挖礦程式嗎? [Y/n] ? ", + "updating": "挖礦軟體過舊。正在更新中.....", + "ask_mining_key": "請輸入您的挖礦密碼: ", + "mining_key_required": "此帳號挖礦需要挖礦密碼", + "invalid_mining_key": "您提供的挖礦密碼無效!" + }, "turkish": { "translation_autor": "Scatchie", "translation": "Türkçe tercümesi: ", @@ -1130,7 +1263,7 @@ "basic_config_tool": "\nDuino-Coin yapılandırma aracı\nDüzenleyin ", "edit_config_file_warning": "/Miner_config.cfg dosyasını eğer daha sonra değiştirmek istiyorsanız.", "dont_have_account": "Henüz bir Duino-Coin hesabınız yok mu? Kullanın ", - "wallet": "Cüzdan", + "wallet": "https://wallet.duinocoin.com", "register_warning": " sunucuya kayıt olmak için.\n", "ask_username": "Duino-Coin kullanıcı adınızı girin: ", "ask_intensity": "Madencilik gücünü seçin (1-100)% (önerilen: 95): ", @@ -1173,7 +1306,7 @@ "connection_search": "Sunuculara bağlanmak için en hızlı bağlantı aranıyor", "new_version": "A new version is available, you want to update miner [Y/n] ? ", "updating": "The miner is outdated. Updating....", - "ask_mining_key": "Enter your mining key (only required if you activated this option in the webwallet - press enter to skip): ", + "ask_mining_key": "Enter your mining key: ", "mining_key_required": "Mining key is required to mine on this account", "invalid_mining_key": "The mining key you provided is invalid!" }, @@ -1201,7 +1334,7 @@ "basic_config_tool": "\nFerramenta de configuração básica do Duino-Coin\nEdita ", "edit_config_file_warning": "Se você quiser trocar as configurações mais tarde /Miner_config.cfg é o arquivo.", "dont_have_account": "Você já tem uma conta no Duino-Coin? Se sim use-a.", - "wallet": "Carteira", + "wallet": "https://wallet.duinocoin.com", "register_warning": " Pare se registrar no servidor.\n", "ask_username": "Seu nome na Duino-Coin: ", "ask_intensity": "Intensidade da Mineração (1-100)% (recomendado: 95): ", @@ -1217,7 +1350,7 @@ "donate_warning": "\nNão recebemos nada pela sua mineração.\nSe quiser nos ajudar, doe em nosso site.\nVisite ", "learn_more_donate": " para saber como nos ajudar :)", "starting_donation": "Iniciando o processo de doação.", - "thanks_donation": " Obrigado por doar ❤️ Seu apoio, idependente do tamanho ajuda muito.", + "thanks_donation": " Obrigado por doar ❤️ Seu apoio, independente do tamanho ajuda muito.", "data_error": " Erro ao tentar extrair os arquivos do GitHub! Tentando novamente em 10s.", "connected": " Conectado", "connected_server": " servidor principal do Duino-Coin (v", @@ -1241,7 +1374,7 @@ "mining_user": " User ", "mining_not_exist": " não existe", "mining_not_exist_warning": " Usuario incorreto, confira-o. Tentando novamente em 10s", - "max_threads_notice": "Minerar Duino-Coin com muitos núcleos(threads) causará queda na produtividade(lucro) - núcleos de mineração reduzido para 8", + "max_threads_notice": "Minerar Duino-Coin com muitos núcleos(threads) causará queda na produtividade(lucro) - núcleos de mineração reduzido para 16", "max_hashrate_notice": "Minerar Duino-Coin com equipamentos poderosos pode não ser muito lucrativo para você - sugerimos tentar a Coin Magi (https://xmg.network) - ou 'sister' coin", "recommended": "recomendado", "connection_search": "Procurando o servidor/nó mais rápido para se conectar", @@ -1263,7 +1396,7 @@ "total_mining_time": "\n\t\t‖ Tempo de atividade total do minerador: ", "new_version": "A new version is available, you want to update miner [Y/n] ? ", "updating": "The miner is outdated. Updating....", - "ask_mining_key": "Enter your mining key (only required if you activated this option in the webwallet - press enter to skip): ", + "ask_mining_key": "Enter your mining key: ", "mining_key_required": "Mining key is required to mine on this account", "invalid_mining_key": "The mining key you provided is invalid!" }, @@ -1285,7 +1418,7 @@ "basic_config_tool": "\nWizard tal-Fajl tal-Konfigurazzjoni tad-Duino-Coin \nEdit File", "edit_config_file_warning": "/Miner_config.cfg jekk trid tibdel xi ħaġa aktar tard.", "dont_have_account": "M'għandekx kont Duino-Coin? Uża", - "wallet": "Kartiera (Kartiera)", + "wallet": "https://wallet.duinocoin.com", "register_warning": "biex tirreġistra fuq il-web. \n", "ask_username": "Daħħal l-username ta 'Duino-Coin tiegħek:", "ports_message": "Il-wizard tal-konfigurazzjoni sab il-portijiet li ġejjin:", @@ -1309,7 +1442,6 @@ "server_is_on_version": "is-server huwa fuq v", "update_warning": ", jekk jogħġbok niżżel l-aħħar verżjoni minn https://github.com/revoxhere/duino-coin/releases/", "connection_error": "Problema fil-konnessjoni mas-server. Erġa 'pprova f'10s", - "duco_avr_miner": "AVR Duino-Coin excavator (v", "acceptable_shares": "ishma aċċettati", "block_found": "Blokk misjub", "error_while_mining": "Żball waqt it-tħaffir - probabbilment problema ta 'konnessjoni - erġa' pprova f'5s.", @@ -1330,7 +1462,7 @@ "load_config_error_warning": "/Miner_config.cfg). Ipprova neħħih u erġa 'ibda l-iskavatur. Agħlaq f'10 sekondi", "new_version": "A new version is available, you want to update miner [Y/n] ? ", "updating": "The miner is outdated. Updating....", - "ask_mining_key": "Enter your mining key (only required if you activated this option in the webwallet - press enter to skip): ", + "ask_mining_key": "Enter your mining key: ", "mining_key_required": "Mining key is required to mine on this account", "invalid_mining_key": "The mining key you provided is invalid!" }, @@ -1359,7 +1491,7 @@ "basic_config_tool": "\nDuino-Coin เครื่องมือการตั้งค่าพื้นฐาน\nแก้ไข ", "edit_config_file_warning": "ไฟล์ /Miner_config.cfg ภายหลังหากคุณต้องการเปลี่ยนแปลง", "dont_have_account": "ยังไม่มีบัญชี Duino-Coin? ใช้ ", - "wallet": "วอลเล็ท", + "wallet": "https://wallet.duinocoin.com", "register_warning": " เพื่อลงทะเบียนบนเซิร์ฟเวอร์\n", "ask_username": "ใส่ชื่อผู้ใช้ Duino-Coin: ", "ask_intensity": "ตั้งค่าความแรงในการขุดS (1-100)% (แนะนำ: 95): ", @@ -1399,7 +1531,7 @@ "mining_user": " ผู้ใช้ ", "mining_not_exist": " ไม่มีอยู่", "mining_not_exist_warning": " ตรวจสอบความถูกต้องของชื่อผู้ใช้งาน กรุณาตรวจสอบไฟล์การตั้งค่า ลองใหม่ใน 10วิ", - "max_threads_notice": "การขุด Duino-Coin ด้วยเธรดจำนวนมากจะทำให้กำไรลดลง - เธรดการขุดลดเหลือ 8", + "max_threads_notice": "การขุด Duino-Coin ด้วยเธรดจำนวนมากจะทำให้กำไรลดลง - เธรดการขุดลดเหลือ 16", "max_hashrate_notice": "การขุด Duino-Coin ด้วยอุปกรณ์ที่มีพลังสูงอาจจะไม่ได้ทำให้คุณได้กำไรสูงสุด- เราแนะนำให้ลอง Magi (https://xmg.network) - เหรียญ 'พี่น้อง' ของเรา", "recommended": "แนะนำ", "connection_search": "กำลังค้นหาโนดที่เร็วที่สุดเพื่อเชื่อมต่อ", @@ -1421,7 +1553,7 @@ "total_mining_time": "\n\t\t‖ เวลาที่ตัวขุดทำงานทั้งหมด: ", "new_version": "A new version is available, you want to update miner [Y/n] ? ", "updating": "The miner is outdated. Updating....", - "ask_mining_key": "Enter your mining key (only required if you activated this option in the webwallet - press enter to skip): ", + "ask_mining_key": "Enter your mining key: ", "mining_key_required": "Mining key is required to mine on this account", "invalid_mining_key": "The mining key you provided is invalid!" }, @@ -1450,7 +1582,7 @@ "basic_config_tool": "\nDuino-Coin बुनियादी विन्यास उपकरण\nपरिवर्तन ", "edit_config_file_warning": "/Miner_config.cfg बाद में फ़ाइल करें यदि आप इसे बदलना चाहते हैं.", "dont_have_account": "क्या आपके पास अभी तक डुइनो-कॉइन खाता नहीं है? इस का उपयोग करें ", - "wallet": "वॉलेट", + "wallet": "https://wallet.duinocoin.com", "register_warning": " सर्वर पर रजिस्टर करने के लिए।\n", "ask_username": "अपना डुइनो-कॉइन उपयोगकर्ता नाम दर्ज करें: ", "ask_intensity": "खनन तीव्रता (1-100)% सेट करें (अनुशंसित: 95): ", @@ -1490,7 +1622,7 @@ "mining_user": " उपयोगकर्ता ", "mining_not_exist": " मौजूद नहीं है.", "mining_not_exist_warning": " सुनिश्चित करें कि आपने उपयोगकर्ता नाम सही ढंग से दर्ज किया है। कृपया अपनी कॉन्फ़िगरेशन फ़ाइल जांचें। 10s . में पुन: प्रयास करना", - "max_threads_notice": "बहुत सारे धागे के साथ खनन डुइनो-सिक्का से लाभ में कमी आएगी - खनन धागे घटकर 8 . हो गए", + "max_threads_notice": "बहुत सारे धागे के साथ खनन डुइनो-सिक्का से लाभ में कमी आएगी - खनन धागे घटकर 16 . हो गए", "max_hashrate_notice": "शक्तिशाली उपकरणों के साथ डुइनो-सिक्का खनन आपके लिए बहुत लाभदायक नहीं हो सकता है - हमारा सुझाव है कि सिक्का मैगी (https://xmg.network) - हमारे मित्र सिक्का को आजमाएं", "recommended": "अनुशंसित", "connection_search": "कनेक्ट करने के लिए सबसे तेज़ नोड की खोज", @@ -1517,7 +1649,7 @@ "connecting_node": " पुनर्प्राप्त खनन नोड: ", "new_version": "A new version is available, you want to update miner [Y/n] ? ", "updating": "The miner is outdated. Updating....", - "ask_mining_key": "Enter your mining key (only required if you activated this option in the webwallet - press enter to skip): ", + "ask_mining_key": "Enter your mining key: ", "mining_key_required": "Mining key is required to mine on this account", "invalid_mining_key": "The mining key you provided is invalid!" }, @@ -1546,7 +1678,7 @@ "basic_config_tool": "\nDuino-Coin základní konfigurační nástroj\nUprav ", "edit_config_file_warning": "/Miner_config.cfg soubor můžeš editovat později, pokud ho budeš chtít změnit.", "dont_have_account": "Ještě nemáš Duino-Coin účet? Použij ", - "wallet": "Peněženka", + "wallet": "https://wallet.duinocoin.com", "register_warning": " registruj se na serveru.\n", "ask_username": "Zadej své Duino-Coin uživatelské jméno: ", "ask_intensity": "Nastav intenzitu těžby (1-100)% (doporučeno: 95): ", @@ -1586,7 +1718,7 @@ "mining_user": " Uživatel ", "mining_not_exist": " neexistuje.", "mining_not_exist_warning": " Ujisti se, že jsi zadal uživatelské jméno správně. Zkontroluj prosím soubor konfigurace. Zkusím to znovu za 10s", - "max_threads_notice": "Těžba Duino-Coinu na příliš mnoho vláknech snižuje tvůj profit - snižuji počet vláken na 8", + "max_threads_notice": "Těžba Duino-Coinu na příliš mnoho vláknech snižuje tvůj profit - snižuji počet vláken na 16", "max_hashrate_notice": "Těžba Duino-Coinu na takto výkonném zařízení pro tebe nemusí být výdělečná - doporučujeme zkusit Coin Magi (https://xmg.network) - naši 'sesterskou' minci", "recommended": "doporučené", "connection_search": "Hledám nejrychlejší uzel k připojení", @@ -1611,10 +1743,235 @@ "node_picker_unavailable": "Výběrčí uzlů nejspíš nepracuje správně - zkusím to znovu za ", "node_picker_error": "Fatální chyba při vybírání uzlů - zkusím to znovu za ", "connecting_node": " Získaný těžební uzel: ", - "new_version": "A new version is available, you want to update miner [Y/n] ? ", - "updating": "The miner is outdated. Updating....", - "ask_mining_key": "Enter your mining key (only required if you activated this option in the webwallet - press enter to skip): ", - "mining_key_required": "Mining key is required to mine on this account", - "invalid_mining_key": "The mining key you provided is invalid!" + "new_version": "Je dostupná nová verze. Chceš aktualizovat těžební program [Y/n] ? ", + "updating": "Těžební program je zastaralý. Aktualizuji....", + "ask_mining_key": "Zadej svůj těžební klíč: ", + "mining_key_required": "Těžební klíč je nutný pro těžbu na tomto účtu", + "invalid_mining_key": "Zadaný těžební klíč je neplatný!", + "running_on_rpi": "Vypadá to, že tento těžební program jede na Raspberry Pi.", + "running_on_rpi2": "Signalizační LEDky na počítači budou indikovat probíhající těžbu", + "discord_launch_error": "Chyba při otevírání Discord RPC vlákna:", + "discord_update_error": "Chyba při aktualizaci Discord RPC statistik:", + "key_retry": "Chceš to zkusit znovu? (Y/n): ", + "incorrect_username": "Zadané uživatelské jméno neexistuje!", + "system_threads_notice": "Varování: Pokoušíš se využít více jader, než má tvůj počítač. \n\t\tToto může vést k nepředvídatelným vedlejším účinkům a systém se může zaseknout.\n\t\tZačínám za 10s", + "using_config": "Konfigurační soubor: ", + "motd": "Serverová zpráva dne: ", + "hashrate_total": "celkem", + "diff": "obtížnost", + "iot_on_rpi": "Duino IoT je zapnuté. Těžební program bude posílat teplotu procesoru tvého Raspberry Pi do webové peněženky.", + "iot_on_rpi2": "Testuji čtení senzorů:", + "surpassed": "Gratulujeme k dosažení", + "surpassed_shares": "úspěšných operací!" + }, + "japanese": { + "translation_autor": "Ikko Ashimine", + "translation": "日本語翻訳: ", + "sigint_detected": " SIGINTが検出されました - 正常に終了しています。", + "goodbye": " では、また!", + "greeting_morning": "素敵な朝をお過ごしください", + "greeting_noon": "美味しいお昼をどうぞ", + "greeting_afternoon": "穏やかな午後をお過ごしください", + "greeting_evening": "快適な夜をお過ごしください", + "greeting_back": "おかえりなさい", + "banner": "公式Duino-Coin © Pythonマイナー", + "donation_level": "デベロッパーの寄付レベル: ", + "ask_algorithm": "使用するマイニングアルゴリズムを選択(1-2): ", + "ask_difficulty": "使用するマイナー難易度を選択する(1-3): ", + "low_diff": "難易度低め(性能の低いRaspberry Piや古いPC向け)", + "medium_diff": "中難易度(より高性能なや一般的なコンピュータ向け)", + "net_diff": "ネットワークの難易度(強力なコンピュータの場合)", + "low_diff_short": "ローdiff", + "medium_diff_short": "ミディアムdiff", + "net_diff_short": "ネットワークdiff", + "algorithm": "アルゴリズム: ", + "rig_identifier": "リグ識別子: ", + "basic_config_tool": "\nDuino-Coin基本設定ツール\n編集 ", + "edit_config_file_warning": "/Miner_config.cfgファイルを後で変更したい場合。", + "dont_have_account": "をまだお持ちでない方はこちらを使用 ", + "wallet": "https://wallet.duinocoin.com", + "register_warning": " をクリックしてサーバーに登録します。\n", + "ask_username": "Duino-Coinのユーザー名を入力します: ", + "ask_intensity": "マイナー強度(1~100)%(推奨:95)を設定: ", + "ask_threads": "マイニングスレッドの設定(お使いのシステムで推奨される: ", + "ask_lower_difficulty": "マイニングに低い難易度を使用しますか(低速なシステムの場合)?(y/N): ", + "ask_rig_identifier": "このリグに識別子(名前)を追加しますか? (y/N): ", + "ask_rig_name": "ご希望のリグネームの入力: ", + "ask_donation_level": "開発者の寄付レベル(0~5)を設定します(推奨:1)、これによって収益が減少することはありません: ", + "config_saved": "コンフィグが保存されました!マイナーを起動する", + "load_config_error": " コンフィグファイルの読み込みエラー (", + "load_config_error_warning": "/Miner_config.cfg)。削除してコンフィグを再実行してみてください。10秒後に終了", + "free_network_warning": " Duino-Coinネットワークは完全な無料サービスであり、今後も常に", + "donate_warning": "\nお客様のマイニングから手数料を取ることはありません。\n寄付をすることで、サーバーの維持や低料金での交換に本当に貢献できます。\n以下を訪れてください ", + "learn_more_donate": " をクリックすると、詳細が表示されます:)", + "starting_donation": "寄付の手続き開始", + "thanks_donation": " 素晴らしい寄付をしていただきありがとうございます ❤️ \nご寄付は、サーバーの維持とさらなる開発のために活用させていただきます", + "data_error": " GitHubからのデータ取得に失敗! 10秒後に再試行します。", + "connected": " 接続済み", + "connected_server": " マスターDuino-Coinサーバーへ (v", + "outdated_miner": " マイナーが古いです (v", + "server_is_on_version": " サーバーは v", + "update_warning": "、最新版は、https://github.com/revoxhere/duino-coin/releases/ からダウンロードしてください", + "connecting_error": " サーバーへの接続にエラーが発生しました。10秒後に再試行", + "mining_thread": " マイニングスレッド #", + "mining_thread_starting": " が始まった", + "using_algo": " DUCO-S1アルゴリズムを使って ", + "using_algo_xxh": " XXHASHアルゴリズムを使って ", + "efficiency": "efficiency", + "duco_python_miner": "Duino-Coin Python公式マイナー (v", + "accepted_shares": " 受理されたシェア", + "accepted": " 受理 ", + "block_found": " ブロックが見つかりました ", + "internal_server_error": " 内部サーバーエラー。", + "retrying": " 10秒後に再試行", + "rejected": " 却下 ", + "error_while_mining": " マイニング中にエラーが発生 - 接続エラーの可能性が高い - 5秒で再起動します。", + "mining_user": " ユーザー ", + "mining_not_exist": " は存在しません。", + "mining_not_exist_warning": " ユーザー名が正しく入力されているか確認してください。設定ファイルを確認してください。10秒後に再試行", + "max_threads_notice": "多くのスレッドでDuino-Coinをマイニングすると利益が減少する - マイニングスレッドを16に減少。", + "max_hashrate_notice": "強力な装置でDuino-Coinをマイニングしても、あまり利益が出ないかもしれません。私たちの「姉妹」コインであるCoin Magi (https://xmg.network)を試してみることをお勧めします。", + "recommended": "推奨", + "connection_search": "最速で接続できるノードの検索", + "uptime_seconds": " 秒", + "uptime_minute": " 分", + "uptime_minutes": " 分", + "uptime_hour": " 時間", + "uptime_hours": " 時間", + "periodic_mining_report": "マイニング定期レポート: ", + "report_period": "\n\t\t‖ この間 ", + "report_time": " 秒", + "report_body1": "\n\t\t‖ あなたがマイニングしたのは ", + "report_body2": " シェア (", + "report_body3": " シェア/秒)", + "report_body4": "\n\t\t‖ のハッシュレートでは ", + "report_body5": "\n\t\t‖ この期間に、あなたは解決した ", + "report_body6": " ハッシュ", + "report_body7": "\n\t\t‖ ブロックが見つかりました: ", + "total_mining_time": "\n\t\t‖ マイナーの総稼働時間: ", + "fasthash_available": "fasthashのハッシュアクセラレーションを利用する", + "fasthash_download": "fasthashアクセラレーションモジュールのダウンロード", + "node_picker_unavailable": "ノードピッカーが正しく応答しないようです - 次で再試行します ", + "node_picker_error": "ノードピッカーからサーバーを取得する際の致命的なエラー - 次で再試行 ", + "connecting_node": " 取得したマイニングノード: ", + "new_version": "新しいバージョンが利用可能です、マイナーをアップデートしますか(Y/n) ? ", + "updating": "マイナーが古くなっています。アップデート中....", + "ask_mining_key": "マイニングキーを入力してください: ", + "mining_key_required": "このアカウントでマイニングを行うには、マイニングキーが必要です", + "invalid_mining_key": "入力されたマイニングキーは無効です!", + "running_on_rpi": "マイナーはRaspberry Piで動作しているようです。", + "running_on_rpi2": "マイニングプロセスの状態に応じて、搭載されたLEDが点灯します", + "discord_launch_error": "Discord RPCスレッドの起動エラー:", + "discord_update_error": "Discord RPC統計の更新エラー:", + "key_retry": "再試行しますか?(Y/n): ", + "incorrect_username": "入力されたユーザーネームは存在しません!", + "system_threads_notice": "警告:あなたは持っている以上のスレッドを使用しようとしています。\n\t\tこれは、システムが応答しなくなるなど、予期せぬ副作用を引き起こすことになります。\n\t\t10秒後に開始します", + "using_config": "設定ファイル: ", + "motd": "本日のサーバーメッセージ: " + }, + "finnish": { + "translation_autor": "EeroVakiparta", + "translation": "Suomenkielinen käännös: ", + "sigint_detected": " SIGINT havaittu - Poistutaan hienovaraisesti.", + "goodbye": " Nähdään pian!", + "greeting_morning": "Ihanaa aamua", + "greeting_noon": "Menny töihin", + "greeting_afternoon": "Rauhallista iltapäivää", + "greeting_evening": "Kotoisaa iltaa", + "greeting_back": "Tervetuloa takaisin", + "banner": "Virallinen Duino-Coin © Python Miner", + "donation_level": "Kehittäjän lahjoitustaso: ", + "ask_algorithm": "Valitse käytettävä louhintamenetelmä (1-2): ", + "ask_difficulty": "Valitse käytettävä louhintavaikeus (1-3): ", + "low_diff": "Matala vaikeus (heikommille Raspberry Pi -laitteille ja vanhemmille tietokoneille)", + "medium_diff": "Keskitaso vaikeus (tyypillisille tietokoneille)", + "net_diff": "Verkon vaikeus (tehokkaille tietokoneille)", + "low_diff_short": "Matala vaikeus", + "medium_diff_short": "Keskitaso vaikeus", + "net_diff_short": "Verkon vaikeus", + "algorithm": "Algoritmi: ", + "rig_identifier": "Rig-tunniste: ", + "basic_config_tool": "\nDuino-Coin perusasetustyökalu\nMuokkaa ", + "edit_config_file_warning": "/Miner_config.cfg -tiedostoa myöhemmin, jos haluat muuttaa asetuksia.", + "dont_have_account": "Eikö sinulla ole vielä Duino-Coin-tiliä? Käytä ", + "wallet": "https://wallet.duinocoin.com", + "register_warning": " rekisteröityäksesi palvelimelle.\n", + "ask_username": "Syötä Duino-Coin-käyttäjätunnuksesi: ", + "ask_intensity": "Aseta louhintaintensiteetti (1-100)% (suositus: 95): ", + "ask_threads": "Aseta louhintasäikeiden määrä (suositus järjestelmällesi: ", + "ask_lower_difficulty": "Haluatko käyttää alhaisempaa vaikeustasoa louhintaan (hitaimmille järjestelmille)? (y/N): ", + "ask_rig_identifier": "Haluatko lisätä tunnisteen (nimen) tälle rigille? (y/N): ", + "ask_rig_name": "Syötä haluttu rigin nimi: ", + "ask_donation_level": "Aseta kehittäjän lahjoitustaso (0-5) (suositus: 1), tämä ei vähennä ansioitasi: ", + "config_saved": "Asetukset tallennettu! Käynnistetään louhintaa", + "load_config_error": " Virhe ladattaessa asetustiedostoa (", + "load_config_error_warning": "/Miner_config.cfg). Yritä poistaa se ja suorita määritys uudelleen. Poistutaan 10 sekunnin kuluttua", + "free_network_warning": " Duino-Coin-verkko on täysin ilmainen palvelu ja tulee aina olemaan", + "donate_warning": "\nEmme ota mitään maksuja louhinnastasi.\nVoit todella auttaa meitä ylläpitämään palvelinta ja pienmaksullisia vaihtoja lahjoittamalla.\nVieraile ", + "learn_more_donate": " saadaksesi lisätietoja siitä, miten voit auttaa :)", + "starting_donation": "Aloitetaan lahjoitusprosessi", + "thanks_donation": " Kiitos, että olet mahtava lahjoittaja ❤️ \nLahjoituksesi auttaa meitä ylläpitämään palvelinta ja mahdollistaa jatkokehityksen", + "data_error": " Virhe noutaessa tietoja GitHubista! Yritetään uudelleen 10 sekunnin kuluttua.", + "connected": " Yhdistetty", + "connected_server": " päämestari Duino-Coin -palvelimeen (v", + "outdated_miner": " Louhija on vanhentunut (v", + "server_is_on_version": " palvelin on versiossa v", + "update_warning": ", lataa uusin versio osoitteesta https://github.com/revoxhere/duino-coin/releases/", + "connecting_error": " Virhe yhdistäessä palvelimeen. Yritetään uudelleen 10 sekunnin kuluttua", + "mining_thread": " Louhintasäie #", + "mining_thread_starting": " käynnistyy", + "using_algo": " käyttäen DUCO-S1 -algoritmia tehokkuudella ", + "using_algo_xxh": " käyttäen XXHASH-algoritmia tehokkuudella ", + "efficiency": "tehokkuus", + "duco_python_miner": "Virallinen Duino-Coin Python Miner (v", + "accepted_shares": " hyväksytyt osuudet", + "accepted": " Hyväksytty ", + "block_found": " Lohko löydetty ", + "internal_server_error": " Sisäinen palvelinvirhe.", + "retrying": " Yritetään uudelleen 10 sekunnin kuluttua", + "rejected": " Hylätty ", + "error_while_mining": " Virhe louhinnassa - todennäköisesti yhteysvirhe - käynnistetään uudelleen 5 sekunnin kuluttua.", + "mining_user": " Käyttäjä ", + "mining_not_exist": " ei ole olemassa.", + "mining_not_exist_warning": " Varmista, että olet syöttänyt käyttäjätunnuksen oikein. Tarkista konfiguraatiotiedosto. Yritetään uudelleen 10 sekunnin kuluttua", + "max_threads_notice": "Duino-Coinin louhinta monilla säikeillä aiheuttaa tuoton vähenemisen - louhintasäikeet pienennetty 16:een", + "max_hashrate_notice": "Duino-Coinin louhinta tehokkaalla laitteistolla ei välttämättä ole erittäin kannattavaa sinulle - ehdotamme kokeilemaan Coin Magi (https://xmg.network) - 'sisar' kolikko", + "recommended": "suositeltava", + "connection_search": "Etsitään nopeinta nodea, johon yhdistää", + "uptime_seconds": " sekuntia", + "uptime_minute": " minuutti", + "uptime_minutes": " minuuttia", + "uptime_hour": " tunti", + "uptime_hours": " tuntia", + "periodic_mining_report": "Säännöllinen louhintaraportti: ", + "report_period": "\n\t\t‖ Viimeisen ", + "report_time": " sekunnin aikana", + "report_body1": "\n\t\t‖ Olet louhinut ", + "report_body2": " osaketta (", + "report_body3": " osaketta/s)", + "report_body4": "\n\t\t‖ Teholla ", + "report_body5": "\n\t\t‖ Tänä aikana olet ratkaissut ", + "report_body6": " hajautusta", + "report_body7": "\n\t\t‖ Löydetyt lohkot: ", + "total_mining_time": "\n\t\t‖ Kaiken kaikkiaan louhijan toiminta-aika: ", + "fasthash_available": "Käytetään fasthash-hajautusnopeuksia", + "fasthash_download": "Ladataan fasthash-kiihdytysmoduuli", + "node_picker_unavailable": "Nodenn valitsin ei näytä vastaavan oikein - yritetään uudelleen ", + "node_picker_error": "Vakava virhe noudettaessa palvelinta noden valitsimesta - yritetään uudelleen ", + "connecting_node": " Haettu louhintanode: ", + "new_version": "Uusi versio on saatavilla, haluatko päivittää louhijan (Y/n) ? ", + "updating": "Louhija on vanhentunut. Päivitetään....", + "ask_mining_key": "Syötä louhintatunnuksesi: ", + "mining_key_required": "Louhintatunnus vaaditaan tälle tilille louhimiseen", + "invalid_mining_key": "Antamasi louhintatunnus on virheellinen!", + "running_on_rpi": "Louhija näyttää toimivan Raspberry Pi:llä.", + "running_on_rpi2": "Sisäiset tila-LEDit syttyvät louhintaprosessin tilan mukaisesti", + "discord_launch_error": "Virhe käynnistettäessä Discord RPC-säiettä:", + "discord_update_error": "Virhe päivitettäessä Discord RPC-tilastoja:", + "key_retry": "Haluatko yrittää uudelleen? (Y/n): ", + "incorrect_username": "Antamasi käyttäjänimi ei ole olemassa!", + "system_threads_notice": "Varoitus: yrität käyttää enemmän säikeitä kuin sinulla on.\n\t\tTämä aiheuttaa ei-toivottuja sivuvaikutuksia, kuten järjestelmän vastaamattomuuden.\n\t\tAloitetaan 10s kuluttua", + "using_config": "Käyttöasetustiedosto: ", + "motd": "Palvelimen päivän viesti: " } } diff --git a/Resources/README_TRANSLATIONS/README-fr-FR.md b/Resources/README_TRANSLATIONS/README-fr-FR.md index 7fefe53f..66137cb3 100644 --- a/Resources/README_TRANSLATIONS/README-fr-FR.md +++ b/Resources/README_TRANSLATIONS/README-fr-FR.md @@ -36,6 +36,10 @@ + + + + @@ -54,22 +58,22 @@

- Duino-coin est un coin qui peut être miné avec des microcontrôleurs de type Arduinos, des Esp8266/32, des Raspberrypis, - des ordinateurs et bien d'autres équipements (routeurs Wifi, TV players, Smartphones, Smartwatches, SBCs, GPUs). + Duino-coin est une cryptomonnaie qui peut être minée avec des microcontrôleurs de type Arduino, des ESP8266/32, des Raspberry Pis, + des ordinateurs et bien d'autres équipements (routeurs Wi-Fi, TV connectées, Smartphones, Montres connectées, SBCs, GPUs).


| Fonctionnalités | Specifications Techniques | Cartes supportées (non exhaustif) | |-|-|-| -| 💻 Pris en charge d'un grand nombre d'appareils
👥 Communauté à forte croissance
💱 Utilisation & échanges faciles
(sur DUCO Exchange, Node-S, JustSwap, SushiSwap)
🌎 Disponible partout
🆕 Projet innovateur & open-source
🌳 Débutants & eco-friendly
💰 Coût réduit & facile à miner | ⚒️ Algorithme : DUCO-S1
♐ Récompenses : assurées par "Kolka system"
Assistant pour récompenser équitablement les mineurs
⚡ Transactions : Instantanées
🤑 Minage de coins : sans limite
(Limiter à : 350k coins avant décembre 2020)
(Nouvelle limite planifiée pour le futur)
🔤 Symbole: DUCO (ᕲ)
🔢 Décimales: supérieures à 20 | ♾️ Arduinos
(Uno, Nano, Mega, Due, Pro Mini, etc.)
📶 ESP8266s
(NodeMCU, Wemos, etc.)
📶 ESP32s
(ESP-WROOM, ESP32-CAM, etc.)
🍓 Raspberry Pis
(1, 2, Zero (W/WH), 3, 4, Pico, 400)
🍊 Orange Pis
(Zero, Zero 2, PC, Plus, etc.)
⚡ Teensy 4.1 boards | +| 💻 Prise en charge d'un grand nombre d'appareils
👥 Communauté à forte croissance
💱 Utilisation & échanges faciles
(sur DUCO Exchange, Node-S, JustSwap, SushiSwap)
🌎 Disponible partout
🆕 Projet innovateur & open-source
🌳 Débutants & eco-friendly
💰 Coût réduit & facile à miner | ⚒️ Algorithme : DUCO-S1
♐ Récompenses : assurées par "Kolka system"
Assistant pour récompenser équitablement les mineurs
⚡ Transactions : Instantanées
🤑 Minage de coins : sans limite
(Limiter à : 350k coins avant décembre 2020)
(Nouvelle limite planifiée pour le futur)
🔤 Symbole: DUCO (ᕲ)
🔢 Décimales: supérieures à 20 | ♾️ Arduinos
(Uno, Nano, Mega, Due, Pro Mini, etc.)
📶 ESP8266s
(NodeMCU, Wemos, etc.)
📶 ESP32s
(ESP-WROOM, ESP32-CAM, etc.)
🍓 Raspberry Pis
(1, 2, Zero (W/WH), 3, 4, Pico, 400)
🍊 Orange Pis
(Zero, Zero 2, PC, Plus, etc.)
⚡ Teensy 4.1 boards | ## Par où commencer ### la meilleure façon de démarrer avec le Duino-Coin est de télécharger la [dernière version](https://github.com/revoxhere/duino-coin/releases/latest) pour votre OS.
-Après le téléchargement, décompresser l'archive (unzip) et lancer le programme désiré.
+Après le téléchargement, décompressez l'archive (unzip) et lancez le programme désiré.
Si vous avez besoin d'aide, jetez un oeil au guide de démarrage officiel sur le [site officiel](https://duinocoin.com/getting-started).
-Retrouver notre FAQ et une aide au dépannage dans le [Wiki](https://github.com/revoxhere/duino-coin/wiki).
+Retrouvez notre FAQ et une aide au dépannage dans le [Wiki](https://github.com/revoxhere/duino-coin/wiki).
### Manuel d'installation @@ -82,14 +86,14 @@ git clone https://github.com/revoxhere/duino-coin # Cloner le repository Duino-C cd duino-coin python3 -m pip install -r requirements.txt # Installer les dépendances pip ``` -Aprés ça, vous êtes prêt à démarrer le logiciel (e.g. `python3 PC_Miner.py`). +Après ça, vous êtes prêt à démarrer le logiciel (ex. `python3 PC_Miner.py`). #### Sous Windows -1. Télecharger et installer [Python 3](https://www.python.org/downloads/) (assurez vous d'ajouter Python et Pip à votre PATH). -2. Télecharger le contenu du [repository Duino-Coin](https://github.com/revoxhere/duino-coin/archive/master.zip). -3. Extraire le zip téléchargé et accéder au chemin du répertoire où se trouve l'archive décompressée via un terminal. -4. Taper `py -m pip install -r requirements.txt` dans le terminal afin d'installer les dépendances nécessaires au fonctionnement de pip. +1. Télechargez et installez [Python 3](https://www.python.org/downloads/) (assurez vous d'ajouter Python et Pip à votre PATH). +2. Télechargez le contenu du [repository Duino-Coin](https://github.com/revoxhere/duino-coin/archive/master.zip). +3. Extrayez le zip téléchargé et accédez au chemin du répertoire dans lequel se trouve l'archive décompressée via un terminal. +4. Tapez `py -m pip install -r requirements.txt` dans le terminal afin d'installer les dépendances nécessaires au fonctionnement de pip. Après cela, vous pouvez lancer le logiciel (en double-cliquant simplement sur le fichier `.py` ou taper `py PC_Miner.py` dans un terminal. @@ -101,15 +105,15 @@ Un tutoriel sur la façon d'utiliser le wDUCO est disponible à cette adresse [w ## Developpement Le projet Duino-Coin est un projet Open Source. Chaque contribution est source d'inspiration, de créativité et nous permettent d'apprendre et d'évoluer plus vite dans une athmosphère bienveillante.
-C'est pourquoi, toute contribution au projet Duino-coin est vivement appréciée. +C'est pourquoi toute contribution au projet Duino-coin est vivement appréciée. Comment nous aider? -* Forker le projet sur github -* Créer une nouvelle branche -* Commit ses changements -* Assurez vous que tout fonctionne correctement -* Ouvrir une pull request +* Forkez le projet sur github +* Créez une nouvelle branche +* Commitez ses changements +* Assurez-vous que tout fonctionne correctement +* Ouvrez une pull request Le code source du serveur, la documentation de l'API et toutes les librairies pour développer votre propre duino-coin sont disponibles sur la branche [useful tools](https://github.com/revoxhere/duino-coin/tree/useful-tools). @@ -124,7 +128,7 @@ Le code source du serveur, la documentation de l'API et toutes les librairies po | Appareil/CPU/SBC/MCU/chip | Hashrate (moyen)
(par thread) | Minage
nombre de thread(s) | Puissance
utilisation (W) | Production
DUCO/jour | |-----------------------------------------------------------|-----------------------------------|-------------------|----------------|---------------------| | Arduino Pro Mini, Uno, Nano etc.
(Atmega 328p/pb/16u2) | 196 H/s | 1 | 0.2 W | 9-10 | - | Teensy 4.1 (soft cryptography) | 80 kH/s | 1 | 0.5 W | - | + | Teensy 4.1 (cryptographie douce) | 80 kH/s | 1 | 0.5 W | - | | NodeMCU, Wemos D1 etc.
(ESP8266) | 10 kH/s (160MHz) 4.9 kH/s (80Mhz) | 1 | 0.6 W | 6-7 | | ESP32 | 33 kH/s | 2 | 1 W | 8-9 | | Raspberry Pi Zero | 18 kH/s | 1 | 1.1 W | - | @@ -146,7 +150,7 @@ Le code source du serveur, la documentation de l'API et toutes les librairies po | Intel Core i3-4130 | 1.45 MH/s | 4 | - | 3.7 | | AMD Ryzen 5 2600 | 4.9 MH/s | 12 | 67 W | 15.44 | - Tous les tests ont été réalisés en utilisant l'algorithme DUCO-S1. Ce tableau sera fréquement mis à jour. + Tous les tests ont été réalisés en utilisant l'algorithme DUCO-S1. Ce tableau sera fréquemment mis à jour. ## Applications et logiciels développé(es) par la communauté @@ -156,8 +160,8 @@ Le code source du serveur, la documentation de l'API et toutes les librairies po La liste étant de plus en plus longue, elle est masquée par défaut. Veuillez cliquer sur ce lien pour afficher toutes les références ! - Nota : ces logiciels et applications sont développé(e)s par des contributeurs en dehors du projet initial Duino-coin, nous ne pouvons donner aucune garantie quant-à leur bon fonctionnement. De même, nous ne pouvons garantir qu'ils, elles, respectent les termes d'utilisation (T.O.S.) du Duino-coin. Il est donc possible que votre compte soit bannis suite à leur utilisation. En aucun cas nous ne seront responsable de cet état de fait. Utilisez ces applications et logiciels comme des "curiosités", des éléments d'apprentissage ... - Par exemple il convient de noter que l'utilisation de [nonceMiner](https://github.com/colonelwatch/nonceMiner) by colonelwatch amènera au **bannissement immédiat de votre compte**. + N.B. : ces logiciels et applications sont développé(e)s par des contributeurs en dehors du projet initial Duino-coin, nous ne pouvons donner aucune garantie quant à leur bon fonctionnement. De même, nous ne pouvons garantir qu'ils, elles, respectent les termes d'utilisation (T.O.S.) du Duino-coin. Il est donc possible que votre compte soit banni suite à leur utilisation. En aucun cas nous ne serons responsable de cet état de fait. Utilisez ces applications et logiciels comme des "curiosités", des éléments d'apprentissage... + Par exemple, il convient de noter que l'utilisation de [nonceMiner](https://github.com/colonelwatch/nonceMiner) par colonelwatch amènera au **bannissement immédiat de votre compte**. ### Autres applications de minage connues pour fonctionner avec le Duino-Coin @@ -170,12 +174,12 @@ Le code source du serveur, la documentation de l'API et toutes les librairies po * [duino-coin-php-miner](https://github.com/ricardofiorani/duino-coin-php-miner) - Mineur dockerisé en PHP par ricardofiorani * [duino-coin-kodi](https://github.com/SandUhrGucker/duino-coin-kodi) - Addon pour miner des DUCO avec Kodi Media Center par SandUhrGucker * [MineCryptoOnWifiRouter](https://github.com/BastelPichi/MineCryptoOnWifiRouter) - Script en Python pour miner des Duino-Coins sur des routeurs Wifi par BastelPichi -* [Duino-Coin_Android_Cluster Miner](https://github.com/DoctorEenot/DuinoCoin_android_cluster) - Mineur pour multiples appareils sous Androïd utilisant le moins possible de connection par DoctorEenot -* [ESPython DUCO Miner](https://github.com/fabiopolancoe/ESPython-DUCO-Miner) - Mineur en MicroPython pour cartes ESP boards par fabiopolancoe +* [Duino-Coin_Android_Cluster Miner](https://github.com/DoctorEenot/DuinoCoin_android_cluster) - Mineur pour multiples appareils sous Android utilisant le moins possible de connection par DoctorEenot +* [ESPython DUCO Miner](https://github.com/fabiopolancoe/ESPython-DUCO-Miner) - Mineur en MicroPython pour cartes ESP par fabiopolancoe * [DUCO Miner for Nintendo 3DS](https://github.com/BunkerInnovations/duco-3ds) - Mineur en Python pour Nintendo 3DS par PhereloHD & HGEpro * [Dockerized DUCO Miner](https://github.com/Alicia426/Dockerized_DUCO_Miner_minimal) - Mineur Docker par Alicia426 * [NodeJS-DuinoCoin-Miner](https://github.com/LDarki/NodeJS-DuinoCoin-Miner/) - Mineur NodeJs simplifié par LDarki -* [d-cpuminer](https://github.com/phantom32-0/d-cpuminer) - Pur C mineur par phantom32 & revoxhere +* [d-cpuminer](https://github.com/phantom32-0/d-cpuminer) - Mineur purement en C par phantom32 & revoxhere * [Go Miner](https://github.com/yippiez/go-miner) - Mineur en Go par yippiez * [ducominer](https://github.com/its5Q/ducominer) - par its5Q * [Répertoire des mineurs non-officiels](https://github.com/revoxhere/duino-coin/tree/master/Unofficial%20miners) @@ -187,7 +191,7 @@ Le code source du serveur, la documentation de l'API et toutes les librairies po ### Autres outils disponibles * [Duino Miner](https://github.com/g7ltt/Duino-Miner) - Mineur Arduino Nano pour DUCO / fichiers et documentation par g7ltt -* [DUINO Mining Rig](https://repalmakershop.com/pages/duino-mining-rig) - fichiers 3D, design de PCB, et instructions pour créer votre propre rig Duino par ReP_AL +* [DUINO Mining Rig](https://repalmakershop.com/pages/duino-mining-rig) - fichiers 3D, designs de PCB, et instructions pour créer votre propre rig Duino par ReP_AL * [DuinoCoin-balance-Home-Assistant](https://github.com/NL647/DuinoCoin-balance-Home-Assistant) - addon solde pour "home assistant" permettant d'afficher votre solde par NL647 * [Duino Coin Status Monitor](https://github.com/TSltd/duino_coin) - interface utilisateur pour écran 128x64 SSD1306 OLED et ESP8266 par TSltd * [ducopanel](https://github.com/ponsato/ducopanel) - GUI pour le contrôle de mineurs par ponsato @@ -215,26 +219,26 @@ Certaines parties du programme, incluant des fichiers, peuvent être soumises à 1. Les Duino-Coins (ou "DUCOs") sont la propriété des mineurs de coins suivant un processus dit de "minage".
2. Le minage est fondé sur l'utilisation de l'algorithme DUCO-S1, comme décrit dans notre livret blanc (Duino-Coin Whitepaper). L'algorithme DUCO-S1 permet d'attribuer des récompenses aux utilisateurs trouvant une solution correcte à un problème mathématique.
-3. Le minage peut être effectué en utilisant des processeurs, des microcontrôleurs (ex : cartes Arduinos), des Single Board Computers (ex : cartes Raspberry Pi), des cartes wifi de type ESP32/8266 et un programme de minage officiel - voir plus haut dans le fichier README).
-4. Le minage dit "GPU" (réalisé à l'aide cartes graphique), le minage FPGAs, et tout type de minage avec des appareils a forte puissance est autorisé, mais l'utilisateur se verra attribué des niveau de difficulté `EXTREME`.
+3. Le minage peut être effectué en utilisant des processeurs, des microcontrôleurs (ex. : cartes Arduinos), des Single Board Computers (ex : cartes Raspberry Pi), des cartes wifi de type ESP32/8266 et un programme de minage officiel - voir plus haut dans le fichier README).
+4. Le minage dit "GPU" (réalisé à l'aide cartes graphique), le minage FPGAs, et tout type de minage avec des appareils a forte puissance est autorisé, mais l'utilisateur se verra attribué des niveaux de difficulté `EXTREME`.
5. Tout utilisateur utilisant un niveau de difficulté qui ne correspond pas avec son matériel (voir liste des taux de difficulté) verra son niveau de difficulté réajusté automatiquement vers un niveau de difficulté correspondant à sa capacité matérielle réelle.
6. Tout utilisateur qui tentera d'utiliser ou de biaiser le taux de difficulté à la baisse pourra voir son compte temporairement bloqué.
7. Bannir signifie empêcher un utilisateur d'accéder à ces coins, et peut aller jusqu'à la suppression du compte du dit utilisateur.
-8. Seuls les coins gagnés légalement, dans le respect des règles énoncée ci-joint, sont éligibles à l'échange.
-9. Un compte peut être suspendu temporairement pour vérifier qu'il respecte bien les conditions d'utilisation et ne procède pas des violations de ces mêmes règles.
+8. Seuls les coins gagnés légalement, dans le respect des règles énoncées ici, sont éligibles à l'échange.
+9. Un compte peut être suspendu temporairement pour vérifier qu'il respecte bien les conditions d'utilisation et ne viole pas ces mêmes règles.
10. Un ordre de change, ou une procédure d'échange en cours, fait(e) sur la plateforme DUCO-Exchange ("plateforme officielle d'échange") pourra être supprimé ou refusé durant la période de vérification (voir point 9).
11. Un ordre de change ou une procédure d'échange, fait(e) sur la plateforme officielle d'échange pourra être refusé en cas de non respect des règles d'utilisation ou par manque de fonds propres.
12. Le minage via des services d'hébergement gratuits sur le cloud, ou des services de VPS gratuits (ex : Repl.it, GitHub Actions, etc.) n'est pas autorisé, dans la mesure où il ne respecte l'égalité entre les utilisateurs.
13. Tout utilisateur dont il est prouvé qu'il a tenté d'enfreindre les règles d'utilisation sera banni.
-14. Ces thermes d'utilisation peuvent être modifier sans préavis.
+14. Ces termes d'utilisation peuvent être modifiés sans préavis.
15. Posséder plusieurs comptes sur la plateforme sans raisons rationnelles (ex : pour faire du minage optimisé sur différents comptes) décrites au préalable par l'utilisateur n'est pas autorisé.
16. Envoyer des transactions en faisant la promotion d'autres services, ou faire de la publicité pour des tiers, quelle qu'en soit la forme, via le réseau Duino-Coin, n'est pas autorisé.
17. Tout utilisateur utilisant Duino-Coin s'engage à respecter les règles décrites ci-dessus.
## Politique de confidentialité -1. Seul(e)s les noms d'utilisateurs, les mots de passe hashés (avec bcrypt), dates de créations du compte et l'adresse e-mail de l'utilisateur sont stocké(e)s sur notre serveur principal. Ces données constituent les "données utilisateur".
-2. Le email utilisateur n'est pas disponible au publique. Ils est réservé uniquement pour contacter l'utilisateur en cas de besoin, ou confirmer un échange sur la plateforme d'échange DUCO-Exchange, occasionnellement pour recevoir notre newsletter (prévue dans un futur proche).
+1. Seul(e)s les noms d'utilisateurs, les mots de passe hashés (avec bcrypt), les dates de créations de comptes et les adresses e-mail des utilisateurs sont stocké(e)s sur notre serveur principal. Ces données constituent les "données utilisateur".
+2. Les adresses e-mail des utilisateurs ne sont pas disponible au public. Elles sont réservées uniquement pour contacter les utilisateurs en cas de besoin, ou confirmer un échange sur la plateforme d'échange DUCO-Exchange, occasionnellement pour recevoir notre newsletter (prévue dans un futur proche).
3. Les soldes, transactions et autres données de minage sont publiques et disponible via notre API JSON.
4. Notre politique de confidentialité peut être modifiée sans préavis. @@ -245,12 +249,12 @@ Certaines parties du programme, incluant des fichiers, peuvent être soumises à * [@connorhess](https://github.com/connorhess) (Lead dev Python, Node-S owner) * [@JoyBed](https://github.com/JoyBed) (Lead dev AVR) * [@Yennefer](https://www.instagram.com/vlegle/) (Lead manager réseaux sociaux) -* [@Tech1k](https://github.com/Tech1k/) - kristian@beyondcoin.io (Lead Webmaster et DUCO Developpeur) +* [@Tech1k](https://github.com/Tech1k/) - hello@kristiankramer.net (Lead Webmaster et développeur DUCO) * [@ygboucherk](https://github.com/ygboucherk) ([wDUCO](https://github.com/ygboucherk/wrapped-duino-coin-v2) Dev) * [@Lulaschkas](https://github.com/Lulaschkas) (Dev) -* [@joaquinbvw](https://github.com/joaquinbvw) (AVR dev) +* [@joaquinbvw](https://github.com/joaquinbvw) (Dev AVR) -Mille merci à tous les contributeurs [contributeurs](https://github.com/revoxhere/duino-coin/graphs/contributors) qui nous aides à développer le projet Duino-Coin. +Mille merci à tous les contributeurs [contributeurs](https://github.com/revoxhere/duino-coin/graphs/contributors) qui nous aident à développer le projet Duino-Coin.
diff --git a/Resources/README_TRANSLATIONS/README_cz_CZ.md b/Resources/README_TRANSLATIONS/README_cz_CZ.md index 3cefbe5e..9461eff3 100644 --- a/Resources/README_TRANSLATIONS/README_cz_CZ.md +++ b/Resources/README_TRANSLATIONS/README_cz_CZ.md @@ -39,6 +39,10 @@ + + + + @@ -55,7 +59,7 @@

- Duino-Coin je mince, kterou je možné těžit za pomocí desek Arduino, ESP8266/32, jednodeskových počítačů Raspberry Pi, stolních počítačů a mnoha dalšího (včetně Wi-Fi routerů, chytrých televizí, chytrých telefonů, hodinek, čipů SBC a MCU nebo dokonce grafických karet). + Duino-Coin je mince, kterou je možné těžit za pomocí desek Arduino, ESP8266/32, Raspberry Pi, stolních počítačů a mnoha dalšího (včetně Wi-Fi routerů, chytrých televizí, chytrých telefonů, hodinek, jednodeskových počítačů SBCs a ostatních mikrokontrolérů).

@@ -266,7 +270,7 @@ Některé zahrnuté soubory třetích stran mohou mít odlišné licence – zko * [@connorhess](https://github.com/connorhess) (Vedoucí Python vývojář, vlastník Node-S) * [@JoyBed](https://github.com/JoyBed) (Vedoucí AVR vývojář) * [@Yennefer](https://www.instagram.com/vlegle/) (Vedoucí správkyně sociálních sítí) -* [@Tech1k](https://github.com/Tech1k/) - kristian@beyondcoin.io (Vedoucí webmaster a vývojář DUCO) +* [@Tech1k](https://github.com/Tech1k/) - hello@kristiankramer.net (Vedoucí webmaster a vývojář DUCO) * [@ygboucherk](https://github.com/ygboucherk) ([wDUCO](https://github.com/ygboucherk/wrapped-duino-coin-v2) vývojář) * [@Lulaschkas](https://github.com/Lulaschkas) (vývojář) * [@joaquinbvw](https://github.com/joaquinbvw) (AVR vývojář) diff --git a/Resources/README_TRANSLATIONS/README_de_DE.md b/Resources/README_TRANSLATIONS/README_de_DE.md index ff38dfee..30d3bb58 100644 --- a/Resources/README_TRANSLATIONS/README_de_DE.md +++ b/Resources/README_TRANSLATIONS/README_de_DE.md @@ -1,253 +1,299 @@ - -

+ + + + +

- + -
+
- - + - - + - - + - - -
- - - - - - -
- - - - - - -

- -

Duino-Coin ist eine Kryptowährung, die zum Beispiel auf Arduinos, ESP boards, Raspberry Pis, Computern, und mehr gemint werden kann

-

inklusive Wi-Fi Router, SmartTV's, Smartphones, Smartwatches, SBCs, MCUs, GPUs - eigentlich alles das einen kleinen Programmierbaren Microchip hat.!


- - - - - - - - - - -
Besonderheiten:Technische Spezifikationen
- 💻 Von vielen Betriebssystemen unterstützt
- 👥 freundliche & wachsende Community
- 💱 Einfach zu nutzten & in andere Währungen umzutauschen
- 🌎 Überall verfügbar
- :new: Komplett originales Projekt
- :blush: Anfänger freundlich
- 💰 Kosten-Effektiv
- ⛏️ Einfach zu minen
- 📚 Open-source
-
- ♾️ Coin supply: Unendlich (vor Dezember 2020: 350k coins)
- 😎 Prämie: <5k blöcke(<500 coins)
- ⚡ Transaktionszeit: sofort
- 🔢 Dezimalstellen: bis zu 20
- 🔤 Ticker: DUCO (ᕲ)
- ⚒️ Algorithmen: DUCO-S1, DUCO-S1A, XXHASH + mehr geplannt
- ♐ Rewards: unterstützt durch das "Kolka System", welches hilft, miner fair zu belohnen
-
- -

Get started


- -Offiziele Anleitungen um einen ACccount zu erstellen, und auf vielen Geräten zu minen, auf der offizielen Website.
-Ein FAQ und Hilfe kann in der Wiki-Seite gefunden werden [Wikis](https://github.com/revoxhere/duino-coin/wiki). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
-| Offiziele Wallets | Offiziele Miner | -:-----------------:|:----------------: -[](https://duinocoin.com/getting-started#register) | [](https://duinocoin.com/getting-started#computer) +

+ Duino-Coin ist eine Kryptowährung, die sich auf Arduinos, ESP8266/32 Boards, Raspberry Pis, Computern und vielen anderen Geräten minen lässt, wie beispielsweise W-LAN Routern, SmartTVs, Smartphones, Smartwatches, SBCs, MCUs und sogar GPUs! +

-

Duino-Coin Installieren


-Der einfachste Weg zu starten, ist [das neuste release](https://github.com/revoxhere/duino-coin/releases/latest) für dein OS herunterzuladen.
-
Wenn der Download fertig ist, Entpacke ihn und öffnen dein gewünschtes Programm. Es sind keine anderen Programme nötig.
+| Eigenschaften | Technische Spezifikationen | (Einige der vielen) unterstützten Boards | +|-|-|-| +| 💻 Von zahlreichen Platformen unterstützt
👥 Eine schnell wachsende Community
💱 Einfach zu benutzen und zu tauschen (zum Beispiel beim DUCO Exchange, Node-S, JustSwap oder SushiSwap)
🌎 Überall verfügbar
:new: Komplett einzigartiges und zudem quelloffenes Projekt
🌳 Anfänger- und umweltfreundlich
💰 Kosteneffektiv und einfach zu minen | ⚒️ Algorithmus: DUCO-S1
♐ Belohnungen: Nach dem "Kolka system", welches Miner fair belohnen soll
⚡ Transaktionszeit: Sofort
🪙 Supply: Unendlich (mit Burning)
🔤 Ticker: DUCO (ᕲ)
🔢 Nachkommastellen: bis zu 20 | ♾️ Arduinos
(Uno, Nano, Mega, Due, Pro Mini, etc.)
📶 ESP8266s
(NodeMCU, Wemos, etc.)
📶 ESP32s
(ESP-WROOM, ESP32-CAM, etc.)
🍓 Raspberry Pis
(1, 2, Zero (W/WH), 3, 4, Pico, 400)
🍊 Orange Pis
(Zero, Zero 2, PC, Plus, etc.)
⚡ Teensy 4.1 Boards | + + +## Loslegen + +#### Der einfachste Weg um mit Duino-Coin loszulegen, ist die [neueste Version](https://github.com/revoxhere/duino-coin/releases/latest) für das entsprechende Betriebssystem herunterzuladen.
+Nachdem diese heruntergeladen wurde, kann das Programm einfach entpackt und ausgeführt werden.
+Die Installation von Abhängigkeiten ist nicht notwendig. + +Für weitere Hilfe gibt es einen offiziellen Ratgeber in englischer Sprache auf der offiziellen Internetseite.
+Ein FAQ und nützliche Tips zur Problembehandlung gibt es (ebenfalls auf Englisch) in den [Wikis](https://github.com/revoxhere/duino-coin/wiki).
-
- Wenn du die Programme dierekt über Python starten willst, musst du vielleicht einige zusätzliche pip-module installieren. So kann man es auf Debian-basierenden Linux distros (z.B. Ubuntu, Debian oder Raspian) machen: +### Manuelle Installation + +#### Linux + ```BASH -sudo apt install python3 python3-pip git -git clone https://github.com/revoxhere/duino-coin +sudo apt update +sudo apt install python3 python3-pip git python3-pil python3-pil.imagetk -y # Install dependencies +git clone https://github.com/revoxhere/duino-coin # Clone Duino-Coin repository cd duino-coin -python3 -m pip install -r requirements.txt +python3 -m pip install -r requirements.txt # Install pip dependencies ``` -Wenn du Windows nutzt, musst du [Python 3](https://www.python.org/downloads/) herunterladen, das [Master Repository](https://github.com/revoxhere/duino-coin/archive/master.zip), dieses dann Entpacken (WinRar, 7zip) Danach kannst du ein CMD Fester öffnen (Windows + R Taste). -Im CMD Fenster, Schreibe/kopiere dies hinein: -```BASH -py -m pip install -r requirements.txt -``` -Wichtig für Windows nutzer: Immer sicher gehen das [Python 3](https://www.python.org/downloads/) und Python3-pip installiert und im PATH sind. +Anschließend kann das Programm gestartet werden (mit dem Befehl `python3 PC_Miner.py`). -Jetzt kannst du den Miner starten. (z.b. `python3 PC_Miner.py` oder `py PC_Miner.py`). +#### Windows -
+1. Installiere zuerst [Python 3](https://www.python.org/downloads/) (und stelle sicher Python als auch Pip deinem PATH hinzuzufügen). +2. Lade [die Duino-Coin Repository](https://github.com/revoxhere/duino-coin/archive/master.zip) herunter. +3. Extrahiere das zuvor heruntergeladene .zip Archiv und öffne den Ordner in einer Eingabeaufforderung. +4. Führe den Befehl `py -m pip install -r requirements.txt` aus, um die erforderlichen Abhängigkeiten mit Pip zu installieren. + +Anschließend kann das Programm gestartet werden (einfach einen Doppelklick auf die gewünschte `.py` Datei machen oder den Befehl `py PC_Miner.py` in der Eingabeaufforderung ausführen). -Du kannst das ganze Duino-Coin Paket auch mit AUR laden - dazu einfach ein Ladevorgang starten mit deinem Favorisierten AUR Helfer Programm: +### Automatische Installation + +#### Raspberry Pi + +Hinweis: Wenn dieser Script nicht funktionieren sollte, einfach auf die manuelle Installation zurückgreifen. ```BASH -sudo pacman -S yay -yay -S duino-coin +# Lade die Skript-Datei herunter +wget https://raw.githubusercontent.com/revoxhere/duino-coin/master/Tools/duco-install-rpi.sh + +# Lege die nötigen Berechtigungen fest +sudo chmod a+x duco-install-rpi.sh + +# Führe den Skript aus +./duco-install-rpi.sh ``` -das Duino-Coin AUR Paket wird bereitgestellt von [PhereloHD](https://github.com/PhereloHD). -

-

Von der Community erstellte Software von Talentierten Mitgliedern


- -**Andere Miner-/Software/Hardware/Chips die bekannt sind das Duino-Coin damit Funktioniert:** -* [duino-coin-kodi](https://github.com/SandUhrGucker/duino-coin-kodi) - Mining addon for Kodi Media Center by SandUhrGucker -* [MineCryptoOnWifiRouter](https://github.com/BastelPichi/MineCryptoOnWifiRouter) - Python Script für das Mining von Duino-Coin auf Routern by BastelPichi -* [Duino-Coin_Android_Cluster Miner](https://github.com/DoctorEenot/DuinoCoin_android_cluster) - Mining mit weniger Bandbreite für Android Handy by DoctorEenot -* [ESPython DUCO Miner](https://github.com/fabiopolancoe/ESPython-DUCO-Miner) - MicroPython Miner / ESP Boards by fabiopolancoe -* [DUCO Miner für Nintendo 3DS](https://github.com/BunkerInnovations/duco-3ds) - Python Miner für Nintendo 3DS by PhereloHD & HGEpro -* [Dockerized DUCO Miner](https://github.com/Alicia426/Dockerized_DUCO_Miner_minimal) - Miner in Docker (Linux/ARM) by Alicia426 -* [nonceMiner](https://github.com/colonelwatch/nonceMiner) - Schneller Duino-Coin Miner by colonelwatch -* [NodeJS-DuinoCoin-Miner](https://github.com/DarkThinking/NodeJS-DuinoCoin-Miner/) - Einfach NodeJS Miner by DarkThinking -* [d-cpuminer](https://github.com/phantom32-0/d-cpuminer) - Pure C Miner by phantom32 -* [Go Miner](https://github.com/yippiez/go-miner) by yippiez -* [ducominer](https://github.com/its5Q/ducominer) by its5Q -* [Unofficial miners directory](https://github.com/revoxhere/duino-coin/tree/master/Unofficial%20miners) - * [Julia Miner](https://github.com/revoxhere/duino-coin/blob/master/Unofficial%20miners/Julia_Miner.jl) by revox - * [Ruby Miner](https://github.com/revoxhere/duino-coin/blob/master/Unofficial%20miners/Ruby_Miner.rb) by revox - * [Minimal Python Miner (DUCO-S1)](https://github.com/revoxhere/duino-coin/blob/master/Unofficial%20miners/Minimal_PC_Miner.py) by revox - * [Minimal Python Miner (XXHASH)](https://github.com/revoxhere/duino-coin/blob/master/Unofficial%20miners/Minimal_PC_Miner_XXHASH.py) by revox - * [Teensy 4.1 code for Arduino IDE](https://github.com/revoxhere/duino-coin/blob/master/Unofficial%20miners/Teensy_code/Teensy_code.ino) by joaquinbvw - - -**Other tools:** -* [Duino-Coin Mining Dashboard](https://lulaschkas.github.io/duco-mining-dashboard/) Dashboard und Problembeseitigungs Hilfe by Lulaschkas -* [duco-miners](https://github.com/dansinclair25/duco-miners) CLI Mining Dashboard by dansinclair25 -* [Duco-Coin Symbol Icon ttf](https://github.com/SandUhrGucker/Duco-Coin-Symbol-Icon-ttf-.h) by SandUhrGucker -* [DUCO Browser Extension](https://github.com/LDarki/DucoExtension) Für Chrome by LDarki -* [DUCO Monitor](https://siunus.github.io/duco-monitor/) Account Statistiken by siunus -* [duino-tools](https://github.com/kyngs/duino-tools) by kyngs -* [Duino Stats](https://github.com/Bilaboz/duino-stats) DUINO-COIN Discord Bot by Bilaboz - - -Diese Liste wird ständig geupdatet. Wenn auch du deine Software hier auflisten möchtest die zum Projekt beiträgt, einfach einen Pull request auf Github erstellen, oder einen der Programmierer auf Discord anschreiben. -

-

wDUCO Tutorial


- -Duino-Coin ist eine Hybridwährung, was bedeutet, dass sie in wDUCO umgewandelt werden kann, wo DUCO im [Tron-Netzwerk](https://tron.network) (als Token) verpackt ist. Derzeit gibt es nicht viele Verwendungszwecke dafür, außer nur Geld in einer externen Wallet zu speichern oder wDUCO auf JustSwap gegen einen anderen Token auszutauschen. -Ein Tutorial zur Verwendung von wDUCO ist in der [wDUCO-Wiki](https://github.com/revoxhere/duino-coin/wiki/wDUCO-tutorial) verfügbar. -

- -

Entwicklung


- -Beiträge machen die Open-Source-Community zu einem großartigen Ort zum Lernen, Inspirieren und Gestalten. -Jeder Beitrag, den Sie zum Duino-Coin-Projekt leisten, wird sehr geschätzt. - -Wie kann man helfen? - -* erstelle eine Fork für das Projekt -* Erstellen Sie Ihren Feature-Zweig -* Sende deine Änderungen ein -* Stellen Sie sicher, dass alles wie vorgesehen funktioniert -* Öffnen Sie eine Pull-Anfrage - -Server-Quellcode, Dokumentation für API-Aufrufe und offizielle Bibliotheken zur Entwicklung eigener Apps für Duino-Coin sind im Zweig [nützliche Tools](https://github.com/revoxhere/duino-coin/tree/useful-tools) verfügbar . - -

Einige der offiziell geprüften Geräte mit (DUCO-S1)


- -| Gerät/CPU/SBC/MCU/Chip | durchschnittliche Hashrate
(all threads) | Mining
threads | Strom
verbrauch | Durchschnittliche
DUCO/Tag | -|-----------------------------------------------------------|-----------------------------------|-------------------|----------------|---------------------| -| Arduino Pro Mini, Uno, Nano etc.
(Atmega 328p/pb/16u2) | 170 H/s | 1 | 0.2 W | 15-20 | -| Teensy 4.1 | 12.8 kH/s | 1 | - | - | -| NodeMCU, Wemos D1 etc.
(ESP8266) | 9.3 kH/s | 1 | 0.6 W | 6-8 | -| ESP32 | 27 kH/s | 2 | 1.25 W | - | -| Raspberry Pi Zero | 17 kH/s | 1 | 0.7 W | - | -| Raspberry Pi 3 | 440 kH/s | 4 | 5.1 W | - | -| Raspberry Pi 4 | 1.3 MH/s | 4 | 6.4 W | - | -| Atomic Pi | 690 kH/s | 4 | 6 W | - | -| Orange Pi Zero 2 | 740 kH/s | 4 | 2.55 W | - | -| Khadas Vim 2 Pro | 1.12 MH/s | 8 | 6.2 W | - | -| Libre Computers Tritium H5CC | 480 kH/s | 4 | 5 W | - | -| Libre Computers Le Potato | 410 kH/s | 4 | 5 W | - | -| Pine64 ROCK64 | 640 kH/s | 4 | 5 W | - | -| Intel Celeron G1840 | 1.25 MH/s | 2 | - | 5-6 | -| Intel Core i5-2430M | 1.18 MH/s | 4 | - | 6.5 | -| Intel Core i5-3230M | 1.48 MH/s | 4 | - | 6.1 | -| Intel Core i5-5350U | 1.35 MH/s | 4 | - | 6.0 | -| Intel Core i5-7200U | 1.62 MH/s | 4 | - | 7.5 | -| Intel Core i5-8300H | 3.67 MH/s | 8 | - | 9.1 | -| Intel Core i3-4130 | 1.45 MH/s | 4 | - | - | - -

-

Lizenz


- -Duino-Coin wird hauptsächlich unter der MIT-Lizenz vertrieben. Weitere Informationen finden Sie in der Datei `LICENSE`. -Einige von Drittanbietern enthaltene Dateien können unterschiedliche Lizenzen haben - überprüfen Sie bitte deren `LICENSE`-Anweisungen (normalerweise oben in den Quellcodedateien).

- -

Nutzungsbedingungen


-1. Duino-Coins ("DUCOs") werden von Minern mit einem Prozess namens Mining verdient.
-2. Mining wird mit dem DUCO-S1-Algorithmus beschrieben (erklärt in der Duino-Coin Whitepaper), in dem das Finden eines korrekten Ergebnisses für ein mathematisches Problem dem Miner eine Belohnung gibt.
-3. Mining kann offiziell mit CPUs, AVR Boards (zB Arduino Boards), Single Board Computern (zB Raspberry Pi Boards), ESP32/8266 Boards unter Einsatz von offiziellen Minern durchgeführt werden (andere offiziell erlaubte Miner werden im oberen Teil beschrieben von README).
-4. Das Mining auf GPUs, FPGAs und anderer hocheffizienter Hardware ist erlaubt, jedoch nur mit der Mining-Schwierigkeit `EXTREME`.
-5. Alle Benutzer, die Miner auf einem für ihre Hardware nicht geeigneten Schwierigkeitsgrad verwenden (siehe die Schwierigkeitsliste) wird automatisch gedrosselt und/oder gesperrt.
-6. Alle Benutzer, die entdeckt werden, mit unangemessener und/oder nicht geeignete Hardware verwenden, werden ohne vorherige Ankündigung manuell oder automatisch aus dem Netzwerk gesperrt.
-7. Beim Bannen wird der Benutzer daran gehindert, auf seine Coins zuzugreifen, zusammen mit der Entfernung eines Kontos.
-8. Nur legal verdiente Coins können umgetauscht werden.
-9. Benutzer, die mit böswilligen Absichten (z. B. beim Umgehen von Beschränkungen) entdeckt werden, die ein VPN (oder ähnliches) verwenden, können ohne vorherige Ankündigung gesperrt werden.
-10. Mehrere Konten, die verwendet werden, um Limits zu umgehen, können ohne vorherige Ankündigung gesperrt werden.
-11. Konten können vorübergehend gesperrt werden, um Verstöße gegen die ToS ("Untersuchungen") ("Verstoß" oder "Missbrauch") zu untersuchen.
-12. Mehrere Konten, die verwendet werden, um Sperren zu umgehen, werden ohne vorherige Ankündigung gesperrt.
-13. Eine Umtauschanfrage an die offizielle DUCO-Börse ("die offizielle Börse") kann während der Nachforschungen verzögert und/oder abgelehnt werden.
-14. Umtauschanfragen an die offizielle Börse können aufgrund von ToS-Verstößen und/oder geringer Finanzierung abgelehnt werden.
-15. Die DUCOs eines Benutzers können verbrannt werden, wenn ein Verstoß nachgewiesen werden kann.
-16. Diese Nutzungsbedingungen können jederzeit ohne vorherige Ankündigung geändert werden.
-17. Jeder Nutzer, der Duino-Coin verwendet, erklärt sich damit einverstanden, die oben genannten Regeln einzuhalten.

-

Datenschutz-Bestimmungen


-1. Auf dem Masterserver speichern wir nur Benutzernamen, gehashte Passwörter (mit Hilfe von bcrypt) und E-Mails der Benutzer als Kontodaten.
-2. E-Mails sind nicht öffentlich zugänglich und werden nur verwendet, um den Benutzer bei Bedarf zu kontaktieren und den Austausch auf der DUCO-Exchange zu bestätigen und ein gelegentlicher Newsletter (für die Zukunft geplant).
-3. Wallet Guthaben, Transaktionen und Mining Daten sind in den öffentlichen JSON-API's öffentlich verfügbar.
-4. Die Datenschutzerklärung kann in Zukunft nach vorheriger Ankündigung geändert werden.


- -

Entwickler


- -* **Entwickler:** - * [@revox](https://github.com/revoxhere/) (Gründer/Leitender Entwickler) - robik123.345@gmail.com - * [@Bilaboz](https://github.com/bilaboz/) (Leitender Entwickler) - * [@connorhess](https://github.com/connorhess) (Leitender Entwickler) - * [@JoyBed](https://github.com/JoyBed) (Leitender Entwickler) - * [@LDarki](https://github.com/LDarki) (Web Entwickler) - * [@travelmode](https://github.com/colonelwatch) (Entwickler) - * [@ygboucherk](https://github.com/ygboucherk) ([wDUCO](https://github.com/ygboucherk/wrapped-duino-coin-v2) Entwickler) - * [@Tech1k](https://github.com/Tech1k/) - kristian@beyondcoin.io (Leitender Webmaster and DUCO Entwickler)

- -* **Mitwirkende:** - * [@5Q](https://github.com/its5Q) - * [@kyngs](https://github.com/kyngs) - * [@httsmvkcom](https://github.com/httsmvkcom) - * [@Nosh-Ware](https://github.com/Nosh-Ware) - * [@BastelPichi](https://github.com/BastelPichi) - * [@suifengtec](https://github.com/suifengtec) - * Danke an [@Furim](https://github.com/Furim) für Hilfe in der frühen Entwicklungsphase - * Danke an [@ATAR4XY](https://www.youtube.com/channel/UC-gf5ejhDuAc_LMxvugPXbg) für die Gestaltung früherer Logos - * Danke an [@Tech1k](https://github.com/Tech1k) für die [Beyondcoin](https://beyondcoin.io) Partnerschaft und Bereitstellung der [duinocoin.com](https://duinocoin.com) Domain - * Danke an [@MrKris7100](https://github.com/MrKris7100) für die Hilfe bei der Implementierung des SHA1-Algorithmus - * Danke an [@daknuett](https://github.com/daknuett) für Hilfe bei der Arduino SHA1-Bibliothek +## DUCO & wDUCO + +Duino-Coin ist eine Hybrid-Währung, was bedeutet, dass diese in wDUCO umgewandelt werden kann. Dies ist DUCO (als ein Token) auf das [Tron](https://tron.network) Netwerk gewrapt. Aktuell gibt es keinen großen Nutzen dafür, außer seine Ersparnisse in einem externen Wallet zu lagern oder die wDUCOs in einen anderen Token auf JustSwap umzutauschen. Ein Tutorial zur Benutzung von wDUCO gibt es (in englischer Sprache) im [wDUCO Wiki](https://github.com/revoxhere/duino-coin/wiki/wDUCO-tutorial). + + +## Entwicklung + +Die Beiträge der Community machen die Welt der quelloffenen Software zu einem besonderen Ort voller Wissen und Inspiration.
+Alle Beiträge zu dem Duino-Coin Projekt sind daher herzlichst willkommen. + +Wie kann ich helfen? + +* Forke das Projekt +* Erstelle deine Branch +* Committe deine Änderungen +* Stelle sicher, dass alles wie gewollt funktioniert +* Eröffne einen Pull-Request + +Server-Quellcode, Dokumentation für API-Aufrufe und offizielle Bibliotheken zur Entwicklung von eigenen Duino-Coin Apps sind in der [useful tools](https://github.com/revoxhere/duino-coin/tree/useful-tools)-Branch verfügbar. + + +## Benchmarks von offiziell getesteten Geräten und Boards + +
+ + Da diese Tabelle ziemlich lang ist, ist sie standardmäßig ausgeblendet. Klicke auf diesen Text um sie einzublenden! + + + ### Hinweis: Die erzielten Belohnungen hängen von verschiedenen Faktoren ab. Diese Tabelle dient lediglich zur Orientierung. + + | Gerät/CPU/SBC/MCU/Chip | Durchschnittliche Hashrate
(alle Threads) | Mining-
Threads| Energie-
verbrauch| Durschnittliche
DUCO/Tag | + |-----------------------------------------------------------|----------------------------------------------|-------------------|----------------------|-----------------------------| + | Arduino Pro Mini, Uno, Nano etc.
(Atmega 328p/pb/16u2) | 258 H/s | 1 | 0.2 W | 10-13 | + | Teensy 4.1 (soft cryptography) | 80 kH/s | 1 | 0.5 W | - | + | NodeMCU, Wemos D1 etc.
(ESP8266) | 9-10 kH/s (160MHz) 5 kH/s (80Mhz) | 1 | 0.6 W | 3-6 | + | ESP32 | 40-42 kH/s | 2 | 1 W | 6-9 | + | Raspberry Pi Zero | 18 kH/s | 1 | 1.1 W | - | + | Raspberry Pi 3 | 440 kH/s | 4 | 5.1 W | 4-5 | + | Raspberry Pi 4 | 740 kH/s (32bit) | 4 | 6.4 W | 10 | + | ODROID XU4 | 1.0 MH/s | 8 | 5 W | 9 | + | Atomic Pi | 690 kH/s | 4 | 6 W | - | + | Orange Pi Zero 2 | 740 kH/s | 4 | 2.55 W | - | + | Khadas Vim 2 Pro | 1.12 MH/s | 8 | 6.2 W | - | + | Libre Computers Tritium H5CC | 480 kH/s | 4 | 5 W | - | + | Libre Computers Le Potato | 410 kH/s | 4 | 5 W | - | + | Pine64 ROCK64 | 640 kH/s | 4 | 5 W | - | + | Intel Celeron G1840 | 1.25 MH/s | 2 | - | 3.3 | + | Intel Core i5-2430M | 1.18 MH/s | 4 | - | 6.5 | + | Intel Core i5-3230M | 1.52 MH/s | 4 | - | 7.2 | + | Intel Core i5-5350U | 1.35 MH/s | 4 | - | 6.0 | + | Intel Core i5-7200U | 1.62 MH/s | 4 | - | 7.5 | + | Intel Core i5-8300H | 3.67 MH/s | 8 | - | 9.1 | + | Intel Core i3-4130 | 1.45 MH/s | 4 | - | 3.7 | + | AMD Ryzen 5 2600 | 4.9 MH/s | 12 | 67 W | 15.44 | + + Alle Tests wurden mit dem DUCO-S1 Algorithmus **ohne fasthash Beschleunigungen** durchgeführt. Diese Tabelle wird fortlaufend aktualisiert. +
+ + +## Von der Community erstellte Software + +
+ + Da diese Liste ziemlich lang ist, ist sie standardmäßig ausgeblendet. Klicke auf diesen Text um sie einzublenden! + + + Hinweis: Diese Softwaretitel sind nicht von uns entwickelt und wir geben keinerlei Garantien darauf, dass deren Nutzung nicht zu einem Bann des Nutzerkontos führt. Hier sollte man also vorsichtig sein. Insbesonders die Nutzung des [nonceMiner](https://github.com/colonelwatch/nonceMiner) von colonelwatch **wird garantiert zu einem Bann führen**. + + ### Andere Miner die für Duino-Coin funktionieren: + * [DuinoCoinEthernetMiner](https://github.com/Pumafron/DuinoCoinEthernetMiner) - Arduino Ethernet shield Miner by Pumafron + * [STM8 DUCO Miner](https://github.com/BBS215/STM8_DUCO_miner) - STM8S firmware for mining DUCO by BBS215 + * [DuinoCoinbyLabVIEW](https://github.com/ericddm/DuinoCoinbyLabVIEW) - miner for LabVIEW family by ericddm + * [Duino-JS](https://github.com/Hoiboy19/Duino-JS) - a JavaScript miner which you can easily implement in your site by Hoiboy19 + * [Duinotize](https://github.com/mobilegmYT/Duinotize) - Duino website monetizer by mobilegmYT + * [hauchel's duco-related stuff repository](https://github.com/hauchel/duco/) - Collection of various codes for mining DUCO on other microcontrollers + * [duino-coin-php-miner](https://github.com/ricardofiorani/duino-coin-php-miner) Dockerized Miner in PHP by ricardofiorani + * [duino-coin-kodi](https://github.com/SandUhrGucker/duino-coin-kodi) - Mining addon for Kodi Media Center by SandUhrGucker + * [MineCryptoOnWifiRouter](https://github.com/BastelPichi/MineCryptoOnWifiRouter) - Python script to mine Duino-Coin on routers by BastelPichi + * [Duino-Coin_Android_Cluster Miner](https://github.com/DoctorEenot/DuinoCoin_android_cluster) - mine with less connections on multiple devices by DoctorEenot + * [ESPython DUCO Miner](https://github.com/fabiopolancoe/ESPython-DUCO-Miner) - MicroPython miner for ESP boards by fabiopolancoe + * [DUCO Miner for Nintendo 3DS](https://github.com/BunkerInnovations/duco-3ds) - Python miner for Nintendo 3DS by PhereloHD & HGEpro + * [Dockerized DUCO Miner](https://github.com/Alicia426/Dockerized_DUCO_Miner_minimal) - Miner in Docker by Alicia426 + * [NodeJS-DuinoCoin-Miner](https://github.com/LDarki/NodeJS-DuinoCoin-Miner/) - simple NodeJS miner by LDarki + * [d-cpuminer](https://github.com/phantom32-0/d-cpuminer) - pure C miner by phantom32 & revoxhere + * [Go Miner](https://github.com/yippiez/go-miner) by yippiez + * [ducominer](https://github.com/its5Q/ducominer) by its5Q + * [Unofficial miners directory](https://github.com/revoxhere/duino-coin/tree/master/Unofficial%20miners) + * [Julia Miner](https://github.com/revoxhere/duino-coin/blob/master/Unofficial%20miners/Julia_Miner.jl) by revoxhere + * [Ruby Miner](https://github.com/revoxhere/duino-coin/blob/master/Unofficial%20miners/Ruby_Miner.rb) by revoxhere + * [Minimal Python Miner (DUCO-S1)](https://github.com/revoxhere/duino-coin/blob/master/Unofficial%20miners/Minimal_PC_Miner.py) by revoxhere + * [Teensy 4.1 code for Arduino IDE](https://github.com/revoxhere/duino-coin/blob/master/Unofficial%20miners/Teensy_code/Teensy_code.ino) by joaquinbvw + + ### Andere Tools: + * [Duino Miner](https://github.com/g7ltt/Duino-Miner) - Arduino Nano based DUCO miner files and documentation by g7ltt + * [DUINO Mining Rig](https://repalmakershop.com/pages/duino-mining-rig) - 3D files, PCB designs and instructions for creating your own Duino rig by ReP_AL + * [DuinoCoin-balance-Home-Assistant](https://github.com/NL647/DuinoCoin-balance-Home-Assistant) - addon for home assistant displaying your balance by NL647 + * [Duino Coin Status Monitor](https://github.com/TSltd/duino_coin) for 128x64 SSD1306 OLED and ESP8266 by TSltd + * [ducopanel](https://github.com/ponsato/ducopanel) - a GUI app for controling your Duino-Coin miners by ponsato + * [Duino AVR Monitor](https://www.microsoft.com/store/apps/9NJ7HPFSR9V5) - GUI Windows App for monitoring AVR devices mining DUCO by niknak + * [Duino-Coin Arduino library](https://github.com/ricaun/arduino-DuinoCoin) by ricaun + * [DuinoCoinI2C](https://github.com/ricaun/DuinoCoinI2C) - Use ESP8266/ESP32 as a master for Arduinos by ricaun + * [Duino-Coin Mining Dashboard](https://lulaschkas.github.io/duco-mining-dashboard/) and troubleshooting helper by Lulaschkas + * [duco-miners](https://github.com/dansinclair25/duco-miners) CLI mining dashboard made by dansinclair25 + * [Duco-Coin Symbol Icon ttf](https://github.com/SandUhrGucker/Duco-Coin-Symbol-Icon-ttf-.h) by SandUhrGucker + * [DUCO Monitor](https://siunus.github.io/duco-monitor/) account statistics website by siunus + * [duino-tools](https://github.com/kyngs/duino-tools) written in Java by kyngs + * [Duino Stats](https://github.com/Bilaboz/duino-stats) official Discord bot by Bilaboz + * [DuCoWallet](https://github.com/viktor02/DuCoWallet) GUI Wallet by viktor02 + * [Duco-widget-ios](https://github.com/naphob/duco-widget-ios) - a Duino-Coin iOS widget by Naphob + + Zudem gibt es eine ähnliche Liste auf der (englischsprachigen) [Internetseite](https://duinocoin.com/apps). +
+ + +## Lizenz + +Duino-Coin ist größtenteils unter der MIT License veröffentlicht. Schaue für weitere Informationen in die `LICENSE`-Datei. +Einige Dateien von Dritten sind eventuell unter anderen Lizenzen veröffentlicht. Bitte schaue in deren `LICENSE`-Statements, welche sich meist am Anfang des jeweiligen Quellcodes befindet. + + +## Nutzungsbedingungen +1. Duino-Coins ("DUCOs") werden durch Miner in einem Prozess namens 'mining' erhalten.
+2. Mining ist in der Nutzung des DUCO-S1 Algorithmuses definiert (wie hier im Duino-Coin Whitepaper ausgeführt), wo für die Lösung eines mathematischen Problems eine Belohnung ausgeschüttet wird.
+3. Mining kann offiziell mit CPUs, AVR Boards (z.B. Arduino Boards), Einplatinencomputern (z.B. Raspberry Pi Boards) und ESP8266/32 Boards mittels der Nutzung von offizieller Mining-Software durchgeführt werden (andere offiziell erlaubte Miner sind in dem oberen Teil der README aufgeführt).
+4. Alle Miner müssen die für sie geschaffene/zutreffende Schwierigkeit verwenden. +5. Mining mit GPUs, FPGAs und anderer Hochleistungshardware ist erlaubt, aber nur mit der `EXTREME` Mining-Schwierigkeit.
+6. Alle Nutzer welche nicht die ihrer Hardware entsprechende Schwierigkeit nutzen (siehe dafür die Schwierigkeits-Liste), werden automatisch durch eine Verschiebung auf die korrekte Schwierigkeit ausgebremst.
+7. Jeder Nutzer der fortlaufend versucht eine für die Hardware zu niedrige Mining-Schwierigkeit zu benutzen, kann temporär oder permanent gebannt werden.
+8. Bannen involviert die Sperrung des Kontozugangs, sowie das Löschen des Kontos.
+9. Nur legal erhaltene Coins können getauscht werden.
+10. Konten können temporär deaktiviert/ausgesetzt werden, um weitere Nachforschungen ("investigations") bezüglich Verstößen ("violation" oder "abuse") gegen die Nutzungsbedingungen durchzuführen.
+11. Eine dem offiziellen DUCO-Exchange ("the offical exchange") gestellte Tauschanfrage, kann während Nachforschungen betrieben werden, verzögert oder abgelehnt werden.
+12. Dem DUCO-Exchange aufgegebene Tauschanfragen können aufgrund von Verstößen gegen die Nutzungsbedingungen oder wegen einem zu geringen Vorkommen an entsprechenden Coins oder ähnlichem abgelehnt werden.
+13. Das Minen mit kostenfreien Cloud-Services (oder kostenfreien Virtual Private Servers, wie z.B. Repl.it, GitHub Actions, etc.) ist nicht erlaubt, da es gegenüber anderen unfair ist.
+14. Die DUCOs eines Nutzers können verbrannt ("burnt") werden, falls sich ein Verstoß herausstellen sollte.
+15. Diese Nutzungsbedingungen können sich jederzeit ohne vorherige Ankündigung ändern.
+16. Aus rationalen Gründen (wie beispielsweise zum Multi-Mining) mehr als ein Nutzerkonto zu besitzen, ist nicht erlaubt. Mehrere Konten, welche auf einem einzigen Computer oder Netwerk genutzt werden, werden blockiert, es sei denn, sie sind hiervon ausgeschlossen ("whitelisted").
+17. Das Senden von Transaktionen zu Werbezwecken ist nicht erlaubt.
+18. Das Senden von vielen Transaktionen innerhalb eines kurzen Zeitraums kann zu einem Auslösen des "Kolka system" führen, welches die Aktionsrate beschränkt oder den Nutzer blockiert.
+19. Von der Community erstellte Software muss mit den Regeln übereinstimmen (Nutzungsbedingungen, Mining-Schwierigkeiten, etc.). Der Missbrauch des Systems führt zur Blockierung der Software und/oder des/der Nutzer(s).
+20. Konten mit falscher Bezeichnung oder Nutzung (vortäuschen eine andere Person zu sein, Fake-Bots, etc.) sind nicht erlaubt.
+21. Jeder Duino-Coin Nutzer erklärt sich mit den oben genannten Regeln einverstanden. Fehlerhaftes Verhalten führt zur Blockierung des Nutzerkontos.
+ + +## Datenschutzerklärung +1. Auf dem Hauptserver werden nur Nutzernamen, gehashte Passwörter (mit der Hilfe von bcrypt), Konto Erstellungs-Zeitpunkte, letzte Login-Zeitpunkte und E-Mail Adressen von Nutzern als deren Daten gespeichert.
+2. E-Mail Adressen sind nicht öffentlich zugänglich und werden nur genutzt, um den Nutzer falls nötig zu kontaktieren, um Tauschanfragen beim DUCO-Exchange zu bestätigen und um (zukünftig) gelegentlich eine Newsletter zuzustellen.
+3. Kontostände, Transaktionen und zum Mining gehörende Daten sind öffentlich zugänglich/abrufbar über die JSON APIs.
+4. Die Datenschutzerklärung kann zukünftig geändert werden, jedoch werden die Nutzer zuvor davon in Kenntnis gesetzt. + + +## Aktive Betreiber des Projekts + +* [@revoxhere](https://github.com/revoxhere/) - robik123.345@gmail.com (Lead Python dev, project founder) +* [@Bilaboz](https://github.com/bilaboz/) (Lead NodeJS dev) +* [@connorhess](https://github.com/connorhess) (Lead Python dev, Node-S owner) +* [@JoyBed](https://github.com/JoyBed) (Lead AVR dev) +* [@Yennefer](https://www.instagram.com/vlegle/) (Lead social manager) +* [@Tech1k](https://github.com/Tech1k/) - hello@kristiankramer.net (Lead Webmaster and DUCO Developer) +* [@ygboucherk](https://github.com/ygboucherk) ([wDUCO](https://github.com/ygboucherk/wrapped-duino-coin-v2) dev) +* [@Lulaschkas](https://github.com/Lulaschkas) (Dev) +* [@joaquinbvw](https://github.com/joaquinbvw) (AVR dev) + +Ein großes Dankeschön an alle [Contributors](https://github.com/revoxhere/duino-coin/graphs/contributors), welche bei der Entwicklung des Duino-Coin Projekts geholfen haben.
Projekt Link: [https://github.com/revoxhere/duino-coin/](https://github.com/revoxhere/duino-coin/) +
+Link zur Internetseite: [https://duinocoin.com/](https://duinocoin.com/) +
+Duino-Coin Status-Seite: [https://status.duinocoin.com](https://status.duinocoin.com) + +
Translated version of this document! There is no guarantee for this translation to be 100% accurate.
diff --git a/Resources/README_TRANSLATIONS/README_es_LATAM.md b/Resources/README_TRANSLATIONS/README_es_LATAM.md index b0671eed..0e3c22d5 100644 --- a/Resources/README_TRANSLATIONS/README_es_LATAM.md +++ b/Resources/README_TRANSLATIONS/README_es_LATAM.md @@ -1,9 +1,8 @@ @@ -19,6 +18,8 @@ + + @@ -43,21 +44,27 @@ + + + + + + - + - + - +

@@ -68,145 +75,141 @@ | Características Clave | Especificaciones Técnicas | (Algunas de las tantas) Placas Soportadas | |-|-|-| -| 💻 Soportado por un gran número de plataformas
👥 Una comunidad de rápido crecimiento
💱 Facil de usar e intercambiar
(en DUCO Exchange, Node-S, JustSwap, SushiSwap)
🌎 Disponible donde sea
:new: Projecto totalmente original y de código abierto
🌳 Amigable con el medio-ambiente y los principiantes
💰 De bajo costo y facil minado | ⚒️ Algoritmo: DUCO-S1
♐ Recompensas: Soportadas por el "Sistema Kolka"
ayudando a recompenzar adecuadamente a los mineros
⚡ Tiempo de transacción: Instantáneo
🪙 Suministro de monedas: Infinito
(Con quema de monedas)
🔤 Ticker: DUCO (ᕲ)
🔢 Decimales: Hasta 20 | ♾️ Arduinos
(Uno, Nano, Mega, Due, Pro Mini, etc.)
📶 ESP8266s
(NodeMCU, Wemos, etc.)
📶 ESP32s
(ESP-WROOM, ESP32-CAM, etc.)
🍓 Raspberry Pis
(1, 2, Zero (W/WH), 3, 4, Pico, 400)
🍊 Orange Pis
(Zero, Zero 2, PC, Plus, etc.)
⚡ Placas Teensy 4.1 | +| 💻 Soportado por un gran número de plataformas
👥 Una comunidad de rápido crecimiento
💱 Facil de usar e intercambiar
(en DUCO Exchange, JustSwap, SushiSwap)
🌎 Disponible donde sea
:new: Proyecto totalmente original y de código abierto
🌳 Amigable con principiantes y con el medio ambiente
💰 De bajo costo y facil minado | ⚒️ Algoritmo: DUCO-S1
♐ Recompensas: Soportadas por el "Sistema Kolka"
ayudando a recompensar justamente a los mineros
⚡ Tiempo de transacción: Instantáneo
🪙 Suministro de monedas: Infinito
(Con quema de monedas)
🔤 Ticker: DUCO (ᕲ)
🔢 Decimales: Hasta 20 | ♾️ Arduinos
(Uno, Nano, Mega, Due, Pro Mini, etc.)
📶 ESP8266s
(NodeMCU, Wemos, etc.)
📶 ESP32s
(ESP-WROOM, ESP32-CAM, etc.)
🍓 Raspberry Pis
(1, 2, Zero (W/WH), 3, 4, Pico, 400)
🍊 Orange Pis
(Zero, Zero 2, PC, Plus, etc.)
⚡ Placas Teensy 4.1 | ## Para Comenzar -#### La forma fácil para comenzar con Duino-Coin es descargar [la ultima versión](https://github.com/revoxhere/duino-coin/releases/latest) para tu Sistema Operativo (SO). +#### La forma más fácil para comenzar con Duino-Coin es descargar [la ultima versión](https://github.com/revoxhere/duino-coin/releases/latest) para tu sistema operativo. -Después de descargar la versión, extráe y ejecuta el programa deseado.
-No hay dependencias extras requeridas. +Después de descargar la versión, extrae y ejecuta el programa deseado.
+No se requieren dependencias. Si necesitas ayuda, puedes mirar las guías oficiales para comenzar en el sitio web oficial.
+Las preguntas más frecuentes y la ayuda para solucionar problemas se pueden encontrar en las [Wikis](https://github.com/revoxhere/duino-coin/wiki).
-FAQ (preguntas frecuentes) y ayuda con el diagnóstico de problemas se pueden encontrar en las [Wikis](https://github.com/revoxhere/duino-coin/wiki).
- - -### Instalación manual - -#### Linux +#### Linux (instalación manual) ```BASH sudo apt update -sudo apt install python3 python3-pip git python3-pil python3-pil.imagetk -y # Instalar dependencias -git clone https://github.com/revoxhere/duino-coin # Clonar el repositorio de Duino-Coin +sudo apt install python3 python3-pip git python3-pil python3-pil.imagetk -y # Install dependencies +git clone https://github.com/revoxhere/duino-coin # Clone Duino-Coin repository cd duino-coin -python3 -m pip install -r requirements.txt # Instalar dependencias pip -```` +python3 -m pip install -r requirements.txt # Install pip dependencies +``` Luego de hacer esto, ya puedes ejecutar el programa deseado (Ej. `python3 PC_Miner.py`). -#### Windows +#### Windows (instalación manual) -1. Descarga e instala [Python 3](https://www.python.org/downloads/) (Asegúrate de tener añadidos PIP y Python a tu PATH) +1. Descarga e instala [Python 3](https://www.python.org/downloads/) (Asegúrate de tener añadidos Python y PIP a tu PATH) 2. Descarga [el repositorio de Duino-Coin](https://github.com/revoxhere/duino-coin/archive/master.zip) -3. Extrae el archivo zip que descargaste y abre la carpeta con la consola de comandos (CMD) -4. En el (CMD) escribe `python3 -m pip install -r requirements.txt` o `python -m pip install -r requirements.txt` y presiona ENTER, para instalar las dependencias PIP requeridas - -Luego de hacer esto, ya puedes ejecutar el programa deseado (haciendo doble click en el archivo `.py` o poniendo `python3 PC_Miner.py` en la cmd). - -### Instalación automatica +3. Extrae el archivo zip que descargaste y abre la carpeta con el símbolo del sistema +4. En el símbolo del sistema escribe `py -m pip install -r requirements.txt` para instalar las dependencias pip requeridas -#### Raspberry Pi +Luego de hacer esto, ya puedes ejecutar el software (haciendo doble click en el archivo `.py` o poniendo `py PC_Miner.py` en el símbolo del sistema). -Nota: Si este script no funciona instenta instalarlo manualmente. +#### Raspberry Pi (instalación automática) ```BASH -# Descarga el script wget https://raw.githubusercontent.com/revoxhere/duino-coin/master/Tools/duco-install-rpi.sh - -# Cambia los permisos del archivo sudo chmod a+x duco-install-rpi.sh - -# Ejecuta el script ./duco-install-rpi.sh ``` +## DUCO, wDUCO, bscDUCO, maticDUCO & celoDUCO -## DUCO & wDUCO - -Duino-Coin es una moneda híbrida, lo que significa que puede ser convertida a wDUCO, que es DUCO envuelto en la red de [Tron](https://tron.network) como un token. Actualmente no hay muchos usos para este, más que guardar los fondos en una billetera externa o intercambiando wDUCO a otro token en JustSwap. Un tutorial de como usar wDUCO esta disponible en la -[wiki wDUCO](https://github.com/revoxhere/duino-coin/wiki/wDUCO-tutorial). [está en inglés] +Duino-Coin es una moneda híbrida que da soporte tanto a formas centralizadas como descentralizadas de almacenar fondos. Los Duino-Coins pueden convertirse en wDUCO, bscDUCO u otros, que son los mismos Duino-Coins pero "envueltos" (almacenados) en otras redes como tokens. Un tutorial de ejemplo sobre el uso de wDUCO está disponible en el [wDUCO wiki](https://github.com/revoxhere/duino-coin/wiki/wDUCO-tutorial). Las monedas pueden ser envueltas directamente desde su Web Wallet - haga clic en el botón Wrap Coins para empezar. ## Desarrollo Las contribuciones son lo que hacen que la comunidad de código abierto sea un lugar increíble para aprender, inspirarse y crear.
Cualquier contribución que haces al proyecto de Duino-Coin son gratamente apreciadas. -Como ayudar? +¿Como ayudar? * Bifurca el proyecto (fork) * Crea tu rama de desarrollo * Sube tus cambios (commit) * Asegúrate de que todo funciona como debería -* Abre una petición de subida (Pull Request) +* Abre una petición de subida (pull request) -El código fuente del servidor, documentación para las peticiones a la API y librerías oficiales para desarrollar tus propias apps con (o para) Duino-Coin están disponibles en la rama [herramientas útiles](https://github.com/revoxhere/duino-coin/tree/useful-tools) +El código fuente del servidor, documentación para las peticiones a la API y librerías oficiales para desarrollar tus propias apps para Duino-Coin están disponibles están disponibles en la rama de [herramientas útiles](https://github.com/revoxhere/duino-coin/tree/useful-tools) -## Comparaciones de pruebas oficiales de dispositivos y placas -
- - Debido a que la tabla se está volviendo muy larga, está colapsada por defecto. ¡Haz click aquí para expandirla! - +## Version 4.0 objetivo de recompensas + +Capturado con un multiplicador normal (no multiplicador de fin de semana) +| Dispositivo | Hashrate | Hilos | DUCO/día | Potencia usada | +|--------------------------------|------------------------|---------|----------|----------------| +| Arduino | 343 H/s | 1 | 12 | <0.5 W +| ESP32 | 170-180 kH/s | 2 | 10 | 1.5-2 W +| ESP32-S2/C3 | 85-96 kH/s | 1 | 8 | 1-1.5 W +| ESP8266 | 66 kH/s | 1 | 6 | 1-1.5 W +| Raspberry Pi 4 (Bajo) | 1 MH/s (no hash rápido)| 4 | 6-7 | 6.5 W +| Raspberry Pi 4 (Medio) | 5.4 MH/s (has rápido) | 4 | 7-8 | 6.5 W +| Computadores de bajos recursos | | 4 | 4-6 | - +| Computadores de medios recursos| | 4-8 | 6-10 | - +| Computadores de altos recursos | | 8+ | 10-12 | - - ### Ten en cuenta que las recompensas dependen de muchos factores y la tabla de abajo es solo para propositos de orientación. +
+ Otros dispositivos testeados y sus benchmarks - | Dispositivo/CPU/SBC/MCU/chip | hashrate promedio
(todos los hilos) | Hilos de
Minado | Consumo de
Luz | DUCO/Dia
Promedio | - |-----------------------------------------------------------|-----------------------------------|-------------------|----------------|---------------------| - | Arduino Pro Mini, Uno, Nano etc.
(Atmega 328p/pb/16u2) | 196 H/s | 1 | 0.2 W | 9-10 | - | Teensy 4.1 (soft cryptography) | 80 kH/s | 1 | 0.5 W | - | - | NodeMCU, Wemos D1 etc.
(ESP8266) | 10 kH/s (160MHz) 4.9 kH/s (80Mhz) | 1 | 0.6 W | 6-7 | - | ESP32 | 33 kH/s | 2 | 1 W | 8-9 | - | Raspberry Pi Zero | 18 kH/s | 1 | 1.1 W | - | - | Raspberry Pi 3 | 440 kH/s | 4 | 5.1 W | 4-5 | - | Raspberry Pi 4 | 740 kH/s (32bit) | 4 | 6.4 W | 10 | - | ODROID XU4 | 1.0 MH/s | 8 | 5 W | 9 | - | Atomic Pi | 690 kH/s | 4 | 6 W | - | - | Orange Pi Zero 2 | 740 kH/s | 4 | 2.55 W | - | - | Khadas Vim 2 Pro | 1.12 MH/s | 8 | 6.2 W | - | - | Libre Computers Tritium H5CC | 480 kH/s | 4 | 5 W | - | - | Libre Computers Le Potato | 410 kH/s | 4 | 5 W | - | - | Pine64 ROCK64 | 640 kH/s | 4 | 5 W | - | - | Intel Celeron G1840 | 1.25 MH/s | 2 | - | 3.3 | - | Intel Core i5-2430M | 1.18 MH/s | 4 | - | 6.5 | - | Intel Core i5-3230M | 1.52 MH/s | 4 | - | 7.2 | - | Intel Core i5-5350U | 1.35 MH/s | 4 | - | 6.0 | - | Intel Core i5-7200U | 1.62 MH/s | 4 | - | 7.5 | - | Intel Core i5-8300H | 3.67 MH/s | 8 | - | 9.1 | - | Intel Core i3-4130 | 1.45 MH/s | 4 | - | 3.7 | - | AMD Ryzen 5 2600 | 4.9 MH/s | 12 | 67 W | 15.44 | - - Todas las pruebas hechas fueron utilizando el algoritmo DUCO-S1. Esta tabla se actualizará activamente. +Tenga en cuenta que la columna DUCO/día se ha eliminado desde que la versión 4.0 cambió el sistema de recompensas. +| Dispositivp/CPU/SBC/MCU/chip | Tasa de hash promedio
(todos los hilos) | Hilos de minado | Potencia usada | +|-----------------------------------------------------------|--------------------------------------------|-------------------|----------------| +| Raspberry Pi Pico | 5 kH/s | 1 | 0.3 W | +| Raspberry Pi Zero | 18 kH/s | 1 | 1.1 W | +| Raspberry Pi 3 **(32bit)** | 440 kH/s | 4 | 5.1 W | +| Raspberry Pi 4 **(32bit)** | 740 kH/s | 4 | 6.4 W | +| Raspberry Pi 4 **(64bit, hash rápido)** | 6.8 MH/s | 4 | 6.4 W | +| ODROID XU4 | 1.0 MH/s | 8 | 5 W | +| Atomic Pi | 690 kH/s | 4 | 6 W | +| Orange Pi Zero 2 | 740 kH/s | 4 | 2.55 W | +| Khadas Vim 2 Pro | 1.12 MH/s | 8 | 6.2 W | +| Libre Computers Tritium H5CC | 480 kH/s | 4 | 5 W | +| Libre Computers Le Potato | 410 kH/s | 4 | 5 W | +| Pine64 ROCK64 | 640 kH/s | 4 | 5 W | +| Intel Celeron G1840 | 1.25 MH/s | 2 | 53 W | +| Intel Core i5-2430M | 1.18 MH/s | 4 | 35 W | +| Intel Core i5-3230M | 1.52 MH/s | 4 | 35 W | +| Intel Core i5-5350U | 1.35 MH/s | 4 | 15 W | +| Intel Core i5-7200U | 1.62 MH/s | 4 | 15 W | +| Intel Core i5-8300H | 3.67 MH/s | 8 | 45 W | +| Intel Core i3-4130 | 1.45 MH/s | 4 | 54 W | +| AMD Ryzen 5 2600 | 4.9 MH/s | 12 | 65 W | +| AMD Ryzen R1505G **(hash rápido)** | 8.5 MH/s | 4 | 35 W | +| Intel Core i7-11370H **(hash rápido)** | 17.3 MH/s | 8 | 35 W | +| Realtek RTD1295 | 490 kH/s | 4 | - | +| Realtek RTD1295 **(hash rápido)** | 3.89 MH/s | 4 | - | +
+ + ## Programas hechos por la comunidad -
- - Ya que esta lista se esta volviendo muy extensa, está colapsada por defecto. ¡Haz click para expandirla! - - - Ten en cuenta que estos programas no estan siendo desarrollados por nosotros y que nosotros no damos ninguna garantía de que usarlos no resultarán en un baneo de cuenta. Tratelos como una curiosidad. Vale la pena decir que usar [nonceMiner](https://github.com/colonelwatch/nonceMiner) por colonelwatch **te bloqueará la cuenta**. +### Ten en cuenta que estos programas no han sido desarrollados por nosotros y que no damos ninguna garantía de que usarlos no resultarán en un baneo de cuenta. Trátelos como una curiosidad. ### Otros mineros que trabajan con Duino-Coin: + * [Dockerized Duino-Coin Miner](https://github.com/simeononsecurity/docker-duino-coin) - Una versión Dockerizada del Minero Duino-Coin + * :point_right: [**RP2040-HAT-MINING-C**](https://github.com/Wiznet/RP2040-HAT-MINING-C) - **WIZnet RP2040** stack minero * [DuinoCoinEthernetMiner](https://github.com/Pumafron/DuinoCoinEthernetMiner) - Minero Arduino Ethernet Shield por Pumafron * [STM8 DUCO Miner](https://github.com/BBS215/STM8_DUCO_miner) - STM8S firmware para minar DUCO por BBS215 - * [DuinoCoinbyLabVIEW](https://github.com/ericddm/DuinoCoinbyLabVIEW) - Minero para familia LabVIEW por ericddm - * [Duino-JS](https://github.com/Hoiboy19/Duino-JS) - Un minero JavaScript que es facil de poner en tu sitio web por Hoiboy19 - * [Mineuino](https://github.com/VatsaDev/Mineuino) - Monetizador de sitio web por VatsaDev - * [hauchel's duco-related stuff repository](https://github.com/hauchel/duco/) - Colección de varios programas para minar DUCO en otros microcontroladores - * [duino-coin-php-miner](https://github.com/ricardofiorani/duino-coin-php-miner) - Minero dockerizado en php por ricardofiorani - * [duino-coin-kodi](https://github.com/SandUhrGucker/duino-coin-kodi) - Add-on de miando para Kodi Media Center por SandUhrGucker - * [MineCryptoOnWifiRouter](https://github.com/BastelPichi/MineCryptoOnWifiRouter) - Script en Python para minar en routers Wi-Fi por BastelPichi - * [Duino-Coin_Android_Cluster Miner](https://github.com/DoctorEenot/DuinoCoin_android_cluster) - Mina con menos conecciones en más dispositivos por DoctorEenot - * [ESPython DUCO Miner](https://github.com/fabiopolancoe/ESPython-DUCO-Miner) - Minero en MicroPython para placas ESP por fabiopolancoe - * [DUCO Miner for Nintendo 3DS](https://github.com/BunkerInnovations/duco-3ds) - Minero en Python para Nintendo 3DS por PhereloHD & HGEpro - * [Dockerized DUCO Miner](https://github.com/Alicia426/Dockerized_DUCO_Miner_minimal) - Minero en docker por Alicia426 - * [NodeJS-DuinoCoin-Miner](https://github.com/LDarki/NodeJS-DuinoCoin-Miner/) - Minero simple en Node.JS por LDarki - * [d-cpuminer](https://github.com/phantom32-0/d-cpuminer) - Minero hecho en C puro por phantom32 & revoxhere + * [DuinoCoinbyLabVIEW](https://github.com/ericddm/DuinoCoinbyLabVIEW) - minero para familia LabVIEW por ericddm + * [Duino-JS](https://github.com/Hoiboy19/Duino-JS) - un minero JavaScript que puedes implementar fácilmente en tu sitio web por Hoiboy19 + * [Mineuino](https://github.com/VatsaDev/Mineuino) - monetizador de sitios web con Duino por VatsaDev + * [hauchel's duco-related stuff repository](https://github.com/hauchel/duco/) - Colección de varios códigos para minar DUCO en otros microcontroladores + * [duino-coin-php-miner](https://github.com/ricardofiorani/duino-coin-php-miner) - Minero Dockerizado en PHP por ricardofiorani + * [duino-coin-kodi](https://github.com/SandUhrGucker/duino-coin-kodi) - Add-on de minado para Kodi Media Center por SandUhrGucker + * [MineCryptoOnWifiRouter](https://github.com/BastelPichi/MineCryptoOnWifiRouter) - script en Python para minar en routers Wi-Fi por BastelPichi + * [Duino-Coin_Android_Cluster Miner](https://github.com/DoctorEenot/DuinoCoin_android_cluster) - mina con menos conecciones en varios dispositivos por DoctorEenot + * [ESPython DUCO Miner](https://github.com/fabiopolancoe/ESPython-DUCO-Miner) - minero en MicroPython para placas ESP por fabiopolancoe + * [DUCO Miner for Nintendo 3DS](https://github.com/BunkerInnovations/duco-3ds) - minero en Python para Nintendo 3DS por PhereloHD & HGEpro + * [Dockerized DUCO Miner](https://github.com/Alicia426/Dockerized_DUCO_Miner_minimal) - Minero en Docker por Alicia426 + * [NodeJS-DuinoCoin-Miner](https://github.com/LDarki/NodeJS-DuinoCoin-Miner/) - minero simple en Node.JS por LDarki + * [d-cpuminer](https://github.com/phantom32-0/d-cpuminer) - minero en C puro por phantom32 & revoxhere * [Go Miner](https://github.com/yippiez/go-miner) por yippiez * [ducominer](https://github.com/its5Q/ducominer) por its5Q * [Directorio de mineros no oficiales](https://github.com/revoxhere/duino-coin/tree/master/Unofficial%20miners) @@ -216,71 +219,49 @@ El código fuente del servidor, documentación para las peticiones a la API y li * [Teensy 4.1 code for Arduino IDE](https://github.com/revoxhere/duino-coin/blob/master/Unofficial%20miners/Teensy_code/Teensy_code.ino) por joaquinbvw ### Otras herramientas: - * [DUINO Mining Rig](https://repalmakershop.com/pages/duino-mining-rig) - Archivos 3D, Diseños de PCB y instrucciones para crear tu propio righ de Arduino PCB por ReP_AL - * [DuinoCoin-balance-Home-Assistant](https://github.com/NL647/DuinoCoin-balance-Home-Assistant) - Add-on para Home Assistant para mostrar tu dinero por NL647 - * [Duino Coin Status Monitor](https://github.com/TSltd/duino_coin) Para OLED 128x64 SSD1306 y ESP8266 por TSltd + * [Duinogotchi](https://github.com/OSRdesign/duinogotchi) - Proyecto de Duino-Coin mascotas virtuales por ricaun + * [Duino Miner](https://github.com/g7ltt/Duino-Miner) - Archivos y documentación del minero DUCO basado en Arduino Nano por g7ltt + * [DUINO Mining Rig](https://repalmakershop.com/pages/duino-mining-rig) - Archivos 3D, diseños de PCB e instrucciones para crear tu propio Duino rig por ReP_AL + * [DuinoCoin-balance-Home-Assistant](https://github.com/NL647/DuinoCoin-balance-Home-Assistant) - add-on para Home Assistant mostrando tu saldo por NL647 * [ducopanel](https://github.com/ponsato/ducopanel) - un app GUI para controlar tus mineros Duino-Coin por ponsato - * [Duino AVR Monitor](https://www.microsoft.com/store/apps/9NJ7HPFSR9V5) - app GUI de Windows GUI para monitorear dispositivos AVR Minando Duino-Coin por niknak + * [Duino AVR Monitor](https://www.microsoft.com/store/apps/9NJ7HPFSR9V5) - app GUI de Windows para monitorear dispositivos AVR minando DUCO por niknak * [Duino-Coin Arduino library](https://github.com/ricaun/arduino-DuinoCoin) por ricaun * [DuinoCoinI2C](https://github.com/ricaun/DuinoCoinI2C) - Usa ESP8266/ESP32 como maestros para Arduinos por ricaun - * [Duino-Coin Mining Dashboard](https://lulaschkas.github.io/duco-mining-dashboard/) panel de control y solucionador de problemas por Lulaschkas - * [duco-miners](https://github.com/dansinclair25/duco-miners) panel de control de minado CLI por dansinclair25 + * [Duino-Coin Mining Dashboard](https://lulaschkas.github.io/duco-mining-dashboard/) y ayudante de solución de problemas por Lulaschkas + * [duco-miners](https://github.com/dansinclair25/duco-miners) panel de control de minado CLI hecho por dansinclair25 * [Duco-Coin Symbol Icon ttf](https://github.com/SandUhrGucker/Duco-Coin-Symbol-Icon-ttf-.h) por SandUhrGucker - * [DUCO Monitor](https://siunus.github.io/duco-monitor/) Sitio Web para Estadisticas de cuenta por siunus - * [duino-tools](https://github.com/kyngs/duino-tools) Escrito en Java por kyngs + * [DUCO Monitor](https://siunus.github.io/duco-monitor/) sitio web de estadísticas de cuentas por siunus * [Duino Stats](https://github.com/Bilaboz/duino-stats) bot oficial de Discord por Bilaboz - * [DuCoWallet](https://github.com/viktor02/DuCoWallet) Billetera GUI por viktor02 - * [Duco-widget-ios](https://github.com/naphob/duco-widget-ios) - Un Widget de Duino-Coin por Naphob + * [DuCoWallet](https://github.com/viktor02/DuCoWallet) Wallet GUI por viktor02 + * [Duco-widget-ios](https://github.com/naphob/duco-widget-ios) - un widget Duino-Coin para iOS por Naphob + * [Duino Lookup](https://axorax.github.io/duino-lookup/) por axorax Tambien puedes ver una lista similar en el [sitio web](https://duinocoin.com/apps). -
## Licencia -Duino-Coin está distribuído por la licencia MIT. Mira el archivo `LICENSE` para más información. -Algunos archivos de terceros incluídos pueden tener distintas licencias - por favor mira sus archivos `LICENSE` (Usualmente en la parte superior del codigo fuente de los mismos). - -## Términos del servicio -1. Duino-Coins ("DUCOs") son ganados por los Mineros en un proceso llamado Minado.
-2. La descripción del Minado es utilizar el algoritmo DUCO-S1 (así como se explica en el WhitePaper de Duino-Coin), en el cual conseguir una respuesta correcta a un problema matemático le da ganancias al usuario.
-3. El minado puede hacerse oficialmente con CPUs, placas AVR (Ej. Arduino), Computadoras de placa-unica (Ej. Raspberry Pi), placas ESP32/8266 con el uso de Mineros Oficiales (Otros mineros oficialmente permitidos están en la parte superior del Readme).
-4. Minar en GPUs, FPGAs y otro hardware de alta eficiencia esta permitido, pero solo usando la dificultad `EXTREME` para su minado.
-5. Cualquier usuario utilizando una dificultad de minado no específica para su hardware (véase Lista de Dificultades), será automáticamente acelerado, al ser movido al nivel correcto de dificultad.
-6. Cualquier usuario que persista en utilizar una dificultad inferior a la que es adecuada, puede ser temporalmente bloqueado.
-7. El Baneo, implica el bloquear al usuario del acceso a sus monedas además de la remoción de su cuenta.
-8. Solo las monedas obtenidas legalmente, son aptas para el intercambio.
-9. Las Cuentas pueden ser suspendidas temporalmente, para investigar ("investigaciones") de violación de ToS ("violación" o "abuso").
-10. Una petición de intercambio hecha en el oficial DUCO-Exchange ("El intercambio oficial") puede ser retrasada o denegada durante investigaciones.
-11. Peticiones de intercambo hechas en el intercambiador oficial puede ser denegada debidoa violaciones de ToS y/o debido a bajos fondos.
-12. El Minado con servidores en la nube gratuitos (o servicios gratuitos de VPS - Ej. Repl.it, Github Actions, etc.) no esta permitido ya que es injusto para con otros.
-13. Los DUCOs de un usuario pueden ser quemados si una violación puede ser probada.
-14. Estos términos de servicio pueden cambiar en cualquier momento sin previo aviso.
-15. Tener cuentas secundarias sin un motivo racional (Ej. para multi-minado) no está permitido.
-16. Enviar transacciones para promover servicios, o hacer publicidad de otra manera no esta permitida en la red.
-17. Cada usuario utilizando Duino-Coin está de acuerdo a cumplir con las reglas dictadas anteriormente.
- - -## Políticas de Privacidad -1. En el servidor maestro solo son guardados nombres de usuarios, contraseñas encryptadas (con la ayuda de bcrypt) y e-mails de los usuarios así como la información de su cuenta.
-2. Los e-mails no son disponibles públicamente y son solo utilizados para contactar al usuario cuando es necesario, confirmar intercambios en DUCO-Exchange y recibir un boletín informativo ocasional (planeado para el futuro).
-3. Balances, transacciones e información relacionada al minado está totalmente disponible para el público JSON APIs.
-4. La política de privacidad puede ser cambiada en el futuro con notificación previa. +Duino-Coin está distribuído principalmente bajo la licencia MIT. Mira el archivo `LICENSE` para más información. +Algunos archivos de terceros incluídos pueden tener licencias diferentes - por favor checa sus archivos `LICENSE` (usualmente en la parte superior del codigo fuente). +## Términos de servicio -## Mantenedores activos del proyecto +Nuestros términos de servicio están disponibles aquí: duinocoin.com/terms
-* [@revoxhere](https://github.com/revoxhere/) - robik123.345@gmail.com (Python dev Jefe, fundador del proyecto) -* [@Bilaboz](https://github.com/bilaboz/) (NodeJS dev Jefe) -* [@connorhess](https://github.com/connorhess) (Python dev Jefe, Dueño de Node-S) -* [@JoyBed](https://github.com/JoyBed) (AVR dev Jefe) -* [@Yennefer](https://www.instagram.com/vlegle/) (Manager Social Jefe) -* [@Tech1k](https://github.com/Tech1k/) - kristian@beyondcoin.io (Webmaster Jefe y Desarrollador de DUCO) -* [@ygboucherk](https://github.com/ygboucherk) ([wDUCO](https://github.com/ygboucherk/wrapped-duino-coin-v2) dev) -* [@Lulaschkas](https://github.com/Lulaschkas) (Dev) -* [@joaquinbvw](https://github.com/joaquinbvw) (AVR dev) +## Políticas de privacidad + +Nuestra política de privacidad está disponible aquí: duinocoin.com/privacy
+ +## Aviso legal + +Nuestro aviso legal está disponible aquí: duinocoin.com/disclaimer
+ + +## Mantenedores activos del proyecto -Grandes gracias a todos los [contribuyentes](https://github.com/revoxhere/duino-coin/graphs/contributors) que ayudaron al desarrollo de Duino-Coin. +Originalmente creado y mantenido por [@revoxhere](https://github.com/revoxhere). +Muchas gracias a todos los [contribuidores](https://github.com/revoxhere/duino-coin/graphs/contributors) que han ayudado a desarrollar el proyecto Duino-Coin. +Visita [duinocoin.com/team.html](https://duinocoin.com/team.html) para obtener mas información sobre el equipo de Duino-Coin.
@@ -289,4 +270,3 @@ Enlace del Proyecto: [https://github.com/revoxhere/duino-coin/](https://github.c Enlace del Sitio Web: [https://duinocoin.com/](https://duinocoin.com/)
Sitio Web del Estado de Duino-Coin: [https://status.duinocoin.com](https://status.duinocoin.com) - diff --git a/Resources/README_TRANSLATIONS/README_fi_FI.md b/Resources/README_TRANSLATIONS/README_fi_FI.md new file mode 100644 index 00000000..5738f1a3 --- /dev/null +++ b/Resources/README_TRANSLATIONS/README_fi_FI.md @@ -0,0 +1,282 @@ + + + + + + +

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + +
+ +

+ Duino-Coin on kolikko, jota voi louhia Arduinolla, ESP8266/32-korteilla, Raspberry Pi:llä, tietokoneilla ja monella muulla laitteella (mukaan lukien Wi-Fi-reitittimet, älytelevisiot, älypuhelimet, älykellot, SBC:t, MCUs tai jopa GPU:t). +

+ + +| Avainominaisuudet | Tekniset tiedot | Tuetut piirikortit (muutamia esimerkkejä) | +|-|-|-| +| 💻 Tukee laajaa valikoimaa alustoja
👥 Nopeasti kasvava yhteisö
💱 Helppo käyttää ja vaihtaa
(DUCO-pörssissä, JustSwap, SushiSwap)
🌎 Saatavilla kaikkialla
:new: Täysin alkuperäinen ja avoimen lähdekoodin projekti
🌳 Aloittelijaystävällinen ja ympäristöystävällinen
💰 Kustannustehokas ja helppo louhia | ⚒️ Algoritmi: DUCO-S1
♐ Palkkiot: tuettu "Kolka-järjestelmällä"
jonka avulla voidaan palkita louhijoita oikeudenmukaisesti
⚡ Siirtoaika: Heti
🪙 Kolikkovaranto: Rajaton
(poltto tapahtuu)
🔤 Tunnus: DUCO (ᕲ)
🔢 Desimaalit: jopa 20 | ♾️ Arduino (Uno, Nano, Mega, Due, Pro Mini, jne.)
📶 ESP8266 (NodeMCU, Wemos, jne.)
📶 ESP32 (ESP-WROOM, ESP32-CAM, jne.)
🍓 Raspberry Pi (1, 2, Zero (W/WH), 3, 4, Pico, 400)
🍊 Orange Pi (Zero, Zero 2, PC, Plus, jne.)
⚡ Teensy 4.1 -kortit | + + +## Aloittaminen + +#### Helpoin tapa aloittaa Duino-Coinin kanssa on ladata [viimeisin julkaisu](https://github.com/revoxhere/duino-coin/releases/latest) käyttöjärjestelmällesi.
+Latauksen jälkeen pura paketti ja käynnistä haluamasi ohjelma.
+Mitään riippuvuuksia ei tarvita. + +Jos tarvitset apua, voit tutustua virallisiin aloitusoppaisiin, jotka löytyvät viralliselta verkkosivustolta.
+UKK ja vianmääritysohjeita löytyy [Wikistä](https://github.com/revoxhere/duino-coin/wiki).
+ + +#### Linux (manuaalinen asennus) + +```BASH +sudo apt update +sudo apt install python3 python3-pip git python3-pil python3-pil.imagetk -y # Asenna vaaditut riippuvuudet +git clone https://github.com/revoxhere/duino-coin # Kloonaa Duino-Coin repositorio +cd duino-coin +python3 -m pip install -r requirements.txt # Asenna pip-riippuvuudet +``` + +Tämän jälkeen voit käynnistää ohjelman kirjoittamalla (esim. `python3 PC_Miner.py`). + +#### Windows (manuaalinen asennus) + +1. Lataa ja asenna [Python 3](https://www.python.org/downloads/) (varmista, että lisäät Pythonin ja Pipin PATH:iin) +2. Lataa [the Duino-Coin repo](https://github.com/revoxhere/duino-coin/archive/master.zip) +3. Pura ladattu zip-tiedosto ja avaa kansio komentokehotteessa +4. Komentokehotteessa kirjoita `py -m pip install -r requirements.txt` asentaaksesi tarvittavat pip-riippuvuudet + +When you have completed the installation, you can launch the software by either double-clicking on the desired .py file or typing py PC_Miner.py in the command prompt. + +#### Raspberry Pi (automaattinen asennus) + +```BASH +wget https://raw.githubusercontent.com/revoxhere/duino-coin/master/Tools/duco-install-rpi.sh +sudo chmod a+x duco-install-rpi.sh +./duco-install-rpi.sh +``` + +## DUCO, wDUCO, bscDUCO, maticDUCO & celoDUCO + +Duino-Coin on hybridivaluutta, joka tarjoaa tuen sekä keskitetyille että hajautetuille tavoille tallentaa varoja. Duino-Coinit voidaan muuntaa wDUCO: ksi, bscDUCO: ksi tai muiksi vastaaviksi Duino-Coiniksi, jotka ovat tallennettu (kääritty) muihin verkkoihin tokeneina. Esimerkkiohjeet wDUCO:n käyttämisestä ovat saatavilla [wDUCO wiki](https://github.com/revoxhere/duino-coin/wiki/wDUCO-tutorial). Kolikot voidaan kääriä suoraan verkkolompakostasi - napsauta Wrap Coins -painiketta aloittaaksesi. + +## Kehitys + +Panostasi-tekijöistä tekee avoimen lähdekoodiyhteisöstä niin uskomattoman hienon paikan oppia, inspiroitua ja luoda.
+Kaikki panostuksesi Duino-Coin-projektiin ovat erittäin arvostettuja. + +Kuinka voit auttaa? + +* Forkkaa projektin repositorio +* Luo uusi haarautumishaara (feature branch) +* Tee muutokset +* Varmista, että kaikki toimii tarkoitetulla tavalla +* Luo uusi vedä-pyyntö (pull request) + +Palvelimen lähdekoodi, API-kutsujen dokumentaatio sekä viralliset kirjastot oman sovelluksen kehittämiseen Duino-Coinille ovat saatavilla [useful tools](https://github.com/revoxhere/duino-coin/tree/useful-tools) -haarassa. + + +## Testatut laitteet ja kehysalustat + +### Huomaa, että palkkiot riippuvat monista tekijöistä ja alla oleva taulukko on vain suuntaa antava. + + | Laite/CPU/SBC/MCU/piiri | Keskimääräinen hashrate
(kaikki säikeet) | Louhinta
säikeet | Virran
-kulutus | Keskimääräinen
DUCO/päivä | + |-----------------------------------------------------------|-----------------------------------|-------------------|----------------|---------------------| + | Arduino Pro Mini, Uno, Nano jne.
(Atmega 328p/pb/16u2) | 258 H/s | 1 | 0.2 W | 15-20 | + | Raspberry Pi Pico | 5 kH/s | 1 | 0.3 W | 10 | + | Teensy 4.1 (pehmeä salaus) | 80 kH/s | 1 | 0.5 W | ? | + | NodeMCU, Wemos D1 jne.
(ESP8266) | 9-10 kH/s (160MHz) 5 kH/s (80Mhz) | 1 | 0.6 W | 3-6 | + | ESP32 | 40-42 kH/s | 2 | 1 W | 6-9 | + | Raspberry Pi Zero | 18 kH/s | 1 | 1.1 W | ? | + | Raspberry Pi 3 **(32bit)** | 440 kH/s | 4 | 5.1 W | 4-5 | + | Raspberry Pi 4 **(32bit)** | 740 kH/s | 4 | 6.4 W | ? | + | Raspberry Pi 4 **(64bit, fasthash)** | 6.8 MH/s | 4 | 6.4 W | 5 | + | ODROID XU4 | 1.0 MH/s | 8 | 5 W | 6 | + | Atomic Pi | 690 kH/s | 4 | 6 W | ? | + | Orange Pi Zero 2 | 740 kH/s | 4 | 2.55 W | ? | + | Khadas Vim 2 Pro | 1.12 MH/s | 8 | 6.2 W | ? | + | Libre Computers Tritium H5CC | 480 kH/s | 4 | 5 W | ? | + | Libre Computers Le Potato | 410 kH/s | 4 | 5 W | ? | + | Pine64 ROCK64 | 640 kH/s | 4 | 5 W | ? | + | Intel Celeron G1840 | 1.25 MH/s | 2 | 53 W | 3.3 | + | Intel Core i5-2430M | 1.18 MH/s | 4 | 35 W | 6.5 | + | Intel Core i5-3230M | 1.52 MH/s | 4 | 35 W | 7.2 | + | Intel Core i5-5350U | 1.35 MH/s | 4 | 15 W | 6.0 | + | Intel Core i5-7200U | 1.62 MH/s | 4 | 15 W | 7.5 | + | Intel Core i5-8300H | 3.67 MH/s | 8 | 45 W | 9.1 | + | Intel Core i3-4130 | 1.45 MH/s | 4 | 54 W | 3.7 | + | AMD Ryzen 5 2600 | 4.9 MH/s | 12 | 65 W | 15.44 | + | AMD Ryzen R1505G **(fasthash)** | 8.5 MH/s | 4 | 35 W | - | + | Intel Core i7-11370H **(fasthash)** | 17.3 MH/s | 8 | 35 W | 4.28 | + | Realtek RTD1295 | 490 kH/s | 4 | - | - | + | Realtek RTD1295 **(fasthash)** | 3.89 MH/s | 4 | - | - | + +Kaikki testit suoritettiin käyttäen DUCO-S1-algoritmia **ilman fasthash-kiihdytyksiä**, ellei toisin mainita. Tämä taulukko päivitetään aktiivisesti. + + + +## Yhteisön tekemät ohjelmistot + +### Huomioithan, että nämä ohjelmistot eivät ole kehittämiämme, emmekä anna mitään takuita siitä, ettei niiden käyttö johda tilin sulkemiseen. Käytä niitä omalla vastuullasi. + + ### Muut tiedossa olevat Duino-Coinin kaivostyökalut: + * :point_right: [**RP2040-HAT-MINING-C**](https://github.com/Wiznet/RP2040-HAT-MINING-C) - **WIZnet RP2040** mining stack + * [DuinoCoinEthernetMiner](https://github.com/Pumafron/DuinoCoinEthernetMiner) - Arduino Ethernet shield Miner by Pumafron + * [STM8 DUCO Miner](https://github.com/BBS215/STM8_DUCO_miner) - STM8S firmware for mining DUCO by BBS215 + * [DuinoCoinbyLabVIEW](https://github.com/ericddm/DuinoCoinbyLabVIEW) - miner for LabVIEW family by ericddm + * [Duino-JS](https://github.com/Hoiboy19/Duino-JS) - a JavaScript miner which you can easily implement in your site by Hoiboy19 + * [Duinotize](https://github.com/mobilegmYT/Duinotize) - Duino website monetizer by mobilegmYT + * [hauchel's duco-related stuff repository](https://github.com/hauchel/duco/) - Collection of various codes for mining DUCO on other microcontrollers + * [duino-coin-php-miner](https://github.com/ricardofiorani/duino-coin-php-miner) Dockerized Miner in PHP by ricardofiorani + * [duino-coin-kodi](https://github.com/SandUhrGucker/duino-coin-kodi) - Mining addon for Kodi Media Center by SandUhrGucker + * [MineCryptoOnWifiRouter](https://github.com/BastelPichi/MineCryptoOnWifiRouter) - Python script to mine Duino-Coin on routers by BastelPichi + * [Duino-Coin_Android_Cluster Miner](https://github.com/DoctorEenot/DuinoCoin_android_cluster) - mine with less connections on multiple devices by DoctorEenot + * [ESPython DUCO Miner](https://github.com/fabiopolancoe/ESPython-DUCO-Miner) - MicroPython miner for ESP boards by fabiopolancoe + * [DUCO Miner for Nintendo 3DS](https://github.com/BunkerInnovations/duco-3ds) - Python miner for Nintendo 3DS by PhereloHD & HGEpro + * [Dockerized DUCO Miner](https://github.com/Alicia426/Dockerized_DUCO_Miner_minimal) - Miner in Docker by Alicia426 + * [NodeJS-DuinoCoin-Miner](https://github.com/LDarki/NodeJS-DuinoCoin-Miner/) - simple NodeJS miner by LDarki + * [d-cpuminer](https://github.com/phantom32-0/d-cpuminer) - pure C miner by phantom32 & revoxhere + * [Go Miner](https://github.com/yippiez/go-miner) by yippiez + * [ducominer](https://github.com/its5Q/ducominer) by its5Q + * [Unofficial miners directory](https://github.com/revoxhere/duino-coin/tree/master/Unofficial%20miners) + * [Julia Miner](https://github.com/revoxhere/duino-coin/blob/master/Unofficial%20miners/Julia_Miner.jl) by revoxhere + * [Ruby Miner](https://github.com/revoxhere/duino-coin/blob/master/Unofficial%20miners/Ruby_Miner.rb) by revoxhere + * [Minimal Python Miner (DUCO-S1)](https://github.com/revoxhere/duino-coin/blob/master/Unofficial%20miners/Minimal_PC_Miner.py) by revoxhere + * [Teensy 4.1 code for Arduino IDE](https://github.com/revoxhere/duino-coin/blob/master/Unofficial%20miners/Teensy_code/Teensy_code.ino) by joaquinbvw + + ### Muut työkalut: + * [Duino Miner](https://github.com/g7ltt/Duino-Miner) - Arduino Nano based DUCO miner files and documentation by g7ltt + * [DUINO Mining Rig](https://repalmakershop.com/pages/duino-mining-rig) - 3D files, PCB designs and instructions for creating your own Duino rig by ReP_AL + * [DuinoCoin-balance-Home-Assistant](https://github.com/NL647/DuinoCoin-balance-Home-Assistant) - addon for home assistant displaying your balance by NL647 + * [ducopanel](https://github.com/ponsato/ducopanel) - a GUI app for controling your Duino-Coin miners by ponsato + * [Duino AVR Monitor](https://www.microsoft.com/store/apps/9NJ7HPFSR9V5) - GUI Windows App for monitoring AVR devices mining DUCO by niknak + * [Duino-Coin Arduino library](https://github.com/ricaun/arduino-DuinoCoin) by ricaun + * [DuinoCoinI2C](https://github.com/ricaun/DuinoCoinI2C) - Use ESP8266/ESP32 as a master for Arduinos by ricaun + * [Duino-Coin Mining Dashboard](https://lulaschkas.github.io/duco-mining-dashboard/) and troubleshooting helper by Lulaschkas + * [duco-miners](https://github.com/dansinclair25/duco-miners) CLI mining dashboard made by dansinclair25 + * [Duco-Coin Symbol Icon ttf](https://github.com/SandUhrGucker/Duco-Coin-Symbol-Icon-ttf-.h) by SandUhrGucker + * [DUCO Monitor](https://siunus.github.io/duco-monitor/) account statistics website by siunus + * [Duino Stats](https://github.com/Bilaboz/duino-stats) official Discord bot by Bilaboz + * [DuCoWallet](https://github.com/viktor02/DuCoWallet) GUI Wallet by viktor02 + * [Duco-widget-ios](https://github.com/naphob/duco-widget-ios) - a Duino-Coin iOS widget by Naphob + * [Duino Lookup](https://axorax.github.io/duino-lookup/) by axorax + + Voit tarkastella vastaavaa listaa myös Duino-Coinin virallisilla verkkosivuilla. [website](https://duinocoin.com/apps). + + +## License + +Duino-Coin on pääosin jaettu MIT-lisenssillä. Lisätietoja saat tiedostosta `LICENSE`. +Joissakin kolmannen osapuolen tiedostoissa saattaa olla erilaiset lisenssit - tarkista niiden `LICENSE` -lausekkeet (yleensä lähdekooditiedoston alusta). + + +## Käyttöehdot +1. Duino-Coinit ("DUCO:t") ansaitaan louhimalla prosessilla, jota kutsutaan kaivamiseksi.
+2. Louhinta tapahtuu käyttämällä DUCO-S1-algoritmia (kuten selitetty Duino-Coinin Whitepaperissa), jossa oikean vastauksen löytäminen matemaattiseen ongelmaan antaa louhijalle palkkion.
+3. Louhinta voidaan suorittaa virallisesti käyttäen CPU:ita, AVR-kortteja (esim. Arduino-kortteja), yksikorttitietokoneita (esim. Raspberry Pi -kortteja) ja ESP32/8266-kortteja virallisten kaivostyöläisten käyttämisen avulla (muut virallisesti sallitut kaivostyöläiset on kuvattu README:n yläosassa).
+4. Kaikkien kaivostyöläisten on käytettävä heille sopivaa vaikeustasoa. +5. Louhinta GPU:illa, FPGA:illa ja muilla korkean suorituskyvyn laitteilla on sallittua, mutta käyttämällä vain EXTREME-louhintavaikeutta.
+6. Mitkä tahansa käyttäjät, jotka käyttävät kaivostyöläisiä, joille ei ole sopiva vaikeustaso (katso vaikeuslista), rajoitetaan automaattisesti siirtymällä oikealle vaikeustasolle.
+7. Mitkä tahansa käyttäjät, jotka yrittävät käyttää liian alhaista vaikeustasoa kuin heille sopii, saattavat saada tilapäisen eston tai pysyvän porttikiellon.
+8. Porttikiellon yhteydessä käyttäjä estetään pääsemästä käsiksi kolikoihinsa ja hänen tilinsä poistetaan.
+9. Vaihtoon kelpaavat vain laillisesti ansaitut kolikot.
+10. Tilejä voidaan väliaikaisesti keskeyttää tutkimaan ToS-rikkomuksia ("rikkomus" tai "väärinkäyttö").
+11. Vaihtopyynnön tekeminen viralliselle DUCO-vaihdolle ("virallinen vaihto") voi viivästyä ja/tai hylätä tutkimusten aikana.
+12. Viralliselle vaihdolle tehtyjä vaihtopyyntöjä voidaan hylätä ToS-rikkomusten ja/tai vähäisen rahoituksen vuoksi.
+13. Ilmaisilla pilvipalveluilla (tai ilmaisilla VPS-palveluilla, kuten Repl.it, GitHub Actions jne.) louhkiminen ei ole sallittua, koska se on epäreilua muille.
+14. Käyttäjän DUCOja voidaan polttaa, jos rikkomus voidaan todistaa.
+15. Nämä käyttöehdot voivat muuttua milloin tahansa ilman ennakkoilmoitusta.
+16. Useampien käyttäjätilien omistaminen ilman järkevää syytä (esim. mon louhiminen) ei ole sallittua - useita tilejä käytettäessä samalla tietokoneella/verkolla, ellei niille ole myönnetty poikkeusta, tullaan estämään.
+17. Muiden palveluiden tai tuotteiden mainostaminen lähettämällä tapahtumia ei ole sallittua.
+18. Suuri määrä tapahtumia lyhyessä ajassa voi aktivoida Kolka-järjestelmän, joka rajoittaa ja/tai estää käyttäjän.
+19. Yhteisön tekemien ohjelmien on noudatettava sääntöjä (käyttöehdot, vaikeustasot jne.) - järjestelmän väärinkäyttö johtaa ohjelmiston ja/tai käyttäjän estämiseen.
+20. Tilit, joiden nimi tai käyttö on harhaanjohtavaa (henkilöllisyyden varastaminen, tekaistut bottitilit jne.), eivät ole sallittuja..
+21. Loukkaavan tai epäolennaisen todentamiskuvan ja/tai kuvauksen lähettäminen johtaa tilin välittömään estämiseen. +22. Jokaisen Duino-Coin-käyttäjän on noudatettava edellä mainittuja sääntöjä. Epäasianmukainen käyttäytyminen johtaa tilin estämiseen.
+ + +## Tietosuojakäytäntö +1. Pääpalvelimella tallennetaan käyttäjien käyttäjänimet, tiivistetyt salasanat (bcrypt-menetelmällä), tilin luomispäivämäärät, viimeiset kirjautumisajat ja sähköpostiosoitteet.
+2. Sähköpostiosoitteet eivät ole julkisesti saatavilla ja niitä käytetään vain käyttäjän kanssa tarvittaessa kommunikointiin, vahvistamaan vaihtoja DUCO-Exchange -sivustolla ja vastaanottamaan satunnaisia uutiskirjeitä (suunniteltu tulevaisuutta varten).
+3. Saldot, siirrot ja kaivostoimintaan liittyvät tiedot ovat julkisesti saatavilla JSON APIn kautta.
+4. Tietosuojakäytäntöä voidaan muuttaa tulevaisuudessa, mutta käyttäjät saavat ilmoituksen ennen muutoksia. + + +## Aktiiviset projektin ylläpitäjät + +* [@revoxhere](https://github.com/revoxhere/) - robik123.345@gmail.com (Johtava Python-kehittäjä, projektin perustaja) +* [@Bilaboz](https://github.com/bilaboz/) (Johtava NodeJS-kehittäjä) +* [@connorhess](https://github.com/connorhess) (Johtava Python-kehittäjä, Node-S:n omistaja) +* [@JoyBed](https://github.com/JoyBed) (Johtava AVR-kehittäjä) +* [@Yennefer](https://www.instagram.com/vlegle/) (Johtava sosiaalisen median manageri) +* [@Tech1k](https://github.com/Tech1k/) - hello@kristiankramer.net (Johtava Webmaster ja DUCO-kehittäjä) +* [@ygboucherk](https://github.com/ygboucherk) ([wDUCO](https://github.com/ygboucherk/wrapped-duino-coin-v2) kehittäjä) +* [@Lulaschkas](https://github.com/Lulaschkas) (Kehittäjä) +* [@joaquinbvw](https://github.com/joaquinbvw) (AVR kehittäjä) + +Suuret kiitokset kaikille [contributors](https://github.com/revoxhere/duino-coin/graphs/contributors), jotka ovat auttaneet kehittämään Duino-Coin-projektia. + +
+ +Projektin linkki: [https://github.com/revoxhere/duino-coin/](https://github.com/revoxhere/duino-coin/) +
+Verkkosivuston linkki: [https://duinocoin.com/](https://duinocoin.com/) +
+Duino-Coin tilan sivu: [https://status.duinocoin.com](https://status.duinocoin.com) diff --git a/Resources/README_TRANSLATIONS/README_id_ID.md b/Resources/README_TRANSLATIONS/README_id_ID.md index c54f073f..bfe5d02e 100644 --- a/Resources/README_TRANSLATIONS/README_id_ID.md +++ b/Resources/README_TRANSLATIONS/README_id_ID.md @@ -30,6 +30,10 @@ + + + +

@@ -237,7 +241,7 @@ Some third-party included files may have different licenses - please check their * [@Bilaboz](https://github.com/bilaboz/) (Lead NodeJS dev) * [@connorhess](https://github.com/connorhess) (Lead Python dev, Node-S owner) * [@JoyBed](https://github.com/JoyBed) (Lead AVR dev) -* [@Tech1k](https://github.com/Tech1k/) - kristian@beyondcoin.io (Lead Webmaster and DUCO Developer) +* [@Tech1k](https://github.com/Tech1k/) - hello@kristiankramer.net (Lead Webmaster and DUCO Developer) ## * [@Pripun](https://github.com/Pripun) (Mobile apps dev) * [@ygboucherk](https://github.com/ygboucherk) ([wDUCO](https://github.com/ygboucherk/wrapped-duino-coin-v2) dev) @@ -253,4 +257,4 @@ Juga, terima kasih banyak kepada semua [kontributor](https://github.com/revoxher Project Link: [https://github.com/revoxhere/duino-coin/](https://github.com/revoxhere/duino-coin/)
-Website Link: [https://duinocoin.com/](https://duinocoin.com/) \ No newline at end of file +Website Link: [https://duinocoin.com/](https://duinocoin.com/) diff --git a/Resources/README_TRANSLATIONS/README_in_HI.md b/Resources/README_TRANSLATIONS/README_in_HI.md index 192029b7..d6fa7e7b 100644 --- a/Resources/README_TRANSLATIONS/README_in_HI.md +++ b/Resources/README_TRANSLATIONS/README_in_HI.md @@ -41,6 +41,10 @@ + + + + @@ -273,7 +277,7 @@ sudo chmod a+x duco-install-rpi.sh * [@connorhess](https://github.com/connorhess) (लीड पायथन देव, नोड-एस के मालिक) * [@JoyBed](https://github.com/JoyBed) (लीड AVR देव) * [@Yennefer](https://www.instagram.com/vlegle/) (लीड सोशल मैनेजर) -* [@Tech1k](https://github.com/Tech1k/) - kristian@beyondcoin.io (लीड वेबमास्टर और DUCO डेवलपर) +* [@Tech1k](https://github.com/Tech1k/) - hello@kristiankramer.net (लीड वेबमास्टर और DUCO डेवलपर) * [@ygboucherk](https://github.com/ygboucherk) ([wDUCO](https://github.com/ygboucherk/wrapped-duino-coin-v2) देव) * [@Lulaschkas](https://github.com/Lulaschkas) (देव) * [@joaquinbvw](https://github.com/joaquinbvw) (एवीआर देव) @@ -286,4 +290,4 @@ sudo chmod a+x duco-install-rpi.sh
वेबसाइट लिंक: [https://duinocoin.com/](https://duinocoin.com/)
-डुइनो-कॉइन स्थिति पृष्ठ: [https://status.duinocoin.com](https://status.duinocoin.com) \ No newline at end of file +डुइनो-कॉइन स्थिति पृष्ठ: [https://status.duinocoin.com](https://status.duinocoin.com) diff --git a/Resources/README_TRANSLATIONS/README_it_IT.md b/Resources/README_TRANSLATIONS/README_it_IT.md index 9fcaf2c0..fdbc8ef3 100644 --- a/Resources/README_TRANSLATIONS/README_it_IT.md +++ b/Resources/README_TRANSLATIONS/README_it_IT.md @@ -37,6 +37,10 @@ + + + + @@ -251,7 +255,7 @@ I file inclusi di alcune librerie di terze parti potrebbero avere diverse licenz * [@connorhess](https://github.com/connorhess) (Dev Python principale, owner Node-S) * [@JoyBed](https://github.com/JoyBed) (Dev AVR principale) * [@Yennefer](https://www.instagram.com/vlegle/) (Social manager principale) -* [@Tech1k](https://github.com/Tech1k/) - kristian@beyondcoin.io (Webmaster principale e dev DUCO) +* [@Tech1k](https://github.com/Tech1k/) - hello@kristiankramer.net (Webmaster principale e dev DUCO) * [@ygboucherk](https://github.com/ygboucherk) (Dev [wDUCO](https://github.com/ygboucherk/wrapped-duino-coin-v2)) * [@Lulaschkas](https://github.com/Lulaschkas) (Dev) * [@joaquinbvw](https://github.com/joaquinbvw) (Dev AVR) @@ -264,4 +268,4 @@ Link al progetto: [https://github.com/revoxhere/duino-coin/](https://github.com/
Link al sito web: [https://duinocoin.com/](https://duinocoin.com/)
-Link alla Status Page: [https://status.duinocoin.com](https://status.duinocoin.com) \ No newline at end of file +Link alla Status Page: [https://status.duinocoin.com](https://status.duinocoin.com) diff --git a/Resources/README_TRANSLATIONS/README_ja_JP.md b/Resources/README_TRANSLATIONS/README_ja_JP.md new file mode 100644 index 00000000..d8629b73 --- /dev/null +++ b/Resources/README_TRANSLATIONS/README_ja_JP.md @@ -0,0 +1,283 @@ + + + + + + +

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + +
+ +

+ Duino-CoinはArduino、ESP8266/32ボード、Raspberry Pi、コンピュータなど、さまざまなもので採掘できるコインです + (Wi-Fiルーター、スマートテレビ、スマートフォン、スマートウォッチ、SBC、MCU、あるいはGPUを含む) +

+ + +| 主な特徴 | 技術仕様 | (多数の中の一部)対応ボード | +|-|-|-| +| 💻 多くのプラットフォームでサポート
👥 急成長するコミュニティ
💱 簡単な操作と交換
(DUCO Exchange、Node-S、JustSwap、SushiSwap)
🌎 どこでも購入可能
:new: 完全オリジナル&オープンソースプロジェクト
🌳 ビギナーズ&エコ
💰 コストパフォーマンスが高く、マイニングが容易 | ⚒️ アルゴリズム: DUCO-S1
♐ リワード: "Kolkaシステム"でサポート
フェアな報酬を得ることができる
⚡ トランザクション時間: インスタント
🪙 コインの供給: 無限大
(バーン付き)
🔤 ティッカー: DUCO (ᕲ)
🔢 小数点: 最大20 | ♾️ Arduino
(Uno、Nano、Mega、Due、Pro Miniなどなど。)
📶 ESP8266
(NodeMCU、Wemosなどなど。)
📶 ESP32
(ESP-WROOM、ESP32-CAMなどなど。)
🍓 Raspberry Pi
(1, 2, Zero (W/WH), 3, 4, Pico, 400)
🍊 Orange Pi
(Zero、Zero 2、PC、Plusなどなど。)
⚡ Teensy 4.1 boards | + + +## はじめに + +#### Duino-Coinを始める最も簡単な方法は、お使いのOSに対応した[最新版](https://github.com/revoxhere/duino-coin/releases/latest)をダウンロードすることです。
+リリースをダウンロード後、解凍して目的のプログラムを起動してください。
+必要な依存関係はありません。 + +ヘルプが必要な場合は、公式サイトにある公式スタートアップガイドをご覧ください。
+FAQやトラブルシューティングのヘルプは、[Wiki](https://github.com/revoxhere/duino-coin/wiki)で見ることができます。
+ +#### Linux (手動インストール) + +```BASH +sudo apt update +sudo apt install python3 python3-pip git python3-pil python3-pil.imagetk -y # 依存関係のインストール +git clone https://github.com/revoxhere/duino-coin # Duino-Coinリポジトリのクローン +cd duino-coin +python3 -m pip install -r requirements.txt # pipの依存関係のインストール +``` + +この後、ソフトウェアの起動(例:`python3 PC_Miner.py`)でOKです。 + +#### Windows(手動インストール) + +1. [Python 3](https://www.python.org/downloads/)をダウンロードし、インストールします(PythonとPipをPATHに追加してください)。 +2. [Duino-Coinリポジトリ](https://github.com/revoxhere/duino-coin/archive/master.zip)のダウンロード +3. ダウンロードしたzipアーカイブを解凍し、そのフォルダをコマンドプロンプトで開く +4. コマンドプロンプトで、`py -m pip install -r requirements.txt`と入力し、必要なpipの依存関係をインストールします + +この後、ソフトウエアを起動してください(目的の`.py`ファイルをダブルクリックするか、コマンドプロンプトで`py PC_Miner.py`と入力するだけです)。 + +#### Raspberry Pi (自動インストール) + +```BASH +wget https://raw.githubusercontent.com/revoxhere/duino-coin/master/Tools/duco-install-rpi.sh +sudo chmod a+x duco-install-rpi.sh +./duco-install-rpi.sh +``` + +## DUCO, wDUCO, bscDUCO, maticDUCO & celoDUCO + +Duino-Coinは、中央集権的な資金貯蔵方法と分散的な資金貯蔵方法の両方をサポートするハイブリッド通貨です。Duino-Coinは、同じDuino-Coinでありながら、他のネットワーク上でトークンとして「ラップ」(保存)されたwDUCOやbscDUCOなどに変換することが可能です。wDUCOの使い方のチュートリアル例は、[wDUCO wiki](https://github.com/revoxhere/duino-coin/wiki/wDUCO-tutorial)にあります。コインの包装は、Webウォレットから直接行うことができます。「Wrap Coins」ボタンをクリックして開始してください。 + +## 開発 + +オープンソースコミュニティが、学び、刺激し、創造するための素晴らしい場所であるのは、コントリビュートのおかげです。
+Duino-Coinへのコントリビュートは大いに歓迎されます。 + +どうすればいい? + +* プロジェクトをフォークする +* あなたの機能ブランチを作成する +* 変更をコミットする +* すべてが意図したとおりに動作することを確認する +* プルリクエストを出す + +サーバーのソースコード、APIコールのドキュメント、Duino-Coin用の独自アプリを開発するための公式ライブラリは、[useful tools](https://github.com/revoxhere/duino-coin/tree/useful-tools)ブランチで公開しています。 + + +## 公式にテストされたデバイスとボードのベンチマーク + +### 報酬は多くの要因に左右されるため、以下の表はあくまでオリエンテーションのためのものであることにご留意ください。 + + | デバイス/CPU/SBC/MCU/chip | 平均ハッシュレート
(全スレッド) | マイニング
スレッド | 電源
使用量 | 平均
DUCO/日 | + |-----------------------------------------------------------|-----------------------------------|-------------------|----------------|---------------------| + | Arduino Pro Mini, Uno, Nano etc.
(Atmega 328p/pb/16u2) | 258 H/s | 1 | 0.2 W | 15-20 | + | Raspberry Pi Pico | 5 kH/s | 1 | 0.3 W | 10 | + | Teensy 4.1 (soft cryptography) | 80 kH/s | 1 | 0.5 W | ? | + | NodeMCU, Wemos D1 etc.
(ESP8266) | 9-10 kH/s (160MHz) 5 kH/s (80Mhz) | 1 | 0.6 W | 3-6 | + | ESP32 | 40-42 kH/s | 2 | 1 W | 6-9 | + | Raspberry Pi Zero | 18 kH/s | 1 | 1.1 W | ? | + | Raspberry Pi 3 **(32bit)** | 440 kH/s | 4 | 5.1 W | 4-5 | + | Raspberry Pi 4 **(32bit)** | 740 kH/s | 4 | 6.4 W | ? | + | Raspberry Pi 4 **(64bit, fasthash)** | 6.8 MH/s | 4 | 6.4 W | 5 | + | ODROID XU4 | 1.0 MH/s | 8 | 5 W | 6 | + | Atomic Pi | 690 kH/s | 4 | 6 W | ? | + | Orange Pi Zero 2 | 740 kH/s | 4 | 2.55 W | ? | + | Khadas Vim 2 Pro | 1.12 MH/s | 8 | 6.2 W | ? | + | Libre Computers Tritium H5CC | 480 kH/s | 4 | 5 W | ? | + | Libre Computers Le Potato | 410 kH/s | 4 | 5 W | ? | + | Pine64 ROCK64 | 640 kH/s | 4 | 5 W | ? | + | Intel Celeron G1840 | 1.25 MH/s | 2 | 53 W | 3.3 | + | Intel Core i5-2430M | 1.18 MH/s | 4 | 35 W | 6.5 | + | Intel Core i5-3230M | 1.52 MH/s | 4 | 35 W | 7.2 | + | Intel Core i5-5350U | 1.35 MH/s | 4 | 15 W | 6.0 | + | Intel Core i5-7200U | 1.62 MH/s | 4 | 15 W | 7.5 | + | Intel Core i5-8300H | 3.67 MH/s | 8 | 45 W | 9.1 | + | Intel Core i3-4130 | 1.45 MH/s | 4 | 54 W | 3.7 | + | AMD Ryzen 5 2600 | 4.9 MH/s | 12 | 65 W | 15.44 | + | AMD Ryzen R1505G **(fasthash)** | 8.5 MH/s | 4 | 35 W | - | + | Intel Core i7-11370H **(fasthash)** | 17.3 MH/s | 8 | 35 W | 4.28 | + | Realtek RTD1295 | 490 kH/s | 4 | - | - | + | Realtek RTD1295 **(fasthash)** | 3.89 MH/s | 4 | - | - | + +特に断りのない限り、すべてのテストはDUCO-S1アルゴリズムで実施されました**フラッシュ加速なし**。この表は積極的に更新していく予定です。 + + + +## コミュニティが作ったソフトウエア + +### これらのソフトウェアは弊社が開発したものではなく、これらのソフトウェアを使用した結果、アカウントが使用禁止にならないことを保証するものではありませんのでご注意ください。あくまで好奇心でご利用ください。 + + ### Duino-Coinと連携していることが知られている他のマイナー: + * :point_right: [**RP2040-HAT-MINING-C**](https://github.com/Wiznet/RP2040-HAT-MINING-C) - **WIZnet RP2040** mining stack + * [DuinoCoinEthernetMiner](https://github.com/Pumafron/DuinoCoinEthernetMiner) - Arduino Ethernet shield Miner by Pumafron + * [STM8 DUCO Miner](https://github.com/BBS215/STM8_DUCO_miner) - STM8S firmware for mining DUCO by BBS215 + * [DuinoCoinbyLabVIEW](https://github.com/ericddm/DuinoCoinbyLabVIEW) - miner for LabVIEW family by ericddm + * [Duino-JS](https://github.com/Hoiboy19/Duino-JS) - a JavaScript miner which you can easily implement in your site by Hoiboy19 + * [Duinotize](https://github.com/mobilegmYT/Duinotize) - Duino website monetizer by mobilegmYT + * [hauchel's duco-related stuff repository](https://github.com/hauchel/duco/) - Collection of various codes for mining DUCO on other microcontrollers + * [duino-coin-php-miner](https://github.com/ricardofiorani/duino-coin-php-miner) Dockerized Miner in PHP by ricardofiorani + * [duino-coin-kodi](https://github.com/SandUhrGucker/duino-coin-kodi) - Mining addon for Kodi Media Center by SandUhrGucker + * [MineCryptoOnWifiRouter](https://github.com/BastelPichi/MineCryptoOnWifiRouter) - Python script to mine Duino-Coin on routers by BastelPichi + * [Duino-Coin_Android_Cluster Miner](https://github.com/DoctorEenot/DuinoCoin_android_cluster) - mine with less connections on multiple devices by DoctorEenot + * [ESPython DUCO Miner](https://github.com/fabiopolancoe/ESPython-DUCO-Miner) - MicroPython miner for ESP boards by fabiopolancoe + * [DUCO Miner for Nintendo 3DS](https://github.com/BunkerInnovations/duco-3ds) - Python miner for Nintendo 3DS by PhereloHD & HGEpro + * [Dockerized DUCO Miner](https://github.com/Alicia426/Dockerized_DUCO_Miner_minimal) - Miner in Docker by Alicia426 + * [NodeJS-DuinoCoin-Miner](https://github.com/LDarki/NodeJS-DuinoCoin-Miner/) - simple NodeJS miner by LDarki + * [d-cpuminer](https://github.com/phantom32-0/d-cpuminer) - pure C miner by phantom32 & revoxhere + * [Go Miner](https://github.com/yippiez/go-miner) by yippiez + * [ducominer](https://github.com/its5Q/ducominer) by its5Q + * [Unofficial miners directory](https://github.com/revoxhere/duino-coin/tree/master/Unofficial%20miners) + * [Julia Miner](https://github.com/revoxhere/duino-coin/blob/master/Unofficial%20miners/Julia_Miner.jl) by revoxhere + * [Ruby Miner](https://github.com/revoxhere/duino-coin/blob/master/Unofficial%20miners/Ruby_Miner.rb) by revoxhere + * [Minimal Python Miner (DUCO-S1)](https://github.com/revoxhere/duino-coin/blob/master/Unofficial%20miners/Minimal_PC_Miner.py) by revoxhere + * [Teensy 4.1 code for Arduino IDE](https://github.com/revoxhere/duino-coin/blob/master/Unofficial%20miners/Teensy_code/Teensy_code.ino) by joaquinbvw + + ### その他ツール: + * [Duino Miner](https://github.com/g7ltt/Duino-Miner) - Arduino Nano based DUCO miner files and documentation by g7ltt + * [DUINO Mining Rig](https://repalmakershop.com/pages/duino-mining-rig) - 3D files, PCB designs and instructions for creating your own Duino rig by ReP_AL + * [DuinoCoin-balance-Home-Assistant](https://github.com/NL647/DuinoCoin-balance-Home-Assistant) - addon for home assistant displaying your balance by NL647 + * [Duino Coin Status Monitor](https://github.com/TSltd/duino_coin) for 128x64 SSD1306 OLED and ESP8266 by TSltd + * [ducopanel](https://github.com/ponsato/ducopanel) - a GUI app for controling your Duino-Coin miners by ponsato + * [Duino AVR Monitor](https://www.microsoft.com/store/apps/9NJ7HPFSR9V5) - GUI Windows App for monitoring AVR devices mining DUCO by niknak + * [Duino-Coin Arduino library](https://github.com/ricaun/arduino-DuinoCoin) by ricaun + * [DuinoCoinI2C](https://github.com/ricaun/DuinoCoinI2C) - Use ESP8266/ESP32 as a master for Arduinos by ricaun + * [Duino-Coin Mining Dashboard](https://lulaschkas.github.io/duco-mining-dashboard/) and troubleshooting helper by Lulaschkas + * [duco-miners](https://github.com/dansinclair25/duco-miners) CLI mining dashboard made by dansinclair25 + * [Duco-Coin Symbol Icon ttf](https://github.com/SandUhrGucker/Duco-Coin-Symbol-Icon-ttf-.h) by SandUhrGucker + * [DUCO Monitor](https://siunus.github.io/duco-monitor/) account statistics website by siunus + * [duino-tools](https://github.com/kyngs/duino-tools) written in Java by kyngs + * [Duino Stats](https://github.com/Bilaboz/duino-stats) official Discord bot by Bilaboz + * [DuCoWallet](https://github.com/viktor02/DuCoWallet) viktor02によるGUIウォレット + * [Duco-widget-ios](https://github.com/naphob/duco-widget-ios) - NaphobによるDuino-Coin iOSウィジェット + + また、同様のリストを[Webサイト](https://duinocoin.com/apps)でご覧いただくことも可能です。 + + +## ライセンス + +Duino-CoinはほとんどMITライセンスの下で配布されています。詳細は`LICENSE`ファイルを参照してください。 +サードパーティ製のインクルードファイルには、異なるライセンスが設定されている場合があります - それらの`LICENSE`ステートメントを確認してください(通常、ソースコードファイルの先頭にあります)。 + + +## 利用規約 +1. Duino-Coins("DUCOs")は、マイナーがマイニングと呼ばれる作業によって獲得する。
+2. 採掘にはDUCO-S1アルゴリズム(Duino-Coin Whitepaperで説明されている)が使用されており、数学的問題に対して正しい結果を見つけると採掘者に報酬が与えられると説明されています。
+3. マイニングは、CPU、AVRボード(Arduinoボードなど)、シングルボードコンピュータ(Raspberry Piボードなど)、ESP32/8266ボードを使って、公式マイナーを使用することで公式に行うことができます(その他の公式に許可されているマイナーはREADMEの上部に記載されています)。
+4. すべてのマイナーは、自分に適した難易度階層を作る必要があります。 +5. GPU、FPGA、その他の高効率ハードウェアでのマイニングは許可されていますが、マイニング難易度「EXTREME」のみを使用します。
+6. ハードウェアに合わない難易度でマイニングマシンを使用しているユーザー(難易度リストを参照)は、正しい難易度階層に移動させられることによって自動的にスロットルされます。
+7. 難易度の低いゲームに挑戦し続けるユーザーは、一時的にブロックされるか、永久に追放される可能性があります。
+8. 禁止には、アカウントの削除とともに、ユーザーがコインにアクセスできないようにすることが含まれます。
+9. 交換の対象となるのは、合法的に獲得したコインのみです。
+10. ToS違反(「違反」または「乱用」)の調査(「調査」)のために、アカウントが一時的に停止されることがあります。
+11. DUCO-Exchange(以下、「公式交換所」)への交換依頼は、調査中に遅延または拒否されることがあります。
+12. 公式の取引所への交換依頼は、ToS違反や低資金などの理由により、お断りする場合があります。
+13. 無料のクラウドホスティングサービス(または無料のVPSサービス - Repl.it, GitHub Actionsなど)を使ったマイニングは、他の人にとって不公平になるため、許可されていません。
+14. 違反が証明された場合、ユーザーのDUCOはバーンされることがあります。
+15. この利用規約は、事前の予告なく変更されることがあります。
+16. 合理的な理由なく複数のアカウントを持つことは禁止されています(例:マルチマイニングのため)。
+17. 他のサービスを宣伝したり、何かを広告するような取引を送ることは、いかなる形であれ禁止されています。
+18. 短時間に大量のトランザクションを送信すると、Kolkaシステムがユーザーをレート制限および/またはブロックすることがあります。
+19. コミュニティで作られたソフトウェアは、ルール(利用規約、難易度など)を遵守する必要があります。システムを悪用すると、ソフトウェアやユーザがブロックされます。
+20. 名前や使用方法が誤解を招くと証明されたアカウント(なりすまし、偽のボットなど)は使用できません。
+21. 認証に不適切な画像や説明文を送信した場合、そのアカウントは直ちにブロックされます。 +22. Duino-Coinユーザーは、上記のルールを遵守することに同意するものとします。不適切な行為を行った場合、アカウントをブロックすることがあります。
+ + +## プライバシーポリシー +1. マスターサーバーには、ユーザー名、ハッシュ化されたパスワード(bcryptを使用)、アカウント作成日、最終ログイン時間、ユーザーのEメールのみをデータとして保存しています。
+2. 電子メールは一般に公開されず、必要な場合のユーザーへの連絡、DUCO-Exchangeでの交換の確認、および不定期のニュースレターの受信(将来的に予定)にのみ使用されます。
+3. 残高、取引、マイニング関連データは、JSON APIで公開されています。
+4. 本プライバシーポリシーは、将来変更される可能性がありますが、変更前にお客様に通知します。 + + +## アクティブなプロジェクトメンテナー + +* [@revoxhere](https://github.com/revoxhere/) - robik123.345@gmail.com (リードPython開発者、プロジェクト創設者) +* [@Bilaboz](https://github.com/bilaboz/) (NodeJSのリード開発者) +* [@connorhess](https://github.com/connorhess) (リードPython開発者、Node-Sオーナー) +* [@JoyBed](https://github.com/JoyBed) (リードAVR開発) +* [@Yennefer](https://www.instagram.com/vlegle/) (リードソーシャルマネージャー) +* [@Tech1k](https://github.com/Tech1k/) - hello@kristiankramer.net (リードウェブマスター兼DUCOデベロッパー) +* [@ygboucherk](https://github.com/ygboucherk) ([wDUCO](https://github.com/ygboucherk/wrapped-duino-coin-v2) 開発者) +* [@Lulaschkas](https://github.com/Lulaschkas) (開発者) +* [@joaquinbvw](https://github.com/joaquinbvw) (AVR開発者) + +Duino-Coinの発展にご協力いただいたすべての[コントリビューター](https://github.com/revoxhere/duino-coin/graphs/contributors)に大感謝です。 + +
+ +プロジェクトリンク: [https://github.com/revoxhere/duino-coin/](https://github.com/revoxhere/duino-coin/) +
+Webサイトリンク: [https://duinocoin.com/](https://duinocoin.com/) +
+Duino-Coinステータスページ: [https://status.duinocoin.com](https://status.duinocoin.com) diff --git a/Resources/README_TRANSLATIONS/README_kr_KR.md b/Resources/README_TRANSLATIONS/README_kr_KR.md index e1da559f..df6d7b3a 100644 --- a/Resources/README_TRANSLATIONS/README_kr_KR.md +++ b/Resources/README_TRANSLATIONS/README_kr_KR.md @@ -29,6 +29,10 @@ + + + +
@@ -45,23 +49,24 @@
-# Duino 코인 한글 번역 +# Duino 코인 한글 번역본

-Duino-Coin은 Arduinos, ESP8266/32 보드, 라즈베리 파이, 컴퓨터 등으로 채굴할 수 있는 코인입니다(Wi-Fi 라우터, 스마트 TV, 스마트폰, 스마트워치, SBC, MCU 또는 GPU 포함). +Duino-Coin은 Arduinos, ESP8266/32 보드, 라즈베리 파이, 컴퓨터 등으로 채굴할 수 있는 코인입니다 (Wi-Fi 라우터, 스마트 TV, 스마트폰, 스마트워치, SBC, MCU 또는 GPU 포함).

-| 주요 특징 | 기술 사양 | 지원가능한 보드 | +| 주요 특징 | 사용된 기술 | 지원되는 보드 | |-|-|-| -| 💻 다수의 플랫폼에 지원
👥 빠르게 성장하는 커뮤니티
💱 용이한 사용 및 교환
(DUCO Exchange, Node-S, JustSwap, SushiSwap에서)
🌎 어디서든지 사용 가능
:new: 완전히 독창적인 오픈 소스 프로젝트
🌳 초보자 친화적 및 친환경적
💰 효율적인 비용과 쉬운 채굴 | ⚒️ 알고리즘: DUCO-S1, XXHASH, 이외
추가 예정 (PoS 포함)
♐ 보상: 채굴자에게 공정한 보상을 제공하는
"Kolka" 시스템
⚡ 거래 시간: 즉시
🪙 코인 공급량: 무제한
(2020년 12월 이전: 350k 코인)
(향후 새로운 한도 계획 예정)
🔤 시세: DUCO (ᕲ)
🔢 소수점: 최대 20 | ♾️ Arduinos
(Uno, Nano, Mega, Due, Pro Mini 등)
📶 ESP8266s
(NodeMCU, Wemos 등)
📶 ESP32s
(ESP-WROOM, ESP32-CAM 등)
🍓 라즈베리파이
(1, 2, Zero (W/WH), 3, 4, Pico, 400)
🍊 오렌지 파이
(Zero, Zero 2, PC, Plus 등)
⚡ Teensy 4.1 보드 | +| 💻 다양한 플랫폼 지원
👥 빠르게 성장하는 커뮤니티
💱 쉬운 사용 및 교환
(DUCO Exchange, Node-S, JustSwap, SushiSwap에서)
🌎 어디서든지 사용 가능
:new: 완전히 독창적인 오픈 소스 프로젝트
🌳 초보자 친화적 및 친환경적
💰 효율적인 비용과 쉬운 채굴 | ⚒️ 알고리즘: DUCO-S1, XXHASH, 이외
추가 예정 (PoS 포함)
♐ 보상: 채굴자에게 공정한 보상을 제공하는
"Kolka" 시스템
⚡ 거래 시간: 즉시
🪙 코인 공급량: 무제한
(2020년 12월 이전: 350k 코인)
(향후 새로운 한도 계획 예정)
🔤 시세: DUCO (ᕲ)
🔢 소수점: 최대 20 | ♾️ Arduinos
(Uno, Nano, Mega, Due, Pro Mini 등)
📶 ESP8266s
(NodeMCU, Wemos 등)
📶 ESP32s
(ESP-WROOM, ESP32-CAM 등)
🍓 라즈베리파이
(1, 2, Zero (W/WH), 3, 4, Pico, 400)
🍊 오렌지 파이
(Zero, Zero 2, PC, Plus 등)
⚡ Teensy 4.1 보드 | ## 시작하기 #### Duino-Coin을 시작하는 가장 쉬운 방법은 OS에 대한 [최신 릴리스](https://github.com/revoxhere/duino-coin/releases/latest)를 다운로드하는 것 입니다.
-릴리스를 다운로드한 후 압축을 풀고 원하는 프로그램을 실행합니다.
-이 과정에서는 dependency가 요구되지 않습니다. +운영체제(윈도우 혹은 리눅스 등)에 맞는 릴리스를 다운로드한 후 압축을 풀고 원하는 프로그램을 실행합니다.
+이 과정에서는 추가로 다른 프로그램을 설치할 필요가 없습니다. + 도움이 필요하면 공식 웹사이트에 있는 공식 시작 가이드를 참조하세요.
FAQ 및 문제 해결 도움말은 [Wikis](https://github.com/revoxhere/duino-coin/wiki)에서 찾을 수 있습니다.
@@ -221,14 +226,14 @@ Duino-Coin은 대부분 MIT 라이센스에 따라 배포됩니다. 자세한 12. 무료 클라우드 호스팅 서비스(또는 무료 VPS 서비스 - 예: Repl.it, GitHub Actions 등)로 채굴하는 것은 불공정하므로 허용되지 않습니다.
13. 위반 사항이 입증될 경우 사용자의 DUCO가 소멸될 수 있습니다.
14. 이 서비스 약관은 사전 통지 없이 언제든지 변경될 수 있습니다.
-15. 합리적인 이유(예: 다중 채굴) 없이 부계정을 갖는 것은 허용되지 않습니다.
+15. 여러 계정으로 코인을 채굴하는 것 등의 합리적이지 않은 이유로 부계정을 갖는 것은 허용되지 않습니다.
16. Duino-Coin을 사용하는 모든 사용자는 위의 규칙을 준수하는 데 동의합니다.
## 개인 정보 정책 1. master 서버에는 사용자의 이름, 해시된 비밀번호(bcrypt를 이용), 계정 생성 날짜 및 사용자의 이메일만 데이터로 저장됩니다.
2. 이메일은 공개적으로 사용할 수 없으며, DUCO-Exchange 에서 교환을 확인하고 비정기적인 뉴스레터(향후 계획)를 수신하는 등 필요시 사용자에게 연락할 때만 사용됩니다.
-3. 잔액, 거래 및 마이닝 관련 데이터는 JSON APIs 에서 공개적으로 사용할 수 있습니다.
+3. 잔액, 거래 및 채굴 관련 데이터는 JSON APIs 에서 공개적으로 사용할 수 있습니다.
4. 개인 정보 정책은 추후 사전 공지를 통해 변경될 수 있습니다. ## 주요 프로젝트 관리자 @@ -238,13 +243,13 @@ Duino-Coin은 대부분 MIT 라이센스에 따라 배포됩니다. 자세한 * [@connorhess](https://github.com/connorhess) (Python 리드 개발자, Node-S 소유자) * [@JoyBed](https://github.com/JoyBed) (AVR 리드 개발자) * [@Yennefer](https://www.instagram.com/vlegle/) (소셜 관리자) -* [@Tech1k](https://github.com/Tech1k/) - kristian@beyondcoin.io (리드 Webmaster 및 DUCO 개발자) +* [@Tech1k](https://github.com/Tech1k/) - hello@kristiankramer.net (리드 Webmaster 및 DUCO 개발자) * [@ygboucherk](https://github.com/ygboucherk) ([wDUCO](https://github.com/ygboucherk/wrapped-duino-coin-v2) 개발자) * [@Lulaschkas](https://github.com/Lulaschkas) (개발자) * [@joaquinbvw](https://github.com/joaquinbvw) (AVR 개발자) -Duino-Coin 프로젝트 개발에 도움을 준 모든 [contributors](https://github.com/revoxhere/duino-coin/graphs/contributors) 에게 크나큰 감사를 드립니다. +Duino-Coin 프로젝트 개발에 도움을 주신 모든 [contributors](https://github.com/revoxhere/duino-coin/graphs/contributors) 에게 크나큰 감사를 드립니다.
diff --git a/Resources/README_TRANSLATIONS/README_pl_PL.md b/Resources/README_TRANSLATIONS/README_pl_PL.md index 3bdf64e9..4b25a85b 100644 --- a/Resources/README_TRANSLATIONS/README_pl_PL.md +++ b/Resources/README_TRANSLATIONS/README_pl_PL.md @@ -226,7 +226,7 @@ Niektóre pliki niepochodzące od nas mogą mieć inne licencje - sprawdź ich k * [@LDarki](https://github.com/LDarki) (web deweloper) * [@travelmode](https://github.com/colonelwatch) (deweloper) * [@ygboucherk](https://github.com/ygboucherk) (deweloper [wDUCO](https://github.com/ygboucherk/wrapped-duino-coin-v2)) - * [@Tech1k](https://github.com/Tech1k/) - kristian@beyondcoin.io (Lead Webmaster and DUCO Developer) + * [@Tech1k](https://github.com/Tech1k/) - hello@kristiankramer.net (Lead Webmaster and DUCO Developer) * **Współautorzy:** * [@5Q](https://github.com/its5Q) diff --git a/Resources/README_TRANSLATIONS/README_pt_BR.md b/Resources/README_TRANSLATIONS/README_pt_BR.md index 11c3ed5d..5243029d 100644 --- a/Resources/README_TRANSLATIONS/README_pt_BR.md +++ b/Resources/README_TRANSLATIONS/README_pt_BR.md @@ -25,6 +25,10 @@ + + + + @@ -228,7 +232,7 @@ Alguns arquivos incluídos de terceiros podem ter licenças diferentes - por fav * [@Bilaboz](https://github.com/bilaboz/) (Lead NodeJS dev) * [@connorhess](https://github.com/connorhess) (Lead Python dev, Node-S owner) * [@JoyBed](https://github.com/JoyBed) (Lead AVR dev) -* [@Tech1k](https://github.com/Tech1k/) - kristian@beyondcoin.io (Lead Webmaster and DUCO Developer) +* [@Tech1k](https://github.com/Tech1k/) - hello@kristiankramer.net (Lead Webmaster and DUCO Developer) * [@ygboucherk](https://github.com/ygboucherk) ([wDUCO](https://github.com/ygboucherk/wrapped-duino-coin-v2) dev) * [@Lulaschkas](https://github.com/Lulaschkas) (Dev) * [@joaquinbvw](https://github.com/joaquinbvw) (AVR dev) diff --git a/Resources/README_TRANSLATIONS/README_ru_RU.md b/Resources/README_TRANSLATIONS/README_ru_RU.md index 79256448..00273c7d 100644 --- a/Resources/README_TRANSLATIONS/README_ru_RU.md +++ b/Resources/README_TRANSLATIONS/README_ru_RU.md @@ -20,6 +20,9 @@ + + +
@@ -219,7 +222,7 @@ Duino-Coin в основном распространяется по лицен * [@LDarki](https://github.com/LDarki) (Ведущий веб-разработчик) * [@travelmode](https://github.com/colonelwatch) (Разработчик) * [@ygboucherk](https://github.com/ygboucherk) ([wDUCO](https://github.com/ygboucherk/wrapped-duino-coin-v2) Разработчик) - * [@Tech1k](https://github.com/Tech1k/) - kristian@beyondcoin.io (Ведущий веб-мастер и DUCO Разработчик) + * [@Tech1k](https://github.com/Tech1k/) - hello@kristiankramer.net (Ведущий веб-мастер и DUCO Разработчик) * **Помощники:** * [@5Q](https://github.com/its5Q) diff --git a/Resources/README_TRANSLATIONS/README_sk_SK.md b/Resources/README_TRANSLATIONS/README_sk_SK.md index b95aefc2..c967d429 100644 --- a/Resources/README_TRANSLATIONS/README_sk_SK.md +++ b/Resources/README_TRANSLATIONS/README_sk_SK.md @@ -36,6 +36,10 @@ + + + + @@ -247,7 +251,7 @@ Niektoré zahrnuté súbory tretích strán môžu mať odlišné licencie – s * [@connorhess](https://github.com/connorhess) (Vedúci vývojár Pythonu, vlastník Node-S) * [@JoyBed](https://github.com/JoyBed) (Vedúci vývojár AVR) * [@Yennefer](https://www.instagram.com/vlegle/) (Vedúca sociálna manažérka) -* [@Tech1k](https://github.com/Tech1k/) - kristian@beyondcoin.io (Vedúci webmaster a vývojár DUCO) +* [@Tech1k](https://github.com/Tech1k/) - hello@kristiankramer.net (Vedúci webmaster a vývojár DUCO) * [@ygboucherk](https://github.com/ygboucherk) ([wDUCO](https://github.com/ygboucherk/wrapped-duino-coin-v2) vývojár) * [@Lulaschkas](https://github.com/Lulaschkas) (vývojár) * [@joaquinbvw](https://github.com/joaquinbvw) (AVR vývojár) diff --git a/Resources/README_TRANSLATIONS/README_th_TH.md b/Resources/README_TRANSLATIONS/README_th_TH.md index 4f851e2d..9dde7ede 100644 --- a/Resources/README_TRANSLATIONS/README_th_TH.md +++ b/Resources/README_TRANSLATIONS/README_th_TH.md @@ -28,6 +28,10 @@ + + + + @@ -223,11 +227,10 @@ Duino-Coin ส่วนใหญ่ถูกเผยแพร่ภายใต * [@connorhess](https://github.com/connorhess) (หัวน้านักพัฒนาไพธอน, เจ้าของ Node-S) * [@JoyBed](https://github.com/JoyBed) (หัวน้านักพัฒนา AVR) <<<<<<< HEAD -* [@Tech1k](https://github.com/Tech1k/) - kristian@beyondcoin.io (หัวหน้าเว็บมาสเตอร์ และนักพัฒนา DUCO) +* [@Tech1k](https://github.com/Tech1k/) - hello@kristiankramer.net (หัวหน้าเว็บมาสเตอร์ และนักพัฒนา DUCO) ## * [@Pripun](https://github.com/Pripun) (นักพัฒนาแอพมือถือ) ======= -* [@Tech1k](https://github.com/Tech1k/) - kristian@beyondcoin.io (เว็บมาสเตอร์) ## * [@ygboucherk](https://github.com/ygboucherk) ([wDUCO](https://github.com/ygboucherk/wrapped-duino-coin-v2) นักพัฒนา) diff --git a/Resources/README_TRANSLATIONS/README_tr_TR.md b/Resources/README_TRANSLATIONS/README_tr_TR.md index 7777b7ef..4667e743 100644 --- a/Resources/README_TRANSLATIONS/README_tr_TR.md +++ b/Resources/README_TRANSLATIONS/README_tr_TR.md @@ -14,6 +14,8 @@
+ + @@ -212,7 +214,7 @@ Bazı üçüncü-parti dosyalar farklı lisanslar kullanıyor olabilir - lütfen * [@Bilaboz](https://github.com/bilaboz/) (Ana NodeJS geliştiricisi) * [@connorhess](https://github.com/connorhess) (Ana Python geliştiricisi, Node-S sahibi) * [@JoyBed](https://github.com/JoyBed) (Ana AVR geliştiricisi) -* [@Tech1k](https://github.com/Tech1k/) - kristian@beyondcoin.io (Lead Webmaster and DUCO Developer) +* [@Tech1k](https://github.com/Tech1k/) - hello@kristiankramer.net (Lead Webmaster and DUCO Developer) ## * [@ygboucherk](https://github.com/ygboucherk) ([wDUCO](https://github.com/ygboucherk/wrapped-duino-coin-v2) geliştiricisi) * [@DoctorEenot](https://github.com/DoctorEenot) (Geliştirici) diff --git a/Resources/README_TRANSLATIONS/README_zh_CN.md b/Resources/README_TRANSLATIONS/README_zh_TW.md similarity index 61% rename from Resources/README_TRANSLATIONS/README_zh_CN.md rename to Resources/README_TRANSLATIONS/README_zh_TW.md index 9498d060..e5b235b1 100644 --- a/Resources/README_TRANSLATIONS/README_zh_CN.md +++ b/Resources/README_TRANSLATIONS/README_zh_TW.md @@ -16,6 +16,8 @@ + + @@ -32,6 +34,10 @@ + + + + @@ -48,27 +54,27 @@

- Duino-Coin 是一种可以使用 Arduinos、ESP8266/32 开发板、Raspberry Pi、计算机等进行挖掘的硬币 - (包括 Wi-Fi 路由器、智能电视、智能手机、智能手表、SBC、MCU 甚至 GPU) + Duino-Coin 是一種可以使用 Arduinos、ESP8266/32 開發板、Raspberry Pi、電腦等進行挖掘的虛擬貨幣硬幣 + (包括 Wi-Fi 路由器、智慧型電視、智慧型手機、智慧型手錶、SBC、MCU 甚至 GPU)。

-| 主要特点 | 技术规格 | 支持(超级多) 单板计算机 | +| 主要特色 | 技術規格 | 支援(超級多) 單板微電腦 | |-|-|-| -| 💻 得到大量平台的支持
👥 快速增长的社区
💱 易于使用和交换
(在 DUCO Exchange、Node-S、JustSwap 上)
🌎 随处可用
:创新:完全原创和开源项目
🌳 对初学者和环保主义者友好
💰 经济高效且易于开采 | ⚒️ 算法: DUCO-S1, XXHASH,
更多计划(包括PoS)
♐ 奖励:“Kolka系统”支持
帮助公平奖励矿工
⚡ 交易时间:即时
🪙 硬币供应:无限
(2020 年 12 月之前:350k Duco币)
(未来有新的限制计划)
🔤 代码: DUCO (ᕲ)
🔢 小数:最多 20 | ♾️ Arduinos
(Uno, Nano, Mega, Due, Pro Mini, 等等.)
📶 ESP8266s
(NodeMCU, Wemos, 等等.)
📶 ESP32s
(ESP-WROOM, ESP32-CAM, 等等.)
🍓 Raspberry Pis
(1, 2, Zero (W/WH), 3, 4, Pico, 400)
🍊 Orange Pis
(Zero, Zero 2, PC, Plus, 等等.)
⚡ Teensy 4.1 boards | +| 💻 得到大量平台的支援
👥 快速成長的社群
💱 簡單使用和交換
(在 DUCO Exchange、Node-S、JustSwap 上)
🌎 隨處可用
:創新:完全原創及開源
🌳 對初學者及環境友好
💰 經濟效益高容易開採 | ⚒️ 演算法: DUCO-S1, XXHASH,
更多計畫(包括PoS)
♐ 獎勵:“Kolka系統”支援
幫助公平獎勵礦工
⚡ 交易時間:即時
🪙 硬幣供應:無限
(2020 年 12 月之前:350k Duco幣)
(未來有新的限制計畫)
🔤 代碼: DUCO (ᕲ)
🔢 小數:最多 20 | ♾️ Arduinos
(Uno, Nano, Mega, Due, Pro Mini, 等等.)
📶 ESP8266s
(NodeMCU, Wemos, 等等.)
📶 ESP32s
(ESP-WROOM, ESP32-CAM, 等等.)
🍓 Raspberry Pis
(1, 2, Zero (W/WH), 3, 4, Pico, 400)
🍊 Orange Pis
(Zero, Zero 2, PC, Plus, 等等.)
⚡ Teensy 4.1 boards | -## 入门 +## 入門 -#### 开始使用 Duino-Coin 的最简单方法是为您的操作系统下载 [最新版发行包](https://github.com/revoxhere/duino-coin/releases/latest) .
-下载发行版后,解压缩并启动所需的程序。
-不需要依赖项。 +#### 開始使用 Duino-Coin 的最簡單方法是為您的作業系統下載 [最新版軟體](https://github.com/revoxhere/duino-coin/releases/latest) .
+下載發行版軟體後,解壓縮並啟動所需的步驟。
+不需要依賴程式。 -如果需要帮助,可以查看 官方入门指南.
-常见问题解答和故障排除帮助可以在 [Wikis](https://github.com/revoxhere/duino-coin/wiki)中找到.
+如果需要協助,可以查看 官方入門指南.
+常見問題解答及排除故障可以在 [Wikis](https://github.com/revoxhere/duino-coin/wiki)中找到.
-### 手动安装 +### 手動安裝 #### Linux @@ -85,18 +91,18 @@ After doing this, you are good to go with launching the software (e.g. `python3 #### Windows -1. 下载安装[Python 3](https://www.python.org/downloads/) (确保将 Python 和 Pip 添加到您的 PATH) -2. 下载[Duino-Coin仓库](https://github.com/revoxhere/duino-coin/archive/master.zip) -3. 解压缩您下载的 zip 存档并在命令提示符下打开该文件夹 -4. 在命令提示符下输入`py -m pip install -r requirements.txt` 来安装所需的pip依赖项 +1. 下載安裝[Python 3](https://www.python.org/downloads/) (請將 Python 和 Pip 新增至系統 PATH) +2. 下載[Duino-Coin倉庫](https://github.com/revoxhere/duino-coin/archive/master.zip) +3. 解壓縮您下載的 ZIP 檔案並在令命提示字元下打開此文件夾 +4. 在令命提示字元下輸入`py -m pip install -r requirements.txt` 來安裝所需的pip依賴程式 -完成此操作后,您就可以启动软件了(只需双击所需的“.py”文件或在命令提示符中键入“py PC_Miner.py”)。 +完成此操作後,您就可以啟動軟體了,(只需雙擊所需的“.py”檔案或在令命提示字元下輸入“py PC_Miner.py”)。 -## 社区制作的软件 +## 社群製作的軟體
- 由于该列表变得非常长,因此默认情况下它已折叠。单击此文本以展开它! + 由於該列表非常長,因此默認情況下會收折。您可單擊此文件展開! @@ -140,41 +146,40 @@ After doing this, you are good to go with launching the software (e.g. `python3 * [Duino Stats](https://github.com/Bilaboz/duino-stats) official Discord bot by Bilaboz * [DuCoWallet](https://github.com/viktor02/DuCoWallet) GUI Wallet by viktor02 - 此列表将被积极更新。如果您想将软件添加到此列表中,请提交 PR 或联系其中一位开发人员。 - 您也可以在[官网](https://duinocoin.com/apps)上查看类似的列表。 + 此列表將積極更新。如果您想將軟體添加在此列表,請提交 PR 或連繫其中一位開發人員。 + 您也可以在[官方網站](https://duinocoin.com/apps)上查看類似的列表。
## DUCO & wDUCO -Duino-Coin 是一种混合货币,意味着它可以转换为 wDUCO,wDUCO 是包裹在 [Tron](https://tron.network) 网络上的 DUCO(作为代币)。目前它的用途并不多,除了只是将资金存储在外部钱包中或将 wDUCO 交换为 JustSwap 上的另一个令牌。 [wDUCO wiki](https://github.com/revoxhere/duino-coin/wiki/wDUCO-tutorial) 中提供了使用 wDUCO 的教程。 - +Duino-Coin 是一種混合貨幣,意味著它可以轉換為 wDUCO,wDUCO 是包裝在 [Tron](https://tron.network) 網絡上的 DUCO(作為代幣)。目前它的用途並不多,除了僅是將資金存儲在外部錢包中或將 wDUCO 交換為 JustSwap 上的另一個代幣。 [wDUCO wiki](https://github.com/revoxhere/duino-coin/wiki/wDUCO-tutorial) 中提供了使用 wDUCO 的教學。 ## Development -贡献使开源社区成为学习、启发和创造的绝佳场所。
-非常感谢您对 Duino-Coin 项目所做的任何贡献。 +貢獻使開源社群成為學習、啟發和創造的絕佳場所。
+非常感謝您對 Duino-Coin 項目做的任何貢獻。 -如何帮助? +如何幫助? -* 分叉项目 -* 创建您的功能分支 +* 分岔項目 +* 創建您的功能分支 * 提交您的更改 -* 确保一切按预期工作 -* 打开拉取请求 +* 確保一切按預期工作 +* 打開拉取請求 -服务器源代码、API调用文档和为Duino-Coin开发自己的应用程序的官方库在[有用工具](https://github.com/revoxhere/duino-coin/tree/useful-tools)分支中提供. +伺服器代碼、API開發文件和為Duino-Coin開發自己的應用程式的官方庫在[有用工具](https://github.com/revoxhere/duino-coin/tree/useful-tools)分支中提供. -## 官方测试设备和单板计算机的数据 +## 官方測試數據和單板電腦的數據
- 由于该表变得非常长,因此默认情况下它是折叠的。 单击此文本以展开它! + 由於該列表非常長,因此默認情況下會收折。您可單擊此文件展開! - ### 请注意,目前奖励正在更改为对数并且表格不准确。 + ### 請注意,目前獎勵正在更改為對數且表格不準確,僅供參考。 - | 设备/CPU/SBC/MCU/chip | 平均算力
(所有线程) | 采矿
线程 | 耗电
| 每日收益
DUCO/day | + | 設備/CPU/SBC/MCU/chip | 平均算力
(所有線程) | 挖礦
線程 | 耗電
| 每日收益
DUCO/day | |-----------------------------------------------------------|-----------------------------------|-------------------|----------------|---------------------| | Arduino Pro Mini, Uno, Nano etc.
(Atmega 328p/pb/16u2) | 196 H/s | 1 | 0.2 W | 9-10 | | Teensy 4.1 (soft cryptography) | 80 kH/s | 1 | 0.5 W | - | @@ -199,60 +204,62 @@ Duino-Coin 是一种混合货币,意味着它可以转换为 wDUCO,wDUCO 是 | Intel Core i3-4130 | 1.45 MH/s | 4 | - | - | | AMD Ryzen 5 2600 | 4.9 MH/s | 12 | 67 W | 15.44 | - 所有测试均使用 DUCO-S1 算法进行。该表将积极更新。 + 所有測試均使用 DUCO-S1 演算法進行。此表將積極更新。
-## 许可证 +## 許可證 -Duino-Coin 主要在 MIT 许可证下分发。有关更多信息,请参阅“许可证”文件。 -一些第三方包含的文件可能有不同的许可证 - 请检查他们的“LICENSE”声明(通常在源代码文件的顶部)。 +Duino-Coin 主要在 MIT 許可證下分發。有關更多信息,請參閱“許可證”文件。 +一些第三方包含的文件可能有不同的許可證 - 請檢查他們的“LICENSE”聲明(通常在源代碼文件的頂部)。 -## 服务条款 -1. Duino-Coins ("DUCOs") 是由矿工通过一个称为挖矿的过程获得的。
-2. 挖矿被描述为使用 DUCO-S1(和 XXHASH)算法(如 Duino-Coin 白皮书)中所述, 找到数学问题的正确结果会给矿工一个奖励。
-3. 官方可以使用CPU、AVR板(如Arduino板)、单板机(如Raspberry Pi板)、ESP32/8266板,使用官方矿机进行挖矿(其他官方允许的矿机在本README的上半部分说明)。
-4. 允许在GPU、FPGA等高效硬件上挖矿,但只能使用“EXTREME”挖矿难度。
-5. 任何用户在不适合其硬件的难度下使用矿机 (请参阅 难度列表) 将通过移动到正确的难度等级来自动限制。
-6. 任何用户不断尝试使用比其适合的难度更低的难度可能会被暂时阻止。
-7. 禁止包括阻止用户访问他的硬币以及删除帐户。
-8. 只有合法赚取的硬币才有资格兑换。
-9. 帐户可能会被暂时暂停以调查(“调查”)ToS 违规(“违规”或“滥用”)。
-10. 向官方 DUCO-Exchange(“官方交易所”)提出的交换请求可能会在调查期间被延迟和/或拒绝。
-11. 向官方交易所提出的交易所请求可能会因违反 ToS 和/或资金不足而被拒绝。
-12. 不允许使用免费的云托管服务(或免费的 VPS 服务 - 例如 Repl.it、GitHub Actions 等)进行挖矿,因为这对其他人不公平。
-13. 如果可以证明违规,用户的 DUCO 可能会被烧毁。
-14. 本服务条款可随时更改,恕不另行通知。
-15. 每位使用Duino-Coin的用户均同意遵守以上规则。
+## 服務條款 +1. Duino-Coins ("DUCOs") 是由礦工通過一個稱為挖礦的過程獲得的。
+2. 挖礦被描述為使用 DUCO-S1(和 XXHASH)算法(如 Duino-Coin 白皮書 中所述),找到數學問題的正確結果會給礦工一個獎勵。
+3. 官方可以使用CPU、AVR板(如Arduino板)、單板機(如Raspberry Pi板)、ESP32/8266板,使用官方礦機進行挖礦(其他官方允許的礦機在本 README 的上半部分說明)。
+4. 允許在GPU、FPGA等高效硬件上挖礦,但只能使用“EXTREME”挖礦難度。
+5. 任何用戶在不適合其硬件的難度下使用礦機 (請參閱 難度列表) 將通過移動到正確的難度等級來自動限制。
+6. 任何用戶不斷嘗試使用比其適合的難度更低的難度可能會被暫時阻止。
+7. 禁止包括阻止用戶訪問他的硬幣以及刪除帳戶。
+8. 只有合法賺取的硬幣才有資格兌換。
+9. 帳戶可能會被暫時暫停以調查(“調查”)ToS 違規(“違規”或“濫用”)。
+10. 向官方 DUCO-Exchange(“官方交易所”)提出的交換請求可能會在調查期間被延遲和/或拒絕。
+11. 向官方交易所提出的交易所請求可能會因違反 ToS 和/或資金不足而被拒絕。
+12. 不允許使用免費的雲托管服務(或免費的 VPS 服務 - 例如 Repl.it、GitHub Actions 等)進行挖礦,因為這對其他人不公平。
+13. 如果可以證明違規,用戶的 DUCO 可能會被燒毀。
+14. 本服務條款可隨時更改,恕不另行通知。
+15. 每位使用 Duino-Coin 的用戶均同意遵守以上規則。
-## 隐私政策 -1. 在主服务器上,我们只存储用户名、散列密码(在 bcrypt 的帮助下)和用户的电子邮件作为他们的帐户数据。
-2. 电子邮件不公开,仅用于在需要时、确认DUCO-Exchange 交易时、和在接收不定期的时事通讯(为未来计划)联系用户。
-3. 余额、交易和挖矿相关数据在公共 JSON APIs.
中公开可用。 -4. 隐私政策将来可能会在事先通知的情况下更改。 +## 隱私政策 +1. 在主伺服器上,我們只儲存用戶名、散列密碼(在 bcrypt 的協助下)和用戶的電子郵件作為他們的帳戶數據。
+2. 電子郵件不公開,僅用於在需要時、確認DUCO-Exchange 交易時、和在接收不定期的時事通訊(為未來計劃)聯繫用戶。
+3. 餘額、交易和挖礦相關數據在公共 JSON APIs中公開可用。 +4. 隱私政策將來可能會在事先通知的情況下更改。 -## 活跃的项目维护者 +## 活耀的項目維護者 -* [@revoxhere](https://github.com/revoxhere/) - robik123.345@gmail.com (Python 开发主管,项目创始人) -* [@Bilaboz](https://github.com/bilaboz/) (NodeJS 开发主管) -* [@connorhess](https://github.com/connorhess) (Python 开发主管,Node-S 所有者) -* [@JoyBed](https://github.com/JoyBed) (AVR 开发主管) -* [@Tech1k](https://github.com/Tech1k/) - kristian@beyondcoin.io (首席网站管理员和 DUCO 开发人员) +* [@revoxhere](https://github.com/revoxhere/) - robik123.345@gmail.com (Python 開發主管,專案創始人) +* [@Bilaboz](https://github.com/bilaboz/) (NodeJS 開發主管) +* [@connorhess](https://github.com/connorhess) (Python 開發主管,Node-S 所有者) +* [@JoyBed](https://github.com/JoyBed) (AVR 開發主管) +* [@Tech1k](https://github.com/Tech1k/) - hello@kristiankramer.net (首席網站管理員和 DUCO 開發人员) ## -* [@Pripun](https://github.com/Pripun) (移动应用开发) -* [@ygboucherk](https://github.com/ygboucherk) ([wDUCO](https://github.com/ygboucherk/wrapped-duino-coin-v2) 开发工程师) -* [@DoctorEenot](https://github.com/DoctorEenot) (开发工程师) -* [@LDarki](https://github.com/LDarki) (网络开发) -* [@Lulaschkas](https://github.com/Lulaschkas) (开发工程师) +* [@Pripun](https://github.com/Pripun) (移動程式開發) +* [@ygboucherk](https://github.com/ygboucherk) ([wDUCO](https://github.com/ygboucherk/wrapped-duino-coin-v2) 開發工程师) +* [@DoctorEenot](https://github.com/DoctorEenot) (開發工程师) +* [@LDarki](https://github.com/LDarki) (网络開發) +* [@Lulaschkas](https://github.com/Lulaschkas) (開發工程师) ## -* [@joaquinbvw](https://github.com/joaquinbvw) (AVR开发工程师) +* [@joaquinbvw](https://github.com/joaquinbvw) (AVR開發工程师) -另外,非常感谢所有帮助开发 Duino-Coin 项目的 [贡献者](https://github.com/revoxhere/duino-coin/graphs/contributors) 。 +另外,非常感谢所有幫助開發 Duino-Coin 項目的 [貢獻者](https://github.com/revoxhere/duino-coin/graphs/contributors) 。
-项目链接: [https://github.com/revoxhere/duino-coin/](https://github.com/revoxhere/duino-coin/) +項目連結: [https://github.com/revoxhere/duino-coin/](https://github.com/revoxhere/duino-coin/) +
+網站連結: [https://duinocoin.com/](https://duinocoin.com/)
-网站链接: [https://duinocoin.com/](https://duinocoin.com/) +本繁體中文由 Microlan Group Steven.Chen 翻譯 diff --git a/Resources/Wallet_langs.json b/Resources/Wallet_langs.json index a7566743..33bd3324 100644 --- a/Resources/Wallet_langs.json +++ b/Resources/Wallet_langs.json @@ -1037,6 +1037,7 @@ "session": "Sitzung", "wrapper_success": "Erfolgreich umwickelt!", "wrapper_amount_to_wrap": "Menge zum Umwickeln", + "email": "E-MAIL", "wrapper_error_tronpy": "Tronpy-Fehler", "translation_author_message": " Übersetzt von: ", "notification_new_transaction": "Neue Transaktion", @@ -1989,5 +1990,215 @@ "sessionprofit_unavailable2": "ครั้งแรกเพื่อดูกำไรโดยประมาณ", "tray_show": "แสดงหน้าต่าง", "tray_exit": "ออกจากหน้าต่าง" + }, + "japanese": { + "translation_author": "Ikko Ashimine", + "welcome_message": "\nDuino-Coin\nTkinter GUI\nウォレットへようこそ", + "warning": "警告", + "duino_coin_wallet": "Duino-Coinウォレット", + "uppercase_duino_coin_wallet": "DUINO-COINウォレット", + "loading_database": "データベースの読み込み中...", + "please_wait": "お待ち下さい...", + "please_wait_calculating": "お待ちください - 計算中...", + "preparing_wallet_window": "ウォレットウィンドウを準備中...", + "username": "ユーザーネーム", + "passwd": "パスワード", + "keep_me_logged_in": "ログイン状態を保持", + "login": "ログイン", + "register": "新規登録", + "login_error": "ログインエラー", + "fill_the_blanks_warning": "まず空白を埋める", + "registration_success": "登録成功", + "registration_success_msg": "新規ユーザー登録に成功しました。ログインできます", + "register_on_network": "ネットワークに登録", + "register_tos_warning": "Duino-Coinを利用することにより、利用規約を遵守することに同意するものとします", + "confirm_passwd": "パスワードの確認", + "old_passwd": "古いパスワード", + "new_passwd": "新しいパスワード", + "confirm_new_passwd": "新しいパスワードの確認", + "register_error": "ユーザー登録時のエラー", + "error_passwd_dont_match": "パスワードの不一致", + "same_passwd_error": "新しいパスワードは、古いパスワードと同じです", + "loading": "ローディング", + "wallet": "ウォレット", + "recipient": "受信者", + "amount": "量", + "send_funds": "DUCOの送信", + "send_funds_warning": "本当に送信しますか", + "send_funds_to": "へ", + "wrap_duco": "DUCOのラップ", + "unwrap_duco": "DUCOのアンラップ", + "estimated_profit": "予想利益", + "estimated_profit_miner_warning": "マイナーを先に起動し、利益の見込みを確認する。", + "wallet_transactions": "Duino-Coinウォレット - トランザクション", + "local_transactions": "ローカルのトランザクション", + "transaction_list": "トランザクションリスト", + "transaction_list_notice": "トランザクションをクリックすると、エクスプローラで表示されます。", + "currency_converter": "通貨換算機", + "from": "から", + "to": "へ", + "input_amount": "入力量", + "calculate": "計算", + "calculate_error": "計算間違い", + "wallet_calculator": "Duino-Coinウォレット - 通貨換算機", + "result": "結果", + "statistics": "統計データ", + "statistics_title": "Duino-Coinウォレット - 統計データ", + "your miners": "あなたのマイナー", + "statistics_miner_warning": "お客様のアカウントでマイナーが検出されませんでした", + "richlist": "リッチリスト", + "network_info": "ネットワーク情報", + "difficulty": "難易度", + "mined_blocks": "マイニングされたブロック", + "network_hashrate": "ネットワークハッシュレート", + "active_miners": "アクティブなマイナー", + "estimated_price": "予想価格", + "registered_users": "登録ユーザー数", + "mined_duco": "DUCOの全マイニング量", + "wrapper_title": "Duino-Coinウォレット - ラッパー", + "wrapped_error_tronpy": "Tronpyがインストールされていません、`pip install tronpy`でインストールしてください。", + "wrapper_error": "ラッパーが設定されていません。セッティングで設定してください", + "wrapper_error_title": "ラッパーエラー", + "invalid_passphrase": "無効なパスフレーズで、このセッションのラッパーを無効にする", + "wrapper_config_title": "DUCO Wrapper config", + "unwrapper_title": "Duino-Coinウォレット - アンラッパー", + "unwrap_amount": "アンラップする量: ", + "ask_passphrase": "パスフレーズ (秘密鍵にアクセスするため):", + "ask_private_key": "秘密鍵: ", + "passphrase": "パスフレーズ: ", + "settings": "設定", + "uppercase_settings": "設定", + "settings_title": "Duino-Coinウォレット - 設定", + "logout": "ログアウト", + "change_passwd": "パスワードの変更", + "change_passwd_lowercase": "パスワードの変更", + "change_passwd_error": "パスワードの変更エラー", + "change_passwd_ok": "パスワードの変更", + "configure_wrapper": "コンフィグラッパー", + "configure_wrapper_lowercase": "ラッパーの設定", + "clear_transactions": "明確なトランザクション", + "logged_in_as": "ユーザーとしてログイン", + "wallet_version": "ウォレットバージョン", + "minute": "分", + "hour": "時間", + "day": "日", + "config_dev_warning": "今後、さらにオプションを増やしていく予定です", + "your_miners": "あなたのマイナー", + "session": "セッション", + "wrapper_success": "ラップに成功", + "wrapper_amount_to_wrap": "ラップする量", + "email": "E-MAIL", + "wrapper_error_tronpy": "Tronpyでのエラー", + "translation_author_message": "ウォレットの翻訳:", + "notification_new_transaction": "新しいトランザクション", + "sessionprofit_unavailable1": "マイナーを起動する", + "sessionprofit_unavailable2": "最初に見積もり利益を確認する。", + "tray_show": "ウィンドウを表示する", + "tray_exit": "ウィンドウを閉じる" + }, + "finnish": { + "translation_author": "EeroVakiparta", + "welcome_message": "Tervetuloa\nDuino-Coin\nTkinter GUI Lompakkoon", + "warning": "Varoitus", + "duino_coin_wallet": "Duino-Coin Lompakko", + "uppercase_duino_coin_wallet": "DUINO-COIN LOMPAKKO", + "loading_database": "Ladataan tietokantaa...", + "please_wait": "Odota hetki...", + "please_wait_calculating": "Odota hetki - lasketaan...", + "preparing_wallet_window": "Valmistellaan lompakon ikkunaa...", + "username": "KÄYTTÄJÄTUNNUS", + "passwd": "SALASANA", + "keep_me_logged_in": "Pidä minut kirjautuneena", + "login": "KIRJAUDU", + "register": "REKISTERÖIDY", + "login_error": "Kirjautumisvirhe", + "fill_the_blanks_warning": "Täytä ensin tyhjät kohdat", + "registration_success": "Rekisteröinti onnistui", + "registration_success_msg": "Uusi käyttäjä on rekisteröity onnistuneesti. Voit nyt kirjautua sisään", + "register_on_network": "Rekisteröidy verkkoon", + "register_tos_warning": "Käyttämällä Duino-Coinia hyväksyt noudattavasi käyttöehtoja", + "confirm_passwd": "Vahvista salasana", + "old_passwd": "VANHA SALASANA", + "new_passwd": "UUSI SALASANA", + "confirm_new_passwd": "VAHVISTA UUSI SALASANA", + "register_error": "Käyttäjän rekisteröintivirhe", + "error_passwd_dont_match": "Salasanat eivät täsmää", + "same_passwd_error": "Uusi salasana on sama kuin vanha", + "loading": "Ladataan", + "wallet": "Lompakko", + "recipient": "VASTAANOTTAJA", + "amount": "MÄÄRÄ", + "send_funds": "LÄHETÄ DUCO", + "send_funds_warning": "Haluatko varmasti lähettää", + "send_funds_to": "kohteeseen", + "wrap_duco": "KÄÄRI DUCO", + "unwrap_duco": "PURKAUTA DUCO", + "estimated_profit": "ARVIOITU TUOTTO", + "estimated_profit_miner_warning": "Käynnistä louhintalaitteet ensin nähdäksesi arvioidun tuoton.", + "wallet_transactions": "Duino-Coin Lompakko - Tapahtumat", + "local_transactions": "PAIKALLISET TAPAHTUMAT", + "transaction_list": "TAPAHTUMALUETTELO", + "transaction_list_notice": "Klikkaa tapahtumaa nähdäksesi sen selaimessa.", + "currency_converter": "VALUUTTAMUUNNIN", + "from": "MISTÄ", + "to": "MIHIN", + "input_amount": "SYÖTÄ MÄÄRÄ", + "calculate": "LASKE", + "calculate_error": "Virheellinen laskenta", + "wallet_calculator": "Duino-Coin Lompakko - Valuuttamuunnin", + "result": "TULOS", + "statistics": "Tilastot", + "statistics_title": "Duino-Coin Lompakko - Tilastot", + "your miners": "SINUN LOUHIJAT", + "statistics_miner_warning": "Louhijoita ei voitu havaita tililläsi", + "richlist": "RIKASLISTA", + "network_info": "VERKON TIEDOT", + "difficulty": "Vaikeustaso", + "mined_blocks": "Louhitut lohkot", + "network_hashrate": "Verkon hashrate", + "active_miners": "Aktiiviset louhijat", + "estimated_price": "arvioitu hinta", + "registered_users": "Rekisteröityneet käyttäjät", + "mined_duco": "Kaiken aikaa louhittu DUCO", + "wrapper_title": "Duino-Coin Lompakko - Kääre", + "wrapped_error_tronpy": "Tronpy ei ole asennettu, asenna se käyttämällä komentoa `pip install tronpy`", + "wrapper_error": "Kääre ei ole määritetty. Määritä se asetuksissa!", + "wrapper_error_title": "Kääre-virhe", + "invalid_passphrase": "Virheellinen tunnuslause, poistetaan kääre käytöstä täksi istunnoksi", + "wrapper_config_title": "DUCO Kääre-asetukset", + "unwrapper_title": "Duino-Coin Lompakko - Kääreen purkaja", + "unwrap_amount": "Purkamisen määrä: ", + "ask_passphrase": "Tunnuslause (yksityisen avaimen käyttöön):", + "ask_private_key": "Yksityinen avain: ", + "passphrase": "Tunnuslause: ", + "settings": "Asetukset", + "uppercase_settings": "ASETUKSET", + "settings_title": "Duino-Coin Lompakko - Asetukset", + "logout": "KIRJAUDU ULOS", + "change_passwd": "VAIHDA SALASANA", + "change_passwd_lowercase": "Vaihda salasana", + "change_passwd_error": "Virhe salasanan vaihtamisessa", + "change_passwd_ok": "Salasana vaihdettu", + "configure_wrapper": "MÄÄRITÄ KÄÄRE", + "configure_wrapper_lowercase": "Määritä kääre", + "clear_transactions": "TYHJENNÄ TAPAHTUMAT", + "logged_in_as": "Kirjautunut käyttäjänä", + "wallet_version": "Lompakon versio", + "minute": "MINUUTTI", + "hour": "TUNTI", + "day": "PÄIVÄ", + "config_dev_warning": "Lisää vaihtoehtoja tulee tulevaisuudessa", + "your_miners": "SINUN KAIVUREITA", + "session": "ISTUNTO", + "wrapper_success": "Onnistunut kääriminen", + "wrapper_amount_to_wrap": "Käärittävä määrä", + "email": "SÄHKÖPOSTI", + "wrapper_error_tronpy": "Virhe Tronpyssa", + "translation_author_message": "Lompakko käännetty:", + "notification_new_transaction": "Uusi siirto", + "sessionprofit_unavailable1": "Käynnistä kaivurit", + "sessionprofit_unavailable2": "ensin nähdäksesi arvioidun tuoton.", + "tray_show": "Näytä ikkuna", + "tray_exit": "Sulje ikkuna" } -} \ No newline at end of file +} diff --git a/Tools/duco-install-rpi.sh b/Tools/duco-install-rpi.sh index 55c81548..3763cbf5 100755 --- a/Tools/duco-install-rpi.sh +++ b/Tools/duco-install-rpi.sh @@ -19,7 +19,7 @@ if [ ! -d ~/duino-coin/ ];then fi cd ~/duino-coin -echo "Installing python packages" +echo "Installing Python packages" python3 -m pip install -r requirements.txt # Install pip dependencies #Check if the app exists @@ -32,7 +32,7 @@ fi mkdir -p ~/.local/share/applications echo "[Desktop Entry] Name=Duino Coin PC Miner -Comment=Duino Coin miner for the raspberry pi +Comment=Duino Coin miner for the Raspberry Pi Exec=python3 /home/$u/duino-coin/PC_Miner.py Icon=/home/$u/duino-coin/Resources/PCMiner.png Terminal=true @@ -56,7 +56,7 @@ Type=Application Categories=Utility; StartupNotify=true" > ~/.local/share/applications/duino-coin-avr.desktop cd ~/ -if [ -f ~/duco-install-rpi.sh]; then +if [ -f ~/duco-install-rpi.sh ]; then rm duco-install-rpi.sh fi -echo "Installed" \ No newline at end of file +echo "Installed" diff --git a/Unofficial miners/Minimal_PC_Miner.py b/Unofficial miners/Minimal_PC_Miner.py index 52809ab2..f401bdbd 100644 --- a/Unofficial miners/Minimal_PC_Miner.py +++ b/Unofficial miners/Minimal_PC_Miner.py @@ -9,7 +9,8 @@ from socket import socket import sys # Only python3 included libraries import time -import requests +from urllib.request import Request, urlopen +from json import loads soc = socket() @@ -32,9 +33,7 @@ def current_time(): def fetch_pools(): while True: try: - response = requests.get( - "https://server.duinocoin.com/getPool" - ).json() + response = loads(urlopen(Request("https://server.duinocoin.com/getPool")).read().decode()) NODE_ADDRESS = response["ip"] NODE_PORT = response["port"] diff --git a/requirements.txt b/requirements.txt index d17ce340..d766b5ca 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,4 @@ colorama requests pyserial pypresence -tronpy -cryptography -websocket-client psutil