近期许多用户在 Solana网络上提交的交易常常失败且雍塞,研究员 @nishil 针对此议题作出科普的说明,指出源自于网络层 QUIC 协议的设计问题,并表示许多开发者已经在着手改善此问题。
背景知识:Solana 网络现况
Solana 网络用户交易失败率超五成
在 Solana网络上提交的交易,通常会有三种结果:
- 交易成功被执行
- 交易被执行却失败
- 交易遗失
其中,自去年 11 月以来,Solana 的交易失败率一直维持在 50% 左右,也就是有一半的交易结果是第二或是第三种情况。
不过这两种失败情况仍有差异需要厘清。
交易被执行却失败:交易条件改变、机器人套利
交易被执行却失败的原因,通常是因为执行条件改变而不符合该交易的执行需求。例如铸造一个已经被抢先铸造完的 NFT,或者是交易滑价超过设定最大值等等。这失败原因在其他区块链网络也很常发生。
而 Solana网络因为费用便宜,因此充满大量的套利机器人与垃圾交易资讯。为了套利,机器人会大量释出多个交易内容,很容易因为执行条件改变而失败,也就是抢输其他机器人。根据数据,这种套利机器人发起的交易失败率达 98%。
不过这些机器人的交易失败,并不是影响 Solana 用户本次使用体验糟糕的主因,因此也不是本文要讨论的重点。用户提交的交易失败原因来自上述的第三种情况 — 交易遗失。
交易遗失:因为网络层设计
交易遗失的问题正是造成 Solana网络上用户交易频频失败的主因。交易遗失代表该交易没有成功传递给出块者,该角色在 Solana 生态被称为区块领导者 (block leader),负责在该 slot 接收并执行交易内容。
@nishil 表示造成 Solana 网络上交易遗失的原因出自于网络层,而非共识层或是执行层,跟区块链技术较无关。
网络层是网络的通讯层,用于将资料包传输。例如 TCP、UDP、QUIC 等协议。Solana 网络近期为了避免区块领导者短时间内接收太多交易需求而当机,将网络层通讯协议改为 QUIC。
QUIC 使区块领导者能够根据特定需求,停止某些用户的连线,或是对其进行传输速率限制,可以降低高峰使用期间的网络当机风险 (虽然会降低网络运行效率但总比当机好)。
不过由于「选择要限制哪一个客户端连线的逻辑」目前设定的很差且存在错误。Solana 目前的做法是随机丢弃交易,而不是按照特定的标准丢弃交易,例如丢弃所有费用低于 x 的交易。
这会造成用户发送更多垃圾交易。为了要让交易可以被成功执行,会鼓励用户发起大量的交易,但这么作同时就会让失败率再次被提升,且网络会变得更雍塞,造成恶性循环。
最后,因为 Solana 网络的设计并没有 mempool,因此被丢弃的交易就遗失,进而导致交易失败。
展望未来
目前生态主要的客户端团队包含 Firedancer、Anza 与 Solana 官方,都已经在着手处理此问题,预计这问题将在未来几周内得到解决,不过仍然需要看更新后的执行状况决定。且还是需要解决因为调整传输机制造成的雍塞问题。
另一方面,Solana 仍然有因为燃料费用便宜而充斥垃圾交易的问题需要解决。
或许这些问题解决后,将可以看到真正稳健的 Solana网络,不过似乎还有许多工作需要完成。