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

本地搭建一个简易版本的 Web3 服务

一、环境搭建与工具准备

(一)安装 Node.js 和 npm

Node.js 是一个基于 JavaScript 的运行时环境,npm 是其默认的包管理器。在 Web3 开发中,Node.js 和 npm 是必不可少的工具。

  1. 访问 Node.js 官网 并下载最新的 LTS 版本。

  2. 安装后,通过命令行检查安装是否成功

    node -v
    npm -v
(二)安装 Truffle 和 Ganache

Truffle 是一个开发、测试和部署智能合约的框架,Ganache 是一个本地的以太坊区块链模拟器,用于在本地测试智能合约。

  1. 安装 Truffle

    npm install -g truffle
  2. 安装 Ganache:

    • 可以通过 Ganache 官网 下载桌面版,或通过命令行安装 CLI 版

      npm install -g ganache-cli
(三)安装 MetaMask

MetaMask 是一个以太坊钱包,允许你在浏览器中与 dApp 交互。它充当你的数字钱包,并能连接到本地或远程的以太坊网络。

  1. 访问 MetaMask 官网,下载并安装适用于你浏览器的扩展插件。

  2. 安装后,创建一个新钱包并保存助记词。

二、创建和部署一个简单的智能合约

(一)初始化 Truffle 项目
  1. 创建项目文件夹

    mkdir my-first-web3-project
    cd my-first-web3-project
  2. 初始化 Truffle 项目

    truffle init
(二)编写智能合约

我们将编写一个简单的智能合约,用于存储和检索一条消息。

  1. 创建智能合约文件:

    • contracts 文件夹下创建一个名为 SimpleStorage.sol 的文件,内容如下

      // SPDX-License-Identifier: MIT
      pragma solidity ^0.8.0;contract SimpleStorage {string private message;// 设置消息function setMessage(string memory newMessage) public {message = newMessage;}// 获取消息function getMessage() public view returns (string memory) {return message;}
      }
  2. 编译智能合约:

    • 在项目根目录下运行以下命令来编译合约

      truffle compile
(三)部署智能合约

将智能合约部署到本地的以太坊区块链(Ganache)上。

  1. 配置网络:

    • truffle-config.js 文件中,配置本地的 Ganache 网络

      module.exports = {networks: {development: {host: "127.0.0.1",     // 本地主机地址port: 7545,            // Ganache 默认端口network_id: "*",       // 匹配任何网络 ID},},// 其他配置...
      };
  2. 编写部署脚本:

    • migrations 文件夹中创建一个名为 2_deploy_contracts.js 的文件,内容如下

      const SimpleStorage = artifacts.require("SimpleStorage");module.exports = function(deployer) {deployer.deploy(SimpleStorage);
      };
  3. 启动 Ganache:

    • 打开 Ganache 应用或通过命令行启动

      ganache-cli
  4. 部署智能合约:

    • 在项目根目录下运行以下命令,将合约部署到 Ganache

      truffle migrate
    • 成功部署后,Truffle 会显示智能合约的部署地址。

三、开发一个 dApp 并与智能合约交互

(一)设置前端开发环境

在项目中创建一个 client 文件夹,用于存放前端代码。

  1. 初始化前端项目

    mkdir client
    cd client
    npm init -y
  2. 安装依赖:

    • 安装 Web3.js 库和其他前端依赖

      npm install web3
      npm install lite-server --save-dev
  3. 创建前端文件:

    • client 文件夹中创建一个 index.html 文件,内容如下

      <!DOCTYPE html>
      <html lang="en">
      <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>My First Web3 dApp</title>
      </head>
      <body><h1>Simple Storage dApp</h1><input type="text" id="messageInput" placeholder="Enter a message" /><button id="setMessageButton">Set Message</button><p>Stored Message: <span id="storedMessage"></span></p><script src="https://cdn.jsdelivr.net/npm/web3/dist/web3.min.js"></script><script src="app.js"></script>
      </body>
      </html>
    • 创建 app.js 文件,用于与智能合约进行交互,内容如下

      const web3 = new Web3(Web3.givenProvider || "http://localhost:7545");const contractAddress = "YOUR_CONTRACT_ADDRESS";  // 部署的合约地址
      const contractABI = [// ABI goes here...
      ];const contract = new web3.eth.Contract(contractABI, contractAddress);document.getElementById('setMessageButton').onclick = async () => {const message = document.getElementById('messageInput').value;const accounts = await web3.eth.getAccounts();await contract.methods.setMessage(message).send({ from: accounts[0] });alert('Message stored successfully');
      };const loadMessage = async () => {const message = await contract.methods.getMessage().call();document.getElementById('storedMessage').innerText = message;
      };loadMessage();
    • 将部署时生成的智能合约 ABI 复制到 app.js 中的 contractABI 变量中,并替换 contractAddress 为实际的合约地址。

(二)运行 dApp
  1. 启动开发服务器:

    • client 文件夹中,运行以下命令启动轻量级开发服务器

      npx lite-server
  2. 在浏览器中访问 dApp:

    • 浏览器将自动打开并显示你的 dApp。你可以在输入框中输入消息并点击“Set Message”按钮,将消息存储到智能合约中。

  3. 与智能合约交互:

    • 输入消息并提交后,dApp 会与智能合约进行交互,将消息存储到区块链中。页面将自动显示存储的消息。

四、C++ 智能合约开发

(一)环境依赖
  • 操作系统:目前仅支持 Linux 和 MAC 系统。

  • 软件依赖

    • GCC:7.3+,C 编译器。

      • Mac:brew install gcc

      • Linux:

        • Ubuntu/Debian:apt-get install gcc

        • CentOS/Redhat:yum install gcc

(二)编写 C++ 智能合约
1. 搭建开发环境
  • 开发者可根据 ChainMaker 提供的 SDK 开发 C++ 合约,C++ 合约的 SDK 工程下载地址为:chainmaker-contract-sdk-cpp。

  • SDK 下载完成后,开发者可根据自身习惯选择熟悉的 C++ 编辑器或 IDE。推荐使用 CLion,CLion 下载和安装请参见官网:JetBrains CLion。

  • 安装完成后,使用 CLion 打开 SDK 工程,通过编辑 main.cc 文件即可编辑自己的 C++ 合约。

2. 代码编写规则
  • 外部方法声明:只有声明为外部方法的函数,才可以(被用户或其他合约)从外部调用,否则,只能用于合约内部调用。外部方法声明规则如下:

    • WASM_EXPORT:必须,暴露声明。

    • void:必须,无返回值。

    • method_name():必须,暴露方法名称

      // 示例
      WASM_EXPORT void init_contract() {
      }
  • 强制声明外部方法:强制声明外部方法为合约必须提供且必须对外暴露的方法,有以下两个:

    • init_contract:创建合约会自动执行该方法,无需指定方法名。

    • upgrade:升级合约会自动执行该方法,无需指定方法名

      // 在创建本合约时,调用一次init方法。ChainMaker不允许用户直接调用该方法。
      WASM_EXPORT void init_contract() {// 安装时的业务逻辑,可为空
      }// 在升级本合约时,对于每一个升级的版本调用一次upgrade方法。ChainMaker不允许用户直接调用该方法。
      WASM_EXPORT void upgrade() {// 升级时的业务逻辑,可为空
      }
  • 获取 SDK 接口上下文:C++ 合约通过 SDK 接口上下文与链进行交互,具体信息可参考文章末尾 C++ SDK API描述

    // 获取 SDK 接口上下文
    Context* ctx = context();
3. 合约示例源码展示
  • 下文代码框内为一个 C++ 编写的存证合约示例,该合约示例实现以下功能:

    1. 存储文件哈希、文件名称和该交易的 ID。

    2. 通过文件哈希查询该条记录。

    #include "chainmaker/chainmaker.h"using namespace chainmaker;class Counter : public Contract {
    public:void init_contract() {}void upgrade() {}// 保存void save() {// 获取 SDK 接口上下文Context* ctx = context();// 定义变量std::string time;std::string file_hash;std::string file_name;std::string tx_id;// 获取参数ctx->arg("time", time);ctx->arg("file_hash", file_hash);ctx->arg("file_name", file_name);ctx->arg("tx_id", tx_id);// 发送合约事件// 向 topic:"topic_vx" 发送 2 个 event 数据,file_hash,file_namectx->emit_event("topic_vx", 2, file_hash.c_str(), file_name.c_str());// 存储数据ctx->put_object("fact" + file_hash, tx_id + " " + time + " " + file_hash + " " + file_name);// 记录日志ctx->log("call save() result:" + tx_id + " " + time + " " + file_hash + " " + file_name);// 返回结果ctx->success(tx_id + " " + time + " " + file_hash + " " + file_name);}// 查询void find_by_file_hash() {// 获取 SDK 接口上下文Context* ctx = context();// 获取参数std::string file_hash;ctx->arg("file_hash", file_hash);// 查询数据std::string value;ctx->get_object("fact" + file_hash, &value);// 记录日志ctx->log("call find_by_file_hash()-" + file_hash + ",result:" + value);// 返回结果ctx->success(value);}
    };// 在创建本合约时,调用一次 init 方法。ChainMaker 不允许用户直接调用该方法。
    WASM_EXPORT void init_contract() {Counter counter;counter.init_contract();
    }// 在升级本合约时,对于每一个升级的版本调用一次 upgrade 方法。ChainMaker 不允许用户直接调用该方法。
    WASM_EXPORT void upgrade() {Counter counter;counter.upgrade();
    }WASM_EXPORT void save() {Counter counter;counter.save();
    }WASM_EXPORT void find_by_file_hash() {Counter counter;counter.find_by_file_hash();
    }
4. 编译合约
  • 搭建编译环境:开发者可使用 ChainMaker 已经打包好的 Docker 镜像编译 C++ 合约代码,ChainMaker 官方已经将容器发布至 docker hub。

    • 拉取镜像

      docker pull chainmakerofficial/chainmaker-cpp-contract:2.1.0
    • 启动镜像:启动镜像前,需要指定本地开发目录,用于映射为 docker 镜像的 home 目录。用于映射的本地开发目录一般为 SDK 工程目录,例如 /data/workspace/chainmaker-contract-sdk-cpp,这样编辑开发的 C++ 合约就可以在 docker 容器内的 home 目录直接编译了

      # 启动并进入容器,$WORK_DIR 即本地工作目录
      docker run -it --name chainmaker-cpp-contract -v $WORK_DIR:/home chainmakerofficial/chainmaker-cpp-contract:2.1.0 bash
      # 或者先后台启动
      docker run -d --name chainmaker-cpp-contract -v $WORK_DIR:/home chainmakerofficial/chainmaker-cpp-contract:2.1.0 bash -c "while true; do echo hello world; sleep 5;done"
      # 再进入容器
      docker exec -it chainmaker-cpp-contract bash
  • 编译示例合约:进入编译容器后,切换到 home 目录,这个 home 目录对应启动编译容器时映射的本地开发目录,进入后执行以下命令

    cd /home/
    make clean
    emmake make
    • 编译完成后,将生成合约的字节码文件 main.wasm

5. SDK 工程框架描述
  • chainmaker-contract-sdk-cpp 工程的结构和文件描述如下:

    • chainmaker

      • basic_iterator.cc:迭代器实现。

      • basic_iterator.h:迭代器头文件声明。

      • chainmaker.h:SDK 主要接口头文件声明,详情见 C++ SDK API描述。

      • context_impl.cc:与链交互接口实现。

      • context_impl.h:与链交互头文件声明。

      • contract.cc:合约基础工具类。

      • error.h:异常处理类。

      • exports.js:编译合约导出函数。

      • safemath.hassert 异常处理。

      • syscall.cc:与链交互入口。

      • syscall.h:与链交互头文件声明。

    • pb

      • contract.pb.cc:与链交互数据协议。

      • contract.pb.h:与链交互数据协议头文件声明。

    • main.cc:用户写合约入口。

    • Makefile:常用 build 命令。

6. 编译说明
  • 在 ChainMaker 提供的 Docker 容器中,已经预装了 Emscripten SDK 和相关的编译工具链,用户无需手动安装。

  • 编译过程中,make clean 命令用于清理之前的编译产物,emmake make 命令用于启动编译流程。

  • 如果在编译过程中遇到错误,可以根据错误信息检查合约代码是否存在语法错误、依赖库是否正确链接等问题。

  • 编译生成的 .wasm 文件是智能合约的可执行文件,需要通过 ChainMaker 的合约管理工具进行部署和发布,才能在区块链网络中运行。

相关文章:

本地搭建一个简易版本的 Web3 服务

一、环境搭建与工具准备 &#xff08;一&#xff09;安装 Node.js 和 npm Node.js 是一个基于 JavaScript 的运行时环境&#xff0c;npm 是其默认的包管理器。在 Web3 开发中&#xff0c;Node.js 和 npm 是必不可少的工具。 访问 Node.js 官网 并下载最新的 LTS 版本。 安装…...

电脑安装CentOS系统

前言 电脑是Windows10系统&#xff0c;安装CentOS之前要将硬盘格式化&#xff0c;这个操作会将Windows10系统以及电脑上所有资料抹除&#xff0c;操作前务必谨慎复查是否有重要资料需要备份。 准备工作 准备两个U盘&#xff0c;一台电脑。提前把镜像下载好。镜像在百度网盘里…...

【Linux专栏】zip 多个文件不带路径

Linux && Oracle相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 1.背景 今天发现 Linux 解压缩的文件中&#xff0c;不光包含需要的文件&#xff0c;还保留了目录层级&#xff0c;不是想要的结果。因此&#xff0c;本文关于…...

邀请函 | 「软件定义汽车 同星定义软件」 TOSUN用户日2025·杭州站

参会邀请函 尊敬的客户及合作伙伴&#xff1a; 新能源汽车智能化浪潮席卷全球&#xff0c;杭州作为中国技术创新高地&#xff0c;正引领行业变革。为助力工程师伙伴应对行业挑战&#xff0c;解决工程难题&#xff0c;同星智能将于2025年5月9日&#xff08;周五&#xff09;在…...

start_response详解

start_response 是Python的WSGI&#xff08;Web Server Gateway Interface&#xff09;中的一个重要概念&#xff0c;它是一个可调用对象&#xff08;通常是一个函数&#xff09;&#xff0c;在WSGI应用程序里发挥着关键作用&#xff0c;下面为你详细介绍。 作用 在WSGI规范里…...

记一次 .NET某旅行社酒店管理系统 卡死分析

一&#xff1a;背景 1. 讲故事 年初有位朋友找到我&#xff0c;说他们的管理系统不响应了&#xff0c;让我帮忙看下到底咋回事? 手上也有dump&#xff0c;那就来分析吧。 二&#xff1a;为什么没有响应 1. 线程池队列有积压吗&#xff1f; 朋友的系统是一个web系统&#…...

[预备知识]1. 线性代数基础

线性代数基础 线性代数是深度学习的重要基础&#xff0c;本章节将介绍深度学习中常用的线性代数概念和操作。 1. 标量、向量、矩阵与张量 1.1 标量&#xff08;Scalar&#xff09; 标量是单个数值&#xff0c;用 x ∈ R x \in \mathbb{R} x∈R 表示。在深度学习中常用于表…...

RESTful学习笔记(二)---简单网页前后端springboot项目搭建

新建项目&#xff1a; 项目结构 Pom.xml中添加依赖&#xff1a; 要有用于启动的父进程&#xff0c;有启动依赖&#xff0c;有lombok用于自动构建getter和setter方法等 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-…...

C++ AI模型部署优化实战:基于TensorRT的高效推理引擎开发

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…...

[特殊字符] Prompt如何驱动大模型对本地文件实现自主变更:Cline技术深度解析

在AI技术快速发展的今天&#xff0c;编程方式正在经历一场革命性的变革。从传统的"人写代码"到"AI辅助编程"&#xff0c;再到"AI自主编程"&#xff0c;开发效率得到了质的提升。Cline作为一款基于VSCode的AI编程助手&#xff0c;通过其独特的pro…...

DevOps功能详解

DevOps 详解 1. 什么是 DevOps&#xff1f; DevOps 是 Development&#xff08;开发&#xff09; 和 Operations&#xff08;运维&#xff09; 的组合词&#xff0c;代表一种通过 自动化工具、协作文化 和 流程优化 来加速软件开发与交付的 方法论。其核心目标是打破开发与运维…...

忽略 CS8616 警告在 Visual Studio 2022 中【C# 8.0 】

CS8616 警告是 C# 8.0 引入的可空引用类型(NRT)相关警告&#xff0c;表示"由于可空引用类型的特性&#xff0c;某个不可为 null 的字段可能未被初始化"。 编辑项目csproj&#xff0c;直接删除<Nullable>enable</Nullable> 或者修改为disable或者annota…...

[架构之美]一键服务管理大师:Ubuntu智能服务停止与清理脚本深度解析

[架构之美]一键服务管理大师&#xff1a;Ubuntu智能服务停止与清理脚本深度解析 服务展示&#xff1a; 运行脚本&#xff1a; 剩余服务&#xff1a; 一、脚本设计背景与核心价值 在Linux服务器运维中&#xff0c;服务管理是日常操作的重要环节。本文介绍的智能服务管理脚本&a…...

23种设计模式-结构型模式之外观模式(Java版本)

Java 外观模式&#xff08;Facade Pattern&#xff09;详解 &#x1f9ed; 什么是外观模式&#xff1f; 外观模式是结构型设计模式之一&#xff0c;为子系统中的一组接口提供一个统一的高层接口&#xff0c;使得子系统更易使用。 就像是酒店前台&#xff0c;帮你处理入住、叫…...

《数据结构之美--双向链表》

引言 之前我们学习了单链表这一数据结构&#xff0c;虽然单链表的功能比较多&#xff0c;但是也存在着一些局限性&#xff0c;因为在单链表中节点的指向都是单向的&#xff0c;因此我们想从某个节点找到它的上一个节点比较困难&#xff0c;来不及再迷恋单链表了&#xff0c;接…...

如何判断设备是否支持带电插拔——从原理到实操的全面解析

点击下面图片带您领略全新的嵌入式学习路线 &#x1f525;爆款热榜 88万阅读 1.6万收藏 一、带电插拔的核心原理 带电插拔&#xff08;热插拔&#xff09;的本质是通过电气隔离设计和顺序通断控制&#xff0c;避免电流突变对设备造成损害。 • 触点分级设计&#xff1a;支持热…...

Google Store 如何利用 glTF 3D 模型改变产品教育

Google 为全球广大用户提供种类繁多、持续改进的硬件产品。Google 的智能手机、智能手表、耳机、平板电脑、智能家居设备等产品均通过 Google Store(谷歌商店) 以及遍布全球的实体和数字第三方零售商销售。作为一个以在人工智能、智能家居和个人设备体验方面不断开拓创新而闻名…...

Flutter 状态管理 Riverpod

Android Studio版本 Flutter SDK 版本 将依赖项添加到您的应用 flutter pub add flutter_riverpod flutter pub add riverpod_annotation flutter pub add dev:riverpod_generator flutter pub add dev:build_runner flutter pub add dev:custom_lint flutter pub add dev:riv…...

flutter 专题 六十六 Flutter Dio包网络请求抓包解决方案

在Flutter中进行网络请求时&#xff0c;我们可以使用的库有3个&#xff0c;即Http请求库、HttpClient请求库和Dio请求库&#xff08;详细介绍请参考&#xff1a;Flutter开发之Http网络请求&#xff09;&#xff0c;使用得最多的就是Dio请求库。因为相比Http请求库和HttpClient请…...

DSL(Domain Specific Language,领域特定语言)

DSL的定义和作用 DSL是为特定业务领域设计的专门语言&#xff0c;这里特指为欺诈检测场景设计的规则描述语言通过DSL&#xff0c;业务人员可以用接近自然语言的方式定义欺诈检测规则&#xff0c;而不需要编写复杂的代码DSL的具体实现&#xff1a;使用ANTLR4作为语法解析工具支…...

基于SpringBoot的心情疗愈平台-项目分享

基于SpringBoot的心情疗愈平台-项目分享 项目介绍项目摘要管理员功能图用户实体图心理咨询师功能图系统功能图项目预览情感树洞发布帖子讲座信息心理医生心理医生管理 最后 项目介绍 使用者&#xff1a;管理员、用户、心理咨询师 开发技术&#xff1a;MySQLJavaSpringBootVue …...

富文本图片过大问题

在做若依的项目&#xff0c;碰到了若依自带的公告功能的图片上传后&#xff0c;再显示会出现图片过大的问题。在修改若依代码无果后&#xff0c;退而求其次修改展示页面的代码。 问题描述&#xff1a; 在若依框架的打卡系统中&#xff0c;公告使用富文本上传图片后&#xff0…...

Python-Django系列—部件

部件是 Django 对 HTML 输入元素的表示。部件处理 HTML 的渲染&#xff0c;以及从对应于部件的 GET&#xff0f;POST 字典中提取数据。 内置部件生成的 HTML 使用 HTML5 语法&#xff0c;目标是 <!DOCTYPE html>。例如&#xff0c;它使用布尔属性&#xff0c;如 checked…...

开发者视角:轻量便捷的AI视觉训推一体机如何实现AI模型快速开发

一、行业背景 1&#xff09;数据与算力基础夯实&#xff1a;互联网、物联网和移动互联网的普及使得视觉数据呈爆发式增长&#xff0c;为AI视觉训推技术提供了丰富的“燃料”。同时&#xff0c;GPU、TPU等计算芯片的广泛使用&#xff0c;以及云计算的兴起&#xff0c;让计算能力…...

基于Python(Django)+SQLite实现(Web)校园助手

校园助手 本校园助手采用 B/S 架构。并已将其部署到服务器上。在网址上输入 db.uplei.com 即可访问。 使用说明 可使用如下账号体验&#xff1a; 学生界面: 账号1&#xff1a;123 密码1&#xff1a;123 账户2&#xff1a;201805301348 密码2&#xff1a;1 # --------------…...

Django 入门指南:构建强大的 Web 应用程序

什么是 Django&#xff1f; Django 是一个开源的高层次 Python Web 框架&#xff0c;旨在快速开发安全且可维护的网站。它通过简化常见的 Web 开发任务&#xff0c;帮助开发者专注于开发应用的核心功能。Django 实现了“快速开发”和“尽量少的重复”的理念&#xff0c;提供了…...

一文了解相位阵列天线中的真时延

本文要点 真时延是宽带带相位阵列天线的关键元素之一。 真时延透过在整个信号频谱上应用可变相移来消除波束斜视现象。 在相位阵列中使用时延单元或电路板&#xff0c;以提供波束控制和相移。 市场越来越需要更快、更可靠的通讯网络&#xff0c;而宽带通信系统正在努力满…...

LangChain实现PDF中图表文本多模态数据向量化及RAG应用实战指南

如何用LangChain实现PDF多模态数据向量化及RAG应用实战指南 在大模型应用中&#xff0c;PDF文档因包含文本、表格、图片等异构数据&#xff0c;成为RAG&#xff08;检索增强生成&#xff09;系统的核心挑战。本文基于LangChain框架&#xff0c;结合多模态处理技术&#xff0c;…...

OkHttp入门

OkHttp 简介与使用示例 OkHttp 是一个高效的 HTTP 客户端&#xff0c;用于 Android、Java 应用程序以及 Kotlin 应用程序。它支持同步阻塞调用和异步调用&#xff0c;同时提供了强大的拦截器和重定向处理功能。OkHttp 由 Square 公司开发&#xff0c;因其高性能和易用性而广受…...

在ARM Linux应用层下驱动MFRC522

文章目录 1、前言2、IC卡 和 IC卡读卡器3、MFRC5223.1、寄存器集3.2、命令集3.3、数据操作3.4、基础函数编写3.4.1、MFRC522接线3.4.2、编写SPI操作函数3.4.3、编写MFRC522基础函数3.4.3.1、完整的mfrc522.h3.4.3.2、写寄存器和读寄存器3.4.3.3、复位引脚操作3.4.3.4、天线操作…...

力扣第446场周赛

有事没赶上, 赛后模拟了一下, 分享一下我的解题思路和做题感受 1.执行指令后的得分 题目链接如下&#xff1a;力扣 给你两个数组&#xff1a;instructions 和 values&#xff0c;数组的长度均为 n。 你需要根据以下规则模拟一个过程&#xff1a; 从下标 i 0 的第一个指令开始…...

close和shutdown

1.shutdown() 控制 TCP 连接的读写方向&#xff0c;不会关闭文件描述符&#xff0c;也不会触发四次挥手。 shutdown(sockfd, SHUT_RD): 关闭套接字的读方向。套接字不能再接收数据。 shutdown(sockfd, SHUT_WR): 关闭套接字的写方向。套接字不能再发送数据。 shutdown(sockfd…...

LeetCode算法题(Go语言实现)_54

题目 给你两个正整数数组 spells 和 potions &#xff0c;长度分别为 n 和 m &#xff0c;其中 spells[i] 表示第 i 个咒语的能量强度&#xff0c;potions[j] 表示第 j 瓶药水的能量强度。 同时给你一个整数 success 。一个咒语和药水的能量强度 相乘 如果 大于等于 success &a…...

.NET应用UI框架DevExpress XAF v24.2新版亮点:支持.NET 9

DevExpress XAF是一款强大的现代应用程序框架&#xff0c;允许同时开发ASP.NET和WinForms。DevExpress XAF采用模块化设计&#xff0c;开发人员可以选择内建模块&#xff0c;也可以自行创建&#xff0c;从而以更快的速度和比开发人员当前更强有力的方式创建应用程序。 在DevEx…...

前端通过jenkins和docker打包部署流程

通过jenkins实现镜像打包和上传 1.在jenkins上创建流水线任务 点击新建任务 填写任务名称 选多分支流水线 增加分支源 选git 添加并选择凭据&#xff08;有项目权限的git账号密码&#xff09; 填写分支的正则表达式&#xff0c;多分支使用^(分支名|分支名)$ 保存 …...

SpringBoot自定义验证器:企业级参数校验架构设计与实践

一、需求分析与技术选型 在复杂业务场景中,标准校验注解(如@NotBlank、@Pattern)往往无法满足特殊业务规则验证需求。例如: 需要校验字段值在预定义的枚举范围内多字段之间存在关联性校验(如起始时间不能晚于结束时间)需要动态查询数据库进行业务规则校验架构设计原则:…...

4U带屏基于DSP/ARM+FPGA+AI的电力故障录波装置设计方案,支持全国产化

4U带屏DSP/ARMFPGAAI电力故障录波分析仪&#xff0c;支持国产化&#xff0c;含有CPU主控模块&#xff0c;96路模拟量采集&#xff0c;256路开关量&#xff0c;通讯扩展卡等#电力故障录波#4U带屏#新能源#电力监测 主要特点 1&#xff09;是采用嵌入式图形系统&#xff0c;以及…...

笔试题——第五周

目录 Day1 排序子序列 消减整数 最长上升子序列 Day2 爱吃素 相差不超过k的最多数 最长公共子序列(一) Day3 小红的口罩 春游 数位染色 Day4 素数回文 活动安排 合唱团 Day5 跳台阶扩展问题 包含不超过两种字符的最长子串 字符串的排列 Day6 ISBN号码 k…...

图论-Floyd算法

在搜索中bfs只适合无权图 若是碰到有权图最简单的方法就是用邻接矩阵-二维矩阵存储每个点对之间的权重,然后用floyd 并且邻接矩阵还可以处理重边的问题&#xff08;用min&#xff09; INFfloat(inf) ma[[INF]*n for _ in range(n)]for i in range(n):ma[i][i]0for i in rang…...

使用pyinstaller打包fastapi项目的问题记录

文章目录 PyInstaller 相关介绍作用使用方式Spec 文件介绍 FastAPI 相关介绍什么是 FastAPI&#xff1f;使用方式 使用 PyInstaller 打包 FastAPI 项目常见问题与解决方案 PyInstaller 相关介绍 作用 PyInstaller 是一个将 Python 程序打包成独立可执行文件的工具&#xff0c…...

Java秒杀功能-案例

数据库表设计 CREATE TABLE user (id bigint(20) NOT NULL AUTO_INCREMENT,name varchar(100) NOT NULL,password varchar(100) NOT NULL,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8;CREATE TABLE order_info (id bigint(20) NOT NULL AUTO_INCREMENT,user_id bigi…...

Abp发布订阅

在 ABP&#xff08;AspNet Boilerplate&#xff09;框架里运用发布 - 订阅模式&#xff0c;有着多方面重要目的&#xff0c;以下为你详细阐述&#xff1a; 实现组件间的解耦 减少直接依赖&#xff1a;在传统的编程方式中&#xff0c;不同组件之间可能存在紧密的耦合关系&…...

docker部署ruoyi-vue-pro前后端详细笔记

docker部署ruoyi-vue-pro前后端详细笔记 参考&#xff1a;YuDaoCloud&#xff1a;Docker 部署 - 那个码农 1.准备工作 1.1 需要准备服务器&#xff0c;安装bt面板方便操作 if [ -f /usr/bin/curl ];then curl -sSO https://download.bt.cn/install/install_panel.sh;else wg…...

软考中级数据库系统工程师学习资料分享

软考中级数据库系统工程师考试对于很多 IT 从业者和计算机专业的大学生来说&#xff0c;是一个重要的职业资格认证。它不仅能够提升个人的专业技能&#xff0c;还能为职业发展增添有力的砝码。今天&#xff0c;我将为大家分享一套全面且实用的学习资料&#xff0c;帮助大家更好…...

RESTful学习笔记(一)

Web发展 一、API 程序硬件接口&#xff08;Application Programming Interface&#xff09;&#xff0c;是预先定义好的逻辑函数&#xff0c;软件系统不同组成部分衔接的约定&#xff0c;直接调用函数&#xff0c;无序访问代码细节&#xff0c;分为SDK和Web应用接口两类 SDK…...

基于 FFmpeg 的音视频处理基础原理与实验探究

目录 1 基本知识1.1 解封装1.2 AAC和ADTS说明 1.3 H2641.3.1 H264编码结构解析1.3.2 NALU1.3.2 分类 2 实验1 探究音视频信息2.1 重要结构体介绍2.2 相关的API 3 实验二 提取AAC数据4 实验三 提取h264 1 基本知识 1.1 解封装 封装的逆向操作&#xff1a;封装是把音频流、视频流…...

spark和hadoop的区别

一、核心定位与架构差异 Hadoop • 定位&#xff1a;分布式存储与计算的基础框架&#xff0c;核心解决海量数据的存储&#xff08;HDFS&#xff09;和离线批处理计算&#xff08;MapReduce&#xff09;问题&#xff0c;适合对实时性要求不高的大规模数据离线处理场景。 • 架构…...

vue使用语音识别

vue使用语音识别 使用 Web Speech API 实现语音识别功能 语音转换的原理可以简单概括为以下几个步骤&#xff1a; 声音捕捉&#xff1a;将声波转化为数字信号。特征提取&#xff1a;分析声音中的关键特征。声学模型&#xff1a;将声音特征与音素匹配。语言模型&#xff1a;根据…...

代码随想录算法训练营day8(栈与队列)

华子目录 用栈实现队列思路 用栈实现队列 https://leetcode.cn/problems/implement-queue-using-stacks/description/ push(x) -- 将一个元素放入队列的尾部。 pop() -- 从队列首部移除元素。 peek() -- 返回队列首部的元素。 empty() -- 返回队列是否为空。思路 初始化两个栈…...

GPT,Genini, Claude Llama, DeepSeek,Qwen,Grok,选对LLM大模型真的可以事半功倍!

选对大模型真的可以事半功倍&#xff01; 基于公开的技术报告、基准测试结果、在线反馈及用户使用情况&#xff0c;深入探讨各模型的特点、擅长领域及典型应用场景&#xff0c;为用户和开发者选择和应用合适的模型提供参考。 1. 引言 大型语言模型&#xff08;Large Language…...