Solana中的托管合约

Posted mutourend

tags:

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

1. 引言

在Solana中,智能合约称为program。

相关代码见:

通过界面创建Solana SPL token有:

2. 何为托管合约?

假设Alice有资产X,Bob有资产Y,二者想进行资产交换。
传统的方案为:引入Alice和Bob都信任的第三方Cathy。Cathy只有等收到 Alice发来的X资产 和 Bob发来的Y资产 之后,才会 将Y资产发给Alice 并 将X资产发给Bob。

可通过智能合约来替代可信第三方Cathy的角色。

Solana中的合约为无状态(Stateless)的,若想存储state,需借助accounts参数:

entrypoint!(process_instruction);
fn process_instruction(
    program_id: &Pubkey, //当前执行的合约
    accounts: &[AccountInfo], // The accounts referenced by an instruction represent on-chain state and serve as both the inputs and outputs of a program
    instruction_data: &[u8], // 传给合约的参数
) -> ProgramResult 
    Processor::process(program_id, accounts, instruction_data)

Solana合约本身存储在标记为executable的account中。每个account可hold data and SOL。每个account有一个owner,仅owner可debit the account and adjust its data。Crediting may be done by anyone。

理论上,合约对其拥有的账户拥有完全的自主权。由合约的创建者来限制这种自主权,由合约的用户来验证程序的创建者是否真的这样做了。
所有需要read或write的accounts都必须传入entrypoint function。因为runtime知道所有要读写的account,因此可支持交易并行执行。

Solana中的合约要点为:

  • 每个合约都由其BPF Loader来处理。(合约存储在标记为executable的account中,这些executable account owned by the BPF Loader。)不同的BPF loader可能需要不同的entrypoints。BPF loader本身也是program。【不归BPF Loader所有的合约有:BPF loader本身 以及 System Program。】
  • accounts用于存储state。
  • accounts归属于programs。
  • 只有account owner才可debit an account and adjust its data。
  • 所有读写accounts都需要传入entrypoint中。

参考资料

[1] Programming on Solana - An Introduction
[2] Solana transactions

以上是关于Solana中的托管合约的主要内容,如果未能解决你的问题,请参考以下文章

Solana中的跨合约调用 及 Program Derived Addresses

solana token合约

Solana中的native program

Solana区块链智能合约开发简要流程

Solana区块链智能合约开发简要流程

Solana区块链智能合约开发简要流程