北京大学肖臻老师《区块链技术与应用》公开课笔记(六):BTC网络篇
比特币系统的工作过程:用户将交易发布到比特币网络上,节点收到交易后打包到区块中,然后将区块发布到比特币网络上,那么新发布的交易和区块在比特币网络上是如何传播的呢?
比特币网络的工作原理比特币工作于网络应用层,其底层(网络层)是一个P2P Overlay network(P2P覆盖网络)。比特币系统中所有节点完全平等,不像一些其他网络存在超级节点(super node)。要加入网络,至少需要知道一个种子节点,通过种子节点告知自己它所知道的节点。节点之间的通信采用了TCP协议,便于穿透防火墙。当节点离开时,只需要自行退出即可,其他节点在一定时间后仍然没有收到该节点消息,便会将其删掉。
比特币网络设计原则:简单、健壮(robust)(最坏情况下能达到最优状况,即健壮性)而非高效(not efficient)。每个节点维护一个邻居节点集合,消息传播在网络中采用洪泛法,某个节点在收到一条消息会将其发送给所有邻居节点并标记,下次再收到便不会再发送该消息。邻居节点选取随机,未考虑网络底层拓扑结构,也与现实世界物理地址无关。该网络具有极强健壮性,但牺牲了网络效率。
比特币系统中,每个节点要维护一个等待 ...
北京大学肖臻老师《区块链技术与应用》公开课笔记(五):BTC具体实现
基于交易的账本模式区块链是一个去中心化的账本,比特币采用了基于交易的账本模式(transaction-based ledger),每个区块里记录的是交易信息,然而,系统中并无显式记录账户包含比特币数,实际上其需要通过交易记录进行推算。在比特币系统中,全节点需要维护一个名为UTXO(Unspent Transaction Output尚未被花掉的交易输出)的数据结构。
如图,A转给B五个BTC,转给C3个BTC,B将5个BTC花掉,则该交易记录不保存在UTXO中,C没有花掉,则该交易记录保存在UTXO中
UTXO集合中的每个元素要给出产生这个输出的交易的hash值以及它在这个交易中是第几个输出,通过这两个信息,便可以定位到UTXO中的输出。
维护UTXO的目的:防范双花攻击
判断一个交易是否合法,要查一下想要花掉的BTC是否在该集合中,只有在集合中才是合法的。如果想要花掉的BTC不在UTXO中,那么说明这个BTC要么根本不存在,要么已经被花过。所以,全节点需要在内存中维护一个UTXO,从而便于快速检测double spending(双花攻击)。
每个交易会消耗输出,但也会产生新的输出。 ...
北京大学肖臻老师《区块链技术与应用》公开课笔记(四):BTC共识协议
数字货币我们首先不考虑去中心化问题,假设我们有一个大家都信任的中心化机构:央行。我们认为央行是有权力发行数字货币的,并且我们都知道央行的公钥。
我们先想象实体货币:由央行发行,带有央行的防伪标志,使用时,将他给商家即可。那么数字货币类比一下
央行发行,我们拿到这个文件(数字货币其实就是由数据组成的文件),然后把它交给商家,看起来好像没啥问题,而且这样只是简单的用到了密码学中的非对称密码体系的签名。但这样其实会出现很大的问题:双花攻击(double spending attack)
数字货币本身为带有签名的数据文件,不可以修改伪造,但可以复制。所以我们可以复制100元的电子文件,当200元用。
改进
对货币添加唯一编号(不可篡改),中心化组织维护一个大的数据库表,数据库表里记录对应编号的货币属于谁。每次支付向货币发行单位查询货币真伪以及货币现在从属于谁。
该方法每次交易都需要依赖于第三方机构来判断货币属于谁来防止双花攻击。是一个典型的第三方中心化方案。现实中,我们通过支付宝、微信、信用卡等各种支付方式交易时,必然会依赖于第三方机构。由于这些第三方机构具有较高的可信度,有政府进行背书,所 ...
北京大学肖臻老师《区块链技术与应用》公开课笔记(三):BTC数据结构篇
Hash pointer(哈希指针)指针在程序运行过程中,需要用到数据。最简单的是直接获取数据,但当数据本身较大,需要占用较大空间时,明显会造成一定麻烦。因此,可以引入指针这一概念,指针存储的实际是下一组数据的起始地址。当需要获取数据时,只需要按照指针所给的地址,去对应的位置读取数据即可,这样大大节省了内存空间。在实际中,为了便于程序移植性等原因,指针实际上存储的是逻辑地址而非物理地址。
区块链结构本身为一条链表,节点为区块。而传统链表实现,便是通过指针将各个节点串联起来而称为最终的链。如下便是我们最常见的一个链表:
但在区块链系统中,并未采用指针,而是使用了哈希指针
哈希指针如下图对于该节点,我们可以看到有两个指针指向这个节点(实际上为一个),其中P为该节点的地址,H()为该节点的哈希值,该值与节点中内容有关。
这样不仅能通过P找到该节点的位置,还能通过H()确定该节点是否被篡改
在比特币中,其最基本的数据结构便是一个个区块形成的区块链,连接区块链是哈希指针
区块链与链表区别:哈希指针代替普通指针
如图为一个简单的区块链。其中,每个区块根据自己的区块内容生成自己的哈希值,此外,每 ...
北京大学肖臻老师《区块链技术与应用》公开课笔记(二):BTC密码学原理篇
比特币属于加密货币(crypto-currency),可见其中必然会涉及到密码学的知识。而比特币本身开放,其交易记录、交易金额、交易内容甚至源码都面向全网开放,加密又使用在哪里呢?在比特币中,正是加密确保了信息的不可篡改,保证了区块链本身的优势——不可篡改。
在比特币系统中,主要运用到了密码学的hash和签名
hash(哈希)简单来说就是对某一事物的投影操作,即A->Hash(A)
在密码学中,采用的哈希函数称为名cryptographic hash function,其两个重要性质分别为collision resistance(对哈希碰撞具有抗拒性)和hiding(隐藏性)
哈希碰撞: 给定x和y,且有x!=y,但给定一个哈希函数Hash(),可以得到Hash(x)=Hash(y),则称为hash碰撞。
collision resistancecollision resistance保证,如果有Hash(x)!=Hash(y),必然可以得到x!=y(当然,这是理想状态。有兴趣的可以了解针对哈希碰撞出现后如何处理,如:开放定址法、公共溢出区等)。在实际应用中,哈希碰撞基本上难 ...
北京大学肖臻老师《区块链技术与应用》公开课笔记(一):课程简介
前言本系列笔记参考了北京大学肖臻老师《区块链技术与应用》公开课
本系列笔记参考了这位大佬的笔记北京大学肖臻老师《区块链技术与应用》公开课系列笔记
区块链的本质是什么?
区块链是下一代价值互联网。
世界上最慢的数据库
在技术发展的途中,必然会存在其支持者和反对者。而区块链技术和其他技术相比,存在着巨大的争议。其支持者和反对者双方高度对立。支持者认为:区块链于下一代技术如同蒸汽机对于第一次工业一般,具有划时代的意义。而其反对者则认为其仅仅是一个披着技术外衣,吸引人眼球的”庞氏骗局”。但是我们需要清楚的是,技术本身和商业运作是不同的,技术就是为了解决某一系列问题,其本身并不应该被抨击。当然,“没有银弹”也提醒我们,没有任何一种技术是一种万金油,可以解决一切问题。就比如近几年热炒的人工智能,其仍然存在极大局限性。再比如我们当前一直宣称的大数据时代,好像一切都可以依靠数据来说话,但大数据真的能解决一切问题吗?所以,技术本身并不应当受到我们大力吹捧或者刻意贬低。即使是区块链技术,其本身并不能解决一切问题,当然,该技术本身也并非“庞氏骗局”的罪魁祸首。对此,我们应该理性看待,毕竟,“技术无罪”。
...
IDEA使用Git管理项目
下载git地址:https://git-scm.com/download/win
安装无特殊需求一路默认即可
在命令提示符中验证安装是否成功(显示版本号)
IDEA中配置Gitfile->Settings,左上角搜索Git
在github上创建一个仓库,并获得远程仓库地址
提交到远程仓库Github使用IDEA绑定github账户需要用到个人访问令牌,详情见7
指定本地仓库VCS - > Create Git Repository
提交到远程仓库。选中项目文件夹右键->Git->Commit Directory
第一次提交如果是第一次提交需要指定远程仓库,即在Github创建的repository
选择提交哪些文件和提交信息。忽略弹出的警告信息继续提交(commit)
创建个人访问令牌步骤
1.头像 -> Settings
2.在左侧边栏中,点击 Developer settings
3.在左侧边栏中,点击 Personal access tokens(个人访问令牌)
4.点击 Generate new token(生成新令牌)
5.设置令牌有效时间
...
Git使用
Git是什么?
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
Git 与 SVN 区别Git 不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。
Git 与 SVN 区别点:
Git 是分布式的,SVN 不是:这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心的区别。
Git 把内容按元数据方式存储,而 SVN 是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里。
Git 分支和 SVN 的分支不同:分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录。
Git 没有一个全局的版本号,而 SVN 有:目前为止这是跟 SVN 相比 Git 缺少的最大的一个特征。
Git 的内容完整性要优于 SVN:Git 的内容存储 ...
springboot学习(六):任务
异步任务我们的一个方法设置进程睡眠一定时间
12345678910111213@Servicepublic class AsyncTask { public void test(){ try { // 等待3000毫秒在执行 Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("test方法被执行"); }}
然后在controller层调用这个方法
123456789101112@RestControllerpublic class Async { @Autowired AsyncTask task; @GetMapping("/test") public St ...
springboot学习(五):swagger
前言前后端分离开发
前端 -> 前端控制层、视图层
后端 -> 后端控制层、服务层、数据访问层
前后端通过API进行交互
前后端相对独立且松耦合
前后端可以部署在不同的服务器上
产生的问题:前后端集成,前端或者后端无法做到“及时协商,尽早解决”,最终导致问题集中爆发
解决方案:首先定义schema [ 计划的提纲 ],并实时跟踪最新的API,降低集成风险
swagger
号称世界上最流行的API框架
Restful Api 文档在线自动生成器 => API 文档 与API 定义同步更新
直接运行,在线测试API
支持多种语言 (如:Java,PHP等)
官网
SpringBoot集成Swagger导入依赖如果你要使用swagger2,则需要导入两个依赖
123456789101112 <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui --><dependency> <groupId>io.springfox</group ...