35个版本 (10个重大变更)
0.18.0-pre1 | 2019年8月17日 |
---|---|
0.17.0 | 2019年7月30日 |
0.12.0 | 2019年3月12日 |
0.10.4 | 2018年11月9日 |
0.4.0 | 2018年3月31日 |
#1958 in 神奇豆子
每月下载 179次
用于 2 crates
4MB
95K SLoC
区块链为规模而重建
Solana™是一种从头开始构建的新区块链架构,专为规模而设计。该架构在千兆网络上的支持每秒高达710,000笔交易。
免责声明
本项目中描述的所有主张、内容、设计、算法、估计、路线图、规范和性能测量均以作者最大努力完成。读者有责任检查和验证其准确性和真实性。此外,本项目中没有任何内容构成投资邀请。
简介
在标准千兆网络上,如果交易平均不超过176字节,则集中式数据库可以处理每秒710,000笔交易。集中式数据库还可以通过使用名为乐观并发控制的技术([H.T.Kung, J.T.Robinson (1981)])的分布式系统技术自我复制并保持高可用性,而不会显著降低交易率。在索拉纳,我们证明这些相同的理论限制同样适用于敌对网络上的区块链。关键因素是找到一种方式,当节点无法相互信任时共享时间。一旦节点可以信任时间,突然间,近40年的分布式系统研究就可以应用于区块链了!
我们方法获得算法与基于超时算法之间最显著的区别可能在于,使用超时会产生一个传统的分布式算法,其中进程以异步方式操作,而我们的方法产生一个全局同步的算法,其中每个进程在(大约)相同的时间做同样的事情。我们的方法似乎与分布式处理的整体目的相矛盾,分布式处理是为了允许不同的进程独立操作并执行不同的功能。然而,如果一个分布式系统实际上是一个单一的系统,那么进程必须在某种程度上进行同步。在概念上,同步进程最简单的方法是让它们在同一时间做同样的事情。因此,我们的方法用于实现一个执行必要同步的内核——例如,确保两个不同的进程不会在同一时间尝试修改一个文件。进程可能只花费它们很少的时间来执行同步内核;其余时间,它们可以独立操作——例如,访问不同的文件。即使不需要容错性,我们也提倡这种方法。这种方法的基本简单性使得更容易理解系统的精确特性,这对于了解系统的容错能力至关重要。[L.Lamport (1984)]
此外,让我们感到惊讶的是,它可以使用自比特币诞生以来就存在的机制来实现。比特币的这个功能被称为nLocktime,它可以用来使用区块高度而不是时间戳来延时交易。作为一个比特币客户端,如果你不相信网络,你会使用区块高度而不是时间戳。区块高度最终被证明是一种在密码学领域中被称为可验证延迟函数的实例。这是一种加密安全地说时间已经过去的方法。在Solana中,我们使用一个更细粒度的可验证延迟函数,一个SHA 256哈希链,来检查账本并协调共识。有了它,我们实现了乐观并发控制,并现在正朝着每秒710,000笔交易的理论极限迈进。
架构
在深入研究代码之前,请查阅在线书籍Solana: Blockchain Rebuilt for Scale。
(在线书籍的最新版本也在此处提供。)
发布二进制文件
官方发布二进制文件可在Github Releases获取。
此外,我们还为边缘和测试渠道的最新代码提供预发布二进制文件。请注意,这些预发布二进制文件可能不如官方发布稳定。
边缘渠道
Linux (x86_64-unknown-linux-gnu)
- solana.tar.bz2
- solana-install-init作为一个独立的可执行文件
mac OS (x86_64-apple-darwin)
- solana.tar.bz2
- solana-install-init作为一个独立的可执行文件
Windows (x86_64-pc-windows-msvc)
- solana.tar.bz2
- solana-install-init.exe作为一个独立的可执行文件
所有平台
测试渠道
Linux (x86_64-unknown-linux-gnu)
- solana.tar.bz2
- solana-install-init作为一个独立的可执行文件
mac OS (x86_64-apple-darwin)
- solana.tar.bz2
- solana-install-init作为一个独立的可执行文件
Windows (x86_64-pc-windows-msvc)
- solana.tar.bz2
- solana-install-init.exe作为一个独立的可执行文件
所有平台
开发
构建
安装rustc、cargo和rustfmt
$ curl https://sh.rustup.rs -sSf | sh
$ source $HOME/.cargo/env
$ rustup component add rustfmt
如果你的rustc版本低于1.34.0,请更新它
$ rustup update
在Linux系统上,你可能需要安装libssl-dev、pkg-config、zlib1g-dev等。在Ubuntu上
$ sudo apt-get install libssl-dev pkg-config zlib1g-dev llvm clang
下载源代码
$ git clone https://github.com/solana-labs/solana.git
$ cd solana
构建
$ cargo build
然后运行一个最小化本地集群
$ ./run.sh
测试
运行测试套件
$ cargo test
本地测试网
在本地启动自己的测试网,具体说明请参阅书籍Solana: Blockchain Rebuild for Scale: Getting Started。
远程测试网
我们维护了几个测试网
testnet
- 通过testnet.solana.com可访问的公共稳定测试网。全天24小时运行testnet-beta
- 通过beta.testnet.solana.com可访问的公共测试网测试通道。全天24小时运行testnet-edge
- 通过edge.testnet.solana.com可访问的公共边缘通道测试网。全天24小时运行
部署流程
它们通过ci/testnet-manager.sh
脚本和一系列计划好的buildkite作业进行部署。每个测试网也可以从buildkite手动操作。
如何重置测试网?
手动触发testnet-management管道,并在提示时选择所需的测试网
如何扩展交易生成速率?
通过增加运行bench-tps
的客户端机器上的核心数或运行多个客户端来增加TX速率。通过减少核心数或使用rayon环境变量RAYON_NUM_THREADS=<xx>
来减少
如何在测试网上测试更改?
目前,合并的PR是测试网上测试更改的唯一方法。但您可以使用net/
目录中的脚本运行自己的测试网。
调整测试网上的客户端或验证者数量
编辑ci/testnet-manager.sh
度量服务器维护
有时仪表板会无响应。这是由于度量服务器中的故障造成的。当前解决方案是重置度量服务器。请按照以下步骤操作。
- 服务器托管在GCP虚拟机实例上。通过从GCP控制台尝试SSH进入它来检查虚拟机实例是否已关闭。虚拟机的名称是
metrics-solana-com
。 - 如果虚拟机不可访问,请从GCP控制台重置它。
- 一旦虚拟机启动(或者,已经启动),可以从构建自动化中重新启动度量服务。
- 在您的网络浏览器中导航到https://buildkite.com/solana-labs/metrics-dot-solana-dot-com
- 点击
New Build
- 这会显示一个弹出对话框。点击
options
下拉菜单。 - 在
Environment Variables
文本框中输入FORCE_START=true
- 点击
Create Build
- 这将重新启动度量服务,之后应该可以访问仪表板。
调试测试网
测试网可能会表现出不同的故障症状。要检查的主要统计数据是
- 确认时间增加
- 节点不进行投票
- 恐慌和OOM通知
如果出现任何故障迹象,请检查以下内容。
- 测试网部署是否失败?
- 查看上次部署的buildkite日志:https://buildkite.com/solana-labs/testnet-management
- 使用相关分支
- 如果部署失败,请查看构建日志。每个远程节点的构建工件都已上传。从这些日志中进行故障排除是一个很好的第一步。
- 如果部署成功但运行时出现故障,可能需要登录远程节点。
- 从
metrics-solana-com
GCP 实例获取测试网部署的私钥。 - 使用 GCP 控制台 SSH 登录到
metrics-solana-com
并执行以下操作。
sudo bash cd ~buildkite-agent/.ssh ls
- 将相关的私钥复制到您的本地机器。
- 使用 AWS 控制台查找远程节点的 AWS 实例的公共 IP 地址。
ssh-i<私钥文件>ubuntu@<远程节点的 IP 地址>
- 日志在
~solana\solana
文件夹中
- 从
基准测试
首先安装 rustc 的夜间构建版本。 cargo bench
只能在夜间构建版本中使用,它仅提供不稳定功能。
$ rustup install nightly
运行基准测试
$ cargo +nightly bench
发布流程
本项目的发布流程描述如下:这里。
代码覆盖率
要生成代码覆盖率统计信息
$ scripts/coverage.sh
$ open target/cov/lcov-local/index.html
为什么要覆盖率?尽管大多数人将覆盖率视为代码质量指标,但我们将它主要视为开发者生产力的指标。当开发者对代码库进行更改时,假设它是对某些问题的 解决方案。我们的单元测试套件是我们编码代码库解决的问题集的 问题。运行测试套件应表明您的更改没有 侵犯 任何人的解决方案。添加测试 保护 您的解决方案免受未来的更改。如果您不明白某行代码为什么存在,尝试删除它并运行单元测试。最近的测试失败应该会告诉您该代码解决了什么问题。如果没有测试失败,请提交一个询问“这段代码解决了什么问题?”的拉取请求。另一方面,如果您认为有更好的方法来解决相同的问题,欢迎您提交带有解决方案的拉取请求!同样,如果您重写测试可以更好地传达它所保护的代码,请发送给我们这个补丁!
依赖项
~92MB
~1.5M SLoC