алгоритм майнинга
TERA HASH
- Введение
- Алгоритм
- Небольшие расчеты
- JS code
Введение
Целью этого алгоритма является уравнивание людей, который майнят на ЦП, и людей, добывающих данные на GPU. Для достижения этого мы предлагаем использовать память, но в отличие от других подобных алгоритмов (таких как Ethash) в нашем алгоритме память не замедляет работу GPU, а ускоряет работу ЦП. Это можно сделать, используя не целочисленное случайное число при выборе хеша, а определенное значение, которое требует времени для вычисления, например, вычисленное алгоритмом sha3 и позволяющее использовать это значение для перечисления в широком диапазоне блочных хеш-вычислений. Таким образом, выгоднее хранить эти значения в памяти для выбора, чем пересчитывать их. Это преимущество должно быть сохранено, даже если скорость вычислительных ресурсов увеличится в 1000 раз.
Алгоритм
Ввод представляет собой 32-байтовый хеш текущего блока CurrentDataHash, нужно найти случайное число (целое число), так чтобы результатом будет подходящий хеш блока с максимальным значением начальных нулей.
Ограничение:
1. Поиск должен быть оптимизирован для использования памяти - для защиты от майнинга на графических процессорах
2. Проверка должна выполняться с минимальным объемом памяти и быть быстрой по скорости вычисления sha3
Порядок расчетов:
1. Расчетный HashNonce= sha3(PrevHashN , Nonce)
2. Результирующий хэш = SimpleMesh(HashTemp,CurrentDataHash)
PrevHashN - это 32-байтовый хэш какого-либо предыдущего блока, отличающийся от текущего блока на NDelta (максимальная глубина ограничена определенным числом, например 1000 блоков)
Случайное число - число для итерации значений от 0 до max целого числа
SimpleMesh () - функция быстрого смешивания (не криптографического). Она должна удовлетворять следующим условиям:
1. Сохранение энтропии
2. Высокая скорость - в 1000 раз быстрее, чем скорость вычисления функции на шаге 1 (sha3 в этом примере).
3. Должна хорошо смешивать данные - чтобы предотвратить быстрый поиск, т.е. гарантировать взлом HashNonce
После поиска наиболее удовлетворяющего хеша записывается блокчейн: CurrentDataHash, Nonce, NDelta - который быстро восстанавливает хэш блока
Небольшие расчеты
Небольшие расчеты:
● GPU GTX 1060 за 1 секунду создаст и сравнит порядок 0,5 млрд хешей.
● Компьютер: с помощью памяти DDR4-2133 должен будет иметь скорость канал 17ГБ/с и поэтому сможет сравнить также порядка 0,5 млрд хешей
Майнер должен доказать, что базовый хеш не изменился. Ему нужно найти второе случайное число:
То, которое соответствует текущему хэшу блока
Отличается от предыдущего хэша блока
Основная формула расчета:
Hash = XOR(DataHash, HNonce1)
Hash2 = XOR(PrevHash,HNonce2)
Power=min(Power(Hash),Power(Hash2))
JS code:
function GetHash(PrevHash,BlockHash,Miner,BlockNum,Nonce0,
Nonce1,Nonce2,DeltaNum1,DeltaNum2)
{
if(DeltaNum1>DELTA_LONG_MINING || DeltaNum2>DELTA_LONG_MINING)
return undefined;
//calculate the hashes, which will look similar HashNonce
var HashBase=sha3(PrevHash);
var HashCurrent=GetHashFromNum2(BlockHash,Miner,Nonce0);
//Hash-Nonce
var HashNonce1=GetHashFromNum3(BlockNum-DeltaNum1,Miner,Nonce1);
var HashNonce2=GetHashFromNum3(BlockNum-DeltaNum2,Miner,Nonce2);
//XOR
var Hash1=XORArr(HashBase,HashNonce1);
var Hash2=XORArr(HashCurrent,HashNonce2);
//choose the least POW
var Ret={Hash:Hash2};
if(CompareArr(Ret.Hash1,Ret.Hash2)>0)
{
Ret.PowHash=Hash1;
}
else
{
Ret.PowHash=Hash2;
}
Ret.Hash=sha3arr2(Hash1,Hash2);
return Ret;
}
Руководство
Начать Майнинг
Скомпилировать из исходного кода
- Внимание!
- Windows
- CentOS 7
- UBUNTU 18.4
Attention!
- После установки введите адрес вашего сервера в браузере. Пример: 12.34.56.78: 8080
- Для майнинга необходимо иметь статический (открытый) IP-адрес и открытый порт.
- Рекомендуется не хранить закрытые ключи на удаленных серверах.
- Рекомендуем поставить дополнительный пароль на закрытый ключ (кнопка "Установить пароль") - в этом случае закрытый ключ будет храниться в файле в зашифрованном виде.
- Если пароль http для полного узла не указан, доступ возможен только по локальному адресу 127.0.0.1: 8080 и только в течение 10 минут после запуска узла.
- Для удаленного доступа к узлу только с указанного компьютера (белый IP) установите константу HTTP_IP_CONNECT (например: "HTTP_IP_CONNECT":" 122.22.33.11 ")
- При установке обратите внимание на криптографическую библиотеку secp256k1. При компиляции не должно быть ошибок (с командой: npm install)
- Если включена константа автоматического обновления ("USE _ AUTO _ UPDATE": 1), обновление выполняется автоматически. Если она выключен, ее необходимо загрузить вручную и перезапустить узел (см. раздел ниже).
Windows
- Скачайте и установите Nodejs
- Скачайте и установите git
- Затем выполните команды (в cmd или PowerShell):
- cd ..\..\..\
- git clone https://gitlab.com/terafoundation/tera2.git wallet
- npm install --global --production windows-build-tools
- npm install -g node-gyp
- cd wallet/Source
- npm install
- node set httpport:8080 password:password_no_spaces
- run-node.bat
Перед запуском ноды рекомендуется загрузить резервную копию блокчейна (размер zip 7,6 Гб) Здесь:
Распакуйте архив и поместите папку BD в папку DATA кошелька (с полной заменой).
Запустите ноду командой:
- run-node.bat
Если вы хотите запустить кошелек как фоновый процесс, то вместо последней команды (run-node.bat) выполните следующее:
- npm install pm2 -g
- pm2 start run-node.js
Opening Port
- netsh advfirewall firewall add rule name="Open 30000 port" protocol=TCP localport=30000 action=allow dir=IN
CentOS 7
Выполните комманды:
- yum install install unzip
- yum install -y git
- curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
- yum install -y nodejs
- yum install gcc gcc-c++
- npm install pm2 -g
- git clone https://gitlab.com/terafoundation/tera2.git wallet
- cd ~/wallet/Source
- npm install
- node set httpport:8080 password:password_no_spaces
Откройте порты (все):
- systemctl stop firewalld
- systemctl disable firewalld
Перед запуском ноды рекомендуется загрузить резервную копию блокчейна (размер zip 7,6 Гб) Здесь:
- cd ~/wallet/DATA
- wget https://terawallet.org/files/jinn-db.zip
- unzip -o jinn-db.zip
Запустите ноду:
- cd ~/wallet/Source
- pm2 start run-node.js
UBUNTU 18.4
Выполните комманды:
- apt-get install unzip
- apt-get install -y git
- apt-get install -y nodejs
- apt-get install -y npm
- npm install pm2 -g
- git clone https://gitlab.com/terafoundation/tera2.git wallet
- apt install build-essential
- apt group install "Development Tools"
- cd ~/wallet/Source
- npm install
- node set httpport:8080 password:password_no_spaces
Откройте порты:
- sudo ufw allow 30000/tcp
- sudo ufw allow 8080/tcp
- sudo ufw allow 80/tcp
Перед запуском ноды рекомендуется загрузить резервную копию блокчейна (размер zip 7,6 Гб) Здесь:
- cd ~/wallet/DATA
- wget https://terawallet.org/files/jinn-db.zip
- unzip -o jinn-db.zip
Запустите ноду:
- cd ~/wallet/Source
- pm2 start run-node.js
DOCKER
КОНСТАНТЫ
Описание констант (из версии 2360):
- //IP-PROTOCOL
- //КЛАСТЕРЫ
- //СТАТИСТИКА
- //Отображение информации
- //HTTP доступ к полным узлам
- //МАЙНИНГ:
- //HTTP доступ к облегченным узлам
- //параметры:
- //ETC
//IP-PROTOCOL
"IP_VERSION": 4, | //версия ip Protocol, допустимые значения: 4 или 6 |
"JINN_IP": "10.20.30.40", | //открытый IP-адрес узла, если не указан, определяется автоматически |
"JINN_PORT": 30000, | //порт |
"AUTODETECT_IP": 0, | //режим обнаружения IP-адреса (т.е. значение константы JINN_IP сбрасывается при запуске) |
"CLIENT_MODE": 0 | //режим работает только в клиентском режиме без возможности принимать входящие подключения |
//Кластеры
"COMMON_KEY": "Secret1", | //общий ключ для доверенных узлов (узлы не запрещают друг друга) |
"NODES_NAME": "Node001", | //имя доверенного узла, которое отображается на странице NETWORK |
"CLUSTER_HOT_ONLY", | //разрешить связь только с узлами кластера |
//Статистика
"STAT_MODE": 1, | //включить статистику - см. Counters, Monitor pages |
"MAX_STAT_PERIOD": 600, | //период статистики |
//Отображение информации
"LOG_LEVEL":2, | //сведения регистрации, чем больше число, тем больше сообщений |
"COUNT_VIEW_ROWS": 20, | //количество строк на страницу - отображается во всех таблицах с разбиением на страницы |
"ALL_VIEW_ROWS": 1, | //просмотреть все строки блокчейн-таблиц, даже если они включены в черный список (например, DAPs misleading |
"START_HISTORY": 16, | //номер аккаунта, с которого записывается история операций |
//HTTP доступ к кошельку узла
"HTTP_PORT_NUMBER": 8000, | //порт http доступа |
"HTTP_PORT_PASSWORD": "SecretWord", | //пароль |
"HTTP_IP_CONNECT": "123.111.222.233, 123.11.22.223", | //включить фильтр IP-адресов для удаленного доступа |
"WALLET_NAME": "=Node1=", | //имя кошелька, отображаемого на вкладке в браузере |
//Майнинг:
"USE_MINING": true, | //включение майнинга |
"MINING_ACCOUNT": 0, | //номер учетной записи, получающей вознаграждение за найденный блок |
"MINING_START_TIME": "6:30", | //время начала майнинга в течение дня в формате чч: мм: сс время в UTC (майнинг должен быть включен константой USE_MINING), если значение не установлено, то майнинг выполняется все время |
"MINING_PERIOD_TIME": "16:30", | //период майнинг с начала формата чч: мм: сс |
"POW_MAX_PERCENT": "70", | //максимальное использование ЦП в процентах от каждого процесса майнинга |
"COUNT_MINING_CPU": 0, | //количество процессов, выполняемых во майнинга |
"SIZE_MINING_MEMORY": 20000000, | //общее количество памяти, выделенной для майнинга во всех процессах (в байтах) |
"POW_RUN_COUNT": 5000, | //количество хэшей (hash1, hash2), вычисленное при каждой итерации майнинга в каждом процессе (каждая итерация запускается один раз в 1 МС - но в течение этой секунды берется POW_MAX_PERCENT параметр) |
//HTTP доступ к облегченному узлу, API1 и API2
"USE_API_WALLET": 1, | //включение облегченной (веб) поддержки клиентов |
"USE_API_V1": 1, | //включение API1 |
"MAX_TX_FROM_WEB_IP": 20, | //ограничить количество tx (каждые 10 минут) |
"USE_HARD_API_V2": 0, | //включение поддержки узлов API2 не рекомендуется для общего доступа |
//параметры:
"HTTP_HOSTING_PORT": 80, | //номер веб-порта |
"HTTPS_HOSTING_DOMAIN": "", | //доменное имя |
"HTTP_MAX_COUNT_ROWS": 20, | //ограничение количества строк запросов данных |
"HTTP_START_PAGE": "", | //домашняя страница (веб-кошелек по умолчанию) |
"HTTP_CACHE_LONG": 10000, | //время кэширования страниц (с) |
"HTTP_USE_ZIP": 0, | //с использованием архивирования страниц |
"WEB_LOG": 0, | //включение ведения журнала |
//ETC
"USE_AUTO_UPDATE": 1, | //использование автоматических обновлений в сети |
"JINN_MAX_MEMORY_USE": 400, | //ограничение памяти, которое используется для кэша базы данных блокчейн в МБ |
"RESTART_PERIOD_SEC": 0, | //автоматический перезапуск узлов после указанного периода в секундах |
"NOT_RUN": 0, | //отключение узла |
"DELTA_CURRENT_TIME": -50, | //отклонение по времени относительно сети Tera (устанавливается автоматически) |
"LOG_LEVEL":2, | //сведения регистрации, чем больше число, тем больше сообщений |
## Примечание:
* Константы хранятся в формате
* В логических константах, таких как включение или отключение чего-либо, рекомендуется использовать число 0 или 1
* Любая константа может быть изменена из командной строки следующим образом (запуск в каталоге ~/wallet/Source directory): node set NAME=Value
* После изменения констант перезапустите узел