基于Java编写第一个区块链项目

前言

区块链是数字加密货币比特币的核心技术。

区块链是一个称为块的记录列表,这些记录使用链表链接在一起并使用加密技术。

每个数据块都包含自己的数字指纹(称为散列)、前一个数据块的散列、时间戳和所做事务的数据,使其在任何类型的数据泄露时都更加安全。

因此,如果一个块的数据被改变,那么它的散列也会改变。如果散列被更改,那么它的散列将不同于下一个块,下一个块包含前一个块的散列,影响它之后的所有块的散列。更改哈希值,然后将其与其他块进行比较,这允许我们检查区块链。

区块链实施:以下是区块链实施中使用的功能。

1. 创建块:要创建块,将实现块类。在类块中:

  • hash哈希将包含块的哈希和
  • previousHash将包含上一个块的哈希。
  • 字符串数据用于存储块的数据和
  • long timeStamp用于存储块的时间戳。这里,long数据类型用于存储毫秒数。
  • calculateHash()生成散列

下面是类块的实现:

// Java implementation for creating
// a block in a Blockchain

import java.util.Date;

public class Block {

    // Every block contains
    // a hash, previous hash and
    // data of the transaction made
    public String hash;
    public String previousHash;
    private String data;
    private long timeStamp;

    // Constructor for the block
    public Block(String data,
                 String previousHash)
    {
        this.data = data;
        this.previousHash
            = previousHash;
        this.timeStamp
            = new Date().getTime();
        this.hash
            = calculateHash();
    }

    // Function to calculate the hash
    public String calculateHash()
    {
        // Calling the "crypt" class
        // to calculate the hash
        // by using the previous hash,
        // timestamp and the data
        String calculatedhash
            = crypt.sha256(
                previousHash
                + Long.toString(timeStamp)
                + data);

        return calculatedhash;
    }
}

2. 生成哈希:要生成哈希,使用SHA256算法。

下面是算法的实现。

// Java program for Generating Hashes

import java.security.MessageDigest;

public class crypt {

    // Function that takes the string input
    // and returns the hashed string.
    public static String sha256(String input)
    {
        try {
            MessageDigest sha
                = MessageDigest
                      .getInstance(
                          "SHA-256");
            int i = 0;

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

            // hexHash will contain
            // the Hexadecimal hash
            StringBuffer hexHash
                = new StringBuffer();

            while (i < hash.length) {
                String hex
                    = Integer.toHexString(
                        0xff & hash[i]);
                if (hex.length() == 1)
                    hexHash.append('0');
                hexHash.append(hex);
                i++;
            }

            return hexHash.toString();
        }
        catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

3. 存储块:现在,让我们通过调用Block类的构造函数将块及其哈希值存储在Block类型的ArrayList中。

// Java implementation to store
// blocks in an ArrayList

import java.util.ArrayList;

public class GFG {

    // ArrayList to store the blocks
    public static ArrayList<Block> blockchain
        = new ArrayList<Block>();

    // Driver code
    public static void main(String[] args)
    {
        // Adding the data to the ArrayList
        blockchain.add(new Block(
            "First block", "0"));
        blockchain.add(new Block(
            "Second block",
            blockchain
                .get(blockchain.size() - 1)
                .hash));

        blockchain.add(new Block(
            "Third block",
            blockchain
                .get(blockchain.size() - 1)
                .hash));

        blockchain.add(new Block(
            "Fourth block",
            blockchain
                .get(blockchain.size() - 1)
                .hash));

        blockchain.add(new Block(
            "Fifth block",
            blockchain
                .get(blockchain.size() - 1)
                .hash));
    }
}

4. 区块链有效性:最后,我们需要通过创建布尔方法来检查区块链的有效性。此方法将在“Main”类中实现,并检查散列是否等于计算的散列。如果所有哈希值都等于计算的哈希值,则该块有效。

以下是有效性的实施情况:

// Java implementation to check
// validity of the blockchain

// Function to check
// validity of the blockchain
public static Boolean isChainValid()
{
    Block currentBlock;
    Block previousBlock;

    // Iterating through
    // all the blocks
    for (int i = 1;
         i < blockchain.size();
         i++) {

        // Storing the current block
        // and the previous block
        currentBlock = blockchain.get(i);
        previousBlock = blockchain.get(i - 1);

        // Checking if the current hash
        // is equal to the
        // calculated hash or not
        if (!currentBlock.hash
                 .equals(
                     currentBlock
                         .calculateHash())) {
            System.out.println(
                "Hashes are not equal");
            return false;
        }

        // Checking of the previous hash
        // is equal to the calculated
        // previous hash or not
        if (!previousBlock
                 .hash
                 .equals(
                     currentBlock
                         .previousHash)) {
            System.out.println(
                "Previous Hashes are not equal");
            return false;
        }
    }

    // If all the hashes are equal
    // to the calculated hashes,
    // then the blockchain is valid
    return true;
}

区块链的优势

  • Blokchain是一个分布式系统网络。因此,数据泄露很难实施。
  • 由于区块链生成了每个区块的散列,因此很难进行恶意攻击。
  • 数据篡改将改变每个块的哈希值,从而使区块链无效

区块链如何工作?

区块链的基本单位是块。一个块能封装多个事务或者其它有价值的数据:

我们用哈希值表示一个块。生成块的哈希值叫做“挖掘”块。挖掘块通常在计算上很昂贵,因为它可以作为“工作证明”。

块的哈希值通常由以下数据组成:

  • 首先,块的哈希值由封装的事务组成。
  • 哈希也由块创建的时间戳组成
  • 它还包括一个 nonce,一个在密码学中使用的任意数字
  • 最后,当前块的哈希也包括前一个块的哈希

网络中的多个节点可以同时对数据块进行挖掘。除了生成哈希外,节点还必须验证添加到块中的事务是否合法。先挖一个街区,就赢了比赛!

总结

到此这篇关于Java实现区块链的文章就介绍到这了,更多相关Java实现区块链内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 区块链常用数据库leveldb用java来实现常规操作的方法

    前言 LevelDB 是一种Key-Value存储数据库百度百科上介绍 性能非常强悍 可以支撑十亿级这段时间在研究区块链的时候发现的这个数据库.LevelDB 是单进程的服务,性能非常之高,在一台4核Q6600的CPU机器上,每秒钟写数据超过40w,而随机读的性能每秒钟超过10w. 此处随机读是完全命中内存的速度,如果是不命中 速度大大下降,LevelDB 只是一个 C/C++ 编程语言的库, 不包含网络服务封装, 所以无法像一般意义的存储服务器(如 MySQL)那样, 用客户端来连接它. Le

  • 如何用120行Java代码写一个自己的区块链

    区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大家都非常想了解这一切是如何工作的.这篇文章就是帮助你使用 Java 语言来实现一个简单的区块链,用不到 120 行代码来揭示区块链的原理! "用不到120行 Java 代码就能实现一个自己的区块链!" 听起来不可思议吧?有什么能比开发一个自己的区块链更好的学习实践方法呢?那我们就一起来实践下! 因为我们是一家从事互联网金融的科技公司,所以我们采用虚拟资产金额作为这篇文章中的示例数据.大家可以先为自己想一个数字,后

  • 区块链java代码实现

    概述 MerkleTree被广泛的应用在比特币技术中,本文旨在通过代码实现一个简单的MerkleTree,并计算出Merkle tree的 TreeRoot. Merkle Tree 是一种数据结构,用于验证在计算机之间和之间存储,处理和传输的任何类型的数据. 目前,Merkle树的主要用途是确保从对等网络中接收的数据块未受损和未改变,和检查其他对等网络没有撒谎发送假数据块. Merkle Tree应用举例 比特币 GitA mazon's Dynamo Gassandra 比特币中的应用 比特

  • 使用Java实现简单的区块链程序的方法

    在本文中,我们将学习区块链技术的基本概念.我们还将用Java实现一个基本的应用程序,重点介绍这些概念. 此外,我们还将讨论该技术的一些先进概念和实际应用. 什么是区块链? 那么,让我们先来了解一下区块链到底是什么- 好吧,它的起源可以追溯到Satoshi Nakamoto在2008年发表的关于比特币的白皮书. 区块链是一个分散的信息分类帐.它由通过使用密码学连接的数据块组成.它属于通过公共网络连接的节点网络.当我们稍后尝试构建一个基本教程时,我们将更好地理解这一点. 我们必须了解一些重要的属性,

  • 基于Java编写第一个区块链项目

    前言 区块链是数字加密货币比特币的核心技术. 区块链是一个称为块的记录列表,这些记录使用链表链接在一起并使用加密技术. 每个数据块都包含自己的数字指纹(称为散列).前一个数据块的散列.时间戳和所做事务的数据,使其在任何类型的数据泄露时都更加安全. 因此,如果一个块的数据被改变,那么它的散列也会改变.如果散列被更改,那么它的散列将不同于下一个块,下一个块包含前一个块的散列,影响它之后的所有块的散列.更改哈希值,然后将其与其他块进行比较,这允许我们检查区块链. 区块链实施:以下是区块链实施中使用的功

  • 基于Java编写串口通信工具

    最近一门课要求编写一个上位机串口通信工具,我基于Java编写了一个带有图形界面的简单串口通信工具,下面详述一下过程,供大家参考 ^_^ 一: 首先,你需要下载一个额外的支持Java串口通信操作的jar包,由于java.comm比较老了,而且不支持64位系统,这里推荐Rxtx这个jar包(32位/64位均支持). 官方下载地址:http://fizzed.com/oss/rxtx-for-java (注:可能需要FQ才能下载) 不能FQ的童鞋,可以在这里下载: http://xiazai.jb51

  • 使用C#编写自己的区块链挖矿算法

    什么是加密货币挖掘? 一个加密货币的价值体现在它的稀缺性上,如果任何人都可以任意构造一个比特币,那么比特币就毫无价值,所以比特币的区块链会让参与者完成一项"工作",根据这个工作的最终结果还分发比特币,这个过程就被叫做"挖矿".这就类似于一个黄金矿工花一些时间来工作,然后获得一点黄金. 挖矿的原理 如果你百度/谷歌搜索 比特币挖矿的原理 的话,都会给你说是计算一个复杂的数学问题而已,但是这么说的话太笼统而且也太简单.采矿引擎如何工作这是一个重要的知识点,所以我们需要了

  • 基于Java编写简易的算式测试程序

    目录 1.程序功能 2.实现思路 3.具体代码 4.程序执行结果 1.程序功能 这个程序可以自动生成指定数量的加减乘 ”三则运算“ 题目,用户可以进行回答,在答题完毕后,会显示答对题数.准确率和所用时间.这不写一个测测亲戚家小孩 2.实现思路 首先,我们新建一个名为 Calculate 的 class 文件,然后就可以敲我们的代码啦.接着,我们先写一个 main 函数,然后第一步是创建一个 Scanner 对象,用来接受用户输入的题目数量.下一步我们定义几个变量来保存程序的信息,即 result

  • 基于java编写局域网多人聊天室

    由于需要制作网络计算机网络课程设计,并且不想搞网络布线或者局域网路由器配置等等这种完全搞不懂的东西,最后决定使用socket基于java编写一个局域网聊天室: 关于socket以及网络编程的相关知识详见我另一篇文章:Java基于socket编程 程序基于C/S结构,即客户端服务器模式. 服务器: 默认ip为本机ip 需要双方确定一个端口号 可设置最大连接人数 可启动与关闭 界面显示在线用户人以及姓名(本机不在此显示) 客户端: 需要手动设置服务器ip地址(局域网) 手动设置端口号 输入姓名 可连

  • 基于Java编写一个简单的风控组件

    目录 一.背景 1.为什么要做风控 2.为什么要自己写风控 3.其它要求 二.思路 1.风控规则的实现 2.调用方式的实现 三.具体实现 1.风控计数规则实现 2.注解的实现 四.测试一下 1.写法 2.Debug看看 一.背景 1.为什么要做风控 这不得拜产品大佬所赐 目前我们业务有使用到非常多的AI能力,如ocr识别.语音测评等,这些能力往往都比较费钱或者费资源,所以在产品层面也希望我们对用户的能力使用次数做一定的限制,因此风控是必须的! 2.为什么要自己写风控 那么多开源的风控组件,为什么

  • java开源区块链jdchain入门

    目录 前言 部署组件 傻瓜式部署 获取部署包 效果预览 部署遇到的问题: 网关里的异常 结语 前言 jdchain是京东数科开源的区块链平台,目标是实现一个面向企业应用场景的通用区块链框架系统,能够作为企业级基础设施,为业务创新提供高效.灵活和安全的解决方案. 之所以选择jdchain研究是因为jdchain是为数不多的底层也是采用java实现的一个区块链平台 项目地址:https://github.com/blockchain... 文档地址:https://gitee.com/jdchain

  • Spring Boot 整合 Fisco Bcos的案例分析(区块链)

    目录 简介 本地环境 主要流程: 1.Fisco Bcos环境搭建与验证 1.1.搭建单群组4节点联盟链: 1.2.检查证书 1.3.使用证书验证节点正确性 2.创建SpringBoot工程并配置依赖 2.1.创建SpringBoot工程: 2.2.配置pom.xml 3.2.配置节点证书: 3.3.编写controller 3.4.DemoBcosApplication默认不做修改 3.5.application.properties什么也没配置 4.生成jar包.部署服务器验证 4.1.本地

  • JavaScript实现区块链

    几乎每个人都听说过像比特币和以太币这样的加密货币,但是只有极少数人懂得隐藏在它们背后的技术.在这篇文中,我将会用JavaScript来创建一个简单的区块链来演示它们的内部究竟是如何工作的.我将会称之为SavjeeCoin! 全文分为三个部分: part1:实现一个基本的区块链 part2:实现POW part3:交易与挖矿奖励 Part1:实现一个基本的区块链 区块链 区块链是由一个个任何人都可以访问的区块构成的公共数据库.这好像没什么特别的,不过它们有一个有趣的属性:它们是不可变的.一旦一个区

随机推荐