Java抒写简单区块链

2023-10-27

区块链的产生基础

区块链:是一种分布式数据库,是一串使用密码学方法相关联产生的数据块链表,每个数据块都包含了一次网络交易信息,用于验证其信息的有效性和生成下一个区块。 
 

其特点:

1.去中心化:实现点对点直接交互,既节约资源,使交易自主化、简易化,又排除被中心化代理控制的风险

2.开放性:区块链可以理解为一种公共记账的技术方案,系统是完全开放透明的,账簿对所有人公开,实现数据共享,任何人都可以查账。

3.不可撤销、不可篡改和加密安全性: 区块链采取单向哈希算法,每个新产生的区块严格按照时间线形顺序推进,时间的不可逆性、不可撤销导致任何试图入侵篡改区块链内数据信息的行为易被追溯,导致被其他节点的排斥,造假成本极高,从而可以限制相关不法行为。

4.自治性:区块链采用基于协商一致的规范和协议(比如一套公开透明的算法),然后各个节点就按照这个规范来操作,这样就是所有的东西都有机器完成,就没有人情成分。 使得对"人"的信任改成了对机器的信任,任何人为的干预不起作用

5.匿名性:区块链上面没有个人的信息,因为这些都是加密的,是一堆数字字母组成的字符串,这样就不会出现你的各种身份证信息、电话号码被倒卖的现象。

区块链表现的数据形式:

区块链就是一串或者是一系列区块的集合,类似于链表的概念,每个区块都指向于后面一个区块,然后顺序的连接在一起。主要包括三个部分:自己的数字签名,上一个区块的数字签名,还有一切需要加密的数据(这些数据在比特币中就相当于是交易的信息,它是加密货币的本质)。每个数字签名不但证明了自己是特有的一个区块,而且指向了前一个区块的来源,让所有的区块在链条中可以串起来,而数据就是一些特定的信息,你可以按照业务逻辑来保存业务数据。

区块链分哪几种?

区块链包括公有连、联盟链、私有链三种。 
公有链:无官方发行机构,由参与者自行组成,任何节点都可以随时加入随时退出。

联盟链:节点加入需要申请和身份验证并签订协议,采用基于协议的共识机制,由预设的某些节点进行记。账、建立区块,实现分布式账本,全网所有几点都可以参与交易,并查看所有账本。

私有链:建立在某个机构内部,具体规则由机构自己来设定。

 

 

 

 

JAVA 抒写简单的区块

写一个区块object对象

package block;

import java.security.MessageDigest;
/**
 * 区块
 * @author luzhongliang
 *
 */
public class Block {

	/**
	 * 索引
	 */
	private int index;
	/**
	 * 前一个区块的hashValue
	 */
	private String previousHash;
	/**
	 * 时间梭
	 */
	private long timeStamp;
	/**
	 * date
	 */
	private String date;
	/**
	 * hash
	 */
	private String hash;
	/**
	 * nonce 难度系数调节值(用于计算符合难度系数的变化量)
	 */
	private long nonce;
	
	
	public Block(int index, String previousHash, long timeStamp, String date, String hash, long nonce) {
		super();
		this.index = index;
		this.previousHash = previousHash;
		this.timeStamp = timeStamp;
		this.date = date;
		this.hash = hash;
		this.nonce = nonce;
	}

	public int getIndex() {
		return index;
	}

	public void setIndex(int index) {
		this.index = index;
	}

	public String getPreviousHash() {
		return previousHash;
	}

	public void setPreviousHash(String previousHash) {
		this.previousHash = previousHash;
	}

	public long getTimeStamp() {
		return timeStamp;
	}

	public void setTimeStamp(long timeStamp) {
		this.timeStamp = timeStamp;
	}

	public String getDate() {
		return date;
	}

	public void setDate(String date) {
		this.date = date;
	}

	public String getHash() {
		return hash;
	}

	public void setHash(String hash) {
		this.hash = hash;
	}

	public long getNonce() {
		return nonce;
	}

	public void setNonce(long nonce) {
		this.nonce = nonce;
	}
	
}

BLOCK的处理

package block;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.NumberFormat;
import java.util.ArrayList;
import com.alibaba.fastjson.JSON;

public class BlockManger {

	/**
	 * 区块链:逻辑上链表形式,
	 * 存储根据具体运用设计
	 */
	private ArrayList<Block> blocKChain = new ArrayList<>();
	/**
	 * 难度系 越高 计算出下一个区块时间越长
	 */
	private static final int DIFFICULTY_NUM = 4;

	/**
	 * 根据难度系数生成的hash前缀
	 */
	private String DIFFICULTY_Str = "";

	public BlockManger() {
		StringBuffer buffer = new StringBuffer();
		for (int i = 0; i < DIFFICULTY_NUM; i++) {
			buffer.append(0);
		}
		DIFFICULTY_Str = buffer.toString();
	}

	/**
	 * 
	 * @param objectDate 数据交易的记录  为NUll创建起始区块
	 * @return
	 */
	public Block creatBlock(Object objectDate) {
		int index = 0;
		String previousHash = "0";
		String date = "Genesis:起始块";
		long timeStamp = System.currentTimeMillis();
		String hash;
		long nonce = 0;
		if (blocKChain.size() > 0) {
			/**
			 * 前一个区块
			 */
			Block previousBlcok = blocKChain.get(blocKChain.size() - 1);
			index = previousBlcok.getIndex() + 1;
			previousHash = previousBlcok.getHash();
			/**
			 * JSON 把交易数据专实体 转化为字符串
			 */
			date = JSON.toJSONString(objectDate);
		}else {
			if(objectDate!=null) {
				return null;
			}
		}
		try {
			/**
			 * 生成hash值  它的耗时即为挖矿时间
			 */
			while (nonce < Long.MAX_VALUE) {
				StringBuffer buffer = new StringBuffer();
				/**
				 * 需要加密的对象转化为字符串对象
				 */
				buffer.append(index).append(timeStamp).append(previousHash).append(date).append(nonce);
				
				timeStamp = System.currentTimeMillis();
				/**
				 * 这里使用SHA-256加密算法对其加密,生成的哈希值大小为 256 位
				 */
				MessageDigest digest = MessageDigest.getInstance("SHA-256");
				/**
				 * 放入block 对象中需要加密的对象 
				 */
				digest.update(buffer.toString().getBytes());
				/**
				 * 生成报文
				 */
				byte[] bytes = digest.digest();
				/**
				 * 转化为16进制最为Hash值
				 */
				hash = bytesToHexString(bytes);
				/**
				 * 判断是否符合难度设计
				 */
				if (hash.startsWith(DIFFICULTY_Str)) {
					return new Block(index, previousHash, timeStamp, date, hash, nonce);
				} else {
					/**
					 * 变量,用来找出符合难度的设计的Hash 
					 */
					nonce++;
				}
			}
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	/**
	 * byte转化为16进制的方法
	 * @param src
	 * @return
	 */
	private String bytesToHexString(byte[] src) {
		StringBuilder stringBuilder = new StringBuilder("");
		if (src == null || src.length <= 0) {
			return null;
		}
		for (int i = 0; i < src.length; i++) {
			int v = src[i] & 0xFF;
			String hv = Integer.toHexString(v);
			if (hv.length() < 2) {
				stringBuilder.append(0);
			}
			stringBuilder.append(hv);
		}
		return stringBuilder.toString();
	}


	/**
	 * 检验区块链 合法性
	 * @return
	 */
	public boolean cheakBolckChain() {
		if (blocKChain.size() < 2) {
			/**
			 *i=0为起始区块
			 * 从 i=1 加入的记录区块开始核验
			 */
			for (int i = 1; i < blocKChain.size(); i++) {
				//前一个区块
				Block previousBlcok = blocKChain.get(i - 1);
				//核验区块
				Block blcok = blocKChain.get(i);
				//hash 前后关联是否相等 
				if (!previousBlcok.getHash().equals(blcok.getPreviousHash())) {
					return false;
				}
				//hash 是否符合难度设计
				if (!blcok.getPreviousHash().startsWith(DIFFICULTY_Str)) {
					return false;
				} 
				//更具需要加密的内容重新加密生成新的hash  若不相等则内容被修改 
				StringBuffer buffer = new StringBuffer();
				MessageDigest digest;
				try {
					digest = MessageDigest.getInstance("SHA-256");
					buffer.append(blcok.getIndex()).append(blcok.getTimeStamp()).append(blcok.getTimeStamp()).append(blcok.getDate()).append(blcok.getNonce());
					digest.update(buffer.toString().getBytes());
					byte[] bytes = digest.digest();
					String hash = bytesToHexString(bytes);
					if(!hash.equals(blcok.getHash())) {
						return false;
					}
				} catch (NoSuchAlgorithmException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			return true;
		}
		return true;
	}
	
	public void add(Block block) {
		blocKChain.add(block);
	}
	
	public static void main(String[] args) {
		BlockManger blockManger=new BlockManger();
		blockManger.add(blockManger.creatBlock(null));
		blockManger.add(blockManger.creatBlock("1"));
		blockManger.add(blockManger.creatBlock("2"));
		blockManger.add(blockManger.creatBlock("3"));
		System.out.println(JSON.toJSON(blockManger.blocKChain));
	}
}

 

以上Java代码即为 简单的区块链表现表现形式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java抒写简单区块链 的相关文章

  • 【转载】【stm32】一键下载电路

    原创Nerute 2018 11 18 01 11 10 2361 首先感谢正点原子的开源资料 下面贴上正点原子一键下载电路的原理图 很显然 核心是一块CH340芯片 什么是CH 请看手册 再来就是引脚说明 了解一键之前 我们还得知道 st
  • jenkins-自动化打包部署

    环境 centos 7 2或者更新 rmp包 官方下载地址 Redhat Jenkins Packages java 1 8 0 安装 root jenkins yum install wget java 1 8 0 y root jenk
  • 滤波算法(一)

    滤波算法 算法一 一阶滤波算法 低通滤波器 首先要讲的是一阶滤波算法 也就是低通滤波算法 这个滤波算法对于低频的噪声具有非常好的效果 对于0到一定频率的信号是能够无失真接收的 这个算法通过硬件的电路推导 因其十分的简单 一阶滤波算法为 滤波
  • 认识正则表达式

    正则表达式re 正则表达式 re 是一套字符串数据筛选规范 在各种语言中 c c java python 都是通用的 对数据进行清洗 在不同的语言中使用流程不同 python中的用法 import re 导入re模块 自带库 result
  • Andriod 应用两种设计风格

    Andriod 应用两种设计风格 仿 iOS 风格 Andriod Design
  • db2插入 timestamp 类型 慎用

    表结构 create table tableName id varchar 8 not null date time timestamp 正确的方式 insert into tableName id date time values 000
  • Activity过度动画

    Activity过度动画 java代码 res文件 enter anim xml exit anim xml java代码 button setOnClickListener new View OnClickListener Overrid
  • c语言数字转字符串不用函数,不使用c的任何库函数 实现字符串到整数的转换 整数到字符串的转换...

    转载请标明出处 http www cnblogs com NongSi Net p 6805844 html 今天主要总结下 完成编程 1 除printf函数之外 不用任何c语言库函数 实现将字符串转化为整数的函数myatoi 可以支持负整
  • 大数据时代的Tcaplus游戏存储

    大数据时代的Tcaplus游戏存储 shiweizhang 2015 10 27 1 7k浏览 游戏开发数据分析场景 想免费获取内部独家PPT资料库 观看行业大牛直播 点击加入腾讯游戏学院游戏开发行业精英群711501594 摘要 大数据具
  • 怎么使用maven?

    文章目录 Maven环境搭建 创建maven项目 添加依赖 插件 添加依赖 javax servlet api 和 javax servlet jsp api 添加maven插件 运行项目 使用命令行方式运行项目 使用本地tomcat运行m
  • 【神经网络深度学习】--语义分割 Unet

    Unet 发表于 2015 年 属于 FCN 的一种变体 Unet 的初衷是为了解决生物医学图像的问题 由于效果确实很好后来也被广泛的应用在语义分割的各个方向 如卫星图像分割 工业瑕疵检测等 Unet 跟 FCN 都是 Encoder De
  • 两个无序的数组合并为一个有序的数组

    这道题很有意思 考察对于排序思想的理解 我相信大部分的人都写过两个有序链表的合并 不过前提是有序 这里是无序的 其次是链表合并指向变化 不许要开辟额外的空间就可以去做 这里不可以 因此是数组 你可以思考一下充满了挑战性 那么这道题该如何处理
  • STL之deque源码

    stl deque h 如果vector能满足你的需求 那么就使用vector 如果不得不使用deque 那么在进行一算法 尤其是sort 操作时 应该先把deque中的元素复制到vector中 执行完算法再复制回去 这样的效率往往要高于直
  • LA@0线性方程组的解摘要@记号说明

    文章目录 摘要 方程编号说明 摘要 n元线性方程组是包含n个未知量的线性方程组 它的解是一个n维向量 称为线性方程组的解向量 简称解 当线性方程组的解不唯一时 同一个 线性方程组的解向量之间具有一定关系 下面我们主要以线性方程组的向量方程形
  • 【数据分析】Pandas处理excel--导入+保存xlsx

    首先安装好pandas pip命令安装 本节案例数据表lesson4 xlsx Section 1 导入数据 用的pandas的read x 方法 x表示待导入文件的格式 导入 xlsx文件 使用read excel 文件路径 filePa
  • [渗透&攻防] 二.SQL MAP工具从零解读数据库及基础用法

    这是最近学习渗透和网站攻防的文章 希望能深入地学习这部分知识 自己作为一个初学者 前一篇文章从数据库原理解读了防止SQL注入 这篇文章通过SQLMAP工具简单介绍SQL注入及用法 自己仍在慢慢探索网络攻防和渗透 希望文章对你有所帮助 尤其是
  • 九十二.字符串算法问题(一)

    题一 判断字符串中有无重复字符 实现一个算法 确定一个字符串的所有字符是否全都不同 import java util Scanner public class LianXi public static boolean checkdiffer
  • virt-manager创建虚机需要指定的设置

    如果使用默认设置 鼠标键盘都不能用 也不能通过宿主机访问外网 所以在创建的时候 需要 好了 等到安装完毕 鼠标键盘在vnc中都能正常使用 也可以上网了
  • MATLAB读写.wav和.raw音频文件

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 wav文件格式 二 matlab代码 1 fread读 wav文件 2 fread读 raw音频文件 3 wav转raw 3 raw转wav 5 更改音频
  • String,StringBuffer,StringBuilder三者之间的联系和区别

    一 String 和 StringBuffer StringBuilder 相同点 String StringBuffer StringBuilder都是可以用来存储字符串的 不同点 1 String存储的字符串是不可变的 StringBu

随机推荐

  • 编译原理课设-设计一个词法分析器

    设计课设时时间紧凑 难免有些错误 文末还有完整的word可以直接下载使用 也可以直接私信我发你 文章目录 摘要 二 设计内容 一 目的 二 整体框架 三 设计类 四 项目技术 1 守卫锁lock guard C 11 2 正则表达式 C 1
  • MVC 服务端Api接口的开发

    总结上一个项目的服务器API开发的流程 附带源码下载 实现效果 存储客户端上传的订单数据到数据表 并展示到前端界面 共分为两个模块 此模块主要显示服务端如何存储数据 如何发送数据到前端界面 前后端建立的都是MVC项目 使用DTO模式传输数据
  • windows多用户远程登录工具 RDPWrap配置

    目录 准备 配置 完 准备 下载 在https github com stascorp rdpwrap releases tag v1 6 2下载RDPWrap v1 6 2 zip 下载后解压 配置 install bat右键管理员运行
  • (未解决)selenium.common.exceptions.NoSuchWindowException: Message: no such window

    执行代码如下 from selenium import webdriver from time import sleep if name main driver webdriver Chrome driver implicitly wait
  • 【1day】​万户协同办公平台 ezoffice未授权访问漏洞学习

    注 该文章来自作者日常学习笔记 请勿利用文章内的相关技术从事非法测试 如因此产生的一切不良后果与作者无关 目录
  • vue3中hooks的介绍及用法

    大家好 今天这篇文章是介绍一下vue3中的hooks以及它的用法 本文内容主要有以下两点 什么是hooks vue3中hooks的使用方法 一 什么是hooks hook是钩子的意思 看到 钩子 是不是就想到了钩子函数 事实上 hooks
  • 告别了夸克,我已经找到了比你更强大的浏览器

    老实说 夸克真的是一款非常不错的浏览器 但是随着更新这个app越来越臃肿 还搞起了付费网盘 很多人转身选择其他浏览器 以前也给大家推荐过Alook浏览器 X浏览器等 今天 再给大家推荐3款浏览器 比夸克更牛 更好用 不信就往下看吧 1 多御
  • 【论文精读】360MVSNet

    今天读的是发表在WACV2023上的MVS文章 该文章提出了基于全景相机的MVS pipeline 文章链接 点击前往 代码链接 暂未开源 文章目录 Abstract 1 Introduction 2 Related works 3 Met
  • day28 回溯

    93 复原IP地址 本质上是分割问题 判断一个分割的值是否有效 回溯需要去掉 78 子集 收集每个树的节点 90 子集II 收集每个树的节点 树层去重 package algor trainingcamp import java util
  • pycharm中的 opencv-python 没有函数提示的解决方案

    pycharm中用 pip install opencv python 安装的cv2可能没有函数提示功能 ctrl 鼠标左键 也不会进入源代码 解决方案如下 1 找到cv2对应python编译器的安装路径 pycharm左下角 将鼠标放在编
  • 什么是页缓存(Page Cache)(转载)

    我们知道文件一般存放在硬盘 机械硬盘或固态硬盘 中 CPU 并不能直接访问硬盘中的数据 而是需要先将硬盘中的数据读入到内存中 然后才能被 CPU 访问 由于读写硬盘的速度比读写内存要慢很多 DDR4 内存读写速度是机械硬盘500倍 是固态硬
  • teamviewer 试用期到期以后怎么卸载然后安装使用

    1 1 退出TeamViewer远程软件 卸载软件 2 2 按键盘的 win R 组合键打开 运行 输入 appdata 3 3 在弹出的窗口中 找到并删除TeamViewer文件夹 4 4 按键盘的 win R 组合键打开 运行 输入 r
  • 降噪电路_TWS蓝牙耳机降噪要选对蓝牙晶振

    如今 越来越多的手机开始取消3 5mm耳机接口 转而采用USB C接口耳机或是无线蓝牙耳机 但消费者对音乐分辨率的要求却始终有增无减 一项调查显示 音质已成为消费者选择耳机或音箱产品时最看重的因素 76 的受访者为此投了赞成票 79 的受访
  • 启动指定用户docker

    有段时间没用docker了 都不记得怎么操作了 启动指定用户docker 方法如下
  • 目标检测正负样本区分和平衡策略总结

    目标检测正负样本区分策略和平衡策略总结 一 知乎0 简介本文抛弃网络具体结构 仅仅从正负样本区分和正负样本平衡策略进行分析 大体可以分为 正负样本定义 正负样本采样和平衡loss设计三个方面 主要是网络预测输出和loss核心设计即仅仅涉及网
  • Darknet下的Yolo v3

    一 网址 https github com AlexeyAB darknet 二 训练自己的数据 检测人头 1 经过1周训练的效果图 总体上效果还是很OK的 检测精度也比较高 2 数据准备 2 1 标注工具 标注工具在我的其他博客里有说明
  • STM32微控制器综合实训8 PWM输出实验

    实验8 PWM输出实验 用STM32的定时器来产生PWM呼吸灯 文章目录 代码讲解 main c timer c 编译仿真 第一次仿真 第二次仿真 第三次仿真 第四次仿真 遇到的错误 总结 代码讲解 main c int main void
  • TortoiseGit 入门指南04:查看提交日志

    如果每次提交都按照规定格式书写提交信息 这样一来就可以使用日志功能来查看开发过程 找出所做的更改以及更改原因 在仓库中右击鼠标 选择 TortoiseGit Show log 打开日志对话框 默认日志对话框仅列出所选文件或目录及其子目录文件
  • hive设置为本地模式,从而避免MapReduce

    配置如下参数 可以开启Hive的本地模式 hive gt set hive exec mode local auto true 默认为false
  • Java抒写简单区块链

    区块链的产生基础 区块链 是一种分布式数据库 是一串使用密码学方法相关联产生的数据块链表 每个数据块都包含了一次网络交易信息 用于验证其信息的有效性和生成下一个区块 其特点 1 去中心化 实现点对点直接交互 既节约资源 使交易自主化 简易化