区块链技术与应用(1)

文章目录

    • BTC-密码学原理
        • hash function
        • 签名
    • BTC-数据结构
        • hash pointers
        • Merkle tree
          • Merkle proof
            • proof of membership
            • proof of non-membership
    • BTC-协议
        • 防范双花攻击
        • 分布式共识协议
    • BTC-实现
        • UTXO
        • 挖矿
        • ==一些讨论==
    • BTC-网络
    • BTC-挖矿难度
    • BTC-挖矿
        • 全节点VS轻节点
        • 矿主
    • BTC-脚本
        • 交易结构
        • 脚本
        • Proof of Burn
    • BTC-分叉
        • hard fork
        • soft fork
    • BTC-匿名性

BTC-密码学原理

hash function

BTC中的hash function是SHA-256
cryptographic hash function 特性:

  • collision resistance
    并不是不允许发生碰撞,而是制造这样的碰撞的难度非常高,只能用暴力求解(brute-force)的方式。但是没有办法去证明一个函数是collision resistance的。
    用处:用来检测一个message的digest,没有办法篡改内容而不被检测出来
  • hiding
    x -> H(x),知道了hash值,但是没法反推出来x。并且输入空间要足够大并且输入比较均匀。如果输入空间没有足够大,那么就在输入之后拼接nonce。

前两个性质叠加在一起可以实现digital commitment,digital equipment o f sealed envelope,将预测结果取hash,hash值可以公开,因为无法得到输入x,之后还可以验证结果是否准确

  • puzzle friendly
    找nonce, nonce和block header的其他信息结合起来作为输入,使其小于target。

签名

去中心化的开账户:创建公钥私钥对,非对称的加密体系,加密用的是收方的公钥,解密用的是收方的私钥。
签名用的是自己的私钥,别人验证签名用的是公钥

BTC-数据结构

hash pointers

哈希指针和普通指针的区别:普通的指针存储的是一个结构体的位置,哈希指针不仅存储位置,还存储这个结构体的哈希值。这样做的好处:不仅可以找到位置,还可以检测该结构体有没有被篡改。
区块链:用哈希指针将结构体连接起来的链表。只要存储最后一个区块的哈希值,就可以检测整条链上的区块有没有被篡改
区块链中的箭头:代表的是该区块的哈希值依赖指针指向的区块

Merkle tree

区块链中的每个区块包含的交易组成了Merkle tree的形式
区块链技术与应用(1)_第1张图片
Block header中存储的就是Merkle root hash,可以检测整棵树有没有地方被修改。block body中有交易的列表。
Merkle tree的用处是提供Merkle proof.

Merkle proof

比特币中的节点包括全节点和轻节点,全节点包括block header和block body,里面有交易的所有内容,轻节点里面只有block header。所以如果向轻节点证明一个交易上链了,就用Merkle proof。轻节点向全节点请求证明一个交易tx,那么全节点会发给轻节点红色的哈希值,轻节点再在本地计算绿色的哈希值,最后计算出来根哈希值和轻节点block header中的哈希值进行比较。

proof of membership

区块链技术与应用(1)_第2张图片

proof of non-membership

将叶节点取哈希值,然后排序,证明两个叶节点是相邻的,这样待证明的交易就不可能插入

BTC-协议

防范双花攻击

可以查看这篇博客双花攻击分析
BTC中主要解决的问题就是双花攻击
双花攻击要注意的问题是在该区块所在的分支上进行判断
区块链技术与应用(1)_第3张图片
这里的哈希指针有两种,一种是连接区块的指针,还有一种是指明币的来源
首先要说明每笔交易都有输入和输出,输入是付款方的签名和公钥(签名包括UTXO的部分信息),输出是一个脚本,里面含有收款人的公钥
A给B转钱主要要验证两个问题:
确实是A转的钱(验证A的签名)
A确实有这笔钱(验证A的公钥和币来源的那笔交易的输出的公钥是否能对上)

分布式共识协议

女巫攻击:用简单投票的方式,恶意节点可以产生多个账户来攻击
所以区块链中采用算力投票
一个区块发布之后会广播给其他节点,如果该区块的高度并不是最高,那么其他节点不会沿着该区块挖
矿工挖矿的动力:用铸币交易(coinbase transaction)来获得block reward,刚发行的时候每发行一个区块可以获得50BTC,每21万个区块减半

BTC-实现

UTXO

比特币是transaction-based ledger,全节点维护UTXO,UTXO中的每个元素给出的是交易的输出的哈希值,以及该元素是这笔交易中的第几个输出。一笔交易可能有多个输入,也会有多个输出,但是总输入和总输出满足如下关系:
t o t a l i n p u t s ≤ t o t a l o u t p u t s total inputs \leq total outputs totalinputstotaloutputs
这是为了防止某些自私的矿工只打包自己的交易采取的除block reward之外的第二种奖励机制,也就是交易费(transaction fee),交易费目前比block reward少多了,但是随着block reward越来越少,交易费在之后可能就成为主要的了。

挖矿

挖矿的时候需要调整nonce域,但是nonce只有32bit,所以也需要调整其他域,对merkle tree root进行调整,因为这棵树包含了coinbase transaction,这个交易没有输入,有一个coinbase域,这个域里面可以写任何内容 ,因此coinbase中的前八个字节作为extra nonce。真正挖矿的时候是有两层循环,外层循环调整coinbase,内层循环调整nonce。

一些讨论

  1. 诚实的节点占大多数
  • 可以盗币(该节点是M,发布A->M交易)吗
    不可以盗币,因为不知道对方账户的密钥
  • 能发动双花攻击吗
    不能发动双花攻击,因为比特币中要等待6个确认,而恶意的节点算力不够
  1. 恶意的节点占大多数
  • 可以盗币(该节点是M,发布A->M交易)吗
    不可以盗币,因为不知道对方账户的密钥
  • 能发动双花攻击吗
    可以发动双花攻击,恶意的节点算力足够。
    并且恶意节点可以进行selfish mining,目的是浪费诚实节点的算力
  • 能对某个账户进行禁运吗
    可以对某个账户进行禁运

BTC-网络

比特币网络的底层是P2P Overlay Network,用的是TCP通信
消息传递采用的是flooding的方式,每个节点第一次收到消息时发送给邻居节点,之后将不再转发重复的交易信息。每个节点会维护一个将要上链的交易集合,如果该节点没有挖到矿,那么将删除本地集合中已经上链的交易。
区块传递和消息传递的方式类似,区块大小有1M限制,因为传递非常耗用带宽

BTC-挖矿难度

H(block header) <= target
挖矿难度公式:
difficulty = difficulty_1_target / target
difficulty_1_target是挖矿难度为1时的目标阈值,是一个非常大的数,说明非常好挖。
为什么要调整挖矿难度:因为系统中算力越来越强,这样出块时间会越来越短,分叉会很多。调整挖矿难度就是调整阈值,每隔2016个区块调整一次,平均出块时间为10min,也就是每隔14天调整一次,调整公式为
target = target * (actual time / expected time)
actual time就是前2016个区块实际的挖矿时间

BTC-挖矿

全节点VS轻节点

区块链技术与应用(1)_第4张图片
区块链技术与应用(1)_第5张图片

矿主

一个矿主管理多个矿工,矿主获得出块奖励之后分给矿工,矿主从中抽取一部分管理费。矿工可以尝试nonce来获得share。矿主把nonce值分成几个部分交给不同的矿工,因此矿工即使尝试出来nonce也不可以独自发布区块。而且header中的coinbase transaction的收款人是矿主的地址。有些矿主可能为了发动51攻击故意降低管理费来吸引足够多的矿工,所以这是大型矿池的弊端。

BTC-脚本

交易结构

区块链技术与应用(1)_第6张图片

区块链技术与应用(1)_第7张图片

脚本

区块链技术与应用(1)_第8张图片
就是将输入来源的那笔交易的输出脚本和输入脚本进行验证,验证方式有如下几种,均为栈执行,先执行输入脚本,后执行输出脚本,如果能顺利执行返回true,那么验证通过:

  • P2PK(Pay to Public Key)
    用公钥检查签名
    区块链技术与应用(1)_第9张图片
  • P2PKH(Pay to Public Key Hash)
    该方式最常用,和P2PK不同的区别是公钥在输入脚本中给出,输出脚本是给出公钥的哈希
    区块链技术与应用(1)_第10张图片
  • P2SH(Pay to Script Hash)
    和之前两种的区别在于输出脚本中给出的是一个脚本的哈希,而输入脚本中给出了一段脚本
    区块链技术与应用(1)_第11张图片
    input script中给出一些签名(数目不定)和一段序列化的redeemScript,验证分为两步:
    验证序列化的redeemScript是否与output script中的哈希值匹配?
    反序列化执行redeemScript,验证input script中给出的签名是否正确

    redeemScript的形式可以有P2PK,P2PKH和多重签名,而P2PK和P2PKH不需要如此复杂的验证过程,所以P2SH的主要应用是在多重签名。
    多重签名是输出中有N个公钥,要求有M个签名(M<=N)即可。最早的多重签名的实现方式是在输入脚本中有多个签名,输出脚本中有多个公钥,但是这样做会使得生成交易时填写输出信息过于复杂,因此用P2SH来实现多重签名。
    区块链技术与应用(1)_第12张图片
    将繁琐的收款人的公钥都填写在RedeemScript中,而收款人只需要公布RedeemScript的哈希值即可,给付款的用户带来了极大的方便。

Proof of Burn

指的是输出脚本中有一个return语句,假如一个交易的input指向这个output,不论input script如何设计,执行到return指令之后都会直接返回false,所以这个output无法再被花出去,其对应的UTXO也可以剪枝了。这个脚本的应用场景为销毁一定的比特币,还有就是往区块链中写入一些内容,在return语句之后。

BTC-分叉

比特币中的分叉分为state fork和protocol fork,state fork就是普通的同时挖到矿或者进行分叉攻击时产生的分叉,而protocol fork是因为比特币中协议造成的分叉,分为hard fork和soft fork。

hard fork

假如现在比特币系统做了升级,将区块大小的限制由1M改成了4M,系统中的大多数节点(掌握着大量算力)都升级了软件,而小部分的旧节点没有升级,所以并不会认可4M的区块。现在在原来的区块链上,一个新节点发布了一个4M大小的区块,新节点均认可该区块,所以会沿着该区块继续挖,而且新节点的算力较强,所以这条链会成为最长合法链。而旧节点不认可该区块,所以产生分叉,之后的旧节点就会一直在该链上挖,这条分叉就会一直存在。

soft fork

假如现在比特币系统将区块大小的限制由1M改成了0.5M,系统中的大多数节点都是新节点。现在新节点挖出一个小区块,旧节点挖出一个大区块,出现分叉,新节点所在的链是最长合法链,但是旧节点可以承认该链,所以旧节点的那条分叉只会暂时存在。
软分叉出现的例子:交易中出现一些新的域;P2SH(旧节点只做第一阶段的验证)

BTC-匿名性

BTC的匿名性在什么场景下会被破坏?一个人用比特币支付的时候和现实世界关联起来的时候,还有就是比特币是一个公开的账本,所有人都可以查询这个账本,不像银行。如何提高比特币的匿名性呢?
区块链是两部分组成的,要保证匿名性既要保证网络层的匿名性,也要保证应用层的匿名性。保证网络层匿名性的方法有很多,比如多路径转发。保证应用层的匿名性,比如coin mixing,或者在线钱包。

你可能感兴趣的:(区块链)