繁体   English   中英

Solana:更改帐户所有者

[英]Solana: Change owner of account

我目前正在尝试使用 Solana 帐户,我想知道是否可以更改帐户的所有者。

我很好奇这是可能的,因为某些程序的安全性依赖于此所有者检查,如此处所述

我也在研究分配函数及其工作原理,但我还不能让它工作。

我是误会了什么,还是无法让它发挥作用?

这里使用了 Python 代码:

tx = Transaction().add(
    create_account(CreateAccountParams(
        from_pubkey=attacker_keypair.public_key,
        new_account_pubkey=account_keypair.public_key,
        lamports=client.get_minimum_balance_for_rent_exemption(0)["result"],
        space=0,
        program_id=attacker_keypair.public_key,
    ))
)
send_and_confirm_tx(client, tx, attacker_keypair, account_keypair)

print('Sending 1st tx to program')
tx = Transaction().add(TransactionInstruction(
    keys=[
        AccountMeta(pubkey=account_keypair.public_key, is_signer=False, is_writable=False),    
    ],
    program_id=PROGRAM_ID,
))

send_and_confirm_tx(client, tx, attacker_keypair)

print('Sending 2nd tx to program')
tx = Transaction().add(assign(AssignParams(
    account_pubkey=account_keypair.public_key,
    program_id=attacker2_keypair.public_key
)))

send_and_confirm_tx(client, tx, account_keypair)

错误消息是: InvalidAccountForFee

account_keypair已经分配给了attacker_keypair ,因此当您尝试将其用作2nd tx中的费用支付者时,运行时会对您大喊大叫,因为account_keypair只能通过位于attacker_keypair的程序减少其灯。 要快速解决您当前的问题,您可以执行以下操作:

print('Sending 2nd tx to program')
tx = Transaction().add(assign(AssignParams(
    account_pubkey=account_keypair.public_key,
    program_id=attacker2_keypair.public_key
)))

send_and_confirm_tx(client, tx, attacker_keypair, account_keypair)

然而,这将导致另一个问题。 account_keypair已经被attacker_keypair拥有,因此只有部署到attacker_keypair的程序才能重新分配account_keypair的所有权。 您可以在以下位置阅读有关 Solana 帐户模型的更多信息: https ://docs.solana.com/developing/programming-model/accounts#ownership-and-assignment-to-programs

你感兴趣的部分是:

所有者是程序 ID。 如果帐户的 id 与所有者匹配,则运行时授予程序对帐户的写入权限。 对于 System 程序,运行时允许客户端转移灯并重要地分配帐户所有权,这意味着将所有者更改为不同的程序 ID。 如果帐户不属于某个程序,则该程序仅被允许读取其数据并记入该帐户。

这意味着要重新分配所有权,您需要编写一个链上程序,将所有权重新分配给attacker2_keypair 2_密钥对,将其部署到attacker_keypair密钥对,然后向attacker_keypair者密钥对发送包含指令的交易。

以下是在AccountInfo上执行assign的一些示例程序: https ://github.com/solana-labs/solana/blob/85a2e599bbbf3d51f201167f921718e52c7ce59f/programs/bpf/rust/realloc/src/processor.rs#L54

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM