区块链java的demo_区块链-java入门Demo-Go语言中文社区

2023-11-19

正在创建第一个区块链.......

创建区块:00000d3c0681cd67f8050ab996e1400f99c0060ba4cb22d0c07685d9ae50cd10

正在创建第二个区块链.......

创建区块:00000eafdd53bed5586d480d7704169c45b25fcb0bc5846b16be6fbeee88ec69

正在创建第三个区块链.......

创建区块:00000a6391f185b143bfccf571ef660204f945f43cb4101e804b360d06c9af66

区块链是否有效的: true

[

{

"hash": "00000d3c0681cd67f8050ab996e1400f99c0060ba4cb22d0c07685d9ae50cd10",

"previousHash": "0",

"data": "我是第一个区块链",

"timeStamp": 1528268281634,

"nonce": 7033501

},

{

"hash": "00000eafdd53bed5586d480d7704169c45b25fcb0bc5846b16be6fbeee88ec69",

"previousHash": "00000d3c0681cd67f8050ab996e1400f99c0060ba4cb22d0c07685d9ae50cd10",

"data": "我是第二个区块链",

"timeStamp": 1528268301568,

"nonce": 340676

},

{

"hash": "00000a6391f185b143bfccf571ef660204f945f43cb4101e804b360d06c9af66",

"previousHash": "00000eafdd53bed5586d480d7704169c45b25fcb0bc5846b16be6fbeee88ec69",

"data": "我是第三个区块链",

"timeStamp": 1528268302664,

"nonce": 319404

}

]

Process finished with exit code 0

ff24deb958b5cc348b9e2bca0537577d.png

1.Blockpackage com.block;

import java.util.Date;

/**

* @Author: cxx

* 封装区块对象

* @Date: 2018/6/6 14:45

*/

public class Block {

public String hash;

//上一个区块的hash值

public String previousHash;

//每个区块存放的信息,这里我们存放的是一串字符串

private String data;

//时间戳

private long timeStamp;

//挖矿者的工作量证明

private int nonce;

//构造

public Block(String data,String previousHash ) {

this.data = data;

this.previousHash = previousHash;

this.timeStamp = new Date().getTime();

//根据previousHash、data和timeStamp产生唯一hash

this.hash = calculateHash();

}

//基于上一块的内容计算新的散列

public String calculateHash() {

String calculatedhash = StringUtil.applySha256(

previousHash +

Long.toString(timeStamp) +

Integer.toString(nonce) +

data

);

return calculatedhash;

}

//挖矿

public void mineBlock(int difficulty) {

//目标值,difficulty越大,下面计算量越大

String target = StringUtil.getDificultyString(difficulty);

//difficulty如果为5,那么target则为 00000

while(!hash.substring( 0, difficulty).equals(target)) {

nonce ++;

hash = calculateHash();

}

System.out.println("创建区块:" + hash);

}

}

2.StringUtilpackage com.block;

import java.security.MessageDigest;

import com.google.gson.GsonBuilder;

/**

* 工具类

* 创建数字签名、返回JSON格式数据、返回难度字符串目标

* @author pibigstar

*

*/

public class StringUtil {

//将Sha256应用到一个字符串并返回结果

public static String applySha256(String input){

try {

MessageDigest digest = MessageDigest.getInstance("SHA-256");

byte[] hash = digest.digest(input.getBytes("UTF-8"));

StringBuffer hexString = new StringBuffer();

for (int i = 0; i < hash.length; i++) {

String hex = Integer.toHexString(0xff & hash[i]);

if(hex.length() == 1) hexString.append('0');

hexString.append(hex);

}

return hexString.toString();

}

catch(Exception e) {

throw new RuntimeException(e);

}

}

//返回JSON格式数据

public static String getJson(Object o) {

return new GsonBuilder().setPrettyPrinting().create().toJson(o);

}

//返回难度字符串目标,与散列比较。难度5将返回“00000”

public static String getDificultyString(int difficulty) {

return new String(new char[difficulty]).replace(' ', '0');

}

public static void main(String[] args) {

System.out.println(getDificultyString(5));

}

}

3.BlockChainpackage com.block;

import java.util.ArrayList;

import com.google.gson.GsonBuilder;

/**

* 创建区块链

* @author pibigstar

*

*/

public class BlockChain{

//存放所有的区块集合

public static ArrayList blockchain = new ArrayList();

public static int difficulty = 5;//挖矿的难度,数字越大越难

public static void main(String[] args) {

System.out.println("正在创建第一个区块链....... ");

addBlock(new Block("我是第一个区块链", "0"));//创世块

System.out.println("正在创建第二个区块链....... ");

addBlock(new Block("我是第二个区块链",blockchain.get(blockchain.size()-1).hash));

System.out.println("正在创建第三个区块链.......");

addBlock(new Block("我是第三个区块链",blockchain.get(blockchain.size()-1).hash));

System.out.println("区块链是否有效的: " + isChainValid());

String blockchainJson = StringUtil.getJson(blockchain);

System.out.println(blockchainJson);

}

/**

* 检查区块链的完整性

* @return

*/

public static Boolean isChainValid() {

Block currentBlock;

Block previousBlock;

String hashTarget = new String(new char[difficulty]).replace(' ', '0');

//循环区块链检查散列:

for(int i=1; i < blockchain.size(); i++) {

currentBlock = blockchain.get(i);

previousBlock = blockchain.get(i-1);

//比较注册散列和计算散列:

if(!currentBlock.hash.equals(currentBlock.calculateHash()) ){

System.out.println("Current Hashes not equal");

return false;

}

//比较以前的散列和注册的先前的散列

if(!previousBlock.hash.equals(currentBlock.previousHash) ) {

System.out.println("Previous Hashes not equal");

return false;

}

//检查哈希是否被使用

if(!currentBlock.hash.substring( 0, difficulty).equals(hashTarget)) {

System.out.println("这个区块还没有被开采。。。");

return false;

}

}

return true;

}

/**

* 增加一个新的区块

* @param newBlock

*/

public static void addBlock(Block newBlock) {

newBlock.mineBlock(difficulty);

blockchain.add(newBlock);

}

}

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

区块链java的demo_区块链-java入门Demo-Go语言中文社区 的相关文章

  • 解决Proteus仿真时候提示Could not load simulator DLL错误

    之前在进行Proteus仿真时候 弹出来三个错误 分别是 1 Could not load simulator DLL E Program Files x86 BIN PROSPICE DLL 2 Could not find or run
  • 二阶电路的零状态响应

    二阶电路零状态响应公式推导 下图所示电路在 时电容和电感上储能都为零 即 t 0 时开关闭合 电压源 Us 开始对电路供电 现讨论 时响应的变化规律 电路的 KVL 方程为换路后电路的初始状态为 0 即 这是二阶线性非齐次微分方程 它的解由
  • vue中点击第一次没有触发按钮怎么操作_vue如何触发某个元素的单击事件?

    我来回答一波吧 因为没复习 导致知识点结合不紧密 原生的中 我们的写法是这样的 王蒿大爷 function myFunction document getElementById demo innerHTML Hello World wind
  • 程序员简历应该怎么写?

    说到程序员简历 这两个月 我看过不下10 000份简历 答主不是HR 也不是技术负责人 但是在网站的运营工作中 每天最开心的事情就是研究候选人的简历了 这些人中 有BAT的资深大牛程序员 也有90后程序员小鲜肉 有人到中年的程序员渴望去创业
  • MyBatis参数传入集合之foreach动态sql

    foreach的主要用在构建in条件中 它可以在SQL语句中进行迭代一个集合 foreach元素的属性主要有item index collection open separator close item表示集合中每一个元素进行迭代时的别名
  • 期货反向跟单--交易员的培养问题

    根据我们统计的数据显示 今年做国内期货反向跟单的团队 无论是从赢利金额 稳定性 还是成功概率 都比做国际期货的团队要高 尤其是最近纯碱 焦煤焦炭 PTA 红枣等几个品种的行情 更是频繁拉爆了很多盘手的账户 本文转发自公众号 反跟单交易 转载
  • 【Mysql】Communications link failure,The last packet sent successfully to the server was 0 millisecond

    项目背景是数据库和项目不在同一台服务器下 在启动时 突然遇到以下错误 Exception in thread main com mysql jdbc exceptions jdbc4 CommunicationsException Comm
  • Java图书馆

    io流用的不是很熟练 还有Book类的应用出了点问题 越改越错 从2个错误改到102个QAQ 孩子想哭 问了好多人也没改成 最后勉强成型 而且上个星期内分泌系统出了点小问题 天天往医院跑 开始敲的太晚了 现在要备战期末考 等期末考结束再改改
  • Linux系统编程:多线程交替打印ABC

    引言 分享关于线程的一道测试题 因为网上基本都是Java的解决方法 决定自己写一篇来记录一下线程的学习 问题描述 编写一个至少具有三个线程的程序 称之为线程 A B 和 C 其中线程 A 输出字符 A 线程 B 输出字符 B 线程 C 输出
  • Spring源码深度解析:文章目录

    文章目录 序号 内容 链接地址 1 一 Spring整体架构和源码环境搭建 https blog csdn net wts563540 article details 126686645 2 二 手写模拟Spring https blog
  • Windows server 2016 部署 AD域

    AD域的简单介绍 为什么要使用域 假设你是协会的系统管理员 管理高职部所有的机房 如果你要为每台电脑设置登录帐户 设置权限 比如是否允许登录帐户安装软件 那你要分别坐在所有电脑前一一设置 如果你要做一些改变 你也要分别在这所有电脑上修改 相
  • 【论文解读】NLP重铸篇之Word2vec

    论文标题 Efficient Estimation of Word Representations in Vector Space论文链接 https arxiv org pdf 1301 3781 pdf复现代码地址 https gith
  • mysql出现“ You can't specify target table '表名' for update in FROM clause”解决方法

    You can t specify target table 表名 for update in FROM clause 翻译为 不能先select出同一表中的某些值 再update这个表 在同一语句中 实例 表 result 表studen
  • (java 基础知识) Java打印---javax.print

    package com print import java io import javax print import javax print attribute import javax print attribute standard p
  • 华为OD机试 - 快递运输(Java)

    题目描述 一辆运送快递的货车 运送的快递放在大小不等的长方体快递盒中 为了能够装载更多的快递 同时不能让货车超载 需要计算最多能装多少个快递 注 快递的体积不受限制 快递数最多1000个 货车载重最大50000 输入描述 第一行输入每个快递
  • React Native_综合练习(react-navigation)

    据说 react natvigation是官方推荐使用的 搞不懂为啥官方放弃更新natigator了 所以在上篇文章的基础上使用react natvigation 1 StackNavigator 用来跳转页面和传递参数 2 TabNavi
  • Linux系统移植:Kernel 顶层 Makefile(下)

    Linux系统移植 Kernel 顶层 Makefile 下 继续分析 Linux 内核源码顶层 Makefile 执行过程 一 make defconfig 过程 与 uboot 的顶层 makefile 相同 在编译源码前 要用 mak
  • 解决openai网站拒绝访问的问题,Access denied,You do not have access to chat.openai.com

    解决步骤 清除浏览器的历史纪录数据 尝试更换科学上网节点 开启无痕浏览模式 我通过这三个步骤登录成功了 希望可以帮助到大家
  • F5杯—网络是有记忆的

    0x00 前言 CTF 加解密合集 CTF 加解密合集 0x01 题目 网络有记忆 我也有 所以 我想她了 提示 1 题目既提示 2 flag包括小写字母 单词 下划线 IDEgOChWMyVNM1wtGVhbI1NeMCE0Vy9RHVB

随机推荐

  • scanf函数的读取

    scanf的处理机制 scanf 以删除的方式从缓冲区读取数据 输入设备的数据存储缓冲区 比如键盘 也就是说 scanf从缓冲区读入一个数据项 该数据项在缓冲区中就被清除掉了 而如果scanf需要读取一个数据项 返现缓冲区当前是空的 那么程
  • 《斗破CPP》 第叁章(中) ---- 左值右值问题

    斗破CPP 第叁章将会分成上中下三部分分享给大家 上 偏向于讲述循环 中 讲1个中级难度的运算符 下 偏向于讲解具有强大功能的语句以及控制符 不管有基础还是没基础的小伙伴 都可以重点看看 上 后半部分 中 前半部分 下 后半部分小总结 目录
  • java实现简单的生成52张牌、三个人洗牌、码牌算法

    定义一个Pocker类 用于定义牌类 package demo public class Poker private String suit 花色 private int rank 数字 构造函数 public Poker String s
  • Java学习day17

    异常处理 异常处理机制 代码 public class Demo01 public static void main String args int a 1 int b 0 假如要捕获多个异常 从小到大 try if b 0 throw t
  • Mybatis一对多查询,分页显示问题解决方案

    分页查询在我们的开发中也许是遇到最多的功能 一张表的分页 多张表一对一功能的分页相信大家写来都是得心应手 但是在一对多分页查询的时候大家写法不对的时候 可能会遇到查询的总条数和实际总条数对不上的问题 不多说下面请看演示 1 先提供2张表的建
  • 3254 Corn Fields 这题解真的不能再详细了!

    题意 农场主John新买了一块长方形的新牧场 这块牧场被划分成 M M M行 N N N列 1
  • 大数据建模与数据模型工具

    一 什么是大数据 大数据一般指在数据量在10TB以上的数据集 通常有以下5个特点 1 容量 Volume 数据量大 数据量的大小决定所考虑的数据的价值和潜在的信息 2 种类 Variety 数据类型多 包括但不仅限于文本 音频 视频以及图片
  • Unity—UGUI

    每日一句 读数 学习 去更远的地方 才能摆脱那些你不屑一顾的圈子 目录 InputFiled输入框 例 用户名和密码 Toggle组件 案例 冷却效果 InputFiled输入框 Text Component 输入文本组件 Text输入内容
  • 菜鸟学python之计算第10次球体反弹高度

    题目 一球从100米高度自由落下 每次落地后反跳回原高度的一半 再落下 求它在第10次落地时 共经过多少米 第10次反弹多高 n 0 落地次数 high 0 反弹高度 hight 100 落地前n次高度 tour 0 经过的路程 for i
  • python string前加b的原因

    From https stackoverflow com questions 6269765 what does the b character do in front of a string literal they produce an
  • python 下载及安装-CentOS下python的下载及安装

    针对 CentOS下python的下载及安装 的问题 下面由IT产品经理 陆亦晓为您解答 Python这门编程语言在数据分析 数据发掘以及服务端开发等方面都有非常好的使用 我们之前介绍过Windows环境下python开发工具的安装 今天为
  • HTML 表格td中无内容时不显示边框的解决办法

    有时我们想实现不输入内容展示时 会不显示边框 解决方法 1 在单元格中加入一个空格 这样 td nbsp td 2 直接在table里这样写 table border 0 cellspacing 0 table
  • BUG处理流程图

    流程描述 1 测试人员发现bug提交给开发 2 开发人员判断是否是bug 3 如果是bug 进行修改 修改完成后更改bug状态为已解决 4 如果不是bug 退回给测试人员并描述退回原因 或为设计如此 或为外部原因 或者不能重现 5 开发人员
  • 【Linux】自动化构建工具:make/Makefile

    内容专栏 Linux操作系统基础 本文概括 工具使用的背景 理解make makefile工具 探索工作原理 文件修改时间的对比 PHONY伪目标 特性等 本文作者 阿四啊 发布时间 2023 9 14 背景 make 和 Makefile
  • C4D和3dmax有什么区别?

    很多小伙伴都知道3d Max和C4D都是一款三维制作软件 可是 很少见到游戏公司使用C4D软件制作模型呢 反而设计师们用的最多的就是3dmax 而C4D往往用于广告行业 那么C4D和3d max的区别是什么呢 一 性质不同 1 3Dmax
  • 2-4、React+antd页面UI美化——登录界面设计

    React Antd 实现组件的UI美化示例 目标UI 创建一个页面page 用于用户登录 要求页面简洁 美观 易懂 要求有背景 要求引入antd登录表单组件 要求有登录样式 基于antd的表单对页面完成简单的渲染 图示 UI拆解 背景渲染
  • linux spring mvc tomcat配置,Spring MVC配置详解

    一 Spring MVC处理流程 1 Spring MVC将所有请求都交由DispatchServlet进行处理 2 DispatchServlet获取HandlerMapping 处理映射器 然后找到对应的HandlerBean处理Con
  • python列表增加元素的三种方法

    本文主要介绍了关于python列表增加元素的几种操作方法 主要有insert方法 extend方法和append方法 每种方法给大家介绍的非常详细 希望对你有所帮助 1 insert方法 该方法包含两个参数 第一个参数为插入的位置参数 第二
  • 解决Eclipse没有serve及无tomcat9.0

    网上一般提供的 Kepler repository http download eclipse org releases kepler 版本老 在Eclipse help install new 直接输入版本时间 出现如下 我的版本是201
  • 区块链java的demo_区块链-java入门Demo-Go语言中文社区

    正在创建第一个区块链 创建区块 00000d3c0681cd67f8050ab996e1400f99c0060ba4cb22d0c07685d9ae50cd10 正在创建第二个区块链 创建区块 00000eafdd53bed5586d480