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

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发

下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。


🧠 一、概念简介:Solidity 合约开发

Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编程语言,语法类似 JavaScript。
智能合约(Smart Contract)是运行在区块链上的自执行代码,能在没有第三方的情况下自动执行交易、权限控制、逻辑判断等操作。

Solidity 支持继承、库、自定义结构体和映射等复杂数据结构,并提供了事件、修饰器等语言特性,适合构建安全可扩展的去中心化应用(DApp)。


📦 二、简单代码示例:ERC-20代币

下面是一个基本的 ERC-20 Token 合约,用于发行和转账代币:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract MyToken {string public name = "MyToken";string public symbol = "MTK";uint8 public decimals = 18;uint256 public totalSupply;mapping(address => uint256) public balanceOf;event Transfer(address indexed from, address indexed to, uint256 value);constructor(uint256 initialSupply) {totalSupply = initialSupply * 10 ** uint256(decimals);balanceOf[msg.sender] = totalSupply;}function transfer(address to, uint256 value) public returns (bool success) {require(balanceOf[msg.sender] >= value, "Insufficient Balance");balanceOf[msg.sender] -= value;balanceOf[to] += value;emit Transfer(msg.sender, to, value);return true;}
}

🔍 三、讲解要点

部分说明
pragma solidity ^0.8.0;指定使用的Solidity编译器版本
mapping(address => uint256)记录每个地址的代币余额
constructor 构造函数初始化代币总量并分配给部署者
transfer 函数用户之间转账功能,内含余额检查和事件通知
event Transfer日志事件,可供前端监听链上代币交易


🛠 四、配合工具

  • 开发环境:Hardhat / Foundry / Remix

  • 测试工具:Chai + Mocha + Hardhat Network

  • 部署工具:Hardhat 的 deploy 插件,或脚本调用 ethers.Contract.deploy

  • 链上调用工具:Web3.js / Ethers.js


如你需要我给出更复杂的合约,如 NFT(ERC-721) 或支持 合约升级 / 链上治理 / DAO投票 的合约结构,我也可以继续补充。你也可以告诉我你正在做哪一类 Web3 项目,我给你量身定制代码示例。

二、ERC-20标准

概念介绍

ERC-20 是以太坊上一种最常见的代币标准,全称为 “Ethereum Request for Comments 20”,由 Fabian Vogelsteller 在 2015 年提出。它定义了一组代币应遵守的接口规范,使得不同的代币能被钱包、交易所、DApp 等工具统一识别和交互。

符合 ERC-20 标准的代币就像“以太坊上的货币”,可以用于转账、余额查询、授权第三方操作等基本金融功能。

常见 ERC-20 代币包括:USDT、LINK、UNI、MKR 等。


示例代码:简化的 ERC-20 实现

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;interface IERC20 {function totalSupply() external view returns (uint);function balanceOf(address account) external view returns (uint);function transfer(address to, uint amount) external returns (bool);function approve(address spender, uint amount) external returns (bool);function allowance(address owner, address spender) external view returns (uint);function transferFrom(address from, address to, uint amount) external returns (bool);event Transfer(address indexed from, address indexed to, uint value);event Approval(address indexed owner, address indexed spender, uint value);
}contract MyERC20 is IERC20 {string public name = "MyToken";string public symbol = "MTK";uint8 public decimals = 18;uint public override totalSupply;mapping(address => uint) public override balanceOf;mapping(address => mapping(address => uint)) public override allowance;constructor(uint _supply) {totalSupply = _supply * 10 ** uint(decimals);balanceOf[msg.sender] = totalSupply;emit Transfer(address(0), msg.sender, totalSupply);}function transfer(address to, uint amount) public override returns (bool) {require(balanceOf[msg.sender] >= amount, "Insufficient balance");balanceOf[msg.sender] -= amount;balanceOf[to] += amount;emit Transfer(msg.sender, to, amount);return true;}function approve(address spender, uint amount) public override returns (bool) {allowance[msg.sender][spender] = amount;emit Approval(msg.sender, spender, amount);return true;}function transferFrom(address from, address to, uint amount) public override returns (bool) {require(balanceOf[from] >= amount, "Insufficient balance");require(allowance[from][msg.sender] >= amount, "Insufficient allowance");allowance[from][msg.sender] -= amount;balanceOf[from] -= amount;balanceOf[to] += amount;emit Transfer(from, to, amount);return true;}
}

讲解要点

  • 接口 IERC20:规定了 ERC-20 的核心函数与事件,便于标准化集成。

  • totalSupply():返回代币总供应量。

  • balanceOf(address):查询指定地址余额。

  • transfer(to, amount):从调用者向目标地址转账。

  • approve(spender, amount):授权某地址可以花费自己的代币。

  • transferFrom(from, to, amount):由授权者代表他人转账。

  • allowance(owner, spender):查看授权额度。

为什么重要?

  • 所有主流钱包(如 MetaMask)、交易所(如 Uniswap、Binance)、区块链浏览器(如 Etherscan)都默认支持 ERC-20。

  • 遵循该标准的代币可以在整个以太坊生态中自由流通。

  • 其他合约或 DApp 可直接与该标准代币互操作,不需特殊适配。


如果你需要加入“燃气费优化(gas efficiency)”或“合约安全(如重入攻击防御)”的说明,我也可以继续扩展说明部分。是否还需要接着写 ERC-721 标准?

三、ERC-721标准

概念介绍

ERC-721 是以太坊上用于实现 非同质化代币(NFT) 的标准接口。与 ERC-20 标准代币的“可互换性”不同,ERC-721 强调每个代币的 唯一性与不可替代性,非常适用于收藏品、数字艺术、虚拟地产、游戏道具等领域。

ERC-721 定义了一套智能合约接口,使得支持它的钱包、交易市场(如 OpenSea)、DApp 等可以标准化操作和展示 NFT。

核心特性包括:

  • 每个代币都有唯一 tokenId

  • 支持所有权转移与授权

  • 事件用于追踪链上资产流动

示例代码

下面是一个简化的 ERC-721 合约示例,使用 OpenZeppelin 提供的标准库:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC721/ERC721.sol";contract MyNFT is ERC721 {uint public nextTokenId;address public admin;constructor() ERC721("MyNFT", "MNFT") {admin = msg.sender;}function mint(address to) external {require(msg.sender == admin, "only admin can mint");_safeMint(to, nextTokenId);nextTokenId++;}
}

简要说明:

  • 继承了 ERC721 标准实现。

  • 构造函数中设定名称(MyNFT)和代号(MNFT)。

  • mint() 函数通过 _safeMint() 创建新的 NFT,每个 NFT 拥有不同的 tokenId

讲解说明

  • 唯一性(non-fungibility):每个 tokenId 对应唯一资产,无法互换。

  • 所有权跟踪ownerOf(tokenId) 用于查询 NFT 当前拥有者。

  • 安全转移safeTransferFrom() 支持合约接收检查,避免资产丢失。

  • 事件机制:如 TransferApproval 支持链上交易透明追踪。

  • 元数据扩展(可选):通过 tokenURI(tokenId) 返回指向图片、视频、3D 模型等的外部资源链接,支持链下展示。

四、ERC-1155标准

概念介绍

ERC-1155 是以太坊提出的一种 多代币标准(Multi-Token Standard),可同时支持 同质化代币(如 ERC-20)非同质化代币(如 ERC-721)。由 Enjin 团队提出,目标是解决 ERC-20 与 ERC-721 不能复用、成本高的问题。

ERC-1155 特点:

  • 一个合约中可管理多个 Token 类型(FT/NFT 混合)。

  • 提供 批量转账 能力,节省 Gas。

  • 所有代币由 id 唯一标识,ID 可以代表某种资产类(如 NFT 系列、游戏货币等)。

  • 事件和操作统一,链上监听更高效。

常用于游戏资产系统、收藏平台等复合资产场景。

示例代码

以下是一个简化的 ERC-1155 智能合约示例,使用 OpenZeppelin 库:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
import "@openzeppelin/contracts/access/Ownable.sol";contract MyMultiToken is ERC1155, Ownable {uint256 public constant GOLD = 1;uint256 public constant SWORD = 2;constructor() ERC1155("https://api.example.com/metadata/{id}.json") {_mint(msg.sender, GOLD, 1000, "");_mint(msg.sender, SWORD, 10, "");}function mint(address to, uint256 id, uint256 amount) external onlyOwner {_mint(to, id, amount, "");}function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts) external onlyOwner {_mintBatch(to, ids, amounts, "");}
}

示例说明:

  • 合约中定义了两种代币类型:GOLD 为 FT(可替代),SWORD 为 NFT(或半 NFT)。

  • 使用 _mintBatch 支持批量铸造多个不同代币。

  • 元数据 URI 支持 id 替换,可与 OpenSea 等平台集成。

讲解说明

  • id 是唯一标识某种资产的关键,比如 1 表示 GOLD,2 表示 SWORD。

  • _mint()_mintBatch() 用于单个或多个资产铸造。

  • balanceOf(account, id) 查询用户持有的某类代币数量。

  • safeTransferFrom()safeBatchTransferFrom() 实现单个与批量转账。

  • 可通过 IPFS 或中心化服务生成 metadata,匹配不同 id 展示不同 NFT 图像或属性。


ERC-1155 相较 ERC-721 主要优势是节省 Gas、便于大批量 NFT 管理,适合游戏、系列收藏品、门票系统等场景。如果你需要进一步集成 OpenSea 的交易逻辑或使用 URI 扩展,可以继续深入补充。

五、代币发行设计

概念介绍

代币发行(Token Issuance)是通过部署符合 ERC-20 标准的智能合约,在以太坊等链上生成 可替代的代币(Fungible Token)。这种代币常用于代币经济、支付手段、DAO 投票权等场景。

示例代码

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC20/ERC20.sol";contract MyToken is ERC20 {constructor() ERC20("MyToken", "MTK") {_mint(msg.sender, 1000000 * 10 ** decimals());}
}

讲解说明

  • 继承自 OpenZeppelin 的 ERC20 实现,构造函数中完成代币初始化。

  • _mint 表示初始铸造 100 万个代币。

  • transferapprovetransferFrom 实现标准转账与授权操作。

六、NFT 铸造与交易(ERC-721)

概念介绍

NFT 铸造(Minting)指将数字资产映射为链上唯一标识(tokenId)并记录在智能合约中,通常基于 ERC-721 标准。交易指 NFT 的所有权转移,可通过链上转账或市场合约(如 OpenSea)完成。

示例代码

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";contract MyNFT is ERC721URIStorage {uint public tokenCounter;constructor() ERC721("MyNFT", "MNFT") {}function mintNFT(address to, string memory tokenURI) public returns (uint256) {uint256 newTokenId = tokenCounter;_safeMint(to, newTokenId);_setTokenURI(newTokenId, tokenURI);tokenCounter++;return newTokenId;}
}

讲解说明

  • 使用 ERC721URIStorage 便于设置每个 NFT 的元数据。

  • mintNFT 实现用户 NFT 铸造逻辑,支持传入链下元数据 URI。

  • 用户可使用 safeTransferFrom() 将 NFT 转让给他人。

七、合约交互接口设计(Web3.js / Ethers.js)

概念介绍

DApp 中的合约交互接口是前端调用区块链智能合约的桥梁,通常使用 Web3.jsEthers.js 进行合约函数调用、事件监听、签名交易等。合约 ABI(Application Binary Interface)是交互的核心数据结构。

示例代码(Ethers.js)

import { ethers } from "ethers";
import MyTokenABI from "./MyTokenABI.json";const provider = new ethers.providers.Web3Provider(window.ethereum);
const signer = provider.getSigner();
const myToken = new ethers.Contract("0xYourContractAddress", MyTokenABI, signer);// 查询余额
const balance = await myToken.balanceOf(await signer.getAddress());// 转账
await myToken.transfer("0xRecipientAddress", ethers.utils.parseUnits("10", 18));

讲解说明

  • 使用 ethers.Contract 实例化合约对象,提供合约地址、ABI、签名者。

  • balanceOftransfer 对应合约中暴露的公共方法。

  • 所有交易可通过 signer.sendTransaction 发送,需用户钱包签名。


如果你还需要讲解 IPFS 存储、链上链下结合、MetaMask 钱包连接等 DApp 集成知识点,我也可以继续补充。

八、Hardhat

概念介绍

Hardhat 是一个以太坊智能合约开发环境和任务运行器,它允许开发者在本地编写、编译、测试、部署 Solidity 合约。它内置了本地链 Hardhat Network,并支持插件系统、脚本自动化以及调试工具。

常用于 DApp 开发生命周期中的:

  • 合约编写与编译(支持多个 Solidity 版本)

  • 测试自动化(使用 Mocha/Chai)

  • 部署脚本(脚本式与插件式)

  • 调试支持(console.log 调试 Solidity)

  • 与 MetaMask、前端集成


示例代码

1. 初始化项目

npm init -y
npm install --save-dev hardhat
npx hardhat

选择“创建一个基本项目”后,会生成目录结构:

contracts/       # Solidity 合约文件
scripts/         # 部署脚本
test/            # 测试脚本
hardhat.config.js

2. 编写合约(contracts/MyToken.sol)

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;contract MyToken {string public name = "MyToken";uint256 public totalSupply = 1000;function mint(uint256 amount) public {totalSupply += amount;}
}

3. 编写测试(test/MyToken.js)

const { expect } = require("chai");describe("MyToken", function () {it("Should deploy and return name and totalSupply", async function () {const Token = await ethers.getContractFactory("MyToken");const token = await Token.deploy();await token.deployed();expect(await token.name()).to.equal("MyToken");expect(await token.totalSupply()).to.equal(1000);});it("Should mint tokens", async function () {const Token = await ethers.getContractFactory("MyToken");const token = await Token.deploy();await token.deployed();await token.mint(100);expect(await token.totalSupply()).to.equal(1100);});
});

运行测试:

npx hardhat test

4. 编写部署脚本(scripts/deploy.js)

const hre = require("hardhat");async function main() {const Token = await hre.ethers.getContractFactory("MyToken");const token = await Token.deploy();await token.deployed();console.log(`MyToken deployed to: ${token.address}`);
}main().catch((error) => {console.error(error);process.exitCode = 1;
});

5. 运行部署脚本

npx hardhat run scripts/deploy.js --network localhost

启动本地节点:

npx hardhat node

讲解说明

  • 本地链模拟: npx hardhat node 启动的链自动预设 20 个测试账户和私钥,适合配合 MetaMask。

  • 测试支持: Mocha + Chai 提供结构化测试断言,ethers.js 与合约交互。

  • 部署灵活: 可通过 .js/.ts 脚本完成自定义部署流程,或使用 hardhat-deploy 插件进行分阶段部署。

  • 调试能力强: 支持 Solidity 中使用 console.log(仅在本地链中生效),便于开发调试。


总结

Hardhat 提供了一整套适合 Web3 初学者到资深开发者的完整工具链,简化了智能合约的开发、测试与部署流程,是目前应用最广泛的以太坊开发环境之一。

是否需要我帮你整理成简历技术描述形式?或者生成 Hardhat+Next.js 的全栈示例?

九、Foundry

概念介绍

Foundry 是一个基于 Rust 的以太坊智能合约开发工具链,集成了编译、测试、部署、调试和脚本执行等功能。它以速度快、轻量、功能丰富著称,是 Solidity 开发者的现代化开发利器。

Foundry 的核心组件包括:

  • forge:合约的编译、测试和部署工具

  • cast:与区块链交互的命令行工具

  • anvil:本地以太坊测试节点,类似 Hardhat Network 或 Ganache

Foundry 支持快速编译,内置高效的测试框架,支持 Solidity 和 Forge 脚本,方便本地链开发调试和主网部署。


示例代码

1. 安装 Foundry

curl -L https://foundry.paradigm.xyz | bash
foundryup

安装完成后,执行以下初始化项目:

forge init MyProject
cd MyProject

2. 编写合约(src/MyToken.sol)

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;contract MyToken {string public name = "MyToken";uint256 public totalSupply = 1000;function mint(uint256 amount) public {totalSupply += amount;}
}

3. 编写测试(test/MyToken.t.sol)

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;import "forge-std/Test.sol";
import "../src/MyToken.sol";contract MyTokenTest is Test {MyToken token;function setUp() public {token = new MyToken();}function testInitialSupply() public {assertEq(token.totalSupply(), 1000);assertEq(token.name(), "MyToken");}function testMint() public {token.mint(500);assertEq(token.totalSupply(), 1500);}
}

4. 运行测试

forge test

运行结果将显示测试用例是否通过,速度非常快。


5. 启动本地节点(可选)

anvil

anvil 会启动一个本地以太坊测试节点,内置账户和私钥,方便链上交互测试。


6. 部署脚本示例(scripts/Deploy.s.sol)

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;import "forge-std/Script.sol";
import "../src/MyToken.sol";contract DeployScript is Script {function run() external {vm.startBroadcast();MyToken token = new MyToken();vm.stopBroadcast();}
}

运行部署脚本:

forge script scripts/Deploy.s.sol --broadcast --rpc-url <RPC_URL> --private-key <PRIVATE_KEY>

将合约部署到指定网络。


讲解说明

  • 项目初始化简单forge init 自动搭建项目骨架,集成依赖和配置。

  • 测试基于 Solidity:测试文件也是 Solidity,使用 forge-std 库的断言,写法自然且高效。

  • 本地链支持anvil 提供快速启动的本地链,方便调试合约和脚本。

  • 部署灵活:通过 Solidity 脚本(Script.sol)编写部署逻辑,配合命令行参数指定链上 RPC 和密钥,支持多网络部署。

  • 性能卓越:编译和测试速度快,内存占用小,适合大规模智能合约开发。


总结

Foundry 是现代以太坊开发者的利器,提供了高性能、强测试能力和灵活部署的全流程工具,特别适合对效率和可维护性有高要求的项目团队。

如果需要,我可以帮你把这部分内容整理成简历描述,或提供 Foundry 与 Hardhat 对比分析。


小结:Foundry vs Hardhat

对比点FoundryHardhat
测试语言SolidityJavaScript/TypeScript
执行效率极快(Rust 编写)中等(基于 Node.js)
易用性命令行为主,配置简洁插件生态丰富,图形化更强
CI 集成极佳(速度快、独立于 Node)好,但较重
本地链anvilHardhat Network


如果你希望我为你生成一个 Foundry 的 DApp 项目模板,或搭配 MetaMask 与前端交互示例,也可以继续告诉我!

十、合约漏洞(如重入、越权、溢出)与防护方式

概念介绍

智能合约作为自动执行的代码,一旦部署到区块链上,便不可更改,且涉及资产安全,因此合约漏洞可能导致资产被盗或合约异常。以下是几种常见漏洞及其危害:

  • 重入攻击(Reentrancy)
    攻击者利用合约调用外部合约时未正确更新状态,反复调用目标函数,导致资金被多次提取。

  • 越权访问(Authorization)
    非法用户绕过权限控制,执行合约中只有授权用户才能执行的操作,导致数据篡改或资产转移。

  • 整数溢出/下溢(Overflow/Underflow)
    Solidity 中数值计算超出数据类型最大或最小值,导致数值回绕,可能引发逻辑错误和资产损失。


代码示例

1. 重入攻击示例(不安全)

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract Vulnerable {mapping(address => uint) public balances;function deposit() external payable {balances[msg.sender] += msg.value;}function withdraw(uint _amount) external {require(balances[msg.sender] >= _amount, "Insufficient balance");(bool success, ) = msg.sender.call{value: _amount}("");require(success, "Transfer failed");balances[msg.sender] -= _amount;  // 状态更新在后,导致重入漏洞}
}

防护方式:使用“检查-效果-交互”模式,状态先更新,再调用外部合约

function withdraw(uint _amount) external {require(balances[msg.sender] >= _amount, "Insufficient balance");balances[msg.sender] -= _amount;  // 先更新状态(bool success, ) = msg.sender.call{value: _amount}("");require(success, "Transfer failed");
}

或者使用 ReentrancyGuard 修饰器(OpenZeppelin)

import "@openzeppelin/contracts/security/ReentrancyGuard.sol";contract SafeContract is ReentrancyGuard {mapping(address => uint) public balances;function withdraw(uint _amount) external nonReentrant {require(balances[msg.sender] >= _amount, "Insufficient balance");balances[msg.sender] -= _amount;(bool success, ) = msg.sender.call{value: _amount}("");require(success, "Transfer failed");}
}

2. 越权访问漏洞示例

contract VulnerableAuth {address public owner;function setOwner(address _owner) external {owner = _owner; // 缺少权限校验,任意人可修改}
}

防护方式:加入访问控制修饰器

contract SafeAuth {address public owner;constructor() {owner = msg.sender;}modifier onlyOwner() {require(msg.sender == owner, "Not owner");_;}function setOwner(address _owner) external onlyOwner {owner = _owner;}
}

3. 整数溢出示例(Solidity 0.7 及以下版本)

contract Overflow {uint8 public count = 255;function increment() public {count += 1; // 溢出后回绕为0}
}
 

防护方式

  • Solidity 0.8 版本内置溢出检查,溢出会自动抛异常。

  • 旧版本使用 SafeMath 库。

import "@openzeppelin/contracts/utils/math/SafeMath.sol";contract SafeOverflow {using SafeMath for uint8;uint8 public count = 255;function increment() public {count = count.add(1);  // 溢出会报错}
}

讲解说明

  1. 重入攻击 是历史上最著名的智能合约漏洞之一(DAO 事件),其核心在于合约调用外部地址时未及时更新状态,攻击者可借机多次调用提现函数。防御要点是先更新状态,后调用外部合约,或者使用重入锁(ReentrancyGuard)进行保护。

  2. 越权访问 是因权限控制缺失或错误实现导致的。常用防护是设置合约所有者(owner)并使用访问修饰器限制敏感操作。

  3. 整数溢出/下溢 在早期 Solidity 版本非常普遍,可能导致逻辑出错或资产异常。Solidity 0.8+ 版本默认检查溢出异常,建议使用该版本。旧版本使用第三方库 SafeMath 辅助。

掌握这些漏洞及防护措施,是智能合约安全开发的基础,有助于保障链上资产安全和业务逻辑正确。

相关文章:

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...