[英]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.