仅仅用java就能简单实现区块链(BlockChain)

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

区块链逻辑:根据所需信息创建一个区块,再利用定义的计算hash值方法,不断进行计算,直到达到想要的结果,再通过层层验证,加入到我们的区块链中。

1.设置好成员属性

​
    //区块链
    List<Block> blockchain = new ArrayList<>();
    //哈希值,判断挖矿成功与否
    private String hash;
    //前块哈希值,便于之后验证成功与否
    private String previousHash;
    //所需存储数据
    private String data;
    //时间戳
    private long timeStamp;
    //用于判断”挖矿“成功的密码学数字
    private int nonce;
    //构析方法,得到所需信息
    public Block(String data,String previousHash,long timeStamp){
        this.data = data;
        this.previousHash = previousHash;
        this.timeStamp = timeStamp;
        this.hash = calculateBlockHash();
    }

2.计算hash值方法(“挖矿”方法)

所谓挖矿,就是进行不断地计算,直到“挖到”,而这步算法我们是借助hash算法完成的。

    //得到对应hash字符串
    //hash算法优势:输出格式一致,而且对数的变化十分敏感,对于之后验证挖矿成功与否作用巨大!
    public String calculateBlockHash(){
        //生成独属的字符串,方便之后转换
        String dataToHash = previousHash + Long.toString(timeStamp)
        + Integer.toString(nonce) + data;
        MessageDigest digest = null;
        byte[] bytes = null;
        try {
            //创建一个提供信息摘要算法的对象,初始化为SHA-256算法对象
            digest = MessageDigest.getInstance("SHA-256");
            //用对象调用,信息摘要计算方法,计算后获得字节数组
            //dataToHash.getBytes(UTF_8),将字符串转换为字节数组
            bytes = digest.digest(dataToHash.getBytes(UTF_8));
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
        //用缓存字符串
        StringBuffer buffer = new StringBuffer();
        for (byte b : bytes) {
            //延伸字符串
            //String.format("%02x", b),以十六进制输出,2为指定的输出字段的宽度.如果位数小于2,则左端补0
            buffer.append(String.format("%02x", b));
        }
        //返回字符串
        return buffer.toString();
    }

3.设置好挖矿成功的条件

老实说,“挖矿”这件事本身已经很抽象了,但是我们还需要沿着这条路,来考虑一个“挖到了”的情形。在我们“挖矿”实际是计算区块hash值的情形下,而我们的思路是:找到以四个0开头的hash值。

    //定义了一个前缀4,这实际上意味着我们希望哈希以4个零开始。
   
    int prefix = 4;
    String prefixString = new String(new char[prefix]).replace('\0', '0');

4.“挖到”方法

这里就体现了hash算法的价值,仅仅通过给nonce++,就可以显著的改变hash值,让其前缀可能达到“0000”。

而且由于只有nonce值并没有提供任何信息,所以对其进行赋值操作,完全没有问题。

    //开挖
    public String mineBlock(int prefix){
        //创建一个有perfix个的“0”的字符串
        String prefixString = new String(new char[prefix]).replace('\0','0');
        //找到开头有perfix多个0的字符串
        //substring方法是,从字符串几位读到几位
        while(!hash.substring(0,prefix).equals(prefixString)){
            //决定那个块
            nonce++;
            //通过nonce变化,更新hash值
            hash = calculateBlockHash();
        }
        //找到了
        return hash;
    }

5.添加一个区块

    //在区块链里添加一个块
    public void givenBlockchain_whenNewBlockAdded_thenSuccess() {
        //建立一个区块
        Block newBlock = new Block(
                "The is a New Block.",
                blockchain.get(blockchain.size() - 1).getHash(),
                new Date().getTime());
        //找到四个0的区块
        newBlock.mineBlock(prefix);
        //再次检验是否正确
        assertTrue(newBlock.getHash().substring(0, prefix).equals(prefixString));
        //添加一个区块
        blockchain.add(newBlock);
    }

6.区块链验证

为了保证区块的可靠性,我们就进行了多次验证,保证绝对正确。

验证:添加区块的hash值是否等于hash算法所得——》

添加区块的前区块hash值是否等于前区块的值——》

添加区块的hash值是否以“0000”开头

    //区块链验证
    public void givenBlockchain_whenValidated_thenSuccess() {
        boolean flag = true;
        for (int i = 0; i < blockchain.size(); i++) {
            //得到前区块的hash值
            String previousHash = i==0 ? "0" : blockchain.get(i - 1).getHash();
            //进行真伪判断
            //原理:判断hash是否等于计算的hash//判断储存的前区块hash是否等于真正的hash//判断是否满足“挖矿”成功的条件
            flag = blockchain.get(i).getHash().equals(blockchain.get(i).calculateBlockHash())
                    && previousHash.equals(blockchain.get(i).getPreviousHash())
                    && blockchain.get(i).getHash().substring(0, prefix).equals(prefixString);
            //一次不行就直接跳出
            if (!flag) break;
        }
        //进行正确性检验
        assertTrue(flag);
    }

现在已经完成了,开始制作自己的区块链吧,添加一些隐私信息,让别人无从知晓!文章来源地址https://www.toymoban.com/news/detail-784559.html

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

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

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

相关文章

  • Java实现Tron(波场)区块链的开发实践(一)环境搭建及简单实现

    最近在开发区块链相关项目时,因本人一直使用JAVA做开发语言,但是区块链开发对JAVA语言相对来说不是很友好。在开发过程中遇到很多的问题,甚至通过百度、Google都无法解决,官方文档大部分篇幅在介绍接口相关信息,对Java实现不多。 可是为了赚点钱,也是硬着头皮,经

    2024年04月08日
    浏览(52)
  • blockchain layer区块链分层

    目录 1.layer0 2.layer1 3.layer2 ​4.layer3   第0层的定义目前行业还没有完全一致的理解。多数人认为第0层是 加密数据连接层及其硬件 ,对应上图下半部分。 也有一些人把跨链或可以创建链的基础设施为作为第0层,他们的代表有: LayerZero、Substrate / Polkadot 及 Cosmos layer1是我们常说

    2024年02月09日
    浏览(49)
  • Blockchain classification区块链分类

    目录 1.public blockchain 2.private blockchain 3.consortium blockchain 区块链采用不同的共识机制,区块链分为三类:公链、私链、联盟链。 公链公开、透明的,信息对任何人都可见;任何人都可以在链上发起交易,任何人都可以按共识接入区块链。没有人可以修改链上数据、也没有机构或

    2024年02月09日
    浏览(39)
  • Go语言Blockchain与区块链

    区块链技术是一种分布式、去中心化的数字账本技术,它允许多个节点共同维护一个共享的、有序的、不可篡改的数据库。区块链技术的核心概念是通过加密技术和分布式共识算法来确保数据的安全性、完整性和可靠性。 Go语言是一种静态类型、垃圾回收、并发简单的编程语

    2024年02月20日
    浏览(38)
  • web3:区块链Blockchain

    在此声明,仅做分享,绝不存在倡导炒币行为

    2024年02月09日
    浏览(46)
  • 【Blockchain】区块链浏览器 | 以太坊Etherscan比特币Blockchain门罗币Monero

    区块链浏览器是一种软件,它使用API(应用程序编程接口)和区块链节点从区块链中提取各种数据,然后使用数据库来排列搜索到的数据,并以可搜索的格式将数据呈现给用户。 用户的输入是资源管理器上的可搜索项,然后通过数据库上的组织表进行搜索。浏览器已经将区块链中

    2024年04月08日
    浏览(43)
  • 【Blockchain】区块链游戏GameFi | NFT

    GameFi是游戏和金融的组合,它涉及区块链游戏,对玩家提供经济激励,也被称为“玩赚钱游戏”。 通常,玩家可以通过完成任务、与其他玩家战斗或通过名种游戏关卡来获得游戏内的奖励。现在很多赚钱游戏都严重依赖于游戏设计师所说的研磨机制,在这种机制中,玩家必须

    2024年04月13日
    浏览(66)
  • Overview of Blockchain区块链概述

    目录 1.def 2.smart contract 3.Consensus mechanism 4.blockchain fork 比特币诞生的几年后,人们开始意识到区块链技术本身的潜力,慢慢走出了自己的发展路线。 通常区块链被定义为一种去中心化的分布式账本技术,最初用来记录信息,使记录具备不可篡改性,随着以太坊的出现,还可以

    2024年02月07日
    浏览(35)
  • Go语言的Blockchain与区块链

    区块链技术是一种分布式、去中心化的数字账本技术,它允许多个节点在网络中共享和同步数据。区块链技术的核心概念是将数据以链式结构存储,每个数据块(block)包含前一个数据块的哈希值,形成一条链。这种结构使得数据的完整性和不可篡改性得到保障。 Go语言是一种静

    2024年04月10日
    浏览(47)
  • 仅仅是调用第三方接口那么简单吗?

    最近有个项目需要本地处理之后,然后调用第三方接口,本来开始觉得很简单得事情,不就是调用第三方接口吗?但是却一波三折。 首先有了下面的第一版的设计。 这个设计很简单,也是最容易想到的。主要有下面几步 1、本地处理; 2、调用第三方接口; 3、本地日志打印

    2024年02月06日
    浏览(63)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包