1

我想用 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'}

4

1 回答 1

3

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

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

需要注意的重要事项:

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

您还必须为交易提供一个有效的签名者/付款人,但它应该在那之后完成!

于 2021-09-15T12:07:35.877 回答