区块链(Blockchain)调查研究

文章目录

  • 1. 区块链是什么?
  • 2. 区块链分类和特点
  • 3. 区块链核心关键技术
    • 3.1 共识机制
    • 3.2 密码学技术
    • 3.4 分布式存储
    • 3.5 智能合约
  • 4. 区块链未来发展趋势
  • 5. 区块链 Java 实现小案例

1. 区块链是什么?

  区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。区块链(Blockchain),是比特币的重要概念,它本质上是一个去中心化的数据库,同时作为比特币的底层技术,是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一批次比特币网络交易的信息,用于验证其他信息的有效性(防伪)和生成下一个区块。

  区块链简单理解就是一个多方参与的加密分布式记账本。这里面有三个关键词:记账本、加密和分布式。

区块链相关的名次解释:https://www.processon.com/view/63c7b7d4a7d181715d13f1fe

原理图

(1)记账本
  这个账本其实就像我们的银行账户一样,你在某一个银行里面有多少钱,今天花了多少等等,这些都是有记账的。
  这个账本可不是普通的账本,它前面有一个定语,叫多方参与。多方参与意味着什么?这个账本不是一个人去记的,也不是一个中心化机构去记的,而是由分散在全球各个角落的人一起记。甚至借助于卫星系统,接下来可能还会分布在星空中。

(2)加密
  加密的意思就是通过一个密码学的手段,保证你的账户不会被别人篡改。这就和现在我们去银行转账,他们通常会给你一个U盾一样,这个U盾就相当于你账户的一把钥匙,只有拥有钥匙的人才能操作这个账户,才能进行转账。
  在区块链里面也有这个概念。你在区块链开户的时候,系统会自动创建一把钥匙,有了这个钥匙才可以操作区块链上的账户。这把钥匙的产生,和使用钥匙进行账户操作的一些判断,都来源于这个加密学手段。

(3)分布式
  分布式的意思是说,区块链这个多方参与的节点,实际上是分布在全球的任何一个网络节点里面,它不归属于一个特定的机构。
  像现在网站的一些系统里,存在有很多服务器,这个服务器我们也可以说它是多方参与的,但是我们不能说它是分布式的。为什么呢?因为分布式有两个原则:一是它在物理位置上是分布式的;二是它在规则上面也是分布式的。但是像网站的服务器,是归属于一个特定机构或者特定的个体的,这不能叫分布式。

2. 区块链分类和特点

区块链根据应用场景和设计不同,主要分为公有链、联盟链和私有链:

(1)公有链:以比特币、以太坊和所有数字货币为代表,各个节点可以自由进入或退出区块链网络;

(2)联盟链:各个节点通常代表实体组织或个人,通常需要经过授权后加入或退出网络。由于各机构通常存在相关利益,因此需要各方共同参与和维护;

(3)私有链:各个节点的准入和退出权限均由内部控制,通常是在特定机构用于内部数据管理与审计。

区块链主要优势特点:
(1)去中心化:无需第三方介入,实现点对点的交易、协调和协作。在区块链系统中,没有任何一个机构或个人可以实现对全局数据的控制,而任一节点停止工作都不会影响系统整体运作,这种去中心化的网络将极大地提升数据安全性。

(2)不可篡改性:区块链利用加密技术来验证与存储数据、利用分布式共识算法来新增和更新数据,区块链需要各节点参与验证交易和出块;修改任一数据需要变更所有后续记录,修改单节点数据难度极大。

(3)公开透明与可溯源性:写入的区块内容将备份复制到各节点中,各节点都拥有最新的完整数据库拷贝且所有的记录信息都是公开的,任何人通过公开的接口都可查询区块数据。区块链中的每一笔交易通过链式存储固化到区块数据中,同时通过密码学算法对所有区块的所有交易记录进行叠加式 HASH 摘要处理,因此可追溯到任何一笔交易历史。

(4)集体维护性(自治性):区块链去中心化的特征决定了它的集体维护性。传统中心化机构通常要身兼三职:数据存储者、数据管理者和数据分析者,区块链则以对等的方式由各参与方共同维护,各方权责明确,无需向第三方机构让渡权利,实现共同协作。

(5)匿名性:区块链上面没有个人的信息,因为这些都是加密的,是一堆数字字母组成的字符串,这样就不会出现各种身份证信息、电话号码被倒卖的现象。

3. 区块链核心关键技术

从技术角度来讲,区块链并不是一个全新的技术,而是集成了多种现有技术进行的组合式创新,涉及到以下几个方面:

3.1 共识机制

  常用的共识机制主要有 PoW、PoS、DPoS、PBFT、PAXOS等(如图)。由于区块链系统中没有一个中心,因此需要有一个预设的规则来指导各方节点在数据处理上达成一致,所有的数据交互都要按照严格的规则和共识进行;(《常见共识算法(PBFT、PoW、PoS、DPoS、Ripple)》)
共识算法

3.2 密码学技术

  密码学技术是区块链的核心技术之一,目前的区块链应用中采用了很多现代密码学的经典算法,主要包括:哈希算法、对称加密、非对称加密、数字签名等。

HASH 摘要算法:HASH 算法的目的是针对不同输入,产生一个唯一的固定长度的输出。HASH 算法有 3 个特点:一是不同的输入数据产生的输出数据必定不同;二是输入数据的微小变动会导致输出的较大不同;三是给定已知输出数据,无法还原出原始的输入数据。常用的 SHA-256 算法就是针对任意长的数据数列输出 256 位数据,实际使用中 SHA256 用于对区块链的每个区块数据进行 HASH 摘要后防止篡改, 同时结合 Merkle Tree 数据结构实现部分区块数据的 HASH 值验
证。

对称加密算法:对称加密算法利用加密密钥对原始数据进行加密处理,然后将加密后的密文发送给接收者,接收者利用同一密钥及相同算法的逆算法对密文进行解密,才能使其恢复成原始数据。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。区块链技术中常用的对称加密算法有 AES。

非对称加密算法:非对称加密算法需要两个密钥:公开密钥(Public Key)和私有密钥(Private Key)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。其实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。

数字签名算法: 区块链技术中使用到的数字签名技术用于验证信息的完整性和真实性,基本流程如下:发送者将需要签名的原始数据进行 HASH 摘要,然后对摘要信息用私钥加密后与原始数据一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用同样 HASH 函数对收到的原文产生一个摘要信息,如果与解密的摘要信息对比相同则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。此外,信息发送者拥有私钥且不公开,因此只有发送者本人才能构造基于其私钥的签名信息,可以确保签名真实性。ECDSA 是区块链技术中常用的数字签名技术。

3.4 分布式存储

  区块链是一种点对点网络上的分布账本,每个参与的节点都将独立完整地存储写入区块数据信息。分布式存储区别于传统中心化存储的优势主要体现在两个方面:
(1)每个节点上备份数据信息,避免了由于单点故障导致的数据丢失。
(2)每个节点上的数据都独立存储,有效规避了恶意篡改历史数据。

3.5 智能合约

  智能合约允许在没有第三方的情况下进行可信交易,只要一方达成了协议预先设定的目标,合约将会自动执行交易,这些交易可追踪且不可逆转。具有透明可信、自动执行、强制履约的优点。

4. 区块链未来发展趋势

  面对区块链技术带来的机遇与挑战,全球各行各业都在进行积极布局,试图通过这一“组合式创新”技术改变原有的业务与管理模式,构建一个多方参与、安全信任的新型生态体系。区块链的未来发展趋势主要体现在以下几个方面:

(1) 产业渗透:虽然区块链的底层架构源于比特币,但作为一种通用技术,区块链正加速从数字货币向其他领域渗透,和各行各业创新融合。目前,金融服务、数字资产、慈善公益等行业纷纷投入到区块链应用的探索中,利用日志存证、信息追溯等特点,改变行业内原有的交易不公开透明等问题。相信在未来,区块链将在更多的领域发挥作用。诸如医疗健康等涉及到大规模数据交互的行业,必将通过区块链技术实现数据的可信交易,破除现有的利益壁垒,打造一个全新的数据行业内外安全共享生态体系;

(2) 多中心化:区块链的核心并不是“为了去中心化而抛弃中心化管理”,而是构建多方信任机制。在未来,随着跨链技术的不断发展,区块链的架构将演变为多方共同参与的可信任体系。即在多方信息不对称、背景不清晰的情况下,构建多方赖以信任与合作的新生态。未来在多中心化和去中心化之间,将会存在一个中间区域,而不同区块链系统根据特定场景需求,将呈现不同的非中心化程度。

(3) 技术融合:以云计算、大数据、物联网为代表的新一代信息技术正渗透进各行各业。未来区块链的发展必将以技术融合为切入点,共同解决单一技术的不足与难点,扩大应用场景,降低应用成本。以区块链与物联网结合为例,物联网是互联网在实体经济中的延伸,通过计算机技术实现物品与物品之间的信息交换与通信。区块链系统是典型的点对点网络,具有分布式异构特征,天然适合于在物联网中建立各主体的共识机制,制定交互规则,构建去中心化控制的交易网络。因此,如何通过区块链与其他技术的融合,实现产业创新,将成为区块链未来发展的重要课题。

(4) 标准规范:企业应用在未来将是区块链的主战场,联盟链将成为主流方向。与公有链不同,在企业级应用中,人们不仅关注通过软件和算法来构建信任基础,更重要的是如何从用户体验与业务需求出发,构建一套基于共识机制、权限管理、智能合约等多维度的生态规则。面对不断演进的区块链技术,同步考虑相应的技术标准和法律法规,增加区块链的可信程度,建立区块链的应用准则加强监管,防范风险。

5. 区块链 Java 实现小案例

首先,我们定义一个区块类,用于存储区块的基本信息:

package com.leo.demo.blockchaintest;

/**
 * @author Leo825
 * @description : 定义一个区块类,用于存储区块的基本信息
 * @date 2024/6/6 16:59
 */
public class Block {
    public String hash;
    public String previousHash;
    private String data;
    private long timeStamp;
    private int nonce;

    public Block(String data, String previousHash) {
        this.data = data;
        this.previousHash = previousHash;
        this.timeStamp = System.currentTimeMillis();
        this.hash = calculateHash();
    }

    /**
     * 计算区块的哈希值
     *
     * @return
     */
    public String calculateHash() {
        String calculatedhash = StringUtil.applySha256(
                previousHash +
                        Long.toString(timeStamp) +
                        Integer.toString(nonce) +
                        data
        );
        return calculatedhash;
    }

    /**
     * 模拟挖矿
     *
     * @param difficulty
     */
    public void mineBlock(int difficulty) {
        String target = new String(new char[difficulty]).replace('\0', '0');
        while (!hash.substring(0, difficulty).equals(target)) {
            nonce++;
            hash = calculateHash();
        }
        System.out.println("Block Mined!!! : " + hash);
    }
}

接下来,我们创建一个区块链类,用于管理区块链:

package com.leo.demo.blockchaintest;
import com.google.gson.GsonBuilder;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author Leo825
 * @description : TODO
 * @date 2024/6/6 16:55
 */
public class BlockchainDemo {
    public static int difficulty = 5;
    public static List<Block> blockchain = new ArrayList<>();

    public static void main(String[] args) {
        blockchain.add(new Block("Hi im the first block", "0"));
        System.out.println("Trying to Mine block 1... ");
        blockchain.get(0).mineBlock(difficulty);

        blockchain.add(new Block("Yo im the second block", blockchain.get(blockchain.size() - 1).hash));
        System.out.println("Trying to Mine block 2... ");
        blockchain.get(1).mineBlock(difficulty);

        blockchain.add(new Block("Hey im the third block", blockchain.get(blockchain.size() - 1).hash));
        System.out.println("Trying to Mine block 3... ");
        blockchain.get(2).mineBlock(difficulty);

        System.out.println("\nBlockchain is Valid: " + isChainValid());

        String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain);
        System.out.println("\nThe block chain: ");
        System.out.println(blockchainJson);
    }

    /**
     * 验证区块链是否有效
     *
     * @return
     */
    public static Boolean isChainValid() {
        Block currentBlock;
        Block previousBlock;
        String hashTarget = new String(new char[difficulty]).replace('\0', '0');

        //循环遍历区块链检查哈希:
        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;
            }
            //比较当前块的previousHash和前一个块的哈希:
            if (!previousBlock.hash.equals(currentBlock.previousHash)) {
                System.out.println("Previous Hashes not equal");
                return false;
            }
            //检查是否已挖掘:
            if (!currentBlock.hash.substring(0, difficulty).equals(hashTarget)) {
                System.out.println("This block hasn't been mined");
                return false;
            }
        }
        return true;
    }
}

其中用到的工具类如下:

package com.leo.demo.blockchaintest;
import com.google.gson.GsonBuilder;
import java.security.MessageDigest;

/**
 * @author Leo825
 * @description : Sha256 算法实现
 * 算法实现 :https://blog.csdn.net/leho666/article/details/114253341
 * @date 2024/6/6 17:05
 */
public class StringUtil {

    /**
     * Applies Sha256 to a string and returns the result.
     *
     * @param input
     * @return
     */
    public static String applySha256(String input) {

        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-256");

            //Applies sha256 to our input,
            byte[] hash = digest.digest(input.getBytes("UTF-8"));
            // This will contain hash as hexidecimal
            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);
        }
    }

    /**
     * Short hand helper to turn Object into a json string
     *
     * @param o
     * @return
     */
    public static String getJson(Object o) {
        return new GsonBuilder().setPrettyPrinting().create().toJson(o);
    }

    /**
     * Returns difficulty string target, to compare to hash. eg difficulty of 5 will return "00000"
     *
     * @param difficulty
     * @return
     */
    public static String getDificultyString(int difficulty) {
        return new String(new char[difficulty]).replace('\0', '0');
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/684859.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在自己的esp idf工程中添加ESP-ADF

其实esp-adf也就相当于是一个组件&#xff0c;直接在工程的CMakeList.txt中加入就行&#xff0c;这样就可以满足自己的需要&#xff0c;直接在当前工程上增加adf&#xff0c;使用其中的部分功能。 参考adf基础工程可以发现&#xff0c;一条命令即可。 include($ENV{ADF_PATH}/…

【ocean】测试phaseDeg,phaseDegUnwrapped和phaseMargin

对二级运放进行测试 -101.35,78.01,78.01 GBW gainBwProd((VF("/Vout2") / VF("/Vin")))PHASE phaseDegUnwrapped((VF("/Vout2") / VF("/Vin")))plot( PHASE ?expr ( "PHASE" ) ) PHASEdeg phaseDeg((VF("/Vout2&q…

SQL语句练习每日5题(二)

题目1——查找学校是北大的学生信息 筛选出所有北京大学的学生进行用户调研&#xff0c;请你从用户信息表中取出满足条件的数据&#xff0c;结果返回设备id和学校。 解法&#xff1a;考察where条件语句 select device_id,university from user_profile where university北京…

如何做谷歌seo排名优化?Google SEO优化步骤你更快获得谷歌排名

谷歌SEO优化&#xff08;搜索引擎优化&#xff09;是一系列策略和技巧&#xff0c;旨在提高网站在谷歌搜索结果中的排名&#xff0c;从而增加有机流量。以下是一些关键的谷歌SEO优化步骤&#xff1a; 1. 关键词研究 选择合适的关键词&#xff1a;使用工具如Google Keyword Pl…

webservice、WCF、webAPI、MVC权限认证

webservice 权限认证 》》soapHeader SOAPHeader案例 服务引用下生成的服务方法参数中会自动加入一个soapHeader的参数&#xff0c; WEB服务引用则没有&#xff0c;我感觉采用WEB服务引用基于这种验证比较方便&#xff0c; 因为只需将soapHeader实例赋值一次就可以多次调用不…

windows11 安装cnpm 报错 Error: EPERM: operation not permitted 没权限

全部试过&#xff1a; 您遇到的错误是EPERM: operation not permitted&#xff0c;这意味着npm在尝试重命名文件或目录时缺少必要的权限。这通常与操作系统的权限设置有关。为了解决这个问题&#xff0c;您可以尝试以下几个步骤&#xff1a; 以管理员身份运行命令行&#xff1…

Python 可变长参数的魔法:灵活函数设计的秘密

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 什么是可变长参数&#xff1f; 在 Python 中&#xff0c;可变长参数允许你向函数传入任意数量的参数&#xff0c;而无需预先定义它们的个数。这为编写更加灵活和通用的函数提供了可能。可变长参数主要有两种形式&am…

使用kafka tools工具连接带有用户名密码的kafka

使用kafka tools工具连接带有用户名密码的kafka 创建kafka连接&#xff0c;配置zookeeper 在Security选择Type类型为SASL Plaintext 在Advanced页面添加如下图红框框住的内容 在JAAS_Config加上如下配置 需要加的配置&#xff1a; org.apache.kafka.common.security.plain.Pla…

如何通过内容识别关键词保护商业机密防泄漏

在数字化商业环境中&#xff0c;商业机密的保护对于企业的竞争力至关重要。随着数据泄露事件的增多&#xff0c;企业越来越需要采取有效措施来保护其敏感信息。内容识别技术&#xff0c;特别是关键词识别&#xff0c;已成为防止商业机密泄漏的重要手段。本文将探讨如何利用这一…

微软新AI工具 Recall 被白帽公开锤了?

近日&#xff0c;一些网络安全研究人员演示了恶意软件是如何成功窃取 Windows Recall 工具收集到的数据。 2024年5月21日&#xff0c;微软发布全新的“CopilotPC”&#xff0c;这类 AI PC 通过与高通的最新芯片合作&#xff0c;实现了一个叫做“Recall”的功能。借助这个人工智…

性能监控工具

性能是任何一款软件都需要关注的重要指标。除了软件的基本功 能&#xff0c;性能可以说是评价软件优劣的最重要的指标之一。我们该如何有 效地监控和诊断性能问题呢?本章基于实践&#xff0c;着重介绍一些针对系统 和Java虚拟机的监控和诊断工具&#xff0c;以帮助读者在实际开…

Camtasia Studio2024破解汉化版crack安装包下载地址

在当今数字化时代&#xff0c;视频内容已成为传播信息和吸引观众的重要方式。无论是企业宣传、在线教育还是个人创作&#xff0c;一款功能强大的视频编辑软件都是必不可少的工具。而Camtasia Studio2024作为业界领先的视频编辑软件&#xff0c;其永久免费版及最新版本的功能更是…

四、 【源码】数据源的解析、创建和使用

源码地址&#xff1a;https://github.com/mybatis/mybatis-3/ 仓库地址&#xff1a;https://gitcode.net/qq_42665745/mybatis/-/tree/04-datasource-use 数据源的解析、创建和使用 流程&#xff1a; 1.Resources加载MyBatis配置文件生成Reader字符流 2.SqlSessionFactory…

【JMeter接口测试工具】第二节.JMeter基本功能介绍(上)【入门篇】

文章目录 前言一、获取所有学院信息接口执行二、线程组的介绍 2.1 并发和顺序执行 2.2 优先和最后执行线程组 2.3 线程组的设置细节三、HTTP请求的介绍四、查看结果树的配置使用总结 前言 一、获取所有学院信息接口执行 我们先针对一条简单的接口进行执行&#…

NodeJS体育用品销售管理系统-计算机毕业设计源码88807

摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存…

概率分析和随机算法

目录 雇佣问题 概率分析 随机算法 生日悖论 随机算法 概率分析 球与箱子 总结 雇佣问题 有n个候选人面试&#xff0c;如果面试者比目前雇佣者的分数高&#xff0c;评价更好&#xff0c;那么就辞掉当前雇佣者&#xff0c;而去聘用面试者&#xff0c;否则继续面试新的候…

浮点数的精度和精度丢失,如何规避,有简单操作

在日常工作中&#xff0c;如果做财务软件相关肯定会遇到这种问题&#xff0c;凭证金额表面上看是相等的&#xff0c;但程序运算出的结果却是FALSE。 例如&#xff1a;验证凭证金额借方总金额是否等于贷方总金额&#xff1f; 直接sum&#xff08;借方分录金额1.1借方分录金额2.…

inflight 守恒拥塞控制的稳定性

只要系统形成 E_best max(bw / delay) 共识&#xff0c;系统就是稳定的。 设两条流 f1&#xff0c;f2 共享瓶颈链路&#xff0c;用 cwnd 约束 inflight&#xff0c;其 cwnd 分别为 x&#xff0c;y&#xff0c;用简单的微分方程建模&#xff1a; d x d t c − b ∗ x − a ∗…

使用python把gif转为图片

使用python把gif转为图片 程序思路效果代码 程序思路 打开 GIF 文件。确保输出文件夹存在&#xff0c;如果不存在则创建。获取 GIF 的帧数。遍历每一帧&#xff0c;将其保存为单独的 PNG 图像&#xff0c;并打印保存路径。 效果 把这张派大星gif转为一张张图片&#xff1a; …

黑马python-JavaScript

1.JavaScript的定义&#xff1a; JavaScript是运行在浏览器端的脚步语言&#xff0c;是由浏览器解释执行的、简称js。它能够让网页和用户有交互功能&#xff0c;增加良好的用户体验效果 2.使用方式&#xff1a; 1.行内式&#xff08;主要用于事件&#xff09; <input type&q…