挖矿算法
TERA HASH
- 介绍
- 算法
- 简单计算:
- JS code
介绍
本算法的目的是维持CPU和GPU挖矿的公平性。为此,我们建议使用内存,但是本算法与其他类似算法(例如Ethash)不同,内存不会降低GPU的速度,但会加速CPU的速度。通过以下方式实现:选择散列时,不是使用整数随机数,而是使用特定值(该值计算很费时,例如由sha3算法计算),并允许将该值用于大范围的区块哈希计算枚举。因此,将这些特定值存在内存中以供选择,比重新计算它们更合算。即使计算速度增加1000倍,存在内存中也能维持优势。
算法
输入是当前块CurrentDataHash的32字节哈希,您需要找到一个Nonce(整数),最大值即为该区块的合适哈希,其初始值为零。
限制:
1. 搜索应针对内存进行优化-制约GPU挖矿
2. 检查应以最少的内存量进行,并且应与sha3计算速度差不多
解决程序:
1. 计算HashNonce = sha3(PrevHashN,Nonce)
2. 哈希结果= SimpleMesh(HashTemp,CurrentDataHash)
PrevHashN是某个先前区块的32字节哈希,与NDelta上的当前块不同(最大深度限制为一定数量,例如1000个块)
Nonce-一个数字,用于迭代从0到整数的最大值
SimpleMesh()是快速混合(非加密)的功能。它必须满足以下条件:
1. 熵守恒
2. 高速-比步骤1(在此示例中为sha3)中的函数计算速度快1000倍。
3. 有效混合数据-防止快速搜索,即保证HashNonce无效
搜索到最令人满意的哈希后,写入区块链:CurrentDataHash,Nonce,NDelta-快速恢复区块哈希
简单计算:
简单计算:
● GPU GTX 1060在1秒钟将创建并比较5亿个哈希值。
● 计算机:使用内存DDR4-2133,速度通道为177б/ s,因此也可以比较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
注意!
- •安装后,在浏览器中输入服务器的地址。示例: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
- 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大小为10 GB):
解压文档并将DB文件夹放入钱包的DATA文件夹(完全替换。
使用以下命令启动节点:
- run-node.bat
如果要将钱包在后台运行,请执行以下操作,而不是最后一个命令(run-node.bat):
- npm install pm2 -g
- pm2 start run-node.js
打开端口
- 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大小为10 GB:
- 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协议
- //集群
- //统计
- //信息展示
- //通过HTTP访问全节点钱包
- //挖矿:
- //通过HTTP访问轻型节点API1和API2
- //参数:
- //其他
//IP协议
"IP_VERSION": 4, | //IP协议的版本,有效值为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, | //启用统计信息-请参阅“计数器”,“监视”页面 |
"MAX_STAT_PERIOD": 600, | //统计时段 |
//信息展示
"LOG_LEVEL":2, | //日志详细信息,数字越大,消息越多 |
"COUNT_VIEW_ROWS": 20, | //每页的行数-在所有表中以分页显示 |
"ALL_VIEW_ROWS": 1, | //查看区块链表的所有行,即使它们已被列入黑名单(例如,具误导性的DApp) |
"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", | //一天中开始挖矿的时间,格式为hh:mm:ss时间(UTC)(必须通过常量USE_MINING启用挖矿),如果未设置该值,则始终执行挖矿 |
"MINING_PERIOD_TIME": "16:30", | //从开始以来的挖矿时段,格式hh:mm:ss |
"POW_MAX_PERCENT": "70", | //最大CPU使用率(占每个挖矿进程的百分比) |
"COUNT_MINING_CPU": 0, | //挖矿期间要运行的进程数 |
"SIZE_MINING_MEMORY": 20000000, | //分配在所有进程上用于挖矿的内存总数(以字节为单位) |
"POW_RUN_COUNT": 5000, | //在每个进程的每个挖矿迭代中计算的哈希数(哈希1,哈希2)(每个迭代在1 MS中启动一次-但在这一秒之内依赖POW_MAX_PERCENT参数) |
//通过HTTP访问轻型节点API1和API2
"USE_API_WALLET": 1, | //启用light(web)客户端支持 |
"USE_API_V1": 1, | //启用API1 |
"MAX_TX_FROM_WEB_IP": 20, | //限制发送数量(每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, | //启用日志 |
//其他
"USE_AUTO_UPDATE": 1, | //使用在线自动更新 |
"JINN_MAX_MEMORY_USE": 400, | //区块链数据库缓存的内存限制(MB) |
"RESTART_PERIOD_SEC": 0, | //在指定的时间(秒)后自动重启节点 |
"NOT_RUN": 0, | //禁用节点 |
"DELTA_CURRENT_TIME": -50, | //相对于TERA网络的时间偏差(自动设置) |
"LOG_LEVEL":2, | //日志详细信息,数字越大,消息越多 |
## 注意:
* 常量以JSON格式存储
* 在逻辑常量(例如启用或禁用某些功能)中,我们建议使用数字0或1
* 可以从命令行按以下方式更改任何常量(在~/ wallet / Source目录中运行):node set NAME = Value
* 更改常量后,重新启动节点