Web3.0 - 区块链

Web3.0 - 区块链

最近在学习web3.0相关知识,权且做些笔记。

1. 相关概念

什么是区块链呢?

简单地回答 --- 区块链就是一个又一个区块组成的链条。

专业一点回答这个问题:

  • 狭义上讲:区块链是一种将数据区块按时间顺序相连的链式、不可篡改和不可伪造的分布式账本。
  • 广义上讲:区块链是一种按照时间顺序将若干数据区块相连的链式、无中心、不可篡改、不可伪造、集体维护、全程留下痕迹、交易可以追溯的分布式账本(数据库)

区块链是一个建立在P2P网络上的分布式数据库,区块链使用密码技术链接,由共识确认的,按时间顺序追加的 分布式账本。

2. 区块链特点

去中心化、自治、安全(数据不可篡改)、匿名性

3. 密码学相关原理

比特币叫做加密货币,但是实际上是”不加密“的,包括转账等操作都是公开的。

区块链的密码技术有数字签名算法哈希算法

数字签名算法是数字签名标准的一个子集,表示了只用作数字签名的一个特定的公钥算法;

而哈希算法是将任意长度的二进制明文映射为较短的二进制串的算法,并且不同的明文很难映射为相同的Hash值。

3.1 hash function

密码学中的hash算法/函数,被称为 cryptographic hash function。它有3个重要性质:

  1. 哈希碰撞(collision resistance)。哈希碰撞不可避免,但是很难认为制造出碰撞来。

    比如说,有2个不相同的x和y,Hash(x) = Hash(y),这就是哈希碰撞。但是很难反过来根据Hash(x) 去求出y值来。

    利用这个性质,可以用来计算一个message的digest,比如hash(m)=d,如果m被人篡改了,那么hash(m)肯定发生变化。

  2. hiding。

    hiding是说哈希函数的计算过程是单向的,是不可逆的,给定一个输入x,可以算出他的哈希值H(x)。但是从哈希值没法反推出原来的输入x。也就是说这个哈希值没有透露有关这个x的任何信息。当然暴力求解还是有可能反推出来的。所以hiding这个性质的前提是输入空间足够大,大道暴力无法求出来。

  3. puzzle friendly

    他的意思是说哈希值的计算事先是不可预测的,如果你预测它落在那个范围之内,没有好办法,只能一个一个去试一下。

    比特币的挖矿,实际上就是找一个nonce,nonce和区块头的其他信息一个座位输入,算出一个hash值,这个hash值要小于等于目标阈值。puzzle friendly就是说这个挖矿的过程没有捷径,只能不停的试大量的nonce才能找到符合要求的解,所以这个过程才可以被用来做工作量证明,叫做proof of work(POW)。你挖到矿了找到符合要求的nonce一定是因为你做大量的工作,其他没有捷径。

    但是有人找到这个nonce,发布出去,其他人验证是不是符合要求很容易,只有算一次哈希值就行了。

    挖矿很难,验证很容易。(difficult to solve ,but easy to verify)

比特币中用的哈希函数叫作SHA-256(secure hash algorithm )以上三个性质它都是满足的。

3.2 签名

在比特币系统中开账户:在本地创立一个公私钥匙对(public key ,private key),这就是一个账户。开户过程不需要任何人审批!

公私钥匙对是来自于非对称的加密技术(asymmetric encryption algorithm)。公钥相当于银行卡账号,私钥相当于密码。向别人转账,需要知道别人的公钥。

理论上来说,有可能产生相同的公私钥对,但这也仅仅是理论。实际上这种概率微乎其微。产生公私钥的过程是随机的,需要选择好的随机源。

假如A想向B转10个比特币,A把交易放在区块链上,别人怎么知道这笔交易是A发起的呢?这就需要A要用自己的私钥给交易签名,其他人收到这笔交易后,要用A的公钥去验证签名正确性。签名用私钥,验证用公钥用的仍然是同一个人的

4. 区块链数据结构

区块链数据以区块的形式存在,区块又分为区块头和区块体。

区块头占80个字节,包含6个字段:

字段 大小(字节) 含义
父区块哈希值 32 记录该区块的上一个区块的Hash值,以此维持一个链
版本号 4 记录了区块头的版本号,用于跟踪软件/协议的更新
时间戳 4 记录了该区块的创建时间戳
难度系数 4 记录了该区块链工作量证明的难度目标
随机数(nonce) 4 记录用于证明工作量的计算参数
默克尔根(merkle root) 32 记录该区块中交易的merkle树根,以此归纳区块中的交易信息

区块体 主要包含大量交易信息,结构为merkle tree。

其结构为:

比特币中的节点分为两类:

  • 全节点 (保存整个区块的内容,即块头块身都有,有交易的具体信息)
  • 轻节点 (例如手机上的比特币钱包)(只有块头)

5. merkle proof

如何向一个轻节点证明某个交易是写入区块链的?

这时需要用到merkle proof :找到交易所在的位置(图中最底行的其中一个区块),这时该区块一直往上到根节点的路径就叫merkle proof

merkle proof 可以证明merkle tree里面包含了某个交易,所以这种证明又叫proof of membership或 proof of inclusion。
对于一个轻节点来说,验证一个merkle proof复杂度是多少? 假设最底层有n个交易,则merkle proof 复杂程度是θ(log(n))。

如何证明merkle tree里面没有包含某个交易? 即proof of non-membership。

<比特币中不需要做这种不存在证明>

可以把整棵树传给轻节点,轻节点收到后验证树的构造都是对的,每一层用到的哈希值都是正确的,说明树里只有这些叶节点,要找的交易不在里面,就证明了proof of non-membership。
问题在于,它的复杂度是线性的θ(n),是比较笨的方法。

如果对叶节点的排列顺序做一些要求,比如按照交易的哈希值排序(比如说从小到大)。
要查的交易先算出一个哈希值,看看如果它在里面该是哪个位置。比如说在第三个第四个之间,这时提供的proof是第三个第四个叶节点都要往上到根节点。
如果其中哈希值都是正确的,最后根节点算出的哈希值也是没有被改过的,说明第三、四个节点在原来的merkle tree里面,确实是相邻的点。
要找的交易如果存在的话,应该在这两个节点中间。但是它没有出现,所以就不存在。

本文转载于网络 如有侵权请联系删除

相关文章

  • 9个组织的37个样本的大豆的长非编码RNA的鉴定

    咱们《生信技能树》的B站有一个lncRNA数据分析实战,缺乏配套笔记,所以我们安排了100个lncRNA组装案例文献分享,以及这个流程会用到的100个软件的实战笔记教程!下面是100个lncRNA组装案例文献分享标题:TheLongIntergenicNoncodingRNA(LincRNA)LandscapeoftheSoybeanGenome标题:大豆基因组的基因间区长非编码RNA(LincRNA)图谱杂志:PlantPhysiol(2018)作者:AgnieszkaAGolicz,MohanBSingh,PremLBhalla机构:墨尔本大学兽医和农业科学学院植物分子生物学和生物技术实验室DOI:10.1104/pp.17.01657摘要:在这项研究中,来自代表9个组织的37个样本的超过10亿RNA-seq读取对被用来发现6018个lincRNA基因座。LincRNAs比蛋白质编码转录本更短,表达水平更低,样品特异性表达更强。在另外两种豆科植物(鹰嘴豆和紫花苜蓿)中几乎没有发现保守的位点,但在大豆基因组中检测到近200个同源的lincRNA。蛋白质编码基因-lincRNA共表达分

  • 分布式系统一致性和共识基础(一)

    1.Consistency一致性 一致性是分布式系统需要解决的基础问题,一致性是对外呈现的一致的状态或结果,一致性为什么很重要,举个扫码支付的例子。小明到商场想玩夹娃娃机,他爸爸扫码支付了10元,娃娃取币机正常情况下需要弹出10个币,假设取币机出了问题,没接收到支付成功的通知,没弹出币就让人抓狂了。两个系统中订单状态不一致了,支付系统认为是支付成功,娃娃取币机认为订单待支付。1.1一致性模型一致性的模型定义,只列出一些常见的,一起学习研究。(1)StrictConsistency严格一致性一个处理器的写操作要即刻被其他处理器可见,即刻的定义可能是CPU的下一个时钟周期,这个模型过于严格,在分布式系统基本是不可能达到的。(2)SequentialConsistency顺序一致性比严格一致性弱些,一个对变量的写操作不用马上被其它处理器可见,但不同处理器对变量的写操作的顺序对于所有处理器可见。简单的可以理解为逻辑时钟,从所有处理器的视角,和从自身处理器视角看写操作执行的顺序是应当一致的。这个逻辑时钟的论文LeslieLamport发表于1978年,不得不感慨美国学术的基础。http://la

  • r语言中对LASSO,Ridge岭回归和Elastic Net模型实现

    原文链接:http://tecdat.cn/?p=3795介绍Glmnet是一个通过惩罚最大似然来拟合广义线性模型的包。正则化路径是针对正则化参数λ的值网格处的套索或弹性网络罚值计算的。该算法速度极快,可以利用输入矩阵中的稀疏性x。它符合线性,逻辑和多项式,泊松和Cox回归模型。可以从拟合模型中做出各种预测。它也可以适合多响应线性回归。glmnet算法采用循环坐标下降法,它连续优化每个参数上的目标函数并与其他参数固定,并反复循环直至收敛。该软件包还利用强大的规则来有效地限制活动集。由于高效的更新和技术,如热启动和主动集合收敛,我们的算法可以非常快地计算解决方案路径。该代码可以处理稀疏的输入矩阵格式,以及系数的范围约束。其核心glmnet是一组Fortran子程序,它们使执行速度非常快。该软件包还包括用于预测和绘图的方法以及执行K倍交叉验证的功能。首先,我们加载glmnet包:library(glmnet)##Loadingrequiredpackage:Matrix##Loadedglmnet1.9-9 包中使用的默认模型是高斯线性模型或“最小二乘”,我们将在本节中演示。我们加载一组预

  • wepy.app、wepy.page、wepy.component的区别

    wepy.app只会用到一次,就是在App.wpy里面,入口app.wpy继承自wepy.app,包含一个config属性和其全局属性、方法、事件。其中config属性对应原有的app.json,编译时会根据config生成app.json文件<styletype="less"> /**less**/ </style> <script> importwepyfrom'wepy'; wepy.app({ config={ "pages":[ "pages/index/index" ], "window":{ "backgroundTextStyle":"light", "navigationBarBackgroundColor":"#fff", "navigationBarTitleText":"WeChat", "navig

  • PHP获取指定地区的天气

    在开发网站的时候用到天气查询,由于是基于Wordpress的所以有很多限制,先建一个【weather.php】的文件,然后看代码:<?php //获取天气 $url='http://m.weather.com.cn/data/'; $id='101181101';//焦作的代号 $data=file_get_contents($url.$id.'.html'); $obj=json_decode($data); echo$obj->weatherinfo->city.':'.$obj->weatherinfo->weather1.''.$obj->weatherinfo->temp1;复制对于:$url='http://m.weather.com.cn/data/'; $id='101181101';//焦作的代号 $data=file_get_contents($url.$id.'.html&

  • mediacodec解码ffmpeg AvPacket

    初始化MediaCodec privateMediaFormatmediaFormat; privateMediaCodecmediaCodec; privateMediaCodec.BufferInfoinfo; privateSurfacesurface;//这个是OpenGL渲染的Surface /** *初始化MediaCodec * *@paramcodecName *@paramwidth *@paramheight *@paramcsd_0 *@paramcsd_1 */ publicvoidinitMediaCodec(StringcodecName,intwidth,intheight,byte[]csd_0,byte[]csd_1){ try{ if(surface!=null){ Stringmime=VideoSupportUtil.findVideoCodecName(codecName); mediaFormat=MediaFormat.createVideoFormat(mime,width,height); mediaFormat.setInteger

  • Hyperledger(超级账本)的worldstate和SAP CRM的CRMD_CUMULAT_H

    Hyperledgerfabric是基于区块链技术的一个开源项目,由Linux基金会于2015年发起,目的是推进区块链数字技术和交易验证的发展和落地。Hyperledger由多个区块构成了一个有序链表,每个区块里包含多条交易(trasanction,缩写为tx)。Jerry在学习账本的数据结构时,发现一个有趣的现象:上图中WorldState(世界状态)的设计目的,是为了提升性能。比如,有一个channel里共发生了1千次交易,为了获取该channel的当前状态值,需要沿着区块链的首块出发执行这1千次交易,有点像SAPHANA内存数据库实时计算的思路。而HyperledgerFabric选择了在每次新交易处理完后,都同步更新一个称之为levelDB的数据库。这样每次查询当前状态时,无需遍历区块链每个区块重复执行交易,只需要查询该levelDB数据库即可。这个levelDB的概念和CRM里的订单抬头的很多字段,比如总价,毛重(Grossweight)等等设计思路是一样的。比如我在ID为IMU的产品主数据里维护了1个ST的单位重50KG,那么下图订单包含了两个行项目,一共8个ST,毛重50

  • ios 接收 c# socket udp 组播

    最近用wcf服务给ios和安卓做接口,做了几个ios的项目 用udp组播让ios多终端接收和刷新方法做一个简单的小例子会把工程给大家下载的  c#代码:netSocketUDP.rar   ios代码:MyIOSSocketDemo.rar先用c#做发送组播IP范围为 224.0.0.0~239.255.255.255建一个控制台应用程序privatestaticIPAddressGropuAddress=IPAddress.Parse("224.0.0.2");//IP privatestaticintGrupPort=12001;//端口 staticvoidMain(string[]args) { for(inti=0;i<1000;i++) { System.Threading.Thread.Sleep(3000);//等待3秒再发 Send("sendMessage"+i.ToString()+"个!"); } } publicstaticvoidSend(stringmessage) {复制        /

  • JAVA学习Swing章节按钮组件JButton的简单学习

    packagecom.swing; importjava.awt.Container; importjava.awt.Dimension; importjava.awt.GridLayout; importjava.awt.event.ActionEvent; importjava.awt.event.ActionListener; importjava.net.URL; importjavax.swing.Icon; importjavax.swing.ImageIcon; importjavax.swing.JButton; importjavax.swing.JFrame; importjavax.swing.JOptionPane; importjavax.swing.WindowConstants; /** *1:按钮在Swing中是较为常见的组件,用于触发特定动作 *Swing中提供了多种按钮,包括提交按钮,复选框,单选按钮等 *这些按钮都是从AbstractButton类中继承而来的 * *2:Swing中的提交按钮组件(JButton)由JButton对象表示 *

  • Hive的分区、分桶

    Hive的分区、分桶 目录Hive的分区、分桶Hive分区静态分区(SP)创建单分区表多分区表语法分区表查询null动态分区(DP)动静态分区的优缺点Hive分桶分桶原理数据分桶优势分桶和分区的区别分桶操作null Hive分区 在大数据中,最常见的一种思想就是分治,我们可以把大的文件切割划分成一个个的小的文件,这样每次操作一个个小的文件就会很容易了,同样的道理,在hive当中也是支持这种思想的,就是我们可以把大的数据,按照每天或者每小时切分成一个个小的文件,这样去操作小的文件就会容易很多了。 分区的优点:查询范围变小,避免全盘扫描,加快查询效率 缺点:会产生很多不连续的小文件、如果分区过多反而会降低查询效率 静态分区(SP) 借助于物理的文件夹分区,实现快速检索的目的。 一般对于查询比较频繁的列设置为分区列。 分区查询的时候直接把对应分区中所有数据放到对应的文件夹中。 创建单分区表 CREATETABLEIFNOTEXISTSt_student( snoint, snamestring )partitionedby(gradeint) rowformatdelimitedfield

  • [转] 一文读懂 HTTP/2 特性

    HTTP/2是HTTP协议自1999年HTTP1.1发布后的首个更新,主要基于SPDY协议。由互联网工程任务组(IETF)的HypertextTransferProtocolBis(httpbis)工作小组进行开发。该组织于2014年12月将HTTP/2标准提议递交至IESG进行讨论,于2015年2月17日被批准。HTTP/2标准于2015年5月以RFC7540正式发表。 那HTTP/2到底有哪些具体变化呢?   二进制分帧 先来理解几个概念: 帧:HTTP/2数据通信的最小单位消息:指HTTP/2中逻辑上的HTTP消息。例如请求和响应等,消息由一个或多个帧组成。 流:存在于连接中的一个虚拟通道。流可以承载双向消息,每个流都有一个唯一的整数ID。 HTTP/2采用二进制格式传输数据,而非HTTP1.x的文本格式,二进制协议解析起来更高效。HTTP/1的请求和响应报文,都是由起始行,首部和实体正文(可选)组成,各部分之间以文本换行符分隔。HTTP/2将请求和响应数据分割为更小的帧,并且它们采用二进制编码。 HTTP/2中,同域名下所有通信都在单个连接上完成,该连接可以承载任意数

  • [Shell]Shell调用并获取执行jar包后的返回值

    ----------------------------------------------------------------- 原创博文,如需转载请注明出处! 博主:疲惫的豆豆 链接:http://www.cnblogs.com/dzblog/p/6914146.html ---------------------------------------------------------------- 场景: 写了一个java的内测分发小程序,作用是jenkins构建完成后,执行这个java程序上传ipa或apk文件到特定的服务器(非普通的ftpserver),而后服务器会返回一个内测链接,进而分发这个链接到公司群里,提供给公司内部下载测试。 在jenkins这里,在上传完文件后,需要拿到一个内测链接,如何拿到呢? 解决方式: 其实解决方式很简单,只要jar里最后输出的是这个内测链接就可以了。 jar里main函数代码: publicstaticvoidmain(Stringargs[]){ StringinputFile=""; StringURL=""; if(args.len

  • wcf使用JetEntityFrameworkProvider.dll写access数据库时,报&quot;操作必须使用一个可更新的查询&quot;错误的解决办法

    由于users用户组无权重写access数据库,需要设置users组用户能读写access数据库。

  • 风速风向 UV 相互转换

    这里以c#为例将风的uv分量转成风向风速(别的语言类似) 风向是以y轴正方向为零度顺时针转   UV转风速风向1doublev;//v分量 2doubleu;//u分量 3doublefx=999.9;//风向 4 5if(u>0&v>0) 6{ 7  fx=270-Math.Atan(v/u)*180/Math.PI; 8} 9elseif(u<0&v>0) 10{ 11  fx=90-Math.Atan(v/u)*180/Math.PI; 12} 13elseif(u<0&v<0) 14{ 15  fx=90-Math.Atan(v/u)*180/Math.PI; 16} 17elseif(u>0&v<0) 18{ 19  fx=270-Math.Atan(v/u)*180/Math.PI; 20} 21elseif(u==0&v>0) 22{ 23  fx=180; 24} 25elseif(u==0&v<0) 26{ 27  fx=0; 28} 29el

  • AVCaptureSession部分用法

    原文链接 AVCaptureSession阻塞主线程问题 前阵子程序中出现了一个奇怪的bug,在iOS系统上,页面弹出的时候会卡很久,相机始终黑屏,大概6-7秒钟,跟踪具体每个步骤花费时间的时候发现在viewWillDisappear:中开销最大,这其中只调用了一个相机关闭的代码: if([[self.avCameraManagersession]isRunning]){ [[self.avCameraManagersession]stopRunning]; } 复制 仔细看了文档之后,发现问题出在stopRunning这里, 苹果文档描述如下: Clientsinvoke-stopRunningtostoptheflowofdatafrominputstooutputsconnectedto theAVCaptureSessioninstance.Thiscallblocksuntilthesessionobjecthascompletely stopped. 重点是这个函数在session完全停止下来之前会始终阻塞线程,同样的,在startRunning中: Clien

  • 20180320作业2:进行代码复审训练

    任务说明: 一、结对,找到一个伙伴进行结对;(在作业中标注自己的伙伴博客链接) 江梅兰http://www.cnblogs.com/dingziguai/ 二、各自对自己的伙伴上周进行的“单元测试”练习所完成的代码进行复审,形成“代码复审检查表”。 代码复审检查表   概要部分 代码符合需求和规格说明么? 不太符合 代码设计是否考虑周全? 是 代码可读性如何? 高 有冗余的或重复的代码吗? 有 代码的每一行都执行并检查过了吗? 是 设计规范部分 设计是否遵从已知的设计模式或项目中常用的模式? 是 有没有硬编码或字符串存在? 有 代码有没有依赖于某一平台? 没有 有没有无用的代码可以清除? 有 代码规范部分 修改的部分符合代码标准和风格么? 符合 具体代码部分 数据结构中有没有用不到的元素? 没有 对于调用的外部函数,是否检查了返回值? 是 效能 代码的效能如何? 一般 循环中是否有明显可优化

  • LG6965 NEERC2016 Binary Code(Trie,2-SAT)

    LG6965NEERC2016BinaryCode \(N\)个01串每个串至多一位为?问能否(要构造)把?替换成0或1使得没有一个串是别的串的前缀。 CODE 把每个?替换成0和1插入Trie,然后如果你选了一个Trie上的串,那么所有子树里的、祖先路径上的、该点上的其他串的反串(即0边1,1变0,没有?就不变)都得选。前缀和建图(如果是一个点上多个串,就把它们当做一条链处理)跑2-SAT即可。时间复杂度\(\Theta(N)\)。 错因:2-SAT没有考虑反向边(之前打模拟赛的时候模拟费用流也是如此!),大意了。

  • 搭建本地仓库

      centos 为实例   1 创建git用户 $addusergit   2 修改密码 最好和登录密码相同 $ passwd git $ vim /etc/passwd   git:x:1000:1000::/home/git:/usr/bin/git-shell     3  在执行 3 步之前     cd git      mkdir project.git   4 添加权限 防止shell 登录 $ chown -R git:git project.git   说明:关于创建裸仓库 ,只是用于共享项目, 不能进行, 正常的git操作,需要在仓库中建立

  • netstat 常用方法

    netstat简介   netstat是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表,实际的网络连接以及每一个网络接口设备的状态信息,netstat用于显示与IP,TCP,UDP和ICMP协议相关的统计数据,一般用于查询本机各端口的网络连接情况。   一般用netstat-an显示所有连接的IP、端口并用数字表示。   netstat命令的功能是显示网络连接、路由表和网络接口信息,可以让用户得知有哪些网络连接正在运作。   使用时,如果不带参数,netstat显示活动的TCP连接 netstat常用参数   常用的几个参数有:-a-n-p-l   -a显示所有socket,包括正在监听的   -l显示有在Listen(监听)的服务状态   -n以网络IP地址代替名称,显示网络连接情形   -p显示建立相关连接的程序名和PID   -t显示TCP协议的连接情况   -u显示UDP协议的连接情况   -s显示每个协议的统计   -b显示在创建每个连接或监听端口时涉及的可执行程序   -c每个1秒就重新显示一遍,直到用户中断   netstat常用场景 netsta

  • AttributeError: &#39;module&#39; object has no attribute

    python在不同层级目录import模块的方法 #Wrongimport frompackageimportMyEnumClass #... #insomemethod: returnMyEnumClass.Member #Correctimport: frompackage.MyEnumClassimportMyEnumClass复制 #Wrongimport importvilt.modules.vision_transformerasvit #Correctimport fromvilt.modulesimportvision_transformerasvit复制    

  • STM32F0 ADC转换

                                     

相关推荐

推荐阅读