当前位置: 首页 > news >正文

从零开始构建区块链:我的区块链开发之旅

1.引言

1.区块链技术的兴起和重要性

区块链技术,作为数字化时代的一项颠覆性创新,已经成为当今世界最令人瞩目的技术之一。自比特币的问世以来,区块链技术已经从仅仅支持加密货币发展成为一种具有广泛应用前景的分布式账本技术。其核心优势在于提供了一种安全、透明、不可篡改的数据存储和传输方式,这在金融服务、供应链管理、智能合约、身份验证等领域展现出巨大的潜力。
区块链的重要性不仅在于其技术特性,还在于它提出了一种全新的数据管理和交易的方式。它通过去中心化的结构,降低了信任成本,提高了交易效率。这种特性使得区块链在数字身份、版权保护、物联网等多个领域均有广泛的应用场景。

2.个人动机

我的兴趣在于深入理解这项革命性技术的工作原理和潜力。虽然市场上已经有许多现成的区块链平台和服务,但我认为亲自动手构建一个区块链是理解其核心概念和挑战的最佳方式。通过实际的编程和实现过程,我能够更好地理解区块、链、挖矿、共识机制等概念,以及它们是如何在系统中协同工作的。
此外,通过构建自己的区块链,我能够实验不同的算法和架构选择,探索区块链技术的边界。这不仅是一次学习和探索的旅程,也是一次创新和实践的机会。我相信通过这个项目,我能够对区块链技术有更深入的理解,并为今后可能的应用开发和研究打下坚实的基础。

2.区块链基础

1.基本概念与原理

区块链技术是一种分布式数据库系统,其核心在于创建一个去中心化、不可篡改的数据记录系统。在区块链中,数据以一系列按时间顺序排列的“区块”形式存储,每个区块包含一定数量的交易或其他数据类型。每个新区块都会通过加密算法链接到前一个区块,形成一个连续的链条。
关键的是,区块链的这种结构使得一旦数据被记录下来,就几乎无法被修改或删除。这是因为每个区块都包含了前一个区块的加密哈希值,任何对旧区块数据的修改都会导致后续所有区块的哈希值变得无效。

2.关键特性和应用场景

  1. 去中心化:区块链不依赖于任何中央权威或中介机构来管理或验证交易。这意味着它可以在没有中央服务器的情况下运行,每个参与节点都有完整的数据记录副本。

  2. 透明性:由于区块链的公开性,所有交易记录对所有参与者都是可见的。这增加了系统的透明度,并有助于建立信任。

  3. 安全性和不可篡改性:区块链的安全性和不可篡改性源于其加密技术和链式结构。每个区块的内容在创建时都会被加密,且每个区块都包含前一个区块的哈希值,任何试图修改已记录数据的尝试都会被系统检测到。

  4. 分布式共识:区块链利用分布式共识机制(如工作量证明PoW或权益证明PoS)来验证和记录交易,确保网络中的所有参与者对数据记录达成一致。

应用场景

  • 加密货币:比特币是区块链技术最著名的应用,但现在已有数以千计的其他加密货币采用类似的技术。

  • 智能合约:在以太坊等区块链平台上,智能合约允许在满足特定条件时自动执行合同条款,无需第三方参与。

  • 供应链管理:区块链可以用来记录供应链中的每一步,提高透明度和效率。

  • 身份验证和数字身份:区块链可用于创建安全、不可篡改的身份认证系统。

  • 版权和知识产权保护:区块链可以用于确保数字内容的原创性,并追踪和管理版权。

  • 投票系统:通过区块链技术,可以创建一个透明且安全的数字投票系统,减少欺诈和操纵的可能性。

这些只是区块链应用的一些示例,随着技术的成熟,预计会有更多创新的应用出现。

3.构建基础区块链

1.构建区块类(Block)

这个Block类的设计捕捉了区块链的核心机制:数据存储、链式结构、哈希计算和工作量证明(挖矿)。每个区块都通过哈希值与前一个区块相连接,保证了链的不可变性和数据的完整性。
挖矿过程展示了如何通过计算工作来保障网络的安全性。具体代码如下所示:

import java.io.UnsupportedEncodingException;
import java.util.Date;public class Block {//区块哈希public String hash;private String data;//前一个区块哈希public String previousHash;//时间戳private Long timeStamp;// 随机数private int nonce;public Block(String data, String previousHash) throws UnsupportedEncodingException {this.data = data;this.previousHash = previousHash;this.timeStamp = new Date().getTime();this.hash = calculateHash();}public String calculateHash() throws UnsupportedEncodingException {return StringUtil.applySha256(previousHash+data+Integer.toString(nonce)+Long.toString(timeStamp));}//定义挖矿函数public void mineBlock(int difficulty) throws UnsupportedEncodingException {String target = new String("0".repeat(difficulty));while (!hash.substring(0,difficulty).equals(target)){nonce++;hash = calculateHash();}System.out.println("Block mine!hash:"+hash);}
}

注意:真实的区块头中是不包含当前区块的哈希值的,这里是为了方便编码才保留hash字段的。

2.构建工具类(StringUtil)

这里的StringUtil类主要提供sha256加密算法,它定义了一个名为StringUtil的类,其中包含一个名为applySha256的静态方法。这个方法的目的是对输入的字符串应用SHA-256哈希算法,并返回结果。这个过程可以分为几个步骤:

  1. 获取SHA-256消息摘要实例:使用MessageDigest.getInstance("SHA-256"),它告诉Java你想要使用SHA-256哈希算法。

  2. 输入字符串的处理:将输入字符串转换为字节(input.getBytes("UTF-8")),然后将这些字节通过SHA-256算法进行哈希处理。这会生成一个字节数组,表示哈希值。

  3. 生成十六进制字符串:哈希值是一个字节数组,每个字节被转换为十六进制表示。转换是通过遍历数组中的每个字节,并使用Integer.toHexString方法将每个字节转换为相应的十六进制值来完成的。如果转换后的十六进制字符串长度为1(即值小于16),则在其前面添加一个’0’来格式化输出。

  4. 返回最终的哈希值:将所有十六进制的值拼接起来,形成一个完整的SHA-256哈希字符串,并返回这个字符串。

此方法的主要用途是在需要数据完整性验证或安全场景(如密码存储、数字签名等)时,为给定的数据生成一个固定长度的、几乎唯一的哈希值。SHA-256是一种广泛使用的加密哈希函数,它生成一个256位的哈希值,通常用64位十六进制数表示。具体代码如下所示:

import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public class StringUtil {public static String applySha256(String input) throws UnsupportedEncodingException {try {// 使用sha256加密算法MessageDigest digest = MessageDigest.getInstance("SHA-256");// 将输入转换为字节数组然后使用sha256加密byte[] hash = digest.digest(input.getBytes(StandardCharsets.UTF_8));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);}// 返回经过sha256加密后的字符串return hexString.toString();} catch (NoSuchAlgorithmException e) {throw new RuntimeException(e);}}
}

3.构建区块链(NoobChain类)

这段代码是一个简单的Java区块链实现,称为 NoobChain类。它演示了如何创建和管理一个基本的区块链系统,包括区块的创建、挖矿过程,以及验证区块链的完整性。

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;import com.google.gson.GsonBuilder;public class NoobChain {// 用于存储每一个区块public static ArrayList<Block> blockchain = new ArrayList<>();// 定义挖矿的难度目标值public static int difficulty = 5;public static void main(String[] args) throws UnsupportedEncodingException {int blockNumber = 1;  // 用于追踪区块编号long targetMiningTime = 3000;  // 目标挖矿时间,例如3秒int difficultyAdjustmentFactor = 1;  // 难度调整系数// 第一个区块blockchain.add(new Block("Block " + blockNumber++, "0".repeat(64)));mineAndDisplayLastBlock(blockNumber - 1);  // 挖掘并显示区块信息// 无限挖矿循环while (true) {long startTime = System.currentTimeMillis();  // 记录开始挖矿的时间if (blockNumber>100) break;String previousHash = blockchain.get(blockchain.size() - 1).hash;blockchain.add(new Block("Block " + blockNumber++, previousHash));mineAndDisplayLastBlock(blockNumber - 1);long miningDuration = System.currentTimeMillis() - startTime;  // 计算挖矿持续时间// 调整挖矿难度adjustDifficulty(miningDuration, targetMiningTime, difficultyAdjustmentFactor);}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);}private static void adjustDifficulty(long miningDuration, long targetMiningTime, int adjustmentFactor) {if (miningDuration < targetMiningTime) {difficulty += adjustmentFactor;  // 如果挖矿时间过快,增加难度} else if (miningDuration > targetMiningTime) {difficulty = Math.max(difficulty - adjustmentFactor, 1);  // 如果挖矿时间过慢,减少难度,但保持至少为1}System.out.println("New difficulty: " + difficulty);}private static void mineAndDisplayLastBlock(int blockIndex) throws UnsupportedEncodingException {System.out.println("Trying to Mine block " + blockIndex + "......");blockchain.get(blockIndex - 1).mineBlock(difficulty);System.out.println("Block " + blockIndex + " mined!");}// 检查区块链是否完整/*此方法需要检查哈希变量实际上等于计算出的哈希值,并且前一个块的哈希值是否等于previousHash变量。* */public static Boolean isChainValid() throws UnsupportedEncodingException {// 当前区块的哈希Block currentBlock;// 前一区块的哈希Block previousBlock;String hashTarget = new String("0".repeat(difficulty));//遍历区块链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 hash not equal");return false;}if(!previousBlock.hash.equals(currentBlock.previousHash)){System.out.println("previous hash 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;}
}

至此你已经完成了一个基础的区块链开发,你的区块链由存储数据的区块组成,区块中的hash是通过对区块头中的元数据进行sha256算法计算得到,同时需要不断的经过挖矿来验证和产生新区快,同时还可以检查其中的数据是否有效且完整!
此外,我的基础区块链实现是通过Java代码实现的,感兴趣的小伙伴也可以使用其他语言,例如Python、C++、JavaScript等语言实现。

4.未来展望

随着区块链技术的不断成熟和广泛应用,我们可以预见到它将在未来的数字世界中扮演更加重要的角色。
以下是区块链技术的未来发展趋势和潜在影响:

1. 更广泛的行业应用

  • 跨行业合作:随着技术的进步,区块链将被越来越多的行业采用,包括金融、医疗、物流、教育等领域。
  • 实现更多实际用途:例如,通过提高供应链透明度、确保医疗记录的安全和私密性,以及通过智能合约自动化各种过程。

2. 技术的进一步发展

  • 可扩展性与性能优化:解决现有的可扩展性问题,提高交易速度和处理能力。
  • 隐私保护:增强区块链的隐私保护功能,以满足不同用户和行业的隐私要求。

3. 加强法规和安全性

  • 更明确的法规框架:随着区块链的普及,预期将出现更多专门的法规和标准,以确保技术的合法性和安全性。
  • 增强网络安全性:对抗量子计算等新兴威胁,确保区块链系统的长期安全性。

4. 教育和人才培养

  • 加强区块链教育:随着区块链成为重要技术,相关的教育和培训将变得更加普及。
  • 培养专业人才:为行业培养更多具备区块链技术知识和经验的专业人才。

5. 促进全球化和社会影响

  • 推动全球金融包容性:利用区块链技术为全球范围内未银行化的人群提供金融服务。
  • 支持可持续发展目标:通过透明度和可追溯性,区块链可以支持环境保护和可持续发展目标。

展望未来,区块链技术不仅会成为推动数字化转型的关键驱动力,也可能成为解决一些全球性挑战的重要工具。随着技术的发展和应用的深入,我们有理由相信区块链将会对社会和经济产生深远影响。

相关文章:

从零开始构建区块链:我的区块链开发之旅

1.引言 1.区块链技术的兴起和重要性 区块链技术&#xff0c;作为数字化时代的一项颠覆性创新&#xff0c;已经成为当今世界最令人瞩目的技术之一。自比特币的问世以来&#xff0c;区块链技术已经从仅仅支持加密货币发展成为一种具有广泛应用前景的分布式账本技术。其核心优势…...

c JPEG编码,但有错误

#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #include <sys/ioctl.h> #include <linux/videodev2.h> //v4l2 头文件 #include <strin…...

二级C语言备考1

一、单选 共40题 &#xff08;共计40分&#xff09; 第1题 &#xff08;1.0分&#xff09; 题号:6923 难度:较易 第1章 以下叙述中正确的是 A:C语言规定必须用main作为主函数名,程序将从此开始执行 B:可以在程序中由用户指定任意一个函数作为主函数…...

【2024系统架构设计】 系统架构设计师第二版-嵌入式系统架构设计理论与实践

目录 一 嵌入式系统软件架构的原理 二 嵌入式系统软件架构的设计方法 三 案例分析 一 嵌入式系统软件架构的原理 🚀嵌入式系统的典型架构可以分为...

用python提取word中的所有图片

使用word中提取的方式图片会丢失清晰度&#xff0c;使用python写一个脚本&#xff0c;程序运行将弹出对话框选择一个word文件&#xff0c;然后在弹出一个对话框选择一个文件夹保存word中的文件。将该word中的所有图片都保存成png格式&#xff0c;并命名成image_i的样式。 程序…...

医疗器械分类及是否需要临床

1、医疗器械的分类&#xff1a; 在中国&#xff0c;医疗器械的管理分为一类、二类和三类&#xff0c;这是根据《医疗器械监督管理条例》的规定划分的。不同类别的医疗器械受到不同的监督和管理&#xff0c;包括注册审批、生产质量监督、市场监管等方面。 一类医疗器械&#x…...

AI人工智能虚拟现实行业发展分析

AI人工智能和虚拟现实是当今科技领域最受关注和研究的两个领域。这两项技术的迅速发展给各行各业带来了巨大的变革和机遇。在过去的几年里&#xff0c;AI和虚拟现实已经取得了显著的进展&#xff0c;并且有着广阔的发展前景。 AI人工智能作为一种模拟人类智能的技术&#xff0…...

3. SPSS数据文件的基本加工和处理

如何获取SPSS自带的案例数据文件&#xff1f; 首先找到SPSS的安装目录&#xff0c;然后找到Samples文件夹 可以看到有不同语言版本&#xff0c;选择简体中文 就能看到很多.sav文件 数据文件的整理 个案排序 单值排序 例&#xff1a;对于下面的数据集&#xff0c;将工资按…...

Ubuntu20二进制方式安装nginx

文章目录 1.下载nginx安装包2.安装nginx3.安装出现的问题及解决方案错误1&#xff1a;错误2&#xff1a;错误3&#xff1a; 4.常用命令5.知识扩展&#xff1a; 1.下载nginx安装包 nginx官网&#xff1a;http://nginx.org/en/download.html 选择稳定的nginx版本下载。 2.安装ngi…...

window mysql5.7 搭建主从同步环境

window 搭建mysql5.7数据库 主从同步 主节点 配置文件my3308.cnf [mysql] # 设置mysql客户端默认字符集 default-character-setutf8mb4[mysqld] server-id8 #server-uuidbc701be9-ac71-11ee-9e35-b06ebf511956 log-binD:\mysql_5.7.19\mysql-5.7.19-winx64\mysql-bin binlog-…...

MCU、MPU、SOC简介

文章目录 前言一、MCU二、MPU三、SOC总结 前言 随着处理器技术的不断发展&#xff0c;CPU(Central Processing Unit)的发展逐渐出现三种分支&#xff0c;分别是MCU(Micro Controller Unit&#xff0c;微控制器单元) 和MPU&#xff08;Micro Processor Unit&#xff0c;微处理器…...

Kubernetes那点事儿——配置存储:ConfigMap、Secret

配置存储&#xff1a;ConfigMap、Secret 前言ConfigMapSecret 前言 前面介绍过的各种存储主要都是做数据的持久化&#xff0c;本节介绍的ConfigMap和Secret主要用于配置文件存储&#xff0c;或者环境变量的配置。 ConfigMap 创建ConfigMap后&#xff0c;数据实际会存储在K8s中…...

小白向:搭建企业培训APP的完整技术指南

当下&#xff0c;许多企业转向了现代化的培训方法&#xff0c;其中一个关键的工具就是企业培训APP。本文将为你提供搭建企业培训APP的完整技术指南&#xff0c;助你在数字化时代更好地满足企业培训的需求。 一、需求分析与功能规划 在开始开发之前&#xff0c;首先需要明确企…...

CVE-2023-36025 Windows SmartScreen 安全功能绕过漏洞

CVE-2023-36025是微软于11月补丁日发布的安全更新中修复Windows SmartScreen安全功能绕过漏洞。攻击者可以通过诱导用户单击特制的URL来利用该漏洞&#xff0c;对目标系统进行攻击。成功利用该漏洞的攻击者能够绕过Windows Defender SmartScreen检查及其相关提示。该漏洞的攻击…...

分析一个项目(微信小程序篇)二

目录 首页&#xff1a; 发现&#xff1a; 购物车&#xff1a; 我的&#xff1a; 分析一个项目讲究的是如何进行对项目的解析分解&#xff0c;进一步了解项目的整体结构&#xff0c;熟悉项目的结构&#xff0c;能够知道每个组件所处在哪个位置&#xff0c;发挥什么作用。 接…...

每日论文推送(有中文摘或源码地址或项目地址)

***VX搜索“晓理紫”并关注就可以每日获取最新论文***标题: “It’s not like Jarvis, but it’s pretty close!” – Examining ChatGPT’s Usage among Undergraduate Students in Computer Science作者: Ishika Joshi, Ritvik Budhiraja, Harshal D Akolekar摘要: Large lan…...

【漏洞复现】锐捷EG易网关login.php命令注入漏洞

Nx01 产品简介 锐捷EG易网关是一款综合网关&#xff0c;由锐捷网络完全自主研发。它集成了先进的软硬件体系架构&#xff0c;配备了DPI深入分析引擎、行为分析/管理引擎&#xff0c;可以在保证网络出口高效转发的条件下&#xff0c;提供专业的流控功能、出色的URL过滤以及本地化…...

Nginx安装http2和ssl模块

Nginx安装http2和ssl模块 Nginx在执行默认安装命令的时候&#xff0c;并不会编译启用ngx_http_v2_module模块。故在修改Nginx配置文件启用http2.0协议的时候会报错。 一.检查Nginx安装了哪些模块 #进入Nginx的安装目录 cd /usr/local/nginx #执行命令查看安装了哪些模块 ./sbi…...

Android 8.1 隐藏设置中定位功能

Android 8.1 隐藏设置中定位功能 最近接到客户反馈&#xff0c;需要隐藏设备设置中的定位功能&#xff0c;具体修改参照如下&#xff1a; /vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/SecuritySettings.java mLocationcontroller.displ…...

无线网卡怎么连接台式电脑?正确操作步骤分享!

“我在使用电脑时经常都需要用到网络&#xff0c;请问大家在使用无线网卡时怎么将它与台式电脑进行连接的呢&#xff1f;” 使用电脑的用户在进行网上冲浪时都需要先连接网络。如果不想使用网线&#xff0c;无线网卡不仅可以为用户提供网络服务&#xff0c;在使用时该更加灵活和…...

聚道云软件连接器助力某贸易公司实现付款流程自动化

客户介绍&#xff1a; 某贸易公司是一家集进出口贸易、国内贸易、电子商务等业务于一体的综合性贸易企业。公司业务遍及全球多个国家和地区&#xff0c;拥有庞大的供应商网络和采购需求。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 客户痛点&#…...

第六讲_css盒子模式

css盒子模型 1. 长度单位2. 盒子模型的组成2.1 盒子模型内容2.2 盒子模型内边距2.3 盒子模型边框2.4 盒子模型外边距 1. 长度单位 px&#xff1a;像素em&#xff1a;相对于当前元素或父元素的 font-size 的倍数 <style>.parent {height: 500px;width: 500px;background…...

【WSL】Win10 使用 WSL2 进行 Linux GPU 开发

1. GPU 驱动 先安装 驱动 参考 https://docs.nvidia.com/cuda/wsl-user-guide/index.html 使用 https://www.nvidia.com/Download/index.aspx 提供的兼容 GeForce 或 NVIDIA RTX/Quadro 显卡在系统上安装 NVIDIA GeForce Game Ready 或 NVIDIA RTX Quadro Windows 11 显示驱动…...

什么是博若莱新酒节?

在红酒圈儿里混&#xff0c;一定不能不知道博若莱新酒节&#xff0c;这是法国举世闻名的以酒为主题的重要节日之一。现已成为世界范围内庆祝当年葡萄收获和酿制的节日&#xff0c;被称为一年一度的酒迷盛会。 云仓酒庄的品牌雷盛红酒LEESON分享博若莱位于法国勃艮第南部&#x…...

Centos7下升级gcc/g++版本(简单 + 避坑)

在 Centos7 下&#xff0c;使用 yum 安装高版本的 gcc/g 最简单&#xff1a; yum -y install centos-release-scl yum -y install devtoolset-11-gcc devtoolset-11-gcc-c devtoolset-11-binutils需要安装哪个个版本的gcc/g&#xff0c;就把数字替换成对应的版本号。例如上面代…...

PyTorch项目源码学习(1)

PyTorch PyTorch是一个开源的深度学习框架&#xff0c;项目地址 https://github.com/pytorch/pytorch 在学术工作中的使用频率较高。 其主体由C开发&#xff0c;PyTorch是Torch的Python调用版本。学习PyTorch项目源代码的目的在于学习其中的实现方法与技巧&#xff0c;增加训练…...

adb 使用的出现 adb server is out of date. killing

我知道你们肯定看到这种播客 像这种解决问题的方法是暂时的 , 因为我们Android studio 中 , 你在查看后台的时候发现 你的Android studio 也占用了一端口 , 就是说你把 Android studio 杀掉了只要打开 Android studio 打开就还是 关闭 cmd adb 看到一个新的方法 , win 10 中…...

数据结构之二叉搜索树(Binary Search Tree)

数据结构可视化演示链接&#xff0c;也就是图片演示的网址 系列文章目录 数据结构之AVL Tree 数据结构之B树和B树 数据结构之Radix和Trie 文章目录 系列文章目录示例图定义二叉搜索树满足的条件应用场景 示例图 二叉 线形(顺序插入就变成了线性树&#xff0c;例如插入顺序为&…...

Spring Boot自定义启动Banner在线生成工具

记录一下&#xff0c;后续有更新添加 链接: Spring Boot自定义启动Banner在线生成工具...

Android Studio导入项目 下载gradle很慢或连接超时,提示:Read timed out---解决方法建议收藏!

目录 前言 一、报错信息 二、解决方法 三、更多资源 前言 一般来说&#xff0c;使用Android Studio导入项目并下载gradle的过程应该是相对顺利的&#xff0c;但是有时候会遇到下载速度缓慢或连接超时的问题&#xff0c;这可能会让开发者感到头疼。这种情况通常会出现在网络…...

汽车标定技术(十五)--FETK如何帮助Aurix实现快速原型、标定测量功能(1)

目录 1.概述 2.ETK描述 2.1 产品概述 2.2 FETK-T1.1产品描述 2.3 FETK-T1.1内部构造 3.小结...

linux项目部署(jdk,tomcat,mysql,nginx,redis)

打开虚拟机&#xff0c;与连接工具连接好&#xff0c;创建一个文件夹 cd /tools 把jdk,tomcat安装包放入这个文件夹里面 jdk安装 #解压 tar -zxvf apache-tomcat-8.5.20.tar.gz #解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 编辑jdk文件以及测试jdk安装 第一行代码路径…...

Unity | 渡鸦避难所-6 | 有限状态机控制角色行为逻辑

1 有限状态机简介 有限状态机&#xff08;英语&#xff1a;finite-state machine&#xff0c;缩写&#xff1a;FSM&#xff09;&#xff0c;简称状态机&#xff0c;是表示有限个状态以及在这些状态之间的转移和动作等行为的数学计算模型 在游戏开发中应用有限状态机&#xff…...

数据库参数 PGA_AGGREGATE_LIMIT 限制进程大小

在自动化 PGA 内存管理模式下&#xff0c;Oracle 数据库通过动态控制分配到工作区的 PGA 内存量来尝试遵从 PGA_AGGREGATE_TARGET 值。但是&#xff0c;有时因为以下原因&#xff0c;PGA 内存使用量可能会超过 PGA_AGGREGATE_TARGET 设置&#xff1a; PGA_AGGREGATE_TARGET 设置…...

208.【2023年华为OD机试真题(C卷)】停车场车辆统计(贪心算法实现-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-停车场车辆统计二.解题思路三.题解代码Python题…...

JS 作用域和预解析

作用域 通常来说&#xff0c;一段程序代码中所用到的名字并不总是有效和可用的&#xff0c;而限定这个名字的可用性的代码范围就是这个名字的作用域。作用域的使用提高了程序逻辑的局部性&#xff0c;增强了程序的可靠性&#xff0c;减少了名字冲突。 作用域分为全局作用域和局…...

各种锁的概述

乐观锁与悲观锁 悲观锁指对数据被外界修改持保守态度&#xff0c;认为数据很容易就会被其他线程修改&#xff0c;所以在数据被处理前先对数据进行加锁&#xff0c;并在整个数据处理过程中&#xff0c;使数据处于锁定状态。 悲观锁的实现往往依靠数据库提供的锁机制&#xff0…...

【docker笔记】Docker容器数据卷

Docker容器数据卷 卷就是目录或者文件&#xff0c;存在于一个或多个容器中&#xff0c;由docker挂载到容器&#xff0c;但不属于联合文件系统&#xff0c;因此能够绕过Union File System提供一些用于持续存储或共享数据的特性 卷的设计目的就是数据的持久化&#xff0c;完全独…...

大前端nestjs入门教程系列(四):如何nestjs整合mysql数据库

经过前面的几篇文章&#xff0c;想必大家已经对nestjs有了基础的了解&#xff0c;那么这篇文章就带大家玩玩数据库&#xff0c;学会了这篇&#xff0c;就离大前端又进了一步 Nest与数据库无关&#xff0c;使你可以轻松地与任何 SQL 或 NoSQL 数据库集成。 根据你的喜好&#xf…...

Android studio环境配置

1.搜索android studio下载 Android Studio - Download 2.安装 3.配置环境 配置gradle&#xff0c;gradle参考网络配置。最后根据项目需求选择不同的jdk。...

017、使用包、单元包及模块来管理日渐复杂的项目

在编写较为复杂的项目时&#xff0c;合理地对代码进行组织与管理很重要&#xff0c;因为我们不太可能记住代码中所有的细枝末节。只有按照不同的特性来组织或分割相关功能的代码&#xff0c;我们才能够清晰地找到实现指定功能的代码片段&#xff0c;或确定哪些地方需要修改。 到…...

Git提交规范详解

在团队协作开发中&#xff0c;Git作为版本控制系统&#xff0c;其提交信息的清晰性和一致性至关重要。通过定义特定的提交类型和格式&#xff0c;我们可以更好地追踪项目历史&#xff0c;提高代码审查效率&#xff0c;并方便生成高质量的变更日志。以下是几种常见的Git提交类型…...

线程与UI操作

子线程中不能执行UI操作。 UI 操作指的是与用户界面&#xff08;User Interface&#xff09;相关的操作&#xff0c;包括但不限于以下几种&#xff1a; 更新视图&#xff1a;例如更改 TextView 的文本内容、设置 ImageView 的图片等。处理用户输入&#xff1a;例如响应按钮点…...

ELK企业级日志系统分析系统

目录 一、什么是ELK&#xff1f; 二、ELK三大组件 三、ELK的工作原理 四、完整日志系统基本特征 一、什么是ELK&#xff1f; ELK平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用&#xff0c; 完成更强大的用…...

11.23 校招 实习 内推 面经

绿*泡*泡&#xff1a; neituijunsir 交流裙 &#xff0c;内推/实习/校招汇总表格 1、校招&社招&实习丨图森未来传感器标定工程师招聘&#xff08;内推&#xff09; 校招&社招&实习丨图森未来传感器标定工程师招聘&#xff08;内推&#xff09; 2、校招 | 吉…...

Python战机

基础版 import pygame import random# 设置游戏屏幕大小 screen_width 480 screen_height 600# 定义颜色 WHITE (255, 255, 255) RED (255, 0, 0) GREEN (0, 255, 0) BLUE (0, 0, 255)# 初始化pygame pygame.init()# 创建游戏窗口 screen pygame.display.set_mode((scre…...

外包做了5个月,技术退步一大半了。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;20年通过校招进入深圳某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...

设计模式的艺术P1基础—2.2 类与类的UML图示

设计模式的艺术P1基础—2.2 类与类的UML图示 在UML 2.0的13种图形中&#xff0c;类图是使用频率最高的两种UML图之一&#xff08;另一种是用于需求建模的用例图&#xff09;&#xff0c;它用于描述系统中所包含的类以及它们之间的相互关系&#xff0c;帮助人们简化对系统的理解…...

PCB 的正片、负片那些事儿

最近在 PCB 打样的过程中遇到了 PCB 的正片层和负片层的问题&#xff0c;故以此记录一下。 问题产生的原因是在投产 PCB 时发现生产稿的 Gerber 图形和 PCB 设计有区别&#xff0c;如图所示&#xff0c;左边为某 PCB 内层&#xff0c;右边为对应层生产稿的 Gerber 图形&#x…...

QT应用篇:QT解析与生成XML文件的四种方式

四种常见的解析 XML 的方式(DOM、SAX、以及基于 Qt 的 XmlStreamReader)各有自己的优缺点,适合不同的应用场景。 DOM 适合小型且结构简单的 XML 文件,需要频繁修改和操作整个文档结构的情况。SAX 适合大型 XML 文件,以及只需读取不需要修改的情况。基于 Qt 的 XmlStreamRe…...