zoukankan      html  css  js  c++  java
  • 学习区块链 第一节 精通比特币

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

    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%攻击;

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

  • 相关阅读:
    框架源码系列十一:事务管理(Spring事务管理的特点、事务概念学习、Spring事务使用学习、Spring事务管理API学习、Spring事务源码学习)
    框架源码系列十:Spring AOP(AOP的核心概念回顾、Spring中AOP的用法、Spring AOP 源码学习)
    框架源码系列九:依赖注入DI、三种Bean配置方式的注册和实例化过程
    框架源码系列八:Spring源码学习之Spring核心工作原理(很重要)
    框架源码系列七:Spring源码学习之BeanDefinition源码学习(BeanDefinition、Annotation 方式配置的BeanDefinition的解析)
    框架源码系列六:Spring源码学习之Spring IOC源码学习
    框架源码系列五:学习源码的方法(学习源码的目的、 学习源码的方法、Eclipse里面查看源码的常用快捷键和方法)
    框架源码系列四:手写Spring-配置(为什么要提供配置的方法、选择什么样的配置方式、配置方式的工作过程是怎样的、分步骤一个一个的去分析和设计)
    框架源码系列三:手写Spring AOP(AOP分析、AOP概念学习、切面实现、织入实现)
    框架源码系列二:手写Spring-IOC和Spring-DI(IOC分析、IOC设计实现、DI分析、DI实现)
  • 原文地址:https://www.cnblogs.com/zhangyongJava/p/7149123.html
Copyright © 2011-2022 走看看