Java实现区块链 --- 代码篇

这篇具有很好参考价值的文章主要介绍了Java实现区块链 --- 代码篇。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先弄清楚需要哪些信息

区块链代码,毕设,java,区块链

自身的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')  补零操作

区块链代码,毕设,java,区块链

有了这两步,就能确保得到一共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... ");
        // 创世块,前一个区块的哈希值为 0
        addBlock(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!!! : 0000096564160a2b6758839900780138760fb210044cb8685715646e4b511534

The 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

使用在线加密工具验证

以第一个区块为例

区块链代码,毕设,java,区块链

源码地址

https://gitee.com/ipkiss/csdncode

参考

sunny_ice文章来源地址https://www.toymoban.com/news/detail-542166.html

到了这里,关于Java实现区块链 --- 代码篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于SpringBoot+Vue的毕业设计与实现——Java毕设思路分享

    毕设选题经验分享:很多互联网专业的小伙伴们在选择自己的毕设主题的时候不知道做什么,在这时候就可以结合生活日常和当下较为流行的事物,通过对往年毕设的项目进行总结归纳,主题基本上都离不开旅游管理、移动办公、民宿服务系统、商城、博客、在线课程网站等

    2024年02月02日
    浏览(77)
  • 毕设开源 python区块链实现

    Hi,大家好,这里是丹成学长,今天向同学们介绍如何构建一个区块链系统作为毕设,区块链的原理 🧿 选题指导, 项目分享:见文末 学长以比特币的结构向大家详解区块链的组成部分 previous hash(前一个区块的hash) merkle root(默克尔树根节点,内部存储交易数据) timestamp(当前区块

    2024年03月14日
    浏览(58)
  • 61基于java的学生考勤管理系统设计与实现(可参考做毕设)

    本章节给大家带来一个基于java学生考勤管理系统设计与实现,可适用于学生考勤系统,校园考勤,大学考勤管理,企业考勤系统,公司考勤系统,学校考勤系统。 本文首先介绍了学生考勤管理系统的研究背景与意义,其次介绍了系统的总体功能设计,接着将对系统规划好的

    2024年02月09日
    浏览(39)
  • Java实现简单的区块链

    区块链可以简单抽象成将一个个区块存放在一个链表中,每新增一个块就把它放置在链表尾端,并通过区块之间信息的传递形成独一无二的hash,来确保区块链的数据未被篡改过。 区块的实现 区块的基本属性有: 当前区块的hash值 前一个区块的hash值 当前区块的数据值 当前块

    2024年02月11日
    浏览(31)
  • 90基于java的应急救援物资管理系统设计与实现(可参考做毕设)

    本章节给大家带来一个基于java应急救援物资管理系统设计与实现,可适用于java物资系统,java物资救援管理系统,springboot应急救援物资管理系统,java物资分配管理系统,javaWeb应急救援物资管理系统设计与实现 等等 目前世界各国都开始重视国家的应急处理能力,如何高效地利用

    2024年02月08日
    浏览(40)
  • Java实现一个简单的区块链

    区块链技术是近年来非常热门的话题,它在加密货币、供应链管理、智能合约等领域有着广泛的应用。本文将通过一个具体的Java代码案例,展示如何实现一个简单的区块链。我们将首先展示代码案例,然后逐步解析其中的关键技术和知识点,以便读者能够更好地理解和应用这

    2024年03月22日
    浏览(50)
  • 62基于java的高校奖学金管理系统设计与实现(可参考做毕设)

    本章节给大家带来一个基于java高校奖学金管理系统设计与实现,可适用于大学奖学金管理系统,学生奖学金管理系统,学校奖学金,校园奖学金申请管理系统; 以往的高校奖学金管理系统相关信息管理,都是工作人员手工统计。这种方式不但时效性低,而且需要查找和变更

    2024年02月08日
    浏览(46)
  • 【华为OD机试真题】区块链文件转储系统(java&python)100%通过率 超详细代码注释 代码解读

    【华为OD机试真题 20222023】真题目录 @点这里@ 【华为OD机试真题】信号发射和接收 试读 @点这里@ 【华为OD机试真题】租车骑绿道 试读 @点这里@ 知识点栈链表单调栈Q滑窗 时间限制:2s空间限制:256MB限定语言:不限 区块链底层存储是一个链式文件系统,由顺序的N个文件组成,

    2024年02月04日
    浏览(38)
  • java 实现区块链的密码学

    java 实现区块链的密码学今天分享,首先区块链行业相关的密码学有几个思路,比如对称加解密、非对称加解密、数字签名算法、散列hash相关的SHA-256加解密、Merkle树相关算法等等。今天我们主要采用java语言分享非对称加密和数字签名。 1、相关jar等配置,配置JDK1.8版本加上下

    2024年02月11日
    浏览(53)
  • 探索区块链世界:一款Java实现的开源库 - `blockchain-java`

    项目地址:https://gitcode.com/wangweiX/blockchain-java 在这个数字化的时代,区块链作为一种去中心化、安全且透明的技术,正逐步渗透到各行各业。如果你正在寻找一个简单的起点,以Java语言了解和探索区块链,那么 blockchain-java 项目无疑是你的不二之选。 blockchain-java 是由开发者

    2024年04月08日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包