刚开始学习区块链,主要是跟着谈老师进行学习,以博客的形式整理思路,记录下每一节学习的内容。
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%攻击;
主要是以笔记的形式记录的,列出的也只是一个框架,没有很详细,请见谅!