Primecoin接触
质数,又叫做素数。如果一个数字,只能被1和它本身整除,那么这个数字就称为质数,比如3、11、37都是质数,质数在数学界中,存在着很多的疑难问题,比如著名的哥德巴赫猜想、黎曼猜想、孪生质数猜想、费马数、梅森质数等等,这些问题的解决,可以对人类的科学技术的发展,起到非常重要的促进作用。
XPM挖矿和传统的比特币挖矿原理截然不同,传统的比特币挖矿,只是简单的对一组密码进行暴力破解,而XPM的设计理念,是集合大家所有人的计算机能力,对学术界中的疑难问题进行破解,比如寻找最大的质数等等。这无疑对人类的科技进步带来帮助。
Primecoin每一分钟产生1个区块,每个区块包含若干个XPM的奖励(奖励数量取决于破解质数的难度)
值得注意的的是,梅森素数在Primecoin的工作量证明机制中是被排除的,因为他们实在太大了,代之以坎宁安链(Cunningham chains)和双向双链(Bi-twin chains)算法。
windows 版本
引用
windows 7 下编译
- 安装 MinGW-builds 32bit
download
64bit
download
下载并解压缩到C盘根目录 C:\
设置PATH环境变量
将C:\mingw32\bin;添加到第一个。检验安装
在命令行模式下输入 gcc -v 会得到以下内容...
gcc version 4.8.2 (i686-posix-dwarf-rev3, Built by MinGW-W64 project)下载引用的外部库
把它们全部放在 C:\deps目录下安装OpenSSL下载:http://www.openssl.org/source/openssl-1.0.1g.tar.gz
进入启动 MinGw shell 编译C:\MinGW\msys\1.0\msys.bat
cd /c/deps/
tar xvfz openssl-1.0.1g.tar.gz
cd openssl-1.0.1g
./Configure no-zlib no-shared no-dso no-krb5 no-camellia no-capieng no-cast no-cms no-dtls1 no-gost no-gmp no-heartbeats no-idea no-jpake no-md2 no-mdc2 no-rc5 no-rdrand no-rfc3779 no-rsax no-sctp no-seed no-sha0 no-static_engine no-whirlpool no-rc2 no-rc4 no-ssl2 no-ssl3 mingw
make
64bit
C:\MinGW\msys\1.0\msys.bat |
下载Berkeley DB 访问: http://download.oracle.com/berkeley-db/db-4.8.30.NC.tar.gz
tar xvfz db-4.8.30.NC.tar.gz
cd db-4.8.30.NC/build_windows
../dist/configure --enable-mingw --enable-cxx --disable-shared --disable-replication
make安装Boost,download
使用 dos 命令行 cmd shellcd C:\deps\boost_1_55_0\
bootstrap.bat mingw
b2 --build-type=complete --with-chrono --with-filesystem --with-program_options --with-system --with-thread toolset=gcc variant=release link=static threading=multi runtime-link=static stage
查看版本
dpkg -s libboost-dev | grep 'Version'安装Miniupnpc 下载地址: http://miniupnp.tuxfamily.org/files/
miniupnpc-1.6cd C:\deps\miniupnpc
mingw32-make -f Makefile.mingw init upnpc-staticleveldb 编译
使用Qt提供的命令行,
cd /d/leveldb-1.12.0
TARGET_OS=NATIVE_WINDOWS make libleveldb.a libmemenv.a
获得libleveldb.a和libmemenv.a使用mingw
cd /c/Users/Diapolo/bitcoin.Qt/src/leveldb (use your path to leveldb dir)
TARGET_OS=OS_WINDOWS_CROSSCOMPILE make libleveldb.a libmemenv.a编译 primecoin
修改一下 makefile.mingw 把路径添加进去CC ?= gcc
DEPSDIR?=C:\deps
BOOST_SUFFIX?=-mgw49-mt-s-1_57
INCLUDEPATHS= \
-I"$(CURDIR)" \
-I"/c/deps/boost_1_57_0" \
-I"/c/deps" \
-I"/c/deps/db-4.8.30.NC/build_unix" \
-I"/c/deps/openssl-1.0.1g/include"
LIBPATHS= \
-L"$(CURDIR)/leveldb" \
-L"/c/deps/boost_1_57_0/stage/lib" \
-L"/c/deps/db-4.8.30.NC/build_unix" \
-L"/c/deps/miniupnpc" \
-L"/c/deps/openssl-1.0.1g"
# enable: ASLR, DEP and large address aware
LDFLAGS=-Wl,--dynamicbase -Wl,--nxcompat -Wl,--large-address-aware -staticDOS prompt:
cd /c/primecoin-0.8.6/src
make -f makefile.mingw
strip bitcoind.exe配置文件路径:
c:\Users\yourname\AppData\Roaming\Primecoin\primecoin.conf
编译Qt ui
Compile bitcoin-qt 0.8.6 with Qt 4.8:
Download
cd C:\Qt\4.8.6 |
如果没有编译primecoind 或者 执行了 clean 操作需要重新编译 LevelDB
cd /C/bitcoin-0.8.6/src/leveldb |
qrencode:
Download and unpack http://download.sourceforge.net/libpng/libpng-1.6.16.tar.gz inside your deps folder then configure and make:
cd /c/deps/libpng-1.6.16 |
Download and unpack http://fukuchi.org/works/qrencode/qrencode-3.4.4.tar.gz inside your deps folder then configure and make:
cd /c/deps/qrencode-3.4.4 |
编辑 Edit C:\bitcoin-0.8.6\bitcoin-qt.pro with your favourite text editor and add
# Dependency library locations can be customized with: |
Comment out genleveldb.commands for win32
LIBS += -lshlwapi |
flags for static build:
CONFIG += static |
From a windows command prompt configure and make:
set PATH=%PATH%;C:\Qt\4.8.6\bin |
c:/deps/miniupnpc 需要去掉版本信息
BOOST_INCLUDE_PATH = "C:/deps/boost_1_55_0" |
From a windows command prompt configure and make:
/deps/boost_1_57_0/boost/type_traits/detail/has_binary_operator.hpp
把整个文件包括在
#ifndef Q_MOC_RUN |
From msys shell configure and make bitcoin:
set PATH=%PATH%;c:\deps\qt-everywhere-opensource-src-4.8.6\bin
cd C:\bitcoin-0.8.6
qmake “USE_QRCODE=1” “USE_UPNP=1” “USE_IPV6=1” bitcoin-qt.pro
执行上面语句后可能会有一些警告,可以不用在意
Removed plural forms as the target language has less forms. |
mingw32-make -f Makefile.Release
在 linux 下面交叉编译 64-bit Windows版本
- 安装依赖包
sudo apt install build-essential libtool autotools-dev automake pkg-config bsdmainutils curl git
- 安装 mingw-w64执行上面这一步后会让你选择x86_64-w64-mingw32-g++-win32还是x86_64-w64-mingw32-g++-posix,我们选择x86_64-w64-mingw32-g++-posix.
sudo apt install g++-mingw-w64-x86-64
sudo apt install software-properties-common
sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu zesty universe"
sudo apt update
sudo apt upgrade
sudo update-alternatives --config x86_64-w64-mingw32-g++
//====================
sudo apt-get install mingw-w64
安装完成后,mingw-gcc和mingw-g++默认使用的线程模型是win32的,但是我们需要使用posix的线程模型,因此分别执行以下命令,然后将工具链指向带-posix后缀的工具链
sudo update-alternatives --config x86_64-w64-mingw32-gcc
sudo update-alternatives --config x86_64-w64-mingw32-g++
sudo update-alternatives --config x86_64-w64-mingw32-gfortran
sudo update-alternatives --config x86_64-w64-mingw32-gnat
sudo update-alternatives --config i686-w64-mingw32-gcc
sudo update-alternatives --config i686-w64-mingw32-g++
sudo update-alternatives --config i686-w64-mingw32-gfortran
sudo update-alternatives --config i686-w64-mingw32-gnat
PATH=$(echo "$PATH" | sed -e 's/:\/mnt.*//g') # strip out problematic Windows %PATH% imported var |
问题:
Makefile:3606: recipe for target ‘libbitcoinconsensus.la’ failed
使用 make -i 忽略后,是可以编译出来的。运行也可以同步数据。只能同步完才会知道,是否有其他问题。
https://github.com/bitcoin-core/docs/blob/master/gitian-building.md
素数币:挖矿运算有实用价值的加密货币
https://www.7234.cn/coin/23431
挖矿方法
挖矿步骤,点此下载PrimeCoin钱包客户端,然后点击Help菜单,再点击Debug Window,然后切换到控制台,就会出现以下界面:
在控制台下方的输入栏,输入setgenerate true,并按回车,就开始挖矿了(同步完数据包才能开始挖矿)。挖矿时,CPU占用率会持续在100%,你可以在同一个地方输入getmininginfo来查看你的挖矿状态,输入后,你会看到
你的CPU性能越好,就越有概率挖到矿。
在控制台输入 getdifficulty , 获取难度信息。
getmininginfo 能获取部分信息。primespersec是速度,我的是429pps。
注意Sunny King说过,能否挖到xpm不完全由primespersec决定。primespersec低的有时候也能挖到,primespersec高的反而不能挖到。
POW原理
ref.
Cunningham chains and bi-twin chains for proof-of-work
SHA256 可以高效的进行校验
the proof of work protocol would require miners to find long chains of prime numbers.
There are three specific types of chains that are of interest: Cunningham chains of the first kind, Cunningham chains of the second kind, and “bi-twin” chains
Cunningham 第一种:找到的质数等于前一个的两倍+1。
e.g. 2, 5, 11, 23, 47
Cunningham 第二种:找到的质数等于前一个的两倍-1。
e.g. 1531, 3061; 6121, 12241, 24481
bi-twin chains 是指一对质数的和是前一对质数和的两倍,例如 (211049+211051)*2= 422099+422101
211049, 211051, 422099, 422101, 844199, 844201
为了高效的进行验证,质数链需要符合最大长度的协议,
POW 的另一个重要特性是不可重用性
prime chain is linked to the block header hash
质数链连接到区块头的hash上,并且可以被区块头 hash 除尽。商就是POW的证明。proof-of-work certificate
POW 难度可调节
使用下面两个方法结合起来验证质数链的质数
The classical Fermat test [Caldwell 2002] of base 2
Euler-Lagrange-Lifchitz test
素数币使用两种方法测试,首先进行费马测试(Fermat Test),通过则再进行欧拉-拉格朗日-立夫习兹测试(Euler-Lagrange-Lifchitz Test),如果两种测试都通过则可被视为是素数。
需要指出的是,这种方法并不能保证通过测试的数百分百是素数,不过这并不影响系统运行,即便测试结果错误,只要每个节点都认为是素数就行。
素数币其实找的是素数链-坎氏链,存在三个特定类型的坎氏素数链:第一类坎氏链,第二类坎氏链和双坎氏链。
举第一类来说明,规则是:素数链中每个数都是前一个数的两倍减一,比如:
1531,3061,6121,12241,24481
数列的下一个数48961(24481*2-1)不是素数,因而这个坎氏链的长度是5,素数币的目标就是探索更长的坎氏链(以上三类都可以)。
那么现在最重要的问题来了,如何用坎氏链来验证一个区块是否合格呢?素数币实现的细节是这样的:
计算中本聪区块头Hash,hashBlockHeader = SHA256(BlockHeader)
通过变换获得坎氏链的第一个数:originNum = hashBlockHeader * Multiplier
获取originNum之后就可以测试并计算素数链长度的整数部分,小数部分的计算与坎氏链最后一个非素数的跨度相关。
每个区块的乘积因子Multiplier各不相同,计算过程和hashBlockHeader相关,素数币为此对区块头进行修改,专门增加一个字段(bnPrimeChainMultiplier)来存放这个乘积因子。但是以上第一步计算hashBlockHeader时输入数据并不包含这个乘积因子,这也是为啥特别指出中本聪区块头。
由于素数在数轴上分布不均匀,且根据目前掌握的知识来看,数越大,素数越稀有,寻找难度并不是线性递增,耗时也就不可预估,但是区块链要求稳定出块。正因为这点,素数币算法没有得到热捧。
Fermat primality test
费马小定理:
如果 n 是一个素数,a 是小于 n 的任意正整数,那么 a 的 n 次方与 a 模 n 同余。(两个数称为是模 n 的同余,如果它们除以 n 的余数相同。数 a 除以 n 的余数称为 a 取模 n 的余数,或简称为 a 取模 n)
费马检测是一个相对可靠的算法,而且在实现大数判断素数时可以提供相对高的效率来工作。下面看看费马检测概率问题。
费马检查得到的结果则只有概率上的正确性。说得更准确些,如果数 n 不能通过费马检查,我们可以确信它一定不是素数。而 n 通过了这一检查的事实只能作为它是素数的一个很强的证据,但却不是对 n 为素数的保证。我们能说的是,对于任何数 n,如果执行这一检查的次数足够多,而且看到 n 通过了检查,那么就能使这一素数检查出错的概率减小到所需要的任意程度。
造币的比率是根据难度来定的
使用区块头部的 hash 值
the chain origin is at hash * something
the more primes the origin has in it’s factorization, the higher the probability of it having a long chain
越大的素数他的因式分解链越长,这也是为什么寻找 ‘素数阶乘’ 的原因.
我们希望找到 hashsomething 尽可能是最高阶乘的倍数,同时希望是小的数字,这样计算快些。
something 分为固定部分和可变部分,所以链的原点是 hash * fixed * varMultiplier,fixedvarMultiplier 就是 POW,
阶乘保存在 bnHashFactor,我们修改 nonce 直到 hash 是 bnHashFactor 的倍数
the origin (or the first prime of the chain, which is origin +/- 1) needs to be larger than bnPrimeMin, I guess this is to guarrantee that a minimum effort is required.
fixed = somePrimorial / bnHashFactor
为了防止POW重复使用,the origin of a prime chain 需要能够被 block header hash 整除。
难度:11.12
找出11个长的质数,再找出12个记做 pk,算出 pk 的费马素性检验的余数r,然后使用 pk/r >= 0.12
假设难度为10.8,我们已经找到了长度为10的质数链,现在要看第11个数,那么有几种呢?
1.第11个数是质数,这条链长度变成了11.X>=10.8,合格,
2.1第11个数不是质数,但是有(pk-r)/pk >= 小数部分,合格
2.2第11个数不是质数,不满足(pk-r)/pk >= 小数部分,不合格
难度调整
基于Fermat primality test
素数币的难度调整更加平滑,采用每个块后调整其难度,挖掘量向目标总量以指数衰减的方式靠近。
其他
质数币没有限额,计划每笔交易烧掉手续费,减少通胀
获取测试币
Fermat primality test
https://testnet.manu.backend.hamburg/faucet
address:n2qaorXQDHDVd8U92qVtJuAqK7bPAsNGer
We would like to get them back. Send left coins to 2N8hwP1WmJrFF5QWABn38y63uYLhnJYJYTF. Thank you.