DEV Community

EgorMajj
EgorMajj

Posted on

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

Это руководство знакомит с Aptos SDK и с тем, как генерировать, отправлять и проверять транзакции, отправленные в блокчейн Aptos.

Шаг 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 содержит каталог примеров. В данном руководстве рассматривается пример transfer-coin.

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

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

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

=== Addresses ===
Alice: 0x0baec07bfc42f8018ea304ddc307a359c1c6ab20fbce598065b6cb19acff7043
Bob: 0xc98ceafadaa32e50d06d181842406dbbf518b6586ab67cfa2b736aaddeb7c74f

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

=== Intermediate Balances ===
Alice: 18996
Bob: 1000

=== Final Balances ===
Alice: 17992
Bob: 2000
Enter fullscreen mode Exit fullscreen mode

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

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

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

В файле примера используются вспомогательные функции для взаимодействия с REST API. В этом разделе рассматривается каждый из вызовов и дается представление о функциональности.

Шаг 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(), 0)
Enter fullscreen mode Exit fullscreen mode

Шаг 4.4. Чтение балансов

На этом этапе SDK преобразует один вызов в процесс запроса ресурса и чтения поля из этого ресурса.

print(f"Alice: {rest_client.account_balance(alice.address())}")
print(f"Bob: {rest_client.account_balance(bob.address())}")
Enter fullscreen mode Exit fullscreen mode

За кулисами SDK запрашивает ресурс CoinStore для AptosCoin и считывает текущее сохраненное значение:

def account_balance(self, account_address: str) -> int:
    """Returns the test coin balance associated with the account"""
    return self.account_resource(
        account_address, "0x1::coin::CoinStore<0x1::aptos_coin::AptosCoin>"
    )["data"]["coin"]["value"]
Enter fullscreen mode Exit fullscreen mode

Шаг 4.5. Перевод

Как и предыдущий шаг, это еще один вспомогательный шаг, который создает транзакцию, переводящую Coins от Alice к Bob. Для правильно созданных транзакций API возвращает хэш транзакции, который может быть использован в последующих шагах для проверки статуса транзакции. Aptos выполняет несколько проверок при отправке, и если какая-либо из них не проходит, пользователю выдается сообщение об ошибке. Эти проверки включают подпись транзакции, неиспользованный порядковый номер и отправку транзакции в соответствующую сеть.

txn_hash = rest_client.transfer(alice, bob.address(), 1_000)
Enter fullscreen mode Exit fullscreen mode

За кулисами SDK генерирует, подписывает и отправляет транзакцию:

def bcs_transfer(
    self, sender: Account, recipient: AccountAddress, amount: int
) -> str:
    transaction_arguments = [
        TransactionArgument(recipient, Serializer.struct),
        TransactionArgument(amount, Serializer.u64),
    ]

    payload = EntryFunction.natural(
        "0x1::coin",
        "transfer",
        [TypeTag(StructTag.from_str("0x1::aptos_coin::AptosCoin"))],
        transaction_arguments,
    )

    signed_transaction = self.create_single_signer_bcs_transaction(
        sender, TransactionPayload(payload)
    )
    return self.submit_bcs_transaction(signed_transaction)
Enter fullscreen mode Exit fullscreen mode

Разбиваем вышесказанное по пунктам:

  1. transfer внутри является EntryFunction или функцией входа в Move, которую можно вызвать напрямую.
  2. Функция Move хранится в модуле coin: 0x1::coin.
  3. Поскольку модуль Coin может использоваться другими Coin, трансфер должен явно использовать TypeTag, чтобы определить, какой именно coin передавать.
  4. Аргументы транзакции должны быть помещены в TransactionArguments со спецификаторами типа (Serializer. {type}), которые будут последовательно преобразовывать значение в соответствующий тип во время генерации транзакции.

Шаг 4.6. Ожидание разрешения транзакции

Хэш транзакции можно использовать для запроса статуса транзакции:

rest_client.wait_for_transaction(txn_hash)
Enter fullscreen mode Exit fullscreen mode

Top comments (0)