主页 > imtoken官方安卓下载 > 基于java开发完整的区块链系统详细教程(附源码)

基于java开发完整的区块链系统详细教程(附源码)

imtoken官方安卓下载 2024-01-26 05:10:13

前言

近年来,区块链的概念越来越火,特别是区块链技术被列入国家基础设施建设清单后如何添加btc节点,各大企业也开始招兵买马进行区块链技术研究。 从区块链岗位来看,薪水很不错,一个月30K到80K不等。 这对我们程序员来说也是一个机会,可见学习区块链技术刻不容缓。

我个人是从2016年开始从事区块链系统开发的,最近身边很多朋友都找我,想让我给他们讲讲区块链技术的发展。 自己亲手做了一个简单的java区块链系统,写了详细的开发教程,贴在自己的博客上,希望能帮助到热爱区块链技术的朋友们学习和入门。

基于java开发一套完整的区块链系统详细教程(附源码)插图

OKX(OKX)——数字货币兑换

注册领取最高¥60,000元数码盲盒,享20%手续费减免

基于java开发一套完整的区块链系统详细教程(附源码)插图2

点击注册

基于java开发一套完整的区块链系统详细教程(附源码)插图4

这套区块链系统代码非常简洁明了,对于新手来说非常容易理解。 旨在告诉大家,区块链技术并没有那么复杂。 系统除了springboot框架,基本都是纯原生开发,连P2P网络都是用java socket实现的。

文末有本文完整源码链接。

基于java开发一套完整的区块链系统详细教程(附源码)插图6

一、区块链技术的理论基础 1、基本概念

(1) 区块链

从技术角度来看,区块链是一种数据结构,其中包含交易信息的区块按时间顺序从后向前顺序链接。

从应用层面来看,区块链是分布式共享账本和数据库,具有去中心化、不可篡改、全程可追溯、集体维护、公开透明等特点。 基于这些特点,区块链技术可以发展出一套具有自身特点的信任体系,实现多主体间的协同信任和协同行动。

区块是区块链中的最小单位。 它主要由两部分组成:包含元数据的区块头和存储一个或多个交易信息的区块体。 每个区块记录当前区块的哈希值和前一个区块的哈希值,通过两个哈希值的关联,让所有的区块以链式结构连接起来,形成一个完整的区块链。

区块链中的第一个块称为创世块,不需要与前一个块相关联。 以BTC网络为例,每个区块主要包含以下信息字段:

Block size:块数据大小,以字节表示

区块头:区块头由以下字段组成:

1.区块头哈希值

2.父区块头哈希值

3.时间戳:区块产生的大概时间

4. Merkle root:该区块中交易的merkle root的哈希值

5. 难度目标:该区块的工作量证明算法的难度目标

6. Nonce:工作量证明算法中使用的计数器

Transaction Counter:交易次数

Transaction:区块中记录的交易信息

一个简单的区块链结构模型,如下图所示:

基于java开发一套完整的区块链系统详细教程(附源码)插图8

区块中的交易集记录了一些特定的信息。 在BTC网络中,主要记录交易信息。 在其他区块链网络中,可以根据业务逻辑保存相应的业务数据,如审计信息、版权信息、账单信息等,这也是为什么区块链经常被用作共享账本的原因。

例如,区块链可以看作是记账的笔记本。 一个区块相当于一页纸,记录了一定时间内所有的记账信息,从第一页到最后一页。 ,按页码顺序排列的就是一本完整的账本。

(2) 区块链网络

实际的区块链系统由多个区块链节点组成,每个节点运行相同的区块链主干网络副本,各个节点通过P2P网络进行交互,最终形成一个完整的区块链网络系统。

P2P网络具有可靠性、去中心化、开放性。 每个节点交互操作并协调处理。 每个节点在对外提供服务的同时,也使用网络中其他节点提供的服务。 当一个区块链节点产生一个新的区块时,它会通过广播的方式告诉其他节点。 当其他节点通过网络收到区块信息时,会对区块信息进行验证。 当一定数量的节点验证通过后,每个节点都会将区块更新到自己现有的区块链上,最终使得整个区块链网络中每个节点的信息保持一致,这也是区块链体现去中心化和可信的特点.

区块链网络的一个简单模型,如下图所示:

基于java开发一套完整的区块链系统详细教程(附源码)插图10

2. 区块链分类

(一)公链

公共区块链(Public Block Chains)是指:世界上任何个人或团体都可以发送交易,交易可以被区块链有效确认,任何人都可以参与区块链的使用和维护,信息公开透明的。 公链是最早的区块链,BTC、以太坊等虚拟数字货币都是基于公链的。 但是,目前公链的实际应用价值并不大,也没有特别适合的应用场景。

(2) 联盟链

联盟链:多个预选节点被某个群体指定为记账人,每个区块的产生由所有预选节点共同决定(预选节点参与共识过程),其他接入节点由您可以参与交易,但有权限限制,信息受到保护,如银联组织。 目前,联盟链是各个区块链技术团队的主要研究对象。 由于联盟链具有区块链技术的大部分特性,在权限管理、数据安全、监管等方面更具优势,是企业优先选择的区块链。 技术解决方案。

市面上也有一些主流的联盟链技术框架,使得联盟链的开发和维护更加容易。 国内一些大型软件厂商也有自己的企业区块链技术解决方案,如蚂蚁金服的区块链平台、腾讯的TrustSQL平台、东软的SaCa EchoTrust区块链应用平台、京东的区块链防伪溯源平台等。

(3) 私有链

私有区块链(Private Block Chains):仅使用区块链的总账技术进行记账。 它可以是公司或个人。 独享区块链写入权限,不易篡改区块链。 特点,使用区块链作为账本数据库。

三、关键技术及特点

(1) 共识机制

共识机制被称为区块链系统的灵魂,是区块链系统信任体系的基础。 区块链系统作为一个多节点的分布式账本系统,当有新的信息需要记录时,由哪个节点负责记账,由哪个节点获得记账奖励,由哪些节点负责验证记账结果,以及如何让每个节点达成最终共识,将网络中所有节点的记账结果按照相同的顺序复制记录下来,是共识机制必须做的事情。

根据百度百科:

所谓“共识机制”,就是通过特殊节点的投票,在极短的时间内完成交易的验证和确认。 对于一笔交易,如果几个利益不相关的节点能够达成共识,我们可以认为整个网络对这也能达成共识。 更笼统地说,如果一个中国微博大V,一个在美国的虚拟货币玩家,一个非洲留学生,一个欧洲旅行者,彼此不认识,但都一致认为你是个好人,那么基本上可以断定你还不错。

目前比较主流的共识算法有PoW、PoS、DPoS、PBFT等,在实际使用中,每种算法都有自己的优缺点。 区块链项目应用于不同场景时,会采用不同的共识机制和算法。

(2) 去中心化

去中心化是互联网发展过程中形成的社会关系和内容生产形态,是相对于“中心化”的新型网络内容生产过程。 在一个分布有很多节点的区块链系统中,每个节点都具有高度的自治权。 任何节点都可能成为阶段性中心,但不具备强制性的中心控制功能。 节点之间的影响将通过网络形成关联关系。 这种开放、扁平、平等的制度现象或结构,我们称之为去中心化。

去中心化系统具有容错性高、抗攻击能力强的特点。 一旦中心化系统出现问题,整个系统就会崩溃,但如果区块链系统中的任何一个节点出现问题,都不会对整个区块链网络造成太大的影响。

另外,脱媒并不代表不接受监管。 “放权”归中控方和中介方,不归监管方。 监管节点可以轻松访问任何区块链网络。 并且由于区块链公开透明的特性,监管者可以更方便地监控整个系统的交易数据。

(3) 智能合约

从技术角度看,智能合约是部署在区块链上的一段程序代码。 当满足程序设定的条件时,就会在区块链上运行,得到相应的结果。 这种情况有点类似于微信的小程序。 区块链提供虚拟机和脚本语言。 用户根据脚本语言的语法开发具有一定业务逻辑的程序,并部署到区块链上。 当满足执行条件时,智能合约将被区块链虚拟机解释运行。

一个典型的应用就是以太坊平台的智能合约。 在这个平台上,用户可以通过几行代码实现自己想要的合约,实现不需要人为监督、不可篡改、自动运行的合约。 买卖房屋无需找中介,无需找公证人借钱……人们可以根据自己的需要随时随地发起合约。 它的执行不依赖于某个人或组织,所有的信任完全基于以太坊区块链平台本身。

(4) 不可篡改

大多数人习惯称其为不可篡改,但从技术角度来说,我个人认为称其为不可逆更为合适。 既然是计算机系统,增删改查都是基本的功能属性,但是区块链系统的删除和修改操作有点特殊。

区块链是由每个区块的哈希值连接起来的链式结构,区块的哈希值=SHA256(“当前区块的内容+前一个区块的哈希值”),任意对内容的任意修改区块会引起哈希值的变化,而哈希值的变化也会引起子区块哈希值的变化,进而引起整个区块链的变化。

因此,任何人想要修改区块的数据几乎是不可能的,除非他重新修改整个区块链中从创世块到最新区块的所有哈希值,而修改之后,必须是广播告诉网络中的所有其他节点,以便所有其他节点都可以接受修改。

但以目前计算机的计算能力,短时间内从头到尾修改整条区块链是非常困难的,而且即使修改完成如何添加btc节点,其他节点也不会接受修改,因为没有条件让所有节点达成共识。

4. 流行的区块链框架和应用

(1)公链应用:BTC网络

区块链1.0产品,对于比特币,中本聪是这样定义的:它是一种完全通过点对点技术实现的电子现金系统,可以使在线支付由一方直接发起并支付给另一方,而无需通过任何金融机构。

与所有货币不同,比特币不依赖于特定货币机构的发行。 它是根据特定算法通过大量计算生成的。 比特币经济在整个P2P网络中使用一个由众多节点组成的分布式数据库来确认和记录所有的交易行为。 并采用密码学的设计,保证货币流通各个环节的安全。 后来人们梳理出基于比特币网络技术解决信任问题的区块链技术体系,比特币网络原理成为区块链技术初学者的经典教材。

(2) 公链应用:以太坊网络

区块链2.0产品的代表,以太坊是一个开源的去中心化应用区块链平台(Dapp),它具有区块链技术的大部分特性,但与其他区块链不同的是,以太坊是可编程的,开发者可以用它来构建不同的应用,通过其专用的加密货币以太坊(“ETH”)提供去中心化的以太坊虚拟机(Ethereum Virtual Machine)来处理点对点合约(只是一些脚本代码)。 如果把比特币网络看成是一套分布式数据库,而以太坊更进一步,可以看成是一台分布式计算机:区块链是计算机的ROM,合约是程序,以太坊矿工是负责计算并充当CPU。

基于java开发一套完整的区块链系统详细教程(附源码)插图12

以太坊的概念是由程序员 Vitalik Buterin 在 2013 年至 2014 年间受到比特币启发后首次提出的,意为“下一代加密货币和去中心化应用平台”。 以太坊作为平台虽然可以在其上开发新的应用,但由于以太坊的运行与BTC网络相同,采用Token机制,平台性能不足,经常出现网络拥堵。 该平台用于学习、开发和测试 区块链技术还可以,但用于实际生产不太现实。

(3) 联盟链开发框架:Hyperledger Fabric

Hyperledger Fabric,也称为 Hyperledger,是 IBM 向 Linux 基金会贡献的商业分布式账本。 它是世界上最大的企业应用分布式开源项目。 和其他区块链技术一样,它也有账本,可以使用智能合约。 Fabric的智能合约可以有多种架构,可以使用Go、Java、Javascript等主流语言进行编程,也可以使用Solidity。

目前,Fabric已经得到阿里巴巴、AWS、Azure、百度、谷歌、华为、IBM、甲骨文、腾讯等互联网巨头的支持。 许多企业区块链平台都使用 Fabric 作为底层框架,例如 Oracle。 但由于IBM对区块链的定义强调区块链的分布式和不可变要素,弱化了共识机制,利用Kafka和zookeeper的“排序服务”来达成共识,所以也有业内人士称Hyperledger是“伪-blockchain”,但即便如此,也抵挡不住企业对Hyperledger的喜爱。 目前,Fabric 2.0版本已经正式发布。

(四)总结

目前公链在实际应用中的业务场景并不多,大多是挖矿题材或者在线养宠物游戏,并且由于数字货币的匿名性,一些不法分子利用这一特性进行利用利用数字货币进行洗钱、暗网交易等非法活动是各国的目标,我国的政策法规也是严令禁止的。 因此,对于技术人员来说,公链可以作为研究和学习的对象。 更实用。

目前大部分区块链企业的研究方向主要针对企业的联盟链和私有链,国家层面也在大力支持区块链技术的发展,尤其是区块链底层核心技术的研发。区块链,倡导将区块链作为核心技术自主创新的重要突破口,明确主攻方向,加大投入,着力攻克一批关键核心技术,加快推进区块链技术发展和产业创新. 然而,目前市场上主流的区块链平台大多仍被国外企业所垄断。 国产区块链底层核心技术的开发需要技术人员的加倍努力。

二、区块链技术的Java实现 1、区块链技术架构

基于java开发一套完整的区块链系统详细教程(附源码)插图14

目前主流的区块链技术架构主要分为五层。 数据层是底层技术,主要实现数据存储、账户信息、交易信息等模块。 数据存储主要基于 Merkle 树。 结构实现,账户和交易基于数字签名、哈希函数、非对称加密技术等多种密码学算法和技术,确保区块链中数据的安全。

网络层主要实现网络节点之间的连接和通信,也称为点对点技术,各个区块链节点通过网络进行通信。 共识层采用共识算法,让网络中的每个节点就全网所有区块数据的真实性和正确性达成一致,防止拜占庭攻击、51攻击等区块链共识算法攻击。

激励层主要是实现区块链代币的发行和分配机制,属于公链范畴,不做分析。 应用层一般将区块链系统视为一个平台,在平台上实现一些去中心化的应用或智能合约,平台提供运行这些应用的虚拟机。

接下来,我们将基于Java语言开发一个区块链小系统,实现数据层、网络层、共识层的部分功能,并用简单的代码直观抽象概念,以加深对上述区块链技术的理解。 理论理解。

2. 基于Java的区块链开发实践

(一)开发环境

开发工具VSCode

开发语言

爪哇

JDK版本

JDK1.8 或 OpenJDK11

开发框架

弹簧引导 2.2.1

工程管理

Maven3.6

测试工具

邮差

(二)区块链基础模型构建

区块是区块链系统的最小单位。 第一步是实现最简单的block结构,新建一个Block.java类,主要包括以下几个字段:

块.java

区块链是一种数据结构,其中块按照块哈希的顺序串联起来。 哈希值是通过哈希算法对区块进行二次哈希计算得到的数字摘要信息(不知道哈希函数的可以先百度了解SHA算法),用于保证信息的安全性块的安全性和整个区块链的有效性。 因此,在第二步中,我们添加一个计算区块哈希值的方法,使用SHA256算法,通过java实现:

CryptoUtil.java

第三步,创建链式结构对象,保存块对象,形成有序的块链表。 考虑到线程安全问题,采用CopyOnWriteArrayList来实现。 为了方便测试,让区块链结构存储在本地缓存中。 实际的区块链网络最终会实现持久层的功能,将区块链数据保存到数据库中。 例如BTC核心网使用KV数据库LevelDB:

BlockCache.java

第四步,有了区块链结构之后,我们需要添加一个新的方法来给区块链添加区块。 同时,我们每增加一个区块,都需要验证新区块的有效性,比如Hash值是否正确,新区块中前一个区块的hash属性的值是否等于前一个块的哈希值。

简单易懂的区块链入门教程

另外,区块链中必须有一个创世块,我们直接硬编码实现:

块服务.java

以上关键代码实现后,我们构建了一个非常简单的区块链模型,包括基本区块模型和区块链模型,可以生成新的区块并添加到区块链中。 接下来我们测试。

第五步,我们写一个Controller类来调用:

BlockController.java

第六步,系统测试

首先,系统启动后,先查看区块链中的数据,可以看到当前系统中的区块链是空的:

基于java开发一套完整的区块链系统详细教程(附源码)插图16

然后调用创建创世块的方法,查看返回结果:

基于java开发一套完整的区块链系统详细教程(附源码)插图18

我们将生成的创世区块添加到本地区块链中,转换成JSON字符串返回后,可以看到当前区块链中存储了一个区块对象,至此我们实现了一个简单的区块链。 实际的区块链系统模型要复杂得多,需要根据不同的业务场景扩展相应的领域,但基本特征是相同的。

(3) 共识机制的实现

在上一章中,我们实现了一个简单的区块链结构,能够生成和添加新的区块,但是问题来了,实际的区块链系统是一个多节点的、分布式的、去中心化的网络,各个节点通过网络进行交互并保存同样的整个区块链数据是实时同步的,那么我们生成的区块如何才能被其他节点识别并同步添加到所有其他节点呢? 这时候,我们就需要一套规则,让所有网络节点参与者达成共识,接受并保存新的区块,也就是所谓的“共识机制”。

正如理论基础中提到的,共识机制有很多种,各有优缺点。 接下来,我们将使用 java 代码来模拟我们最熟悉的一种机制的实现:工作量证明。 顾名思义,它是工作量证明,在基于POW机制的区块链网络中,节点通过计算随机散列hash的值来争夺记账权,并能够获得正确的值和出块是节点的具体算力。 性能,计算过程一般称为“挖矿”。

简单来说,区块链系统设定了一套计算规则,或者说是一套计算问题。 在一个新的区块产生之前,每个节点都被放入这个问题的求解计算中,哪个节点先计算出结果,并且在被其他节点验证和认可之后,这个节点将获得新区块的记账权并接收相应的系统奖励,共识结束。

典型的 PoW 共识机制应用是 BTC 网络。 在 BTC 网络中,共识计算的目标是找到一个满足特定要求的区块 Hash(哈希值)。 这个区块哈希值是工作结果的证明。 计算工作的目的就是找到这个证明值。 在上一章中,我们在测试的时候看到过这个Hash值:

BTC网络PoW使用的Hashcash算法的大致逻辑如下:

获取一些公开已知的数据数据(在BTC网络中,指的是区块头); 添加一个counter nonce,初始值设置为0; 计算连接的数据字符串和随机数的哈希值; 检查上一步的hash值是否满足某个条件,满足则停止计算,不满足则nonce加1,然后重复步骤3和4,直到满足这个特定条件遇见了。

接下来,我们使用Java代码来实现这个算法,并设置要满足的具体条件。 如果Hash值的前4位全为0,则计算成功(实际区块链网络中的具体情况要求比较高,计算对算力的要求也比较高。也很高,系统动态根据计算难度调整满足的具体条件,保证出块速度)。

第一步,我们新建一个共识机制服务类,添加一个“挖矿”方法,计算成功后,获取记账权,调用添加区块的方法,将区块添加到区块链中:

PowService.java

第二步,编写用于测试共识机制服务的Controller类方法:

BlockController.java

第三步,启动系统并进行测试。

首先执行:8080/create方法生成创世块。

接下来调用:8080/mine 方法进行工作量计算证明,生成新区块,添加到本地区块链:

基于java开发一套完整的区块链系统详细教程(附源码)插图20

下面我们来看一下系统的后台计算过程。 本次计算一共耗时1048ms计算出满足条件的Hash值,一共计算了4850次:

基于java开发一套完整的区块链系统详细教程(附源码)插图22

至此,我们已经实现了一个简单的工作量证明机制,并在当前区块链系统节点上运行,完成正确结果的计算并生成新的区块。

接下来,我们将开发一个P2P网络,实现多个节点同时运行。 当一个节点挖矿完成后,会通过P2P网络广播给其他节点。 其他节点通过验证后,将新生成的区块添加到自己身上。 在区块链上,进而保证整个区块链网络中所有节点的数据一致性。

(4) P2P网络开发

我们较早实现了一个基础的区块链系统,实现了PoW工作量证明共识机制。 正确的结果是通过挖矿计算出来的,并产生新的区块并加入区块链,但这些都是基于单个节点的运行,实际的区块链是一个分布式网络系统,多个节点同时运行,所有节点同时计算和抢夺记账权,共同维护一个完整的区块链。

接下来,我们基于Java的WebSocket实现一个Peer-to-Peer网络,实现多个节点之间的相互通信。 通过本章,我们将实现以下功能:

为了开发和测试本章的功能,我们最好准备两台电脑或者虚拟机,或者一个Docker集群环境,方便多节点运行测试。 如果只有一台电脑,每个节点的端口号可以设置不同。

第一步,整理发展思路

目前我们已经实现了单节点的出块,所以只需要实现各个节点的消息同步即可。

首先通过java代码实现p2p网络的服务端和客户端,每个节点既是服务端又是客户端。

然后,当节点启动时,它会在区块链网络上寻找有效节点并建立套接字连接(B​​TC网络可以通过使用“DNS”种子获取有效的BTC节点,它提供了比特币节点的IP地址列表) ,我们直接将节点列表配置到application.yml文件中。

然后,从连接的节点获取最新的区块信息。 如果当前节点是第一次运行,则获取整个区块链信息并在本地替换。

之后,每个节点同时挖矿和计算,先完成计算的节点,将生成的新区块广播给所有其他节点(实际区块链网络一直在计算,为了测试方便,我们手动触发一个节点挖矿)生成区块,然后广播给全网其他所有节点)。

最后,当节点接收到广播内容时,对接收到的新区块进行验证,验证通过后将其添加到本地区块链中。 验证的第一个条件是新区块的高度必须高于本地区块链的高度。

第二步先实现P2P网络服务器

新建一个P2PServer类,添加初始化服务器的方法:

P2PServer.java

第三步,实现P2P网络客户端

P2PClient.java

第四步,定义P2P网络同步的消息模型

同步消息模型,我们定义了四类,分别是:

BlockConstant.java

定义在节点之间传递的消息模型:

消息.java

第五步,实现广播给其他节点的方法

创建一个新的p2p网络服务类来发送消息,或者处理当前节点接收到的其他节点发送的请求。

P2P服务.java

第六步,制定消息处理路由

第五步,已经实现了消息的外发,这一步实现了消息的接收。

首先设计一条服务端和客户端共享的消息路由,将消息分发到相应的处理单元。

P2P服务.java

第七步,开发消息处理单元

After having the message routing, then write different processing units to process the block or blockchain information sent by other nodes. The general principle is: first verify the validity of the blocks or blockchain sent by other nodes, and then It is judged that their height is higher than the blockchain height of the current node, and if it is higher, replace the local blockchain, or add a new block to the local blockchain.

P2PService.java

3. Complete system operation and testing

The first step is to package and generate an executable jar package for testing

Prepare two machines (either a virtual machine or a Docker cluster) and run two nodes at the same time. The node information is as follows:

Node1Node2

IP地址

192.168.0.104

192.168.0.112