Day 5
AENS 域名系统
中级阶段 · 预计学习时间 3-4 小时
学习目标
- 理解域名注册流程(Preclaim → Claim)
- 注册 .chain 域名
- 更新域名指针
AENS 概述
AENS(Aeternity Naming System)允许注册人类可读的域名(如 myname.chain),指向账户、合约或预言机地址。
域名生命周期
| 步骤 | 说明 |
|---|---|
| 1. Preclaim | 提交域名承诺哈希(防止抢注) |
| 2. Claim | 揭示域名,完成注册 |
| 3. Update | 设置域名指向的地址 |
Commit-Reveal 机制: Preclaim 不暴露域名,防止他人在你广播后抢先注册。
Preclaim(预声明)
name := "mysupername.chain"
// 创建 Preclaim 交易
// 返回交易和一个随机 salt(必须保存用于 Claim)
preclaimTx, salt, err := transactions.NewNamePreclaimTx(
alice.Address,
name,
ttlnoncer,
)
if err != nil {
log.Fatal(err)
}
// 签名和广播(与 SpendTx 相同模式)
signedTx, txHash, _, _ := transactions.SignHashTx(alice, preclaimTx, config.Node.NetworkID)
txStr, _ := transactions.SerializeTx(signedTx)
node.PostTransaction(txStr, txHash)
fmt.Printf("Preclaim 发送成功: %s\n", txHash)
fmt.Printf("⚠️ 保存 Salt: %x\n", salt) // 必须保存!
Claim(声明)
Preclaim 被打包后(等待至少 1 个区块),可以提交 Claim 交易。
// 等待 Preclaim 确认...
time.Sleep(5 * time.Second)
// 域名费用(短域名费用更高)
nameFee := big.NewInt(0) // SDK 会自动计算
// 创建 Claim 交易(使用之前保存的 salt)
claimTx, err := transactions.NewNameClaimTx(
alice.Address,
name,
salt, // Preclaim 时保存的 salt
nameFee,
ttlnoncer,
)
if err != nil {
log.Fatal(err)
}
// 签名和广播...
signedTx, txHash, _, _ := transactions.SignHashTx(alice, claimTx, config.Node.NetworkID)
txStr, _ := transactions.SerializeTx(signedTx)
node.PostTransaction(txStr, txHash)
fmt.Printf("✅ 域名注册成功: %s\n", name)
Update(更新指针)
域名注册后,设置它指向的地址。
// 创建指针(指向账户地址)
pointer, err := transactions.NewNamePointer("account_pubkey", alice.Address)
if err != nil {
log.Fatal(err)
}
// 指针列表
pointers := []*transactions.NamePointer{pointer}
// ClientTTL: 客户端缓存时间
clientTTL := uint64(50)
// 创建 Update 交易
updateTx, err := transactions.NewNameUpdateTx(
alice.Address,
name,
pointers,
clientTTL,
ttlnoncer,
)
if err != nil {
log.Fatal(err)
}
// 签名和广播...
signedTx, txHash, _, _ := transactions.SignHashTx(alice, updateTx, config.Node.NetworkID)
txStr, _ := transactions.SerializeTx(signedTx)
node.PostTransaction(txStr, txHash)
fmt.Printf("✅ 域名指针已更新\n")
fmt.Printf("%s → %s\n", name, alice.Address)
指针类型
| 类型 | 用途 | 地址前缀 |
|---|---|---|
account_pubkey | 账户地址 | ak_... |
contract_pubkey | 合约地址 | ct_... |
oracle_pubkey | 预言机地址 | ok_... |
知识检查点