如何用 Java 实现简单的区块链

点击上方蓝色“程序猿DD”,选择“设为星标”

回复“资源”获取独家整理的学习资料!

640?

来源 | 公众号「锅外的大佬」

1.  概述

本文中,我们将学习区块链技术的基本概念。也将根据概念使用 Java 来实现一个基本的应用程序。

进一步,我们将讨论一些先进的概念以及该技术的实际应用。

2.  什么是区块链?

因此,让我们首先了解到底什么是区块链...

它的起源可以追溯到2008年 Satoshi Nakamoto 在比特币上发布的白皮书。

区块链是一个分散的信息分类账。它由通过使用密码学连接的数据块组成。它属于通过公共网络连接的节点网络。当我们稍后尝试构建一个基本教程时,我们会更好地理解这一点。

有一些我们必须要明白的重要属性,所以让我们来看看它们:

  • Tamper-proof [ 加密摘要 ]:首先也是最重要的,**数据作为块的一部分是防篡改的。**每个块都由加密摘要引用,通常称为哈希,使块防篡改。

  • Decentralized [ 分散化 ]:整个区块链是完全分散在网络上的。这意味着没有主节点,网络中的每个节点都有相同的副本。

  • Transparent [ 透明的,显而易见的 ]:每个参与网络的节点都通过与其他节点的协商一致来验证并向其链添加一个新块。因此,每个节点都具有完整的数据可视性。

3.  区块链如何工作?

现在,让我们了解区块链如何工作。

区块链的基本单位是块。一个块能封装多个事务或者其它有价值的数据:

640?wx_fmt=jpeg

我们用哈希值表示一个块。生成块的哈希值叫做“挖掘”块。挖掘块通常在计算上很昂贵,因为它可以作为“工作证明”。

块的哈希值通常由以下数据组成:

  • 首先,块的哈希值由封装的事务组成。

  • 哈希也由块创建的时间戳组成

  • 它还包括一个 nonce,一个在密码学中使用的任意数字

  • 最后,当前块的哈希也包括前一个块的哈希

网络中的多个节点可以同时对数据块进行挖掘。除了生成哈希外,节点还必须验证添加到块中的事务是否合法。先挖一个街区,就赢了比赛!

3.2.  添加块到区块链

当挖掘一个块在计算上很昂贵时,验证块是否合法相对来说十分简单。所有在网络上的节点都参与验证新挖掘的块。

640?wx_fmt=jpeg

因此,在节点协商一致时将新挖掘的块添加到区块链中。

现在,我们可以使用几种共识协议进行验证。网络中的节点使用相同的协议来检测链的恶意分支。因此,即使引入了恶意分支,大多数节点也会很快拒绝它。

4.  Java 中的基本区块链

现在我们已经有了足够的上下文来开始用 Java 构建一个基本的应用程序。

我们这里的简单示例将演示我们刚才看到的基本概念。生产级应用程序包含许多超出本教程范围的考虑因素。不过,我们稍后将讨论一些高级主题。

4.1.  实现块

首先,我们需要定义一个简单的 POJO 来保存块数据:

public class Block {	private String hash;	private String previousHash;	private String data;	private long timeStamp;	private int nonce;	public Block(String data, String previousHash, long timeStamp) {	this.data = data;	this.previousHash = previousHash;	this.timeStamp = timeStamp;	this.hash = calculateBlockHash();	}	// standard getters and setters	
}

让我们来看看我们在这里打包了什么:

  • 前一个块的哈希,构建链的重要部分

  • 实际数据,任何有价值的信息,如合同

  • 块创建的时间戳

  • nonce,是密码学中使用的任意数字

  • 最后,块的哈希,根据其它数据计算

4.2.  计算哈希

现在,我们如何计算块的哈希?我们使用方法  calculateBlockHash ,但是还没有看到实现。在实现这个方法之前,值得花时间了解一下哈希是什么。

哈希是哈希函数的输出。哈希函数将任意大小的输入数据映射到固定大小的输出数据。哈希对输入数据中的任何更改都非常敏感,不管这些更改有多小。

此外,仅从它的哈希中获取输入数据是不可能的。这些属性使得哈希函数在密码学中非常有用。

那么,让我们看看如何在  Java 中生成块的哈希:

public String calculateBlockHash() {	String dataToHash = previousHash 	+ Long.toString(timeStamp) 	+ Integer.toString(nonce) 	+ data;	MessageDigest digest = null;	byte[] bytes = null;	try {	digest = MessageDigest.getInstance("SHA-256");	bytes = digest.digest(dataToHash.getBytes(UTF_8));	} catch (NoSuchAlgorithmException | UnsupportedEncodingException ex) {	logger.log(Level.SEVERE, ex.getMessage());	}	StringBuffer buffer = new StringBuffer();	for (byte b : bytes) {	buffer.append(String.format("%02x", b));	}	return buffer.toString();	
}

这里发生了很多事情,让我们来详细了解一下:

  • 首先,我们将块的不同部分连接起来,生成一个哈希

  • 然后,我们从  MessageDigest 中获取  SHA-256 哈希函数的一个实例

  • 然后,我们生成输入数据的哈希值,它是一个字节数组

  • 最后,我们将字节数组转换为十六进制字符串,哈希通常表示为32位十六进制数字

4.3.  我们挖好了吗?

到目前为止,一切听起来都很简单和优雅,除了我们还没有挖掘过块。那么究竟需要挖掘一个块,这已经吸引了开发人员一段时间的幻想!

因此,挖掘一个块意味着为块解决一个计算上复杂的任务。虽然计算块的哈希值比较简单,但是找到以5个0开头的哈希值就不那么简单了。更复杂的是找到一个以10个0开头的哈希,我们得到了一个大致的概念。

那么,我们到底该怎么做呢?老实说,这个解决方案没有想象中的那么好!我们是用蛮力来达到这个目标的。我们在这里使用 nonce:

public String mineBlock(int prefix) {	String prefixString = new String(new char[prefix]).replace('\0', '0');	while (!hash.substring(0, prefix).equals(prefixString)) {	nonce++;	hash = calculateBlockHash();	}	return hash;	
}

让我们看看我们要做的是:

  • 我们首先定义要查找的前缀

  • 然后我们检查是否找到了答案

  • 如果没有,则增加 nonce 并在循环中计算哈希

  • 循环一直持续到我们中头奖

我们从 nonce 的默认值开始,并将其递增1。但是,在实际应用程序中,有更多复杂的策略来启动和增加  nonce。此外,我们没有验证我们的数据,这通常是一个重要的部分。

4.4.  运行示例

现在我们已经定义了块及其函数,我们可以使用它来创建一个简单的区块链。我们将它存储在一个 ArrayList  中:

List<Block> blockchain = new ArrayList<>();	
int prefix = 4;	
String prefixString = new String(new char[prefix]).replace('\0', '0');

此外,我们定义了一个前缀为4,这实际上意味着我们希望哈希以4个零开始。

让我们看看如何在这里添加一个块:

@Test	
public void givenBlockchain_whenNewBlockAdded_thenSuccess() {	Block newBlock = new Block(	"The is a New Block.", 	blockchain.get(blockchain.size() - 1).getHash(),	new Date().getTime());	newBlock.mineBlock(prefix);	assertTrue(newBlock.getHash().substring(0, prefix).equals(prefixString));	blockchain.add(newBlock);	
}

4.5.  区块链验证

节点如何验证区块链是否有效?虽然这可能相当复杂,但让我们考虑一个简单的版本:

@Test	
public void givenBlockchain_whenValidated_thenSuccess() {	boolean flag = true;	for (int i = 0; i < blockchain.size(); i++) {	String previousHash = i==0 ? "0" : blockchain.get(i - 1).getHash();	flag = blockchain.get(i).getHash().equals(blockchain.get(i).calculateBlockHash())	&& previousHash.equals(blockchain.get(i).getPreviousHash())	&& blockchain.get(i).getHash().substring(0, prefix).equals(prefixString);	if (!flag) break;	}	assertTrue(flag);	
}

所以,这里我们对每个块进行三次特定检查:

  • 存储的当前块的哈希实际上是它计算的内容

  • 当前块中存储的前一个块的哈希是前一个块的哈希

  • 当前区块已被开采

5.  一些先进的概念

虽然我们的基本示例展示了区块链的基本概念,但它肯定不完整。要将这项技术投入实际应用,还需要考虑其他几个因素。

虽然不可能全部详细说明,但让我们来看看其中一些重要的:

5.1.  事务验证

计算块的哈希并找到所需的哈希仅仅只是挖掘的一部分。块由数据组成,通常以多个事务的形式存在。在成为块体的一部分并进行开采之前,必须对其进行验证。

区块链的一个典型实现是对一个块中可以包含多少数据做了限制。它还设置了如何验证事务的规则。网络中的多个节点参与验证过程。

5.2.  备用共识协议

我们看到的一致性算法如“工作证明”,被用来挖掘和验证块。但是,这并不是唯一可用的一致性算法。

还有几种其它一致性算法以供选择,如股权证明、权威证明和权重证明。所有这些都有其优缺点。使用哪一个取决于我们打算设计的应用程序的类型。

5.3.  挖掘报酬

区块链网络通常由自愿节点组成。现在,为什么有人想要为这个复杂的过程做出贡献并保持其合法性并不断增长?

这是因为节点因验证事务和挖掘块而获得奖励。这些奖励通常以硬币的形式与应用程序相关联。但是应用程序可以决定奖励是任何有价值的东西。

5.4.   节点类型

区块链完全依赖于网络来进行操作。理论上,网络是完全分散的,每一个节点都是相等的。然而,在实践中,网络由多种类型的节点组成。

虽然完整节点具有完整的事务列表,但轻型节点仅具有部分列表。此外,不是所有的节点都参与验证和确认。

5.5.  安全通信

区块链技术的标志之一是其开放性和匿名性。但它如何为内部交易提供安全保障?这基于加密和公钥基础结构

事务创始人使用私钥来保护它并将其附加到收件人的公钥。节点可以使用参与验证事务的公钥。

6.  区块链的实际应用

因此,区块链似乎是一项令人兴奋的技术,但它也必须证明是有用的。这项技术已经存在一段时间了,不用说,它已经在许多领域被证明是具有破坏性的。

它在许多其他领域的应用正在积极进行。让我们了解最流行的应用程序:

  • 货币:由于比特币的成功,这是迄今为止最古老、最广为人知的区块链应用。它们向全球人民提供安全、无摩擦的资金,不需要任何中央政府或政府干预。

  • 身份:数字身份正迅速成为当今世界的常态。但是,这会因安全问题和篡改而陷入困境。区块链在彻底改变这一领域是不可避免的,具有完全安全和防篡改的身份。

  • 医疗保健:医疗保健行业充斥着数据,大多由中央政府处理。这会降低处理此类数据的透明度、安全性和效率。区块链技术可以提供一个没有任何第三方提供急需信任的系统。

  • 政府:这或许是一个很容易被区块链技术破坏的领域。区块链能够建立更好的政府与公民的关系。政府通常是几个公民服务机构的中心,这些机构往往充斥着低效和腐败。

7.  行业工具

虽然我们这里的基本实现有助于引出概念,但是从头开始在区块链上开发产品是不现实的。值得庆幸的是,这个领域现在已经成熟了,我们确实有一些非常有用的工具可以开始使用。

让我们来看一些在这个领域工作的流行工具:

  • Solidity:Solidity 是一种静态类型和面向对象的编程语言,专为编写智能合约而设计。它可以用来在像 Ethereum 这样的各种区块链平台上编写智能合约。

  • Remix IDE:Remix 是一个使用 solidity  编写智能合约的强大开源工具。这使用户可以直接从浏览器编写智能合约。

  • Truffle Suite:Truffle 提供了大量工具来帮助开发人员开始开发分布式应用程序。

  • Ethlint/Solium:Solium 允许开发人员确保他们写在 Solidity 上的智能合约没有风格和安全问题。同时,Solium 也有助于处理这些问题。

  • Parity:Parity 有助于设置在 Etherium 上智能合约的开发环境。它提供一种快速及有效的方法与区块链进行交互。

8.  结论

总而言之,本节中,我们了解了区块链技术的基本概念。我们了解网络如何挖掘并在区块链中添加新区块。此外,我们用 Java 来实现了基本概念。我们还讨论了一些与之相关的先进概念。

最后,我们总结了区块链的一些实际应用以及可用的工具。

640?wx_fmt=png

本文通过OpenWrite的免费Markdown转换工具发布

留言交流不过瘾

关注我,回复“加群”加入各种主题讨论群

640?wx_fmt=gif

朕已阅 640?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/44527.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国字号遥感算法大赛!涵盖主流视觉任务,头奖10万人民币!

点击我爱计算机视觉标星&#xff0c;更快获取CVML新技术 大赛背景 本届遥感图像稀疏表征与智能分析竞赛由国家自然科学基金委信息科学部、“空间信息网络基础理论与关键技术”重大研究计划指导专家组主办&#xff0c;旨在推动“空间信息网络基础理论与关键技术”重大研究计划科…

js 模拟超级大LE透中头奖 统计中头奖需要购买的彩票次数以及购买总金额

<!DOCTYPE html> <html> <head><title>超级大LE透模拟</title> </head><div id"container">超级大LE透<br>规则&#xff1a;超级大LE透基本投注是指从前区号码中任选5个号码&#xff0c;并从后区号码中任选2个号码的…

挖挖双色球——数据挖掘技术 分享

最近双色球比较热闹&#xff0c;因为河南1彩民独中双色球3.6亿巨奖&#xff01; 《媒体报道&#xff1a;2009年10月8日&#xff0c;国庆长假结束前的最后一天&#xff0c;在这个注定要被写进中国彩票史的日子&#xff0c;河南省安阳市成为了全国瞩目的焦点。当期中国福利彩票“…

成都程序员双色球中2682万!号码是电脑算出来的?

你人生中最狂野的梦想是什么&#xff1f; 如果是播妞来回答的话&#xff0c;播妞做梦都想中一次彩票头奖&#xff0c;彻底解放自己被贫穷限制的想象力&#xff0c;来一次不一样的人生&#xff01; 播妞是没有这么幸运了&#xff0c;不过&#xff0c;近日&#xff0c;四川成都的…

Python网络爬虫和信息提取:(动态网站)双色球数据爬取及写入数据库Sqlite、json和Excel表

我想着拿什么练习下网络爬虫信息提取时&#xff0c;就想到了双色球&#xff0c;心想把往期数据提取出来也是个不错的主意&#xff0c;把数据保存下来以后做数据分析&#xff0c;根据分析结果去买双色球岂不是美哉&#xff1f;&#xff01;哈哈哈。。 当然这里仅是爬取和保存&am…

双色球

最近身边很多人玩双色球。。我也买了几期。 下面是双色球模拟程序&#xff0c;代码如下&#xff1a; package Test;import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList;…

双色球的概率

为什么80%的码农都做不了架构师&#xff1f;>>> 双色球所有的组合数&#xff1a;33x32x31x30x29x28/6/5/4/3/2/1x1617721088。因此随机买一注的话&#xff0c;中头奖的概率约为“一千七百七十二万分之一”。最近一期双色球为15028期&#xff0c;销售额为318 360 50…

java 随机生成双色球

1.描述 输入注数&#xff0c;Java随机生成双色球 2.代码 import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Random; import java.util.Scanner;public class Two_color_ball {// 随机生成双色球 前区 01-33 取6个数 后区…

诗歌与词曲收藏

《和子由渑池怀旧》-&#xff08;宋&#xff09;苏轼 人生到处知何似&#xff0c;应似飞鸿踏雪泥。 泥上偶然留指爪&#xff0c;鸿飞那复计东西。 老僧已死成新塔&#xff0c;坏壁无由见旧题。 往日崎岖还记否&#xff0c;路长人困蹇驴嘶。 《年轻的心》-席慕容 不再回头的 …

【情人节表白神器:送她一个HTML动态表白网站 带源码】

ChatGPT 介绍 ChatGPT 是由 OpenAI 开发的高级语言模型。它是一种基于变换器的神经网络&#xff0c;已经在互联网上的大量文本数据上进行了训练。这使得 ChatGPT 具有很强的语言理解能力&#xff0c;能够生成人类般的文本内容&#xff0c;如回答问题、生成摘要、翻译等。 近期…

基础知识6

知乎上的面试题&#xff1a;https://zhuanlan.zhihu.com/p/546032003 一、Topk问题以及变种&#xff0c;各种解法 微博的热门排行就属于 TopK 问题 TopK 一般是要求在 N 个数的集合中找到最小或者最大的 K 个值&#xff0c;通常 N 都非常得大。 算法的优点是不用在内存中读入全…

美云智数孔凡实:工业软件“突围战”——强化核心技术+渠道共赢生态丨数据猿专访...

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 “仿真和数字孪生是企业数字化发展中的刚需的&#xff0c;不论是什么制造业&#xff0c;都会有产品&#xff0c;有产品就会有制造的仿真。”——美云智数渠道产品BU总经理 孔凡实 随着元宇宙概念的火热&#xff0c;数字孪生…

日语毕业论文日文参考文献怎么找?

要说什么东西能够让一位当代大学生茶饭不思、日渐消瘦&#xff0c;那么论文一定能够排得上号。近些年&#xff0c;学术不端的行为在学术界受到越来越多的关注&#xff0c;对于学位论文的要求也越来越高。大家都知道&#xff0c;写出一篇学位论文很难。写出一篇日语毕业论文更是…

GPT 吞噬一切!我们还需要编程语言吗?

作者 | GPT-4 责编 | 唐门教主 出品 | 《智能之境》&#xff0c;一个由 AIGC 创作的栏目 编者按 「智能之境」专栏更新&#xff1a;AGI 的未来&#xff0c;究竟属于 Rust 还是 Mojo&#xff1f;或者我们还需要编程语言吗&#xff1f; LLVM 之父、苹果的编程语言 Swift 之父、新…

ChatGPT 技术首发上车,集度汽车官宣将融合文心一言;谷歌自研数据中心芯片取得新进展;Firefox 110 发布|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

第三课总结吴恩达 ChatGPT Prompt 免费视频

前两课在这里&#xff1a; 总结吴恩达 ChatGPT Prompt 免费课程 第二弹进阶吴恩达 ChatGPT Prompt 技巧 今天第三课&#xff0c;两个技巧 第一个&#xff0c;Prompt 迭代开发 熟悉我号《有关SQL》的朋友都知道&#xff0c;SQL 调优有经典的三板斧&#xff0c;最激动人心的是第三…

吴恩达 Chatgpt prompt 工程--5.Transforming

探索如何将大型语言模型用于文本转换任务&#xff0c;如语言翻译、拼写和语法检查、音调调整和格式转换。 Setup import openai import osfrom dotenv import load_dotenv, find_dotenv _ load_dotenv(find_dotenv()) # read local .env fileopenai.api_key os.getenv(OPE…

吴恩达 Chatgpt prompt 工程--2.Iterative-prompt

迭代分析和完善prompts&#xff0c;以从产品概况表中生成营销副本。 Setup import openai import osfrom dotenv import load_dotenv, find_dotenv _ load_dotenv(find_dotenv()) # read local .env fileopenai.api_key os.getenv(OPENAI_API_KEY)def get_completion(prom…

吴恩达 ChatGPT Prompt Engineering for Developers 系列课程笔记--07 Expanding

07 Expanding 本节示例如何用ChatGPT生成一封电子邮件的回复。 1) 定制化情绪 给定客户评论&#xff0c;我们根据评论内容和情绪产生定制的回复。下面是给定情感&#xff08;positive/negative&#xff09;&#xff0c;让ChatGPT产生相应回复的prompt。 """…

吴恩达ChatGPT课爆火:AI放弃了倒写单词,但理解了整个世界

明敏 杨净 发自 凹非寺量子位 | 公众号 QbitAI 没想到时至今日&#xff0c;ChatGPT竟还会犯低级错误&#xff1f; 吴恩达大神最新开课就指出来了&#xff1a; ChatGPT不会反转单词&#xff01; 比如让它反转下lollipop这个词&#xff0c;输出是pilollol&#xff0c;完全混乱。 …