原文:2501babe.github.io/posts/solan…
这篇文章的目的是为有好奇心的开发人员提供Solana的概述。我假设你知道计算机的基本原理,我通过与以太坊作对比来解释一些概念,但你其实并不需要非常全面的理论知识。我不会解释股权证明(POS),但如果你想要一些关于CS问题的比较浅显的解释,请随意谷歌 "拜占庭容错(BFT) "和 "CAP定理",这一点并不复杂或令人厌烦。
这篇文章对非技术人员来说可能会有一些兴趣,但坦白说,它可能太专业了。
这篇文章的大部分内容是我对Solana一些基本概念的总结。我认为其中的材料是非常有价值和全面的,但它可能是从一些人的笔记或东西改编的。 特别是它没有被组织成有依赖性的章节,也就是说,如果你按顺序阅读,在你阅读后面的章节之前,前面的一些东西是无法理解的。
这篇文章中的所有内容都是100%真实和正确的,除非有什么变化或者有人告诉我是错的,在这种情况下,我会对其内容进行更新。
概述
用一句话来说:Solana是一个股权证明(POS)的区块链,外加一些额外的东西。
最重要的额外的东西是一个他们称之为历史证明(POH)的机制。验证者不断地对一个之前前输出的哈希再进行哈希运算,并定期发布这些哈希中的一个,加上复制它所需的迭代次数。这很酷,因为你必须以串行方式产生新的哈希,但你可以并行验证哈希检查点的集合
哈希链是跨验证器(Validator)的标准,但验证器可以独立产生它们,而不需要等待承诺的区块。这些哈希被用作一个基本的时钟,能够证明事情是按照一定的顺序发生的,并且它们之间经过了一些任意的时间。
大多数其他额外的东西都是直接的优化。人们喜欢把Solana用于这些的营销术语扯出来,并试图详细解释它们,但对于我们的目的来说,这并不重要。
验证者使用Not Bittorrent的方式来获取区块,不需要等待所有的碎片来推定正确性。他们还声称将数据卸载到Not Filecoin,因此验证者可以运行轻型客户端,但在他们的讨论区有人告诉我他们从未实施过,所以不知道。
客户端事先声明它需要哪些内存位置,这样运行时就可以预取和映射它。
Solana使用ed25519进行加密,使用sha256进行哈希。他们特别选择了sha256,因为在btc asics上投入的所有努力意味着它不太可能有一个意外的优化,这将使历史证明变得微不足道。 pubkeys被用作地址,没有截断。
Solana喜欢在它的营销材料中宣称它的速度快得多,而且没有任何权衡,这种说法很愚蠢。
但是,亲爱的开发者,被牺牲的是你的时间和你的理智。Solana为达到它所做的tps而需要付出更多的复杂性。与以太坊相比,该系统要复杂得多,难以推理,许多事情必须手工完成。
我认为这种权衡是好的,solana链真的很快,它是值得的,但最好是诚实对待这些方面的权衡,而不是试图假装它不存在。
随着时间的推移,更多的东西可能会被抽象化。 Anchor在规范客户端/区块链链的界面方面已经做得很好了。 但你最好了解它具体做了什么,否则你迟早会陷入痛苦。
我绝对相信,Solana之所以没有出现任何骗局或者崩掉,除了薄弱的预售或PND的废话,是因为骗子还没有聪明到发明攻击手法。
程序(Program)和账户(account)
Solana与以太坊最大的实际区别是它非常积极地分离了代码和数据。这对系统的结构有很多影响,特别是账户是以太坊开发者来到Solana的最大困惑来源。
程序是无状态的合约。没有像solidity中的类变量或globals或其他什么东西,所有的数据都是通过引用从外部明确传递的。
你用solana-sdk库在rust中编写程序。有一个叫xargo的东西可以交叉编译到ebpf,你只需要一个额外的配置文件就可以了。
帐户是缓冲区。我不知道为什么他们称之为帐户,这让每个人都感到困惑。有一个函数create_account。
你创建了一个账户,其大小以字节为单位,可以在其中存储任意的二进制数据。 账户不能被重新分配(但现在我想到了,我还没有检查你是否可以在释放它们之后重新创建它们,这是一个有趣的问题)。账户也可以存储lamports,这是solana coin(SOL)最小单位的名称。 理论上,你为存储支付租金,但如果你把两年的租金放在账户里,他们会让你豁免,所以每个人都会这样做。
帐户默认由系统程序(System Program)拥有。系统程序有基本的功能来创建更多的帐户,发送lamports和诸如此类的东西。帐户可以被分配一个新的所有者,而且只有一次。这个所有者总是一个程序,它有权限从帐户中扣除lamports,并以任何方式修改其数据。
帐户地址是ed25519的pubkeys,相应的privatekey由用户保留用于签名。solana的开发者喜欢把这称为 "authority",以避免给 "owner"增加混乱的第二个含义。
程序并不特别:它们也是数据,存储在账户中。这些账户被标记为可执行,所有权被转移到ebpf加载器程序中。程序账户需要有足够的灯来获得免租资格。
程序/账户模型的一个好处是,你可以有一个通用的程序,对各种数据进行操作。
交易(Transaction)和指令(Instruction)
Solana的基本操作单位是指令。一个指令是对一个程序的调用。一个或多个指令可以被捆绑在一个消息中。一个消息加上一个签名阵列构成一个交易。
这对以太坊开发者来说非常重要:终端用户可以构建调用多个程序的原子交易。
我不会用完整的二进制规范来烦扰你。重要的是你必须转发声明你打算读出或写入的每一个账户。这可能包括:系统程序、代币程序、你的账户、你的代币账户、任何必要的程序账户等。这也包括称为sysvars的特殊地址,如果程序需要知道诸如租金是多少或现在是什么时间等事实。
这是他们预取和并行执行优化的代价。我向你保证,你会学会讨厌这一点,特别是因为账户是以数组形式传递的,所以你需要得到正确的顺序。
写入一个账户需要有这样的权限,这可以通过用适当的私钥签署完整的消息来证明。非签名的账户也可能是可写的,例如,如果被你的指令调用的程序所拥有。
消息包含的最后一件重要的东西是区块链,这就是它听起来的样子。我特别说 "消息 "是为了表明它是签名数据的一部分。
区块链也被用作tl,要求它不超过32个区块。这意味着如果一个交易在一定时间内没有被确认,它就永远不会被确认,你可以放心地认为它已经过期。
Solana还为那些需要的人提供了一个nonce模式以实现签名。
程序衍生地址(Program Derived Address,PDA)
有一种特殊的账户,程序可以在没有私钥的情况下签名。给定一个任意字节的种子加上一个程序ID,你可以生成一个看起来像ed25519的公钥。只要它不是一个有效的密钥(即不在曲线上),就有一个机制让solana为你创造一个签名。
这最终是有点烦人的,因为不是每个种子和程序ID的组合都是可用的。
例如,如果你想让你的程序把灯转移到一个用户账户,你可以让程序签署它自己的账户,然后调用系统程序,把它的账户作为 "from"的地址,把用户账户作为 "to"的签名。
一个常见的模式是使用从命名空间和用户公钥派生出来的地址,以实现高效的键/值映射,以用户为关键。
运行时(Runtime)
每条指令都有固定的计算预算,不能超过。对ebpf指令、日志信息、堆栈大小、调用深度和跨程序调用的数量都有硬编码限制。
没有机制来支付更多的计算量,所以如果你不能适应预算,你最好让它适应。我生活在恐惧中,害怕写出一个调用另一个程序的工作程序,后来它的开发者把它改得更贵,现在我的程序不能再适应预算了,并且永远中断了。
信息也有1232字节的限制,这实在是太低了。由于计算预算非常严格,跨程序调用(Cross Program Invocation,CPI)是为输入输出准备的,而不是为搭建乐高准备的。 理论上,你可以用多指令事务来做这个。
但是......在实践中,很难将复杂的操作纳入大小限制,因为你需要为所有东西列出一堆地址。
客户端
客户端使用发送到8899的jsonrpc有效载荷提交交易并从rpc节点获取数据。还有一个位于8900的pubsub websocket,但我还没有用过。
SOLANA-WEB3没有任何文档,只有 typescript types,但那里有足够多的对 "wei "的游离引用,我想我可能是从eth的等价物中分叉出来的? idk, sendAndConfirmTransaction通常是你想要的函数。
我知道的最重要的调试建议是,没有人告诉我:在测试客户端代码时打开预检,在测试链上程序时关闭它们。
对于本地测试,你也可以把承诺改为处理,这样你就不必等待确认就能看到结果。
CLI
与有点神秘的客户端体验相比,cli工具真的非常好。
Solana-test-validator的功能和它所说的完全一样,你只需要运行它就可以了,我喜欢它。Solana logs为你提供了日志,你可以用msg打印到程序中!还有很多,但说真的,我对这里没有任何抱怨,它都是非常直接的。
调用惯例
这是我最喜欢的部分。所有的Solana程序都有一个单一的入口,它提供了程序ID、账户数组和指令数据作为参数。 什么是指令数据?
串行化和调度是你的问题。如果你调用别人的程序,你必须依靠他们给你的客户端代码或文档来确定如何正确地形成指令,因为所有的接口都是不透明的和临时性的。
祝你玩得开心!
Anchor
这不是一个Anchor的教程,但我想说的是它非常酷。主要的好处是它强加了一个类似于solidity的调度表接口,为你处理序列化和反序列化,并让你把账户作为对象而不是数组传递。
我一直在使用它,但我还没有足够的经验来解释如何真正使用它。
总结
恭喜你,现在你知道Solana了。好吧,我想这是一个很好的概述,让你对它与以太坊的区别有一个强烈的感觉,并为学习如何在它上面进行开发打下坚实的基础,而不是一直像 "这tmd是什么,那是什么"。
我希望你喜欢我的胡言乱语。这不是你最后一次听到我的声音!我的下一篇文章,我想将是 "things about solana to make you go"。在其中,我会思考各种令人兴奋的攻击,只有在Solana的世界里才可能,以及邪恶的方法,试图绕过他们的资源限制,和各种其他方式的令人兴奋的事情。