基于MCP协议的EVM区块链交互服务器:为AI智能体赋能Web3操作

news2026/4/30 8:35:29
1. 项目概述为AI智能体打开区块链世界的大门如果你正在构建一个AI智能体并且希望它能像人类开发者一样自由地查询以太坊上的余额、读取智能合约的状态甚至帮你执行一笔代币转账那么你很可能需要一个桥梁来连接AI的“思考”与区块链的“执行”。这正是mcpdotdirect/evm-mcp-server项目的核心价值所在。它是一个基于 Model Context Protocol (MCP) 的服务器专门为大型语言模型LLMs和AI智能体提供了与60多个EVM兼容区块链网络交互的统一接口。简单来说这个项目把复杂的区块链RPC调用、合约ABI解析、交易签名等底层操作封装成了22个标准化的“工具”和10个引导式的“提示词”。你的AI助手比如Claude、Cursor的AI功能无需理解Solidity或Web3.js的细节只需要通过自然语言发出指令这个MCP服务器就能在后台完成所有繁重的工作。无论是检查Vitalik的ETH余额直接用vitalik.eth这个ENS域名还是查询某个DeFi合约的APY甚至是帮你签署一笔授权交易它都能胜任。这极大地降低了AI应用接入区块链能力的门槛让开发者可以更专注于业务逻辑和用户体验而不是纠结于如何让AI调用一个JSON-RPC接口。2. 核心架构与设计思路拆解2.1 为什么是MCP协议层的标准化价值在接触这个项目之前你可能尝试过直接让AI调用Web3库或者自己写一套复杂的API网关。前者对AI的上下文理解和代码生成能力要求极高且容易出错后者则意味着沉重的开发和维护负担。MCP的出现正是为了解决“如何让AI安全、可靠地使用工具”这个根本问题。MCP定义了一套标准协议用于描述工具Tools、资源Resources和提示词Prompts。evm-mcp-server完全遵循这一协议这意味着任何兼容MCP的客户端如Claude Desktop、Cursor、MCP Inspector都能即插即用地发现并使用它提供的所有区块链能力。这种设计带来了几个关键优势声明式接口服务器通过一个清单manifest向客户端宣告“我能做这些事”。客户端无需预编译或硬编码就能动态加载和理解这些功能。类型安全与自描述每个工具都明确定义了输入参数的类型如string,number,address和描述。AI能根据这些描述更准确地理解何时以及如何使用该工具。统一的通信机制无论是通过标准输入输出stdio还是HTTPSSE通信格式都是统一的JSON-RPC简化了客户端集成。这个项目的架构可以看作是一个“区块链能力适配层”。底层使用业界成熟的viem库处理与各种EVM链的通信上层则按照MCP的规范将viem的功能包装成一个个独立的工具。这种设计确保了核心区块链交互的稳定性和性能同时通过MCP协议实现了对AI生态的友好接入。2.2 多链支持的实现策略从硬编码到动态发现支持60多条链听起来是个庞大的工程。该项目采用了一种务实而高效的策略预定义链配置 动态RPC客户端管理。在src/core/chains.ts文件中你会找到一个庞大的链信息对象。每条链不仅包含了标准的id、name、nativeCurrency还预置了多个公共RPC端点。这是保证服务可用性的关键。当一个工具调用指定了network: optimism时服务器会根据这个配置初始化一个连接到Optimism网络的viem客户端。实操心得RPC节点的选择与降级在实际部署中完全依赖公共RPC节点可能存在速率限制或单点故障风险。虽然项目预置了多个备选节点但对于生产环境我强烈建议配置自己的节点服务商如Infura、Alchemy、QuickNode的URL。你可以修改chains.ts或者更优雅地通过环境变量动态覆盖特定链的RPC URL。一个常见的模式是设置ETHEREUM_RPC_URL、OPTIMISM_RPC_URL等环境变量在客户端初始化时优先使用这些配置。2.3 钱包管理的安全哲学私钥与助记词的权衡项目提供了两种钱包配置方式直接提供私钥或提供BIP-39助记词。从安全性和可用性角度它们各有优劣私钥 (EVM_PRIVATE_KEY)简单直接对应一个确定的以太坊地址。适合脚本、机器人或单一用途的服务。但其安全性完全依赖于私钥本身的保管一旦泄露对应的地址就完全失控。助记词 (EVM_MNEMONIC)配合EVM_ACCOUNT_INDEX可以从一个助记词派生出无数个地址遵循BIP-44路径m/44/60/0/0/{index}。这更适合管理多个测试账户或具有层级结构的钱包。安全警告助记词是所有派生私钥的根泄露助记词意味着泄露所有派生账户风险更高。在代码层面服务器在启动时会检查这两个环境变量。如果同时存在私钥的优先级高于助记词。钱包实例仅在需要执行写操作发送交易、签名时才会被创建和使用。对于只读操作查询余额、读取合约根本不需要钱包这符合最小权限原则。3. 核心工具解析与使用要点3.1 智能合约交互的“魔法”自动ABI获取对于AI智能体而言理解并构造一个正确的合约调用是最大的挑战之一因为这需要预先知道合约的ABI应用二进制接口。evm-mcp-server最巧妙的设计之一就是通过get_contract_abi工具和集成在read_contract/write_contract中的自动获取逻辑几乎消除了这个障碍。其工作原理如下当调用read_contract且未提供abiJson参数时工具会首先尝试从内置的简易公共ABI库中查找常见函数如balanceOf,symbol,name。如果未找到且配置了ETHERSCAN_API_KEY工具会自动调用get_contract_abi通过Etherscan的V2 API该API支持项目列表中的60多条链获取完整ABI。获取到ABI后viem库会对其进行解析找到匹配functionName的函数片段并自动将输入的args编码成区块链能理解的调用数据。这意味着AI只需要知道“我想调用合约X的Y函数参数是Z”服务器就能处理剩下的一切。例如AI可以这样请求“读取Uniswap V2工厂合约0x5C69...下的allPairsLength函数。” 服务器会自动获取ABI执行调用并返回结果。注意事项API限制与缓存Etherscan的免费API有每日调用次数限制通常5万次/天。在频繁调用未知合约的场景下很容易触发限流。建议缓存ABI对于常用的合约可以将获取到的ABI缓存到本地数据库或文件中避免重复查询。备用数据源可以考虑集成其他链上数据源如Blockscout、Covalent作为备用或者使用The Graph进行索引查询。提示AI在给AI的提示词中可以加入“对于常见协议如Uniswap, Aave, USDC优先使用已知的、已验证的合约地址”。3.2 ENS集成让地址对人类和AI都更友好所有接受地址参数的工具都支持ENS域名。这是提升AI交互体验的一个巨大进步。对比以下两种指令“查询地址0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045的ETH余额。”“查询vitalik.eth的ETH余额。”显然后者对人类和AI都更自然。服务器在接收到参数后会先判断其是否为有效的ENS域名通常以.eth结尾或符合其他TLD如.xyz。如果是则调用resolve_ens_name工具内部使用viem的getEnsAddress方法将其解析为标准的42字符地址再进行后续操作。避坑指南跨链ENS解析需要注意的是ENS解析主要依赖于以太坊主网。虽然一些L2如Optimism、Arbitrum通过桥接或自定义解析器也提供了一定程度的ENS支持但并非所有链上的所有工具都能保证ENS解析成功。在涉及非主网操作时最稳妥的方式是让AI先在主网上解析出地址再将地址用于目标链的操作。或者在工具调用失败时提供清晰的错误信息提示用户“ENS解析失败请尝试使用完整的以太坊地址”。3.3 批量查询利器Multicall优化区块链上的每一次RPC调用都有延迟对于需要查询多个数据的AI应用来说串行调用是不可接受的。multicall工具解决了这个问题。它利用了一个叫做“Multicall3”的智能合约允许将多个只读view/pure调用打包进一个交易中发送给节点节点在同一区块状态下执行所有调用并返回结果。例如一个DeFi看板AI可能需要同时获取用户在不同池子里的流动性、质押奖励和代币价格。没有multicall这可能需要几十次独立的RPC调用。使用multicall只需一次。在tools.ts的实现中它接收一个calls数组每个元素包含contractAddress,functionName,args。服务器会为每个调用编码数据然后通过viem的multicall方法一次性发送。实操心得设置合理的Gas与超时尽管multicall是只读的不消耗Gas但复杂的批量调用仍可能因为RPC节点处理超时而失败。在调用multicall工具时可以考虑通过环境变量或配置项为viem客户端设置更长的timeout和batch.size。对于非常重要的查询还可以实现一个重试机制当批量调用失败时自动退化为串行调用虽然慢但更可靠。4. 从零到一的部署与集成实战4.1 环境搭建与配置详解假设我们想在本地开发环境运行这个服务器并与Cursor编辑器集成。以下是详细步骤步骤一安装与依赖项目推荐使用Bun因为它启动更快对TypeScript支持更好。如果你没有Bun用Node.js也可以。# 使用 Bun (推荐) curl -fsSL https://bun.sh/install | bash # 重启终端后 bun --version # 克隆项目 git clone https://github.com/mcpdotdirect/mcp-evm-server.git cd mcp-evm-server # 安装依赖 bun install步骤二关键环境变量配置创建项目根目录下的.env文件确保该文件已被.gitignore忽略防止密钥泄露。# .env 文件示例 # 方式一使用助记词更灵活可管理多个账户 EVM_MNEMONICyour twelve or twenty four word mnemonic phrase here EVM_ACCOUNT_INDEX0 # 使用助记词派生的第一个账户 # 方式二使用私钥更简单直接 # EVM_PRIVATE_KEY0x你的64位十六进制私钥可带0x前缀 # Etherscan API Key (用于自动获取ABI强烈建议申请) ETHERSCAN_API_KEYYourApiKeyToken安全警告EVM_MNEMONIC或EVM_PRIVATE_KEY是访问你加密资产的全部凭证。切勿将它们提交到任何公开的代码仓库。对于生产环境应使用安全的密钥管理服务如AWS Secrets Manager, HashiCorp Vault或硬件钱包集成来注入这些密钥。步骤三运行服务器你可以选择两种模式运行Stdio模式适用于CLI工具或桌面应用如Claude Desktop集成。bun startHTTP模式适用于Web应用或需要远程连接的情况。bun start:http默认HTTP服务器运行在http://localhost:3001并提供了SSE端点http://localhost:3001/sse供MCP客户端连接。4.2 与Cursor编辑器的深度集成Cursor通过其内置的MCP客户端支持可以无缝连接本地运行的evm-mcp-server让AI助手具备区块链能力。配置方法项目级推荐 在项目根目录创建.cursor/mcp.json文件。这种配置是项目级别的方便团队共享。{ mcpServers: { evm-mcp-server: { command: bun, args: [run, start], env: { EVM_MNEMONIC: your_mnemonic_here, ETHERSCAN_API_KEY: your_api_key_here } } } }配置解析command: 启动服务器的命令这里是bun。args: 传递给命令的参数[run, start]对应执行package.json中的start脚本。env: 在这里直接定义环境变量比在系统环境里设置更安全、更项目化。Cursor会在启动服务器进程时注入这些变量。配置方法全局级 你也可以在Cursor的设置界面Settings - Features - MCP Servers中全局添加。但出于安全考虑不建议在此处填写真实的助记词或私钥。集成后的使用场景 配置成功后重启Cursor或打开项目。现在你可以在编辑器里直接向AI提问“帮我查一下vitalik.eth在以太坊主网还有多少ETH”“在Sepolia测试网上给我的地址转0.1 Sepolia ETH。”“读取一下Uniswap V2在以太坊上的工厂合约地址0x5C69...里一共有多少个交易对了”AI会理解你的意图自动调用相应的MCP工具并将结果以自然语言的形式返回给你。整个过程你不需要写一行Web3代码。4.3 实战构建一个自动化的空投检查脚本让我们通过一个更复杂的例子看看如何利用这些工具组合成一个实用的工作流。假设你参与了一个项目的测试网活动获得了多个空投资格现在想用一个脚本快速检查所有地址的余额。虽然AI可以交互式地帮你但有时一个脚本更高效。我们可以利用MCP服务器的HTTP模式用Node.js写一个检查脚本。// check_airdrops.js import { McpClient } from modelcontextprotocol/sdk-client; import { StdioClientTransport } from modelcontextprotocol/sdk-client/stdio.js; import { spawn } from child_process; async function main() { // 1. 启动MCP服务器进程HTTP模式或Stdio模式均可 // 这里以Stdio模式为例直接作为子进程启动 const serverProcess spawn(bun, [run, start], { stdio: [pipe, pipe, inherit], // 继承stderr以便查看错误 env: { ...process.env, EVM_MNEMONIC: process.env.YOUR_MNEMONIC } // 从外部环境变量传密钥 }); // 2. 创建MCP客户端并连接到服务器进程 const transport new StdioClientTransport({ command: node, // 占位符实际通信已通过spawn建立 args: [], process: serverProcess // 直接连接到我们启动的进程 }); const client new McpClient({ transport }); await client.connect(); // 3. 定义要检查的地址和网络列表 const checkList [ { ens: myaddress.eth, network: ethereum }, { address: 0x1234..., network: optimism }, { address: 0xabcd..., network: arbitrum-sepolia }, ]; console.log(开始检查空投余额...\n); // 4. 批量查询余额 for (const item of checkList) { try { const address item.ens || item.address; console.log(检查 ${address} 在 ${item.network} 上的余额...); const result await client.invokeTool(get_balance, { address: address, network: item.network, }); // 5. 格式化输出结果 // 注意result.balance 可能是BigInt形式的字符串需要根据链的decimals格式化 // 这里简化处理直接输出原始值和单位 const chainNativeSymbol result.symbol || ETH; // 实际应从chain info获取 console.log( 余额: ${result.formatted || result.raw} ${chainNativeSymbol}); console.log( (原始值: ${result.raw})\n); } catch (error) { console.error( 查询失败: ${error.message}\n); } } // 6. 断开连接并关闭服务器 await client.close(); serverProcess.kill(); console.log(检查完毕。); } main().catch(console.error);这个脚本展示了如何以编程方式连接并使用MCP服务器。在实际生产环境中你可能会使用HTTP模式的SSE连接以便服务器长时间运行供多个客户端或脚本使用。5. 高级特性与安全实践5.1 消息签名与链下认证sign_message和sign_typed_data是两个强大的工具它们使AI能够代表用户进行链下签名。这在以下场景非常有用Sign-In with Ethereum (SIWE)让用户通过签名一条标准消息来登录Web3应用。AI可以协助生成待签名的消息。授权签名 (EIP-712)许多DeFi协议如Uniswap的Permit2使用EIP-712结构化数据来实现免Gas费的授权。AI可以构造出符合规范的typedData然后调用sign_typed_data工具让用户钱包签名。数据完整性证明对任何链下数据如数据库记录、文件哈希进行签名以证明其由特定地址的所有者认可。安全警示这是整个系统中最需要谨慎对待的功能。永远不要让AI在未经用户明确理解和同意的情况下签署任何交易或消息。在实现上任何调用签名工具的请求都应该在前端或中间件层触发一个钱包如MetaMask的弹窗确认让用户亲眼看到他们将要签署的内容。MCP服务器本身只是一个签名执行器必须与一个负责用户意图验证和确认的上层应用配合使用。5.2 错误处理与监控区块链操作充满不确定性RPC节点无响应、交易被拒绝、Gas不足、合约异常……一个健壮的AI应用必须能妥善处理这些错误。服务器工具的设计通常会将错误包装成结构化的JSON响应。例如一个失败的交易可能返回{ error: Transaction execution reverted, details: Error: Insufficient balance for transfer., txHash: 0x..., network: sepolia }在你的AI应用或集成层你需要解析这些错误并将其转化为对人类或AI友好的提示。例如RPC错误提示“网络连接超时请稍后重试或检查你的网络连接。”Gas不足提示“交易预估Gas费失败可能是因为当前网络拥堵。请尝试提高Gas价格或稍后再试。”合约回滚提示“交易被合约拒绝。原因可能是余额不足、授权额度不够、或不符合合约规则。”建议为MCP服务器添加日志记录如使用Winston或Pino库记录所有工具调用、参数和结果注意过滤敏感参数如私钥。这有助于事后审计和问题排查。5.3 性能优化与扩展建议随着支持的链和工具增多服务器可能面临性能压力。以下是一些优化思路RPC连接池为每条链维护一个稳定的RPC客户端连接池而不是每次调用都新建连接。viem客户端本身是轻量的但保持长连接可以减少握手开销。ABI缓存层如前所述实现一个Redis或内存缓存将获取到的合约ABI缓存起来并设置合理的TTL例如24小时。这能极大减少对Etherscan API的调用。工具懒加载并非所有工具都需要在服务器启动时就完全初始化。可以考虑按需初始化某些重型依赖。支持自定义链项目通过chains.ts硬编码了链信息。你可以修改它来添加自定义的RPC节点或私有链。更好的方式是设计一个配置接口允许通过环境变量或配置文件动态添加链。实现权限控制当前工具对所有连接客户端开放。在生产环境中你可能需要基于API密钥、JWT令牌或IP白名单对不同客户端的访问权限进行控制例如只允许某些客户端调用写操作。6. 常见问题与故障排查实录在实际部署和使用evm-mcp-server的过程中你可能会遇到以下典型问题。这里记录了我的排查经验和解决方案。6.1 连接与启动问题问题现象可能原因排查步骤与解决方案运行bun start后立即退出无错误信息。1. 端口被占用默认3000/3001。2. 关键环境变量缺失如RPC_URL但项目有默认值此可能性低。3. Bun/Node版本不兼容。1. 检查端口lsof -i :3000(或3001)。2. 使用bun run start:http并加上--port 3002指定新端口。3. 确认Bun版本 1.0.0 或 Node 20。使用bun --version或node --v。Cursor无法连接MCP服务器提示“Connection failed”。1..cursor/mcp.json配置错误。2. 服务器进程未启动。3. 环境变量在Cursor中未生效。1. 检查mcp.json的语法确保路径和参数正确。可以先用命令行手动运行bun run start看服务器能否独立启动。2. 在Cursor的MCP Servers设置界面查看服务器日志如果有。3. 尝试在mcp.json的env字段中直接填写测试用的环境变量排除系统环境变量问题。HTTP模式服务器启动成功但SSE连接失败。1. 客户端连接的URL错误。2. 跨域问题如果客户端是浏览器。3. 服务器防火墙阻止了端口。1. 确认连接URL是http://localhost:3001/sse不是/。2. 检查服务器日志看是否有CORS错误。需要在http-server.ts中正确配置CORS头。3. 用curl http://localhost:3001/sse测试是否能建立连接。6.2 工具调用与区块链交互问题问题现象可能原因排查步骤与解决方案read_contract或write_contract失败提示“Function not found in ABI”。1. 合约地址错误。2. 函数名拼写错误或大小写问题。3. 自动获取的ABI不包含该函数可能是代理合约或未验证合约。1. 在区块浏览器上确认合约地址正确无误。2. 检查函数名是否与合约源码中完全一致Solidity函数名是大小写敏感的。3. 手动调用get_contract_abi工具查看获取到的ABI确认目标函数是否存在。对于代理合约需要读取实现implementation地址的ABI。transfer_native或transfer_erc20交易一直处于pending状态。1. Gas价格设置过低。2. 发送账户余额不足包括不足以支付Gas费。3. 非ce链的Gas费机制特殊如Polygon。1. 先调用get_gas_price工具获取当前网络建议的Gas价格在发起交易时适当调高。2. 调用get_balance确认发送地址有足够的原生代币支付交易费和转账金额。3. 对于某些链可能需要手动指定maxFeePerGas和maxPriorityFeePerGas项目默认可能只用了基础配置。需要修改transfer.ts中的交易构建逻辑。ENS解析失败提示“ENS name not found”。1. ENS域名输入错误或尚未注册。2. 当前连接的RPC节点不支持ENS解析一些L2或测试网的节点可能不支持。3. 网络参数错误在主网解析却指定了测试网。1. 在 app.ens.domains 上确认域名是否存在且已设置解析器。2. 尝试切换到该网络的官方公共RPC或Infura/Alchemy的节点它们通常有更好的ENS支持。3. ENS解析主要在以太坊主网进行。确保调用resolve_ens_name时network参数设置为ethereum无论你后续要在哪条链上操作。解析出地址后再将地址用于其他链的工具。调用需要签名的工具如sign_message时服务器报错“Wallet not configured”。1. 环境变量EVM_PRIVATE_KEY或EVM_MNEMONIC未设置或设置错误。2. 私钥/助记词格式不正确。3. 从助记词派生指定索引的账户失败。1. 检查.env文件是否已加载或环境变量是否在启动进程的环境中正确设置。可以用console.log(process.env.EVM_MNEMONIC?.substring(0, 5))在代码中调试生产环境切勿记录完整密钥。2. 私钥必须是64位十六进制字符带或不带0x前缀。助记词必须是12或24个有效的BIP-39单词。3. 检查EVM_ACCOUNT_INDEX是否为数字。尝试将其设为0。6.3 性能与稳定性问题问题现象可能原因排查步骤与解决方案频繁出现“Rate limit exceeded”错误尤其是在使用自动ABI获取时。Etherscan免费API调用频率超限。1.申请多个API Key并轮询这是最直接的解决方案。在代码中维护一个API Key池每次调用时随机选取一个。2.实现ABI缓存这是必须的。将成功获取的ABI以合约地址_网络ID为键存储到本地文件或数据库并设置较长的过期时间如30天。在获取ABI前先查缓存。3.限制调用频率在服务器端为get_contract_abi工具添加一个简单的速率限制中间件。在多链并发查询时响应变慢甚至超时。1. 公共RPC节点性能瓶颈或限流。2. 服务器资源CPU/内存不足。3. 未使用批量查询multicall。1.升级RPC服务对于高频使用的生产环境投资付费的RPC服务如Alchemy, Infura的付费套餐是值得的它们提供更高的调用速率和稳定性。2.监控与扩容监控服务器的资源使用情况。如果并发请求多考虑使用PM2等进程管理器启动多个实例并用Nginx做负载均衡。3.优化查询模式教育AI或调整提示词让其在可能的情况下优先使用multicall工具进行批量查询。经过几个月的实际使用和调优我发现evm-mcp-server项目为AI与区块链的交互提供了一个极其坚实和灵活的基础。它的价值不在于某个炫酷的功能而在于将一套复杂、分散的能力通过一个标准化、声明式的协议完美地封装起来。这让我能够将精力从“如何让AI调用合约”转移到“如何设计更智能的区块链应用逻辑”上。如果你也正在探索AI与Web3的结合这个项目是一个绝佳的起点。从理解它的设计开始逐步根据自己的业务需求进行定制和扩展你会发现自己正在构建的是未来人机协同的区块链交互新范式。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…