Primecoin接触

Primecoin简称XPM,中文名为质数币
github

质数,又叫做素数。如果一个数字,只能被1和它本身整除,那么这个数字就称为质数,比如3、11、37都是质数,质数在数学界中,存在着很多的疑难问题,比如著名的哥德巴赫猜想、黎曼猜想、孪生质数猜想、费马数、梅森质数等等,这些问题的解决,可以对人类的科学技术的发展,起到非常重要的促进作用。

XPM挖矿和传统的比特币挖矿原理截然不同,传统的比特币挖矿,只是简单的对一组密码进行暴力破解,而XPM的设计理念,是集合大家所有人的计算机能力,对学术界中的疑难问题进行破解,比如寻找最大的质数等等。这无疑对人类的科技进步带来帮助。

Primecoin每一分钟产生1个区块,每个区块包含若干个XPM的奖励(奖励数量取决于破解质数的难度)

值得注意的的是,梅森素数在Primecoin的工作量证明机制中是被排除的,因为他们实在太大了,代之以坎宁安链(Cunningham chains)和双向双链(Bi-twin chains)算法。

windows 版本

引用
windows 7 下编译

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
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 mingw64
make

  • 下载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 shell

    cd 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.6

    cd C:\deps\miniupnpc
    mingw32-make -f Makefile.mingw init upnpc-static
  • leveldb 编译

    使用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 -static

    DOS 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
configure -release -opensource -confirm-license -static -no-sql-sqlite -no-qt3support -no-opengl -qt-zlib -no-gif -qt-libpng -qt-libmng -no-libtiff -qt-libjpeg -no-dsp -no-vcproj -no-openssl -no-dbus -no-phonon -no-phonon-backend -no-multimedia -no-audio-backend -no-webkit -no-script -no-scripttools -no-declarative -no-declarative-debug -qt-style-windows -qt-style-windowsxp -qt-style-windowsvista -no-style-plastique -no-style-cleanlooks -no-style-motif -no-style-cde -nomake demos -nomake examples
mingw32-make

如果没有编译primecoind 或者 执行了 clean 操作需要重新编译 LevelDB

cd /C/bitcoin-0.8.6/src/leveldb
TARGET_OS=NATIVE_WINDOWS make libleveldb.a libmemenv.a

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
configure --disable-shared
make
cp .libs/libpng16.a .libs/libpng.a

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

LIBS="../libpng-1.6.16/.libs/libpng.a ../../mingw32/i686-w64-mingw32/lib/libz.a" \
png_CFLAGS="-I../libpng-1.6.16" \
png_LIBS="-L../libpng-1.6.16/.libs" \
configure --enable-static --disable-shared --without-tools

make

编辑 Edit C:\bitcoin-0.8.6\bitcoin-qt.pro with your favourite text editor and add

# Dependency library locations can be customized with:
# BOOST_INCLUDE_PATH, BOOST_LIB_PATH, BDB_INCLUDE_PATH,
# BDB_LIB_PATH, OPENSSL_INCLUDE_PATH and OPENSSL_LIB_PATH respectively

BOOST_LIB_SUFFIX=-mgw49-mt-s-1_57
BOOST_INCLUDE_PATH=C:/deps/boost_1_57_0
BOOST_LIB_PATH=C:/deps/boost_1_57_0/stage/lib
BDB_INCLUDE_PATH=C:/deps/db-4.8.30.NC/build_unix
BDB_LIB_PATH=C:/deps/db-4.8.30.NC/build_unix
OPENSSL_INCLUDE_PATH=C:/deps/openssl-1.0.1j/include
OPENSSL_LIB_PATH=C:/deps/openssl-1.0.1j
MINIUPNPC_INCLUDE_PATH=C:/deps/
MINIUPNPC_LIB_PATH=C:/deps/miniupnpc
QRENCODE_INCLUDE_PATH=C:/deps/qrencode-3.4.4
QRENCODE_LIB_PATH=C:/deps/qrencode-3.4.4/.libs

Comment out genleveldb.commands for win32

LIBS += -lshlwapi
#genleveldb.commands = cd $$PWD/src/leveldb && CC=$$QMAKE_CC CXX=$$QMAKE_CXX TARGET_OS=OS_WINDOWS_CROSSCOMPILE $(MAKE) OPT=\"$$QMAKE_CXXFLAGS $$QMAKE_CXXFLAGS_RELEASE\" libleveldb.a libmemenv.a && $$QMAKE_RANLIB $$PWD/src/leveldb/libleveldb.a && $$QMAKE_RANLIB $$PWD/src/leveldb/libmemenv.a
}

flags for static build:

CONFIG += static
win32:QMAKE_LFLAGS *= -Wl,--large-address-aware -static

From a windows command prompt configure and make:

set PATH=%PATH%;C:\Qt\4.8.6\bin
cd C:\bitcoin-0.8.6\
qmake "USE_QRCODE=1" "USE_UPNP=-" "USE_IPV6=1" bitcoin-qt.pro
mingw32-make -f Makefile.Release

c:/deps/miniupnpc 需要去掉版本信息

BOOST_INCLUDE_PATH = "C:/deps/boost_1_55_0"
BOOST_LIB_PATH = "C:/deps/boost_1_55_0/stage/lib"
BOOST_LIB_SUFFIX = "-mgw48-mt-s-1_55"
OPENSSL_INCLUDE_PATH = "C:/deps/openssl-1.0.1g/include"
OPENSSL_LIB_PATH = "C:/deps/openssl-1.0.1g"
BDB_INCLUDE_PATH = "C:/deps/db-4.8.30.NC/build_windows"
BDB_LIB_PATH = "C:/deps/db-4.8.30.NC/build_windows"
MINIUPNPC_INCLUDE_PATH = "C:/deps"
MINIUPNPC_LIB_PATH = "C:/deps/miniupnpc"

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
#endif

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.
If this sounds wrong, possibly the target language is not set or recognized.
Removed plural forms as the target language has less forms.
If this sounds wrong, possibly the target language is not set or recognized.
....

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
    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
    执行上面这一步后会让你选择x86_64-w64-mingw32-g++-win32还是x86_64-w64-mingw32-g++-posix,我们选择x86_64-w64-mingw32-g++-posix.
PATH=$(echo "$PATH" | sed -e 's/:\/mnt.*//g') # strip out problematic Windows %PATH% imported var
cd depends
make HOST=x86_64-w64-mingw32
cd ..
./autogen.sh # not required when building from tarball
CONFIG_SITE=$PWD/depends/x86_64-w64-mingw32/share/config.site ./configure --prefix=/
make

问题:
Makefile:3606: recipe for target ‘libbitcoinconsensus.la’ failed

使用 make -i 忽略后,是可以编译出来的。运行也可以同步数据。只能同步完才会知道,是否有其他问题。

https://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index-082944.html

https://github.com/bitcoin-core/docs/blob/master/gitian-building.md

素数币:挖矿运算有实用价值的加密货币
https://www.7234.cn/coin/23431

挖矿方法

挖矿步骤,点此下载PrimeCoin钱包客户端,然后点击Help菜单,再点击Debug Window,然后切换到控制台,就会出现以下界面:
c9a81344.png
在控制台下方的输入栏,输入setgenerate true,并按回车,就开始挖矿了(同步完数据包才能开始挖矿)。挖矿时,CPU占用率会持续在100%,你可以在同一个地方输入getmininginfo来查看你的挖矿状态,输入后,你会看到
1ae56d16.png
你的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,fixed
varMultiplier 就是 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.