简述区块链(1)- 也许只有这一篇

一、唠叨两句

最近一直在考虑一个事情,就是怎么给不太了解技术的人讲清楚区块链。我先试着写下来,然后在逐步打磨吧,目标就是让哪些说看区块链看的云里雾里的同学能对区块链有一些认知。

 

二、定义

简单的给区块链下个定义:基于加密算法的,去中心化的分布式账本技术。这里有三个关键词:加密算法、去中心化、分布式账本,下面我就尝试从三个关键词为线索,介绍一下区块链的概念。

 

三、分布式账本

比特币是一个点对点的电子现金系统,既然是现金系统,那么就得记账呗,这大概就是这个账本的由来,就是流水账嘛,张三给了李四一百块钱,王五给了张三五十块钱,blabla。这种东西,就是一条一条的数据,记录在文件里,数据库里等等。区块链的账本存储,当然就是区块和链了。分布式账本,就是在说不仅存一份数据,每个全节点都存一份数据,只要不是全部节点挂掉,总有节点可提供数据的。

1. 区块:块由区块头和区块体组成,区块头包含一些前一个区块的Hash啊,当前区块中所有交易的默克尔树根啊,时间戳啊,随机数啊,等等。区块体里就是一笔笔的交易。

简单说下默克尔树,比如当前区块有4比交易A,B,C,D,AB取hash,CD取hash,两个Hash结果再取hash,就形成了默克尔树,树根可以理解为一个checksum,任何一个交易改一点,整棵默克尔树就都变化了,可以保证没有篡改,这个树还可以支持轻钱包SPV验证。

2. 交易:每一笔交易主要包含了一个或多个Input和Output,Input记录的是引用到的前一笔未花费交易的索引,Output记录的是将资产转移到那个地址。这里讲脚本的时候,还要讲。

3. 链:刚才讲了区块头包含了前一个区块的Hash,这东西就是为了把区块连接起来,成为一个链,链上的交易顺序不能认为严格的前后关系,但是基本可以认为是有一个追溯的结构。作为程序猿,你会想需要遍历链,怎么整,拿到创世块,它没有前一个区块Hash,取到它的默克尔树根作为key去存储里面找下一个区块,如此往复。

 

四、去中心化

我想把这部分通过和一般NoSql数据库的一些方式做对比,NoSql数据库为了达到读的并发性能和数据的安全,通常都会保存多个副本,ReplicaSet的概念。同时对于写的数据,总要先找个主节点写,写完了再同步给副本集,选主的时候,数据一致的时候,都需要几个节点达成共识,通常会有Paxos,Raft这样的算法来保证。把这部分放大到公网上,就基本可以映射到区块链上了,区块链的各个全节点都保持一个完整账本,全网的ReplicaSet;获得记账权要记账写块了,谁来写,区块链上通过PoW,PoS,DPos等等共识算法来达成共识,又和Paxos,Raft对应上了。

说到共识了,我们想一下记账权这个事,就是挖矿,首先是个经济问题,我干嘛要挖啊,你得给我奖励,比特币系统中获得了记账权生成了区块,就能获得比特币的奖励,比特币价格高,当然可以激励记账这个事了,那么问题来了,这个经济问题变成了一个博弈问题了,这么赚钱,凭啥你挖啊。这时候就得有个算法来规定好游戏玩法,比特币怎么个玩法PoW,就是来个数学谜题,谁算出来谁记账。这个数学谜题可以简单这么理解,就是你生成的块,加上一个随机数位可以调节,然后基于一种Hash算法,你生成出来的结果必须小于某某数,这个某某数就是难度,可以动态调节的,现在比特币的这个难度很高,所以你也就别跟矿主彪啦。那为什么叫PoW了,就是工作量证明,因为这个Hash之间没有关联型,我上次随机数计算的结果和我这次随机数计算的结果之间没有半分钱关联,这也就是为啥算力规模越来越大了,可以并行计算,算力越大,概率越大。你要非较真说,其实理论上,你可能很少计算就刚好碰到了正确结果,没错,这事就可以类比高考了,你说有没有神蒙,蒙得高分,有,但是大体上这个考分大概其能证明你努力过吧。

 

五、加密算法

非对称加密大伙都明白,不多讲了,利用非对称加密的签名验签可以实现区块链最关键的特点,确权。只有我用我的私钥签名过的数据,你用我的公钥才能验证通过,其他谁想仿造都不行,所以这钱就只能是我来花了。说到确权,这事可大了,区块链为啥火,就是因为确权,数字资产能确权了,这意味着什么?意味着互联网变成了价值互联网了,价值可以传递了。

那这签名验签的用哪儿了,也没见哪儿使啊,别急,刚才咱介绍交易的时候不是留了一个箭头么,这交易上记的不仅仅是转移到对方的地址,而是一个脚本。如果就一地址搁那,都说是自己的,那不乱套了,这钱谁能用,得确权,这就需要脚本系统了。

首先说说比特币的地址啊,地址咋生成,下图讲的特清楚,我从网上拷的。你说好好一图,我随便用,不能卖钱,为啥,不就是因为没法确权嘛。

然后我们简单说说这个比特币的脚本系统,它是基于栈的脚本系统。这里我暂时不展开,仅已最常用的比特币锁定脚本P2PKH脚本作为例子讲讲。

锁定脚本

DUP HASH160 [Public Key Hash] EqualVerify CheckSig

花钱的时候你得通过锁定脚本的验证,这个就是一个确权的过程,你要想验证通过你得提供解锁脚本

[Sig] [Public Key]

简单说下验证过程吧,下面这堆脚本基于栈执行

[Sig] [Public Key] DUP HASH160 [Public Key Hash] EqualVerify CheckSig

1. [Sig]入栈

2. [Public Key]入栈

3. DUP复制栈顶[Public Key]再入栈

4. 拿出栈顶[Public Key]执行HASH160(这个正是Public Key Hash的算法),入栈

5. 锁定脚本里的常量[Public Key Hash]入栈

6. 取出栈顶里脚本里的[Public Key Hash]和计算出来的比较,相等就继续

7. 这下栈里从底到顶分别是[Sig][Public Key],CheckSig拿出栈里这俩验签,通过钱就是你的,请用。

 

比特币的脚本指令很多,你可以自己写脚本出来,就是有点麻烦,写汇编似的,但是这东西也是个好东西,直接就引出了后面的智能合约来了,

 

六、小结

今天主要从加密算法,去中心化和分布式账本三个方面简单介绍了一下区块链,感觉没达到我的预期让没接触过的突然开窍的感觉,后面打磨打磨吧的再。本文里主要以比特币作为实例进行介绍的,我觉得比特币最牛逼的地方就是确权和智能合约,打开了无限遐想。公链上开发,很多选择,我其实不太喜欢比特币,开发起来太麻烦,而且就现在这个币值,搞些大宗交易,跨境大额转账啥的还成,其他的,呵呵吧,但是币王还是币王,这里面的原理还是值得细细琢磨的。

 

转载于:https://www.cnblogs.com/DexterDi/p/8689095.html

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

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

相关文章

Vue CLI 3.0脚手架如何在本地配置mock数据json

前后端分离的开发模式已经是目前前端的主流模式,至于为什么会前后端分离的开发我们就不做过多的阐述,既然是前后端分离的模式开发肯定是离不开前端的数据模拟阶段。 我们在开发的过程中,由于后台接口的没有完成或者没有稳定之前我们都是采用…

python 通过下载包setup.py安装模块

下载安装包,并解压到相应的位置 1、打开cmd 2、到达安装目录 3、python setup.py build 4、python setup.py install 转载于:https://www.cnblogs.com/liuchunxiao83/p/11207340.html

Anaconda3自带jupyter

1、cmd命令行中输入 JupyterNotebook 2、系统自动调起下面页面(注册端口冲突是打不开的) 转载于:https://www.cnblogs.com/liuchunxiao83/p/11207385.html

理解Shadow DOM

1. 什么是Shadow DOM? Shadow DOM 如果按照英文翻译的话可以理解为 影子DOM, 何为影子DOM呢?可以理解为一般情况下使用肉眼看不到的DOM结构,那如果一般情况下看不到的话,那也就是说我们无法直接控制操纵的DOM结构。 Shadow DOM 它是HTML的一…

046 实例11-自动轨迹绘制

目录 一、"自动轨迹绘制"问题分析1.1 问题分析1.2 自动轨迹绘制二、"自动轨迹绘制"实例讲解2.1 自动轨迹绘制2.2 数据接口定义2.3 数据文件三、"自动轨迹绘制"举一反三3.1 理解方法思维3.2 应用问题的扩展一、"自动轨迹绘制"问题分析 …

python 操作 elasticsearch-7.0.2 遇到的问题

错误一:TypeError: search() got an unexpected keyword argument doc_type,得到不预期外的参数 解决方法:elasticsearch7里不用文档类型,所以去掉 doc_typecredit_data 错误二:RequestError(400, illegal_argument_ex…

Java生鲜电商平台-订单中心服务架构与异常订单逻辑

Java生鲜电商平台-订单中心服务架构与异常订单逻辑 订单架构实战中阐述了订单系统的重要性,并从订单系统的信息架构和流程上对订单系统有了总体认知,同时还穿插着一些常见的订单业务规则和逻辑。上文写到订单的拆单部分时搁置了,现在接上文继…

Vuex的全面用法总结

1. vuex简介 vuex是专门用来管理vue.js应用程序中状态的一个插件。他的作用是将应用中的所有状态都放在一起,集中式来管理。需要声明的是,这里所说的状态指的是vue组件中data里面的属性。了解vue的同学应该是明白data是怎么回事的吧,如果不懂…

vue中通过第三方代理解决跨域问题

最近在学node,遇到了跨域的问题,来记录下方法 首页服务端的框架是通过express-generator 搭建起来的 npm install -g express-generator 具体接下来的细节不多说,今天主要说跨域 的问题 左侧为服务端项目结构,www为可执行文件&am…

Java生鲜电商平台-生鲜供应链(采购管理)

Java生鲜电商平台-生鲜供应链(采购管理) 在生鲜供应链系统中采购中心这一模块,它是电商公司管理采购的模块,包含供应商管理,采购订单管理,采购商品管理,在该模块中采购订单是采购中心的核心模块。在其他的比如供应商的…

链式调用setTimeout()与setInterval()的区别

使用 setTimeout()和 setInterval()创建的定时器可以用于实现有趣且有用的功能。执行时机是不能保证的,因为在页面的生命周期中,不同时间可能有其他代码在控制 JavaScript 进程。在页面下载完后的代码运行、事件处理程序、Ajax 回调函数都必须使用同样的…

如何让Element UI的Message消息提示每次只弹出一个

Element UI的Message消息提示是点击一次触发一次的。在开发的时候经常会作为一些校验提示,但是公司的测试人员在进行测试时会一直点,然后就会出现如下图的情况。虽然客户使用的时候一般来说不会出现这种情况(毕竟客户不会闲着没事一直点点点&…

css3实现科技感的呼吸灯效果

呼吸灯效果是一种常见的灯光效果,比如网页的按钮,现实生活中比如电脑的开机按钮。 使用CSS3的animation方法可以实现很多迷人的网页动画特效。 使用CSS3 配合box-shadow即可实现类似的效果 样式代码如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18…

百度Echarts折线图tooltip里数据添加单位

option {title: {text: 折线图堆叠},tooltip: {trigger: axis,//在这里设置formatter: {a0}:{c0}万},legend: {data:[邮件营销,联盟广告,视频广告,直接访问,搜索引擎]},grid: {left: 3%,right: 4%,bottom: 3%,containLabel: true},toolbox: {feature: {saveAsImage: {}}},xAxi…

VUE组件 之 Drawer 抽屉

一、源码地址 https://github.com/imxiaoer/DrawerForVue 二、效果图 三、具体代码 drawer.vue <template><div class"drawer"><div :class"maskClass" click"closeByMask"></div><div :class"mainClass"…

Java生鲜电商平台-用户管理的架构与实战

Java生鲜电商平台-用户管理的架构与实战 在电商后台中&#xff0c;用户管理是运营人员管理用户的模块。这里的用户区别于运营人员&#xff0c;会在权限的角色管理中分别阐述。这里的用户包含平台的一般用户&#xff0c;会员用户等。本文将分享一下用户管理模块的设计心得。在设…

vue+Element-ui实现分页效果

当我们向后台请求大量数据的时候&#xff0c;并要在页面展示出来&#xff0c;请求的数据可能上百条数据或者更多的时候&#xff0c;并不想在一个页面展示&#xff0c;这就需要使用分页功能来去完成了。 1.本次所使用的是vue2.0element-ui实现一个分页功能&#xff0c;element-…

21款网页版html5小游戏源码

html5魅族创意的贪食蛇游戏源码下载 html5网页版打砖块小游戏源码下载 html5 3D立体魔方小游戏源码下载 html5网页版飞机躲避游戏源码下载 html5三国人物连连看游戏源码下载 js html5 2048数字游戏源码_2048网页版源码下载 html5盲打高手打飞字游戏下载_网页版英文打飞字游戏源…

自定义input[type=file]的兼容样式

input[type"file"]的样式在各个浏览器中的表现不尽相同&#xff1a; 1. chrome: 2. firefox: 3. opera: 4. ie: 5. edge: 另外&#xff0c;当我们规定 input[type"file"] 的高度&#xff0c;并把它的行高设置成与其高度相等后&#xff0c;chrome中难看的样…