
适用范围:以太坊与 ERC-20
以下解释适用于以太坊账户模型及 ERC-20 代币接口。其他区块链可能采用不同的地址格式和账户规则,不能仅凭“合约地址”这一名称套用全部细节。
合约地址、账户和钱包
Ethereum 账户文档区分外部账户与合约账户:前者由私钥控制,后者依代码逻辑运行。合约地址标识合约账户,通常写成 0x 加上 40 个十六进制字符。钱包则是与账户交互的应用或界面。

因此,“地址”“账户”“钱包”分别对应标识、链上实体和交互工具。外部账户与合约账户的地址外观相似,仅看字符串长度无法判断它属于哪类账户。

nonce、CREATE2 和 salt
常规 CREATE 部署通过创建者地址及其 nonce 派生合约地址;nonce 是与账户活动有关的计数。CREATE2 则使用创建者地址、指定的 salt 和创建代码的哈希派生地址。salt 可理解为参与计算的选定值。
这里的“派生”指按规则计算。CREATE2 允许预先计算地址,所以“已经知道地址”和“合约已经部署”是两个不同判断。地址计算结果本身不能证明该位置已有可运行的合约。
代币合约地址与余额
OpenZeppelin 的 ERC-20 文档说明,代币合约记录同质化代币的余额。name 和 symbol 分别表示名称与符号,balanceOf 用于查询某个地址的余额,decimals 表示展示时使用的小数位数。
可以把代币合约理解为维护余额记录的程序:合约地址定位这套程序,持有者地址用于查找其中的余额记录。因此,代币合约地址与持有者地址承担不同角色,不能混为一谈。
常见问题:精度和控制权
decimals 会让余额增加吗?它规定整数如何换算成界面上的数量,不会因显示出小数就新增代币。理解余额时,需要把原始整数与展示精度结合起来;单看原始数值,容易误读数量。
知道合约地址就能控制合约吗?地址只是定位信息,不代表操作权限。合约账户没有用于直接签名的自身私钥,某项调用能否执行取决于代码逻辑。公开可见的地址与获准执行的操作,是两个独立概念。