区块链的相关知识点

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,全节点和轻节点

合法性检验

  • 验证区块中的每一笔交易是否合法
  • 发布的区块是否符合难度要求
  • 区块是否在最长的链上

挖矿历程

  1. CPU
  2. GPU(通用并行计算)
  3. 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 的比较
  • 区块链的技术世界观

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/447164.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用MAC 编译合约的时候报错:

编译报错的显示内容如下: Error: EACCES: permission denied, mkdir /Users/chy/Documents/ipfslearn/ipfs_eth_img/client/src/contracts 最简单的解决方法 原因分析:执行的权限不够 解决办法:升级权限 使用命令 chmod 777 项目的文件夹使…

最新,使用truffle框架之后,安装ipfs的api包文件的命令变化

原因 项目文件路径变化了,不是先前直接在项目文件夹里面直接执行安装ipfs的命令了,需要切换到client文件夹下面执行 路径不对,会出现错误,错误提示如下 切换到正确的路径之后,使用命令 npm install --save ipfs-http-…

通过node 完成简单的web3 API调用测试

使用命令查看当前web3的版本 npm list web3输入命令 node,进入终端 引入web3,使用命令 var web3 require(web3) 查看引入web3的版本 web3.version

LInux学习笔记(四)-----实操排雷

参考书籍:linux就该这么学 4 Vim 编辑器与 Shell 命令脚本 4.1 Vim 文本编辑器(在 Vim 中,无法直接从输入模式切换到末行模式) 4.1.1 配置 Yum 软件仓库 注:书中好像有点问题,第一个 . 改成 /(我是Ubuntu发现原来不能用…

Web3.js 学习

web3.js Web3 JavaScript app APIweb3.js是一个JavaScript API库,一般使得DApp在以太坊上运行web3.js通过RPC调用与本节点通信,用于任何暴露了RPC层的以太坊节点之间通信web3包含了eth对象,即web3.eth(专门和以太坊区块链交互&am…

c语言指针入门

指针的用途非常广泛,比如如果你想通过函数改变一个变量的值,就得用指针而不能用值传递。还有在很多时候变量,特别是对象的数据量实在太大,程序员就会用指针来做形参,只需要传递一个地址就行,大大提高了效率…

搭建基于飞桨的OCR工具库,总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别、竖排文本识别、长文本识别的PaddleOCR

介绍 基于飞桨的OCR工具库,包含总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别、竖排文本识别、长文本识别。同时支持多种文本检测、文本识别的训练算法。 相关链接 PaddleOCR项目地址飞桨开源深度学习平台效果展示页面中文OCR在线体验地…

macos 10.15 django2.2+apache2.4+ladon+wsgi写webseverice接口

他的文档不够完善,使用起来可能有坑,因为不知道如何将ladondjangoapache绑定在一起使用,所以放弃了。 提醒:最好用个虚拟环境,防止库冲突我使用的是anaconda 安装apache macos本身自带apache,其他平台百度…

基于HubServing的PaddleOCR部署

前提要求 服务器的部署需要鉴于先前安装配置的docker环境,因此相关步骤查看我之前的博客 参考链接 服务部署 先前介绍 参考链接 官方推荐本博客采用基于HubServing的部署,这种方式已经集成到PaddleOCR里面,在先前的docker镜像里面就可以…

我的职业生涯规划学习日记(软件工程)整理时间线

学习路线 语言只是工具不过学c一直都做不出来东西是为什么呢,下图要第六部才做项目 概述 大一上学期:C,C,数据结构,cstl源码,python爬虫进入物联网实验室python方向,进入算法协会运维部学习算…

PaddleOCR和ChineseOCR的对比

PaddleOCR和ChineseOCR的对比 ChineseOCRPaddleOCR 对比 识别时间 chineseOCR识别的速度相对于PaddleOCR较慢,单纯使用CPU对于单张图片的识别时间可以达到20秒,如果使用GPU识别的时间一般控制在5秒以内(图片包含的文字比较少的情形&#x…

C++内存管理(1)

根据侯捷老师的视频:https://www.bilibili.com/video/BV1Kb411B7N8 这篇文章归纳内存管理的面试题和一些知识点梳理 正在更新中 首先为什么想要内存管理 不知道有没有人好奇delete[]或者delete的时候为什么系统会自动这个变量 占了多少字节。 答案是因为cookies&a…

Linux学习笔记(一)------实操排雷

参考兄弟连b站网课 1.1如果没有ifconfig 使用sudo apt install net-tools 下载;(ifconfig已经被淘汰所以需要另外下载) 1.2如果网卡是ens33; (1). vi /etc/sysconfig/network-scripts/ifcfg-ens33 将里面的…

Dapp简单的投票小例子

准备工作 相关命令 mkdir simple_voting_dapp //创建文件夹cd simple_voting_dapp //进入文件夹npm init //初始化npm包管理文件,输入ls 可以看到创建的package.json文件npm intsall web30.20.1 //安装web3npm install solc0.4.25 //安装solcnpm install -g ga…

使用mocha进行测试 区块链

mocha安装 npm install mocha --save-dev mocha简介 mocha是一个JavaScript的单元测试的框架,既可以运行在浏览器环境中,也可以运行在node.js环境中,只需要编写测试用例,mocha就会将测试自动的运行,并且给出测试的结…

Linux学习笔记(六)

参考书籍:linux就该这么学 6.存储结构与磁盘划分 6.1 文件系统与数据资料 6.2 挂载硬件设备 6.2.1 mount 命令用于挂载文件系统 6.2.2 umount 命令用于撤销已经挂载的设备文件 6.3 添加硬盘 6.3.1 fdisk 命令用于管理磁盘分区 6.3.2 用于查看文件数据占用量的 du 命…

实现Linux系统外部和容器内部的文件传输

主机和容器之间进行文件传输,需要使用容器的ID即可 获取方法如下 输入指令 docker ps -a只需要CONTAINER ID传输命令 docker cp 本地文件路径 容器ID:容器的路径将文件从容器拷贝到本地的原理是一致的,只需要将对应路径的位置进行更换即可

Linux学习笔记(五)

参考书籍:linux就该这么学 5 用户身份与文件权限 5.1 用户身份与能力 强烈推荐大家在学习时使用 root 管理员权限!因为在 Linux 的学习过程中如果使用普通用户身份进行操作,则在配置服务之后出现错误时很难判断是系统自身的问题还是因为权限不…

清除Docker的占用空间问题

使用命令查看磁盘的空间 docker system df ,类似于Linux的df命令,用于查看Docker使用的磁盘空间Docker镜像占据了4.789GBDocker容器占据了348BDocker数据卷占据了0B 执行删除命令 docker system prune命令可以用于清理磁盘,删除关闭的容器、…

区块链的完整流程 自动化执行代码

通过npm script机制, 在package.json文件中,输入对应的代码,就可以自动化执行相关的函数使用npm run test执行package.json中的内容,因为package.json包含test,所以可行,但是使用npm run compile会报错