简述区块链(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

webpack之externals操作三部曲--正确的姿势

1.作用 首先webpack提供这个externals选项作用是从打包的bundle文件中排除依赖。换句话说就是让在项目中通过import引入的依赖在打包的时候不会打包到bundle包中去,而是通过script的方式去访问这些依赖。 2.怎么用? 以jquery为例子,目的是在…

Anaconda3自带jupyter

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

python 的按位与 或 异或 运算

符号 描述 运算规则 by MoreWindows & 与 两个位都为1时,结果才为1 (统计奇数) | 或 两个位都为0时,结果才为0 (统计偶数) ^ 异或 两…

理解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 应用问题的扩展一、"自动轨迹绘制"问题分析 …

bootstrap-select采坑

bootstrap-select采坑 1.class"selectpicker" 普通的下拉框功能 2.title"请选择城市名称" title的作用与palcehoder一样。 3.select class"selectpicker" multiple selectpicker和multiple属性的搭配使用可实现多选 4.data-live-search"tru…

对vue虚拟dom的研究

Vue.js通过编译将template 模板转换成渲染函数(render ) ,执行渲染函数就可以得到一个虚拟节点树在对 Model 进行操作的时候,会触发对应 Dep 中的 Watcher 对象。Watcher 对象会调用对应的 update 来修改视图。这个过程主要是将新旧虚拟节点进行差异对比…

element-ui之dialog组件title插槽的使用

dialog对话框组件title属性的slot使用方法 使用背景 需要单独控制title中某个数据显示及样式&#xff0c;footer也一样 <el-dialog// 也可以这样写,但是没有办法单独控制name age的显示// title"name age"title"提示":visible.sync"dialogVisi…

css3自适应布局单位vw,vh

视口单位(Viewport units) 什么是视口&#xff1f; 在桌面端&#xff0c;视口指的是在桌面端&#xff0c;指的是浏览器的可视区域&#xff1b;而在移动端&#xff0c;它涉及3个视口&#xff1a;Layout Viewport&#xff08;布局视口&#xff09;&#xff0c;Visual Viewport…

python 操作 elasticsearch-7.0.2 遇到的问题

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

用到的Shell

sed 1i 添加的内容 file #这是在第一行前添加字符串 sed $i 添加的内容 file #这是在最后一行行前添加字符串 sed $a添加的内容 file #这是在最后一行行后添加字符串 sed -i s/.*/行首添加内容&行尾添加内容/ 文件名 //每一行 sed -i $a新增的一行 tars_build_tar.sh a…

如何解决浏览器缩小出现横向滚动条时网页背景图出现空白的问题

原因&#xff1a; 当窗口缩小时&#xff0c;浏览器默认100%宽度为浏览器窗口的宽度。而忽略了下部内容层固定宽度(1024px)。从而出现了固定宽度大于100%宽度的现象。浏览以此理解来解析页面&#xff0c;就出现了容器宽度理解上的差异&#xff0c;出现了一个非常奇特的BUG。 解…

前端设计模式

1. 单例模式 2.装饰器模式 转载于:https://www.cnblogs.com/lyraLee/p/11210985.html

区别 (function($){...})(jQuery)、$(function(){ })和$.fn

一、(function($){…})(jQuery) 首先function(arg){...}定义了一个匿名函数&#xff0c;参数为arg,而调用时需要在函数后面写上括号和实参&#xff0c;由于操作符的优先级&#xff0c;函数本身也需要括号&#xff0c;也就成了&#xff1a; &#xff08;function(arg){...}&…

git 清除缓存

清除git缓存 git config --local --unset credential.helpergit config --global --unset credential.helpergit config --system --unset credential.helper保存git缓存 git config --global credential.helper store转载于:https://www.cnblogs.com/zhouyideboke/p/11211650.…

网页里如何使用js禁用控制台

网页里如何禁用右击事件&#xff1f;使用jQuery&#xff0c;几句代码就可以搞定了 document.oncontextmenu function(){return false;} 简单示例&#xff1a; js实现&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><…

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

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

Vuex的全面用法总结

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