什么是 BEP20 地址?
什么是 BEP20 地址?本文详细介绍 0x 格式与 EIP-55 校验和的工作原理、BEP-2 与 BEP-20 标准的核心区别,以及如何通过 REST API 以编程方式创建币安智能链的充值地址,并提供完整的代码验证示例。
BEP20 地址是 BNB 智能链(BSC)上的账户地址,该网络在 2022 年 2 月更名之前一直被称为币安智能链。它以 0x 开头,长度为 42 个字符,使用与以太坊地址完全相同的格式。如果您的代码能够处理以太坊地址,那么无需修改任何一行代码,就能处理 BEP20 地址。
这听起来似乎就是全部内容,但在实践中有两个细节容易让人产生困惑。首先,BEP20 常与 BEP-2 相混淆,后者是一种较旧的币安标准,采用完全不同的地址格式。其次,同一个 0x 地址会同时存在于每一条 EVM 链上,这在您发送代币时会带来实际的后果。本指南将介绍该地址格式、EIP-55 校验和、验证代码,以及如何以编程方式创建 BSC 地址。
格式:0x 加 40 个十六进制字符
一个 BEP20 地址将 20 字节(160 位)编码为十六进制文本:
0x71C7656EC7ab88b098defB751B7401B5f6d8976F三项检查可以告诉您一个字符串是否可能是一个地址:
- 它以前缀
0x开头。 - 前缀后紧跟恰好 40 个字符。
- 这些字符中的每一个都是十六进制数字:
0–9、a–f或A–F。
代币并没有单独的地址类型。像 USDT、USDC 或 CAKE 这样的 BEP20 代币,发送到的是与持有 BNB 相同的那些 42 字符账户地址。您用于 BNB 的币安智能链钱包地址,与您用于代币的 BEP20 地址,是同一个字符串。
这 20 字节是从哪里来的?一个账户始于 secp256k1 曲线上的一个随机私钥,这与比特币和以太坊使用的曲线相同。从该密钥派生出的公钥会使用 Keccak-256 进行哈希运算,而哈希结果的最后 20 字节就成为该地址。这个过程不涉及任何地方的注册。地址在数学运算完成的那一刻便已存在,甚至早于该链见证从它发出的第一笔交易。
为什么它看起来和以太坊地址一模一样
BSC 于 2020 年 9 月作为一条兼容 EVM 的链上线。它运行以太坊虚拟机,因此完整继承了以太坊的账户模型、密钥派生方式以及地址格式。BEP-20 本身就是 BSC 对以太坊 ERC-20 代币标准的移植;函数名称(transfer、balanceOf、approve)完全相同。
这两个网络之间唯一的技术区分是链 ID:BSC 主网为 56,以太坊主网为 1,BSC 测试网为 97。链 ID 会被写入每一笔交易签名中,这可以阻止为一条链签名的交易在另一条链上被重放。地址本身完全不携带任何链信息。您无法仅凭查看 0x71C7...976F,就判断其所有者是在 BSC、以太坊,还是两者上使用它。
BEP-20 与 ERC-20、TRC-20 的并列对比
稳定币支付通过三个网络触达真实的企业,而大多数因资金丢失而产生的客服工单,都与这三者中两个被混淆有关。以下是截至 2026 年年中,它们之间真正的差异:
| BEP-20(BNB 智能链) | ERC-20(以太坊) | TRC-20(TRON) | |
|---|---|---|---|
| 地址格式 | 0x + 40 个十六进制字符 | 0x + 40 个十六进制字符 | T + 33 个 Base58 字符 |
| 与您的以太坊地址是否为同一字符串 | 是 | — | 否 |
| 校验和 | EIP-55 字母大小写,可选 | EIP-55 字母大小写,可选 | Base58Check,始终存在 |
| 出块时间 | 0.45 秒 | 12 秒 | 3 秒 |
| 达到最终确认的时间 | 1–2 秒 | 约 13–16 分钟(两个 epoch) | 约 57 秒(19 个区块) |
| 典型 USDT 转账手续费 | 几美分,以 BNB 支付 | 几十美分(以 ETH 计),网络拥堵时更高 | 若无质押能量,约 6.4–13.4 TRX |
有两行数据值得进一步关注。BEP-20 和 ERC-20 的地址行完全相同,因为 BSC 连校验和算法都照搬了以太坊的格式。一个能够接受其中一种地址的验证器,同样能够接受另一种,但无法告诉您用户实际指的是哪个网络;只有周围的上下文才能做到这一点。TRC-20 则是个例外。TRON 地址在 EVM 验证中会立刻失败,这听起来像是一种不便,但实际上是一种保护机制,因为一个粘贴错误的地址仅凭格式就会被拒绝,而不会有任何资金因此被转移出去。
速度方面的数字保质期很短;而地址格式行则不会过时。BSC 在八个月内两次将出块时间减半:Maxwell 硬分叉于 2025 年 6 月将其从 1.5 秒降至 0.75 秒,而 Fermi 硬分叉又在 2026 年 1 月带来了 0.45 秒的出块时间。TRON 多年来一直保持其 3 秒的出块间隔,而以太坊的路线图正在讨论为未来升级采用更短的时间槽。与此同时,这三种地址格式自各自链上线以来从未改变过。您今天编写的验证代码能够经受住每一次分叉的考验;但您今天打印出来的手续费表格,则需要持续维护。
在成本方面,对于普通的代币转账,BSC 目前是三者中最便宜的,TRON 是最可预测的(其手续费以能量单位固定,而非竞价),而以太坊在网络繁忙时则是最昂贵的。如果您的客户自行选择充值网络,请预计 BEP-20 和 TRC-20 将占主导地位,并据此规划您的手续费处理方案。
EIP-55 校验和:为什么有些字母是大写的
十六进制不区分大小写,因此 0xab... 和 0xAB... 指向的是同一个账户。EIP-55 于 2016 年为以太坊提出,并被 BSC 连同其他一切一并采纳,它将这种多余的自由度转化为一种错误检查机制。
规则如下:取该地址的小写形式(去掉 0x),用 Keccak-256 对其进行哈希运算,然后遍历这 40 个字符。如果某个位置对应的哈希数字是 8 或更大,则该位置的地址字母以大写形式书写;否则以小写形式书写。数字本身保持不变。
最终结果就是钱包和浏览器所显示的大小写混合形式。如果用户在输入带校验和的地址时打错了一个字符,大小写模式就不再与哈希匹配,验证便会失败,从而在任何资金转移之前就捕获这个输入错误。一个完全小写的地址在技术上仍然有效,只是不携带校验和,您的代码应将其视为未经验证的输入,而不是直接拒绝它。
一个完整推演的示例
EIP-55 自身的测试套件以这个地址作为开始。以小写形式呈现,去掉了 0x,旁边是这个 40 字符字符串的 Keccak-256 哈希值:
address: 5aaeb6053f3e94c9b9a09f33669435e7ef1beaedkeccak: d385650ce8fdc6db7ee3a091d34814dbc4ce18219ffae52182efff4034d707e5现在逐位进行比较。地址的第一个字符是 5,是一个数字,因此无论哈希值如何都保持为 5。第二个字符是 a,其上方对应的哈希数字是 3,小于 8,因此保持小写。第三个字符同样是 a,但这次对应的哈希数字是 8,因此变为 A。第四个字符 e 位于数字 5 之下,保持小写。将这一过程贯穿全部 40 个位置,您就会得到带校验和的形式:
0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed在实践中,有两个实现细节导致了大多数错误。哈希的输入是小写地址的 ASCII 文本,而不是它所编码的 20 个原始字节,也不是仍然带有 0x 前缀的字符串。只要在这两点上有一处出错,您计算出的每一个校验和都会是错误的。至于这一方案能提供多大程度的保护:EIP 本身估计平均每个地址约有 15 个校验位,这意味着一个输错的地址被漏检通过的概率约为 0.0247%,相当于四千个错误地址中才有一个会被误判为通过,而不是被保证接受。
BEP-2 与 BEP-20:两种标准,两种地址格式
这正是那种真正让用户损失了实际资金的混淆。币安过去曾并行运行两条链:
- BNB Beacon Chain,采用 BEP-2 代币标准,地址以
bnb1开头 - BNB Smart Chain,采用 BEP-20 标准,使用
0x地址
BEP-2 向交易所的充值还需要一个备注(memo)字段,而遗忘填写备注是一个典型的客服工单场景。这个时代已经结束:币安在 2024 年作为 BNB Chain Fusion 的一部分停用了 Beacon Chain,BEP-2 也随之一起停用。如果某篇教程向您介绍 bnb1 地址或备注字段,那么它已经过时了。如今,「BNB 地址」和「BSC 地址」在实践中指的就是 0x 格式的 BEP20 地址。
这个名称仍然保留在交易所的提现菜单中,网络通常被标注为「BSC (BEP20)」或「BNB Smart Chain (BEP20)」。当您看到这个标签时,目标地址必须是一个 0x 地址。
一个地址,多条链:为什么网络选择器很重要
由于 BSC 复制了以太坊的密钥派生方式,同一个私钥可以在以太坊、BSC、Polygon、Arbitrum 以及其他任何 EVM 链上控制同一个 0x 地址。这既方便又危险。
方便之处在于:拥有 MetaMask 或 Trust Wallet 账户的用户已经拥有一个 BEP20 地址。他们只需在钱包设置中添加 BSC 网络,现有地址便可直接使用。
危险之处在于:同名代币在不同链上作为独立的合约存在。BSC 上的 USDT 和以太坊上的 USDT 除了代号相同之外,没有任何共同之处。如果有人从交易所提现 USDT 时选错了网络,代币会到达正确的地址,但却在错误的链上。这时可能出现两种结果:
- 接收方掌握私钥(自托管钱包)。这种情况下不会有任何损失。他们只需将钱包切换到另一网络,就能在那里找到这些代币。
- 接收方是交易所或支付服务商的充值地址,而该地址只监控一条网络。这种情况下,代币会停留在一个无人监控的账户中。有些交易所会收取费用来找回此类充值,有些则不会。
对开发者而言,实用的规则是:始终在显示的地址旁边注明网络,并在您实际入账的那条链上验证收到的充值。仅凭一个地址字符串,本身在设计上就是含糊不清的。
如何在 MetaMask、Trust Wallet 和硬件钱包中找到您的 BEP20 地址
任何支持 EVM 的钱包,最终展示给您的都是同一样东西——一个 0x 地址,但获取它的路径略有不同。以下步骤刻意保持通用性,因为菜单标签会随应用版本的不同而变化。
MetaMask
MetaMask 最初只连接以太坊。要在 BSC 上使用它,需要添加 BNB 智能链作为网络(链 ID 56,货币为 BNB);当前版本已将其列入内置的网络目录中,因此无需手动输入 RPC 信息。您的账户地址显示在主视图顶部,点击一下即可复制。切换网络时,该地址不会改变。在网络菜单中选择 BSC,改变的是您交易发往的目的地,而不是您本身的身份。
Trust Wallet
Trust Wallet 原生支持 BSC。选择您期望接收的资产,例如 BNB 或标注为「BEP20」的代币,打开接收界面,应用会以文本和二维码的形式显示 0x 地址。每个代币旁边的网络标签,比地址本身更为重要:「USDT BEP20」和「USDT ERC20」在您的钱包中解析为同一个地址字符串,但它们告诉发送方应使用哪条链,而这恰恰是最容易出错的地方。
硬件钱包
使用 Ledger 或 Trezor 时,私钥永远不会离开设备,而 BSC 通过与以太坊相同的 EVM 集成方式运行。接收流程增加了一个值得保留的步骤:设备会在自己的屏幕上显示地址,您需要在分享地址之前,将其与电脑显示的内容进行比对。这一比对步骤能够挫败剪贴板恶意软件的攻击——这类恶意软件会篡改电脑上的地址,但无法触碰设备本身的屏幕。
无论您使用哪种钱包,复制得到的字符串都不携带任何网络信息。当您将其粘贴到交易所的提现表单中时,旁边的网络下拉菜单才是决定因素,因此请检查它是否显示为 BSC 或 BEP20。
一个助记词,多个地址:两分钟了解 HD 钱包
现代钱包并不会保存一堆互不相关的密钥。它们遵循三项相互叠加的标准,从一个种子(seed)中派生出一切。BIP-39 将 12 或 24 个词典单词转化为一个种子。BIP-32 从这个种子中生长出一棵确定性的密钥对树,因此相同的助记词总会生成相同的树。BIP-44 则规定了哪个分支属于哪种币种,以派生路径的形式书写。
对于以太坊,注册的路径是 m/44'/60'/0'/0/0,其中 60 是币种类型。BSC 从未注册过属于自己的币种类型;钱包重复使用了 60,这正是您的钱包在 BSC、以太坊、Polygon 和 Arbitrum 上显示相同地址的技术原因。路径中的最后一个数字是索引。将其递增,钱包就会从相同的助记词中派生出第二个地址,接着是第三个,而无需任何新的备份。
由此产生两个结果。在任何 BIP-44 钱包中恢复助记词,都能重新生成您曾经派生过的每一个地址,因此这些助记词就是备份——是全部的备份。而一个需要成千上万个充值地址的平台,理论上可以将它们全部从一个种子中派生出来,不过生产环境的配置通常会单独生成每个密钥并通过 API 进行注册,这样就不会有单一的秘密同时控制所有客户的充值。
在 BscScan 上核对地址
BscScan 是 BSC 的区块浏览器,在上面花三十秒钟,就能回答大多数「这笔交易成功了吗?」的问题。
将任意地址粘贴到搜索框中,您就会进入其账户页面:BNB 余额、代币持有情况、交易列表。对于您刚创建的充值地址,显示空白页面是正常现象。该地址作为数学结果已经存在;而浏览器只有在第一笔转账触及它之后,才会有内容可以展示。
留意页面顶部附近的标签。带有「Contract」标签的账户是智能合约,代币合约也包含在内。资金应该流向普通地址,因此如果交易对手要求您向一个合约地址付款,请先停下来问清楚原因。
代币验证是第三种用途。任何人都可以在 BSC 上部署一个名为「USDT」的代币,搜索结果会将假冒代币与真实代币并列显示。代号本身不能证明任何事;合约地址才可以。将其与代币发行方公布的地址进行比对,然后再查看该代币页面上的持有人数量和已验证的源代码作为辅助信号。假冒代币很少能把这些细节也一并伪造得天衣无缝。
在完成一笔测试交易后,应改为搜索交易哈希。详情页面会显示发送方、接收方、代币合约以及金额,这些信息共同确认了资金是否按照您的预期,发送到了您预期的那条链上。
发送之前:一套避免高昂代价错误的简短流程
三个习惯几乎能覆盖 BEP20 转账出错的所有方式。
将网络标签与地址所处的时代相匹配。所有当前有效的说法都是「BSC (BEP20)」,对应 0x 目标地址。如果某份指南、表单或交易对手提到了 bnb1 地址或充值备注,那描述的是 BEP-2,该标准已随 2024 年 Beacon Chain 一同停用。请将这类说明视为过时信息,而不是一种替代选项。
请将提现表单读两遍:一遍核对地址,一遍核对网络下拉菜单。地址字段验证的是格式,下拉菜单决定的是链,而没有任何验证器能够检测出「地址正确但网络错误」这种情况。这正是前文所述的失败模式,而且它发生在发送方这一侧,这意味着您可以在这里就将其提前预防。
向每一个新地址发送一笔测试金额。在 BSC 上,这一习惯只需花费几美分和一两秒的等待时间,因此没有任何经济上的理由不这样做。在 BscScan 上确认测试交易后,再发送剩余款项。处理支付业务的团队通常会将这一习惯制度化:新的支付地址只有在一笔已确认的测试转账之后,才会被加入白名单。
在代码中验证 BEP20 地址
格式检查是一个简单的正则表达式。用 JavaScript 编写:
function isValidFormat(address) { return /^0x[0-9a-fA-F]{40}$/.test(address);}校验和检查则需要用到 Keccak-256,例如来自 @noble/hashes:
import { keccak_256 } from "@noble/hashes/sha3";import { bytesToHex } from "@noble/hashes/utils";
function toChecksumAddress(address) { const addr = address.toLowerCase().replace("0x", ""); const hash = bytesToHex(keccak_256(addr)); let out = "0x"; for (let i = 0; i < 40; i++) { out += parseInt(hash[i], 16) >= 8 ? addr[i].toUpperCase() : addr[i]; } return out;}
function hasValidChecksum(address) { return toChecksumAddress(address) === address;}在 PHP 中,正则表达式足以完成格式检查,而 kornrunner/keccak 这个包则覆盖了校验和的计算:
use kornrunner\Keccak;
function isValidBep20Address(string $address): bool{ if (preg_match('/^0x[0-9a-fA-F]{40}$/', $address) !== 1) { return false; } $hex = substr($address, 2); // All one case: format-valid, but no checksum to verify if ($hex === strtolower($hex) || $hex === strtoupper($hex)) { return true; } $hash = Keccak::hash(strtolower($hex), 256); for ($i = 0; $i < 40; $i++) { $expectUpper = intval($hash[$i], 16) >= 8; if (ctype_alpha($hex[$i]) && $expectUpper !== ctype_upper($hex[$i])) { return false; } } return true;}请注意,通过这项检查只能证明该字符串格式正确。它无法证明有人确实持有对应的私钥,也无法告诉您发送方打算使用哪条网络。
通过 API 创建 BSC 地址
如果您运营的是一家商店、一款 SaaS 产品,或是一个类似交易所的平台,您需要的不只是一个地址:通常是每位客户对应一个充值地址,以便区分不同的入账。手动在钱包应用中完成这项工作,无法扩展到超过少数几个用户的规模。
借助 Chaingateway 的 REST API,您可以在自己的环境中生成密钥,并将其注册到 BSC 上使用。身份验证使用 Authorization 请求头中的 Bearer 令牌:
curl -X POST https://app.chaingateway.io/api/v2/bsc/addresses/import \ -H "Authorization: Bearer <API_KEY>" \ -H "Content-Type: application/json" \ -d '{ "address": "0xYourGeneratedBscAddress", "privatekey": "<generated secp256k1 private key, hex>", "password": "<encryption password for this key>" }'添加请求头 X-Network: testnet,同样的调用就会在 BSC 测试网(链 ID 97)上运行,这样您就可以先用免费的测试 BNB 完整跑通整个流程,再接触主网。之后发送 BEP20 代币则通过 POST /api/v2/bsc/transactions/bep20 完成。
一次免费的 7 天试用就足以完成构建和测试;开始使用无需经过 KYC 流程。配置步骤请参见快速入门指南,各套餐方案则列在价格页面上。
每位客户对应一个充值地址,外加 Webhook
地址只是支付流程的一半。另一半是要在不自行轮询链上数据的情况下,得知资金已经到账。其模式如下:
- 当客户发起一笔付款时,为其分配一个专属的 BSC 地址,并将地址与客户的对应关系存储在您的数据库中。
- 为该地址注册一个 Webhook。当一笔 BEP20 转账到达该地址时,Chaingateway 会携带交易详情调用您的接口端点。
- 验证该 Webhook 的 HMAC 签名,然后在您自己的系统中为该客户入账。
Webhook 的投递内容经过 HMAC 签名,因此您可以拒绝伪造的调用请求。您的服务器错过的投递也不会因此丢失:GET /api/v2/bsc/webhooks/notifications/failed 会列出这些失败记录,而 POST /api/v2/bsc/webhooks/notifications/{id}/retry 可以重新发送某一条。如果您的服务器曾经宕机,GET /api/v2/bsc/webhooks/notifications 会返回过往的通知记录,因此在故障恢复后进行核对只需一次 API 调用即可完成。完整的设置流程,包括签名验证,请参见 Webhook 指南。
同样的模式也适用于 TRON,只是那里的地址格式完全不同;有关这方面的内容,请参见什么是 TRC20 地址?。
常见问题
BEP20 地址和以太坊地址是同一种地址吗?
格式相同:0x 加上 40 个十六进制字符,以相同方式从 secp256k1 密钥派生而来。同一个私钥甚至可以在两个网络上控制同一个地址字符串。但余额是按链分开的。在 BSC 上持有 100 USDT,并不能说明您在以太坊上的余额情况。
我如何获得一个 BEP20 钱包地址?
个人使用时,在任何支持 BSC 的钱包(添加了 BSC 网络的 MetaMask、Trust Wallet,或硬件钱包)中创建账户,它就会显示您的 0x 地址。对于需要大量地址的应用程序,请以编程方式生成密钥,并通过 API 注册,例如使用 POST /api/v2/bsc/addresses/import。
如果我把 BEP20 代币发送到以太坊地址会怎样?
交易会成功,因为每一个以太坊格式的地址在 BSC 上同样有效。代币会到达 BSC 上的该地址。如果所有者掌握私钥,他们可以在钱包中添加 BSC 网络并访问这些代币。如果这是一个只监控以太坊的交易所充值地址,代币就会滞留,您将不得不依赖该交易所的找回流程。
BEP-2 和 BEP-20 有什么区别?
BEP-2 是已停用的 BNB Beacon Chain 的代币标准,使用 bnb1... 开头的地址,并带有备注(memo)字段。BEP-20 是 BNB 智能链上类似 ERC-20 的标准,使用 0x... 地址。自 2024 年 Beacon Chain 关闭以来,BEP-20 在实践中是唯一还有意义的标准。
BEP20 地址区分大小写吗?
不区分。同一组十六进制数字无论大小写如何书写,都指向同一个账户。您看到的大小写混合模式,正是 EIP-55 校验和:它将错误检查编码进字母的大小写中,以便钱包能在发送前捕获输入错误。
接收 BEP20 代币需要 BNB 吗?
不需要。发送方支付 Gas 费,因此接收不会产生任何费用。当您想要转出这些代币时,才需要用到 BNB:一次 BEP20 转账大约消耗 65,000 Gas,以 BNB 支付,截至 2026 年年中大约相当于几美分。一个持有 USDT 但 BNB 余额为零的钱包是一个典型的支持案例;这些代币会一直静止不动,直到有少量 BNB 到账以支付手续费。
一笔 BEP20 转账需要多长时间?
自 2026 年 1 月 Fermi 硬分叉以来,BSC 每 0.45 秒生成一个区块,最终确认在大约一秒钟内完成。一次钱包到钱包的转账,在您切换标签页之前就已经完成。交易所会在此基础上叠加自己的确认要求,因此充值入账的时间可能晚于链上最终确认的时间。
我如何判断 BSC 上的某个代币是不是真的?
请检查合约地址,而不是名称或图标。将 BscScan 上显示的合约地址与发行方在其官方网站上公布的地址进行比对,并将持有人数量和已验证的源代码作为辅助判断信号。一个代号正确、只有几十个持有人且代码未经验证的代币,就是仿冒品。
准备好自己动手构建了吗? 获取你的 API key — 7 天试用,无需信用卡 — 或查看 Binance Smart Chain API 获取完整的 endpoint 参考。