关于Solana 中 transfer SOL的一点理解

Posted Zero_Nothing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Solana 中 transfer SOL的一点理解相关的知识,希望对你有一定的参考价值。

核心,只有owner才能转移所属账号的SOL,这与只有owner才能写数据的道理是一样的。

一、账号的owner种类

一个账号的owner有以下几种:

系统程序: 11111111111111111111111111111111

不可升级程序:BPFLoader2111111111111111111111111111111111

可升级程序: BPFLoaderUpgradeab1e11111111111111111111111

用户自己的程序(例如):6QL77rHaAKzmNYnmHfrCK1N4bN6fy8dK3CKh623FeUYF

二、转移账号

首先是转移账号:

执行转移时,执行的上下文环境必须是转移账号的owner。因此有如下几点:

  • 外部账号可以直接使用solana transfer来转移

  • 不可升级程序及可升级程序不可转移

  • 程序拥有的账号可以在程序内进行转移(通过 **source_info.try_borrow_mut_lamports()? -= 10; 的形式)

  • 只读账号无法进行转移(因为转移其实要写数据,当前所有可执行程序均是只读的)

因此不存在玩家(外部账号)通过一个程序转移自己的sol(因为程序只能转移自己拥有的账号的sol)。

三、接收账号

根据接收账号是否可写/只读,有如下几点:

  • 外部账号可以接收,如果外部账号不存在,使用命令行转移时会有提示需要添加 --allow-unfunded-recipient 选项,使用脚本转移时同时会创建账号,该账号的owner为系统程序:11111111111111111111111111111111,这个要注意,如果你使用seed计算了一个本应该程序拥有的账号地址,而使用脚本直接向其转移lamp,最终会导致该账号的owner为11111111111111111111111111111111,而不是预期中的程序。同样,使用脚本创建账号时不指定owner,也会导致新创建的地址的owner为系统程序11111111111111111111111111111111,即使是你计算的某个程序拥有的地址。
  • owner为通用程序的账号是可以接收的,例如owner为token_program_id或者自定义程序ID的。
  • 用户自己的程序或者系统程序(owner为 BPFLoaderUpgradeab1e11111111111111111111111 或者 BPFLoader2111111111111111111111111111111111)是无法接收的,因为程序都是只读的。

四、其它注意事项

如果在程序内部使用 **source_info.try_borrow_mut_lamports()? -= 10; 的形式,注意所有账号的余额变化必须相符(不相符会报错:sum of account balances before and after instruction do not match

以上是关于关于Solana 中 transfer SOL的一点理解的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Phantom 钱包集成使用 Vanilla JS 和 JSON-RPC 获取 Solana 帐户信息和/或 SOL 余额?

关于Knowledge Transfer的一点想法

Solana开发入门源码

Solana之旅6:Solana存储费与交易剖析

Solana - 如何从 JavaScript / Node.js 中的本地密钥对获取帐户?

如何使用 Solana keygen 中的密钥来使用网络钱包?