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

Ethers 加签 + Solidity 合约验签实现 单元测试 demo

文章目录前言Ethers 加签 Solidity 合约验签实现 单元测试 demo1. 使用场景2. solidity 合约编写验签合约签名通过ethers进行加签3. 单元测试范围4. 源码及测试前言如果您觉得有用的话记得给博主点个赞评论收藏一键三连啊写作不易啊^ _ ^。而且听说点赞的人每天的运气都不会太差实在白嫖的话那欢迎常来啊!!!Ethers 加签 Solidity 合约验签实现 单元测试 demo1. 使用场景在 Web3 开发中签名验证是实现「无链上交易的身份认证、权限校验、消息防篡改」的核心技术无需消耗 Gas 上链即可确认消息由指定钱包地址发出典型适用场景包括去中心化应用DApp的离线身份验证用户无需转账即可证明钱包所有权链下订单 / 指令确认比如 NFT 铸造授权、交易委托防止消息被篡改空投白名单校验通过签名验证用户是否具备白名单资格避免链上遍历的 Gas 消耗跨链 / 跨应用的消息互通通过签名保证消息的真实性和唯一性。2. solidity 合约编写验签合约签名通过ethers进行加签加签逻辑:确定待签名的业务消息如用户地址、白名单标识等将消息转成字节数组做 Keccak256 哈希固定 32 字节防篡改用钱包私钥对哈希后的消息签名生成 65 字节标准签名把「原始消息 签名」传给合约用于验签。验签逻辑:合约接收「原始消息 签名」对消息复刻加签的哈希流程生成相同哈希值用 OpenZeppelin 库解析签名恢复出签名者地址对比恢复地址与业务预期地址如白名单地址一致则验签通过执行后续业务不一致则拒绝。3. 单元测试范围核心用例1验证有效签名能正确恢复出签名者地址 边界用例2验证无效签名无法恢复出正确地址 边界用例3验证修改原始消息后有效签名也会验签失败覆盖消息篡改场景4. 源码及测试合约:// SPDX-License-Identifier: MIT // 开源协议MIT可商用、可修改保留版权声明即可适合合约上线场景 pragma solidity ^0.8.28;// 指定Solidity编译器版本兼容0.8.28及以上同系列版本 //0.8.x版本自带溢出/下溢安全检查无需手动编写校验逻辑 // 导入OpenZeppelin的ECDSA算法库用于签名解析和地址恢复importopenzeppelin/contracts/utils/cryptography/ECDSA.sol;// 导入OpenZeppelin的消息哈希工具库用于生成以太坊标准签名哈希importopenzeppelin/contracts/utils/cryptography/MessageHashUtils.sol;// 签名验证合约核心功能根据原始消息和签名恢复并返回签名者的以太坊地址 contract VerifySignature{// 为bytes32类型挂载ECDSA库的所有方法可直接通过bytes32变量调用如recover using ECDSAforbytes32;// 为bytes32类型挂载MessageHashUtils库的所有方法可直接通过bytes32变量调用如toEthSignedMessageHash using MessageHashUtilsforbytes32;/** * dev 核心验签方法根据原始字符串消息和签名恢复签名者地址 * param str 原始待签名的字符串消息与签名时的原始消息完全一致 * param signature 签名结果由前端/钱包通过私钥对消息签名生成65字节r(32)s(32)v(1) * return 恢复出的签名者以太坊地址若签名无效会返回错误 */functionrecover(string memory str, bytes memory signature)external pure returns(address){//1. 原始消息哈希将字符串转成bytes字节数组再做Keccak256哈希 // 目的将任意长度的字符串转为固定32字节的哈希值适配区块链签名算法要求 bytes32hashkeccak256(bytes(str));//2. 还原签名者地址两步核心操作链式调用 // hash.toEthSignedMessageHash()给原始哈希拼接以太坊标准签名前缀(\x19Ethereum Signed Message:\n32)并二次Keccak256哈希 // → 对齐钱包/前端signMessage的签名规则防止重放攻击 // .recover(signature)从签名中解析r/s/v通过ECDSA算法根据哈希值恢复签名者公钥再推导为以太坊地址returnhash.toEthSignedMessageHash().recover(signature);}}单元测试:import{expect}fromchai;importnomicfoundation/hardhat-chai-matchers;import{ethers}fromhardhat;import{SignerWithAddress}fromnomicfoundation/hardhat-ethers/signers;// 测试加签数据 const TEST_MESSAGEyangzhenyu;// 全局加签方法入参消息签名者返回生成的签名 asyncfunctiongenerateSignature(message: string, signer: SignerWithAddress){//1. 消息转UTF-8字节数组 const messageBytesethers.toUtf8Bytes(message);//2. Keccak256哈希 const messageHashethers.keccak256(messageBytes);//3. 哈希转字节数组适配signMessage接口 const messageHashBytesethers.toBeArray(messageHash);//4. 签名并返回结果returnawait signer.signMessage(messageHashBytes);}describe(VerifySignature,function(){// 声明全局测试变量所有用例复用统一any类型letverifySignature: any;// 签名者账户letsigner: SignerWithAddress;// 另外的账户letotherSigner: SignerWithAddress;// 前置钩子每个用例执行前初始化和你示例的beforeEach保持一致 beforeEach(asyncfunction(){// 获取Hardhat本地测试账户第一个作为签名者[signer, otherSigner]await ethers.getSigners()as SignerWithAddress[];// 获取合约工厂部署合约完全对齐你示例的部署写法 const VerifySignature2Factoryawait ethers.getContractFactory(VerifySignature);verifySignatureawait VerifySignature2Factory.deploy();// 等待合约部署上链生效 await verifySignature.waitForDeployment();});// 核心用例1验证有效签名能正确恢复出签名者地址 it(should recover correct signer address with valid signature, asyncfunction(){// 直接调用抽离的方法生成签名一行搞定 const signatureawait generateSignature(TEST_MESSAGE, signer);// 合约验签 const recoveredAddressawait verifySignature.recover(TEST_MESSAGE, signature);// 断言 expect(recoveredAddress).to.equal(signer.address);});// 边界用例2验证无效签名无法恢复出正确地址 it(should not recover correct signer address with invalid signature, asyncfunction(){// 构造「格式合法但内容无效」的签名用另一个账户签名相同消息 const invalidSignatureawait generateSignature(TEST_MESSAGE, otherSigner);// 合约验签 const recoveredAddressawait verifySignature.recover(TEST_MESSAGE, invalidSignature);// 断言 expect(recoveredAddress).to.not.equal(signer.address);});// 边界用例3验证修改原始消息后有效签名也会验签失败覆盖消息篡改场景 it(should fail when message is tampered with valid signature, asyncfunction(){// 调用抽离方法生成有效签名 const validSignatureawait generateSignature(TEST_MESSAGE, signer);// 篡改原始消息 const tamperedMessageyangzhenyu ;// 合约验签篡改后的消息 const recoveredAddressawait verifySignature.recover(tamperedMessage, validSignature);// 断言 expect(recoveredAddress).to.not.equal(signer.address);});});下面是拿出来的加签方法:// 全局加签方法入参消息签名者返回生成的签名 asyncfunctiongenerateSignature(message: string, signer: SignerWithAddress){//1. 消息转UTF-8字节数组 const messageBytesethers.toUtf8Bytes(message);//2. Keccak256哈希 const messageHashethers.keccak256(messageBytes);//3. 哈希转字节数组适配signMessage接口 const messageHashBytesethers.toBeArray(messageHash);//4. 签名并返回结果returnawait signer.signMessage(messageHashBytes);}测试:测试成功!!!

相关文章:

Ethers 加签 + Solidity 合约验签实现 单元测试 demo

文章目录前言Ethers 加签 Solidity 合约验签实现 单元测试 demo1. 使用场景2. solidity 合约编写验签合约,签名通过ethers进行加签3. 单元测试范围4. 源码及测试前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊&a…...

SpringBoot 配置文件核心用法(Properties YAML)

SpringBoot 配置文件作用 SpringBoot 定义了规范的配置文件格式,用于集成其他框架,并集中管理项目各类配置信息,典型场景包括: 项目启动端口:自定义服务监听端口数据库连接信息:包含用户名、密码等第三方…...

什么是原型链(Prototype Chain)?proto和prototype的关系与区别是什么?

一、定义原型链是 JavaScript 实现继承和属性查找的核心机制,通俗点就是 “对象自己没有某个东西,就一层层向上找别人借” 的链条__proto__:相当于一个向上查找的链条(工具)prototype(原型对象)…...

博世 HBA 液压制动辅助系统性能规范详解

本文整理自博世官方 HBA 性能规范文档(VERSION 2.0),详细拆解乘用车 ESP 系统中 HBA 液压制动辅助的核心功能、试验条件、性能要求及标定规范,适合汽车电子、底盘控制工程师参考学习。一、HBA 功能核心定义HBA(Hydraul…...

前端-小米商城静态版复刻总结

整个项目采用css与html进行实现,有一些基础的交互功能。在做项目过程中我觉得难点有以下几个地方:1.在html 中 position一般是默认,网页就会按顺序把盒子从上到下排列,盒子属于块级元素。块级元素独占一行,可以设置宽高…...

Python 全栈实战 · 第8章

网站开发入门(Flask 快速搭建网页,实战可用) 8.1 本章能学到什么? 网站开发是 Python 全栈必备技能。本章我们用最简单、最容易上手的 Flask 框架,做到: 搭建自己的网页 实现路由访问 显示文字、页面 做简单接口服务 本地运行、浏览器访问 零基础也能一次学会,不…...

不学 Python,Java 也能调大模型?15 分钟跑通第一个 AI 接口(Java 架构师的 AI 工程笔记 01)

文章目录Java 架构师的 AI 工程笔记(一):5 个概念 第一次跟 AI 对话理论篇一、Java 工程师为什么能搞 AI Agent二、开始写代码之前,你得搞懂这 5 个概念2.1 Token——LLM 的计费单位2.2 Prompt——你给 LLM 的指令2.3 Temperatur…...

GEE案例分析:基于Dynamic World 数据的农用地识别活跃与休耕农田

🌾 用 GEE 和 Dynamic World 识别活跃与休耕农田 在全球粮食安全与土地利用变化研究中,农田的动态监测 一直是核心议题。传统方法依赖地面调查或单一时期遥感影像,难以捕捉农田的季节性轮作和长期撂荒。如今,借助 Google Earth Engine(GEE) 和高频土地覆盖产品 Dynamic…...

洛谷 B4497:[GESP202603 二级] 数数

【题目来源】 https://www.luogu.com.cn/problem/B4497 【题目描述】 对于正整数 n,如果 n 的所有数位中包含恰好 3 个 2,Alice 会认为这个正整数是美丽的。例如,正整数 24122 中包含 3 个 2,所以 24122 是美丽的;正整…...

大型城市二次供水设施远程智能管理系统

随着城市化进程的加快,二次供水设施作为城市供水“最后一公里”的关键环节,其智能化管理水平直接关系到居民的用水安全和生活质量。映翰通网络依托其IG900边缘计算网关,助力大型城市实现二次供水设施的远程智能管理,推动供水系统向…...

Java后端开发 笔试知识点复习(一)

某行某费 线上笔试一、选择题和简答题1. CompletableFuture是Java 8 引入的异步编程工具&#xff0c;用于异步任务的组合和链式调用。通过静态工厂方法可以创建CompletableFuture实例&#xff1a;CompletableFuture<String> future CompletableFuture.supplyAsync(() -…...

股票基金:欧洲各类指数都是什么意思 / 成分是什么

以下是欧洲主要指数的详细解释&#xff0c;包括市值的具体金额&#xff08;基于最新可用数据估算&#xff09;指数名称含义成分股及特点总市值&#xff08;估算&#xff09;英国富时100指数&#xff08;FTSE 100&#xff09;反映伦敦证券交易所市值最大的100家上市公司的整体表…...

Java程序设计(第3版)——配置环境变量之path

配置环境变量之path PATH的配置 以下载到C盘为例 首先点击“此电脑”&#xff08;如下所示&#xff09;&#xff1a; 此电脑 > 本地磁盘 (C:) > Program Files > Java > jdk1.8.0_131 > bin > 其次点击窗口栏右侧并复制以完成下一步配置环境的准备工作 然…...

股票基金:全球各类指数都是什么意思 / 成分是什么

A股指数指数名称含义成分股特点上证指数反映上海证券交易所上市股票价格的整体表现上海证券交易所全部A股和B股历史悠久&#xff0c;市场认可度高&#xff0c;是反映中国股市整体走势的重要指标深圳指数&#xff08;深证成指&#xff09;反映深圳证券交易所上市股票价格的整体表…...

什么是 MCP?Model Context Protocol 深度解析

什么是 MCP&#xff1f;Model Context Protocol 深度解析 一、MCP 是什么&#xff1f; MCP&#xff08;Model Context Protocol&#xff09;是 Anthropic 推出的标准化工具调用协议&#xff0c;为 AI 模型与外部工具之间的交互提供了统一的规范。简单来说&#xff0c;MCP 就像…...

07. Capture 中 Find 的高阶小应用_正则表达式 I OrCAD X Capture CIS 设计小诀窍第三季

大家好&#xff01;在进行原理图设计时&#xff0c;我们经常需要查找特定的网络信号——比如所有的TF Card数据线、所有的MCU控制信号&#xff0c;或者所有以“SW”开头的网络。如果只靠普通的字符串搜索&#xff0c;要么搜不全&#xff0c;要么把无关信号也搜出来&#xff0c;…...

浅聊Flink的广播模式

浅聊Flink的广播模式 前言 最近接触到一个新颖的中间件 Flink,为什么接触到这个呢,是因为我们公司系统需要做一个告警模块,负责采集到的监控数据会直接往 kafka 里塞,然后告警这边需要从 kafka topic 里面实时读取到监控数据,并将读取到的监控数据做一些 聚合/转换/计算…...

HarmonyOS6 ArkTS 外描边(outline)使用文档

文章目录一、核心属性与接口1. 统一设置接口 outlineAPI 11API 182. 分设属性&#xff08;精细控制&#xff09;二、OutlineStyle 枚举&#xff08;三种线型&#xff09;三、使用方式方式1&#xff1a;独立属性分开设置方式2&#xff1a;统一 outline 对象配置方式3&#xff1a…...

在中国读者中,哪些科幻小说是畅销的?为什么它们畅销

如果只从小说内容本身出发&#xff0c;而不去谈产业、政策、影视改编和时代环境&#xff0c;那么一部科幻小说能不能畅销&#xff0c;核心往往不复杂。读者真正会为一本科幻小说买单&#xff0c;通常不是因为它属于“科幻”这个门类&#xff0c;而是因为它在阅读过程中提供了几…...

金仓数据库在MySQL迁移中的技术观察:高兼容性与平滑替代路径实践

金仓数据库在MySQL迁移中的技术观察&#xff1a;高兼容性与平滑替代路径实践 2023年底&#xff0c;MySQL 5.7正式停止官方维护支持——这一曾被广泛应用于中小企业核心系统的开源数据库&#xff0c;悄然进入生命周期尾声。对开发者而言&#xff0c;这不仅是版本迭代的常规提示…...

属电子信息类专业电子信息工程(Electronic Information Engineering,简称 EE)专业是什么?

属电子信息类专业电子信息工程&#xff08;Electronic Information Engineering&#xff0c;简称 EE&#xff09;专业是什么&#xff1f;电子信息工程&#xff08;Electronic Information Engineering&#xff0c;简称 EE&#xff09;简称电子信息&#xff0c;是现代科技领域的…...

金仓数据库在MySQL迁移中的实践复盘:一家三甲医院电子病历系统性能与成本优化实录

金仓数据库在MySQL迁移中的实践复盘&#xff1a;一家三甲医院电子病历系统性能与成本优化实录 2024年初&#xff0c;西安市第一医院信息科主任老张盯着监控大屏皱眉&#xff1a;“早高峰挂号排队超3分钟&#xff0c;电子病历调阅平均要4.7秒——这哪是‘智慧医院’&#xff0c…...

YOLO系列算法改进 | 主干改进篇 | 替换SHViT高效视觉变换器 | 助力模型极致轻量化,同时保持高精度性能! | CVPR 2024

0. 前言 本文介绍了SHViT高效视觉变换器,并将其集成到ultralytics最新发布的YOLO26目标检测算法中,替换原有Backbone网络。SHViT的创新在于从宏观和微观两个层面系统性消除计算冗余,通过大步长块化主干和单头部分通道注意力,以最少的内存访问成本实现超快视觉推理。将其作…...

StressTheGPU v1.44 丨便携显卡压力测试工具

StressTheGPU v1.44 便携版是轻量免安装的专业显卡压力测试工具&#xff0c;适配 Windows 全系列系统&#xff0c;凭借低 CPU 占用的优势&#xff0c;可在极端负载下精准评估显卡稳定性与性能&#xff0c;支持实时监控与基准测试&#xff0c;全面满足硬件验机、调试等核心需求。…...

基于DQ轴谐波提取器的PMSM永磁同步电机谐波抑制技术:五七次谐波的有效抑制与电流环解耦补偿应用

基于DQ轴谐波提取器的永磁同步电机谐波抑制 PMSM 1.通过谐波提取器&#xff0c;直接提取DQ轴的谐波分量进行抑制&#xff0c;对五七次谐波电流抑制效果效果很好。 2.为了放大效果&#xff0c;采用主动注入谐波电压的方法&#xff0c;增大了电机中的谐波分量。 3.调制算法采用SV…...

HoRain云--Dash 简介

&#x1f3ac; HoRain 云小助手&#xff1a;个人主页 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …...

Node.js - 04:MongoDB、会话控制

MongoDB1、简介MongoDB 是一个基于分布式文件存储的数据库&#xff0c;官方地址 https://www.mongodb.com/数据库&#xff08;DataBase&#xff09;是按照数据结构来组织、存储和管理数据的 应用程序数据库的主要作用就是 管理数据 &#xff0c;对数据进行 增&#xff08;c&…...

大模型工具使用

介绍模型下载API测试本地平台搭建对比表格详细说明TransformersFastChatOllamavLLM关键差异介绍大模型一些简单的使用 模型下载 模型快捷的下载 魔搭社区 Ollama【可以直接在Ollama软件中下载】 API测试 通过API测试的平台&#xff1a;硅基流动 本地平台搭建 对比表格 工…...

AI辅助开发:前端“加速器”还是后端“稳定器”?——基于项目类型与用户规模的实战指南

文章目录前言一、技术原理解析1. 核心差异维度对比2. AI 辅助开发的技术架构模型二、按 DAU 规模分层的实战策略与代码实证1. 低 DAU 项目&#xff08;<1万&#xff09;&#xff1a;MVP 验证期后端实战&#xff1a;从需求到接口的秒级响应前端实战&#xff1a;快速但粗糙的 …...

国内代理IP地域选择与降低延迟方法

在进行公开数据获取、广告效果监测或业务信息整合时&#xff0c;很多企业都会遇到一个现实问题&#xff1a;请求延迟偏高&#xff0c;影响整体效率。尤其是在使用国内代理IP时&#xff0c;地域选择往往被忽视&#xff0c;但实际上&#xff0c;它对延迟的影响非常直接。从网络传…...