DEV Community

EgorMajj
EgorMajj

Posted on

Руководство для разработчиков APTOS | Ваш первый NFT с использованием SDK | Python

В этом руководстве пошагово описано, как создавать и передавать NFT на блокчейне Aptos. Реализацию Aptos для основных NFT или токенов можно найти в файле token.move.

Шаг 1. Aptos Python SDK

У Aptos есть официальный, слегка поддерживаемый Python SDK. Он доступен на PyPi с исходным кодом в репозитории Aptos-core на github. Большая часть функциональности повторяет наш SDK Typescript. Основная цель этого SDK - помочь разработчикам Python быстро освоиться в Aptos и стать дополнением к нашему руководству.

Python SDK может быть установлен через pip, из исходников или встроен:

Для установки через pip:

pip3 install aptos-sdk
Enter fullscreen mode Exit fullscreen mode

Для установки из исходного кода:

git clone https://github.com/aptos-labs/aptos-core
cd aptos-core/ecosystem/python/sdk
python3 setup.py install
Enter fullscreen mode Exit fullscreen mode

Для встраивания:

cd /path/to/python/project
cp -r /path/to/aptos-core/ecosystem/python/sdk/aptos-sdk aptos-sdk
Enter fullscreen mode Exit fullscreen mode

Шаг 2. Выполните пример

Каждый SDK содержит каталог примеров. В данном руководстве рассматривается пример simple-nft.

В каталоге SDK запустите: python -m examples.simple-nft

Шаг 3. Результат

После выполнения примера simple-nft должен появиться следующий результат, хотя некоторые значения будут отличаться:

=== Addresses ===
Alice: 0x9df0f527f3a0b445e4d5c320cfa269cdefafc7cd1ed17ffce4b3fd485b17aafb
Bob: 0xfcc74af84dde26b0050dce35d6b3d11c60f5c8c58728ca3a0b11035942a0b1de

=== Initial Balances ===
Alice: 20000
Bob: 20000

=== Creating Collection and Token ===
Alice's collection: {
    "description": "Alice's simple collection",
    "maximum": "18446744073709551615",
    "mutability_config": {
        "description": false,
        "maximum": false,
        "uri": false
    },
    "name": "Alice's",
    "supply": "1",
    "uri": "https://aptos.dev"
}
Alice's token balance: 1
Alice's token data: {
    "default_properties": {
        "map": {
            "data": []
        }
    },
    "description": "Alice's simple token",
    "largest_property_version": "0",
    "maximum": "1",
    "mutability_config": {
        "description": false,
        "maximum": false,
        "properties": false,
        "royalty": false,
        "uri": false
    },
    "name": "Alice's first token",
    "royalty": {
        "payee_address": "0x9df0f527f3a0b445e4d5c320cfa269cdefafc7cd1ed17ffce4b3fd485b17aafb",
        "royalty_points_denominator": "1000000",
        "royalty_points_numerator": "0"
    },
    "supply": "1",
    "uri": "https://aptos.dev/img/nyan.jpeg"
}

=== Transferring the token to Bob ===
Alice's token balance: 0
Bob's token balance: 1

=== Transferring the token back to Alice using MultiAgent ===
Alice's token balance: 1
Bob's token balance: 0
Enter fullscreen mode Exit fullscreen mode

В данном примере показано:

  • Инициализация клиентов REST и Faucet
  • Создание двух учетных записей: Alice и Bob
  • Финансирование и создание учетных записей Alice и Bob
  • Создание коллекции и токена с помощью аккаунта Alice
  • Alice предлагает токен, а Bob его принимает
  • Bob в одностороннем порядке отправляет токен Alice через мультиагентную транзакцию

Шаг 4. SDK в деталях

Шаг 4.1. Инициализация клиентов

На первом этапе в примере инициализируются клиенты REST и Faucet. Клиент REST взаимодействует с API REST, тогда как клиент Faucet взаимодействует с сервисом devnet Faucet для создания и пополнения учетных записей.

rest_client = RestClient(NODE_URL)
faucet_client = FaucetClient(FAUCET_URL, rest_client)
Enter fullscreen mode Exit fullscreen mode

common.py инициализирует эти значения таким образом:

NODE_URL = os.getenv("APTOS_NODE_URL", "https://fullnode.devnet.aptoslabs.com/v1")
FAUCET_URL = os.getenv("APTOS_FAUCET_URL", "https://faucet.devnet.aptoslabs.com")
Enter fullscreen mode Exit fullscreen mode

СОВЕТ
URL-адреса обеих сервисов по умолчанию указывают на наши сервисы devnet. Однако их можно настроить с помощью следующих переменных: APTOS_NODE_URL и APTOS_FAUCET_URL.

Шаг 4.2. Создание локальных учетных записей

Следующим шагом будет создание двух учетных записей на локальном уровне. Учетные записи представляют собой состояние в сети и вне сети. Состояние вне сети состоит из адреса и пары открытого и закрытого ключей, используемых для аутентификации владельца. Этот шаг демонстрирует, как генерировать состояние вне сети.

alice = Account.generate()
bob = Account.generate()
Enter fullscreen mode Exit fullscreen mode

Шаг 4.3. Создание учетных записей в блокчейне

В Aptos каждая учетная запись должна иметь представление на сети, чтобы поддерживать получение токенов и Coins , а также взаимодействие с другими dApps. Учетная запись представляет собой носитель для хранения активов, поэтому она должна быть явно создана. В данном примере используется Faucet для создания и пополнения учетной записи Alice и только для создания учетной записи Bob:

faucet_client.fund_account(alice.address(), 20_000)
faucet_client.fund_account(bob.address(), 20_000)
Enter fullscreen mode Exit fullscreen mode

Шаг 4.4. Создание коллекции

Теперь начинается процесс создания токенов. Сначала создатель должен создать коллекцию для хранения токенов. Коллекция может содержать ноль, один или много отдельных токенов. Коллекция не ограничивает атрибуты токенов, поскольку она является лишь хранилищем.

Ваше приложение будет вызывать create_collection:

txn_hash = rest_client.create_collection(
    alice, collection_name, "Alice's simple collection", "https://aptos.dev"
)
Enter fullscreen mode Exit fullscreen mode

API create_collection, который возвращает хэш транзакции:

def create_collection(
    self, account: Account, name: str, description: str, uri: str
) -> str:
Enter fullscreen mode Exit fullscreen mode

Шаг 4.5. Создание токена

Чтобы создать токен, создатель должен указать связанную с ним коллекцию. Токен должен быть связан с коллекцией, и в этой коллекции должны быть оставшиеся токены, которые можно минтить. Существует множество атрибутов, связанных с токеном, но API-помощник раскрывает только минимальное количество, необходимое для создания статического контента.

Ваше приложение будет вызывать create_token:

txn_hash = rest_client.create_token(
    alice,
    collection_name,
    token_name,
    "Alice's simple token",
    1,
    "https://aptos.dev/img/nyan.jpeg",
    0,
)
Enter fullscreen mode Exit fullscreen mode

API create_token, который возвращает хэш транзакции:

def create_token(
    self,
    account: Account,
    collection_name: str,
    name: str,
    description: str,
    supply: int,
    uri: str,
    royalty_points_per_million: int,
) -> str:
Enter fullscreen mode Exit fullscreen mode

Шаг 4.6. Чтение метаданных токена и коллекции

Метаданные коллекции и токена хранятся на учетной записи создателя в таблице Collections. SDK предоставляют удобные оболочки для запросов к этим конкретным областям:

Чтобы прочитать метаданные коллекции:

collection_data = rest_client.get_collection(alice.address(), collection_name)
print(f"Alice's collection: {json.dumps(collection_data, indent=4, sort_keys=True)}")
Enter fullscreen mode Exit fullscreen mode

Чтобы прочитать метаданные токена:

token_data = rest_client.get_token_data(alice.address(), collection_name, token_name, 0)
print(f"Alice's token data: {json.dumps(token_data, indent=4, sort_keys=True)}")
Enter fullscreen mode Exit fullscreen mode

Вот как get_token_data запрашивает метаданные токена:

def get_token_data(
    self,
    creator: AccountAddress,
    collection_name: str,
    token_name: str,
    property_version: int,
) -> Any:
    token_data = self.account_resource(creator, "0x3::token::Collections")["data"][
        "token_data"
    ]["handle"]

    token_data_id = {
        "creator": creator.hex(),
        "collection": collection_name,
        "name": token_name,
    }

    return self.get_table_item(
        token_data,
        "0x3::token::TokenDataId",
        "0x3::token::TokenData",
        token_data_id,
    )
Enter fullscreen mode Exit fullscreen mode

Шаг 4.7. Чтение баланса токена

Каждый токен в Aptos является отдельным активом, активы, принадлежащие пользователю, хранятся в его TokenStore. Чтобы узнать баланс:

balance = rest_client.get_token_balance(alice.address(), alice.address(), collection_name, token_name, 0)
print(f"Alice's token balance: {balance}")
Enter fullscreen mode Exit fullscreen mode

Шаг 4.8. Предложение и заявление прав на токен

Многие пользователи получили нежелательные токены, которые могут вызвать как минимальный дискомфорт, так и серьезные последствия. Aptos предоставляет каждому владельцу учетной записи право решать, принимать или не принимать односторонние переводы. По умолчанию односторонние переводы не поддерживаются. Таким образом, Aptos обеспечивает основу для предложения и заявления прав на токен.

Чтобы предложить токен:

txn_hash = rest_client.offer_token(
    alice,
    bob.address(),
    alice.address(),
    collection_name,
    token_name,
    0,
    1,
)
Enter fullscreen mode Exit fullscreen mode

Чтобы заявить права на токен:

txn_hash = rest_client.claim_token(
    bob,
    alice.address(),
    alice.address(),
    collection_name,
    token_name,
    0,
)
Enter fullscreen mode Exit fullscreen mode

Шаг 4.9. Безопасный односторонний перевод токена

Для поддержки безопасной односторонней передачи токена отправитель может сначала попросить получателя подтвердить вне сети о предстоящей передаче. Это происходит в форме запроса мультиагентной транзакции. Мультиагентные транзакции содержат несколько подписей, по одной для каждой учетной записи на сети. Move затем может использовать это для предоставления разрешений на уровне подписи всем signer. Для передачи токенов это гарантирует, что принимающая сторона действительно желает получить этот токен, не требуя использования описанной выше структуры передачи токенов.

txn_hash = rest_client.direct_transfer_token(
    bob, alice, alice.address(), collection_name, token_name, 0, 1
)
Enter fullscreen mode Exit fullscreen mode

Top comments (0)