web3.js 数据校验利器 web3-validator:从 Eth ABI 类型到 JSON Schema 的完整验证方案
web3.js 数据校验利器 web3-validator从 Eth ABI 类型到 JSON Schema 的完整验证方案【免费下载链接】web3.jsCollection of comprehensive TypeScript libraries for Interaction with the Ethereum JSON RPC API and utility functions.项目地址: https://gitcode.com/gh_mirrors/we/web3.jsweb3-validator 是 web3.js 4.x 生态中负责对象与数据校验的子包它将 Ethereum ABI 类型体系与 JSON-Schema-Draft07 规范融合为合约调用参数、交易字段、RPC 返回值等场景提供统一且可扩展的验证能力。读完本文你将掌握 validator 的核心用法含静默模式与错误对象、完整支持的类型清单、ETH 类型到 JSON Schema 的转换机制以及如何在uint、bytes、tuple、address等场景下写出可复用的校验 Schema。包定位与安装web3-validator是 web3.js 的官方子包之一仓库路径 packages/web3-validator当前版本 2.0.6它只负责校验对象这一件事不依赖 web3 主包即可独立使用。其描述为 JSON-Schema compatible validator for web3即一个与 JSON Schema 兼容的、面向 web3 数据形态的校验器。按 package.json 的声明它同时提供 CommonJSlib/commonjs、ESMlib/esm与类型声明lib/types三种产物Node.js 版本要求14npm 版本要求6.12.0。安装命令使用 NPMnpm install web3-validator使用 Yarnyarn add web3-validator该包自身的依赖包括zod校验引擎核心、ethereum-cryptography、web3-errors与web3-types见 package.json这些依赖会随包自动安装。快速上手validator.validate 的两种模式从入口文件 src/index.ts 可以看到包默认导出了web3_validator.js、default_validator.js、types.js、utils.js、errors.js、constants.js以及validation/index.js。其中最常用的就是默认实例validator它定义在 src/default_validator.tsexport const validator new Web3Validator();也就是说你导入的validator是一个Web3Validator实例它的validate方法定义在 src/web3_validator.ts签名如下validate( schema: ValidationSchemaInput, data: ReadonlyArrayunknown, options: Web3ValidationOptions { silent: false }, ): Web3ValidationErrorObject[] | undefined标准用法校验失败即抛错import { validator } from web3-validator; // 校验通过静默返回 undefined validator.validate([uint8, string], [2, my-string]); // 校验失败抛出 Web3ValidatorError validator.validate([uint8, string], [300, my-string]);静默模式收集错误而非抛出传入{ silent: true }后校验失败不会抛出异常而是返回Web3ValidationErrorObject[]错误数组方便上层自行处理import { validator } from web3-validator; const errors validator.validate([uint8, string], [300, my-string], { silent: true }); console.log(errors);关于silent选项的默认值可参考 src/web3_validator.ts 中的options: Web3ValidationOptions { silent: false }默认非静默、直接抛错。错误对象与异常结构非静默模式下抛出的Web3ValidatorError定义在 src/errors.ts它继承自web3-errors的BaseWeb3Error并固定使用错误码ERR_VALIDATION。其 message 形如Web3 validator found 1 error[s]: value 300 at /0 must pass uint validation而silent: true返回的错误对象是Web3ValidationErrorObject[]每个对象包含keyword、instancePath、schemaPath、params、message五个字段转换逻辑见 src/validator.ts与 JSON Schema 校验错误的表达习惯一致。支持的 Ethereum 数据类型一览README 用一张表概括了web3-validator支持校验的 ETH 类型。下表在此基础上补充了实现细节底层 format 定义见 src/formats.tsType可接受的输入形式说明uintnumber、string、HexString无符号整数支持所有 EVM 变体如uint8、uint256支持数组限定符uint[]、uint[2]intnumber、string、HexString有符号整数支持所有 EVM 变体如int8、int256支持数组限定符int[]、int[2]bytesHexString、Uint8Array原始字节支持定长字节如bytes32stringstring字符串值addressstring、HexString以太坊网络兼容地址bloomstring、HexString校验给定字符串是否为以太坊 Bloom 过滤器tuplearray可指定任意嵌套数组形式的元组如[uint, string]自定义元组或数组元组用[tuple[3], [uint, string]]语法需要说明的是上表中bytes行的 fixed length bytes asbytes[2] 属于 README 原文描述实际语义上应理解为定长字节类型bytes1~bytes32代码中 formats.ts 通过循环为bytes1到bytes32生成了对应格式并将bytes256映射回通用bytes。除此之外src/constants.ts 定义了完整的 ETH 基础类型集合export const VALID_ETH_BASE_TYPES [bool, int, uint, bytes, string, address, tuple];注意这里还包含了bool。同时src/types.ts 定义了扩展类型hex、number、blockNumber、blockNumberOrTag、filter、bloom这些类型同样可以在 schema 中使用并对应 formats.ts 中的isHexStrict、isNumber、isBlockNumber、isBlockNumberOrTag、isFilterObject、isBloom等底层校验函数。数值按数组传参的约定对于 Ethereum 兼容数据值必须以数组形式传入。例如 schema[uint, string]对应的值应为[2, my-string]。这是因为在Web3Validator.validate中schema 会被转换为一个type: array的 JSON Schemadata的每个元素按位置与 schema 的每一项对应见 src/utils.ts。类型的解析规则parseBaseType见 src/utils.ts负责把uint256、int8、bytes32[2]这类类型字符串拆解为baseType、baseTypeSize、arraySizes与isArray先用空格清洗类型字符串若包含[则提取数组下标无数字下标解析为-1即不定长数组若命中VALID_ETH_BASE_TYPES直接返回基础类型否则尝试解析int/uint/bytes前缀后的位数。convertEthTypesrc/utils.ts随后将 ETH 类型映射为{ format, required }例如uint256→format: uint256, required: true。值得注意的是它不允许在同一个 schema 项中同时出现eth关键字与type字段否则会抛出Web3ValidatorError。三种 Schema 写法短格式、完整 ABI 与 JSON Schema1. 短格式ShortValidationSchema直接用类型字符串数组描述参数列表validator.validate([uint8, string, address], [8, hello, 0x...]);嵌套元组也可用数组表示例如[[uint, string]]。2. 完整 ABI 参数格式FullValidationSchema当需要携带字段名时可直接传完整的 ABI 参数对象数组const schema [ { name: owner, type: address }, { name: amount, type: uint256 }, ]; validator.validate(schema, [0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b, 1000]);该能力基于FullValidationSchema ReadonlyArrayAbiParameter类型定义见 src/types.ts。从 test/fixtures/abi_to_json_schema.ts 的测试夹具可以看到两种写法的对应关系例如fullSchema: [{ name: a, type: uint }]与shortSchema: [uint]都会转换为包含format: uint、required: true的数组项 JSON Schema。3. 原生 JSON SchemaDraft-07 自定义eth关键字web3-validator的实现是 JSON-Schema-Draft07 的扩展增加了一个自定义关键字eth。因此你完全可以用标准的 JSON Schema 校验任意对象数据{ type: object, properties: { owner: { type: string }, amount: { type: number } }, required: [owner, amount] }底层 src/validator.ts 的convertToZod会把 JSON Schema 递归转换为 Zod schemaobjectpropertiesrequired生成z.object().partial().required(...)arrayitems生成z.array或z.tuple依据minItems/maxItems与$id判断oneOf生成z.unionformat则映射为z.any().refine(formats[schema.format])。这解释了为何 package.json 将zod列为运行时依赖。深入ETH Schema 到 JSON Schema 的转换机制当你调用validator.validate([uint8, string], data)时完整调用链是Web3Validator.validate收到 schema 后先调用ethAbiToJsonSchema(schema)src/utils.ts把 ETH 类型数组转换为 JSON SchemaabiSchemaToJsonSchemasrc/utils.ts构建一个type: array、minItems/maxItems等于参数个数的顶层 schema逐项解析 ABI 参数基础类型生成{ $id, format, required: true }带数组的类型如uint[2]生成type: array且minItems/maxItems固定为 2 的嵌套结构不定长数组下标为 -1则不设置长度约束tuple递归调用abiSchemaToJsonSchema生成嵌套数组 schema转换后的 JSON Schema 交给Validator.validate先convertToZod成 Zod schema再safeParse校验数据失败时由convertErrors把 Zod issue 翻译成 JSON Schema 风格的Web3ValidationErrorObject[]src/validator.ts。Web3Validator.validate还额外处理了一个边界当 schema 为空转换后 items 为空数组而数据非空时会抛出Web3ValidatorError错误信息为 empty schema against data can not be validated见 src/web3_validator.ts。预置校验工具与扩展类型除了validator实例包还导出了一系列可直接复用的校验函数通过 src/index.ts 的export * from ./validation/index.js源码位于 src/validation包括address.ts地址校验isAddressbloom.tsBloom 过滤器校验isBloomblock.ts区块号/区块标签校验isBlockNumber、isBlockTag、isBlockNumberOrTagboolean.ts、string.ts布尔与字符串校验bytes.ts字节数据校验isBytes支持定长与不定长numbers.ts数字校验isNumber、isInt、isUInt支持位宽约束filter.ts、topic.ts、abi.ts、eth.ts、object.ts过滤器对象、topic、ABI 参数、ETH 类型与对象结构校验这些函数同样通过validator.utils或直接导入使用例如import { isAddress, isHexStrict } from web3-validator; // 或 import { utils } from web3-validator;以isUInt/isInt为例它们支持{ bitSize }选项formats.ts 正是利用这一特性为 8 到 256 位步长 8的每个intN/uintN生成对应校验格式从而支撑uint8、uint256等全部 EVM 数值类型。进阶示例元组与数组类型校验定长数组// 期望两个 uint 组成的定长数组 validator.validate([uint[2]], [[1, 2]]); // 长度不符时报错需要 2 个元素 validator.validate([uint[2]], [[1]], { silent: true });不定长数组// 任意长度的 uint 数组 validator.validate([uint[]], [[1, 2, 3]]);元组 tuple// 元组第一个元素是 uint第二个是 string validator.validate([[uint, string]], [[1, a]]); // 自定义元组数组tuple[3] 表示三个元素每个元素都是 [uint, string] validator.validate([tuple[3], [uint, string]], [[[1, a], [2, b], [3, c]]]);元组的处理逻辑在 src/utils.tsbaseType tuple时会递归转换abiComponents数组元组还会根据首位arraySizes生成minItems/maxItems约束。更多示例abi_to_json_schema.ts测试夹具packages/web3-validator/test/fixtures/abi_to_json_schema.ts中包含了大量可参考的 schema 用例该文件共 1814 行覆盖uint、address、bytes、bool、tuple、嵌套数组、全量 ABI 参数等场景是学习 schema 写法的第一手资料。对应单元测试位于 packages/web3-validator/test/unit。工程实践与注意事项默认抛错静默收集默认silent: false会直接抛出Web3ValidatorError需要收集全部错误时使用{ silent: true }。数组传参约定ETH 类型 schema 的数据必须按位置以数组传入不能传对象。eth与type互斥同一 schema 项中不能同时使用自定义eth关键字与标准type字段见 src/utils.ts。类型覆盖全面基础类型bool/int/uint/bytes/string/address/tuple之外还支持hex、number、blockNumber、blockNumberOrTag、filter、bloom等扩展类型。定长与不定长bytes1~bytes32、int8~int256、uint8~uint256全部预置数组下标省略即不定长。相关资源包入口与导出packages/web3-validator/src/index.ts默认实例与高级封装packages/web3-validator/src/default_validator.ts、packages/web3-validator/src/web3_validator.ts核心校验引擎packages/web3-validator/src/validator.tsETH→JSON Schema 转换与工具函数packages/web3-validator/src/utils.ts格式与基础类型常量packages/web3-validator/src/formats.ts、packages/web3-validator/src/constants.ts错误类型packages/web3-validator/src/errors.ts示例与测试packages/web3-validator/test/fixtures/abi_to_json_schema.ts、packages/web3-validator/test/unit【免费下载链接】web3.jsCollection of comprehensive TypeScript libraries for Interaction with the Ethereum JSON RPC API and utility functions.项目地址: https://gitcode.com/gh_mirrors/we/web3.js创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

意图驱动开发IDD:AI时代让开发者聚焦目标与验证

意图驱动开发IDD:AI时代让开发者聚焦目标与验证

说实话,过去两年我写代码的方式发生了几乎颠覆性的变化。两年前,我还在为每个接口的字段校验、异常分支、边界条件一行行手敲,然后被QA提的bug一个接一个打回。现在打开编辑器,我最主要的动作变成了“描述清楚我要什么”&#xff…

2026/9/21 1:48:58 阅读更多 →
华罗庚统筹方法实战:用关键路径与总时差管好项目工期

华罗庚统筹方法实战:用关键路径与总时差管好项目工期

简介:这份PDF收录了华罗庚先生关于统筹方法的经典论述,面向需要提升任务规划与效率思维的学生、管理者及工程技术人员。内容以生产建设中的实际问题为切入点,通过“泡茶”这一通俗案例,对比三种不同操作流程,直观展示如…

2026/9/21 1:48:58 阅读更多 →
react-admin `<SimpleFormIterator>` 数组编辑完全指南:Props、自定义操作与源码原理

react-admin `<SimpleFormIterator>` 数组编辑完全指南:Props、自定义操作与源码原理

前端UI组件 【免费下载链接】react-admin A frontend Framework for single-page applications on top of REST/GraphQL APIs, using TypeScript, React and Material Design 项目地址&#xff1a; https://gitcode.com/gh_mirrors/re/react-admin 点击查看 免费下载 <Simp…

2026/9/21 1:48:58 阅读更多 →

最新新闻

KubeSphere 仓库中的 go-fuzz-headers:用字节驱动的 Go 模糊测试辅助库

KubeSphere 仓库中的 go-fuzz-headers:用字节驱动的 Go 模糊测试辅助库

后端云原生容器编排微服务 【免费下载链接】kubesphere kubesphere/kubesphere: KubeSphere 是一个开源的企业级容器平台&#xff0c;构建于 Kubernetes 之上&#xff0c;提供全栈化容器管理能力&#xff0c;包括服务治理、DevOps、微服务治理、监控告警、日志查询等功能&#…

2026/9/21 3:02:40 阅读更多 →
手动移植ZynqMP U-Boot与Linux Kernel:摆脱PetaLinux的启动定制实践

手动移植ZynqMP U-Boot与Linux Kernel:摆脱PetaLinux的启动定制实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 3:02:40 阅读更多 →
TCAN4550RGYRQ1车规CAN FD SBC应用指南:SPI驱动、寄存器配置与实战调试

TCAN4550RGYRQ1车规CAN FD SBC应用指南:SPI驱动、寄存器配置与实战调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 3:02:39 阅读更多 →
电子密码锁设计实战:从矩阵键盘到EEPROM存储的嵌入式开发全攻略

电子密码锁设计实战:从矩阵键盘到EEPROM存储的嵌入式开发全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 3:02:39 阅读更多 →
AI辅助PCB设计的三层演进:从自动化到跨域协同

AI辅助PCB设计的三层演进:从自动化到跨域协同

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 3:02:39 阅读更多 →
Android性能优化实战:冷启动、内存与卡顿排查全解析

Android性能优化实战:冷启动、内存与卡顿排查全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 3:01:39 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析&#xff1a;从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南&#xff1a;src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin &#x1f680;ViteVue3Gin拥有AI辅助的基础开发平台&#xff0c;企业级业务AI开发解决方案&#xff0c;内置mcp辅助服务&#xff0c;内置skills管理&#xff0c;…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址&#xff1a; https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件&#xff08;Full-featured Plugin&#xff09;是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事&#xff1a;用Flutter给OpenHarmony做一款游戏集合类的App&#xff0c;说白了就是把若干小游戏塞进一个壳里&#xff0c;用统一入口分发。这个方向本身不算新鲜&#xff0c;真正让我花了不少心思的&#xff0c;是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档&#xff0c;最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事&#xff1a;今天在表后面多加了两个空白行&#xff0c;明天给客户交稿前发现整个章节的编号全部错位&#xff0c;光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年&#xff0c;说实话&#xff0c;第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年&#xff0c;流量惨淡、功能臃肿、代码自己都懒得看第二遍之后&#xff0c;我才慢慢琢磨明白一个道理&#xff1a;第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践&#xff1a;原型怎样变成可用功能分类&#xff1a;[AI/大模型]细分主题&#xff1a;AI 增强型 CI/CD 流水线自动化与 GitOps 实践&#xff1a;Agent 工作流、工具调用与任务拆解&#xff1a;从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战&#xff1a;复盘记录怎样真正派上用场分类&#xff1a;[工程技术]细分主题&#xff1a;Kubernetes 生产环境运维与排障实战&#xff1a;可复制的项目复盘模板与决策记录大部分团队的事故复盘报告&#xff0c;最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理&#xff1a;核心链路应该先拆哪一步分类&#xff1a;[工程技术]细分主题&#xff1a;Docker 容器化技术与镜像安全管理&#xff1a;核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用&#xff08;包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →