主页 > imtoken最新app下载 > 使用JAVA,如何从头开始创建自己的区块链应用?

使用JAVA,如何从头开始创建自己的区块链应用?

imtoken最新app下载 2023-02-12 05:52:23

本文的读者主要是希望或将要从事区块链开发的项目架构师、开发工程师、项目设计师或产品设计师。 要求读者具备一定的《区块链》基础知识、概念和相关技术知识。

如果你只需要对区块链应用有更深入、更直观的了解,通过本文的例子更清楚地了解什么是区块链,它是如何发展起来的,如何使用它,那么了解一些区块链相关的知识就可以了.

如果你是一个想在这个领域工作的人,尤其是从事开发和架构的技术人员,那么需要的技术知识是相当多的,不可能一一列举。 可能需要高级网络开发工程师和中级以上的架构师。

前言

很多新的概念,刚开始接触的时候是很迷茫的,学了很多次之后也是迷茫的,不仅仅是技术,还有很多地方。 学习难以理解的概念的最有效方法是什么? 我一直觉得找个例子,或者写个demo,天下无难事,举个例子。 . .

近期,AI人工智能方兴未艾,区块链技术迎面​​而来。 对数字货币的兴起充满好奇的我们,大概想知道它背后的技术——区块链到底是个什么样的东西。 但要完全理解区块链并不容易,在实践中学习才是上策。

喜欢把程序写成诗,当然要写代码实现运行实例才能理解和学习这门技术。 在这里,我们通过用JAVA语言实现和构建一个区块链来讨论对区块链的理解。

在这篇文章中,我们将使用区块链来实现这样一个例子,叫做“区块链成语接龙”。 通过这个例子,用户可以继续接龙之前用户的成语。 规则与普通游戏相同。 前一个用户成语的最后一个词被用作下一个成语的第一个词。

单独作为一个应用程序,这是非常简单的。 问题是我们需要借助区块链的原理和相关技术来实现。

好的,我们走吧...

准备

这时候,我真的很想大喊一声:“区块链”不是一项简单的技术,而是基于某种思想的多种技术的结合。

需要的技术包括分布式存储、分布式计算、P2P数据同步、加解密、安全传输、一些语言、一些开发工具。 . . 还有一些新型概念——分布式节点、工作量证明、共识算法。 . 。ETC。

它基于什么样的思想? 大家都说是“去中心化”,我觉得是“反垄断”、“反……”。 敏感话题,我就不展开了。 但我其实是一个喜欢民主的人,所以区块链的“去中心化”对我还是比较有吸引力的。 . . 人人生而平等……J

本文涉及的例子有的来自网络,有的是Python版的,有的是Java版的,还有C版的。 考虑到JAVA更通用,更易读易写(其实我觉得JAVA语言更像诗歌),我把他们改成了JAVA版,所以要求读者看懂诗歌。。哦,不,对JAVA有很好的理解,能读写基本的语法框架和逻辑,由于本DEMO的特殊性,需要对网络框架和HTTP请求有基本的了解。

我们知道,区块链是数据块和链式存储方式的结合。 它是由N个以上的数据块按照链的组织和记录组成的一个不可改变的、有序的链结构。 记录可以是交易、文件或任何你想要的东西。 所需的数据,并且它们通过哈希链接。 因此,在阅读本文之前,你必须先阅读几篇关于区块链的文章,了解区块、链、数据、工作量证明等概念,最好也了解一些相关技术如Hash、分布式存储等概念。 . 如果你对这些不太了解,请找度娘。

如果你在理解这些概念的过程中不小心接触到了比特币,请理解比特币只是区块链技术的一种产品实现。 如果你接触过以太网等其他术语,你需要知道这些是在区块链技术下实现的一些框架和产品。

环境准备

从理论上讲,可以使用任何语言来创建任何技术的示例,包括区块链示例。 我们这里选择了JAVA,所以需要在自己的电脑上准备一个JAVA相关的开发环境。

确保你已经安装了更新版本的 JDK、Tomcat 和你熟悉的最能集成 Tomcat 的 JAVA IDE。 本例中使用 Eclipse。 Tomcat在我们的例子中是一个WEB工具,因为我们的项目需要基于WEB HTTP进行发布和运行。

如何安装Java和各种工具,包括如何用Eclipse创建Dynamic web项目并发布到Tomcat等。既然大家对JAVA已经很熟悉了,这里就不多说了。

开始创建区块链

块或数据块 Block 类

区块链中的每个区块包含以下基本内容:索引(index)、Unix时间戳(timestamp)、数据区块(data)(包括交易、文本、声明、奖励等任何和适当的内容)、证明或工作量证明( proof后面会解释)和前一个块的Hash值,Hash用来链接数据块,同时保证数据块不被非法修改。

下面是一个块的结构:

区块链与比特币_比特币全网公认的区块链选择采用_哈比特币区块链

Blockchain 实现 Blockchain 类

比特币全网公认的区块链选择采用_哈比特币区块链_区块链与比特币

区块链与比特币_哈比特币区块链_比特币全网公认的区块链选择采用

Blockchain 类用于管理链。 它可以存储和更新链数据,添加新的区块等。我们进一步增加和改进其中的一些方法。

创建新块和创世块

当用户根据成语接龙的规则匹配上一个成语,系统验证成语是否正确(工作量证明)。 此时我们可以创建一个新块并将其添加到链中。

一旦确认了工作量证明并生成了前一个块的哈希值,就可以通过简单地调用该函数来创建一个新块。

创建一个新块如下:

区块链与比特币_比特币全网公认的区块链选择采用_哈比特币区块链

在这里,我们需要提一下创世块的概念。 创世块是区块链的第一个块,它没有之前的块。 从逻辑上讲,只有当第一个用户第一次启动系统时才需要创建创世块,其余通过同步获取。 创世块的索引为0,还需要为其添加工作量证明。 这里我们是初始程序“海阔天空”,因为没有之前的区块,所以hash="",并且给出固定的创建时间。 方法如下:

哈比特币区块链_比特币全网公认的区块链选择采用_区块链与比特币

这里顺便贴一下生成区块Hash串的方法:

比特币全网公认的区块链选择采用_哈比特币区块链_区块链与比特币

区块链与比特币_比特币全网公认的区块链选择采用_哈比特币区块链

了解工作量证明

新区块的产生必须依靠工作量证明算法(PoW)来构建。

PoW 的目标是找到一种公认的方法来证明你所做的事情的正确性。

在目前的区块链应用中,PoW 往往被设计为通过寻找一个满足一定条件的数字来证明。 这个数字可能很难计算,但很容易验证。

这就是工作量证明的核心思想。

为了便于理解,举个例子:

假设一个整数x乘以另一个整数y的乘积的Hash值必须以两个0'00'结尾,即hash(x * y) = xxxxxx...00。 设变量x=5,求y的值?

在Java中实现如下:

比特币全网公认的区块链选择采用_区块链与比特币_哈比特币区块链

最后得到y=69

因为MD5(5*69)=D81F9C1BE2E08964BF9F24B15F0E4900

随着区块链应用的扩展,应该有更合理的工作量证明算法。

在比特币中,使用一种称为 Hashcash 的工作量证明算法,它与上述问题类似。 矿工为了争夺出块权,竞相计算结果,甚至用N台电脑,这就是挖矿。 通常,计算难度与目标字符串需要满足的特定字符数成正比,矿工计算出结果后将获得比特币奖励。 当然,一旦计算出来,验证这个结果就很容易了。

哈比特币区块链_比特币全网公认的区块链选择采用_区块链与比特币

实施我们的工作量证明

我们的工作量证明还是比较简单的。 当用户输入下一个成语时,我们打开成语词典或百度查一下。 . . . 您可以知道它是否连接正确。

从系统的角度来看,我们可以通过调用外部开发查询接口,或者自带成语词典来实现这种工作量证明。 代码如下(这里引用了一个外部成语真伪查询接口):

比特币全网公认的区块链选择采用_区块链与比特币_哈比特币区块链

总结:通过以上讲解,阐述了区块链中涉及的一些新概念,如区块、创世区块、链上存储、工作量证明、主要数据形式和内容、Hash加密等。 同时,我们以《成语接龙》为例,在Java中构造相关的类和方法。

有了区块链项目的基本组件之后,接下来就是运行这些组件,构建一个真正可以运行的区块链项目。

启动区块链项目

众所周知,区块链是一种结合了分布式存储和分布式计算的技术和产品框架。 其核心是去中心化存储。 这意味着所有区块链数据都应该存储在用户本地而不是中央服务器上。 因此,真正的区块链产品需要在没有中心服务器支持的情况下解决以下基本问题:

1、每个客户端启动一个区块链产品时,如何将初始区块数据下载到本地;

2. 新区块添加时,不同用户添加区块时,区块链内容的更新发布和时间冲突的处理;

3、日常运行中如何保证各客户端(节点)数据的最新、及时同步;

创建节点

在区块链项目中,运行区块链项目的用户终端称为节点。

每个用户在第一次启动一个区块链项目时,相当于创建了一个节点。 而以后每次启动这个项目,就意味着启动了这个节点。

为什么说创建节点呢? 原因很简单。 区块链的基本思想是去中心化。 也就是说,中间的任何一个终端都可以是中心,每一个都是点对点的组网模型,即P2P组网模型。 因为任何启动的终端,除了完成数据的下载、使用、计算外,还需要完成对外提供数据、同步、校验等功能。

区块链网络系统之所以选择P2P作为其组网模型,是因为两种思想的契合度; 区块链的基本出发点之一是去中心化。 中本聪在其白皮书中提出,在电子现金系统中,第三方系统是冗余的,没有价值,也就是说整个系统不依赖任何特殊的第三方来完成自身系统的运行; 而P2P网络的天然属性就是整个网络的节点都是平等的,没有特殊的节点。 ;因为区块链和点对点网络的构建思路高度兼容,P2P网络已经是成熟的网络技术; 两者几乎不可避免地会走到一起。

所以我们在这个例子中引入Tomcat。 一方面是将用户的一些操作转换到浏览器,方便演示。 另一方面是为了方便对外发布一些接口,模拟P2P对等网络之间的数据同步。

首先,我们使用Eclipse创建一个动态的WEB项目,导入上面的相关类,新建一个类似如下的index.jsp欢迎页面

比特币全网公认的区块链选择采用_哈比特币区块链_区块链与比特币

将项目发布到你安装的Tomcat中,启动Tomcat,输入以下地址,当看到如下图所示页面时,创建区块链项目“成语接龙”的节点准备工作已经完成。

比特币全网公认的区块链选择采用_区块链与比特币_哈比特币区块链

启动区块链应用,创建一个节点,每次启动应用,首先需要做的工作就是将区块链数据同步到本地或者更新本地的区块数据。 我遇到的第一个问题是,我怎么知道在哪里同步数据,或者我怎么知道可以同步数据的其他节点的地址?

百度了一圈,很多都说很模糊。 一般需要node-seed,即种子节点的支持。 最后找到区块链大师比特币的开发者的一段话,如下:

哈比特币区块链_比特币全网公认的区块链选择采用_区块链与比特币

翻译成中文,简而言之就是在代码中硬编码了一个域名数组和一个IP地址数组,程序启动的时候就把这些域名和IP联系起来了。

哈比特币区块链_区块链与比特币_比特币全网公认的区块链选择采用

当然,我觉得这种方法可以解决问题,但这或多或少让“去中心化”蒙上了一层淡淡的阴影。

然后根据我这个例子的模拟环境,我把公司局域网所有可能的IP都硬编码在程序里,一条条扫描找到最长的链条,作为下载区块链数据的扫描地址。 这是Java代码:

区块链与比特币_比特币全网公认的区块链选择采用_哈比特币区块链

比特币全网公认的区块链选择采用_哈比特币区块链_区块链与比特币

比特币全网公认的区块链选择采用_区块链与比特币_哈比特币区块链

应在应用程序启动时调用 DownloadData() 方法。 也有可能在应用程序执行期间调用后台间隔。

您可能会立即发现有一个额外的外部接口:

"+IP+":8080/区块链/chain.jsp

该接口需要由各个节点实现,用于输出本节点最新的区块链数据。 平时,各节点相互调用初始化和同步区块链数据。 本例中,简单实现如下:

新建一个chain.jsp页面,放在Tomcat路径下,把主要代码贴在里面

比特币全网公认的区块链选择采用_区块链与比特币_哈比特币区块链

用户如何挖矿

至此,我们可以稍微改进一下我们的示例程序,为后面的“挖矿”概念做准备。

改进后的产品界面如下

区块链与比特币_哈比特币区块链_比特币全网公认的区块链选择采用

启动应用程序,首先是数据同步的欢迎页面。 本页面使用ajax实现后台数据同步。

同步完成后输入手机号进入下一页。

哈比特币区块链_区块链与比特币_比特币全网公认的区块链选择采用

区块链与比特币_比特币全网公认的区块链选择采用_哈比特币区块链

注意在页面底部增加了自动更新区块链的功能,也是通过ajax实现的。

比特币全网公认的区块链选择采用_区块链与比特币_哈比特币区块链

所谓“挖矿”、“矿工”,无非是借用了比特币中的相关名词。 “矿工”即用户,“挖矿”是用户在区块链应用上所做的事情,一般具有一定的价值和目的。 在很多区块链应用中,“挖矿”就是为了完成某项工作。 从系统中获得一些奖励。

在我们的演示应用中,挖矿是指用户根据上一个成语想出并输入下一个成语,并遵守成语接龙的规则。 系统验证无误后,会为你在区块链上添加一条记录,同时也会发放奖励。 为了你的记录。

其实名字这么神奇,其实很简单。 系统做了以下三件事:

1、计算工作量证明PoW,验证用户提交的工作;

哈比特币区块链_比特币全网公认的区块链选择采用_区块链与比特币

2、对于“挖矿”成功的用户,通过增加一个新的区块,矿工,即用户,将获得一定的积分或虚拟货币奖励;

3. 构造一个新区块并加入链中,同步到各个节点。

代码如下:

哈比特币区块链_区块链与比特币_比特币全网公认的区块链选择采用

比特币全网公认的区块链选择采用_区块链与比特币_哈比特币区块链

这是几张单人纸牌游戏后的页面:

区块链与比特币_比特币全网公认的区块链选择采用_哈比特币区块链

这是打开本地的区块链数据文件“c:/blockchain/data.txt”,可以看到如下内容。 为便于查看,数据文件以明文txt格式存储。

比特币全网公认的区块链选择采用_区块链与比特币_哈比特币区块链

第一个是创世块的数据,它是区块链中的根块。

在实际项目中,数据文件的存储方式一般比较复杂,比如使用某种加密方式。

节点数据一致性(共识算法/共识算法)

至此我们有了一个基本的区块链产品和接口,可以进行简单的“挖矿”。 在应用启动的时候,我们也看到了第一次数据同步和后续数据定时同步的实现方式,在一个节点上运行是没有问题的。

但是,区块链系统应该是分布式的。 既然是分布式,那我们就需要考虑如何保证所有节点拥有同一条链? 这就是一致性问题。 如果我们想在网络上有很多节点并且保持它们的数据一致,我们必须实现一个一致的算法。

实现共识算法(consensus algorithm)

单个节点分布在电脑或手机等不同终端,它们各自独立工作,必然存在一定的冲突。 冲突主要来自两个方面,一是链长不一致,二是链分叉的产生。

用这个例子来说明。 第一种情况是每个节点同步后,各自做自己的topic,自己的链数据在膨胀,导致大家的链长不一致。 另一种情况是在某个区块下,有不同的答案都是正确的。 那么即使长度相同,链的内容也不一致。 比如在这个例子中,“海阔天空”可以接的成语有很多,比如“天空之城”、“前无古人后有来”、“空谈无凭”等,都是正确的. 在这种情况下,系统必须定义一个独特的算法。

解决上述问题的算法称为“共识算法”或“共识算法”。

通过上面的描述我们知道,“共识算法”实际上解决的是在完成“工作量证明”算法认可的工作后,如何公平合理地奖励不同用户(或不同节点)的问题。 他一定要通情达理,体现公平正义。 在不同的区块链应用中,不同的“工作量证明”基础下的实现方式是不同的。 在基于一些复杂的“工作量证明”的区块链应用中比特币全网公认的区块链选择采用,可以想象,这些复杂的“工作量证明”会导致需要非常复杂的“共识算法”来解决冲突。

如果每个节点在添加新区块时能够实时同步到每个节点,并且在同步过程中能够锁定其他节点,当然这是最理想的。 但实际上,在真实场景中,这是很难做到的。 网上有很多共识算法的讨论,大家可以查阅参考,但是很多里面都有一个问题,需要中心节点的支持。 我认为这是“去中心化”,不能接受,所以不当回事。

就这个例子来说,可以设计一个比较简单的“共识算法”,我们称之为最长链法。 为了解决这个问题,规定最长有效的链为最终链。 换句话说,网络中最长的有效链是实际链。 具体实现如下:

当用户完成一个成语接龙,系统判断答案正确时,他会计划添加一个新区块,希望将其添加到区块链中,但在此之前,系统会先扫描当前所有节点的当前链, 如果发现有一条链的长度比当前节点加一长,那么系统认为当前节点虽然完成了任务,但是已经不是跑得最快的人了,所以不再认可有效性这项工作。 并同时将最长链同步到本地,提示用户重新制作成语接龙。

在这种情况下,这个算法在理论上是合理的,因为不能说一个用户花了一分钟回答的答案,另一个用户花了一天时间回答,当然不能说后者有效。 我还没有更仔细地思考过这个“共识算法”的合理性。 作为演示,我暂时使用它。 下面说说本例实现需要的两种材料:

1. 每个节点都需要一个接口,可以在扫描后提供自己的区块链数据。 其实这个接口已经存在了,就是http://blockchain/chain.jsp。 回过头来看,在启动节点的时候,使用been;

2.实施共识算法方法,在每次“挖矿”完成后判断工作的有效性。

区块链与比特币_比特币全网公认的区块链选择采用_哈比特币区块链

共识算法如下:

比特币全网公认的区块链选择采用_哈比特币区块链_区块链与比特币

哈比特币区块链_比特币全网公认的区块链选择采用_区块链与比特币

添加“共识算法”后,界面变成如下:

哈比特币区块链_比特币全网公认的区块链选择采用_区块链与比特币

当用户提交成语时,系统会先通过Ajax检查区块链的一致性。 如果一致性通过,则用户提交的新成语将被添加到区块链中。 如果发现有更长的链条,系统会提示慢了一步,已经强化了,必须重新开始。

页面大致如下:

区块链与比特币_比特币全网公认的区块链选择采用_哈比特币区块链

发布并运行区块链成语接龙

至此,《区块链成语接龙》游戏基本搭建完成并进行测试。

接下来,你可以把这个项目打包成war,然后发布到你局域网内不同节点的机器上。 由于环境支持问题比特币全网公认的区块链选择采用,节点必须有Windows+JDK+Tomcat运行环境,并将项目打包成区块链。 war,把它放在你的Tomcat目录webapps下,然后启动Tomcat,打开你的浏览器,输入::8080/blockchain/

过程不再重复。 如果局域网环境和本地目录结构发生了变化,则需要对项目的某些部分稍作修改,例如:

哈比特币区块链_比特币全网公认的区块链选择采用_区块链与比特币

那么,你可以邀请你的同事和朋友来测试你的区块链成语纸牌!

总结

通过构建区块链项目,我们可以了解启动区块链项目所需的所有知识,环境所代表的概念及其基本算法。 在例子中,我们会一一讲解和实现,我们可以非常具体地体验到“去中心化”的真正含义。 其实可以在测试的时候添加很多终端,然后在中途关闭任意一个终端,看看产品是否还能正常运行。

即便如此,在这个过程中,我们也能看到一些问题并没有很好的、彻底的解决。 区块链作为一个新的概念和技术,这当然无可厚非。 同样,这也可以作为我们研究人员进一步慎重考虑的一个点。

1 关于种子节点的问题

当任何一个节点启动时,如何获取其他节点的位置信息,从而下载和初始化区块链? 种子节点的存在确实可以解决这个问题,但是种子节点本身就有“中心化”的概念。 所以,如果没有种子节点就好了,但是怎么实现呢?

关于“工作量证明”的 2 个想法

一项技术能否普及和商业化,或者对用户和社会是否具有真正的价值,取决于它能否解决我们特定生活场景的问题。 区块链中具体做的事情都在“工作量证明”中。 现在很多区块链项目,比如“比特币”,都是用计算机化的方法来描述和做某种工作。 但这种工作到底有多大意义,或者说有多大适用性,确实需要考虑。 这种方法对于产生“虚拟货币”是有好处的,但是“虚拟货币”有没有真正的价值呢? 还有,真的没有“中心节点”的支持就可以完成所有的工作吗? 因此,设计出更多符合人们生活场景的“工作量证明”算法,将大大拓展这项技术的前景。

关于“共识算法”的 3 个想法

“共识算法”与“工作量证明”密切相关,但所有“共识算法”都需要考虑解决至少两个问题。 当每个节点独立运行时,不可避免地会出现每个节点的区块链不同步的情况。 问题是不同步可能在时间上,或者在“工作量证明”的多个结果中。 这两者需要达成共识,以便系统中始终只有一个正确的链。 应该说难度很大。 网络有延迟,终端有差异,不同的结果都是在情理之中的。 如何做出公平的选择。 . . 等等 这不是那么简单。

4 关于海量区块链数据的同步速度

即使解决了上面1、2、3提出的问题,仍然存在数据同步速度的问题。

理论上,区块链的每个节点都应该是数据的完整备份。 在我们的例子中,同步数据量比较小,同步节点也不多,所以每次同步的时间都很短。 但是在商业系统中,如果节点数量多,数据量大,这个同步肯定是需要时间的。 一是节点存储容量的问题,二是同步带宽的问题,两者都是不可预测的。 目前,基于区块链的智能合约开发框架以太坊(Ethereum)需要同步的数据接近惊人的100G,而且还在不断增长。 我下载并安装了一个用于同步一周。 这么大的数据量,单纯的同步复制肯定是不合理的。 不仅会造成资源的巨大浪费,还会导致应用程序的可用性很差。 所以还有很多问题需要解决。

仔细研究以上任何一项都是一个巨大的课题。 做一个简单的区块链项目并不难。 估计要做出真正对社会有用而不是炒作的产品,还有很长的路要走。 具体来说,是一个需要好好解决的问题。 让我们一起努力吧。