Управление TON DNS
Этот раздел предоставляет полное руководство по управлению DNS-записями и поддоменами TON с использованием библиотеки tonutils
. Описаны действия по установке различных DNS-записей, развёртыванию и выпуск поддоменов как NFT, а также работе с коллекциями поддоменов и простыми менеджерами поддоменов.
Note
Для практического примера создания и управления поддоменами TON см. Рецепты: Выпуск Поддоменов TON.
Установка записей
Установка Site записи
from tonutils.client import ToncenterV3Client
from tonutils.dns.contract import DNS
from tonutils.wallet import WalletV4R2
# Set to True for test network, False for main network
IS_TESTNET = True
# Mnemonic phrase
MNEMONIC = "word1 word2 word3 ..."
# The address of the NFT domain where the site record will be set
NFT_DOMAIN_ADDRESS = "EQ..."
# The ADNL address that will be set in the DNS record
ADNL_ADDRESS = "{hex}"
async def main() -> None:
client = ToncenterV3Client(is_testnet=IS_TESTNET, rps=1, max_retries=1)
wallet, _, _, _ = WalletV4R2.from_mnemonic(client, MNEMONIC)
body = DNS.build_set_site_record_body(ADNL_ADDRESS)
tx_hash = await wallet.transfer(
destination=NFT_DOMAIN_ADDRESS,
amount=0.02,
body=body,
)
print("Site record set successfully!")
print(f"Transaction hash: {tx_hash}")
if __name__ == "__main__":
import asyncio
asyncio.run(main())
Установка Wallet записи
from pytoniq_core import Address
from tonutils.client import ToncenterV3Client
from tonutils.dns.contract import DNS
from tonutils.wallet import WalletV4R2
# Set to True for test network, False for main network
IS_TESTNET = False
# Mnemonic phrase
MNEMONIC = "word1 word2 word3 ..."
# The address of the NFT domain where the wallet record will be set
NFT_DOMAIN_ADDRESS = "EQ..."
# The address of the wallet that will be set in the DNS record
WALLET_ADDRESS = "UQ..."
async def main() -> None:
client = ToncenterV3Client(is_testnet=IS_TESTNET, rps=1, max_retries=1)
wallet, _, _, _ = WalletV4R2.from_mnemonic(client, MNEMONIC)
body = DNS.build_set_wallet_record_body(Address(WALLET_ADDRESS))
tx_hash = await wallet.transfer(
destination=NFT_DOMAIN_ADDRESS,
amount=0.02,
body=body,
)
print("Wallet record set successfully!")
print(f"Transaction hash: {tx_hash}")
if __name__ == "__main__":
import asyncio
asyncio.run(main())
Установка Storage записи
from tonutils.client import ToncenterV3Client
from tonutils.dns.contract import DNS
from tonutils.wallet import WalletV4R2
# Set to True for test network, False for main network
IS_TESTNET = True
# Mnemonic phrase
MNEMONIC = "word1 word2 word3 ..."
# The address of the NFT domain where the storage record will be set
NFT_DOMAIN_ADDRESS = "EQ..."
# The hex-encoded BAG ID for the storage record
BAG_ID = "{hex}"
async def main() -> None:
client = ToncenterV3Client(is_testnet=IS_TESTNET, rps=1, max_retries=1)
wallet, _, _, _ = WalletV4R2.from_mnemonic(client, MNEMONIC)
body = DNS.build_set_storage_record_body(BAG_ID)
tx_hash = await wallet.transfer(
destination=NFT_DOMAIN_ADDRESS,
amount=0.02,
body=body,
)
print("Storage record set successfully!")
print(f"Transaction hash: {tx_hash}")
if __name__ == "__main__":
import asyncio
asyncio.run(main())
Установка Next Resolver записи
from pytoniq_core import Address
from tonutils.client import ToncenterV3Client
from tonutils.dns.contract import DNS
from tonutils.wallet import WalletV4R2
# Set to True for test network, False for main network
IS_TESTNET = False
# Mnemonic phrase
MNEMONIC = "word1 word2 word3 ..."
# The address of the NFT domain where the next resolver record will be set
NFT_DOMAIN_ADDRESS = "EQ..."
# The address of the contract to be set as the next resolver
CONTRACT_ADDRESS = "EQ..."
async def main() -> None:
client = ToncenterV3Client(is_testnet=IS_TESTNET, rps=1, max_retries=1)
wallet, _, _, _ = WalletV4R2.from_mnemonic(client, MNEMONIC)
body = DNS.build_set_next_resolver_record_body(Address(CONTRACT_ADDRESS))
tx_hash = await wallet.transfer(
destination=NFT_DOMAIN_ADDRESS,
amount=0.02,
body=body,
)
print("Next resolver record set successfully!")
print(f"Transaction hash: {tx_hash}")
if __name__ == "__main__":
import asyncio
asyncio.run(main())
Коллекция поддоменов
Развёртывание коллекции
from tonutils.client import ToncenterV3Client
from tonutils.dns import DNS
from tonutils.dns.subdomain_collection import SubdomainCollection
from tonutils.dns.subdomain_collection.content import SubdomainCollectionContent
from tonutils.dns.subdomain_collection.data import FullDomain
from tonutils.nft.royalty_params import RoyaltyParams
from tonutils.wallet import WalletV4R2
from tonutils.wallet.messages import TransferMessage
# Set to True for test network, False for main network
IS_TESTNET = True
# Mnemonic phrase
MNEMONIC = "word1 word2 word3 ..."
# NFT domain name and address from TON DNS Domains
# Obtainable from https://dns.ton.org/ or https://dns.ton.org/?testnet=true
DOMAIN_NAME = "ghost" # ghost → ghost.ton
DOMAIN_ADDRESS = "EQ..."
# Royalty parameters: base and factor for calculating the royalty
ROYALTY_BASE = 1000
ROYALTY_FACTOR = 55 # 5.5% royalty
# The base URL of the API for generating metadata for NFTs.
# API source code: https://github.com/nessshon/subdomains-toolbox
API_BASE_URL = "https://dns.ness.su/api/ton/"
# Metadata for the NFT collection
COLLECTION_METADATA = {
"name": f"{DOMAIN_NAME.title()} DNS Domains",
"image": f"{API_BASE_URL}{DOMAIN_NAME}.png",
"description": f"*.{DOMAIN_NAME}.ton domains",
"prefix_uri": API_BASE_URL,
}
"""
{
"name": "Ghost DNS Domains",
"image": "https://dns.ness.su/api/ton/ghost.png",
"description": "*.ghost.ton domains",
"prefix_uri": "https://dns.ness.su/api/ton/"
}
"""
async def main() -> None:
client = ToncenterV3Client(is_testnet=IS_TESTNET, rps=1, max_retries=1)
wallet, _, _, _ = WalletV4R2.from_mnemonic(client, MNEMONIC)
collection = SubdomainCollection(
owner_address=wallet.address,
content=SubdomainCollectionContent(**COLLECTION_METADATA),
royalty_params=RoyaltyParams(
base=ROYALTY_BASE,
factor=ROYALTY_FACTOR,
address=wallet.address,
),
full_domain=FullDomain(DOMAIN_NAME, "ton"),
)
tx_hash = await wallet.batch_transfer_messages(
[
# Deploy collection
TransferMessage(
destination=collection.address,
amount=0.05,
body=collection.build_deploy_body(),
state_init=collection.state_init,
),
# Binding a Subdomain Collection to the main domain
TransferMessage(
destination=DOMAIN_ADDRESS,
amount=0.05,
body=DNS.build_set_next_resolver_record_body(collection.address),
),
]
)
print(f"Successfully deployed Subdomain Collection at address: {collection.address.to_str()}")
print(f"Transaction hash: {tx_hash}")
if __name__ == "__main__":
import asyncio
asyncio.run(main())
Выпуск NFT поддомена
from tonutils.client import ToncenterV3Client
from tonutils.wallet import WalletV4R2
# Set to True for test network, False for main network
IS_TESTNET = True
# Mnemonic phrase
MNEMONIC = "word1 word2 word3 ..."
# Address of the Subdomain Collection contract
SUBDOMAIN_COLLECTION_ADDRESS = "EQ..."
# The name of the subdomain to be minted
SUBDOMAIN_NAME = "alice" # alice → alice.ghost.ton
async def main() -> None:
client = ToncenterV3Client(is_testnet=IS_TESTNET, rps=1, max_retries=1)
wallet, _, _, _ = WalletV4R2.from_mnemonic(client, MNEMONIC)
tx_hash = await wallet.transfer(
destination=SUBDOMAIN_COLLECTION_ADDRESS,
amount=0.1,
body=SUBDOMAIN_NAME,
)
print(f"Successfully minted subdomain {SUBDOMAIN_NAME}!")
print(f"Transaction hash: {tx_hash}")
if __name__ == "__main__":
import asyncio
asyncio.run(main())
Менеджер поддоменов
Развёртывание менеджера
from pytoniq_core import Address
from tonutils.client import ToncenterV3Client
from tonutils.dns import DNS
from tonutils.dns.subdomain_manager import SubdomainManager
from tonutils.wallet import WalletV4R2
from tonutils.wallet.messages import TransferMessage
# Set to True for test network, False for main network
IS_TESTNET = False
# Mnemonic phrase
MNEMONIC = "word1 word2 word3 ..."
# The address of the administrator for managing the Subdomain Manager
ADMIN_ADDRESS = "UQ..."
# NFT domain address from TON DNS Domains
# Obtainable from https://dns.ton.org/ or https://dns.ton.org/?testnet=true
DOMAIN_ADDRESS = "EQ..."
async def main() -> None:
client = ToncenterV3Client(is_testnet=IS_TESTNET, rps=1, max_retries=1)
wallet, _, _, _ = WalletV4R2.from_mnemonic(client, MNEMONIC)
subdomain_manager = SubdomainManager(Address(ADMIN_ADDRESS))
tx_hash = await wallet.batch_transfer_messages(
[
# Deploy collection
TransferMessage(
destination=subdomain_manager.address,
amount=0.05,
state_init=subdomain_manager.state_init,
),
# Binding a Subdomain Manager to the main domain
TransferMessage(
destination=DOMAIN_ADDRESS,
amount=0.05,
body=DNS.build_set_next_resolver_record_body(subdomain_manager.address),
),
]
)
print(f"Successfully deployed Subdomain Manager at address: {subdomain_manager.address.to_str()}")
print(f"Transaction hash: {tx_hash}")
if __name__ == "__main__":
import asyncio
asyncio.run(main())
Установка Site записи
from tonutils.client import ToncenterV3Client
from tonutils.dns.subdomain_manager import SubdomainManager
from tonutils.wallet import WalletV4R2
# Set to True for test network, False for main network
IS_TESTNET = True
# Mnemonic phrase
MNEMONIC = "word1 word2 word3 ..."
# The address of the subdomain manager contract
SUBDOMAIN_MANAGER_ADDRESS = "EQ..."
# The ADNL address to be set for the subdomain
ADNL_ADDRESS = "{hex}"
# The subdomain to be registered
SUBDOMAIN = "example"
async def main() -> None:
client = ToncenterV3Client(is_testnet=IS_TESTNET, rps=1, max_retries=1)
wallet, _, _, _ = WalletV4R2.from_mnemonic(client, MNEMONIC)
body = SubdomainManager.build_set_site_record_body(SUBDOMAIN, ADNL_ADDRESS)
tx_hash = await wallet.transfer(
destination=SUBDOMAIN_MANAGER_ADDRESS,
amount=0.02,
body=body,
)
print("Subdomain successfully registered and site record set!")
print(f"Transaction hash: {tx_hash}")
if __name__ == "__main__":
import asyncio
asyncio.run(main())
Установка Wallet записи
from pytoniq_core import Address
from tonutils.client import ToncenterV3Client
from tonutils.dns.subdomain_manager import SubdomainManager
from tonutils.wallet import WalletV4R2
# Set to True for test network, False for main network
IS_TESTNET = True
# Mnemonic phrase
MNEMONIC = "word1 word2 word3 ..."
# The address of the subdomain manager contract
SUBDOMAIN_MANAGER_ADDRESS = "EQ..."
# The address of the wallet to be set for the subdomain
WALLET_ADDRESS = "UQ..."
# The subdomain to be registered
SUBDOMAIN = "example"
async def main() -> None:
client = ToncenterV3Client(is_testnet=IS_TESTNET, rps=1, max_retries=1)
wallet, _, _, _ = WalletV4R2.from_mnemonic(client, MNEMONIC)
body = SubdomainManager.build_set_wallet_record_body(SUBDOMAIN, Address(WALLET_ADDRESS))
tx_hash = await wallet.transfer(
destination=SUBDOMAIN_MANAGER_ADDRESS,
amount=0.02,
body=body,
)
print("Subdomain successfully registered and wallet set!")
print(f"Transaction hash: {tx_hash}")
if __name__ == "__main__":
import asyncio
asyncio.run(main())
Установка Storage записи
from tonutils.client import ToncenterV3Client
from tonutils.dns.subdomain_manager import SubdomainManager
from tonutils.wallet import WalletV4R2
# Set to True for test network, False for main network
IS_TESTNET = True
# Mnemonic phrase
MNEMONIC = "word1 word2 word3 ..."
# The address of the subdomain manager contract
SUBDOMAIN_MANAGER_ADDRESS = "EQ..."
# The ID of the storage bag to be set for the subdomain
BAG_ID = "{hex}"
# The subdomain to be registered
SUBDOMAIN = "example"
async def main() -> None:
client = ToncenterV3Client(is_testnet=IS_TESTNET, rps=1, max_retries=1)
wallet, _, _, _ = WalletV4R2.from_mnemonic(client, MNEMONIC)
body = SubdomainManager.build_set_storage_record_body(SUBDOMAIN, BAG_ID)
tx_hash = await wallet.transfer(
destination=SUBDOMAIN_MANAGER_ADDRESS,
amount=0.02,
body=body,
)
print("Subdomain successfully registered and storage record set!")
print(f"Transaction hash: {tx_hash}")
if __name__ == "__main__":
import asyncio
asyncio.run(main())
Установка Next Resolver записи
from pytoniq_core import Address
from tonutils.client import ToncenterV3Client
from tonutils.dns.subdomain_manager import SubdomainManager
from tonutils.wallet import WalletV4R2
# Set to True for test network, False for main network
IS_TESTNET = True
# Mnemonic phrase
MNEMONIC = "word1 word2 word3 ..."
# The address of the subdomain manager contract
SUBDOMAIN_MANAGER_ADDRESS = "EQ..."
# The address of the next resolver contract
CONTRACT_ADDRESS = "EQ..."
# The subdomain to be registered
SUBDOMAIN = "example"
async def main() -> None:
client = ToncenterV3Client(is_testnet=IS_TESTNET, rps=1, max_retries=1)
wallet, _, _, _ = WalletV4R2.from_mnemonic(client, MNEMONIC)
body = SubdomainManager.build_set_next_resolver_record_body(SUBDOMAIN, Address(CONTRACT_ADDRESS))
tx_hash = await wallet.transfer(
destination=SUBDOMAIN_MANAGER_ADDRESS,
amount=0.02,
body=body,
)
print(f"Successfully registered subdomain and set the next resolver!")
print(f"Transaction hash: {tx_hash}")
if __name__ == "__main__":
import asyncio
asyncio.run(main())