使用 python 发送 solana 交易

Sending solana transactions with python

我想用 python 购买 Solana 代币和 nfts,但我不确定通过区块链进行的交易是如何运作的。假设我要进行此交易: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)

我知道我的测试钱包中目前没有足够的 solana,但更多的是关于发送交易和与程序 ID 交互的一般方式。 sollet.io 交易中显示了一些数据,但我不确定是否也必须发送该数据?如果必须的话,我应该在哪里以及如何包含它?每笔交易的数据都会改变吗? 我收到错误消息:

{'code': -32602, 'message': 'invalid transaction: index out of bounds'}

你走在正确的轨道上。如果您想模拟与 Solscan 中引用的交易类似的交易,您需要创建正确的指令,包括编码数据和引用的帐户。如果没有可用的 Python 绑定,这会有点困难,但是离开这个例子,它可能看起来有点像:

transaction = Transaction()
transaction.add(TransactionInstruction(
    [AccountMeta(PublicKey("3LdbrFBY7sZ71MtuZhrMzK4YLgxNcTrQ5wLNZHs7r85T"), False, False), AccountMeta(PublicKey("FABkSFDkF3Wz3CpC5JTmw44jeKvXKQvXgXFCyxhAE46X"), False, False), ...],
    PublicKey("CJsLwbP1iu5DuUikHEJnLfANgKy6stB2uFgvBBHoyxwz"),
    bytearray.fromhex('050000000000000000')
))

注意事项:

  • 第一个字段是 AccountMeta 的列表,与您链接的交易相同
  • 第二个字段是程序的public键
  • 最后一个字段是“指令数据”

您还必须为交易提供有效的签名者/付款人,但之后应该会通过!