首先弄清楚需要哪些信息

自身的hash值,上一个区块的hash值,保存的数据信息,时间戳,随机数。

创建一个Block类

package blockChain;import java.util.Date;/*** @author WuYongheng* @date 2022/10/22* @description*/
public class Block {public String hash;public String previousHash;private String data;private long timeStamp;private int nonce;/*** 区块构造函数** @param previousHash* @param data*/public Block(String data, String previousHash) {this.previousHash = previousHash;this.data = data;this.timeStamp = new Date().getTime();this.hash = calculateHash();}/*** 计算区块的hash值,使用SHA256加密算法* nonce每加一次,都会调用一次applySha256()方法** @return calculateHash*/private String calculateHash() {String calculateHash = StringUtil.applySha256(previousHash+ Long.toString(timeStamp)+ data+ Integer.toString(nonce));return calculateHash;}/*** 通过随机数nonce的递增,不断地尝试,得到符合要求的哈希值,使用SHA256加密* 人为制造哈希碰撞的可能性很低,可以认为随机数是唯一的** @param difficulty 困难度,表示哈希值的开头有多少个零*/public void mineBlock(int difficulty) {String target = StringUtil.getDifficultyString(difficulty);while (!hash.substring(0, difficulty).equals(target)) {nonce++;hash = calculateHash();}System.out.println("Block Mined!!! : " + hash);}}

创建一个工具类

需要手动添加一下gson的jar包

package blockChain;import com.google.gson.GsonBuilder;import java.security.MessageDigest;/*** @author WuYongheng* @date 2022/10/22* @description 工具类,负责加密,返回‘困难度’个零,解析json数据*/
public class StringUtil {/*** for循环的解释:0xff & hash[i]** @param input 未加密的字符串* @return 加密之后的字符串*/public static String applySha256(String input) {try {MessageDigest digest = MessageDigest.getInstance("SHA-256");
//            传入需要计算的字符串,把输入变成ascii值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);}}/*** 困难度是多少,就返回多少个零* 比如 difficulty=6 返回 000000* @param difficulty 困难度* @return 一个字符串*/public static String getDifficultyString(int difficulty) {return new String(new char[difficulty]).replace('\0', '0');}/*** 将数据以json的格式显示* @param o* @return*/public static String getJson(Object o) {return new GsonBuilder().setPrettyPrinting().create().toJson(o);}}

单独解释一下for循环

            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);}

理解:0xff & hash[i] 与 操作  hexString.append('0')  补零操作

有了这两步,就能确保得到一共64位的哈希值,每一位上的数可以转换成4位2进制数,比如a转换成1010,64*4一共256位0和1组成的哈希值。

创建一个测试类

package blockChain;import java.util.ArrayList;/*** @author WuYongheng* @date 2022/10/22* @description 测试类*/
public class TestBlockChain {public static ArrayList<Block> blockchain = new ArrayList<Block>();// 设置挖矿困难度为5,会体现在哈希值,以5个0开头,困难度越大,计算花的时间越多public static int difficulty = 5;/*** 手动创建3个区块,将区块的内容以json的格式展示* @param args*/public static void main(String[] args) {System.out.println("Trying to Mine block 1... ");// 创世块,前一个区块的哈希值为 0addBlock(new Block("Hi im the first block", "0"));System.out.println("Trying to Mine block 2... ");addBlock(new Block("Yo im the second block", blockchain.get(blockchain.size() - 1).hash));System.out.println("Trying to Mine block 3... ");addBlock(new Block("Hey im the third block", blockchain.get(blockchain.size() - 1).hash));String blockchainJson = StringUtil.getJson(blockchain);System.out.println("\nThe block chain: ");System.out.println(blockchainJson);}/*** 创建新的区块* @param newBlock*/private static void addBlock(Block newBlock) {newBlock.mineBlock(difficulty);blockchain.add(newBlock);}
}

结果

"C:\Program Files\Java\jdk1.8.0_221\bin\java.exe" "-javaagent:D:\devenv\IntelliJ IDEA 2021.1.1\lib\idea_rt.jar=51144:D:\devenv\IntelliJ IDEA 2021.1.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_221\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\rt.jar;D:\code\before\csdncode\out\production\CSDNcode;C:\Users\Administrator\Desktop\学习笔记\老刘\jar包\gson-2.8.2.jar" blockChain.TestBlockChain
Trying to Mine block 1...
Block Mined!!! : 0000071d5ed7e99267ffbe73df5b01affe62928347bbe4032187f20fac1c8bb0
Trying to Mine block 2...
Block Mined!!! : 00000015080301d4e8a24786cc9ed85949fc96607d28373e04dfd5dd003a0233
Trying to Mine block 3...
Block Mined!!! : 0000096564160a2b6758839900780138760fb210044cb8685715646e4b511534The block chain:
[{"hash": "0000071d5ed7e99267ffbe73df5b01affe62928347bbe4032187f20fac1c8bb0","previousHash": "0","data": "Hi im the first block","timeStamp": 1666431244665,"nonce": 1214985},{"hash": "00000015080301d4e8a24786cc9ed85949fc96607d28373e04dfd5dd003a0233","previousHash": "0000071d5ed7e99267ffbe73df5b01affe62928347bbe4032187f20fac1c8bb0","data": "Yo im the second block","timeStamp": 1666431246529,"nonce": 656899},{"hash": "0000096564160a2b6758839900780138760fb210044cb8685715646e4b511534","previousHash": "00000015080301d4e8a24786cc9ed85949fc96607d28373e04dfd5dd003a0233","data": "Hey im the third block","timeStamp": 1666431247645,"nonce": 157564}
]Process finished with exit code 0

使用在线加密工具验证

以第一个区块为例

源码地址

https://gitee.com/ipkiss/csdncode

参考

sunny_ice

Java实现区块链 --- 代码篇相关推荐

  1. java玩转区块链-基础篇-账户

    java玩转区块链-基础篇--账户 java环境配置 基础概念 账户 maven包引用 创建账户代码 代码解释 (1) (2) (3) (4) 可以不让搞,但是不允许你不会 java环境配置 jdk版 ...

  2. java玩转区块链-基础篇-solidity语法-基础类型

    java玩转区块链-基础篇-solidity语法-基础类型 java环境配置 代码准备 maven 完整solidity 执行步骤 基础类型 布尔类型 类型标识: 字面常量值: 运算符: 短路规则: ...

  3. 以太坊2.0区块链代码将于下个月最终确定

    POW转POS: 以太坊(ETH)备受期待的权益证明(POS)区块链代码最早将在下个月确定下来. POS机制(Proof of stake)是基于矿工们目前拥有的数字货币数量分配,一种根据你持有货币的 ...

  4. 招募英雄-招募前端开发/Java开发/区块链开发工程师

    大量招聘前端开发/Java开发/区块链开发工程师,详情见大图,简历速速砸来哦.可以发送简历到图中的邮箱.

  5. java开发区块链只需150行代码

    本文目的是通过java实战开发教程理解区块链是什么.将通过实战入门学习,用Java自学开发一个很基本的区块链,并在此基础上能扩展如web框架应用等.这个基本的java区块链也实现简单的工作量证明系统. ...

  6. java开发区块链_使用Java语言从零开始创建区块链

    目前网络上关于区块链入门.科普的文章不少,本文就不再赘述区块链的基本概念了,如果对区块链不是很了解的话,可以看一下我之前收集的一些入门学习资源: 对区块链技术感到新奇的我们,都想知道区块链在代码上是怎 ...

  7. java调用区块链智能合约

    背景: 笔者学习了一段时间区块链,打算做一个区块链去中心化应用(DAPP).智能合约已经通过remix部署到了kovan测试链上,这篇文章介绍用Java版本的web3j框架与链上合约进行交互. 1.导 ...

  8. web3j官网的完整中文翻译(java开发区块链以太坊应用的开源类库)

    2019独角兽企业重金招聘Python工程师标准>>> web3j是一个轻量级.高度模块化.响应式.类型安全的Java和Android类库提供丰富API,用于处理以太坊智能合约及与以 ...

  9. hyperledger部署java_Hyperledger Fabric(超级账本) Java 开发区块链 部署运行智能合约

    部署并运行 Java 链代码示例 您已经定义并启动了本地区块链网络,而且已构建 Java shim 客户端 JAR 并安装到本地 Maven 存储库中,现在已准备好在之前下载的 Hyperledger ...

最新文章

  1. CentOS 安装与优化
  2. tp5备份mysql_tp5备份数据库
  3. OpenCV2.4.4中调用SIFT特征检测器进行图像匹配
  4. 也许,DOM 不是答案
  5. PMCAFF | 产品经理十宗罪(冷静反思篇)
  6. linux系统启动卡住不动了,CentOS启动失败 卡在开机进度条certmonger解决
  7. chromedriver与chrome版本映射表
  8. emqx—mqtt消息服务器
  9. C - Maximize GCD(简单数论)
  10. 常用JavaScript函数 59 - 70(自我总结)
  11. 【flink】Flink源码编译:Flink1.11+版本编译及部署
  12. 【Hive】Hive分区表
  13. Session一次错误记录
  14. Ubuntu上安装ns2-2.34
  15. Linux消息队列讲解
  16. MongoDB studio3T 破解
  17. 傅里叶快速算法(FFT)的理解与实现
  18. Google Code 中使用svn工具说明
  19. 龙芯3A3000 PCI 硬件问题
  20. LaTex编辑器编辑公式

热门文章

  1. Mono: dot.NET界的大谷翔平,双刀流祝你用Wine一马平川
  2. 支付宝APP用户提现,商家转账给支付宝功能
  3. 国土云举证DB照片查看工具
  4. 计算几何学(Computational Geometry)
  5. 配置nginx实现连接超时
  6. MapReduce运用-案例讲解
  7. 学微积,讲历史,不做迷路人
  8. java银行管理系统ui_java毕业设计_springboot框架的商业银行管理平台
  9. 机器学习之最全知识图谱
  10. 清明四汉武昌-岳阳处女行