Java实现简单的区块链

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

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

区块的实现

区块的基本属性有:

  • 当前区块的hash值

  • 前一个区块的hash值

  • 当前区块的数据值

  • 当前块的时间戳

其中,通过对前一区块的hash(若为第一个区块则为0)、当前区块的数据值和当前的时间戳进行加密处理,可以生成一个独一无二的属于当前区块hash值。

public class Block {
    public String hash;//当前块的哈希值
    public String previousHash;//前一个块的哈希值
    private String data;//当前块的数据
    private long timeStamp;//当前块的时间戳

    //初始化区块
    public Block(String data, String previousHash) {
        this.data = data;
        this.previousHash = previousHash;
        this.timeStamp = System.currentTimeMillis();
        this.hash = calculateHash();
    }

    //通过sha256散列算法生成hash值
    public String calculateHash() {
        String calculatedhash = 
            StringUtil.applySha256(previousHash 
                                   +Long.toString(timeStamp) 
                                   +data);
        return calculatedhash;
    }

}

sha256散列算法

之所以选用SHA256是因为它的大小正合适,一方面产生重复hash值的可能性很小,另一方面在区块链实际应用过程中,有可能会产生大量的区块,而使得信息量很大,那么256位的大小就比较恰当了。

public class StringUtil {
    public static String applySha256(String input){
        try {
            //指定使用的加密算法为SHA-256
            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            //计算当前输入数据的散列值
            byte[] hash = digest.digest(input.getBytes(StandardCharsets.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);
        }
    }
}

测试

创建一个链表用来存放区块,从而形成区块链。

public class NoobChain {

    public static ArrayList<Block> blockchain = new ArrayList<Block>();

    public static void main(String[] args) {
        //将每一个块添加到区块链中
        //传入块的信息:当前块的数据信息、上一块的hash值
        blockchain.add(new Block("The first block", "0"));
        blockchain.add(new Block("The second block", blockchain.get(blockchain.size() - 1).hash));
        blockchain.add(new Block("The third block", blockchain.get(blockchain.size() - 1).hash));

        //将区块链用整齐的格式打印出来
        String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain);
        System.out.println(blockchainJson);
    }
}

检验区块链的完整性

检验区块链是否完整,是通过验证当前块和上一块的hash是否正确来实现的。由于区块链的每个节点生成后便不可修改,所以当某一块的hash值发生变化时,则证明其数据等信息被篡改过,区块链不再完整。

     //判断区块链是否有效
    public static Boolean isChainValid() {
        Block currentBlock;
        Block previousBlock;
        //通过检查哈希值来判断是否是一个有效的区块链
        for (int i = 1; i < blockchain.size(); i++) {
            currentBlock = blockchain.get(i);
            previousBlock = blockchain.get(i - 1);
            //比较块中的注册hash和再次计算的hash值是否相同
            if (!currentBlock.hash.equals(currentBlock.calculateHash())) {
                System.out.println("Current Hashes not equal");
                return false;
            }
            //比较前一个块的hash值和当前块的previousHash值是否相同
            if (!previousBlock.hash.equals(currentBlock.previousHash)) {
                System.out.println("Previous Hashes not equal");
                return false;
            }
        }
        return true;
    }

区块链中的任何区块出现改变都会导致hash变化,这个函数返回false,也就证明了区块链无效了。

本文参考:java开发区块链只需150行代码

Java源代码保存在GitHub文章来源地址https://www.toymoban.com/news/detail-516521.html

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

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

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

相关文章

  • Discuz论坛网站标题栏Powered by Discuz!版权信息如何去除或是修改?

    当我们搭建好DZ论坛网站后,为了美化网站,想把标题栏的Powered by Discuz!去除或是修改,应该如何操作呢?今天飞飞和你分享,在操作前务必把网站源码和数据库都备份到本地或是网盘。   Discuz的版权信息存在两处地方,一个是标题栏,一个是底部。一般为了美化修改个标

    2024年02月08日
    浏览(83)
  • (C#) IIS 响应标头过滤敏感信息(如:Server/X-Powered-By等) 运维知识

    再一次净网行动中,客户要求安全改造发现了接口请求的header标头中出现如图中的敏感信息。   其意义在于告知浏网站是用什么语言或者框架编写的。解决办法就是修改该响应头为一个错误的值,将攻击者导向一个错误的方向。 这里只说windows 的iis环境,不考虑其他服务器的

    2024年02月11日
    浏览(73)
  • java超简单实现文档在线预览功能,支持word\excel\text\pdf\图片等格式转pdf,aspost 转pdf部署linux中文乱码解决方案

    一、背景         在工作中需要对上传到服务器的各种类型包括但不限于word、pdf、excel等文件进行在线预览,前端比较菜搞不定,只能本人亲自上。         网上的经验比较多也比较乱, 有的只有预览,没有文件格式转换,有的也不说linux存在字体问题, 本文会直白的给

    2024年04月10日
    浏览(147)
  • 金山办公推出WPS AI,开放应用于智能文档

    🦉 AI新闻 🚀 金山办公推出WPS AI,开放应用于智能文档 摘要:金山办公宣布WPS AI正式面向社会开放,首先用于WPS智能文档,该产品支持内容生成、表达优化、文档理解及处理等功能。用户可通过WPS客户端、App、金山文档小程序以及官网进行体验。WPS智能文档具备内容生成、

    2024年02月09日
    浏览(43)
  • Java实现区块链 --- 代码篇

    自身的hash值,上一个区块的hash值,保存的数据信息,时间戳,随机数。 需要手动添加一下gson的jar包 有了这两步,就能确保得到一共64位的哈希值,每一位上的数可以转换成4位2进制数,比如a转换成1010,64*4一共256位0和1组成的哈希值。 以第一个区块为例 https://gitee.com/ipkis

    2024年02月13日
    浏览(25)
  • 用Java代码实现区块链技术

    比特币很热门——这是多么轻描淡写的说法啊。虽然加密货币的未来有些不确定,但用于驱动比特币的区块链技术也非常流行。 区块链的应用范围几乎无穷无尽。可以说,它还有可能破坏企业自动化。关于区块链是如何运作的,有很多信息。我们有一份免费白皮书,介绍区块

    2024年01月15日
    浏览(64)
  • AIGC席卷智慧办公,金山办公如何架构文档智能识别与理解的通用引擎?

    如今,智慧办公是企业办公领域数字化转型的题中之义。作为国内最早开发的软件办公系统之一,金山办公如何应用深度学习实现复杂场景文档图像识别和技术理解?本文将从复杂场景文档的识别与转化、非文本元素检测与文字识别、文本识别中的技术难点等多个方面进行深

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

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

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

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

    2024年04月08日
    浏览(57)
  • Java 实现导出 Word 文档的方法详解

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 在 Java 应用程序中,有时候我们需要将数据导出为 Word 文档,以便进行文档的编辑、打印或共享。本文将介绍如何

    2024年02月15日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包