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

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 辅助。

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

http://www.xdnf.cn/news/944677.html

相关文章:

  • GraphQL 实战篇:Apollo Client 配置与缓存
  • 技能伤害继承英雄属性【War3地图编辑器】进阶
  • 数据结构 - 栈与队列
  • 【Proteus仿真】【32单片机-A010】步进电机控制系统设计
  • “冒个泡泡”,排个序呗~:C语言版冒泡排序全解
  • 第22节 Node.js JXcore 打包
  • rknn优化教程(二)
  • Springboot项目集成Ai模型(阿里云百炼-DeepSeek)
  • 智能SQL优化工具PawSQL月度更新 | 推出免费私域部署社区版
  • 负载均衡LB》》LVS
  • 【仿生机器人】建模—— 图生3D 的几个办法
  • STM32 _main 里做了什么
  • Leetcode4(寻找两个正序数组的中位数)
  • 前端小程序面试题
  • Notepad++ 官方下载
  • uniapp 小程序 学习(一)
  • 生信服务器 | 做生信为什么推荐使用Linux服务器?
  • C/CPP 结构体、联合体、位段内存计算 指南
  • 总结input标签的各种类型
  • 可视化预警系统:如何实现生产风险的实时监控?
  • 篮球杯软件赛国赛C/C++ 大学 B 组补题
  • GC1808:高性能音频ADC的卓越之选
  • Web APIS Day01
  • 超低成本U型光电开关红外对射管检测电路
  • 基于单片机的宠物屋智能系统设计与实现(论文+源码)
  • 力扣HOT100之栈:394. 字符串解码
  • 256bps!卫星物联网极低码率语音压缩算法V3.0发布!
  • docker容器保存为不依赖基础镜像的独立镜像方法
  • 【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
  • 深入剖析AI大模型:大模型时代的 Prompt 工程全解析