门罗币挖矿初尝

  门罗币(Monero,缩写:XMR),是一个创建于2014年4月开源加密货币。Monero是一个开源软件纯工作证明加密货币。它可以在Windows、Mac、Linux和FreeBSD上运行。
  其主要发行曲线将在约8年内发行约1840万枚币。其工作验证算法CryptoNight是为AES密集型和很耗内存的操作,这显著降低了GPU对CPU的优势。

安装环境

  使用 xmr-stak 程序来挖矿

apt install libmicrohttpd-dev libssl-dev cmake build-essential libhwloc-dev git
git clone https://github.com/fireice-uk/xmr-stak.git
cd xmr-stak
cmake ./ -DCUDA_ENABLE=OFF -DOpenCL_ENABLE=OFF
make install

tips: 其中cmake的两个编译选项表示仅设定CPU支持,如果需要同时支持GPU挖矿见下文。

带显卡编译

  以N卡为例,首先去nvdia官网下载 CUDA Toolkit

dpkg -i cuda-repo-ubuntu1604-10-1-local-10.1.168-418.67_1.0-1_amd64.deb
apt-key add /var/cuda-repo-<version>/7fa2af80.pub
apt-get update
apt-get install cuda

  将以下 cmake 命令参数改为:

 cmake ./ -DCUDA_ENABLE=ON -DOpenCL_ENABLE=OFF
 make install
  • DCUDA_ENABLE=OFF 表示不编译Nvidia显卡
  • DOpenCL_ENABLE=OFF 表示不编译AMD显卡


运行

  首次运行,程序会交互地进行设置。

  切换到 xmr-stak 文件夹下,来到bin文件夹下运行程序:

cd bin
./xmr-stak

  根据命令行的询问信息,进行所需要的相应设置:

网页信息显示设置

  此处我设置为25252端口,于是在配置完毕后直接范围 host:port 可以查看信息

Use simple setup method? (Y/n)
n

- Do you want to use the HTTP interface?
Unlike the screen display, browser interface is not affected by the GPU lag.
If you don't want to use it, please enter 0, otherwise enter port number that the miner should listen on
25252


币种选择

  这里选择门罗币monero,当然这个xmr-stak程序也可以用来挖别的币种

- Please enter the currency that you want to mine: 
    - aeon7
    - bbscoin
    - bittube
    - cryptonight
    - cryptonight_bittube2
    - cryptonight_masari
    - cryptonight_haven
    - cryptonight_heavy
    - cryptonight_lite
    - cryptonight_lite_v7
    - cryptonight_lite_v7_xor
    - cryptonight_r
    - cryptonight_superfast
    - cryptonight_turtle
    - cryptonight_v7
    - cryptonight_v8
    - cryptonight_v8_double
    - cryptonight_v8_half
    - cryptonight_v8_reversewaltz
    - cryptonight_v8_zelerius
    - cryptonight_v7_stellite
    - cryptonight_gpu
    - cryptonight_conceal
    - graft
    - haven
    - lethean
    - masari
    - monero
    - qrl
    - ryo
    - torque
    - turtlecoin
    - plenteum
    - zelerius
    - xcash

monero


钱包

  在此之前,需要先配置自己的钱包:本地下载门罗币的客户端:https://web.getmonero.org/downloads/

  因为我本地也是Ubuntu,所以可以选择带GUI的Linux版本:

  解压并运行

tar -jxvf monero-gui-linux-x64-v0.14.0.0.tar.bz2
cd monero-gui-v*
./start-gui.sh

  根据提示创建钱包,按自身情况进行相应的设置

  回到对xmr-stak钱包的设置:在客户端上找到自己的钱包地址并复制信息进行相应的登录:

- Username (wallet address or pool login):
44HtFBFcFu2QdCEepAx5soYcGbpzjPWdpg4hFBVES9unG4dckja15Xgg2tgggosz5H7wvccnCJ3r4PyewZn1dazXV8z14bM
 - Password (mostly empty or x):
 x


矿池选择

  矿池最基本的职能就是将其矿工的算力聚集起来一起挖矿。在矿池帮助下,对矿工的技术门槛要求非常低,矿工只要下载挖矿软件,配置一下即可挖矿,根据提供的算力多少分享挖矿的成果。

  以 mineXMR 为例:

  这里选择新加坡服务器5555端口

- Pool address: e.g. monero.miner.rocks:5551
sg.minexmr.com:5555


其他

  根据矿池的描述要求进行相应的设置:

- Rig identifier for pool-side statistics (needs pool support). Can be empty:

- Does this pool port support TLS/SSL? Use no if unknown. (y/N)
n
- Do you want to use nicehash on this pool? (y/N)
n
- Do you want to use multiple pools? (y/N)
n
  • TLS/SSL : 矿池是否有支援安全通讯协议
  • nicehash : 是否要使用 nicehash 出租算力
  • multiple pools : 是否要使用多个矿池


收益

  收益可以在对应矿池网站中进行查看,比如在 mineXMR 矿池下,在 dashboard 页面中输入钱包地址后可以查看状态。只有当收益达到矿池对应的阀值要求时才可转入钱包,这时可以在钱包客户端中查看到结果。因此经常换矿池的话会导致剩余的零钱取不出。


修改配置

  基于以上操作后后,在bin文件夹下会生成config.txtcpu.txtpools.txt配置文件,如果是带有GPU支持则会有相应的gpu配置文件。

  在config.txt中,可以另外对之前网页显示状态页面设置登录信息,找到以下相应的字段进行设置:

"httpd_port" : 25252,
"http_login" : "myname",
"http_pass" : "mypassword",

  首次运行,xmr-stak会自动探测并设置cpu线程数,这个文件默认可以不用修改。但也可以自己调试相关参数进行优化,比如8核cpu的配置如下:

"cpu_threads_conf" :
 [
      { "low_power_mode" : true, "no_prefetch" : true, "affine_to_cpu" : 0 },
      { "low_power_mode" : true, "no_prefetch" : true, "affine_to_cpu" : 1 },
      { "low_power_mode" : true, "no_prefetch" : true, "affine_to_cpu" : 2 },
      { "low_power_mode" : true, "no_prefetch" : true, "affine_to_cpu" : 3 },
      { "low_power_mode" : true, "no_prefetch" : true, "affine_to_cpu" : 4 },
      { "low_power_mode" : true, "no_prefetch" : true, "affine_to_cpu" : 5 },
      { "low_power_mode" : true, "no_prefetch" : true, "affine_to_cpu" : 6 },
      { "low_power_mode" : true, "no_prefetch" : true, "affine_to_cpu" : 7 },
 ],
  • low_power_mode : 主要是提高两倍单核快取使用量,减少电力使用(减少同时运作的核心数量),最高可维持全部核心的 80%~85% 效能
  • no_prefetch : 开启后部份系统可能会取得 5% 的效能提升
  • affine_to_cpu : 标注要进行运算的实验核心


内存分配失败

  运行提示错误 “Error: MEMORY ALLOC FAILED: mmap failed”

在Linux下需要开启大页存取:

sysctl -w vm.nr_hugepages=12



后记 —— 关于比特币和区块链

  比特币是一种去中心化的、基于密码学的数字货币。

比特币诞生

  2008年11月1日,一个自称中本聪的人在网络上发布了一封白皮书,全称为《比特币:一种点对点的电子现金系统》。白皮书中提出了他对电子货币的新构想:构建一种去中心化的电子记账系统。

  2009年1月3日第一个序号为0的比特币创世区块诞生,几天后2009年1月9日出现序号为1的区块,并与序号为0的创世区块相连接形成了链,标志着区块链的诞生。

所谓区块链通俗的来讲就是一种分布式的账本,比特币的交易记录就是存放在一个个区块中,每个区块大小限制1M,一般可以存上千条记录。后一个区块不仅包含了本账页的信息,还会间接包含前一个区块的信息,这样一个个区块相继链接,便形成一条区块链。

记账奖励

  对于交易结果总需要有人记账,如果是支付宝产生的交易就是由阿里来记账,而这里如果是比特币系统上的交易,由比特币系统的用户都可以记账,但用户为什么要牺牲自己的资源来记账呢?因此比特币系统就提供了一种奖励机制,对于记账打包区块的用户会收到来自比特币系统的奖励以及这些交易账单的手续费。

  比特币系统中有这样一个方案:每十分钟打一个包,也就是每十分钟产生一个区块。对于这个打包奖励,最开始系统会奖励给这个用户50个比特币,过了四年之后系统奖励减半为25个比特币,再过四年就是12.5个比特币,以此类推…

  于是关于比特币的总量可以通过一个等比数列求和来计算出来:$6\times 24 \times365 \times 4 \times 50 \times \sum_{n=1}^{\inf}{0.5^{n-1}} = 21,024,000 $ 大约是21万个比特币,实际上每十分钟打包一次并不准确,其实比特币系统中规定每隔210000区块后,比特币产量减半,而我们说的4年减半,是根据大概10分钟出一个块,计算出大概4年能出210000个块。这样比特币的总量实际上是21万个稍微不到一点,因此在将来比特币区块奖励较少时,手续费可能将会成为矿工收入的主要来源。

以谁为准?—— 工作量证明

  那些在较早时期将计算机资源投入到比特币挖矿活动中的用户,相对于较晚加入的矿工而言,获得比特币容易得多。这样设计的原因,主要是为了保证在比特币的早期发展阶段可以吸引足够的计算力来处理数据块。事实上,如果没有人挖矿,比特币的初期交易活动就无法处理,比特币经济也将停止运行。

 由于这种奖励机制,比特币用户就会争相来打包记账。大家一起记账就可能会引发记账不一致,于是比特币系统便引入工作量证明来解决,用户解决这个证明的过程叫做“挖矿”。

  关于工作量证明机制:记账的用户会参与到一个竞赛中竞争唯一的记账权,竞赛的内容就是解一道密码学难题,第一个解出答案的用户会马上对全网进行广播打包区块,网络的节点收到后进行验证,验证成功后复制记账结果。比特币系统对优胜者的奖励交易就会有效。比特币系统会根据整个网络中电脑的计算能力,不断改变竞赛题目的难度,从而控制在大概每10分钟左右能有一个人能解出答案。

  把竞赛题目简化一下是关于sha256函数的反向计算,这个函数可以将一个任意字符串转换为一个256位的二进制数。通过字符串计算哈希值可以很容易得到结果,而通过二进制结果来得到字符串却需要通过枚举来完成。首先用户获得一个字符串$s=(上一个区块的hash, 账单信息, 随机数rand)$,将这个字符串做两次sha256运算得到 $hash=sha256(sha256(s))$,挑选随机数rand使得到的hash保证前n位为0,这个n由系统给定,最后将满足要求的hash作为当前区块的头部和账单等信息打包。

  对于一个随机数要保证前n项都为0的概率为$0.5^n$,因此假设世界上有一万台矿机,每台算力是14T/s,则在十分钟内一共会发生$1.4\times 10^{13} \times 10^4 \times 600 = 8.4 \times 10^{19}$ 次计算,使这么多次计算有一次命中条件,则$n=log_2^{8.4 \times 10^{19}}=66$ 位。

  因此在这个竞赛中设备的算力越强就越有可能胜出,由于比特币全网的运算水准在不断的呈指数级别上涨,单个设备已经几乎不可能获胜了,于是矿池的出现是用于将网络上少量算力合并联合运作,矿工获得的奖励便取决于对矿池的贡献。

-------------本文结束-------------