Account

UTXO

Unspend Transaction Output.

EVM Accounts1

  • EOA(Externally-owned acount) - 用户用私钥控制的账号;
  • 合约账号(Contract account) - 代码控制的账号,用于部署智能合约代码。

账号模型通过用户地址为用户开辟一块单独的存储,简单的理解就是用公私钥导出的唯一地址作为主键存储在节点的存储系统里(RocksDB); 这样只要将链上转账或者智能合约产生的结果或副作用存储在账号下面即可。

Solana Account Model

Accounts2

  • 账号用于提供给智能合约(Program)跨交易存储状态,类似文件系统;
  • 包含元数据(metadata)说明谁有权限访问这些状态;
  • Solana 独特的创新:账号伴有生命周期,也就是对应的私钥并不完全拥有一个账号,而是从链上租借(rent)了一个账号,并支付对应的租金,当租借过期且没有足够的余额(lamports)支付租金的情况下,账号下的数据将被链回收;

一笔交易里可以参与的账号类型有:

  • Signers 一笔交易可以包含一个或多个签名者,表示授权此笔交易(多签机制);
  • Read-only 交易里对该账号只读;
  • Executable 其账号可以作为智能合约进行调用(将其账号对应的公钥地址作为 program id);

Programs or Smart Contract3

账号被标记为 Executable 可以部署代码(Program)作为智能合约。两种类型的智能合约:

同时智能合约可以控制多个其他账号,并且只能修改它所拥有的账号数据,但是可以读取其他账号的数据。

Solana 的 Program 可以被更新。

搭建开发环境

命令行钱包

sh -c "$(curl -sSfL https://release.solana.com/stable/install)"

连接到测试节点

solana config set --url https://api.testnet.solana.com

官方文档是连接到本地节点,这里不太推荐,因为使用测试节点可以结合链浏览器比较直观的观测结果。

注意 Solana 命令最好和集群匹配,不然可能会有一些难以定位的问题,通过一下两个命令确认4

$ solana cluster-version
$ solana --version

通过水龙头(Faucet)领取测试币5

TODO

Rust 安装和简介

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

特点:

  • 内存安全6
  • 系统级的编程语言,C/C++。

设置

设置国内源,将以下内容放在 ~/.cargo/config

[source.crates-io]
registry = "https://github.com/rust-lang/crates.io-index"
replace-with = 'ustc'
[source.ustc]
registry = "git://mirrors.ustc.edu.cn/crates.io-index"

开发智能合约7

编写部署第一个智能合约

三个参数:

  • program_id 当前智能合约的 ProgramId,可以做一些硬编码检查;
  • accounts 参与调用的账号列表;8
  • instruction_data 客户端传过来的参数。

调用智能合约