BTC-密码学原理
比特币本质:crypto currency[加密货币]
比特币用到的两个功能:
1.哈希 crypto graphic hash function
2.签名(非对称加密)
哈希cryptographic hash function 三个重要性质
1.Collision Resistance 抗碰撞性 2.hiding 藏匿
3.puzzle-friendly 谜题友好性
1.Collision Resistance 抗碰撞性
其中的collision 是指“哈希碰撞”即输入x≠y,也可以使得H(x)=H(y) 也即不同的输入映射到哈希表中的同一位置。而实际上这种collision哈希碰撞很难被人工创造,给定m,可以得出H(m)但很难找到m'使得H(m')=H(m)
特性实践:文件下载/上传的验证
将这个文件作为input的哈希值,与服务器上的哈希值进行比较
2.hiding 藏匿(单向不可逆性)
x-->H(x) <====> 即给定一个x,可计算得H(x)但是给定一个H(x)无法计算x(除非蛮力破解) H(x)-->x
条件:输入空间尽可能大、分布尽可能均匀
collision resistance + hiding ===> digital commitment(or digital equipment of sealed envelope)
先公布H(x),待揭晓后公布x,因为H是可知的通过求H(x)即可知x是否被串改
3.puzzle-friendly 谜题友好性
哈希值的计算是不可预测的,而如果想要H(x)落在某个范围内没有什么好办法只能一个一个去试试 挖矿:试随机数nonce使得H(block header) =< target -------------------------------------------------------- |////////////| -------------------------------------------------------- | target space diffcult to solve but easy to verify pow 工作量证明 比特币用的哈希函数:SHA-256 (secure hash algorithm)
哈希函数特性:
签名(public key ,private key)
加密用的是公钥、解密用的是私钥 1.对称的symmetric加密方式 A.使用私钥加密----------> B.使用私钥解密 同一把 缺点:私钥的分发不是很方便 2.非对称的asymmetric encry
加密用的是公钥、解密用的是私钥 1.对称的symmetric加密方式 A.使用私钥加密----------> B.使用私钥解密 同一把 缺点:私钥的分发不是很方便 2.非对称的asymmetric encryption
在比特币区块链中,私钥代表了对比特币的控制权。交易发起方用私钥对交易(包括转账金额和转账地址)签名并将签名后的交易和公钥广播,各节点接受到交易后可以用公钥验证交易合法。在这个过程中交易发起方无需暴露自己的私钥,从而实现保密目的。
比特币交易实现:签名
A要转10个比特币给B,A将转账信息发布在公网上,如何实现?
参考文章:
[Cryptographic Hash Functions - Hiding]
BTC-数据结构
哈希指针Hash Pointers
1.普通指针:存放结构体的起始位置内存地址
2.哈希指针:存放结构体的哈希值H(结构体) (从而检测其内容是否被串改)
Block chain is a linked list using hash pointers
小型区块链示例:
通过这种数据结构可以实现tamper-evidenct log(牵一发而动全身)
比特币示例图:
默尔克树Merkle Tree
merkle tree is binary tree
Tx:在比特币中每个数据块其实就是一种交易tx(transaction) 。
节点:节点指的是区块链网络中的计算机、包括手机、矿机、服务器等等。
Merkle优势:只要存储root hash 就能检查出任意节点的是否被篡改。
全节点 full node: 保存block header 和 Block body
轻节点 light node:手机上的比特币钱包、只存放block header
每个区块分为两个部分
1.Block header 块头 有根哈希值没有交易具体记录
2.Block body 块身 有交易列表
问题:向轻节点证明某个交易是否写入区块链?
Merkle Tree 的作用: 提供merkle proof:
问题: 1.proof of membership/proof of including如何证明、即上复杂度为O(log(n)) n:假设这根树有n个数据块 2.proof of non-membership 方法是遍历、复杂度为O(n) 但是可以对叶节点按哈希值进行排序,用二分法对两个相邻的数据块分别向上取哈希直到root hash并验证,复杂度为O(log(n))这种Tree称为sorted merkle tree (比特币没有用)
BTC-协议
比特币的共识协议
问题:央行CB如何发行数值货币?
方案1:asymmetric encryption algorithm
支付即复制是否可以====>不可以 Double Spending Attach 双花攻击
方案2:有一张表记录每一张货币的主人,在交易前验证这张数字货币是否是支付人
可以,但是这种方案是中心化的
去中心化即将验证的职责从央行承担改为大众承担
数字货币发行需要解决的两个问题
1.谁有权力发行
2.怎么验证交易有效性防止双花攻击
1.怎么验证交易有效性:
解决方案:block chain
两类hash pointer :1.块与块之间的 2.指向币的来源的
数值货币交易包括input和output:
input:说明币的来源和支付人的公钥
output:说明支付给到的人(B&C)的公钥
2.几个问题:
1.转账交易中,A支付人需要知道B收款人的什么信息? A需要知道B的地址。这个地址是由B的公钥经过一定计算得出 2.在转账交易中,B收款人需要知道A(支付人)什么信息? B需要知道A的公钥,即知道A的身份所有的节点都需要知道A的公钥进行验证。 3.如果有个B'宣称自己是A,使用A的公钥发起交易如何防范?
4.如何将交易信息写进区块链? 账本的内容需要取得分布式的共识(distribute consensus) case:分布式哈希表(distribute hash)即许多节点共同维护
FLP impossiblity result(不可能结论):
在一个异步(asynchronous)系统里网络传输延迟没有上限哪怕系统中有一个成员faulty也无法达成共识
FLP给出一个惊人的结论:在异步通信场景,即使只有一个进程,也没有任何算法能保证非失败进程达到一致性!
CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。
consensus in bitcoin 比特币共识协议:pow工作量证明
需要解决的问题:系统中有部分节点是恶意的
思路:过半数同意
问题:membership--->谁有投票权
hyperedger fabric 联盟链
sybil attach 女巫攻击
Sybil Attack可译作女巫攻击。Douceur首次给出了Sybil攻击的概念,即在对等网络中,单一节点具有多个身份标识,通过控制系统的大部分节点来削弱冗余备份的作用。同时,提出了一种使用可信证书中心来验证通信实体身份以防止Sybil攻击的方案,这种解决方案显然不适用于传感器网络.Newsome系统分析了Sybil攻击对传感器网络诸多功能(包括路由、资源分配和非法行为检测等)的危害,对Sybil攻击进行了科学的分类,提出了运用无线资源检测来发现Sybil攻击,并使用身份注册和随机密钥分发方案建立节点之间的安全连接等方法来防止Sybil攻击。
工作量证明机制的运作过程
分叉攻击
为什么要挖矿
mining挖矿
block reward 出块奖励 coinbate tx 唯一一个产生新币的途径
50BTC------>25BTC------>12.5BTC----->......每21万个区块减半
BTC-实现
区块链:去中心化账本
比特币:基于交易的账本模式 transaction based ledger
以太坊:eth 基于账户的模式 account based ledger
UTXO:unspent transaction output
A------>B(5BTC)------->花掉,不在UTXO里面
|____C(3BTC) 未花费,在UTXO里
什么是UTXO
在比特币钱包当中,我们通常能够看到账户余额,然而在中本聪设计的比特币系统中,并没有余额这个概念。“比特币余额”是由比特币钱包应用派生出来的产物。中本聪发明了UTXO交易模型,并将其应用到比特币当中。
UTXO(Unspent Transaction Outputs)是未花费的交易输出,它是比特币交易生成及验证的一个核心概念。交易构成了一组链式结构,所有合法的比特币交易都可以追溯到前向一个或多个交易的输出,这些链条的源头都是挖矿奖励,末尾则是当前未花费的交易输出。
基于账户的交易
我们先看下传统的交易是如何进行的:我们设计一个支付系统,给张三一个账户,里面有余额100 元,李四有一个账户,里面有余额50元。当张三要付给李四20元时,做以下操作:
1. 检查张三账户余额是否充足,如果不足20元就终止交易,向张三报“余额不足”
2. 在张三账户里减去20元(假设零手续费)
3. 在李四账户里增加20元
现在的银行也好、信用卡也好、证券交易系统也好,互联网第三方支付系统也好,其核心都是基于账户(account based)的设计,由关系数据库支撑。
基于UTXO的交易
要理解UTXO,最简单的办法就是把一枚比特币从诞生到在商海中沉浮的经历描述一下。我们假设一个这样的场景:张三挖到12.5 枚比特币。过了几天,他把其中 2.5 枚支付给李四。又过了几天,他和李四各出资 2.5 比特币凑成 5 比特币付给王五。
比特币的区块链账本里记录的是一笔又一笔的交易。
每笔交易都有若干交易输入,也就是资金来源,也都有若干笔交易输出,也就是资金去向。一般来说,每一笔交易都要花费(spend)一笔输入,产生一笔输出,而其所产生的输出,就是“未花费过的交易输出”,也就是 UTXO。
比特币交易遵守几个规则:
第一,除了 coinbase交易之外,所有的资金来源都必须来自前面某一个或者几个交易的 UTXO,就像接水管一样,一个接一个,此出彼入,此入彼出,生生不息,钱就在交易之间流动起来了。
第二,任何一笔交易的交易输入总量必须等于交易输出总量,等式两边必须配平。
上图第一个交易#1001 号交易是 coinbase 交易。比特币是矿工挖出来的。当一个矿机费尽九牛二虎之力找到一个合格的区块之后,它就获得一个特权,能够创造一个 coinbase 交易,在其中放入一笔新钱,并且在交易输出的收款人地址一栏,堂堂正正的写上自己的地址。假设这笔比特币的数额为12.5 枚,这个coinbase 交易随着张三挖出来的区块被各个节点接受,经过六个确认以后永远的烙印在历史中。
过了几天,张三打算付 2.5 个比特币给李四,张三就发起#2001号交易,这个交易的资金来源项写着“#1001(1)”,也就是 #1001 号交易——张三挖出矿的那个 coinbase 交易——的第一项 UTXO。然后在本交易的交易输出 UTXO 项中,把2.5个比特币的收款人地址设为李四的地址。
请注意,这一笔交易必须将前面产生那一项 12.5 个比特币的输出项全部消耗,而由于张三只打算付给李四 2.5 个比特币,为了要消耗剩下的10比特币,他只好把剩余的那 10 个比特币支付给自己,这样才能符合输入与输出配平的规则。
再过几天,张三和李四打算AA制合起来给王五付 5 枚比特币。那么张三或李四发起 #3001 号交易,在交易输入部分,有两个资金来源,分别是#2001(1) 和 #2001(2),代表第 #2001 号交易的第 (1) 和第 (2) 项 UTXO。然后在这个交易的输出部分里如法炮制,给王五5比特币,把张三剩下的 7.5 比特币发还给自己。以后王五若要再花他这5比特币,就必须在他的交易里注明资金的来源是 #3001(1)。
所以,其实并没有什么比特币,只有UTXO。当我们说张三拥有 10 枚比特币的时候,我实际上是说,当前区块链账本中,有若干笔交易的 UTXO 项收款人写的是张三的地址,而这些 UTXO 项的数额总和是 10。而我们在比特币钱包中所看到的账户余额,实际上是钱包通过扫描区块链并聚合所有属于该用户的UTXO计算得来的。
两种交易方式对比
1.UTXO只需要看最后一次交易,而账户系统要看历史全数据后所有的增减操作全部加起来才能获得正确的余额,两者效率差异随着时间推移会越来越大;
2.UTXO未来可以裁剪历史老数据,而账户系统则不能丢弃老数据,前者区块链可以控制住整体大小,而后者只能持续膨胀。
一点思考
比特币规定每一笔新的交易的输入必须是某笔交易未花费的输出,每一笔输入同时也需要上一笔输出所对应的私钥进行签名,并且每个比特币的节点都会存储当前整个区块链上的UTXO,整个网络上的节点通过UTXO及签名算法来验证新交易。
现实中的比特币交易
挖矿的过程的解释
每次挖矿过程就是一次bernoulli trial: a random experiment with binary outcome
每次试nonce求解构成bernoulli process :(无记忆性) a sequence of independent bernoulli trial
实验次数很多,每次实验的成功率很低======>>>poisson process
挖矿并不是解决数学题,挖矿难度是人为设定的
比特币总量:
21万x50BTC+21万x25BTC+21万x12.5BTC+...... =21万x50BTCx(1+1/2+1/4+......) =21万x50x2 =2100万个
bitcoin is secured by mining
问题:假设大部分算力掌握在诚实的节点手里,可否保证所有写入区块都是合法的?
BTC-网络
BTC-挖矿难度
如果有意识的节点不调整代码中的target怎么办?
如果不调发布的区块,诚实的矿工不会认可,在block header中有个nbits是target编码版本
比特币系统的实际情况
BTC-挖矿
复习:
BTC-比特币脚本
比特币实例
proof of burn
BTC-分叉
硬分叉:
软分叉
BTC-问答
BTC-匿名性
比特币匿名性没有我们想象的那么好 bit coin and anonymity pseudonymity
BTC-思考
ETH-以太坊概述
ETH-账户
ETH-状态树
ETH-交易树
交易树:每次发布新区块时,区块中的交易组织成交易树,都是input
作用:
1.提供merkle proof
2.支持更复杂的查询操作------>e.g 支持查找过去10天和某个智能合约的相关交易
解决方案:
引入bloom filter 数据结构 有可能出现false posintere 而不会出现false m
ETH-收据树
收据树:每个交易执行完成会形成一个收据,记录该交易的相关信息
ETH-GHOST
ETH真实情况
ETH-挖矿算法
代码实现(python)
ETH-难度调节
ETH的统计数据
ETH-权益证明
pos:proof of stake
ETH-智能合约
ETH-THEDAO
ETH-反思
ETH-美链
ETH-总结
参考资料