尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
fuels-ts 地址格式转换实战:用 Address 工具类打通 B256、Contract ID、Wallet 与 Asset ID
fuels-ts 地址格式转换实战用 Address 工具类打通 B256、Contract ID、Wallet 与 Asset ID【免费下载链接】fuels-tsFuel Network Typescript SDK项目地址: https://gitcode.com/GitHub_Trending/fu/fuels-ts本指南聚焦 Fuel TypeScript SDKfuels-ts中的地址转换问题。Fuel Network 底层统一使用 B25664 位十六进制地址格式但日常开发中你还会遇到以 Struct 包裹的 Asset ID、EVM Address、Checksum 地址等多种变体。读完本文你将掌握如何借助Address这个类型安全的工具类在这些格式与 Sway 标准类型之间自由转换并理解其底层实现原理。为什么需要地址转换任何去中心化应用的开发都离不开地址而不同网络、不同抽象层往往强制使用不同格式的地址。在 fuels-ts 生态中主要会遇到以下几种形态B256 地址Fuel Network 交互所使用的原生格式本质是0x前缀加 64 个十六进制字符总长 66 个字符。这也是 B256 类型Sway 内建类型的表示const b256 0x9ae5b658754e096e4d681c548daf46354495a437cc61492599e33fc64dcdc30c;Hex 格式字符串不带任何业务语义的裸十六进制串同样常见。Struct 包裹类型例如 Asset ID 与 EVM Address它们在 Sway 中是以Struct形式包裹对应 TypeScript 侧形如{ bits: B256 }的对象参见 Struct 类型说明。fuels-ts 通过 Address 工具类 让这些格式之间的转换变得简单——它提供了一系列转换与比较工具方法。下文将逐一演示如何利用该类在地址格式与 Sway 标准类型之间完成互转。Address 类一切转换的核心在 Sway 中Address是对内建B256原始类型的类型安全封装而 fuels-ts 的 SDK 另有一套自己的Address抽象。其实现位于 packages/address/src/address.ts类的核心只有一个只读属性readonly b256Address: B256Address;即所有地址最终都会统一归一化并存储为小写的 B256 地址见 normalizeB256。围绕这一个属性类提供了完整的方法族源码见 packages/address/src/address.ts实例方法返回类型作用toAddress()B256Address返回b256Address属性L46-L48toB256()B256Address返回 B256 哈希地址字符串L55-L57toBytes()Uint8Array返回 B256 地址的字节数组L64-L66toHexString()B256Address等价于toB256()L73-L75toEvmAddress()EvmAddress转为 SwayEvmAddress的 Struct 形态L99-L103toAssetId()AssetId包装为 SwayAssetId的 Struct 形态L109-L113toChecksum()ChecksumAddress生成 ERC-55 风格的校验和地址L39-L41toString()/valueOf()string均返回校验和地址字符串L82-L84、L119-L121equals(other)boolean比较两个地址是否相等L128-L130构造函数的“万能输入”机制new Address(address)的构造函数接受多种输入形态并自动判别L28-L31传入一个 B256 字符串、一个 512 位公钥字符串、一个 EVM 地址字符串或一个已有的Address实例均可。其分发逻辑集中在 fromDynamicInputToB256若传入对象实现了toB256()直接取用否则按长度与正则依次判断是否为B2560x 64 位 hexisB256再判断是否为公钥0x 128 位 hex即 512 bitisPublicKey是则对其做 sha256 哈希得到 B256接着判断是否为EVM 地址0x 40 位 hex即 20 字节isEvmAddress是则通过 fromEvmAddressToB256 在头部补齐 12 字节零值得到 B256都不匹配则抛出FuelError错误码PARSE_FAILED。需要注意地址字符串在比较时会被统一转小写normalizeB256这意味着大小写差异不会影响相等性判断而若需要带校验能力的表示则应使用toChecksum()返回的 ERC-55 校验和地址。转换 Contract ID合约的id属性是一个Address实例文档参见 address-conversion.md。因此可以直接复用Address类的toAddress、toB256等方法完成转换。下面是从一个已部署合约获取其 B256 地址的完整示例代码来自 contract.tsimport type { B256Address } from fuels; import { Address, Provider, Contract } from fuels; import { LOCAL_NETWORK_URL } from ../../../../env; import { Counter } from ../../../../typegend/contracts; const provider new Provider(LOCAL_NETWORK_URL); const contractAbi Counter.abi; const contractAddress new Address( 0x6d309766c0f1c6f103d147b287fabecaedd31beb180d45cf1bf7d88397aecc6f ); const contract new Contract(contractAddress, contractAbi, provider); const b256: B256Address contract.id.toAddress(); // 0x6d309766c0f1c6f103d147b287fabecaedd31beb180d45cf1bf7d88397aecc6f其中contract.id的类型即为Address所以contract.id.toAddress()与contract.id.toB256()均可直接调用二者等价。这里通过Address的构造函数直接创建合约地址而非依赖 typegen 生成的常量充分体现了new Address(...)可接受原始 B256 字符串的能力。转换 Wallet Address同理钱包的address属性同样是Address类型因此可调用完全相同的方法族。下面的示例先用 B256 构造地址再创建钱包对象并取出其 B256 地址代码来自 wallet.tsimport type { B256Address, WalletLocked } from fuels; import { Address, Provider, Wallet } from fuels; import { LOCAL_NETWORK_URL } from ../../../../env; const provider new Provider(LOCAL_NETWORK_URL); const address new Address( 0x6d309766c0f1c6f103d147b287fabecaedd31beb180d45cf1bf7d88397aecc6f ); const wallet: WalletLocked Wallet.fromAddress(address, provider); const b256: B256Address wallet.address.toAddress(); // 0x6d309766c0f1c6f103d147b287fabecaedd31beb180d45cf1bf7d88397aecc6f这里通过Wallet.fromAddress(address, provider)把Address实例传入钱包构造器钱包的address属性保持Address类型因此wallet.address.toAddress()、wallet.address.toB256()、wallet.address.toEvmAddress()等方法都能直接使用。当你需要把一个地址作为交易收款方、查询余额等场景前都可先用这些方法统一转成需要的目标格式。转换 Asset IDAsset ID 是包裹了内层 B256 值的 Struct 类型对应 Sway 标准库定义TypeScript 表示为{ bits: string }参见 asset-id.md。下面的例子展示了如何从一个 B256 构造Address再转成AssetId代码来自 asset-id.tsimport type { AssetId, B256Address } from fuels; import { Address } from fuels; const b256: B256Address 0x6d309766c0f1c6f103d147b287fabecaedd31beb180d45cf1bf7d88397aecc6f; const address: Address new Address(b256); const assetId: AssetId address.toAssetId(); // { // bits: 0x6d309766c0f1c6f103d147b287fabecaedd31beb180d45cf1bf7d88397aecc6f // }可以看到toAssetId()只是把内部的b256Address包装进{ bits }结构实现见 toAssetId因此这个资产 ID 在链上与原来的 B256 字节完全一致。反过来当你的合约函数接收一个AssetId参数时也可以把assetId.bits拿出来直接构造new Address(assetId.bits)进而复用本类全部方法。转换到 EVM Address 与校验和地址除上述官方文档演示的场景外Address还提供了与跨链/校验场景强相关的两个实用方向EVM AddresstoEvmAddress()返回 SwayEvmAddressStruct{ bits: ... }。其底层 toB256AddressEvm 会先校验输入为合法 B256然后裁掉前 12 字节、再在头部补回 12 个零字节得到低位 20 字节与 EVM 地址对应的 B256。反之若你手里是标准 20 字节的 EVM 地址字符串new Address(evmAddress)会自动通过 fromEvmAddressToB256 补齐为 B256无需手动 pad。Checksum校验和地址toChecksum()遵循 ERC-55 规范——对 B256 十六进制串做 sha256 后按哈希位逐位决定原字符是否大写实现见 address.ts 的私有 toChecksum。toString()、valueOf()返回的正是这种校验和形式equals()在内部也基于校验和比较L128-L130因此它同时具备“展示带校验、比较不受大小写干扰”的双重能力。底层原理小结一次构造处处可转纵观 packages/address/src/address.ts 的实现fuels-ts 的地址转换设计可以概括为一句话所有格式在构造Address时被统一折叠为一个小写的 B256之后任何格式的输出都只由这一个事实源派生。输入归一构造函数经由 fromDynamicInputToB256 自动识别 B256 / 公钥(512) / EVM 地址 / 已有Address无法识别时抛错避免静默产生错误地址。输出派生toAddress/toB256/toHexString直接返回内部值toBytes做字节化toEvmAddress/toAssetId做 Struct 包装toChecksum/toString做 ERC-55 校验编码。这种“单一内部表示 双向可转换”的设计使你在处理合约id、钱包address、链上 Asset ID 以及跨链 EVM 地址时永远只需要一份标准化的转换心智模型。完整入口文档见 address-conversion.mdAddress 类型的整体介绍见 address.mdb256.md 与 evm-address.md 则分别给出了各目标类型在 Sway 侧的语义定义可对照阅读。【免费下载链接】fuels-tsFuel Network Typescript SDK项目地址: https://gitcode.com/GitHub_Trending/fu/fuels-ts创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

Python单元测试隔离实战:用unittest.mock剥离外部依赖

Python单元测试隔离实战:用unittest.mock剥离外部依赖

我经常在Review团队代码时看到一类测试:拉到本地一跑就绿,推到CI上却每隔几天红一次。点开日志,十有八九不是业务逻辑错了,而是测试跑着跑着撞上了真实的外部依赖——某个内网API超时、数据库连接池被占满、第三方回调延迟超过预期…

📅 2026/9/9 20:02:58
海康威视OCX控件接入实战:环境搭建、接口调用与常见问题排查

海康威视OCX控件接入实战:环境搭建、接口调用与常见问题排查

简介:海康威视OCX控件是一份面向视频监控应用开发者的 Windows 组件封装包,基于 ActiveX/OCX 技术,将海康威视摄像头、NVR 等硬件能力集成为可复用的视频预览、抓拍、录像、云台控制、对讲与声音调节等接口,适合需要快速在桌面程序…

📅 2026/9/9 20:02:58
Java异常处理实战:线上排查、最佳实践与设计模式融合

Java异常处理实战:线上排查、最佳实践与设计模式融合

Java异常处理是被讨论得最多、又最容易流于表面的知识点。我见过不少能把继承结构倒背如流的人,真到线上排查时,却连Caused by那一行都不看,直接把整个堆栈甩到群里,然后问“这啥意思”。下面要聊的内容,我不想讲八股&…

📅 2026/9/9 20:02:58
MORE NEWS

更多资讯

📰

Skills不是函数,而是智能体的动作契约

1. 这不是编程语言,而是智能体的“肌肉记忆”——Skills 的本质重新定义你打开一个智能体项目文档,看到 SKILL.md 文件,第一反应可能是:“哦,又一个配置文件?”接着翻到目录页,发现 Skills 目录…

📰

多智能体协作框架怎么落地?拆解TradingAgents的投研辩论机制

先说我看到 TradingAgents 这项目的第一反应:GitHub 上头这类“AI 智能体炒股”的开源项目多了去了,但真正把开会辩论这套流程做完整的很少。它模拟了一个真实投资机构里的投委会——几个研究员分别从基本面、技术面、市场情绪这些角度去分析同一只股票&…

📰

AI Agent记忆系统:从跨会话连续性到工程化落地

1. 为什么“让 Agent 记住你”不是功能升级,而是范式切换? “走进AI Agent第三篇:让 Agent 记住你”——这个标题乍看像一个普通功能点,但实际踩中了当前Agent落地最深的断层带。我从2022年第一批用LangChain搭客服Bot开始&#x…

📰

羽毛球教学如何用好智能陪伴与数据反馈?一套让进步清晰的训练方法

在吴忠这几年的羽毛球培训圈里,我常被人问到同一个问题:明明球馆里的场地一直很抢手,为什么很多人打了两年球,还是“只会发球接球,一打比赛就乱”?我的答案是,大多数人并不缺场地、不缺时间&…

📰

Airi Vue 组件测试最佳实践:采用黑盒测试思路,聚焦行为而非内部实现

Airi Vue 组件测试最佳实践:采用黑盒测试思路,聚焦行为而非内部实现 【免费下载链接】airi 💖🧸 Self hosted, you-owned Grok Companion, a container of souls of waifu, cyber livings to bring them into our worlds, wishing…

📰

在 airi 项目中正确处理 Vue 异步测试:nextTick、trigger 与 flushPromises 实战指南

在 airi 项目中正确处理 Vue 异步测试:nextTick、trigger 与 flushPromises 实战指南 【免费下载链接】airi 💖🧸 Self hosted, you-owned Grok Companion, a container of souls of waifu, cyber livings to bring them into our worlds, wi…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬