比特币源码阅读(0.16)(四)
chainparams.cpp::CreateGenesisBlock
可以使用工具生成创世块的参数
- https://github.com/lhartikk/GenesisH0
- https://github.com/nasa8x/node-genesis-block
- https://github.com/nasa8x/genesis-block
1 |
|
比特币源码阅读(0.16)(五)
base58.h
Base58是用于Bitcoin中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址。相比Base64,Base58不使用数字”0”,字母大写”O”,字母大写”I”,和字母小写”l”,以及”+”和”/“符号。
设计Base58主要的目的是:
- 避免混淆。在某些字体下,数字0和字母大写O,以及字母大写I和字母小写l会非常相似。
- 不使用”+”和”/“的原因是非字母或数字的字符串作为帐号较难被接受。
- 没有标点符号,通常不会被从中间分行。
- 大部分的软件支持双击选择整个字符串。
1 |
|
比特币源码阅读(0.16)(七)
MAC上编译bitcoin
安装 XCode 命令行工具
xcode-select –install
安装Brew,本来想升级一下,但是很长时间没有响应,就重新安装了
/usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
使用Brew安装第三方工具和库
brew install automake berkeley-db4 libtool boost miniupnpc openssl pkg-config protobuf python qt libevent qrencode
从github下载0.16版本bitcoin,解压到bitcoin目录
https://github.com/bitcoin/bitcoin/tree/0.16
编译代码
新建Terminal窗口,进入上一步创建的bitcoin目录中,执行如下命令,然后长时间的等待
./autogen.sh
./configure
make
数字签名
什么是数字签名
数字签名是带有秘钥(公钥和私钥)的摘要信息算法,它和摘要算法用途一样,用于验证数据来源、数据完整性和抗否认性等,私钥签名,公钥验证。常用的签名算法有RSA、DSA和ECDSA。经典的RSA数字签名算法广泛的使用,就形成了DSS(Digital Signature Standard)标准,而DSA(Digital Signature Algorithm)是对标准的实现,DSA只能实现签名,而RSA既可以签名,也可以加解密,这是他们最大的区别。ECDSA是微软贡献的签名算法,全称是Elliptic Curve Digital Signature Algorithm,椭圆曲线数字签名算法,具有速度快,强度高,签名短的特点。
什么是椭圆曲线数字签名算法(ECDSA)
椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟。ECDSA于1999年成为ANSI标准,并于2000年成为IEEE和NIST标准。它在1998年既已为ISO所接受,并且包含它的其他一些标准亦在ISO的考虑之中。与普通的离散对数问题(discrete logarithm problem DLP)和大数分解问题(integer factorization problem IFP)不同,椭圆曲线离散对数问题(elliptic curve discrete logarithm problem ECDLP)没有亚指数时间的解决方法。因此椭圆曲线密码的单位比特强度要高于其他公钥体制。
签名过程如下:
1、选择一条椭圆曲线Ep(a,b),和基点G;
2、选择私有密钥k(k<n,n为G的阶),利用基点G计算公开密钥K=kG;
3、产生一个随机整数r(r<n),计算点R=rG;
4、将原数据和点R的坐标值x,y作为参数,计算SHA1做为hash,即Hash=SHA1(原数据,x,y);
5、计算s≡r - Hash * k (mod n)
6、r和s做为签名值,如果r和s其中一个为0,重新从第3步开始执行
验证过程如下:
1、接受方在收到消息(m)和签名值(r,s)后,进行以下运算
2、计算:sG+H(m)P=(x1,y1), r1≡ x1 mod p。
3、验证等式:r1 ≡ r mod p。
4、如果等式成立,接受签名,否则签名无效。
nodejs 实现
1 | var crypto = require('crypto'); |