关于比特币入门,其运行原理(理解性描述),什么是挖矿,还有一些学习资料的整理,详见此博客连接git
第一章讲比特币的历史,算是导入,上面的博客连接有归纳。github
第二章举了使用比特币交易的例子,其中介绍了一个交易模型让我印象深入算法
这个模型中,有输入和输出,输入(IN)是本身帐户上可用的金额(这个金额能够由一我的转帐造成的输出A,或者由多我的转帐造成的输出们组成的A,B,C),而最基本的输出(OUT)分为两个部分,一个是转帐给别人的,一个是找零给本身的,在进行下一次的交易的时候,这个输出中给退还给本身的一部分能够是上面的A或者A,B,C中的一个,而转帐给别人的也是同理,使用比特币的交易过程,就是比特币全部权在地址(下面重点讲)的不断转让过程。安全
一样仍是上面这张图,有个交易费项,这个交易费是给矿工的(补充了知识点:矿工除了挖到矿所得的奖励外,在比特币的交易中,还扣除了一些费用(按照整个比特币网络挖矿每4年奖励减半,将在2140年奖励归零,我以为2140年的电脑运算速度会很快,收取的手续费和如今挖矿相比应该差不了多少)服务器
当一笔交易由矿工选中Lucky Number并讲其放在区块链中后,随着区块链的长度不断变长,这笔交易愈来愈难被推翻,由于它在网络中被更多矿工和用户验证,渐渐地被整个比特币网络认可。网络
第三章是如何安装比特币的完整客户端,可是看到下载区块链要不少天我就放弃用第三章的方法,而是用第三章末尾推荐的bitcoin exploer工具,这是一个命令行与服务器交互以得到比特币信息的工具,对于新手来讲很合适,这个工具在Windows下有现成的二进制可执行文件,但我下载不成功,转在了Linux下用源码安装,这个连接里包含了这个工具的安装以及教程。app
加密体制分为:①以置换、替换为表明的古典密码体制(表明:凯撒密码)=》②要求发送方和接收方都要有相同密钥的对称加密体制(表明:DES加密)=》③公钥加密体制:有一对公钥和私钥,公钥是公开的,网上全部人都知道的,用公钥加密的信息,只有拥有私钥的人才能解密(表明:RSA加密,椭圆曲线加密)。函数
在公钥加密体制中,有一个称为陷门的函数h,陷门的定义就是从x->y方向容易,可是从y->x方向难,根据两个方向难度差距,定义了陷门函数的好坏,一个陷门函数,若是两方向难度差距越大,陷门函数越好,这个密码方案越难攻破,下面以RSA来举例子工具
若是想要攻破RSA就须要在知道公钥(n, b)的基础上,算出私钥(p,q,a),由于n=p*q,而a=b(mod fi(n))故,只用知道n=p*q中的p和q,就能获得私钥,而n=p*q又叫大整数分解问题,如今没有一个有效算法能解决该问题,因此它是安全的。学习
可是Bitcoin中所用的不是RSA加密,而是椭圆曲线加密算法
说是椭圆曲线其实不太准确,这个椭圆曲线和咱们高中学的那个椭圆曲线不是一个东西,虽然它们方程式长得差很少,椭圆曲线方程式为:y2=x3+ax+b,画出曲线图像是下面这样,可是实际上不是线,而是一系列的(x,y)都是整数的点集,这个点集构成一个循环群,群是自带运算的,群的两个点为A,B,定义A和B的运算“+”为:过A,B点连一条直线(若是A=B,则该直线就是切线),这条直线一定与椭圆曲线交与除A、B以外的第三点C,C点关于x轴对称的那点称为D点(D点必定在椭圆曲线上,由于椭圆曲线关于x轴对称),D点就是目标点,此时有运算A+B=D【此处的+与整数里的+不同,你也能够把此处的+叫作“这个操做”,不过为了方便,仍是说+好一点】,定义整数k和曲线上的整数点A的运算k*A为执行A+A+...+A(k次),循环群:下面那张只有点的图,能够由最初开始的知足y2=x3+ax+b的点G开始,经过不断的k*G(k=1,2,...,n)生成,而k=n时G达到最大,即k=n+1时k*G=1*G,造成循环,这就是循环群,下面一张动图形象地描述了这个过程。
上面的k就是私钥,而点k*G是公钥,我不打算从数学的角度来给予椭圆曲线加密算法的陷门函数是难解决的,咱们观察这样一个事实,从G点,咱们能轻易地经过k获得目标点,但很难从目标点获得G点,这个单项陷门函数显然要比整数分解问题难不少,这篇文章里用了一个很形象的比喻,长度为256的密钥,从公钥中解出私钥,解RSA消耗的能量能煮沸一汤勺水,而解椭圆曲线能把地球上的全部水都煮沸,RSA密钥要达到一样的效果,须要2380bits的。椭圆曲线和RSA效率高下立判,事实上,如今不少安全协议除非在设计中用到RSA的机制,不然都已经升级为了椭圆曲线加密。
在上面椭圆曲线中,咱们获得了公钥,对这个公钥进行Hash,就能获得惟一标识的比特币地址,在Hash处理中,用到了两个Hash函数:①SHA-256,②RIPEMD160,经过下面这样的方式构建比特币地址(为何要两次HASH,我也不太清楚,不过我查到的资料说是RIPEMD160有缺陷,不能只用RIPEMD160,具体等看源码再说)。
HASH算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。Hash函数有两个特性:①数据一旦产生哈希值,那么就不可能经过单一的哈希值解出原始的数据。(上面的加密体制只是不知道私钥难解,知道密钥易解,HASH没有密钥,不能解)②独特性,两个不一样的数据是不能产生一样的哈希值,事实上,数据就算改变一个bit,HASH获得的结果也彻底不一样,在bitcoin中,用于验证接收者是否正确(由于比特币的转帐过程,须要输入转帐人的公钥,并用本身的私钥签名(别人能用你的公钥,从这个签名中知道这是你,但不知道你的私钥,方法就是加密的逆过程),从帐单就能知道是你(你本身的私钥签名)转帐给别人(别人的公钥)),此处咱们只关心公钥作HASH用来肯定收帐者地址(转帐,只用知作别人公钥的HASH就好了)。
SHA-256——将公钥转化为256长的bit串 连接给出代码描述
RIPEMD160——将256长的bit串HASH成160长的bit串 自行百度或者bing吧,我打算看源码的时候再看相关实现
在进行Hash处理后,获得的其实只是0,1比特串,如今须要将0,1比特串转化为咱们人可读的形式,人的十个指头衍生出的十进制是如今你们最熟悉的数字运算方式,可是除此以外,数据也能表示成2进制,8进制,16进制,好比11(10进制)=1011(二进制)=13(8进制)=B(16进制),Bitcoin的实现中,用到了BASE58的进制编码方式
BASE64就是64进制了,它的字符表示是:0-9,a-z,A-Z,+,/
BASE58 的字符表示在BASE64的基础上去掉了容易让人误解的0和O,l(L的小写字母),I(i的大写字母),+,/
BASE58_CHECK 是为了在传输过程当中发生错误而加入的验证位,具体验证以下:
prefix就是加在HASH以后160bits字符串的前缀(加此前缀代表使用BASE58_CHECK验证),而从checksum中抽取前面4个字节(共16bits),加在160bits的后面,这样造成的就是BASE58_CHECK形式的编码。
使用编码一是为了人类可读,二是为了传输方便,下图中的前缀声明版本号,是由于,BASE58_CHECK不光用于比特币地址的编码,还用于比特币的其余编码,如私钥的版本号就和公钥不同。
从前面椭圆曲线加密方案中,咱们知道,公钥P(x, y)是椭圆曲线上的一个点,而椭圆曲线是个只含x, y的二元方程,这就意味着,知道x,就能求出y,惟一一点缺陷就是不知道这样求出来的y是正仍是负,这能够在压缩公钥P前,经过指定P的前缀来判断,因而,此时就将P压缩成x,从P(256bits, 256bits)中节省了256bits,这样随着区块链的不断延长,就能节省大量的空间。
可是,压缩毕竟是比特币出来好久才提出的方案,压缩产生的公钥经过HASH获得的地址确定和以前的不同,那以前未压缩下比特币公钥下的比特币地址,就不能经过这种方式找到,为了解决这个问题,引入了“压缩格式的私钥”,实际上并非压缩私钥,而是在私钥的前面加上前缀来标识来识别该私钥对应的公钥为压缩格式的,未加前缀的就默认非压缩格式,这样,比特币的拥有者(非其余人)就能找到本身在那个公钥下的比特币,而其余人的对该帐户的转帐却不受影响。
在最开始比特币的设计中,将比特币的钱包做为一个私钥集合,一次性地生成100个随机密钥,而后一笔交易用一个密钥,这样随着交易的增多,即不利于钱包的转移(将私钥转移)又难维护(私钥安全性),这是最开始的非肯定性(非肯定性指的是随机生成私钥)钱包。
如今是肯定性钱包逐渐取代非肯定性的钱包,这里的肯定性指,经过一个肯定的种子来生成一系列,无穷的私钥,肯定性钱包以下图所示
左图中,密码学上安全的伪随机数发生器须要提供一个熵(这个熵是一串随机数字,这串随机数字越没规律越好,个人理解是能够用普通的随机函数来生成),助记码是为了记住根种子而使用的,只是将跟种子的数字映射为助记码,帮助人记忆而已,经过SHA-512这个HASH函数,512的二进制串,左边256bits对应的密钥生成的公钥,和256bits的编码,在右图的下一次生成私钥时,又做了输入,加索引号的额意义是,索引号有232 =40亿种选择,每一层都能有40亿种选择,我认为能将密钥生成看做无穷,生成私钥的具体缩略图以下。
书中提到了上面那种方式是不安全的,由于公钥是公开的,只要你的父链编码被人知道了,别人很容易地就能知道,那条父链编码下的全部子链,书中给出的改进方案是用私钥替代公钥生成私钥链,这种方式又叫作硬化子密钥,以下图