区块链自问自答 day1
区块链自问自答 day1
简要介绍区块链是什么?
区块链(Blockchain)是一种对等网络下的分布式数据库系统
数据结构中的单向链表是通过每个节点包含一个节点的指针实现”链“结构,区块链中是通过后一个区块包含上一个区块的的信息形成”链“式结构,因此若想修改链中的区块内容就需要同时修改此区块所链接的之后所有区块,导致了想修改链中的区块内容难度巨大,难度随后续链接的区块数量增加。
区块链的结构是什么样的?
区块链中的单个区块结构主要分为两个部分:
- 区块头
- 版本号
- 上一个区块散列值
- 时间戳
- 随机数
- 目标值
- Merkle根
- 区块体
- 交易个数
- 交易信息和Merkle树
# 比特币区块结构
class 区块的数据结构:
神奇数 = 4 byte # 区块之间的分割符
区块大小 = 4 byte # 记录当前区块的大小
数据区块头部信息 = 80 byte # 记录当前区块的头部信息,其Hash值是下一个新区块的参数
class 区块头数据结构:
版本号 = 4 byte # 数据块的版本号
前一个区块的信息 = 32 byte # 记录前一个数据区块的Hash值,当前区块的Hash值一定比它小
Merkle树的根值 = 32 byte # 记录当前区块中所有交易Merkle树根节点的Hash值
时间戳 = 4 byte # 记录当前区块的生成时间,按照Unix时间格式
目标值 = 4 byte # 当前区块生成所达到目标值的特征,用于矿工的工作量证明
随机数 = 4 byte # 当前区块工作量证明的参数
交易计数 = 1~9 byte # 当前区块所记录的交易数
交易详情 = 变长 # 记录当前区块保存的所有交易细节
中本聪最初将区块的容量上限设定为1 MB,1 MB大小相当于平均每秒可以处理7次交易,每一个区块可以容纳4000余次交易。
另外每个区块都有区块高度和区块散列,不过这两个标识并不储存在区块结构中,每个区块只存储父区块的散列,新区块生成后,节点才会计算上一个区块的散列和高度,并将这两个数据维护在单独的表中。
交易中保存了什么信息?
每一笔交易记录包含:
- 交易生成时间
- 引用交易的散列值
- 交易记录索引号
- 比特币支出地址内容
- 支出地址数量
- 。。。。。。
每笔交易记录各自有一个Merkle节点值,是整个Merkle树的一部分,决定了每一个地址都不能重复交易和被伪造。
什么是神奇数?
在比特币区块链中,多个区块存放在同一个文件中,使用神奇数作为区块数据的分隔符。每个区块数据都是以神奇数开始,这个数值在正式网络中是0xD9B5BEF9,测试网络中是0x0709110B。
为什么需要版本号?
一条区块链上的区块随着版本升级会存在不同版本的区块,比特币的版本号2中的Coinbase加入了块高度,这样就保证接下去的每一个块的散列是唯一的,因为每个区块的高度不同直接导致了散列值不同。
什么是Coinbase?
Coinbase是每个区块都有的一笔初始交易,是给矿工挖出此区块的奖励。
什么是散列值?
散列函数(英语:Hash function)又称散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(hash values,hash codes,hash sums,或hashes)的指纹。——维基百科
散列函数的性质:
- 单向性。即不可逆,给定明文可以计算出散列值,但是给定散列值不能计算出明文。
- 抗碰撞。不同明文使用同一种散列函数很难得到相同的散列值。
- 抗篡改。两个不同明文只要有很小的区别,得出的散列值差别也会很大。
- 散列值长度固定。不同散列函数计算出的散列值都是有固定长度的。
比特币中使用什么hash算法?
比特币常用SHA-256是安全散列算法2(Secure Hash Algorithm 2,SHA-2)的一种算法标准,后缀256代表散列值的长度是256bit。在比特币中常连续使用两次SHA256算法处理数据,因此称作double-SHA256。
什么是Merkle树?
梅克尔(Merkle)树是一种散列二叉树,它是一种用作快速归纳和校验大规模数据完整性和数据结构。在比特币中Merkle树用来归纳一个区块中的所有交易,然后生成整个交易集合的数字指纹(散列值,root)。Merkle树还可以高效地校验区块中是否存在某笔交易。
在比特币中Merkle树的叶子节点是每笔交易信息的散列值的散列值,若有一笔交易信息TxA则该笔交易信息在Merkle树中的散列值为Hash(TxA)=SHA256(SHA256))。之后将相邻叶子节点的散列值串联再次进行double-SHA256。循环往复直到计算出最后的Merkle树的根(root),若叶子节点(交易数)为奇数则复制最后一个叶节点,再同偶数形式一样,逐层计算。
为什么要使用Merkle树?
使用Merkle树能够实现中本聪描述的简化支付验证(SPV)这个概念:无须下载每一笔交易以及每一个区块,一个轻客户端(Light Client)仅需下载链的所有区块头,即可确定一笔交易的状态。
通过Merkle树对交易信息进行了压缩,可以快速的确认接受的数据是否是虚假的或损坏的。如从一个节点获取了一笔交易信息,我们就能够向保存了完整区块的可信节点申请传输Merkle计算过程中会使用到的散列值,就能确定这笔交易是否真的存在。
当我们拿到了交易K的数据要验证K是否存在,就只需向全节点请求图中橙色节点散列值,验证流程
KL = hash(K,L)
IJKL = hash(IJ,KL)
IJKLMNOP = hash(IJKL,MNOP)
ABCDEFGHIJKLMNOP = hash(ABCDEFGH,IJKLMNOP)
if ABCDEFGHIJKLMNOP == Merkle root:
return 交易存在
如存在16笔交易信息,需要验证其中一笔交易是否存在只要请求log16=4个散列值即可。因此使用Merkle树结构大大减少了要达到证明数据完整性所需的数据量,减少了维护一致性、数据校验以及数据同步所需的网络I/O数据包大小。
区块链的特点有什么?
区块链具有去中心化、有限透明、分布的可靠数据库、自治性、记录难以更改、准匿名性等特点,其说明如下。
去中心化:区块链数据的存储、传输、验证等过程均基于分布式的系统结构,整个系统中不存在中心化的硬件或管理机构,任意节点的权利和义务都是均等的,系统中的数据块由整个系统中具有维护功能的节点共同维护。
有限透明:系统是开放的,除了交易各方的私有信息被加密外,区块链的数据对所有人公开,任何人都可以通过公开的接口查询区块链数据和开发相关应用。
分布的可靠数据库:区块链系统的数据库采用分布式存储,任意参与的节点都可以拥有一份完整的数据库复制,每一方都可以直接验证交易各方的记录。
自治性:区块链采用一种基于协商一致的规范和协议(如一套公开透明的算法)使整个系统中的所有节点能够在去信任的环境下自由安全地交换数据,这使对”人“的信任变成对机器和算法的信任,无须人为干预。
记录难以更改:一旦信息经过验证并添加至区块链,账户信息就会相应进行更新,记录就再难改变,因为这些信息和此前的所有交易记录相互关联(即术语”链“的来源)。系统中采用的各种计算算法和方法用来确保数据库中的记录是永久存在的、按照时间顺序排序,并且网络中的所有其他人都是可以看到的,除非能够同时控制系统中超过51%的节点,否则单个节点上对数据库的修改是无效的,参与系统的节点越多,数据库的安全性就越高。并且,区块链数据的存储还带有时间戳,从而为数据添加了时间维度,具有极高的可追溯性。因此,区块链的数据稳定性和可靠性极高。
准匿名性:区块链系统采用与用户公钥挂钩的地址作为标识,不需要传统的基于公钥基础设施(Public Key Infrastructure,PKI)的第三方认证中心(Certificate Authority,CA)颁发数字证书来确认身份。通过在全网节点运行共识算法,建立网络中诚实节点对全网状态的共识,间接地建立了节点间的信任。用户只需要公开地址,不需要公开真实身份,而且同一个用户可以不断变换地址。因此,在区块链交易上的交易不和用户真实身份挂钩,只和用户的地址挂钩,具有交易的准匿名性。
区块链自问自答 day1的更多相关文章
- 区块链自问自答 day2
区块链自问自答 day2 区块链的自治性是如何达成的?为什么能够在去信任的环境下自由安全地交换数据? 区块链中有众多的节点,包含了恶意节点.故障节点.正常节点,想要这些节点共同做出一致的决定就需要 ...
- 正本清源区块链——Caoz
正本清源区块链 说明:以下内容整理自Caoz的<正本清源区块链>,如有不妥,请联系我修改或删除. 简介 不讨论炒币!不讨论炒币!不讨论炒币! 本课程内容分为两部分: 第一部分,烧脑篇,介绍 ...
- 一、Bitcoin比特币与BlockChain区块链技术
一.比特币历史 2008 年 10 月 31 日,一个网名叫中本聪(英文翻译过来滴)的家伙发布比特币唯一的白皮书:<Bitcoin:A Peer-to-PeerElectronic Cash S ...
- 001-Bitcoin比特币与BlockChain区块链技术
一.比特币历史 2008 年 10 月 31 日,一个网名叫中本聪(英文翻译过来滴)的家伙发布比特币唯一的白皮书:<Bitcoin:A Peer-to-PeerElectronic Cash S ...
- ICO和区块链区别
区块链项目众筹(ICO)浅析 2017-07-25 原创 Fintech科普大使 ICO是区块链初创公司项目融资的重要方式类似于Kickstarter众筹,但有不同之处(具体在下一节详述),可以避开传 ...
- 远光武汉研发中心区块链事业部Java面试总结
面试在约定的时间准时进行,也是采用腾讯会议远程面试的方式.但是这是我第一次遇到面试官未打开摄像头的情况,后面经过沟通,双方都打开摄像头进行交流. 之前了解这个岗位主要是区块链相关的Java开发,所以事 ...
- 区块链(Blockchain)
一 .什么是区块链? 区块链(Blockchain)是由节点参与的分布式数据库系统[1],它的特点是不可更改,不可伪造,也可以将其理解为账簿系统(ledger).它是比特币的一个重要概念,完整比特币区 ...
- 区块链是伟大的,比特币则不然。《FinTech,金融科技时代的来临》。3星。
本书讲技术给金融业带来的变革和可能的趋势.作者认为区块链是伟大的发明,因为他可以让金融交易免费且实时地进行.比特币则可能会被其他区块链技术取代.书中有至少一半的内容涉及到了区块链和比特币.总体评价3星 ...
- 《区块链:从入门到放弃》之obc安装步骤
obc安装步骤 朋友们可能会好奇,厨师不研究菜谱怎么改研究兵法了,哈哈,我原本是app出身,最近被安排去预研区块链和比特币技术,2个月下来,颇有斩获.期间得到IBM的CC同学指导我一步一步安装obc的 ...
随机推荐
- 创建组件的方法,组件的props属性、state属性的用法和特点,父子组件传值,兄弟组件传值
1.创建组件的方法 函数组件 class组件 1.1 函数组 无状态函数式组件形式上表现为一个只带有一个 `render()` 方法的组件类,通过函数形式或者 `ES6` 箭头 `functi ...
- Gitlab安装过程
sudo yum install -y curl policycoreutils-pythonopenssh-server sudo systemctl enable sshd sudo system ...
- React: React组件创建的三种方式
一.简介 在前面介绍的React组件知识中,对于组件的创建我只是用了其中某一种方式.其实,在2013年React诞生之初,对于React组件的创建,仅仅只有一种方式,也即createClass函数,在 ...
- vue 仿微信朋友圈9张图上传功能
项目需求要求用户上传商品的时候可以一次性上传9张图,多余9张提示‘只能上传9张图’,并且每张图右上角有个删除按钮,图片也可以点击放大. 出来的效果图如下: 话不多说,上代码: <el-form- ...
- 查看某个进程的错误日志 ps axu 结合 grep -i
某台机器的flume报错,想要快速看到报错的内容,可以结合ps axu 和grep -i来实现. 1. ps axu |grep flume 可以看到flume的进程的启动位置. 2. 根据启动的位置 ...
- wpf source path
<Image Source="pack://application:,,,/Images/Folder-icon.png"/> <Image Source=&qu ...
- js使用工具将表单封装成json字符串传到后台,js截取字符串(学生笔记)
<script src="js/jquery.min.js"></script> <script src="https://cdn.boot ...
- Threads(异步和多线程)
Task是.NET Framework4.5出现的,线程是基于线程池的,然后提供丰富的api,Thread方法很多很强大,但是太过强大,没有限制. DoSomethingLong方法如下: /// & ...
- Java 包的使用
Java 包 Java面向对象的核心的概念:类.接口.抽象类.对象:[主体] 包的定义: 指的是一个程序的目录,在最早的时候,如果要开发一个程序,只需要定义一个Java文件,而后在这个文件中编写所需要 ...
- iOS UItableview 镶嵌 collectionView ,cell 自适应高度动态布局
最近在写这个功能,之前看到很多,可是需求一直没有涉及到,大致思路是有的,发现,网上的大部分都有缺陷和bug,我也是好无语啦啦啦,也不晓得是不是升级 了xcode,一样的代码,允许的效果都不一样,,,苦 ...