近年来,区块链的概念越来越深入人心,尤其是区块链技术被列入国家基础设施建设的名单后,各大企业也开始招聘和学习区块链技术。从各大招聘网站的区块链职位来看,工资待遇都很不错,每月30K-80K不等。这对我们程序员来说也是一个机会,可见学习区块链技术的迫切性。
我个人从2016年开始从事区块链系统开发。最近,我周围的许多朋友都在找我,希望我告诉他们关于区块链技术发展的情况。鉴于此,我干脆开始开发一个简单的java区块链系统,并写了详细的开发教程发布到我的博客上,希望能帮助热爱区块链技术的朋友学习入门。
这个区块链系统代码非常简洁明了。新手很容易理解,旨在告诉大家,区块链技术没那么复杂。除了springboot框架,系统其他都是纯原生开发,连P2P网络都是用javasocket实现的。
文末有本文完整源码链接。
(1)区块链
从技术角度来看,区块链是一种包含交易信息的区块按照时间顺序从后向前依次链接的数据结构。
从应用层来说,区块链是一个分布式的共享账本和数据库。它具有去中心化、不可篡改、全程留痕、集体维护、公开透明等特点。基于这些特征,区块链科技可以开发具有自己信任系统特征的系统,实现多个代理之间的合作、信任和一致行动。
嵌段是区块链的最小组成单元。,它主要由包含元数据的块头和存储一条或多条事务信息的块体组成。每个块记录当前块的散列和前一个块的散列。通过两个哈希值的关联,所有块以链式结构链接在一起,从而形成完整的区块链。
区块链中的第一个块称为创建块,不需要与前一个块关联。以BTC网络为例,每个块主要包含以下信息字段:
块大小:以字节为单位的块数据大小
。块头:块头包括以下字段:
1。块头哈希值
2。父块头哈希值
3。时间戳:块生成的大致时间
。4。merkleroot:在该块中交易的Merkleroot的散列值
5。难度目标:本区块工作量证明算法难度目标
6。Nonce:用于工作量证明算法的计数器
。交易计数器:交易笔数
交易:记录在块中的交易信息
区块链结构的简单模型,如下图所示:
块中设置的交易记录了一些具体的信息,交易信息主要记录在BTC网络中。在其他区块链网络中,相应的业务数据,如审计信息、版权信息、账单信息等。可以根据业务逻辑保存。这就是为什么区块链经常被用作共享账簿。
比如区块链,可以看作记账的本子,一块相当于一页,记录了一定时期内所有的会计信息,从第一页到最后一页。按页码顺序排列是一本完整的账簿。
(2)区块链网络
实际的区块链系统由多个区块链节点组成,每个节点运行区块链骨干网的同一个副本。所有节点通过P2P网络进行交互,最终形成一个完整的区块链网络系统。
P2P网络具有可靠性、去中心化、开放性的特点,所有节点之间相互交互、相互协作。每个节点使用网络中其他节点提供的服务,同时向外界提供服务。当一个区块链节点生成一个新的块时,它会通过广播告诉其他节点。当其他节点通过网络接收到块信息时,它们将验证块信息。在一定数量的节点通过验证后,每个节点会将区块更新到其已有的区块链,最终保持整个区块链网络中每个节点的信息一致,这也是区块链分散可信特性的体现。
区块链网络的简单模型,如下图所示:
(1)公链
公区块链是指世界上任何个人或团体都可以发送交易,并且交易可以被区块链有效确认,任何人都可以参与区块链的使用和维护。信息公开透明。公共区块链是最早的区块链,BTC、以太坊等虚拟数字货币都是基于公共区块链。但目前公链的实际应用价值并不大,并没有产生特别合适的应用场景。
(2)联盟链
行业区块链:一个群组指定多个预选节点作为记账方,每个区块的生成由所有预选节点共同决定(预选节点参与共识过程),其他接入节点可以参与交易。,但有权限限制和信息保护,如银联组织。目前,联盟链是各个区块链技术团队的主要研究对象。由于联盟链最具有区块链技术的特点,在权限管理、数据安全和监管方面具有优势,是企业优先考虑的区块链技术方案。
市场上也有一些联盟链的主流技术框架,使得联盟链的开发和维护更加方便。国内一些大型软件厂商也有自己的企业区块链技术解决方案,如蚂蚁金服';区块链平台和腾讯';的TrustSQL平台。,东软';美国SaCaEchoTrust区块链应用平台和JD.COM区块链防伪溯源平台等。
(3)私有链
私有区块链:只使用区块链的总账技术记账,可以是公司,也可以是个人,享有区块链的独占写权限,利用了区块链的防篡改特性。将区块链用作分类帐数据库。
(1)共识机制
共识机制被称为区块链体系的灵魂,是区块链体系信任体系的基础。区块链系统是一个多节点分布式账本系统。当需要记录新信息时,哪个节点负责记账,哪个节点负责验证记账结果,如何让所有节点达成最终协议,让网络中所有节点按照相同的顺序复制记录记账结果,这就是共识机制要做的事情。
据百度百科:
所谓"共识机制"就是通过特殊节点的投票,在极短的时间内完成交易的验证和确认。对于一个交易,如果几个利益不相关的节点能够达成共识,我们可以认为全网对此也能达成共识。说的通俗一点,如果一个中国微博大V,一个美国山寨玩家,一个非洲留学生,一个欧洲旅行者don'不认识,但是都一致认为你是个好人,那么基本上可以断定你不是坏人。
目前主流的一致性算法有PoW、PoS、DPoS、PBFT等。在实际使用中,每种算法都有各自的优缺点。当应用于不同的场景时,区块链项目将采用不同的共识机制和算法。
(2)去中心化
去中心化是互联网发展过程中形成的一种社会关系和内容生产形式,是相对于"集中化"。在具有许多分布式节点的区块链系统中。,每个节点都具有高度自治的特点。任何一个节点都可能成为舞台的中心,但不具备强制性的中央控制功能。节点之间的影响会通过网络形成关联关系。这种开放、扁平和平等的系统现象或结构。我们称之为分权。
分散系统具有容错性高、抗攻击能力强的特点。一旦中央集权系统的中心出现问题,整个系统就会崩溃,但区块链系统的任何一个节点都出现问题。这对整个区块链网络不会有太大影响。
另外,去中介化不等于不接受监管,而且"分散化"到中央控制器和中介,而不是监管机构。监督节点可以方便地访问任何区块链网络。。而且由于区块链的公开透明,监管者可以更方便地监控整个系统的交易数据。
(3)智能合约
从技术上讲,智能合约是部署在区块链上的一段程序代码。当程序设定的条件满足时,它将在区块链上运行并得到相应的结果。这种情况有点类似微信小程序。区块链提供虚拟机和脚本语言。用户根据脚本语言的语法开发具有一定业务逻辑的程序,并部署在区块链上。当满足执行条件时,智能合约将由区块链虚拟机解释和运行。
典型的应用是以太坊平台上的智能合约,用户通过简单的几行代码就可以实现自己想要的合约。,实现不需要人为监督的契约,可以';不会被篡改,自动运行。你不';买卖房子不需要找中介,你也不需要找中介。Idon’我不需要找公证人来借钱.人们可以根据自己的需要,随时随地发起一个契约,契约的履行并不依赖于某个人或某个组织。所有的信任完全基于以太坊区块链平台本身。
(4)不可篡改
大多数人习惯称之为不可篡改,但从技术角度来说,我个人认为称之为不可逆转更合适,既然是计算机系统。、增加、删除、检查是基本的功能属性,但是区块链系统的删除、修改操作有点特殊。
区块链是每个区块的哈希值串联起来的链状结构,区块的哈希值=sha256(";当前块内容中前一个块的哈希值").任何块内容的修改都会引起哈希值的变化,哈希值的变化也会引起子块哈希值的变化,进而引起整个区块链的变化。
所以任何人修改块的数据几乎是不可能的。除非他修改从创世块到最新块的整个区块链中的所有散列值,并且在修改之后,他必须将其广播到网络中的所有其他节点,以便所有其他节点接受该修改。
但是按照目前计算机的计算能力,短时间内从头到尾修改所有的区块链是非常困难的,即使修改后,其他节点也不会接受修改,因为没有条件让所有节点自行达成共识。
(1)公链应用:BTC网
区块链1.0产品。对于比特币,中本聪将其定义为完全通过点对点技术实现的电子现金系统,它使得在线支付能够由一方直接发起并支付给另一方。不需要通过任何金融机构。
与所有货币不同,比特币不是由特定的货币机构发行,而是根据特定的算法,通过大量计算产生的。比特币经济利用整个P2P网络中众多节点组成的分布式数据库来确认和记录所有交易行为,并利用密码学设计来保证货币流通各个环节的安全性。之后,人们根据比特币网络技术整理出区块链技术体系,解决信任问题。比特币网络原理也成为区块链技术初学者的经典教材。
(2)公链应用:以太坊网区块链2.0产品代表
。以太坊是一个用于分散应用程序的开源区块链平台(Dapp)。,具有大多数区块链技术的特征,但与其他区块链不同,以太坊是可编程的,开发人员可以使用它来构建不同的应用程序。,通过其特殊的加密货币以太坊("ETH"简称),提供了一个去中心化的以太坊虚拟机来处理点对点契约(只是一些脚本代码)。。如果把比特币网络看成分布式数据库,以太坊更进一步,可以看成分布式计算机:区块链是计算机的ROM,契约是程序,以太坊的矿工负责计算,充当CPU。
以太坊的概念最早是由程序员VitalikButerin在2013年和2014年提出的,意思是"下一代加密货币和分散应用平台"。虽然以太坊可以作为一个平台来开发新的应用但由于以太坊的运行与BTC网络相同,采用令牌机制,平台性能不足,经常导致网络拥塞。平台学习、开发和测试区块链技术是可以的,但对于实际生产来说不太现实。
(3)联盟链开发框架:HyperledgerFabric
HyperledgerFabric又称超级账本(superledger),是IBM向Linux基金会贡献的一个商业分布式账本。是世界';面向企业应用程序的最大的分布式开源项目。像其他区块链技术一样,它也有一个账本,可以使用智能合约。织物';的智能合约可以有很多架构,可以用主流语言编程,比如Go、Java、Javascript等。另外,还可以用实度。
到目前为止,Fabric已经得到了阿里巴巴、AWS、Azure、百度、Google、华为、IBM、甲骨文、腾讯等互联网巨头的支持。。许多企业';区块链平台使用织物作为底层框架,如甲骨文。然而,由于IBM'区块链的定义强调了区块链的两个要素,它削弱了共识机制。,收养了卡夫卡和动物园管理员';s"分拣服务"达成共识,所以一些业内人士也称超级账本为"伪区块链",但即使如此,它也能';不要抗拒公司';对超级账本的爱。目前,Fabric版本已经正式发布。
(4)总结
目前公链实际应用的业务场景并不多,大部分都是以挖矿或者网上养宠物为主题,而由于数字货币的匿名性,一些不法分子利用了这一特点。数字货币';美国在洗钱、暗网交易和其他非法活动中的使用是各个国家的目标,而中国';美国的政策和法规也是严格禁止的。所以对于技术人员来说,可以把公链作为研究对象,其他方面暂时没有太大的实际意义。
目前大部分区块链企业的研究方向主要针对企业的联盟链和私有链,国家层面也在大力支持区块链技术的发展,尤其是区块链底层核心技术的研发,倡导区块链作为核心技术自主创新的重要突破口,明确主攻方向。加大投入,重点攻克一批关键核心技术,加快区块链科技和产业创新发展。然而,市场上大多数主流区块链平台仍由外国公司主导。国产区块链底层核心技术的开发需要技术人员的加倍努力。
目前,主流的区块链技术架构主要分为五层。数据层是最底层的技术,主要实现数据存储、账户信息、交易信息等模块。数据存储主要基于Merkle树,采用块模式和链式结构实现。账户和交易基于数字签名、散列函数和不对称加密技术,以确保区块链的数据安全。
网络层主要实现网络节点的连接和通信,也称为点对点技术,所有区块链节点通过网络进行通信。。共识层允许网络中的所有节点通过共识算法对全网所有块数据的真实性和正确性达成一致,从而防止拜占庭攻击、51攻击等区块链共识算法攻击。
激励层主要是实现区块链代币的发行和分配机制。,是公有链的范畴,我们不';不做分析。应用层一般以区块链系统为平台,在平台上实现一些去中心化的应用或者智能合约,平台提供虚拟机运行这些应用。
接下来,我们开发一个基于Java语言的小型区块链系统,实现数据层、网络层和共识层的部分功能,用简单的代码将抽象的概念可视化,加深对区块链技术基础理论的理解。
(1)开发环境
开发工具
vs代码
开发语言爪哇
JDK版本
JDK1.8或者OpenJDK11
开发框架
SpringBoot2.2.1
项目管理
Maven3.6
测试工具
邮递员
块是区块链系统的最小单位。第一步,首先实现最简单的块结构,创建一个新的Block.java类,主要包括以下字段:
block.java
。区块链(Blockchain)是将区块按照区块哈希的顺序串联起来的数据结构,哈希值是通过哈希算法对区块进行第二次哈希计算得到的数字摘要信息(如果你不';不了解哈希函数,可以先了解一下SHA算法)。,用于保证区块的信息安全和整个区块链的有效性。所以第二步我们增加了一个新的方法来计算块的Hash值,这个方法是java使用SHA256算法实现的:[XY002][XY001]cryptoutil。Java[XY002][XY001]第三步。,创建一个链式结构对象,按照顺序保存块对象,从不形成有序的块列表。考虑到线程安全问题,采用了CopyOnWriteArrayList来实现。为了方便测试,区块链结构被临时保存在本地缓存中。实际的区块链网络最终将实现持久层的功能,并将区块链数据保存到数据库中。例如,BTC核心网络采用K-V数据库级DB的第四步:
blockcache.java
。有了区块链结构,我们需要给区块链增加一个新的方法。同时,我们每增加一个块,都需要验证新块的有效性,比如哈希值是否正确,新块中前一个块的哈希属性值是否等于前一个块的哈希值。
另外,在区块链中必须有一个创造块,我们可以通过硬编码直接实现:
blockservice.java
以上关键代码实现后,我们将构建一个非常简单的区块链模型。,包含一个基本块模型和一个区块链模型,并且可以生成新的块并将它们添加到区块链中。接下来,我们将测试它们。第五步,我们编写一个控制器类来调用:
blockcontroller.java
第六步,系统测试
首先,系统启动后,查看区块链中的数据,可以看到当前系统中的区块链为空:
。
然后我们调用创建创世区块的方法,查看返回结果:
我们将生成的Genesis块添加到本地区块链并转换成JSON字符串后,可以看到当前区块链中存储了一个Block对象。至此,我们已经实现了一个简单的区块链。实际的区块链系统模型要复杂得多。对应的领域需要根据不同的业务场景进行扩展,但基本特征是相同的。
(3)共识机制的实现
上一章我们实现了一个简单的区块链结构,并且能够生成和添加新的块,但是问题来了。实际的区块链系统是一个多节点、分布式、去中心化的网络,每个节点通过网络交互实时同步存储相同的整个区块链数据。那么,我们生成的块如何被其他节点识别并同步添加到所有其他节点中呢?这时,我们需要一套规则,使网络节点的所有参与者都能达成共识,接受并保存新块,这就是所谓的"共识机制"。在
的理论基础中提到,共识机制有很多种,各有利弊。接下来我们用java代码模拟实现一个我们最熟悉的机制:工作证明,顾名思义就是工作量的证明。在基于POW机制构建的区块链网络中,节点通过计算随机hash的hash值来争夺记账权,得到正确值并生成块的能力是节点计算能力的具体表现,计算过程一般称为"采矿"。
简而言之就是区块链系统设置一组计算规则或一组计算问题。在生成新块之前,所有节点都参与解决这个问题。哪个节点先计算出结果,得到其他节点的验证和批准,这个节点就获得新块的记账权。并从系统中获得相应的奖励,共识也就结束了。PoW共识机制的典型应用是BTC网络。在BTC网络中,一致性计算的目标是找到满足某种要求的块散列(散列值)。。这个块的哈希值是工作结果的一个证明,计算的目的就是找到这个证明值。上一章我们已经在测试的时候看到过这个哈希值:
BTC网络PoW使用的Hashcash算法,一般逻辑如下:
获取一些公知的数据data(在BTC网络中是指块头);
添加一个计数器nonce,初始值为0;
计算数据和nonce的串联字符串的哈希值;
检查上一步的hash值是否满足某个条件,如果满足,停止计算,如果不满足,nonce加1,然后重复步骤3和4,直到满足这个特定条件。
接下来,我们用Java代码实现这个算法。如果哈希值的前四位都是0,则计算成功(实际区块链网络中的具体条件要求更高,计算能力也较高,系统会随着计算难度动态调整具体条件,以保证分块生成的速度)。
第一步,我们创建一个新的共识机制服务类,并添加一个"采矿"方法。计算成功后,我们得到记账权,调用添加块的方法将块添加到powservice.java的区块链:
第二步。,编写测试共识机制服务的控制器类方法:
blockcontroller.java
第三步,启动系统,测试。
首先,实现方法以生成创建块。
第二种调整方法用于计算和证明工作负载,生成新的块并添加到本地区块链:
我们来看一下,系统后台计算的过程这次计算用了1048ms计算出满足条件的哈希值,算了4850次:
。
至此,我们实现了一个简单的工作负载证明机制,并在当前的区块链系统节点上运行,完成了正确结果的计算,并生成了一个新的块。
接下来,我们将开发一个P2P网络,实现多个节点的同时操作。当一个节点完成挖掘后,会通过P2P网络广播给其他节点。其他节点通过验证后,会将新生成的块添加到自己的区块链中,从而保证整个区块链网络中所有节点的数据一致性。
(4)P2P网络开发
我们已经实现了一个基本的区块链系统,实现了PoW工作负载证明一致机制,通过挖掘计算出正确的结果,并生成一个新的块添加到区块链中,但这些都是基于单节点操作的。实际的区块链是一个分布式网络系统,有多个节点同时运行。所有节点同时计算并抢夺记账权,共同维护完整的区块链。
接下来,我们实现了一个基于JavaWebSocket的对等网络。通过本章,我们将实现以下功能:
为了开发和测试本章的功能,我们';d最好准备两台电脑或者虚拟机,或者Docker集群环境,方便多节点操作和测试。。如果只有一台计算机,只需将每个节点的端口号设置为不同即可。
第一步整理开发思路
目前已经实现了单个节点的分块生成,只需要实现各个节点的消息同步即可。
首先,p2p网络的服务器和客户端都是用java代码实现的,每个节点既是服务器又是客户端。
然后,当一个节点启动时,它将在区块链网络上寻找有效节点。并建立套接字连接(BTC网络可以通过使用"DNS"seed,而DNSseed提供了比特币节点的IP地址列表),我们直接将节点列表配置到application.yml文件中。
接下来,从连接的节点获得最新的块信息。如果当前节点第一次运行,则获取整个区块链信息并在本地替换。在
之后,各个节点同时进行挖掘计算,哪个节点先完成计算?,将生成的新块广播给全网其他所有节点(实际的区块链网络已经计算好了,为了方便测试,我们手动触发一个节点挖掘生成块,然后广播给全网其他所有节点)。
最后,当节点接收到广播内容时,,验证接收到的新块,并在验证后将其添加到本地区块链。验证的首要条件是新砌块的高度必须高于当地区块链的高度。
第二步,先实现P2P网络服务器
。新建一个P2PServer类,增加一个初始化服务器的方法:
P2Pserver.java
第三步,实现P2P网络客户端
。p2pclient.java
第四步,定义P2P网络同步的消息模型
。我们将其定义为四类,即:
blockconstant.java
。定义节点间传输的消息模型:
消息。Java
第五步,实现向其他节点广播的方法
新建一个p2p网络服务类,对外发送消息。或者处理当前节点接收到的其他节点发送的请求。
p2pservice.java
第六步,开发消息处理路由
第五步,已经实现了外发消息,这一步实现了接收消息。
首先,服务器和客户端共享的消息路由被设计为将消息分发到相应的处理单元。
p2pservice.java
第七步,开发消息处理单元
有了消息路由后,然后编写不同的处理单元来处理其他节点发送的块或区块链信息。总的原则是:先检查其他节点发送的块或区块链的有效性,然后判断其高度高于当前节点';区块链南部。如果过高,更换当地的区块链。,或者向本地区块链添加新块。
p2pservice.java
第一步,打包生成测试用的可执行jar包
准备两台机器(可以是虚拟机,也可以是Docker集群)。,同时运行两个节点,节点信息如下:
node1
node2
IP地址
192.168.0.104
。192。168.0.112
http端口号
8080
8090
web套接字服务端口号
7001
7002
websocket服务地址
ws://192。168.0.104:7001
ws://192。168.0.112:7002
项目通过MVNpackage-dmaven.test.skip=true命令打包,生成可以直接运行的jar包,项目在打包前配置好。配置信息如下:
Node1打包:
节点Node2打包:
分别打包之后
,生成两个节点的可执行jar包,如下:将两个jar包放在对应IP的windows机器上,打开命令行模式,进入jar所在的文件夹,执行以下命令分别运行两个节点:
Java-jarDCE-blockchainnode1.jar
Java-jardce-blockchainnode2.jar
Whennode2isstarted,,可以看到后台日志,节点1已经连接,如下图:
第二步,对两个节点进行测试
首先,两个节点启动后,通过使用postman分别发出请求,我们可以看到两个节点的区块链内容都是空的。
然后,在节点1上请求生成一个起源块,并通过挖掘生成第二个块。执行后,检查节点1的区块链信息如下:
执行结果:
最后,让';验证节点2是否完成了节点1生成的区块链信息的网络同步。邮递员请求检查返回的结果:
。
从结果可以看到,区块链网络节点2收到节点1发送的区块链信息,系统日志如下:
反过来当我们在节点2上执行另一个挖掘操作时,我们可以看到,在节点1上,节点2挖掘生成的新块信息已被接收并添加到节点1的区块链:
。
至此,我们实现了一个完整的小型区块链网络,并实现了节点之间的通信,以及多个节点共同维护相同的区块链信息。
结论:
区块链体系非常庞大,涉及到方方面面的技术。我演示的代码主要解释了区块链的一些基本概念。有兴趣的同学可以在此基础上继续开发,实现持久层、消息加解密、系统账户模型、Oracle、侧链技术、智能合约等区块链系统功能。
致每一位区块链技术人员:
目前市面上流行的企业级区块链框架,如super-ledgerFabric,都是国外的人在主导,而在我们国内,除了少数几个大厂外,其他很多区块链公司基本上都是带别人';的东西进行二次包装,然后声称他们公司掌握了区块链的核心技术,并为企业提供服务。这是一个不好的现象。你可以想想我们现在用的开发语言和框架有多少是真正的国产。让';s想想前段时间中兴和华为在核心技术上卡住的事件,就知道要做的事情很多。我们需要摆脱浮躁,静下心来研究底层的核心技术,这样才能实现真正的"弯道超车"!
1。本文完整源代码地址
在此。这篇关于基于java开发区块链系统的完整详细过程的文章(附源代码)在这里。更多相关区块链系统教程分享,请搜索币大师往期文章或继续浏览以下相关文章。希望大家以后多多支持币大师!
本站提醒投资有风险,入市需谨慎。此内容不作为投资理财建议。
标签:Java区块链