# 初识Solana

By [cryptozyh.eth](https://paragraph.com/@cryptozyh) · 2022-10-24

---

Solana是一个公共区块链，[以BFT（拜占庭容错）算法作为塔共识算法](https://0xzx.com/2021033001441303605.html)。塔共识利用了历史证明共识机制。作为最快的区块链网络之一，Solana可以达到约710,000TPS。由高通前高管Anatoly Yakovenko于2017年创建。 Anatoly Yakovenko在17年见证了整个ICO的蓬勃发展，当他看到每一笔转账费用高达数十美金的时候，就萌生了一个想法，要打造一条手续费低、TPS高，可以容纳很多项目在上面运行的高性能区块链网络。于是他联合前同事 Greg Fitzgerald 开发了一个基于历史证明机制（PoH）的纯开源、抗审查的 Solana 公链网络。它支持智能合约、Dapps、DeFi平台和NFT市场的创建。Solana网络的原生加密货币是SOL，用于支付网络上的交易费用，并在加密市场上交易。由于Solana网络支持智能合约，因此在Solana网络创建这些应用程序或解决方案都是可能的。

2020年的3月份 Solana 的 beta主网正式上线，2021年7月 FTX 的创始人天才交易员 SBF 选择 Solana 作为他们交易所的底层公链，在这个消息宣布之后，SOL代币的价格一个月内涨了170%，Solana 也迅速走进了大众的视野，整个生态爆发了井喷式的增长。有了顶级资本 a16z 和 Polychain Capital 领衔的3.1亿美元的融资支持后，Solana 更是犹如乘上了一艘东风战舰，发展速度一飞冲天，很多本来选择以太坊的成熟项目开始将目光转向 Solana 生态。被认为是公链之王以太坊的有力竞争者。它创造的新技术使用户能够在企业级拥有智能合约的快速交易和安全性。截止2021年中，Solana 支持每秒50000笔交易（TPS），并在200个验证节点的帮助下，每400毫秒产生一个新区块，同时保持着接近0的网络费用。

在以太坊上，每个智能合约的代码和状态都存储在同一个账户中，Solana 也是基于账户模型的区块链，但是与以太坊和比特币账户模型不同的是 Solana 为了 “保持账户的活跃度（Keep Account Alive）”，它引入了一个称为“租金（Rent）”的存储成本（Storage Cost）的概念。

在Solana 系统上，存在着3种账户：

1.  数据账户：用于存储数据；
    
2.  程序账户：用于存储可执行程序，主要是程序的BPF字节码；
    
3.  原生账户（Native Accounts）：它们代表着Solana 系统中的诸多原生程序（用来维护系统运转、质押和投票等）
    

在数据账户中，又分为两种类型：

*   系统拥有的账户；
    
*   PDA（Program Derived Address）账户，也就是程序的派生账户； 每一个账户都有一个地址（通常是公钥）和一个所有者（程序账户的地址），账户存储的完整字段：
    

Solana 的合约与Solidity不同的是 Solana 链上程序的部署是按其账户大小进行定期收费的，目前的费用是2天一收，1K大小约0.01 SOL。如果账户无法支付租金，系统将清除该账号。为了防止账户被删除，用户必须支付租金，也就是存储费。如果用户钱包中持有相当于两年租金的最低余额，那么这个账户可以免交租金。

SOL是 Solana 链的原生代币，该网络的代币标准是SPL，类似于以太坊上的ERC 20和BSC上的BEP 20。在以太坊钱包中，用户可以通过钱包中的ETH地址接收或发送所有基于ERC 20标准铸造的代币，而SPL代币则不能直接流转在 Solana 的原生代币SOL地址。Solana 钱包里面的每个Token 都是一个独立的账户，例如USDC、USDT等对应的都是不同的账户，这是二者间最大的区别所在。

造成这种区别的原因在于Solana一直贯彻的“异步并行”的观念，通过自动验证的各种“异步”处理来最大限度避免交易和验证过程的拥堵，以保证最高的处理性能。进一步理解一下，也就是Solana 在交易时需要通过指令（Instructions）来指定需要读取或者写入的账户列表，通过提前创建这些账户，并且在运行过程中整合所有的交易来实现程序的高效执行。在这样的Token模型中数据的存储都是分开的，而每种Token，每个Token持有⼈都对应着⼀个独⽴的账⼾，这就提供了交易并行处理的可能，即使有⼀万笔交易需要处理，只要交易涉及的账号不同就不会造成拥堵。

在Solana链上，用户还可以运用SPL创建和发行非同质化代币（NFT），而在以太坊上，ERC-20只能创建同质化代币，非同质化代币需要使用ERC-721、ERC-1155标准。

与其他大多数区块链不同的是，Solana 将代码与数据完全分离，Solana 链上的程序都是只读或无状态的，所有与程序交互的数据都存储在独立的账户中，并通过指令（Instructions）作为引用传给程序，程序本身存储在账户中，并且被标记为可执行（excitable），这种模型允许一个通用程序进行跨账户操作而不需要额外部署。

指令（Instructions）是 Solana 中最基本的操作单元，每个指令包含：

*   program\_id：程序是基于账户来运行的，被标记为“可执行的账户”会分配给BPF Loader。此帐户的地址称为’ program\_id '，该地址将用于在所有的未来交易中引用程序。
    
*   accounts：存放着读取和写入的账户地址数组
    
*   instruction\_data：与关联的程序定义并解析
    

如果程序检测到交易的目标钱包中没有该代币帐户，会执行`createInitializeAccountInstruction` 指令，创建一个 Associated Token Address (ATA)。

这个ATA地址其实就是PDA程序派生帐户，它的账户地址虽然与SOL钱包地址不同，但是程序可以通过`findAssociatedTokenAddress` 方法推导出该派生账户关联的钱包地址，所以用户只需要知道自己SOL钱包的主地址即可。

Wrapped SOL代币的生成机制跟其他帐户有点不一样，它采用了一种特殊的“Native Mint”的方式，通过公钥 `So11111111111111111111111111111111111111112` 来创建。其他代币的账户如果需要关闭，一定要先将余额全部转出，然后才可以执行关闭帐户的指令，但是WSOL没有这种限制，可以随时关闭帐户，余额和租金会一起兑换成SOL退回钱包。

在交易过程中，可能会产生一些临时的WSOL帐户，这些临时账户（Temporary Account）跟ATA帐户不同的是，它们虽然都是WSOL，但是相互之间独立，不共用一个账户。

当一笔交易（Transaction）被提交到链上时，Solana 的接收程序将执行其中包含的每个指令，并对交易过程中涉及到的指定账户进行操作，任何想要在账户中进行交易的行为需要账户持有人（是Holder，不是Owner）的签名。为了更好的满足 Solana 链的多跳DEX和跨链交易的需求，我们需要实现单笔签名进行批量交易的技术方案，即一次签名后按顺序发起三笔交易：

1.  创建账户（Create Account）
    
2.  交易（Swap）
    
3.  关闭帐户（Close Account）
    

其中潜在的风险点是第三步关闭帐户有可能会执行失败，导致用户在交易过程中为一些临时的WSOL账户支付了多余的租金，而且用户也无法在DEX中交易这部分WSOL，所以我们需要在交易完成时，给用户提供一个手动关闭帐户的入口，帮助用户赎回这些临时WSOL账户占有的租金。

以上是对Solana的一个大体了解，下一篇将讲述使用 Anchor在Solana中创建智能合约。

---

*Originally published on [cryptozyh.eth](https://paragraph.com/@cryptozyh/solana)*
