使用Ruby生成bitcoin的秘钥,公钥以及签名

TL;NR

  1. 随机生成不大于n = 1.158 * 1077(略小于2^256)的随机数作为秘钥k。

  2. 使用椭圆曲线算法从秘钥k生成公钥K。K = k * G(G是椭圆曲线上的点,*是定义在椭圆曲线上的乘法运算,G固定,相当于对G做k次椭圆上的加法运算)

  3. 使用SHA256以及RIPEMD160从公钥K生成地址A。

秘钥的生成

已经说过秘钥是一个不大于n = 1.158 * 1077(略小于2^256)的随机数。一般来说由操作系统的随机熵生成。很多钱包在生成秘钥的时候要求拖拽鼠标之类的行为,就是为了获取随机熵。

从秘钥生成公钥

采用特有的椭圆曲线secp256k1 curve从秘钥生成公钥。

1
k = K * G

在椭圆曲线上,我们可以定义一种加法,在这种加法下,两点的和相当于这两点在椭圆曲线上连线与椭圆曲线的交点。

这样,在椭圆曲线上的一个点的自相加,其和相当于从自己的位置做切线,切线与椭圆曲线相交的点的关于x轴的对称点。

下图就是把一个点G自相加多次的演示。

这样,从密钥生成公钥K就是重复上述的运算k次。

从公钥生成地址

地址相当于对数字签名。

1
A=RIPEMD160(SHA256(K))

SHA256和RIPEMD160是两个hash算法。具体就不展开了。

使用Ruby生成秘钥和公钥

已经有现成的gem可以使用,所以不需要自己重复造轮子。

1
gem install ecdsa

唯一需要注意的是,SecureRandom.random_number不一定secure和不一定非常random。

1
2
3
4
5
6
7
8
9
10
require 'ecdsa'
require 'securerandom'
group = ECDSA::Group::Secp256k1
private_key = 1 + SecureRandom.random_number(group.order - 1)
puts 'private key: %#x' % private_key

public_key = group.generator.multiply_by_scalar(private_key)
puts 'public key: '
puts ' x: %#x' % public_key.x
puts ' y: %#x' % public_key.y

以上。

使用cpuminer快速挖取山寨币monacoin

我是标题党,所谓的快速是指可以快速进入开挖状态。
近年随着市场的饱和,主流的电子货币挖矿市场已经从PC显卡挖矿转为使用专用的硬件挖矿。
然而,在一些山寨币市场,依然存在着用pc挖矿的人们。
下面我们考虑用空闲的服务器开挖山寨币。

挖什么?

这次我们以monacoin为目标币种。
monacoin是基于litecoin的一个fork,其主要的修改是把hash算法从Scrypt修改成了Lyra2REv2。
至于钱包客户端以及矿池的用法基本和litecoin一模一样。

下载钱包

下载地址
解压打开钱包monacoin-pt发现其实基本就是沿用了litecoin的钱包。

加入矿池

这年头已经很少有大拿独自挖矿了,
加入一个矿池就像是合买彩票,独自挖矿就像是独自买彩票,收益和概率当然也是该自己均衡的。
我们这里选择vippool这个矿池。点开注册,填写信息。
把上一步钱包里面的收货地址填入到相应的表相中。

注册成功之后选择添加worker。

添加worker

worker相当于挖矿的机器,你的账号可以添加多个worker来挖矿。

随便给worker取个名字,已经一个password,然后选择添加就行。
假设我建立了一个名字叫 bocchi, password是1234的worker。我们之后会用到这些信息。

cpuminer

下面就是下载挖矿软件了。

github地址

这款cpuminer是一个fork,不过它比原来增加了多种算法的支持,我们挖取monacoin所需要的Lyra2REv2算法也包括在其中。
clone到本地之后基本运行./build.sh就行。不过注意在ubuntu/debian上需要安装的包的说明。

另外有一点,就是在老版本的centos上,gcc的版本可能很低(4.4.x)。这个时候需要修改build.sh

1
2
3
4
5
# Ubuntu 10.04 (gcc 4.4)
# extracflags="-O3 -march=native -Wall -D_REENTRANT -funroll-loops -fvariable-expansion-in-unroller -fmerge-all-constants -fbranch-target-load-optimize2 -fsched2-use-superblocks -falign-loops=16 -falign-functions=16 -falign-jumps=16 -falign-labels=16"

# Debian 7.7 / Ubuntu 14.04 (gcc 4.7+)
extracflags="$extracflags -Ofast -flto -fuse-linker-plugin -ftree-loop-if-convert-stores"

把上面的注释去掉,把下面的加上注释之后在build就行。当然需要安装的包也别忘记安装上。

编译成功之后就是运行啦。

1
./cpuminer -a lyra2rev2 -o stratum+tcp://vippool.net:8888 -u gyorou.bocchi -p 1234

然后就开挖啦。

下图是实际挖了一天的收入。

, 查了一下汇率,大概相当于1日元。

后话

挖矿其实也是一种投资的方式,只不过一旦将手头的钱换成挖矿的硬件,短时间之内是基本无法抽身了。
所以,想要以正常姿势投资的话,还是直接去买虚拟货币之后看涨才是。
另外,如果你要用自己家里的机器挖矿的话,电费也会是一个重要的开支。