发行代币
任何账户都可以用一笔 IssueToken 交易在 ZooBC 上创建自己的代币。无需编写合约,也无需征得任何人同意:交易是否有效由链上固定的规则决定,一旦某个区块打包了它,代币即告存在,发行方持有其全部供应量。此后,代币的单位通过 TransferToken 转移,可以存放在托管、流式支付、定时转账和兑换报价中;若有 8 位小数,还可以用于市场上的订单。
IssueToken 交易
IssueToken(类型 10)指定:
| 字段 | 规则 |
|---|---|
| 小数位数 | 0 到 8(见 小数位数与步长) |
| 标志 | 可赎回,以及增发模式(见下文) |
| 总供应量 | 大于 0,且为代币步长的整数倍 |
| ZBC 储备 | 0 或更多 |
| 符号 | 2 到 10 个字符(见下文) |
| 名称 | 1 到 64 字节(见下文) |
| 续存付款 | 可选(见 代币维护费(存续)) |
标志由若干位组成。第 0 位使代币可赎回。第 1 位和第 2 位设定增发模式:0 表示固定供应量,1 表示可增发代币;值 2 和 3 会被拒绝。第 3 位“unbacked”(无储备)会被存储和报告,但没有任何规则读取它。这两个开关各自允许做什么,见 铸造与销毁代币。
由账户组成员发行的代币属于该组。
储备
储备是发行方注入代币的真实 ZBC。这些 ZBC 离开发行方的余额,由代币本身持有,不在任何人的账户中;发行方并未持有的储备会被节点拒绝。这些 ZBC 只能通过三种方式重新流出:
- 流向销毁可赎回代币单位的持有者;
- 作为以该代币支付手续费时释放的 ZBC(见下文);
- 在代币到期时流向持有者(见 代币维护费(存续))。
代币 id
用户代币的 id 是其 IssueToken 交易哈希的前 8 个字节,按小端序有符号 64 位整数读取(如果该数为 0,则取 1)。因此,它就是发行交易自身的 id(见 签署交易)。交易一经签名,id 即已确定,节点之间永远不需要就某个计数器达成一致。API 以有符号十进制字符串输出 id,因此 id 可能为负数。
符号并不唯一:两种仍然有效的代币可以使用同一个符号,任何人都可以复制一个既未被保留也未被禁止的符号。钱包和应用应当显示并检查 id,而不只是符号(见 链上数据是不可信的输入)。
符号和名称的规则
符号有 2 到 10 个字符,每个字符都是 A 到 Z 的大写字母或 0 到 9 的数字。这就排除了小写字母,以及来自其他字母表的形近字母。另有两条规则保护知名名称:
- 保留:以 Z 开头或结尾的 4 或 5 个字符的符号,例如 ZBTC 或 BTCZ,属于跨链桥的命名空间。像 ZABCDE 这样的 6 个字符的符号是允许的。
- 禁止:一份内置清单列出了任何人都不得冒充的 78 个知名代号:17 种货币(例如 USD、EUR、CNY 和 JPY)、18 种稳定币(例如 USDT、USDC 和 DAI)以及 43 种主要币种(例如 BTC、ETH、BNB、SOL、XRP、ADA 和 DOGE)。
名称是 1 到 64 字节的有效 UTF-8。它不得包含字符 <、>、" 和 ' 或反引号;不得包含控制字符、零宽字符或改变文字方向的字符,也不得包含普通空格以外的任何空格字符;并且不得以空格开头或结尾。
转移单位:TransferToken
TransferToken(类型 11)携带代币 id、一个为步长整数倍的数量、接收方、一个以代币支付手续费的可选标志,以及一笔可选的续存付款。代币 id 0 会被拒绝:ZBC 不是代币,它通过 SendZBC 转移。转移的单位多于发送方所持有数量的交易是付费空操作:它支付手续费,但不转移任何东西。
代币转账也可以托管(见 托管;此时手续费以 ZBC 支付)、流式支付(见 流动支付(流式支付))或定时发放(见 定时转账)。从 0.5.8 版本起,一笔交易可以作为批量交易携带最多 32 笔代币转账,代币种类不限:要么全部执行、要么全部不执行,手续费为各笔单次转账手续费之和,以 ZBC 支付,消息只计费一次(见 每个账户每个区块一笔交易与批量交易)。
以代币支付手续费
有 ZBC 储备的代币可以为自己的转账付费(标志字节为 1)。代币从储备中释放 ZBC 来支付下限,并交出相应数量的单位:
units given up = ceil( released ZBC × supply ÷ backing ), rounded up to the step
供应量和储备都会减少。如果申报的手续费高于下限,多付部分留在代币中。