百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

用Java代码创建第一个区块链程序(java第一步怎么创建)

wptr33 2025-07-01 23:40 18 浏览

我们都看到了比特币和其他加密货币的规模。虽然这种在线货币的波动性是出了名的,但其背后的技术有可能从内到外扰乱每一个行业。因为区块链有着无限的应用范围,它每天都以新的方式出现。

在这篇文章中,我们将探讨区块链背后的体系结构以及分布式账本的工作原理。一旦你亲眼看到,你就会明白为什么那么多开发者将区块链视为一种新常态。我们还将深入学习如何创建自己的(基本)区块链序列和使用工作证明(挖掘)系统的简短教程。

理解区块链

首先,在我们自己尝试之前,我们都需要在区块链是什么以及它是如何工作的问题上保持一致。块有头信息,还有一组或一个block“块”数据。这些数据通常是加密货币世界中的一项交易,但可以进行调整。然后,链从 Genesis 块开始,并根据一个块中存储的事务或数据集的数量创建新的块。

一旦达到该阈值,将创建一个新块。这个新的链接到上一个,这就是区块链这个术语的来源。区块链也是不可变的。这是因为每个事务或数据集都涉及 SHA-256 哈希。块中的内容也被散列。这意味着每个块都有一个唯一的标识符,链接块的散列也存储在图中并散列。

因为区块链是不可变的,所以它们非常安全。基本上不可能搞乱一个。试图伪造交易数据或财产将是一项挑战。更重要的是,随着链条的增长,它变得更加安全。破坏这个系统的技术还不存在,这是个好消息。

区块链有三种类型:

  • 公共 ——公共区块链是开放给任何人看的。交易和数据都出现在分类账上,这意味着每个人都可以参与共识过程。
  • 联邦 ——与公共区块链相反,联邦不允许每个人都参与协商一致过程。相反,具有访问分类账权限的节点数量有限。
  • 私有 ——最后,私有区块链主要用于公司内部。这些仅限于能够访问区块链和执行交易的特定成员。

交易

接下来,让我们谈谈区块链内的交易。 区块链技术是分布式的 。因为它们只是附加的,所以很容易在网络中的节点之间复制区块链。虽然节点通常进行点对点通信(如比特币),但它们也可以通过HTTP通过API进行分散。

交易可以是任何东西。它可以有一个执行代码或者只是存储信息。随着新智能合约的推出,您可以看到这项技术正在发挥作用。本质上,这些智能合约是计算机协议,用于促进和验证数字合约。他们很可能会在制造业、银行业等行业成为主流。

让我们以比特币为例。对于比特币,有一笔一定金额的交易从所有者帐户转移到另一个帐户。此事务具有公钥和帐户ID以确保其安全。这些事务被添加到网络中,并汇集在一起。虽然他们在一个共享的网络中,但他们不在一个区块或链本身中。

这是怎么回事?归根结底是共识机制。你可能已经知道一种被称为挖掘的机制,它被比特币使用。有一个无休止的共识机制清单,要把它们全部列出需要很长时间。您需要知道的是,它们是收集事务、构建块并将这些块添加到链中以进行验证的算法或模式。

开始

如上所述,区块链是一个区块链或区块列表。每个块都有自己的数字签名以及前面块的数字签名。有些还可能包含事务信息之类的数据。数字签名称为散列。每个块自己的哈希是根据前一个块计算的。一个更改将影响此后的所有哈希。通过计算和比较,我们可以看到区块链是否有效。

因为数据的任何变化都会导致一个断链,让我们首先创建一个类块,它将为 Buffic 链形成基础。

public class Block {

    public String hash;

    Public String previousHash;

    Private String data;

    Private long timeStamp;

    //Block Constructor.

    Public Block(String data,String previousHash ) {

        this.data = data;

        this.previousHash = previousHash;

        this.timeStamp = new Date().getTime();

}

上面的代码以字符串哈希开头,这就是我们制作数字签名的地方。如您所见, previousHash 将保存最后一个块的哈希,字符串数据将保存整个块数据。因为我们有基础,所以现在我们可以生成一个数字签名。这意味着您必须选择加密算法。对于本例,我们将使用 SHA256 。为了得到这个结果,我们将导入
java.security.MessageDigest

import java.security.MessageDigest;

public class StringUtil {
    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(); // This will contain hash as hexidecimal
            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);
        }
    }   
}

这将创建一个StringUtil实用程序类,稍后我们将使用该类。这将获取一个字符串并应用SHA256算法返回生成的签名。有了新的助手,我们可以计算块类中的哈希值。为了计算散列,我们需要使用块的所有部分,我们不想被弄乱。

public String calculateHash() {
    String calculatedhash = StringUtil.applySha256(
            previousHash +
            Long.toString(timeStamp) +
            data
            );
    return calculatedhash;
}

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

    }

完美的现在是进行测试的时候了。我们需要创建一些块并在屏幕上显示哈希值。这样,我们就知道一切都在正常工作。因为 genesis(first) 块中没有上一个块,所以我们将输入“ 0 ”作为上一个散列的值。

public class Test {

    public static void main(String[] args) {
       
        Block genesisBlock = new Block(“Genesis block”, “0”);
        System.out.println(“Hash for block 1 : ” + genesisBlock.hash);
       
        Block secondBlock = new Block(“Second block”,genesisBlock.hash);
        System.out.println(“Hash for block 2 : ” + secondBlock.hash);
       
        Block thirdBlock = new Block(“Third block”,secondBlock.hash);
        System.out.println(“Hash for block 3 : ” + thirdBlock.hash);
       
    }
}

您的输出应该有三个块,每个块都有自己的数字签名。您的数字签名将具有不同的值,具体取决于您的唯一时间戳,但您正在取得进展。现在,是将块存储在 ArrayList 中的时候了。同时,我们将输入 gson 并将其视为 Json

import java.util.ArrayList;
import com.google.gson.GsonBuilder;

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

    public static void main(String[] args) {   
        blockchain.add(new Block(“Genesis 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));
       
        String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain);       
        System.out.println(blockchainJson);
    }

}

现在我们正在做更多的过程。您的输出更接近区块链的预期外观。最后,我们将检查我们的区块链的有效性。我们将在测试类中创建一个 ischainvalid() 布尔方法。这将遍历到目前为止我们创建的所有块,并将比较散列,看看它是否等于计算的散列,依此类推。

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);
        if(!currentBlock.hash.equals(currentBlock.calculateHash()) ){
            System.out.println(“Current Hashes not equal”);           
            return false;
        }
        if(!previousBlock.hash.equals(currentBlock.previousHash) ) {
            System.out.println(“Previous Hashes not equal”);
            return false;
        }
    }
    return true;
}

使用这段代码,如果对块有任何更改,那么您将得到一个错误的返回。如果你得到了一个真实的回答,你就成功地做到了。你用一个独特的数字签名将所有存储的数据块连接在一起。你已经准备好开始挖掘了。

最后的想法

因为区块链是去中心化的,所以没有一个权威机构为被接受的交易设置规则。区块链涉及一定程度的信任,因为这些交易存储在开放网络上。尽管这项技术有很多困惑,正如你在上面看到的,它并不像许多人想象的那么复杂。

随着越来越多的开发人员试图解决他们自己的采矿问题,我们看到了更多的工具来帮助他们。Loggly和Microsoft Azure等软件旨在使区块链更容易访问。开发者探索区块链世界有很多原因。首先,正如你在上面所看到的,它相对简单易学,而且在不久的将来,它也将成为一个受欢迎的职业。

虽然区块链不是云中的神奇数据库,但它是复杂技术交易的现代解决方案。毫无疑问,这项技术将继续存在。只有时间才能告诉我们,它在未来将如何继续应用。

原文链接:
https://javakk.com/2478.html

相关推荐

MySQL进阶五之自动读写分离mysql-proxy

自动读写分离目前,大量现网用户的业务场景中存在读多写少、业务负载无法预测等情况,在有大量读请求的应用场景下,单个实例可能无法承受读取压力,甚至会对业务产生影响。为了实现读取能力的弹性扩展,分担数据库压...

Postgres vs MySQL_vs2022连接mysql数据库

...

3分钟短文 | Laravel SQL筛选两个日期之间的记录,怎么写?

引言今天说一个细分的需求,在模型中,或者使用laravel提供的EloquentORM功能,构造查询语句时,返回位于两个指定的日期之间的条目。应该怎么写?本文通过几个例子,为大家梳理一下。学习时...

一文由浅入深带你完全掌握MySQL的锁机制原理与应用

本文将跟大家聊聊InnoDB的锁。本文比较长,包括一条SQL是如何加锁的,一些加锁规则、如何分析和解决死锁问题等内容,建议耐心读完,肯定对大家有帮助的。为什么需要加锁呢?...

验证Mysql中联合索引的最左匹配原则

后端面试中一定是必问mysql的,在以往的面试中好几个面试官都反馈我Mysql基础不行,今天来着重复习一下自己的弱点知识。在Mysql调优中索引优化又是非常重要的方法,不管公司的大小只要后端项目中用到...

MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)

目录1.索引基础...

你会看 MySQL 的执行计划(EXPLAIN)吗?

SQL执行太慢怎么办?我们通常会使用EXPLAIN命令来查看SQL的执行计划,然后根据执行计划找出问题所在并进行优化。用法简介...

MySQL 从入门到精通(四)之索引结构

索引概述索引(index),是帮助MySQL高效获取数据的数据结构(有序),在数据之外,数据库系统还维护者满足特定查询算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构...

mysql总结——面试中最常问到的知识点

mysql作为开源数据库中的榜一大哥,一直是面试官们考察的重中之重。今天,我们来总结一下mysql的知识点,供大家复习参照,看完这些知识点,再加上一些边角细节,基本上能够应付大多mysql相关面试了(...

mysql总结——面试中最常问到的知识点(2)

首先我们回顾一下上篇内容,主要复习了索引,事务,锁,以及SQL优化的工具。本篇文章接着写后面的内容。性能优化索引优化,SQL中索引的相关优化主要有以下几个方面:最好是全匹配。如果是联合索引的话,遵循最...

MySQL基础全知全解!超详细无废话!轻松上手~

本期内容提醒:全篇2300+字,篇幅较长,可搭配饭菜一同“食”用,全篇无废话(除了这句),干货满满,可收藏供后期反复观看。注:MySQL中语法不区分大小写,本篇中...

深入剖析 MySQL 中的锁机制原理_mysql 锁详解

在互联网软件开发领域,MySQL作为一款广泛应用的关系型数据库管理系统,其锁机制在保障数据一致性和实现并发控制方面扮演着举足轻重的角色。对于互联网软件开发人员而言,深入理解MySQL的锁机制原理...

Java 与 MySQL 性能优化:MySQL分区表设计与性能优化全解析

引言在数据库管理领域,随着数据量的不断增长,如何高效地管理和操作数据成为了一个关键问题。MySQL分区表作为一种有效的数据管理技术,能够将大型表划分为多个更小、更易管理的分区,从而提升数据库的性能和可...

MySQL基础篇:DQL数据查询操作_mysql 查

一、基础查询DQL基础查询语法SELECT字段列表FROM表名列表WHERE条件列表GROUPBY分组字段列表HAVING分组后条件列表ORDERBY排序字段列表LIMIT...

MySql:索引的基本使用_mysql索引的使用和原理

一、索引基础概念1.什么是索引?索引是数据库表的特殊数据结构(通常是B+树),用于...