学习区块链 第一节 精通比特币

刚开始学习区块链,主要是跟着谈老师进行学习,以博客的形式整理思路,记录下每一节学习的内容。

1.创始比特币的动机 

(1)现有银行系统的缺点:

  中心化:数据中心、异地备灾等,缺点易篡改,易产生灾难,易无法服务

  有账户系统:缺点易篡改

  货币发行:由央行负责,货币多发是政府对人民财富掠夺最简单有效的方法

  隐私性:无政府主义者想要拥有更好的财富

(2)比特币的优点:

  去中心化,数万(甚至更多)个节点上运行完整数据拷贝;

  无账户系统,发明UTXO,了不起的发明!

  发行机制:通过coinbase交易发行(coinbase是对矿工的奖励),每4年减半,从50,目前已减至12.5。上限:2100万个,永不超发,且无法超发!

  隐私性:强。你只知道某个地址拥有多少比特币,但并不知道它是谁的。但从监管角度来说可能是一个缺点。

(3)比特币的缺点:

  隐私性强,成为犯罪分子的结算工具,目前贩毒、洗钱等大量采用比特币;

  分布式系统,软件更新困难,目前的扩容之争就是个典型的例子。

2.比特币交易:

Input包含:之前一个output的引用(通过txid和output index(从0开始计数))以及SigScript(签名)

Output包含:pubScript(地址脚本),比特币数量

 每个交易拥有一个hash值,算法

dSHA256 = SHA256(SHA256(transactionbytes))

关于 hash: MD5、SHA-1、SHA-2(比特币采用)、SHA-3(以太坊、hyperledger采用)

 每个地址的余额是通过每个它所拥有的UTXO(没有被花费的output)累加得到的,并没有一个值来说明该地址一共有多少余额。

交易费用:

         所有的input btc总和都多于output btc总和,多于的部分就是交易费用

         一个交易最少的交易费用为0.0001btc,低于此将被矿工拒绝

         交易费将被矿工获得(通过把它们加入coinbase交易中),所有节点会验证这个信息

         矿工按字节和交易费用来优先打包哪些交易

3.矿工

  比特币节点分为:普通完整节点(peer)、矿工节点(miner)和SPV节点

    由矿工打包交易,形成区块链:

        Transaction -> block -> blockchain

  矿工的3个问题:

  问题1:由谁来打包交易?(因为有很多矿工)

         由共识机制POW来决定

         规则:每个区块生成的hash值小于目标值,谁快谁来打包

         Hash的生成     

    算法:dSHA256(headerbytes)

      Header字段:version(4)、prev_block_hash(32)、merkle_root_hash(32)、time(4)、bits(4)、nonce(4):共80字节

   问题2:何时打包交易?

         平均每10分钟出一次块

         矿工算出符合条件的hash就立即出块

         每生成1026块时根据平均出块时间调整一次目标值(调整难度值)

         历史最快出块时间为几秒、最慢出块时间为1个多小时

         同时算出hash如何解决?

                   ·维护2条以上的blockchain,当多个节点认同其中一条就选择那一条

                   ·对比以太坊的叔块

  问题3:如何打包交易?

         矿工会包含尽量多的交易;按交易给予的 交易费和大小 来排序;

   交易数量有上限,每个block不能超过1MB;

  每个块的第一个交易为coinbase交易,没有input,output的地址是矿工的地址(矿工用来接收奖励和交易费),数量是区块奖励(当前为12.5)和所有交易费用的总和;

  用每个交易的txhash生成merkle tree,并生成merkle root hash放在header中;

4.Merkle树

       BT(点对点下载)神器:使用的是merkle树

        为什么使用merkle树?

              支持SPV

    SPV: Simple Payment Verification

      –      区块太大,超过几十G、未来更大;

      –      区块header很小,每个80byte,目前总大小30M+

      –      通过区块头和交易的merkle树来验证交易的一种方式

    SPV实现(完整的验证过程)

      –      SPV客户端持续从连接的节点(一般连接多个节点)上获取新区块的头部,并加入到本地区块链中;

      –      SPV客户端从节点上获取到一个跟自己相关的交易hash值;

      –      SPV客户端从节点上下载包含该交易hash的完整交易merkle树;

      –      重新计算并验证merkle root和头部中的是否一致,若一致则验证通过;

    如何从节点上获取和自己(钱包中管理的公私钥对)相关的交易Hash

            通过 Bloom filter

      Bloom filter

        –      SPV节点在相连节点上注册自己感兴趣的地址(可多个)

        –      当节点通过bloom filter发现和该地址相关交易的时候便通知该SPV节点

5.密码学原理

(1)地址生成

  私钥(prikey)的生成:

    –      随机数,或者通过随机数seed生成;

  公钥(pubkey)的生成:

    –      Pubkey=椭圆曲线函数(prikey,p,q),不可逆;

  比特币地址的生成:

    –      Address=BASE58(RIPEMD160(SHA256(pubkey))),不可逆;

(2)签名原理

  RSA非对称加密原理:

    –      公私钥对;

    –      公钥加密仅私钥能解;私钥加密仅公钥能解;

  比特币交易签名:SigScript

    –      源数据hash;

    –      私钥加密后的密文;

    –      公钥解密密文,与源数据hash比较;

(3)散列算法

  Hash函数特点:

    –      单向,不可逆;

    –      输入改动一点,输出面目全非;

    –      存在碰撞几率(不同公钥地址映射到同一比特币地址);

(4)安全性

  51%攻击

               51%攻击是无解攻击,一半以上的矿工出现问题

  目前算力分布:

  从图中可以看到,如果最大的三家算力加在一起占了51%以上,如果三家联合起来破坏比特币,将是一个灾难。

(5)交易深度和安全性

         交易深度:

    Depth:0,状态为Pending,已处于矿工们的mempool中(即已经被验证过了,可以被接受),即将被打包入块;

      何时被打包入块?取决于给交易给的fee,从几秒到1天以上时间不等;

      交易费的多少和入块速度请参考:http://bitcoinfees.21.co/

    Depth: 1-n ,状态为BUILDING;已经入块,且深度为1-n,n值越大越安全;

      官方建议信任depth为6及以上的确认;到达6后要想再被推翻需要51%攻击;

主要是以笔记的形式记录的,列出的也只是一个框架,没有很详细,请见谅!

原文地址:https://www.cnblogs.com/zhangyongJava/p/7149123.html