1,密码学原理
密码学原理
1,collision resistance
哈希函数 ,目前还是很安全的,没有找到任何不同的内容其哈希是一致的情形。哈希碰撞(这个在数学上面是没法证明的,都是日常的实践表明,无法找到对于不同事物的对其进行哈希运算之后,得到的哈希值是一致的。MD5 被人为制造的哈希碰撞攻破,表明其机制的不安全)
2,hiding(输入空间要足够大,分布要均匀)
单向的 x -> H(x),输入到输出,单向
3,puzzle friendly
事先不知道结果,没有捷径,只能不断的尝试
签名
- 公钥无需保密,比如双方沟通,需要使用对方的公钥加密,然后对方收到加密信息之后使用私钥解密,就可以看到原始信息。
- 公钥相当于银行账号,私钥相当于银行的密码。
- 发起交易,比如我转给张三10个比特币,这个需要使用我的私钥加密,然后将这条消息、秘文、公钥一起广播,别人通过我的公钥解密秘文,如果结果和发布的消息一致,就验证我的身份。
2,数据结构
- 数据结构 哈希指针(要求无环)
- 哈希指针不光存储地址,也要存储哈希值(判定内容是否被篡改)
- Merkle tree(是基于binary tree的改进,使用哈希指针代替了普通的指针)
区块包含
- Block header : 交易的根哈希值
- 宏观信息:比特币的版本协议、指向区块链的前一个指针、整个Merkle tree的根哈希值、挖矿的难度、随机数
- Block body : 交易的列表
节点
- 全节点:保存全部信息验证每一个交易
- 轻节点:无法独立验证(大多数)
Merkle prood
- Merkle proof (从交易体 到根节点的路径)
- 全节点 Block header + Block body
- 轻节点 Block header
轻节点的验证流程
如果验证的过程,人为制造对面那个分支的(H()向全节点请求),想制造哈希碰撞,但是根据collision resistance原则,实际上并不可行。
3,针对电子钱币的传统攻击方式
1,双花攻击
- 定义:将一份带有央行密钥签名的货币复制多份,花费多次。
- 使用 唯一ID,标识每一份央行密钥签名的货币,这样花费的时候就会判定是否花费过。但是,每次花费都需要央行的确认,就相当于中心结构的方式,就不是去中心化的方式了。
- 比特币的产生流程 (防止双花攻击)
A铸币交易的哈希 要和 A转账的哈希要一致,否则无法证明A的币的来源的正确性。
分布式共识
分布式哈希表
- 1,不可能结果 : FLP,即 如果网络传输是异步请求的,网络传输没有上限,如果系统中一个用户是faulthy,那么系统也不会达到共识。
- 异步请求:网络传输时延没有上限。CAP(Consistency、availability、partition tolerance)三者最多只能满足两个
比特币的共识协议
- 存在恶意节点,但是大多数节点是好的。既然大多数节点是好的,发布投票,大家检测其中包含的交易,如果存在非法的交易,投票低点,如果收到的票数达到一半以上,就代表赞成。
问题
- 不能保证所有节点都投票
- 效率(网络延迟)
- 投票(首先需要确立投票权利)
2,女巫攻击
- 定义:创建大量的账号,投票,控制一半以上的账户
- 比特币使用 (计算力)进行投票,即使创建一堆账号,也不能保证计算力的提升
3,分叉攻击 (交易回滚)
4,比特币的实现
UTXO(Unspent Transaction output)
- 为了防止双重支付问题,检测double spending。
- 输入 等于 输出,输入可以来自多个来源,此时需要多个签名。
问题
M具有记账权利,发布一笔交易A转给M10比特币,但是这个是需要A的签名,这个是不可以伪造的。即使将其强制写在区块链上,但是诚实节点不接受这个区块,会沿着上一个节点继续挖掘。
双重支付问题
需要多等几个区块,只有包含自身交易的区块后面的区块越多,说明篡改的难度越大。一般为6个区块。
Selfish mining
自己挖完矿之后,得到一个区块,不是立刻发布,而是继续接着挖,直到自己的链最长,然后同时发出。修改之前的交易。
5,比特币网络
Application layer :Bitcoin block chain
Network layer :p2p overlay network 所有节点的身份地位相同,不存在超级节点(super node/master node),加入比特币网络,需要和种子节点联系,然后种子节点会告诉你他所知道的网络中的其他节点。节点之间使用tcp链接,可以穿透防火墙,退出的时候,不需要任何的操作,当其余节点接收不到你的消息就会将你删除列表。
Simple , robust ,but not efficient
比特币设计的原则是简单、鲁棒而不是高效。使用flooding的方式,当一个节点收到消息之后,会将这条消息转发给相临近的邻居,并且记录这个消息,下次再收到这个消息的时候就不会再次转发。这个邻居的含义不是物理层次的,即中国和中国用户之间转账和中国用户和美国用户之间转账的花费时间是一致的。
有一个大的集合,存储所有等待写入区块链的数据,当一条消息第一次加入集合,需要进行转发给邻居节点,第二次就不转发了,避免无限转发。如果有两笔交易,A->B和A->C分别被不同的节点接收,假设这两笔交易使用的是同一个比特币,接收第一条消息的节点会拒绝接收第二条消息,同样,接收第二条消息的节点会拒绝接收第一条消息。如果交易被写入到区块链中,集合存储的交易就会被删除。假设,A->B这条消息被存储到区块链上之后,那么A->C同样也会被拒绝。
节点每次都会检查内部存储的交易的合法性以及十分处于最长节点。
由于网络的原因,不是所有的节点都会接收到同一笔交易,以及接收到消息的次序不同,以及有的节点不转发消息1 M字节,因为比特币耗带宽。
6,比特币挖矿难度
为什么要控制挖矿的难度,使其每10分钟可以出一个区块?出块速度快不好吗?
- 出块时间很短,那么分叉会成为常态,很有可能会形成一堆的分叉,无止尽。
- 系统的诚实节点越多,系统越来越安全。如果出块时间缩短,会大幅度降低系统的计算能力,容易被51%估计。恶意节点只需要沿着一条链挖矿,很快就会使其成为最长的链条。这个时候甚至不需要51%的算力,就可以做恶。
7,全节点和轻节点
合法性检验
- 验证区块中的每一笔交易是否合法
- 发布的区块是否符合难度要求
- 区块是否在最长的链上
挖矿历程
- CPU
- GPU(通用并行计算)
- ASIC芯片(Application Specific Integrated Cirad)专有芯片,只有使用同一个mining puzzle才可以使用同一个型号的ASIC专属芯片
相关内容补充
- 货币设计的时候采用 ASIC resistance,防止ASIC专属芯片挖矿。
- 趋势:矿池(pool manager全节点驱动很多矿工(miner),矿工只负责哈希运算,剩余功能全部由矿主负责,比如监听是否有人挖出区块,以及分配任务)。
- 参考链接:https://www.odaily.com/post/5135179
8,矿工和矿池
如果你运行一个矿池,你将如何给矿工布置任务和发放回报?
矿池就是通过网络把成千上万的矿工连接起来联合挖矿。原理可以简单理解为:矿池管理员将当前区块目标 Hash指的计算拆分为更为简单的目标值给矿工们,比如区块目标值是需要 Hash 值前面有 70 个 0,矿池管理员会让矿工们去找满足 前面有 50 个 0 的 Hash 值;这样在矿工大量提交的有 50 个 0 开头的 Hash 指里面,有可能能找到有 70 个 0 开头的 Hash 值从而赢得该区块在网络上的打包权和奖励。而矿工的工作量统计就可以通过矿工提交的满足矿池目标 Hash 值的次数来计算。具体回报的发放又可以分为单纯按工作量或者根据矿池实际奖励分红等方式。
矿池的作用是减小单个矿工的收入不确定性,让矿工挖矿能成为一个相对波动比较小的固定收入。但矿池管理员同样会面临非常有挑战的问题:如何合理设计矿池奖励策略、如何面对其他矿池的竞争、如何面对硬件设备的更新换代等。即使这些问题都解决的很好,矿池的获利还要依赖于对 BTC 价格会上涨的假设;如果投资挖矿还不如直接购买 BTC 来的更具投资属性,那还有什么人愿意挖矿呢。这就是被称为 Bitcoin 有可能出现的 “死亡螺旋” 现象:不断下降的 BTC 价格导致挖矿无利可图,矿工们因此而退出挖矿,导致全网算力下降,继而进一步导致价格下跌。
9,匿名性
Privacy:不需要真正的名字,只需要公私钥
- 比特币的匿名性分析:输入地址转化为 付款地址+找零地址,利用UTXO可以将输入地址和找零地址关联起来
- 虚拟账户和现实账户相互关联(资金的转入/转出),支持比特币支付的场所,根据消费记录,将比特币账号和实际的人关联起来。
提高匿名性
- Application layer:将不同的人发起的交易混在一起,(洗钱网站,将钱币发过去,再将别人的币发给我们,有可能会跑路)
- Network layer:洋葱路由
- 区块链的不可篡改性对于匿名性是一个灾难,如果一次交易行为的不当,泄漏了身份,但是由于不可篡改性,无法修改区块。
- 参考链接 https://www.odaily.com/post/5133827
10,零知识证明
定义:是指一方(证明者)向另一方(验证者)证明一个陈述是正确的,但是不需要向其透露除了该陈述是正确的以外任何信息。
零知识证明是一种基于概率的验证方式,验证的内容包括“事实类陈述”和“关于个人知识的陈述”。验证者基于一定的随机性向证明者提出问题,如果都能给出正确回答,则说明证明者大概率拥有他所声称的“知识”。零知识证明系统包括两部分:宣称某一命题为真的示证者(prover)和确认该命题确实为真的验证者(verifier)。证明是通过这两部分之间的交互来执行的。在零知识协议的结尾,验证者只有当命题为真时才会确认。但是,如果示证者宣称一个错误的命题,那么验证者完全可能发现这个错误。
这里我们给出一个有关零知识证明的非常经典的例子,来帮助大家理解:
阿里巴巴被强盗抓住,为了保命,他需要向强盗证明自己拥有打开石门的口令,同时又不能把密码告诉强盗。他想出一个解决办法,先让强盗离开自己一箭之地,距离足够远让强盗无法听到口令,足够近让阿里巴巴无法在强盗的弓箭下逃生。如果强盗举起左手,阿里巴巴就使用口令将石门打开,如果举起右手,就将石门关闭。阿里巴巴就在这个距离下向强盗展示了石门的打开和关闭。如果每次都能正确打开和关闭大门,则证实阿里巴巴确实知道石门的密码。这个整个过程就是零知识证明,即证明者能够在不向验证者提供任何有用信息(石门的口令)的情况下,使验证者相信某个论断(阿里巴巴知道打开石门的方法)是正确的。
11,相关基础内容
同态隐藏
盲签
12,专门为了匿名性设计 零币/零钞
比特币在花费的时候会验证这个币的产生流程,而零币只需要证明这个币没有被花过即可。不可以溯源,无法关联。
13,思考
哈希指针是一种抽象的概念,就其数据结构而言,仍然是哈希,没有指针。使用的是key和value的形式实现的。使用的是levelDB,使用key value从level DB里面关联每一个区块。
14,区块恋 引出 安全性
假设恋人双方一起购买比特币,将私钥256位进行拆分,每人掌握128位,或者合伙人每人掌握一段私钥地址,但是存在一个问题。单独的破解整个私钥需要2的256位数的难度,如果进行截取,只需要破解2的128位,这个破解难度不是对半降低的,因为他们之间的难度是远远大于的关系。
因此,使用多重签名来防范安全。每个私钥都是单独产生的,还具有只需要m中的n份就可以。
15,公链,联盟链,私链的划分
业界对区块链的划分一般从两个角度,一个角度按需要达成的共识范围,分为公链(public),联盟链(consortium),私链(private),另外一个角度是从账本生产者加入的方式,分为无许可链(permissionless),许可链(permissioned),私链(private)。
参考链接
- 无币区块链代表未来?浅谈联盟链以及对 Hyperledger、 Corda、FISCO BCOS 的比较
- 区块链的技术世界观