#python #solana
Вопрос:
Я хочу купить монеты Solana и nft с помощью python, и я не уверен, как именно работают транзакции через блокчейн. Допустим, я хочу совершить эту транзакцию: https://solscan.io/tx/5fzuhifWuBFRPtRGHRRsWsJVHuoxcgEN4USzNBu3ZS8VxwL6Fdw8BFaqU4iAEGibQpEAJyG19QhB335K1HiRtQWX и это мой код:
import solana.system_program as sp
from solana.publickey import PublicKey
from solana.account import Account
from solana.rpc.api import Client
from solana.transaction import Transaction, TransactionInstruction, AccountMeta
# keypair = your key pair
cli = Client('https://solana-api.projectserum.com')
account = Account(keypair[:32])
new_account = Account()
print(new_account.public_key())
print(new_account.keypair())
transaction = Transaction()
transaction.add(sp.create_account(sp.CreateAccountParams(
from_pubkey=account.public_key(),
new_account_pubkey=new_account.public_key(),
lamports=cli.get_minimum_balance_for_rent_exemption(88).get('result'),
space=88,
program_id=PublicKey('CJsLwbP1iu5DuUikHEJnLfANgKy6stB2uFgvBBHoyxwz'),
)))
send_tx = cli.send_transaction(transaction, new_account)
print(send_tx)
Я знаю, что сейчас в моем тестовом кошельке недостаточно соланы, но это больше касается общего способа отправки транзакций и взаимодействия с идентификаторами программ. Есть некоторые данные, приведенные в sollet.io транзакция, но я не уверен, нужно ли мне отправлять и это тоже? И если мне придется, где именно и как я могу это включить? Меняются ли данные для каждой транзакции?
Я получаю сообщение об ошибке:
{'code': -32602, 'message': 'invalid transaction: index out of bounds'}
Комментарии:
1. Что такое program_id в этом? Я пытался сделать то же самое. Не удалось найти идентификатор программы
2. Проверьте ссылку в моем вопросе и ответ Джона Чинкве. Это открытый ключ программы.
3. Эй, я пытаюсь понять, куда вы положили сумму, которую пытаетесь отправить в этой транзакции, это 88?
Ответ №1:
Здесь вы на правильном пути. Если вы хотите имитировать транзакцию, аналогичную той, на которую ссылается Solscan, вам нужно будет создать правильную инструкцию, включая закодированные данные и учетные записи, на которые ссылаются. Это будет немного сложно без доступных привязок Python, но, исходя из примера, это, вероятно, будет выглядеть немного похоже:
transaction = Transaction()
transaction.add(TransactionInstruction(
[AccountMeta(PublicKey("3LdbrFBY7sZ71MtuZhrMzK4YLgxNcTrQ5wLNZHs7r85T"), False, False), AccountMeta(PublicKey("FABkSFDkF3Wz3CpC5JTmw44jeKvXKQvXgXFCyxhAE46X"), False, False), ...],
PublicKey("CJsLwbP1iu5DuUikHEJnLfANgKy6stB2uFgvBBHoyxwz"),
bytearray.fromhex('050000000000000000')
))
Важные вещи, которые следует отметить:
- первое поле-это список
AccountMeta
s, такой же, как в той транзакции, которую вы связали - второе поле-это открытый ключ программы
- последнее поле-это «данные инструкции».
Вам также придется предоставить действительного подписавшего / плательщика для транзакции, но после этого она должна быть завершена!
Комментарии:
1. Классно! Большое вам спасибо за ваш ответ. У вас есть идеи, где или как я могу узнать о том, как работает солана? Я должен сказать, что я был довольно ошеломлен, когда пытался кодировать транзакции и т. Д. И я не уверен, как я могу предоставить подписавшего/плательщика.
2. Конечно! Сначала я бы рекомендовал вам присоединиться к Раздору Соланы и взглянуть на канал #dev-ресурсы. Это даст вам учебные пособия и документы для просмотра. discord.gg/TPQ2yXpu
3. Есть идеи, где я могу найти дополнительную информацию о том, что положить в
the last field is the "instruction data"
? Большое спасибо!!4. Кто — то недавно опубликовал руководство, которое отлично объясняет это, взгляните на dev.to/cogoo/…