热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

区块链java入门Demo

区块链-java入门Demo,Go语言社区,Golang程序员人脉社
正在创建第一个区块链....... 
创建区块: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


1.Block

package 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.StringUtil

package 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 

3.BlockChain

package 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 





推荐阅读
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • MySQL DateTime 类型数据处理及.0 尾数去除方法
    本文介绍如何在 MySQL 中处理 DateTime 类型的数据,并解决获取数据时出现的.0尾数问题。同时,探讨了不同场景下的解决方案,确保数据格式的一致性和准确性。 ... [详细]
  • 本文详细介绍了如何使用 MySQL 查询特定时间段的数据,包括今天、本周、上周、本月和上个月的数据。适合对 MySQL 查询感兴趣的读者。 ... [详细]
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 深入理解Java中的volatile、内存屏障与CPU指令
    本文详细探讨了Java中volatile关键字的作用机制,以及其与内存屏障和CPU指令之间的关系。通过具体示例和专业解析,帮助读者更好地理解多线程编程中的同步问题。 ... [详细]
  • 异常要理解Java异常处理是如何工作的,需要掌握一下三种异常类型:检查性异常:最具代表性的检查性异常是用户错误或问题引起的异常ÿ ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 本文详细介绍了Hive中用于日期和字符串相互转换的多种函数,包括从时间戳到日期格式的转换、日期到时间戳的转换,以及如何处理不同格式的日期字符串。通过这些函数,用户可以轻松实现日期和字符串之间的灵活转换,满足数据处理中的各种需求。 ... [详细]
author-avatar
卡瑙娇管
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有