Solana中的托管合约
Posted mutourend
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Solana中的托管合约相关的知识,希望对你有一定的参考价值。
1. 引言
在Solana中,智能合约称为program。
相关代码见:
- https://github.com/ironaddicteddog/anchor-escrow(Escrow program implemented in Anchor)
- https://github.com/paul-schaaf/solana-escrow
- https://github.com/mvines/solana-bpf-program-template
通过界面创建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中的托管合约的主要内容,如果未能解决你的问题,请参考以下文章