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_...
知识检查点