首页 > 其他分享 >单机区块链理解

单机区块链理解

时间:2023-11-21 09:22:18浏览次数:31  
标签:hash String 单机 blockChainList 理解 new 区块 public

  区块链是一种分布式的、不可篡改的记录数据的技术。它是由一系列数据块(Blocks)组成的链式结构,每个数据块包含了一定数量的交易信息和与之相关的元数据。每个数据块都通过密码学哈希函数与前一个数据块连接起来,形成了一个不断增长的链式结构。

    下面用代码来理解一下区块链,首先创建一个块信息对象。块信息主要包含数据,当前hash值,前置节点hash值,当前时间戳,生成hash值的函数和挖矿函数。每个块的hash值是通过之前的hash值和数据data通过hash计算出来的。如果前一个区块的数据一旦被篡改了,那么前一个区块的hash值也会同样发生变化,这样也就导致了所有后续的区块中的hash值有误。所以计算和比对hash值会让我们检查到当前的区块链是否是有效的,也就避免了数据被恶意篡改的可能性,因为篡改数据就会改变hash值并破坏整个区块链。

public class BlockInfo {
    public  String hashCode;
    public  String preHashCode;
    private  String data;
    private  long timeStamp;
    private  int nonce=0;

    public BlockInfo(String data, String preHashCode)
    {
        this.data=data;
        this.preHashCode=preHashCode;
        this.timeStamp=new Date().getTime();
        this.hashCode=countHash();
    }

    public String countHash(){
        String tmpHash=BlockChainUtil.hash256Code(this.preHashCode+Long.toString(this.timeStamp)+Integer.toString(nonce)+this.data);
        return  tmpHash;
    }

    public void mineBlock(int difficulty) {
        String target = new String(new char[difficulty]).replace('\0', '0');
        while(!hashCode.substring( 0, difficulty).equals(target)) {
            nonce ++;
            hashCode = countHash();
        }
    }
}

  有了块信息对象,就需要选择一个生成hash值的算法,生成hash的算法有很多,比如BASE,MD,RSA,SHA等等,这里采用的是SHA-256算法。

public class BlockChainUtil {
public static String hash256Code(String input) {
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            byte[] hashBytes = md.digest(input.getBytes());
            StringBuilder sb = new StringBuilder();
            for (byte b : hashBytes) {
                sb.append(String.format("%02x", b));
            }
            return sb.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }
}

    最后就是添加块,并进行区块链检查,这就形成了一个单机版小型的区块链模型。

public class BlockChain {
    public  static List<BlockInfo> blockChainList=new ArrayList<>();
    public  static int difficultFactor=1;
    public  static  void main(String[] args)
    {
        blockChainList.add(new BlockInfo("第一个块", "0"));
        System.out.println("尝试生成第一个块");
        blockChainList.get(0).mineBlock(difficultFactor);

        blockChainList.add(new BlockInfo("第二块",blockChainList.get(blockChainList.size()-1).hashCode));
        System.out.println("尝试生成第二个块 ");
        blockChainList.get(1).mineBlock(difficultFactor);

        System.out.println("检查区块链是否有效 " + checkChainValid());

    }

    public static   boolean checkChainValid()
    {
        BlockInfo currentBlock;
        BlockInfo preBlock;
        String hashTarget=new String(new char[difficultFactor]).replace('\0','0');
        for(int i=1;i<blockChainList.size();i++)
        {
            currentBlock = blockChainList.get(i);
            preBlock = blockChainList.get(i-1);
            if(!currentBlock.hashCode.equals(currentBlock.countHash()) ){
                System.out.println("当前块hash值不对");
                return false;
            }
            if(!preBlock.hashCode.equals(currentBlock.preHashCode) ) {
                System.out.println("前置块hash值不对");
                return false;
            }
            if(!currentBlock.hashCode.substring( 0, difficultFactor).equals(hashTarget)) {
                System.out.println("这个块没有被挖掘出来");
                return false;
            }
        }

        return  true;
    }
}

  

    最终生成的区块链内容如下图:

 

 

 

标签:hash,String,单机,blockChainList,理解,new,区块,public
From: https://www.cnblogs.com/beststrive/p/17845497.html

相关文章

  • C#编程精要:深入理解继承、多态、抽象和接口
    文章目录继承基类和派生类多重继承子类调用父类构造器子类调用父类方法多态静态多态性函数重载运算符重载动态多态性抽象类抽象属性抽象方法虚方法方法重写方法覆盖覆写和覆盖的区别密封类(sealed)接口接口特点定义接口实现接口接口继承显式实......
  • 节能减排 | AIRIOT智慧工厂节能管理解决方案
     工厂作为高能耗的生产型企业,降低能耗和提升资源利用率方面就显得很重要,对实施国家倡导的节能降耗、绿色发展有着很大程度上的必要性。然而,工厂能源管理从传统手段向智能化升级转型的过程中,企业也不可避免的面临一些痛点和挑战:节能目标完成难度大:随着产量上升,企业能源综合消......
  • java版本的智能合约部署到fabric区块链测试网络
    开发智能合约并进行部署和更新操作在之前的文章中我们可以成功启动测试网络并进行了相关测试,现在我们需要进行智能合约的编写操作,并将其部署到测试网络中进行相关测试。本节智能合约代码采取Java语言进行编写,代码及相关部署参考(https://www.bilibili.com/video/BV1DR4y1M74B/?spm......
  • 正则零宽断言的理解
    正则匹配中,除了文本的匹配外,还有位置匹配。因为位置匹配不会匹配任何实际的文本,只是匹配文本中的位置,所以也称为锚点(Anchors)、零长度断言或者零宽断言(Zero-WidthAssertions)。结合这几个名字,这个概念的含义已经很明显。零宽断言是一种零宽度的匹配,它匹配的内容不会保存到匹......
  • ApplicationContextAware 理解
    ApplicationContextAware理解-长弓射大狗-博客园(cnblogs.com) 我们常用的IOC容器是ApplicationContext,她的顶层接口是BeanFactory, ApplicationContext对BeanFactory进行了扩展。我们拿到IOC容器的方式有3种,使用ApplicationContext接口下的三个实现类:ClassP......
  • 位带操作理解
    1.概念理解位带操作实际就是通过将寄存器的一个位(bit)映射到某一个区域的字(32位)上,这些区域的字已经由官方设定好,我们通过对这些字的操作就能够实现对寄存器的某个位操作。图像如下stm32一个字有4个字节共32个位,膨胀之后为在别名区为4*8=32个字。所以接下来要做的就是根据位带区......
  • 多核CPU条件下的并发和并行理解
    操作系统课本上的并发和并行并发​是指两个或多个事件在同一时间间隔内交替发生并行是指两个或多个事件在同一时刻发生并行编程中的并发和并行在接触并行编程之前,认为多线程是并发的一种,因为一个处理单元每次只能处理一个线程,因此多个线程也只是一个时间间隔内的交替执行而已......
  • 课程设计:任务理解与分工
    团队任务:1.小组讨论对课程设计任务的理解我们小组对于任务的理解为,为报文解析工具wireshark设计一个lua插件,该插件要能够协助wireshark进行加解密。2.进行任务的功能划分和分工我们将本次插件设计的任务划分成了四个部分,一是对任务整体的布置与解读,将任务中涉及到的内容进行解......
  • 基于Wireshark插件的国密标准检测工具的设计与实现——任务理解与分工
    任务分工:应用和数据部分不可否认性的实现对任务的理解以下是我对任务的理解:任务背景:任务涉及到对用户进行身份验证和签名验证,以确保用户的关键操作行为是合法和安全的。用户1的操作:步骤23:正确给出√×*,这似乎是用户1的关键操作行为的一部分,需要验证其签名的合法性。步骤24......
  • AJAX跨域代理机制实现原理解析------AJAX
    httpClient发送packagecom.bjpowernode.httpClient;importorg.apache.http.HttpEntity;importorg.apache.http.HttpResponse;importorg.apache.http.client.methods.HttpGet;importorg.apache.http.impl.client.CloseableHttpClient;importorg.apache.http.impl.cl......