Compare commits
40 Commits
Author | SHA1 | Date | |
---|---|---|---|
b5ca6e8e5a | |||
16f50729e9 | |||
c119fdf711 | |||
b2a467fa7d | |||
cb6f14004d | |||
952e28343e | |||
cdfeee1854 | |||
5eb5589bb3 | |||
c1d78ddbb5 | |||
cf7c5cdb03 | |||
8c23508cd5 | |||
3ca91c316a | |||
be3a025491 | |||
94c757013d | |||
d6372a930c | |||
4746902074 | |||
c6b95a8f65 | |||
fdfdf2eb39 | |||
3448842c0c | |||
f5f1efe94a | |||
50e0c806da | |||
e613a0aa7e | |||
2c54cdd07e | |||
cbb0ed7c56 | |||
50aa099400 | |||
53c901471c | |||
4badf63cfd | |||
d04fd3c3ab | |||
a8a9907ace | |||
a7644630cc | |||
58666543e2 | |||
a8a5d16278 | |||
01ebbe367a | |||
2cada71151 | |||
d6ce97bcbd | |||
3ddc92ab86 | |||
5a99e86a60 | |||
d9e1a8b492 | |||
4244a0f716 | |||
5f1d86c040 |
@ -16,7 +16,7 @@ build_script:
|
||||
notifications:
|
||||
- provider: Slack
|
||||
incoming_webhook:
|
||||
secure: 6HTXVh+FBz29LGJb+taFOo9dqoADfo9xyAszeyXZF5Ub9t5NERytKAR35B2wb+uIOOCBF8+JhmH4437Cgf/ti4IqvURzW1QReXK7eQhn1EI=
|
||||
secure: 6HnLbeS6/Iv7JSMrrHQ7V9OSIjH/3KFzvZiinNWgQqEN0e9A6zaE4MwEXUYDWbcvVJiQneWit6dswY8Scoms2rS1PWEN5N6sjgLgyzroptc=
|
||||
channel: ci-status
|
||||
on_build_success: false
|
||||
on_build_failure: true
|
||||
@ -25,9 +25,9 @@ notifications:
|
||||
deploy:
|
||||
- provider: S3
|
||||
access_key_id:
|
||||
secure: ptvqM/yvgeTeA12XOzybH1KYNh95AdfEvqoH9mvP2ic=
|
||||
secure: G6uzyGqbkMCXS2+sCeBCT/+s/11AHLWXCuGayfKcMEE=
|
||||
secret_access_key:
|
||||
secure: IkrgBlz5hdxvwcJdMXyyHUrpWhKa6fXLOD/8rm/rjKqYCdrba9B8V1nLZVrzXGGy
|
||||
secure: Lc+aVrbcPSXoDV7h2J7gqKT+HX0n3eEzp3JIrSP2pcKxbAikGnCtOogCiHO9/er2
|
||||
bucket: release.solana.com
|
||||
region: us-west-1
|
||||
set_public: true
|
||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -23,3 +23,4 @@ log-*.txt
|
||||
# intellij files
|
||||
/.idea/
|
||||
/solana.iml
|
||||
/.vscode/
|
||||
|
459
Cargo.lock
generated
459
Cargo.lock
generated
@ -2044,6 +2044,14 @@ dependencies = [
|
||||
"libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "semver"
|
||||
version = "0.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "semver"
|
||||
version = "0.9.0"
|
||||
@ -2168,7 +2176,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solana"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2200,27 +2208,27 @@ dependencies = [
|
||||
"serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-budget-api 0.16.5",
|
||||
"solana-budget-program 0.16.5",
|
||||
"solana-chacha-sys 0.16.5",
|
||||
"solana-client 0.16.5",
|
||||
"solana-config-program 0.16.5",
|
||||
"solana-drone 0.16.5",
|
||||
"solana-budget-api 0.16.6",
|
||||
"solana-budget-program 0.16.6",
|
||||
"solana-chacha-sys 0.16.6",
|
||||
"solana-client 0.16.6",
|
||||
"solana-config-program 0.16.6",
|
||||
"solana-drone 0.16.6",
|
||||
"solana-ed25519-dalek 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-exchange-program 0.16.5",
|
||||
"solana-kvstore 0.16.5",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-metrics 0.16.5",
|
||||
"solana-netutil 0.16.5",
|
||||
"solana-runtime 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-stake-api 0.16.5",
|
||||
"solana-stake-program 0.16.5",
|
||||
"solana-storage-api 0.16.5",
|
||||
"solana-storage-program 0.16.5",
|
||||
"solana-vote-api 0.16.5",
|
||||
"solana-vote-program 0.16.5",
|
||||
"solana-vote-signer 0.16.5",
|
||||
"solana-exchange-program 0.16.6",
|
||||
"solana-kvstore 0.16.6",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-metrics 0.16.6",
|
||||
"solana-netutil 0.16.6",
|
||||
"solana-runtime 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
"solana-stake-api 0.16.6",
|
||||
"solana-stake-program 0.16.6",
|
||||
"solana-storage-api 0.16.6",
|
||||
"solana-storage-program 0.16.6",
|
||||
"solana-vote-api 0.16.6",
|
||||
"solana-vote-program 0.16.6",
|
||||
"solana-vote-signer 0.16.6",
|
||||
"sys-info 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2229,7 +2237,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solana-bench-exchange"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2245,33 +2253,33 @@ dependencies = [
|
||||
"serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_yaml 0.8.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana 0.16.5",
|
||||
"solana-client 0.16.5",
|
||||
"solana-drone 0.16.5",
|
||||
"solana-exchange-api 0.16.5",
|
||||
"solana-exchange-program 0.16.5",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-metrics 0.16.5",
|
||||
"solana-netutil 0.16.5",
|
||||
"solana-runtime 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana 0.16.6",
|
||||
"solana-client 0.16.6",
|
||||
"solana-drone 0.16.6",
|
||||
"solana-exchange-api 0.16.6",
|
||||
"solana-exchange-program 0.16.6",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-metrics 0.16.6",
|
||||
"solana-netutil 0.16.6",
|
||||
"solana-runtime 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
"untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"ws 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-bench-streamer"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana 0.16.5",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-netutil 0.16.5",
|
||||
"solana 0.16.6",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-netutil 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-bench-tps"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2280,58 +2288,58 @@ dependencies = [
|
||||
"serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_yaml 0.8.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana 0.16.5",
|
||||
"solana-client 0.16.5",
|
||||
"solana-drone 0.16.5",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-metrics 0.16.5",
|
||||
"solana-netutil 0.16.5",
|
||||
"solana-runtime 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana 0.16.6",
|
||||
"solana-client 0.16.6",
|
||||
"solana-drone 0.16.6",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-metrics 0.16.6",
|
||||
"solana-netutil 0.16.6",
|
||||
"solana-runtime 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-bpf-loader-api"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
"solana_rbpf 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-bpf-loader-program"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-bpf-loader-api 0.16.5",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-bpf-loader-api 0.16.6",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-bpf-programs"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"elf 0.0.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-bpf-loader-api 0.16.5",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-runtime 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-bpf-loader-api 0.16.6",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-runtime 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
"solana_rbpf 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"walkdir 2.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-budget-api"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2340,30 +2348,30 @@ dependencies = [
|
||||
"num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-runtime 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-runtime 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-budget-program"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-budget-api 0.16.5",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-budget-api 0.16.6",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-chacha-sys"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-client"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2376,37 +2384,37 @@ dependencies = [
|
||||
"serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-netutil 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-netutil 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-config-api"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-runtime 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-runtime 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-config-program"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-config-api 0.16.5",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-config-api 0.16.6",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-drone"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2415,9 +2423,9 @@ dependencies = [
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-metrics 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-metrics 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
"tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
@ -2436,40 +2444,40 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solana-exchange-api"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-metrics 0.16.5",
|
||||
"solana-runtime 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-metrics 0.16.6",
|
||||
"solana-runtime 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-exchange-program"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-exchange-api 0.16.5",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-exchange-api 0.16.6",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-failure-program"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-runtime 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-runtime 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-genesis"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2478,41 +2486,41 @@ dependencies = [
|
||||
"serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_yaml 0.8.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana 0.16.5",
|
||||
"solana-bpf-loader-api 0.16.5",
|
||||
"solana-bpf-loader-program 0.16.5",
|
||||
"solana-budget-api 0.16.5",
|
||||
"solana-budget-program 0.16.5",
|
||||
"solana-config-api 0.16.5",
|
||||
"solana-config-program 0.16.5",
|
||||
"solana-exchange-api 0.16.5",
|
||||
"solana-exchange-program 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-stake-api 0.16.5",
|
||||
"solana-stake-program 0.16.5",
|
||||
"solana-storage-api 0.16.5",
|
||||
"solana-storage-program 0.16.5",
|
||||
"solana-token-api 0.16.5",
|
||||
"solana-token-program 0.16.5",
|
||||
"solana-vote-api 0.16.5",
|
||||
"solana-vote-program 0.16.5",
|
||||
"solana 0.16.6",
|
||||
"solana-bpf-loader-api 0.16.6",
|
||||
"solana-bpf-loader-program 0.16.6",
|
||||
"solana-budget-api 0.16.6",
|
||||
"solana-budget-program 0.16.6",
|
||||
"solana-config-api 0.16.6",
|
||||
"solana-config-program 0.16.6",
|
||||
"solana-exchange-api 0.16.6",
|
||||
"solana-exchange-program 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
"solana-stake-api 0.16.6",
|
||||
"solana-stake-program 0.16.6",
|
||||
"solana-storage-api 0.16.6",
|
||||
"solana-storage-program 0.16.6",
|
||||
"solana-token-api 0.16.6",
|
||||
"solana-token-program 0.16.6",
|
||||
"solana-vote-api 0.16.6",
|
||||
"solana-vote-program 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-gossip"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana 0.16.5",
|
||||
"solana-client 0.16.5",
|
||||
"solana-netutil 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana 0.16.6",
|
||||
"solana-client 0.16.6",
|
||||
"solana-netutil 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-install"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2529,13 +2537,14 @@ dependencies = [
|
||||
"nix 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"reqwest 0.9.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"ring 0.13.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"semver 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_yaml 0.8.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-client 0.16.5",
|
||||
"solana-config-api 0.16.5",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-client 0.16.6",
|
||||
"solana-config-api 0.16.6",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
"tar 0.4.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2545,16 +2554,16 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solana-keygen"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"dirs 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-sdk 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-kvstore"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2569,38 +2578,39 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solana-ledger-tool"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"assert_cmd 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_yaml 0.8.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana 0.16.5",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-runtime 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana 0.16.6",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-runtime 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-logger"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-merkle-tree"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-sdk 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-metrics"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"influx_db_client 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2608,13 +2618,13 @@ dependencies = [
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"reqwest 0.9.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-sdk 0.16.6",
|
||||
"sys-info 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-netutil"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2622,33 +2632,33 @@ dependencies = [
|
||||
"nix 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"socket2 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-logger 0.16.6",
|
||||
"tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-noop-program"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-replicator"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana 0.16.5",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-netutil 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana 0.16.6",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-netutil 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-runtime"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bv 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2666,23 +2676,23 @@ dependencies = [
|
||||
"serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-bpf-loader-api 0.16.5",
|
||||
"solana-bpf-loader-program 0.16.5",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-metrics 0.16.5",
|
||||
"solana-noop-program 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-stake-api 0.16.5",
|
||||
"solana-stake-program 0.16.5",
|
||||
"solana-storage-api 0.16.5",
|
||||
"solana-vote-api 0.16.5",
|
||||
"solana-vote-program 0.16.5",
|
||||
"solana-bpf-loader-api 0.16.6",
|
||||
"solana-bpf-loader-program 0.16.6",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-metrics 0.16.6",
|
||||
"solana-noop-program 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
"solana-stake-api 0.16.6",
|
||||
"solana-stake-program 0.16.6",
|
||||
"solana-storage-api 0.16.6",
|
||||
"solana-vote-api 0.16.6",
|
||||
"solana-vote-program 0.16.6",
|
||||
"sys-info 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-sdk"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2703,38 +2713,38 @@ dependencies = [
|
||||
"serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-ed25519-dalek 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-logger 0.16.6",
|
||||
"untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-stake-api"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-metrics 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-vote-api 0.16.5",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-metrics 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
"solana-vote-api 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-stake-program"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-stake-api 0.16.5",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
"solana-stake-api 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-storage-api"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2744,26 +2754,26 @@ dependencies = [
|
||||
"rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-storage-program"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-runtime 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-storage-api 0.16.5",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-runtime 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
"solana-storage-api 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-token-api"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2771,50 +2781,50 @@ dependencies = [
|
||||
"num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-token-program"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-token-api 0.16.5",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
"solana-token-api 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-upload-perf"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-metrics 0.16.5",
|
||||
"solana-metrics 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-validator"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana 0.16.5",
|
||||
"solana-drone 0.16.5",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-metrics 0.16.5",
|
||||
"solana-netutil 0.16.5",
|
||||
"solana-runtime 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-vote-api 0.16.5",
|
||||
"solana-vote-signer 0.16.5",
|
||||
"solana 0.16.6",
|
||||
"solana-drone 0.16.6",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-metrics 0.16.6",
|
||||
"solana-netutil 0.16.6",
|
||||
"solana-runtime 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
"solana-vote-api 0.16.6",
|
||||
"solana-vote-signer 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-validator-info"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2823,38 +2833,38 @@ dependencies = [
|
||||
"serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-client 0.16.5",
|
||||
"solana-config-api 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-client 0.16.6",
|
||||
"solana-config-api 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
"url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-vote-api"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-metrics 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-metrics 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-vote-program"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-vote-api 0.16.5",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
"solana-vote-api 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-vote-signer"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2864,13 +2874,13 @@ dependencies = [
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-metrics 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-metrics 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-wallet"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
dependencies = [
|
||||
"bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2880,19 +2890,19 @@ dependencies = [
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana 0.16.5",
|
||||
"solana-budget-api 0.16.5",
|
||||
"solana-budget-program 0.16.5",
|
||||
"solana-client 0.16.5",
|
||||
"solana-drone 0.16.5",
|
||||
"solana-logger 0.16.5",
|
||||
"solana-netutil 0.16.5",
|
||||
"solana-runtime 0.16.5",
|
||||
"solana-sdk 0.16.5",
|
||||
"solana-stake-api 0.16.5",
|
||||
"solana-storage-api 0.16.5",
|
||||
"solana-vote-api 0.16.5",
|
||||
"solana-vote-signer 0.16.5",
|
||||
"solana 0.16.6",
|
||||
"solana-budget-api 0.16.6",
|
||||
"solana-budget-program 0.16.6",
|
||||
"solana-client 0.16.6",
|
||||
"solana-drone 0.16.6",
|
||||
"solana-logger 0.16.6",
|
||||
"solana-netutil 0.16.6",
|
||||
"solana-runtime 0.16.6",
|
||||
"solana-sdk 0.16.6",
|
||||
"solana-stake-api 0.16.6",
|
||||
"solana-storage-api 0.16.6",
|
||||
"solana-vote-api 0.16.6",
|
||||
"solana-vote-signer 0.16.6",
|
||||
"url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
@ -3739,6 +3749,7 @@ dependencies = [
|
||||
"checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d"
|
||||
"checksum security-framework 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfab8dda0e7a327c696d893df9ffa19cadc4bd195797997f5223cf5831beaf05"
|
||||
"checksum security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3d6696852716b589dff9e886ff83778bb635150168e83afa8ac6b8a78cb82abc"
|
||||
"checksum semver 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3fdd61b85a0fa777f7fb7c454b9189b2941b110d1385ce84d7f76efdf1606a85"
|
||||
"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
|
||||
"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
|
||||
"checksum serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)" = "076a696fdea89c19d3baed462576b8f6d663064414b5c793642da8dfeb99475b"
|
||||
|
33
RELEASE.md
33
RELEASE.md
@ -61,7 +61,7 @@ There are three release channels that map to branches as follows:
|
||||
|
||||
## Release Steps
|
||||
|
||||
### Advance the Channels
|
||||
### Creating a new branch from master
|
||||
|
||||
#### Create the new branch
|
||||
1. Pick your branch point for release on master.
|
||||
@ -84,6 +84,12 @@ There are three release channels that map to branches as follows:
|
||||
At this point, `ci/channel-info.sh` should show your freshly cut release branch as
|
||||
"BETA_CHANNEL" and the previous release branch as "STABLE_CHANNEL".
|
||||
|
||||
### Update documentation
|
||||
|
||||
Document the new recommended version by updating
|
||||
```export SOLANA_RELEASE=[new scheduled TESTNET_TAG value]```
|
||||
in book/src/testnet-participation.md on the release (beta) branch.
|
||||
|
||||
### Make the Release
|
||||
|
||||
We use [github's Releases UI](https://github.com/solana-labs/solana/releases) for tagging a release.
|
||||
@ -106,6 +112,25 @@ We use [github's Releases UI](https://github.com/solana-labs/solana/releases) fo
|
||||
1. Push your Cargo.toml change and the autogenerated Cargo.lock changes to the
|
||||
release branch.
|
||||
|
||||
### Publish updated Book
|
||||
We maintain three copies of the "book" as official documentation:
|
||||
|
||||
1) "Book" is the documentation for the latest official release. This should get manually updated whenever a new release is made. It is published here:
|
||||
https://solana-labs.github.io/book/
|
||||
|
||||
2) "Book-edge" tracks the tip of the master branch and updates automatically.
|
||||
https://solana-labs.github.io/book-edge/
|
||||
|
||||
3) "Book-beta" tracks the tip of the beta branch and updates automatically.
|
||||
https://solana-labs.github.io/book-beta/
|
||||
|
||||
To manually trigger an update of the "Book", create a new job of the manual-update-book pipeline.
|
||||
Set the tag of the latest release as the PUBLISH_BOOK_TAG environment variable.
|
||||
```bash
|
||||
PUBLISH_BOOK_TAG=v0.16.6
|
||||
```
|
||||
https://buildkite.com/solana-labs/manual-update-book
|
||||
|
||||
### Update software on testnet.solana.com
|
||||
|
||||
The testnet running on testnet.solana.com is set to use a fixed release tag
|
||||
@ -145,12 +170,6 @@ TESTNET_TAG=[same value as used in TESTNET_TAG in the schedules]
|
||||
TESTNET_OP=create-and-start
|
||||
```
|
||||
|
||||
#### Update documentation
|
||||
|
||||
Document the new recommended version by updating
|
||||
```export SOLANA_RELEASE=[new scheduled TESTNET_TAG value]```
|
||||
in book/src/testnet-participation.md for both edge and beta channel branches.
|
||||
|
||||
### Alert the community
|
||||
|
||||
Notify Discord users on #validator-support that a new release for
|
||||
|
@ -2,7 +2,7 @@
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-bench-exchange"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@ -24,16 +24,16 @@ serde_derive = "1.0.92"
|
||||
serde_json = "1.0.39"
|
||||
serde_yaml = "0.8.9"
|
||||
# solana-runtime = { path = "../solana/runtime"}
|
||||
solana = { path = "../core", version = "0.16.5" }
|
||||
solana-client = { path = "../client", version = "0.16.5" }
|
||||
solana-drone = { path = "../drone", version = "0.16.5" }
|
||||
solana-exchange-api = { path = "../programs/exchange_api", version = "0.16.5" }
|
||||
solana-exchange-program = { path = "../programs/exchange_program", version = "0.16.5" }
|
||||
solana-logger = { path = "../logger", version = "0.16.5" }
|
||||
solana-metrics = { path = "../metrics", version = "0.16.5" }
|
||||
solana-netutil = { path = "../netutil", version = "0.16.5" }
|
||||
solana-runtime = { path = "../runtime", version = "0.16.5" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.5" }
|
||||
solana = { path = "../core", version = "0.16.6" }
|
||||
solana-client = { path = "../client", version = "0.16.6" }
|
||||
solana-drone = { path = "../drone", version = "0.16.6" }
|
||||
solana-exchange-api = { path = "../programs/exchange_api", version = "0.16.6" }
|
||||
solana-exchange-program = { path = "../programs/exchange_program", version = "0.16.6" }
|
||||
solana-logger = { path = "../logger", version = "0.16.6" }
|
||||
solana-metrics = { path = "../metrics", version = "0.16.6" }
|
||||
solana-netutil = { path = "../netutil", version = "0.16.6" }
|
||||
solana-runtime = { path = "../runtime", version = "0.16.6" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.6" }
|
||||
untrusted = "0.6.2"
|
||||
ws = "0.8.1"
|
||||
|
||||
|
@ -2,16 +2,16 @@
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-bench-streamer"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
|
||||
[dependencies]
|
||||
clap = "2.33.0"
|
||||
solana = { path = "../core", version = "0.16.5" }
|
||||
solana-logger = { path = "../logger", version = "0.16.5" }
|
||||
solana-netutil = { path = "../netutil", version = "0.16.5" }
|
||||
solana = { path = "../core", version = "0.16.6" }
|
||||
solana-logger = { path = "../logger", version = "0.16.6" }
|
||||
solana-netutil = { path = "../netutil", version = "0.16.6" }
|
||||
|
||||
[features]
|
||||
cuda = ["solana/cuda"]
|
||||
|
@ -2,7 +2,7 @@
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-bench-tps"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@ -15,14 +15,14 @@ serde = "1.0.92"
|
||||
serde_derive = "1.0.92"
|
||||
serde_json = "1.0.39"
|
||||
serde_yaml = "0.8.9"
|
||||
solana = { path = "../core", version = "0.16.5" }
|
||||
solana-client = { path = "../client", version = "0.16.5" }
|
||||
solana-drone = { path = "../drone", version = "0.16.5" }
|
||||
solana-logger = { path = "../logger", version = "0.16.5" }
|
||||
solana-metrics = { path = "../metrics", version = "0.16.5" }
|
||||
solana-netutil = { path = "../netutil", version = "0.16.5" }
|
||||
solana-runtime = { path = "../runtime", version = "0.16.5" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.5" }
|
||||
solana = { path = "../core", version = "0.16.6" }
|
||||
solana-client = { path = "../client", version = "0.16.6" }
|
||||
solana-drone = { path = "../drone", version = "0.16.6" }
|
||||
solana-logger = { path = "../logger", version = "0.16.6" }
|
||||
solana-metrics = { path = "../metrics", version = "0.16.6" }
|
||||
solana-netutil = { path = "../netutil", version = "0.16.6" }
|
||||
solana-runtime = { path = "../runtime", version = "0.16.6" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.6" }
|
||||
|
||||
[features]
|
||||
cuda = ["solana/cuda"]
|
||||
|
@ -6,7 +6,7 @@ use crate::bench::{
|
||||
};
|
||||
use solana::gossip_service::{discover_cluster, get_multi_client};
|
||||
use solana_sdk::fee_calculator::FeeCalculator;
|
||||
use solana_sdk::signature::Keypair;
|
||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||
use std::collections::HashMap;
|
||||
use std::fs::File;
|
||||
use std::io::prelude::*;
|
||||
@ -91,6 +91,10 @@ fn main() {
|
||||
keypairs.push(Keypair::from_bytes(&bytes).unwrap());
|
||||
last_balance = balance;
|
||||
});
|
||||
// Sort keypairs so that do_bench_tps() uses the same subset of accounts for each run.
|
||||
// This prevents the amount of storage needed for bench-tps accounts from creeping up
|
||||
// across multiple runs.
|
||||
keypairs.sort_by(|x, y| x.pubkey().to_string().cmp(&y.pubkey().to_string()));
|
||||
(keypairs, last_balance)
|
||||
} else {
|
||||
generate_and_fund_keypairs(
|
||||
|
@ -22,7 +22,7 @@ gossip endpoint (a socket address).
|
||||
|
||||
Records shared over gossip are arbitrary, but signed and versioned (with a
|
||||
timestamp) as needed to make sense to the node receiving them. If a node
|
||||
recieves two records from the same source, it it updates its own copy with the
|
||||
receives two records from the same source, it updates its own copy with the
|
||||
record with the most recent timestamp.
|
||||
|
||||
## Gossip Service Interface
|
||||
|
@ -25,6 +25,8 @@ Methods
|
||||
* [getAccountInfo](#getaccountinfo)
|
||||
* [getBalance](#getbalance)
|
||||
* [getClusterNodes](#getclusternodes)
|
||||
* [getEpochInfo](#getepochinfo)
|
||||
* [getLeaderSchedule](#getleaderschedule)
|
||||
* [getProgramAccounts](#getprogramaccounts)
|
||||
* [getRecentBlockhash](#getrecentblockhash)
|
||||
* [getSignatureStatus](#getsignaturestatus)
|
||||
@ -169,6 +171,50 @@ curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0", "id":1, "
|
||||
|
||||
---
|
||||
|
||||
### getEpochInfo
|
||||
Returns information about the current epoch
|
||||
|
||||
##### Parameters:
|
||||
None
|
||||
|
||||
##### Results:
|
||||
The result field will be an object with the following fields:
|
||||
* `epoch`, the current epoch
|
||||
* `slotIndex`, the current slot relative to the start of the current epoch
|
||||
* `slotsInEpoch`, the number of slots in this epoch
|
||||
|
||||
##### Example:
|
||||
```bash
|
||||
// Request
|
||||
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":1, "method":"getEpochInfo"}' http://localhost:8899
|
||||
|
||||
// Result
|
||||
{"jsonrpc":"2.0","result":{"epoch":3,"slotIndex":126,"slotsInEpoch":256},"id":1}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### getLeaderSchedule
|
||||
Returns the leader schedule for the current epoch
|
||||
|
||||
##### Parameters:
|
||||
None
|
||||
|
||||
##### Results:
|
||||
The result field will be an array of leader public keys (as base-58 encoded
|
||||
strings) for each slot in the current epoch
|
||||
|
||||
##### Example:
|
||||
```bash
|
||||
// Request
|
||||
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":1, "method":"getLeaderSchedule"}' http://localhost:8899
|
||||
|
||||
// Result
|
||||
{"jsonrpc":"2.0","result":[...],"id":1}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### getProgramAccounts
|
||||
Returns all accounts owned by the provided program Pubkey
|
||||
|
||||
|
@ -11,7 +11,7 @@ of getting its stake slashed. The economics are covered in [staking
|
||||
rewards](staking-rewards.md). This chapter, on the other hand, describes the
|
||||
underlying mechanics of its implementation.
|
||||
|
||||
## Basic Besign
|
||||
## Basic Design
|
||||
|
||||
The general idea is that the validator owns a Vote account. The Vote account
|
||||
tracks validator votes, counts validator generated credits, and provides any
|
||||
@ -114,7 +114,13 @@ tokens stored as `Account::lamports`.
|
||||
The stakes and the MiningPool are accounts that are owned by the same `Stake`
|
||||
program.
|
||||
|
||||
<<<<<<< HEAD
|
||||
### StakeInstruction::Initialize
|
||||
=======
|
||||
The Stake account is moved from Uninitialized to StakeState::Stake form. This is
|
||||
how stakers choose their initial delegate validator node and activate their
|
||||
stake account lamports.
|
||||
>>>>>>> 25080f1a3... fix book typos (#5185)
|
||||
|
||||
* `account[0]` - RW - The StakeState::Delegate instance.
|
||||
`StakeState::Delegate::credits_observed` is initialized to `VoteState::credits`.
|
||||
|
@ -91,6 +91,10 @@ History](#proof-of-history).
|
||||
The time, i.e. number of [slots](#slot), for which a [leader
|
||||
schedule](#leader-schedule) is valid.
|
||||
|
||||
#### finality
|
||||
|
||||
When nodes representing 2/3rd of the stake have a common [root](#root).
|
||||
|
||||
#### fork
|
||||
|
||||
A [ledger](#ledger) derived from common entries but then diverged.
|
||||
@ -213,6 +217,15 @@ The public key of a [keypair](#keypair).
|
||||
Storage mining client, stores some part of the ledger enumerated in blocks and
|
||||
submits storage proofs to the chain. Not a full-node.
|
||||
|
||||
#### root
|
||||
|
||||
A [block](#block) or [slot](#slot) that has reached maximum [lockout](#lockout)
|
||||
on a validator. The root is the highest block that is an ancestor of all active
|
||||
forks on a validator. All ancestor blocks of a root are also transitively a
|
||||
root. Blocks that are not an ancestor and not a descendant of the root are
|
||||
excluded from consideration for consensus and can be discarded.
|
||||
|
||||
|
||||
#### runtime
|
||||
|
||||
The component of a [fullnode](#fullnode) responsible for [program](#program)
|
||||
|
@ -74,8 +74,7 @@ The `solana-install` tool can be used to easily install and upgrade the cluster
|
||||
software on Linux x86_64 and mac OS systems.
|
||||
|
||||
```bash
|
||||
$ export SOLANA_RELEASE=v0.16.5 # skip this line to install the latest release
|
||||
$ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.16.5/install/solana-install-init.sh | sh -s
|
||||
$ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.16.6/install/solana-install-init.sh | sh -s
|
||||
```
|
||||
|
||||
Alternatively build the `solana-install` program from source and run the
|
||||
@ -122,8 +121,11 @@ $ ./scripts/cargo-install-all.sh .
|
||||
$ export PATH=$PWD/bin:$PATH
|
||||
```
|
||||
|
||||
If building for CUDA, include the `cuda` feature flag as well:
|
||||
If building for CUDA (Linux only), fetch the perf-libs first then include the
|
||||
`cuda` feature flag when building:
|
||||
```bash
|
||||
$ ./fetch-perf-libs.sh
|
||||
$ source /home/mvines/ws/solana/target/perf-libs/env.sh
|
||||
$ ./scripts/cargo-install-all.sh . cuda
|
||||
$ export PATH=$PWD/bin:$PATH
|
||||
```
|
||||
@ -152,21 +154,18 @@ choice, to start the node:
|
||||
|
||||
If this is a `solana-install`-installation:
|
||||
```bash
|
||||
$ clear-config.sh
|
||||
$ validator.sh --identity ~/validator-keypair.json --poll-for-new-genesis-block testnet.solana.com
|
||||
$ validator.sh --identity ~/validator-keypair.json --config-dir ~/validator-config --rpc-port 8899 --poll-for-new-genesis-block testnet.solana.com
|
||||
```
|
||||
|
||||
Alternatively, the `solana-install run` command can be used to run the validator
|
||||
node while periodically checking for and applying software updates:
|
||||
```bash
|
||||
$ clear-config.sh
|
||||
$ solana-install run validator.sh -- --identity ~/validator-keypair.json --poll-for-new-genesis-block testnet.solana.com
|
||||
$ solana-install run validator.sh -- --identity ~/validator-keypair.json --config-dir ~/validator-config --rpc-port 8899 --poll-for-new-genesis-block testnet.solana.com
|
||||
```
|
||||
|
||||
If you built from source:
|
||||
```bash
|
||||
$ USE_INSTALL=1 ./multinode-demo/clear-config.sh
|
||||
$ USE_INSTALL=1 ./multinode-demo/validator.sh --identity ~/validator-keypair.json --poll-for-new-genesis-block testnet.solana.com
|
||||
$ USE_INSTALL=1 ./multinode-demo/validator.sh --identity ~/validator-keypair.json --rpc-port 8899 --poll-for-new-genesis-block testnet.solana.com
|
||||
```
|
||||
|
||||
#### Enabling CUDA
|
||||
@ -241,6 +240,18 @@ A local InfluxDB and Grafana instance is now running on your machine. Define
|
||||
|
||||
Metrics should now be streaming and visible from your local Grafana dashboard.
|
||||
|
||||
#### Timezone For Log Messages
|
||||
Log messages emitted by your validator include a timestamp. When sharing logs
|
||||
with others to help triage issues, that timestamp can cause confusion as it does
|
||||
not contain timezone information.
|
||||
|
||||
To make it easier to compare logs between different sources we request that
|
||||
everybody use Pacific Time on their validator nodes. In Linux this can be
|
||||
accomplished by running:
|
||||
```bash
|
||||
$ sudo ln -sf /usr/share/zoneinfo/America/Los_Angeles /etc/localtime
|
||||
```
|
||||
|
||||
#### Publishing Validator Info
|
||||
|
||||
You can publish your validator information to the chain to be publicly visible
|
||||
@ -252,12 +263,12 @@ $ solana-validator-info publish ~/validator-keypair.json <VALIDATOR_NAME> <VALID
|
||||
```
|
||||
Optional fields for VALIDATOR_INFO_ARGS:
|
||||
* Website
|
||||
* Keybase ID
|
||||
* Keybase Username
|
||||
* Details
|
||||
|
||||
##### Keybase
|
||||
|
||||
Including a Keybase ID allows client applications (like the Solana Network
|
||||
Including a Keybase username allows client applications (like the Solana Network
|
||||
Explorer) to automatically pull in your validator public profile, including
|
||||
cryptographic proofs, brand identity, etc. To connect your validator pubkey with
|
||||
Keybase:
|
||||
@ -266,8 +277,8 @@ Keybase:
|
||||
2. Add your validator **identity pubkey** to Keybase:
|
||||
* Create an empty file on your local computer called `solana_pubkey_<PUBKEY>`
|
||||
* In Keybase, navigate to the Files section, and upload your pubkey file to
|
||||
your public folder: `/keybase/public/<KEYBASE_ID>`
|
||||
a `solana` subdirectory in your public folder: `/keybase/public/<KEYBASE_USERNAME>/solana`
|
||||
* To check your pubkey, ensure you can successfully browse to
|
||||
`https://keybase.pub/<KEYBASE_ID>/solana_pubkey_<PUBKEY>`
|
||||
3. Add or update your `solana-validator-info` with your Keybase ID. The CLI will
|
||||
verify the `solana_pubkey_<PUBKEY>` file
|
||||
`https://keybase.pub/<KEYBASE_USERNAME>/solana/validator-<PUBKEY>`
|
||||
3. Add or update your `solana-validator-info` with your Keybase username. The
|
||||
CLI will verify the `validator-<PUBKEY>` file
|
||||
|
@ -53,8 +53,8 @@ software.
|
||||
|
||||
##### Linux and mac OS
|
||||
```bash
|
||||
$ export SOLANA_RELEASE=v0.16.0 # skip this line to install the latest release
|
||||
$ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.16.0/install/solana-install-init.sh | sh -s
|
||||
$ export SOLANA_RELEASE=v0.16.6 # skip this line to install the latest release
|
||||
$ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.16.6/install/solana-install-init.sh | sh -s
|
||||
```
|
||||
|
||||
Alternatively build the `solana-install` program from source and run the
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-chacha-sys"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana chacha-sys"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
|
@ -59,7 +59,7 @@ if [[ -n $CI ]]; then
|
||||
fi
|
||||
if [[ $CI_LINUX = True ]]; then
|
||||
export CI_OS_NAME=linux
|
||||
elif [[ $CI_WINDOWS = True ]]; then
|
||||
else
|
||||
export CI_OS_NAME=windows
|
||||
fi
|
||||
export CI_REPO_SLUG=$APPVEYOR_REPO_NAME
|
||||
|
@ -2,8 +2,50 @@
|
||||
set -e
|
||||
|
||||
cd "$(dirname "$0")/.."
|
||||
BOOK="book"
|
||||
|
||||
book/build.sh
|
||||
source ci/rust-version.sh stable
|
||||
eval "$(ci/channel-info.sh)"
|
||||
|
||||
if [[ -n $PUBLISH_BOOK_TAG ]]; then
|
||||
CURRENT_TAG="$(git describe --tags)"
|
||||
COMMIT_TO_PUBLISH="$(git rev-list -n 1 "${PUBLISH_BOOK_TAG}")"
|
||||
|
||||
# book is manually published at a specified release tag
|
||||
if [[ $PUBLISH_BOOK_TAG != "$CURRENT_TAG" ]]; then
|
||||
(
|
||||
cat <<EOF
|
||||
steps:
|
||||
- trigger: "$BUILDKITE_PIPELINE_SLUG"
|
||||
async: true
|
||||
build:
|
||||
message: "$BUILDKITE_MESSAGE"
|
||||
commit: "$COMMIT_TO_PUBLISH"
|
||||
env:
|
||||
PUBLISH_BOOK_TAG: "$PUBLISH_BOOK_TAG"
|
||||
EOF
|
||||
) | buildkite-agent pipeline upload
|
||||
exit 0
|
||||
fi
|
||||
repo=git@github.com:solana-labs/book.git
|
||||
else
|
||||
# book-edge and book-beta are published automatically on the tip of the branch
|
||||
case $CHANNEL in
|
||||
edge)
|
||||
repo=git@github.com:solana-labs/book-edge.git
|
||||
;;
|
||||
beta)
|
||||
repo=git@github.com:solana-labs/book-beta.git
|
||||
;;
|
||||
*)
|
||||
echo "--- publish skipped"
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
BOOK=$CHANNEL
|
||||
fi
|
||||
|
||||
ci/docker-run.sh "$rust_stable_docker_image" bash -exc "book/build.sh"
|
||||
|
||||
echo --- create book repo
|
||||
(
|
||||
@ -16,22 +58,7 @@ echo --- create book repo
|
||||
git commit -m "${CI_COMMIT:-local}"
|
||||
)
|
||||
|
||||
eval "$(ci/channel-info.sh)"
|
||||
# Only publish the book from the edge and beta channels for now.
|
||||
case $CHANNEL in
|
||||
edge)
|
||||
repo=git@github.com:solana-labs/book-edge.git
|
||||
;;
|
||||
beta)
|
||||
repo=git@github.com:solana-labs/book.git
|
||||
;;
|
||||
*)
|
||||
echo "--- publish skipped"
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
|
||||
echo "--- publish $CHANNEL"
|
||||
echo "--- publish $BOOK"
|
||||
cd book/html/
|
||||
git remote add origin $repo
|
||||
git fetch origin master
|
||||
|
@ -2,6 +2,7 @@
|
||||
set -e
|
||||
cd "$(dirname "$0")/.."
|
||||
source ci/semver_bash/semver.sh
|
||||
source ci/rust-version.sh stable
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
is_crate_version_uploaded() {
|
||||
@ -25,8 +26,6 @@ expectedCrateVersion="$MAJOR.$MINOR.$PATCH$SPECIAL"
|
||||
exit 1
|
||||
}
|
||||
|
||||
cargoCommand="cargo publish --token $CRATES_IO_TOKEN"
|
||||
|
||||
Cargo_tomls=$(ci/order-crates-for-publishing.py)
|
||||
|
||||
for Cargo_toml in $Cargo_tomls; do
|
||||
@ -53,7 +52,7 @@ for Cargo_toml in $Cargo_tomls; do
|
||||
crate=$(dirname "$Cargo_toml")
|
||||
# TODO: the rocksdb package does not build with the stock rust docker image,
|
||||
# so use the solana rust docker image until this is resolved upstream
|
||||
source ci/rust-version.sh
|
||||
cargoCommand="cargo publish --token $CRATES_IO_TOKEN"
|
||||
ci/docker-run.sh "$rust_stable_docker_image" bash -exc "cd $crate; $cargoCommand"
|
||||
) || true # <-- Don't fail. We want to be able to retry the job in cases when a publish fails halfway due to network/cloud issues
|
||||
|
||||
@ -67,11 +66,11 @@ for Cargo_toml in $Cargo_tomls; do
|
||||
(
|
||||
set -x
|
||||
rm -rf crate-test
|
||||
cargo init crate-test
|
||||
cargo +"$rust_stable" init crate-test
|
||||
cd crate-test/
|
||||
echo "${crate_name} = \"${expectedCrateVersion}\"" >> Cargo.toml
|
||||
echo "[workspace]" >> Cargo.toml
|
||||
cargo check
|
||||
cargo +"$rust_stable" check
|
||||
) && really_uploaded=1
|
||||
if ((really_uploaded)); then
|
||||
break;
|
||||
|
@ -49,7 +49,8 @@ windows)
|
||||
TARGET=x86_64-pc-windows-msvc
|
||||
;;
|
||||
*)
|
||||
TARGET=unknown-unknown-unknown
|
||||
echo CI_OS_NAME unset
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
@ -70,6 +71,12 @@ echo --- Creating tarball
|
||||
source ci/rust-version.sh stable
|
||||
scripts/cargo-install-all.sh +"$rust_stable" solana-release
|
||||
|
||||
# Reduce the archive size until
|
||||
# https://github.com/appveyor/ci/issues/2997 is fixed
|
||||
if [[ -n $APPVEYOR ]]; then
|
||||
rm -f solana-release/bin/solana-validator.exe solana-release/bin/solana-bench-exchange.exe
|
||||
fi
|
||||
|
||||
if $PERF_LIBS; then
|
||||
rm -rf target/perf-libs
|
||||
./fetch-perf-libs.sh
|
||||
@ -94,22 +101,13 @@ echo --- Creating tarball
|
||||
set -e
|
||||
cd "$(dirname "$0")"/..
|
||||
export USE_INSTALL=1
|
||||
export REQUIRE_CONFIG_DIR=1
|
||||
exec multinode-demo/validator.sh "$@"
|
||||
EOF
|
||||
chmod +x solana-release/bin/validator.sh
|
||||
|
||||
# Add a wrapper script for clear-config.sh
|
||||
# TODO: Remove multinode/... from tarball
|
||||
cat > solana-release/bin/clear-config.sh <<'EOF'
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
cd "$(dirname "$0")"/..
|
||||
export USE_INSTALL=1
|
||||
exec multinode-demo/clear-config.sh "$@"
|
||||
EOF
|
||||
chmod +x solana-release/bin/clear-config.sh
|
||||
|
||||
tar jvcf solana-release-$TARGET.tar.bz2 solana-release/
|
||||
tar cvf solana-release-$TARGET.tar solana-release
|
||||
bzip2 solana-release-$TARGET.tar
|
||||
cp solana-release/bin/solana-install-init solana-install-init-$TARGET
|
||||
)
|
||||
|
||||
|
@ -14,7 +14,7 @@ do_bpf_check() {
|
||||
_ cargo +"$rust_stable" fmt --all -- --check
|
||||
_ cargo +"$rust_nightly" clippy --all -- --version
|
||||
_ cargo +"$rust_nightly" clippy --all -- --deny=warnings
|
||||
_ cargo +"$rust_stable" audit
|
||||
# _ cargo +"$rust_stable" audit
|
||||
}
|
||||
|
||||
(
|
||||
@ -33,7 +33,7 @@ do_bpf_check() {
|
||||
_ cargo +"$rust_stable" fmt --all -- --check
|
||||
_ cargo +"$rust_stable" clippy --all -- --version
|
||||
_ cargo +"$rust_stable" clippy --all -- --deny=warnings
|
||||
_ cargo +"$rust_stable" audit
|
||||
#_ cargo +"$rust_stable" audit
|
||||
_ ci/nits.sh
|
||||
_ ci/order-crates-for-publishing.py
|
||||
_ book/build.sh
|
||||
|
@ -24,7 +24,9 @@ blockstreamer=false
|
||||
deployUpdateManifest=true
|
||||
fetchLogs=true
|
||||
maybeHashesPerTick=
|
||||
maybeStakeNodesInGenesisBlock=
|
||||
maybeDisableAirdrops=
|
||||
maybeInternalNodesStakeLamports=
|
||||
maybeInternalNodesLamports=
|
||||
maybeExternalPrimordialAccountsFile=
|
||||
maybeLamports=
|
||||
maybeLetsEncrypt=
|
||||
@ -68,8 +70,12 @@ Deploys a CD testnet
|
||||
-s - Skip start. Nodes will still be created or configured, but network software will not be started.
|
||||
-S - Stop network software without tearing down nodes.
|
||||
-f - Discard validator nodes that didn't bootup successfully
|
||||
--stake-internal-nodes NUM_LAMPORTS
|
||||
- Amount to stake internal nodes. If set, airdrops are disabled.
|
||||
--no-airdrop
|
||||
- If set, disables airdrops. Nodes must be funded in genesis block when airdrops are disabled.
|
||||
--internal-nodes-stake-lamports NUM_LAMPORTS
|
||||
- Amount to stake internal nodes.
|
||||
--internal-nodes-lamports NUM_LAMPORTS
|
||||
- Amount to fund internal nodes in genesis block
|
||||
--external-accounts-file FILE_PATH
|
||||
- Path to external Primordial Accounts file, if it exists.
|
||||
--hashes-per-tick NUM_HASHES|sleep|auto
|
||||
@ -104,8 +110,14 @@ while [[ -n $1 ]]; do
|
||||
elif [[ $1 = --lamports ]]; then
|
||||
maybeLamports="$1 $2"
|
||||
shift 2
|
||||
elif [[ $1 = --stake-internal-nodes ]]; then
|
||||
maybeStakeNodesInGenesisBlock="$1 $2"
|
||||
elif [[ $1 = --no-airdrop ]]; then
|
||||
maybeDisableAirdrops="$1"
|
||||
shift 1
|
||||
elif [[ $1 = --internal-nodes-stake-lamports ]]; then
|
||||
maybeInternalNodesStakeLamports="$1 $2"
|
||||
shift 2
|
||||
elif [[ $1 = --internal-nodes-lamports ]]; then
|
||||
maybeInternalNodesLamports="$1 $2"
|
||||
shift 2
|
||||
elif [[ $1 = --external-accounts-file ]]; then
|
||||
maybeExternalPrimordialAccountsFile="$1 $2"
|
||||
@ -389,9 +401,17 @@ if ! $skipStart; then
|
||||
args+=(--deploy-update windows)
|
||||
fi
|
||||
|
||||
if [[ -n $maybeStakeNodesInGenesisBlock ]]; then
|
||||
# shellcheck disable=SC2206 # Do not want to quote $maybeStakeNodesInGenesisBlock
|
||||
args+=($maybeStakeNodesInGenesisBlock)
|
||||
if [[ -n $maybeDisableAirdrops ]]; then
|
||||
# shellcheck disable=SC2206
|
||||
args+=($maybeDisableAirdrops)
|
||||
fi
|
||||
if [[ -n $maybeInternalNodesStakeLamports ]]; then
|
||||
# shellcheck disable=SC2206 # Do not want to quote $maybeInternalNodesStakeLamports
|
||||
args+=($maybeInternalNodesStakeLamports)
|
||||
fi
|
||||
if [[ -n $maybeInternalNodesLamports ]]; then
|
||||
# shellcheck disable=SC2206 # Do not want to quote $maybeInternalNodesLamports
|
||||
args+=($maybeInternalNodesLamports)
|
||||
fi
|
||||
if [[ -n $maybeExternalPrimordialAccountsFile ]]; then
|
||||
# shellcheck disable=SC2206 # Do not want to quote $maybeExternalPrimordialAccountsFile
|
||||
|
@ -500,23 +500,40 @@ deploy() {
|
||||
maybeHashesPerTick="--hashes-per-tick ${HASHES_PER_TICK}"
|
||||
fi
|
||||
|
||||
if [[ -z $STAKE_INTERNAL_NODES ]]; then
|
||||
maybeStakeInternalNodes="--stake-internal-nodes 1000000000000"
|
||||
elif [[ $STAKE_INTERNAL_NODES == skip ]]; then
|
||||
maybeStakeInternalNodes=""
|
||||
if [[ -z $DISABLE_AIRDROPS ]]; then
|
||||
DISABLE_AIRDROPS="true"
|
||||
fi
|
||||
|
||||
if [[ $DISABLE_AIRDROPS == true ]] ; then
|
||||
maybeDisableAirdrops="--no-airdrop"
|
||||
else
|
||||
maybeStakeInternalNodes="--stake-internal-nodes ${STAKE_INTERNAL_NODES}"
|
||||
maybeDisableAirdrops=""
|
||||
fi
|
||||
|
||||
if [[ -z $INTERNAL_NODES_STAKE_LAMPORTS ]]; then
|
||||
maybeInternalNodesStakeLamports="--internal-nodes-stake-lamports 1000000000000"
|
||||
elif [[ $INTERNAL_NODES_STAKE_LAMPORTS == skip ]]; then
|
||||
maybeInternalNodesStakeLamports=""
|
||||
else
|
||||
maybeInternalNodesStakeLamports="--internal-nodes-stake-lamports ${INTERNAL_NODES_STAKE_LAMPORTS}"
|
||||
fi
|
||||
|
||||
if [[ -z $INTERNAL_NODES_LAMPORTS ]]; then
|
||||
maybeInternalNodesLamports="--internal-nodes-lamports 2000000000000"
|
||||
elif [[ $INTERNAL_NODES_LAMPORTS == skip ]]; then
|
||||
maybeInternalNodesLamports=""
|
||||
else
|
||||
maybeInternalNodesLamports="--internal-nodes-lamports ${INTERNAL_NODES_LAMPORTS}"
|
||||
fi
|
||||
|
||||
EXTERNAL_ACCOUNTS_FILE=/tmp/validator.yml
|
||||
if [[ -z $EXTERNAL_ACCOUNTS_FILE_URL ]]; then
|
||||
EXTERNAL_ACCOUNTS_FILE_URL=https://raw.githubusercontent.com/solana-labs/tour-de-sol/master/stage1/validator.yml
|
||||
EXTERNAL_ACCOUNTS_FILE_URL=https://raw.githubusercontent.com/solana-labs/tour-de-sol/master/validators/all.yml
|
||||
wget ${EXTERNAL_ACCOUNTS_FILE_URL} -O ${EXTERNAL_ACCOUNTS_FILE}
|
||||
maybeExternalAccountsFile="--external-accounts-file ${EXTERNAL_ACCOUNTS_FILE}"
|
||||
elif [[ $EXTERNAL_ACCOUNTS_FILE_URL == skip ]]; then
|
||||
maybeExternalAccountsFile=""
|
||||
else
|
||||
EXTERNAL_ACCOUNTS_FILE_URL=https://raw.githubusercontent.com/solana-labs/tour-de-sol/master/stage1/validator.yml
|
||||
wget ${EXTERNAL_ACCOUNTS_FILE_URL} -O ${EXTERNAL_ACCOUNTS_FILE}
|
||||
maybeExternalAccountsFile="--external-accounts-file ${EXTERNAL_ACCOUNTS_FILE}"
|
||||
fi
|
||||
@ -557,7 +574,9 @@ deploy() {
|
||||
${skipStart:+-s} \
|
||||
${maybeStop:+-S} \
|
||||
${maybeDelete:+-D} \
|
||||
${maybeStakeInternalNodes} \
|
||||
${maybeDisableAirdrops} \
|
||||
${maybeInternalNodesStakeLamports} \
|
||||
${maybeInternalNodesLamports} \
|
||||
${maybeExternalAccountsFile} \
|
||||
${maybeLamports} \
|
||||
${maybeAdditionalDisk} \
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-client"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana Client"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -19,10 +19,10 @@ reqwest = "0.9.18"
|
||||
serde = "1.0.92"
|
||||
serde_derive = "1.0.92"
|
||||
serde_json = "1.0.39"
|
||||
solana-netutil = { path = "../netutil", version = "0.16.5" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.5" }
|
||||
solana-netutil = { path = "../netutil", version = "0.16.6" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.6" }
|
||||
|
||||
[dev-dependencies]
|
||||
jsonrpc-core = "12.0.0"
|
||||
jsonrpc-http-server = "12.0.0"
|
||||
solana-logger = { path = "../logger", version = "0.16.5" }
|
||||
solana-logger = { path = "../logger", version = "0.16.6" }
|
||||
|
@ -1,7 +1,7 @@
|
||||
[package]
|
||||
name = "solana"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
documentation = "https://docs.rs/solana"
|
||||
homepage = "https://solana.com/"
|
||||
readme = "../README.md"
|
||||
@ -45,27 +45,27 @@ rocksdb = "0.11.0"
|
||||
serde = "1.0.92"
|
||||
serde_derive = "1.0.92"
|
||||
serde_json = "1.0.39"
|
||||
solana-budget-api = { path = "../programs/budget_api", version = "0.16.5" }
|
||||
solana-budget-program = { path = "../programs/budget_program", version = "0.16.5" }
|
||||
solana-chacha-sys = { path = "../chacha-sys", version = "0.16.5" }
|
||||
solana-client = { path = "../client", version = "0.16.5" }
|
||||
solana-config-program = { path = "../programs/config_program", version = "0.16.5" }
|
||||
solana-drone = { path = "../drone", version = "0.16.5" }
|
||||
solana-budget-api = { path = "../programs/budget_api", version = "0.16.6" }
|
||||
solana-budget-program = { path = "../programs/budget_program", version = "0.16.6" }
|
||||
solana-chacha-sys = { path = "../chacha-sys", version = "0.16.6" }
|
||||
solana-client = { path = "../client", version = "0.16.6" }
|
||||
solana-config-program = { path = "../programs/config_program", version = "0.16.6" }
|
||||
solana-drone = { path = "../drone", version = "0.16.6" }
|
||||
solana-ed25519-dalek = "0.2.0"
|
||||
solana-exchange-program = { path = "../programs/exchange_program", version = "0.16.5" }
|
||||
solana-kvstore = { path = "../kvstore", version = "0.16.5", optional = true }
|
||||
solana-logger = { path = "../logger", version = "0.16.5" }
|
||||
solana-metrics = { path = "../metrics", version = "0.16.5" }
|
||||
solana-netutil = { path = "../netutil", version = "0.16.5" }
|
||||
solana-runtime = { path = "../runtime", version = "0.16.5" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.5" }
|
||||
solana-stake-api = { path = "../programs/stake_api", version = "0.16.5" }
|
||||
solana-stake-program = { path = "../programs/stake_program", version = "0.16.5" }
|
||||
solana-storage-api = { path = "../programs/storage_api", version = "0.16.5" }
|
||||
solana-storage-program = { path = "../programs/storage_program", version = "0.16.5" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.16.5" }
|
||||
solana-vote-program = { path = "../programs/vote_program", version = "0.16.5" }
|
||||
solana-vote-signer = { path = "../vote-signer", version = "0.16.5" }
|
||||
solana-exchange-program = { path = "../programs/exchange_program", version = "0.16.6" }
|
||||
solana-kvstore = { path = "../kvstore", version = "0.16.6", optional = true }
|
||||
solana-logger = { path = "../logger", version = "0.16.6" }
|
||||
solana-metrics = { path = "../metrics", version = "0.16.6" }
|
||||
solana-netutil = { path = "../netutil", version = "0.16.6" }
|
||||
solana-runtime = { path = "../runtime", version = "0.16.6" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.6" }
|
||||
solana-stake-api = { path = "../programs/stake_api", version = "0.16.6" }
|
||||
solana-stake-program = { path = "../programs/stake_program", version = "0.16.6" }
|
||||
solana-storage-api = { path = "../programs/storage_api", version = "0.16.6" }
|
||||
solana-storage-program = { path = "../programs/storage_program", version = "0.16.6" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.16.6" }
|
||||
solana-vote-program = { path = "../programs/vote_program", version = "0.16.6" }
|
||||
solana-vote-signer = { path = "../vote-signer", version = "0.16.6" }
|
||||
sys-info = "0.5.7"
|
||||
tokio = "0.1"
|
||||
tokio-codec = "0.1"
|
||||
|
@ -193,6 +193,63 @@ impl Blocktree {
|
||||
false
|
||||
}
|
||||
|
||||
// silently deletes all blocktree column families starting at the given slot
|
||||
fn delete_all_columns(&self, starting_slot: u64) {
|
||||
match self.meta_cf.force_delete_all(Some(starting_slot)) {
|
||||
Ok(_) => (),
|
||||
Err(e) => error!(
|
||||
"Error: {:?} while deleting meta_cf for slot {:?}",
|
||||
e, starting_slot
|
||||
),
|
||||
}
|
||||
match self.data_cf.force_delete_all(Some((starting_slot, 0))) {
|
||||
Ok(_) => (),
|
||||
Err(e) => error!(
|
||||
"Error: {:?} while deleting data_cf for slot {:?}",
|
||||
e, starting_slot
|
||||
),
|
||||
}
|
||||
match self
|
||||
.erasure_meta_cf
|
||||
.force_delete_all(Some((starting_slot, 0)))
|
||||
{
|
||||
Ok(_) => (),
|
||||
Err(e) => error!(
|
||||
"Error: {:?} while deleting erasure_meta_cf for slot {:?}",
|
||||
e, starting_slot
|
||||
),
|
||||
}
|
||||
match self.erasure_cf.force_delete_all(Some((starting_slot, 0))) {
|
||||
Ok(_) => (),
|
||||
Err(e) => error!(
|
||||
"Error: {:?} while deleting erasure_cf for slot {:?}",
|
||||
e, starting_slot
|
||||
),
|
||||
}
|
||||
match self.orphans_cf.force_delete_all(Some(starting_slot)) {
|
||||
Ok(_) => (),
|
||||
Err(e) => error!(
|
||||
"Error: {:?} while deleting orphans_cf for slot {:?}",
|
||||
e, starting_slot
|
||||
),
|
||||
}
|
||||
match self.dead_slots_cf.force_delete_all(Some(starting_slot)) {
|
||||
Ok(_) => (),
|
||||
Err(e) => error!(
|
||||
"Error: {:?} while deleting dead_slots_cf for slot {:?}",
|
||||
e, starting_slot
|
||||
),
|
||||
}
|
||||
let roots_cf = self.db.column::<cf::Root>();
|
||||
match roots_cf.force_delete_all(Some(starting_slot)) {
|
||||
Ok(_) => (),
|
||||
Err(e) => error!(
|
||||
"Error: {:?} while deleting roots_cf for slot {:?}",
|
||||
e, starting_slot
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn erasure_meta(&self, slot: u64, set_index: u64) -> Result<Option<ErasureMeta>> {
|
||||
self.erasure_meta_cf.get((slot, set_index))
|
||||
}
|
||||
@ -201,7 +258,7 @@ impl Blocktree {
|
||||
self.orphans_cf.get(slot)
|
||||
}
|
||||
|
||||
pub fn rooted_slot_iterator<'a>(&'a self, slot: u64) -> Result<RootedSlotIterator<'a>> {
|
||||
pub fn rooted_slot_iterator(&self, slot: u64) -> Result<RootedSlotIterator> {
|
||||
RootedSlotIterator::new(slot, self)
|
||||
}
|
||||
|
||||
@ -527,6 +584,13 @@ impl Blocktree {
|
||||
self.data_cf.get_bytes((slot, index))
|
||||
}
|
||||
|
||||
/// Manually update the meta for a slot.
|
||||
/// Can interfere with automatic meta update and potentially break chaining.
|
||||
/// Dangerous. Use with care.
|
||||
pub fn put_meta_bytes(&self, slot: u64, bytes: &[u8]) -> Result<()> {
|
||||
self.meta_cf.put_bytes(slot, bytes)
|
||||
}
|
||||
|
||||
/// For benchmarks, testing, and setup.
|
||||
/// Does no metadata tracking. Use with care.
|
||||
pub fn put_data_blob_bytes(&self, slot: u64, index: u64, bytes: &[u8]) -> Result<()> {
|
||||
@ -848,6 +912,39 @@ impl Blocktree {
|
||||
batch_processor.write(batch)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Prune blocktree such that slots higher than `target_slot` are deleted and all references to
|
||||
/// higher slots are removed
|
||||
pub fn prune(&self, target_slot: u64) {
|
||||
let mut meta = self
|
||||
.meta(target_slot)
|
||||
.expect("couldn't read slot meta")
|
||||
.expect("no meta for target slot");
|
||||
meta.next_slots.clear();
|
||||
self.put_meta_bytes(
|
||||
target_slot,
|
||||
&bincode::serialize(&meta).expect("couldn't get meta bytes"),
|
||||
)
|
||||
.expect("unable to update meta for target slot");
|
||||
|
||||
self.delete_all_columns(target_slot + 1);
|
||||
|
||||
// fixup anything that refers to non-root slots and delete the rest
|
||||
for (slot, mut meta) in self
|
||||
.slot_meta_iterator(0)
|
||||
.expect("unable to iterate over meta")
|
||||
{
|
||||
if slot > target_slot {
|
||||
break;
|
||||
}
|
||||
meta.next_slots.retain(|slot| *slot <= target_slot);
|
||||
self.put_meta_bytes(
|
||||
slot,
|
||||
&bincode::serialize(&meta).expect("couldn't update meta"),
|
||||
)
|
||||
.expect("couldn't update meta");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn insert_data_blob_batch<'a, I>(
|
||||
@ -3060,6 +3157,66 @@ pub mod tests {
|
||||
Blocktree::destroy(&blocktree_path).expect("Expected successful database destruction");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_prune() {
|
||||
let blocktree_path = get_tmp_ledger_path!();
|
||||
let blocktree = Blocktree::open(&blocktree_path).unwrap();
|
||||
let (blobs, _) = make_many_slot_entries(0, 50, 6);
|
||||
blocktree.write_blobs(blobs).unwrap();
|
||||
blocktree
|
||||
.slot_meta_iterator(0)
|
||||
.unwrap()
|
||||
.for_each(|(_, meta)| assert_eq!(meta.last_index, 5));
|
||||
|
||||
blocktree.prune(5);
|
||||
|
||||
blocktree
|
||||
.slot_meta_iterator(0)
|
||||
.unwrap()
|
||||
.for_each(|(slot, meta)| {
|
||||
assert!(slot <= 5);
|
||||
assert_eq!(meta.last_index, 5)
|
||||
});
|
||||
|
||||
let data_iter = blocktree.data_cf.iter(Some((0, 0))).unwrap();
|
||||
for ((slot, _), _) in data_iter {
|
||||
if slot > 5 {
|
||||
assert!(false);
|
||||
}
|
||||
}
|
||||
|
||||
drop(blocktree);
|
||||
Blocktree::destroy(&blocktree_path).expect("Expected successful database destruction");
|
||||
}
|
||||
|
||||
#[should_panic]
|
||||
#[test]
|
||||
fn test_prune_out_of_bounds() {
|
||||
let blocktree_path = get_tmp_ledger_path!();
|
||||
let blocktree = Blocktree::open(&blocktree_path).unwrap();
|
||||
|
||||
// slot 5 does not exist, prune should panic
|
||||
blocktree.prune(5);
|
||||
|
||||
drop(blocktree);
|
||||
Blocktree::destroy(&blocktree_path).expect("Expected successful database destruction");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_iter_bounds() {
|
||||
let blocktree_path = get_tmp_ledger_path!();
|
||||
let blocktree = Blocktree::open(&blocktree_path).unwrap();
|
||||
|
||||
// slot 5 does not exist, iter should be ok and should be a noop
|
||||
blocktree
|
||||
.slot_meta_iterator(5)
|
||||
.unwrap()
|
||||
.for_each(|_| assert!(false));
|
||||
|
||||
drop(blocktree);
|
||||
Blocktree::destroy(&blocktree_path).expect("Expected successful database destruction");
|
||||
}
|
||||
|
||||
mod erasure {
|
||||
use super::*;
|
||||
use crate::blocktree::meta::ErasureMetaStatus;
|
||||
|
@ -405,6 +405,16 @@ where
|
||||
Ok(iter.map(|(key, value)| (C::index(&key), value)))
|
||||
}
|
||||
|
||||
//TODO add a delete_until that goes the other way
|
||||
pub fn force_delete_all(&self, start_from: Option<C::Index>) -> Result<()> {
|
||||
let iter = self.iter(start_from)?;
|
||||
iter.for_each(|(index, _)| match self.delete(index) {
|
||||
Ok(_) => (),
|
||||
Err(e) => error!("Error: {:?} while deleting {:?}", e, C::NAME),
|
||||
});
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn handle(&self) -> B::ColumnFamily {
|
||||
self.backend.cf_handle(C::NAME).clone()
|
||||
|
@ -234,6 +234,7 @@ impl ClusterInfoRepairListener {
|
||||
|
||||
let _ = Self::serve_repairs_to_repairee(
|
||||
my_pubkey,
|
||||
repairee_pubkey,
|
||||
my_root,
|
||||
blocktree,
|
||||
&repairee_epoch_slots,
|
||||
@ -249,8 +250,10 @@ impl ClusterInfoRepairListener {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
fn serve_repairs_to_repairee(
|
||||
my_pubkey: &Pubkey,
|
||||
repairee_pubkey: &Pubkey,
|
||||
my_root: u64,
|
||||
blocktree: &Blocktree,
|
||||
repairee_epoch_slots: &EpochSlots,
|
||||
@ -263,8 +266,8 @@ impl ClusterInfoRepairListener {
|
||||
let slot_iter = blocktree.rooted_slot_iterator(repairee_epoch_slots.root);
|
||||
if slot_iter.is_err() {
|
||||
info!(
|
||||
"Root for repairee is on different fork. My root: {}, repairee_root: {}",
|
||||
my_root, repairee_epoch_slots.root
|
||||
"Root for repairee is on different fork. My root: {}, repairee_root: {} repairee_pubkey: {:?}",
|
||||
my_root, repairee_epoch_slots.root, repairee_pubkey,
|
||||
);
|
||||
return Ok(());
|
||||
}
|
||||
@ -656,6 +659,7 @@ mod tests {
|
||||
for repairman_pubkey in &eligible_repairmen {
|
||||
ClusterInfoRepairListener::serve_repairs_to_repairee(
|
||||
&repairman_pubkey,
|
||||
&mock_repairee.id,
|
||||
num_slots - 1,
|
||||
&blocktree,
|
||||
&repairee_epoch_slots,
|
||||
@ -725,6 +729,7 @@ mod tests {
|
||||
|
||||
ClusterInfoRepairListener::serve_repairs_to_repairee(
|
||||
&my_pubkey,
|
||||
&mock_repairee.id,
|
||||
total_slots - 1,
|
||||
&blocktree,
|
||||
&repairee_epoch_slots,
|
||||
@ -746,6 +751,7 @@ mod tests {
|
||||
EpochSlots::new(mock_repairee.id, stakers_slot_offset, repairee_slots, 1);
|
||||
ClusterInfoRepairListener::serve_repairs_to_repairee(
|
||||
&my_pubkey,
|
||||
&mock_repairee.id,
|
||||
total_slots - 1,
|
||||
&blocktree,
|
||||
&repairee_epoch_slots,
|
||||
|
@ -29,6 +29,10 @@ impl LeaderSchedule {
|
||||
.collect();
|
||||
Self { slot_leaders }
|
||||
}
|
||||
|
||||
pub(crate) fn get_slot_leaders(&self) -> &[Pubkey] {
|
||||
&self.slot_leaders
|
||||
}
|
||||
}
|
||||
|
||||
impl Index<u64> for LeaderSchedule {
|
||||
|
@ -5,16 +5,16 @@ use solana_sdk::pubkey::Pubkey;
|
||||
use solana_sdk::timing::NUM_CONSECUTIVE_LEADER_SLOTS;
|
||||
|
||||
/// Return the leader schedule for the given epoch.
|
||||
pub fn leader_schedule(epoch_height: u64, bank: &Bank) -> Option<LeaderSchedule> {
|
||||
staking_utils::staked_nodes_at_epoch(bank, epoch_height).map(|stakes| {
|
||||
pub fn leader_schedule(epoch: u64, bank: &Bank) -> Option<LeaderSchedule> {
|
||||
staking_utils::staked_nodes_at_epoch(bank, epoch).map(|stakes| {
|
||||
let mut seed = [0u8; 32];
|
||||
seed[0..8].copy_from_slice(&epoch_height.to_le_bytes());
|
||||
seed[0..8].copy_from_slice(&epoch.to_le_bytes());
|
||||
let mut stakes: Vec<_> = stakes.into_iter().collect();
|
||||
sort_stakes(&mut stakes);
|
||||
LeaderSchedule::new(
|
||||
&stakes,
|
||||
seed,
|
||||
bank.get_slots_in_epoch(epoch_height),
|
||||
bank.get_slots_in_epoch(epoch),
|
||||
NUM_CONSECUTIVE_LEADER_SLOTS,
|
||||
)
|
||||
})
|
||||
|
@ -112,6 +112,8 @@ impl ReplayStage {
|
||||
.spawn(move || {
|
||||
let _exit = Finalizer::new(exit_.clone());
|
||||
let mut progress = HashMap::new();
|
||||
let mut current_leader = None;
|
||||
|
||||
loop {
|
||||
let now = Instant::now();
|
||||
// Stop getting entries if we get exit signal
|
||||
@ -124,17 +126,15 @@ impl ReplayStage {
|
||||
&mut bank_forks.write().unwrap(),
|
||||
&leader_schedule_cache,
|
||||
);
|
||||
|
||||
let mut is_tpu_bank_active = poh_recorder.lock().unwrap().bank().is_some();
|
||||
|
||||
Self::replay_active_banks(
|
||||
let did_complete_bank = Self::replay_active_banks(
|
||||
&blocktree,
|
||||
&bank_forks,
|
||||
&my_pubkey,
|
||||
&mut ticks_per_slot,
|
||||
&mut progress,
|
||||
&slot_full_sender,
|
||||
)?;
|
||||
);
|
||||
|
||||
if ticks_per_slot == 0 {
|
||||
let frozen_banks = bank_forks.read().unwrap().frozen_banks();
|
||||
@ -148,6 +148,17 @@ impl ReplayStage {
|
||||
if let Some((_, bank)) = votable.last() {
|
||||
subscriptions.notify_subscribers(bank.slot(), &bank_forks);
|
||||
|
||||
if let Some(new_leader) =
|
||||
leader_schedule_cache.slot_leader_at(bank.slot(), Some(&bank))
|
||||
{
|
||||
Self::log_leader_change(
|
||||
&my_pubkey,
|
||||
bank.slot(),
|
||||
&mut current_leader,
|
||||
&new_leader,
|
||||
);
|
||||
}
|
||||
|
||||
Self::handle_votable_bank(
|
||||
&bank,
|
||||
&bank_forks,
|
||||
@ -197,12 +208,25 @@ impl ReplayStage {
|
||||
grace_ticks,
|
||||
&leader_schedule_cache,
|
||||
);
|
||||
|
||||
if let Some(bank) = poh_recorder.lock().unwrap().bank() {
|
||||
Self::log_leader_change(
|
||||
&my_pubkey,
|
||||
bank.slot(),
|
||||
&mut current_leader,
|
||||
&my_pubkey,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
inc_new_counter_info!(
|
||||
"replicate_stage-duration",
|
||||
duration_as_ms(&now.elapsed()) as usize
|
||||
);
|
||||
if did_complete_bank {
|
||||
//just processed a bank, skip the signal; maybe there's more slots available
|
||||
continue;
|
||||
}
|
||||
let timer = Duration::from_millis(100);
|
||||
let result = ledger_signal_receiver.recv_timeout(timer);
|
||||
match result {
|
||||
@ -216,6 +240,31 @@ impl ReplayStage {
|
||||
.unwrap();
|
||||
(Self { t_replay }, slot_full_receiver, root_bank_receiver)
|
||||
}
|
||||
|
||||
fn log_leader_change(
|
||||
my_pubkey: &Pubkey,
|
||||
bank_slot: u64,
|
||||
current_leader: &mut Option<Pubkey>,
|
||||
new_leader: &Pubkey,
|
||||
) {
|
||||
if let Some(ref current_leader) = current_leader {
|
||||
if current_leader != new_leader {
|
||||
let msg = if current_leader == my_pubkey {
|
||||
"I am no longer the leader"
|
||||
} else if new_leader == my_pubkey {
|
||||
"I am the new leader"
|
||||
} else {
|
||||
""
|
||||
};
|
||||
info!(
|
||||
"LEADER CHANGE at slot: {} leader: {}. {}",
|
||||
bank_slot, new_leader, msg
|
||||
);
|
||||
}
|
||||
}
|
||||
current_leader.replace(new_leader.to_owned());
|
||||
}
|
||||
|
||||
pub fn start_leader(
|
||||
my_pubkey: &Pubkey,
|
||||
bank_forks: &Arc<RwLock<BankForks>>,
|
||||
@ -237,7 +286,8 @@ impl ReplayStage {
|
||||
};
|
||||
assert!(parent.is_frozen());
|
||||
|
||||
leader_schedule_cache.slot_leader_at(poh_slot, Some(&parent))
|
||||
leader_schedule_cache
|
||||
.slot_leader_at(poh_slot, Some(&parent))
|
||||
.map(|next_leader| {
|
||||
debug!(
|
||||
"me: {} leader {} at poh slot {}",
|
||||
@ -249,7 +299,8 @@ impl ReplayStage {
|
||||
datapoint_warn!(
|
||||
"replay_stage-new_leader",
|
||||
("count", poh_slot, i64),
|
||||
("grace", grace_ticks, i64));
|
||||
("grace", grace_ticks, i64)
|
||||
);
|
||||
let tpu_bank = Bank::new_from_parent(&parent, my_pubkey, poh_slot);
|
||||
bank_forks.write().unwrap().insert(tpu_bank);
|
||||
if let Some(tpu_bank) = bank_forks.read().unwrap().get(poh_slot).cloned() {
|
||||
@ -257,12 +308,6 @@ impl ReplayStage {
|
||||
bank_forks.read().unwrap().working_bank().slot(),
|
||||
tpu_bank.slot()
|
||||
);
|
||||
debug!(
|
||||
"poh_recorder new working bank: me: {} next_slot: {} next_leader: {}",
|
||||
my_pubkey,
|
||||
tpu_bank.slot(),
|
||||
next_leader
|
||||
);
|
||||
poh_recorder.lock().unwrap().set_bank(&tpu_bank);
|
||||
}
|
||||
}
|
||||
@ -391,11 +436,18 @@ impl ReplayStage {
|
||||
next_leader_slot,
|
||||
ticks_per_slot,
|
||||
);
|
||||
debug!(
|
||||
"{:?} voted and reset poh at {}. next leader slot {:?}",
|
||||
|
||||
let next_leader_msg = if let Some(next_leader_slot) = next_leader_slot {
|
||||
format!("My next leader slot is #{}", next_leader_slot)
|
||||
} else {
|
||||
"I am not in the upcoming leader schedule yet".to_owned()
|
||||
};
|
||||
|
||||
info!(
|
||||
"{} voted and reset poh at {}. {}",
|
||||
my_pubkey,
|
||||
bank.tick_height(),
|
||||
next_leader_slot
|
||||
next_leader_msg,
|
||||
);
|
||||
}
|
||||
|
||||
@ -406,7 +458,8 @@ impl ReplayStage {
|
||||
ticks_per_slot: &mut u64,
|
||||
progress: &mut HashMap<u64, ForkProgress>,
|
||||
slot_full_sender: &Sender<(u64, Pubkey)>,
|
||||
) -> Result<()> {
|
||||
) -> bool {
|
||||
let mut did_complete_bank = false;
|
||||
let active_banks = bank_forks.read().unwrap().active_banks();
|
||||
trace!("active banks {:?}", active_banks);
|
||||
|
||||
@ -429,11 +482,11 @@ impl ReplayStage {
|
||||
}
|
||||
let max_tick_height = (*bank_slot + 1) * bank.ticks_per_slot() - 1;
|
||||
if bank.tick_height() == max_tick_height {
|
||||
did_complete_bank = true;
|
||||
Self::process_completed_bank(my_pubkey, bank, slot_full_sender);
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
did_complete_bank
|
||||
}
|
||||
|
||||
fn generate_votable_banks(
|
||||
@ -525,12 +578,12 @@ impl ReplayStage {
|
||||
.map(|s| s.is_frozen())
|
||||
.unwrap_or(true)
|
||||
{
|
||||
info!("validator fork confirmed {} {}", *slot, duration);
|
||||
info!("validator fork confirmed {} {}ms", *slot, duration);
|
||||
datapoint_warn!("validator-confirmation", ("duration_ms", duration, i64));
|
||||
false
|
||||
} else {
|
||||
debug!(
|
||||
"validator fork not confirmed {} {} {:?}",
|
||||
"validator fork not confirmed {} {}ms {:?}",
|
||||
*slot,
|
||||
duration,
|
||||
stake_lockouts.get(slot)
|
||||
|
@ -209,6 +209,19 @@ pub struct RpcVoteAccountInfo {
|
||||
pub commission: u8,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Clone, Debug)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct RpcEpochInfo {
|
||||
/// The current epoch
|
||||
pub epoch: u64,
|
||||
|
||||
/// The current slot, relative to the start of the current epoch
|
||||
pub slot_index: u64,
|
||||
|
||||
/// The number of slots in this epoch
|
||||
pub slots_in_epoch: u64,
|
||||
}
|
||||
|
||||
#[rpc(server)]
|
||||
pub trait RpcSol {
|
||||
type Metadata;
|
||||
@ -228,6 +241,12 @@ pub trait RpcSol {
|
||||
#[rpc(meta, name = "getClusterNodes")]
|
||||
fn get_cluster_nodes(&self, _: Self::Metadata) -> Result<Vec<RpcContactInfo>>;
|
||||
|
||||
#[rpc(meta, name = "getEpochInfo")]
|
||||
fn get_epoch_info(&self, _: Self::Metadata) -> Result<RpcEpochInfo>;
|
||||
|
||||
#[rpc(meta, name = "getLeaderSchedule")]
|
||||
fn get_leader_schedule(&self, _: Self::Metadata) -> Result<Option<Vec<String>>>;
|
||||
|
||||
#[rpc(meta, name = "getRecentBlockhash")]
|
||||
fn get_recent_blockhash(&self, _: Self::Metadata) -> Result<(String, FeeCalculator)>;
|
||||
|
||||
@ -355,6 +374,32 @@ impl RpcSol for RpcSolImpl {
|
||||
.collect())
|
||||
}
|
||||
|
||||
fn get_epoch_info(&self, meta: Self::Metadata) -> Result<RpcEpochInfo> {
|
||||
let bank = meta.request_processor.read().unwrap().bank();
|
||||
let epoch_schedule = bank.epoch_schedule();
|
||||
let (epoch, slot_index) = epoch_schedule.get_epoch_and_slot_index(bank.slot());
|
||||
Ok(RpcEpochInfo {
|
||||
epoch,
|
||||
slot_index,
|
||||
slots_in_epoch: epoch_schedule.get_slots_in_epoch(epoch),
|
||||
})
|
||||
}
|
||||
|
||||
fn get_leader_schedule(&self, meta: Self::Metadata) -> Result<Option<Vec<String>>> {
|
||||
let bank = meta.request_processor.read().unwrap().bank();
|
||||
Ok(
|
||||
crate::leader_schedule_utils::leader_schedule(bank.epoch(), &bank).map(
|
||||
|leader_schedule| {
|
||||
leader_schedule
|
||||
.get_slot_leaders()
|
||||
.iter()
|
||||
.map(|pubkey| pubkey.to_string())
|
||||
.collect()
|
||||
},
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
fn get_recent_blockhash(&self, meta: Self::Metadata) -> Result<(String, FeeCalculator)> {
|
||||
debug!("get_recent_blockhash rpc request received");
|
||||
Ok(meta
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-drone"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana Drone"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -20,9 +20,9 @@ clap = "2.33"
|
||||
log = "0.4.2"
|
||||
serde = "1.0.92"
|
||||
serde_derive = "1.0.92"
|
||||
solana-logger = { path = "../logger", version = "0.16.5" }
|
||||
solana-metrics = { path = "../metrics", version = "0.16.5" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.5" }
|
||||
solana-logger = { path = "../logger", version = "0.16.6" }
|
||||
solana-metrics = { path = "../metrics", version = "0.16.6" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.6" }
|
||||
tokio = "0.1"
|
||||
tokio-codec = "0.1"
|
||||
|
||||
|
@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-genesis"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@ -15,24 +15,24 @@ serde = "1.0.92"
|
||||
serde_derive = "1.0.92"
|
||||
serde_json = "1.0.39"
|
||||
serde_yaml = "0.8.9"
|
||||
solana = { path = "../core", version = "0.16.5" }
|
||||
solana-bpf-loader-api = { path = "../programs/bpf_loader_api", version = "0.16.5" }
|
||||
solana-bpf-loader-program = { path = "../programs/bpf_loader_program", version = "0.16.5" }
|
||||
solana-budget-api = { path = "../programs/budget_api", version = "0.16.5" }
|
||||
solana-budget-program = { path = "../programs/budget_program", version = "0.16.5" }
|
||||
solana-config-api = { path = "../programs/config_api", version = "0.16.5" }
|
||||
solana-config-program = { path = "../programs/config_program", version = "0.16.5" }
|
||||
solana-exchange-api = { path = "../programs/exchange_api", version = "0.16.5" }
|
||||
solana-exchange-program = { path = "../programs/exchange_program", version = "0.16.5" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.5" }
|
||||
solana-stake-api = { path = "../programs/stake_api", version = "0.16.5" }
|
||||
solana-stake-program = { path = "../programs/stake_program", version = "0.16.5" }
|
||||
solana-storage-api = { path = "../programs/storage_api", version = "0.16.5" }
|
||||
solana-storage-program = { path = "../programs/storage_program", version = "0.16.5" }
|
||||
solana-token-api = { path = "../programs/token_api", version = "0.16.5" }
|
||||
solana-token-program = { path = "../programs/token_program", version = "0.16.5" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.16.5" }
|
||||
solana-vote-program = { path = "../programs/vote_program", version = "0.16.5" }
|
||||
solana = { path = "../core", version = "0.16.6" }
|
||||
solana-bpf-loader-api = { path = "../programs/bpf_loader_api", version = "0.16.6" }
|
||||
solana-bpf-loader-program = { path = "../programs/bpf_loader_program", version = "0.16.6" }
|
||||
solana-budget-api = { path = "../programs/budget_api", version = "0.16.6" }
|
||||
solana-budget-program = { path = "../programs/budget_program", version = "0.16.6" }
|
||||
solana-config-api = { path = "../programs/config_api", version = "0.16.6" }
|
||||
solana-config-program = { path = "../programs/config_program", version = "0.16.6" }
|
||||
solana-exchange-api = { path = "../programs/exchange_api", version = "0.16.6" }
|
||||
solana-exchange-program = { path = "../programs/exchange_program", version = "0.16.6" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.6" }
|
||||
solana-stake-api = { path = "../programs/stake_api", version = "0.16.6" }
|
||||
solana-stake-program = { path = "../programs/stake_program", version = "0.16.6" }
|
||||
solana-storage-api = { path = "../programs/storage_api", version = "0.16.6" }
|
||||
solana-storage-program = { path = "../programs/storage_program", version = "0.16.6" }
|
||||
solana-token-api = { path = "../programs/token_api", version = "0.16.6" }
|
||||
solana-token-program = { path = "../programs/token_program", version = "0.16.6" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.16.6" }
|
||||
solana-vote-program = { path = "../programs/vote_program", version = "0.16.6" }
|
||||
|
||||
[dev-dependencies]
|
||||
hashbrown = "0.3.0"
|
||||
|
@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-gossip"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@ -11,10 +11,10 @@ homepage = "https://solana.com/"
|
||||
[dependencies]
|
||||
clap = "2.33.0"
|
||||
env_logger = "0.6.1"
|
||||
solana = { path = "../core", version = "0.16.5" }
|
||||
solana-client = { path = "../client", version = "0.16.5" }
|
||||
solana-netutil = { path = "../netutil", version = "0.16.5" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.5" }
|
||||
solana = { path = "../core", version = "0.16.6" }
|
||||
solana-client = { path = "../client", version = "0.16.6" }
|
||||
solana-netutil = { path = "../netutil", version = "0.16.6" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.6" }
|
||||
|
||||
[features]
|
||||
cuda = []
|
||||
|
@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-install"
|
||||
description = "The solana cluster software installer"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@ -28,13 +28,14 @@ log = "0.4.2"
|
||||
nix = "0.14.1"
|
||||
reqwest = "0.9.18"
|
||||
ring = "0.13.2"
|
||||
semver = "0.7.0"
|
||||
serde = "1.0.92"
|
||||
serde_derive = "1.0.92"
|
||||
serde_yaml = "0.8.9"
|
||||
solana-client = { path = "../client", version = "0.16.5" }
|
||||
solana-config-api = { path = "../programs/config_api", version = "0.16.5" }
|
||||
solana-logger = { path = "../logger", version = "0.16.5" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.5" }
|
||||
solana-client = { path = "../client", version = "0.16.6" }
|
||||
solana-config-api = { path = "../programs/config_api", version = "0.16.6" }
|
||||
solana-logger = { path = "../logger", version = "0.16.6" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.6" }
|
||||
tar = "0.4.26"
|
||||
tempdir = "0.3.7"
|
||||
url = "1.7.2"
|
||||
|
@ -498,13 +498,19 @@ pub fn init(
|
||||
json_rpc_url: &str,
|
||||
update_manifest_pubkey: &Pubkey,
|
||||
no_modify_path: bool,
|
||||
release_semver: Option<&str>,
|
||||
) -> Result<(), String> {
|
||||
let config = {
|
||||
// Write new config file only if different, so that running |solana-install init|
|
||||
// repeatedly doesn't unnecessarily re-download
|
||||
let mut current_config = Config::load(config_file).unwrap_or_default();
|
||||
current_config.current_update_manifest = None;
|
||||
let config = Config::new(data_dir, json_rpc_url, update_manifest_pubkey);
|
||||
let config = Config::new(
|
||||
data_dir,
|
||||
json_rpc_url,
|
||||
update_manifest_pubkey,
|
||||
release_semver,
|
||||
);
|
||||
if current_config != config {
|
||||
config.save(config_file)?;
|
||||
}
|
||||
@ -525,24 +531,42 @@ pub fn init(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn github_download_url(release_semver: &str) -> String {
|
||||
format!(
|
||||
"https://github.com/solana-labs/solana/releases/download/v{}/solana-release-{}.tar.bz2",
|
||||
release_semver,
|
||||
crate::build_env::TARGET
|
||||
)
|
||||
}
|
||||
|
||||
pub fn info(config_file: &str, local_info_only: bool) -> Result<Option<UpdateManifest>, String> {
|
||||
let config = Config::load(config_file)?;
|
||||
println_name_value("JSON RPC URL:", &config.json_rpc_url);
|
||||
println_name_value(
|
||||
"Update manifest pubkey:",
|
||||
&config.update_manifest_pubkey.to_string(),
|
||||
);
|
||||
|
||||
println_name_value("Configuration:", &config_file);
|
||||
println_name_value(
|
||||
"Active release directory:",
|
||||
&config.active_release_dir().to_str().unwrap_or("?"),
|
||||
);
|
||||
if let Some(release_semver) = &config.release_semver {
|
||||
println_name_value(&format!("{}Release version:", BULLET), &release_semver);
|
||||
println_name_value(
|
||||
&format!("{}Release URL:", BULLET),
|
||||
&github_download_url(release_semver),
|
||||
);
|
||||
return Ok(None);
|
||||
}
|
||||
|
||||
println_name_value("JSON RPC URL:", &config.json_rpc_url);
|
||||
println_name_value(
|
||||
"Update manifest pubkey:",
|
||||
&config.update_manifest_pubkey.to_string(),
|
||||
);
|
||||
|
||||
fn print_update_manifest(update_manifest: &UpdateManifest) {
|
||||
let when = Local.timestamp(update_manifest.timestamp_secs as i64, 0);
|
||||
println_name_value(&format!("{}release date", BULLET), &when.to_string());
|
||||
println_name_value(&format!("{}release date:", BULLET), &when.to_string());
|
||||
println_name_value(
|
||||
&format!("{}download URL", BULLET),
|
||||
&format!("{}download URL:", BULLET),
|
||||
&update_manifest.download_url,
|
||||
);
|
||||
}
|
||||
@ -675,44 +699,66 @@ fn symlink_dir<P: AsRef<Path>, Q: AsRef<Path>>(src: P, dst: Q) -> std::io::Resul
|
||||
}
|
||||
|
||||
pub fn update(config_file: &str) -> Result<bool, String> {
|
||||
let update_manifest = info(config_file, false)?;
|
||||
if update_manifest.is_none() {
|
||||
return Ok(false);
|
||||
}
|
||||
let update_manifest = update_manifest.unwrap();
|
||||
|
||||
if timestamp_secs()
|
||||
< u64::from_str_radix(crate::build_env::BUILD_SECONDS_SINCE_UNIX_EPOCH, 10).unwrap()
|
||||
{
|
||||
Err("Unable to update as system time seems unreliable".to_string())?
|
||||
}
|
||||
|
||||
let mut config = Config::load(config_file)?;
|
||||
if let Some(ref current_update_manifest) = config.current_update_manifest {
|
||||
if update_manifest.timestamp_secs < current_update_manifest.timestamp_secs {
|
||||
Err("Unable to update to an older version".to_string())?
|
||||
let update_manifest = info(config_file, false)?;
|
||||
|
||||
let release_dir = if let Some(release_semver) = &config.release_semver {
|
||||
let download_url = github_download_url(release_semver);
|
||||
let release_dir = config.release_dir(&release_semver);
|
||||
let ok_dir = release_dir.join(".ok");
|
||||
if ok_dir.exists() {
|
||||
return Ok(false);
|
||||
}
|
||||
}
|
||||
let (_temp_dir, temp_archive, _temp_archive_sha256) =
|
||||
download_to_temp_archive(&download_url, None)
|
||||
.map_err(|err| format!("Unable to download {}: {}", download_url, err))?;
|
||||
extract_release_archive(&temp_archive, &release_dir).map_err(|err| {
|
||||
format!(
|
||||
"Unable to extract {:?} to {:?}: {}",
|
||||
temp_archive, release_dir, err
|
||||
)
|
||||
})?;
|
||||
let _ = fs::create_dir_all(ok_dir);
|
||||
|
||||
let (_temp_dir, temp_archive, _temp_archive_sha256) = download_to_temp_archive(
|
||||
&update_manifest.download_url,
|
||||
Some(&update_manifest.download_sha256),
|
||||
)
|
||||
.map_err(|err| {
|
||||
format!(
|
||||
"Unable to download {}: {}",
|
||||
update_manifest.download_url, err
|
||||
release_dir
|
||||
} else {
|
||||
if update_manifest.is_none() {
|
||||
return Ok(false);
|
||||
}
|
||||
let update_manifest = update_manifest.unwrap();
|
||||
|
||||
if timestamp_secs()
|
||||
< u64::from_str_radix(crate::build_env::BUILD_SECONDS_SINCE_UNIX_EPOCH, 10).unwrap()
|
||||
{
|
||||
Err("Unable to update as system time seems unreliable".to_string())?
|
||||
}
|
||||
|
||||
if let Some(ref current_update_manifest) = config.current_update_manifest {
|
||||
if update_manifest.timestamp_secs < current_update_manifest.timestamp_secs {
|
||||
Err("Unable to update to an older version".to_string())?
|
||||
}
|
||||
}
|
||||
let release_dir = config.release_dir(&update_manifest.download_sha256);
|
||||
let (_temp_dir, temp_archive, _temp_archive_sha256) = download_to_temp_archive(
|
||||
&update_manifest.download_url,
|
||||
Some(&update_manifest.download_sha256),
|
||||
)
|
||||
})?;
|
||||
.map_err(|err| {
|
||||
format!(
|
||||
"Unable to download {}: {}",
|
||||
update_manifest.download_url, err
|
||||
)
|
||||
})?;
|
||||
extract_release_archive(&temp_archive, &release_dir).map_err(|err| {
|
||||
format!(
|
||||
"Unable to extract {:?} to {:?}: {}",
|
||||
temp_archive, release_dir, err
|
||||
)
|
||||
})?;
|
||||
|
||||
let release_dir = config.release_dir(&update_manifest.download_sha256);
|
||||
|
||||
extract_release_archive(&temp_archive, &release_dir).map_err(|err| {
|
||||
format!(
|
||||
"Unable to extract {:?} to {:?}: {}",
|
||||
temp_archive, release_dir, err
|
||||
)
|
||||
})?;
|
||||
config.current_update_manifest = Some(update_manifest);
|
||||
release_dir
|
||||
};
|
||||
|
||||
let release_target = load_release_target(&release_dir).map_err(|err| {
|
||||
format!(
|
||||
@ -739,7 +785,6 @@ pub fn update(config_file: &str) -> Result<bool, String> {
|
||||
)
|
||||
})?;
|
||||
|
||||
config.current_update_manifest = Some(update_manifest);
|
||||
config.save(config_file)?;
|
||||
|
||||
println!(" {}{}", SPARKLE, style("Update successful").bold());
|
||||
|
@ -11,17 +11,24 @@ pub struct Config {
|
||||
pub update_manifest_pubkey: Pubkey,
|
||||
pub current_update_manifest: Option<UpdateManifest>,
|
||||
pub update_poll_secs: u64,
|
||||
pub release_semver: Option<String>,
|
||||
releases_dir: PathBuf,
|
||||
active_release_dir: PathBuf,
|
||||
}
|
||||
|
||||
impl Config {
|
||||
pub fn new(data_dir: &str, json_rpc_url: &str, update_manifest_pubkey: &Pubkey) -> Self {
|
||||
pub fn new(
|
||||
data_dir: &str,
|
||||
json_rpc_url: &str,
|
||||
update_manifest_pubkey: &Pubkey,
|
||||
release_semver: Option<&str>,
|
||||
) -> Self {
|
||||
Self {
|
||||
json_rpc_url: json_rpc_url.to_string(),
|
||||
update_manifest_pubkey: *update_manifest_pubkey,
|
||||
current_update_manifest: None,
|
||||
update_poll_secs: 60, // check for updates once a minute
|
||||
release_semver: release_semver.map(|s| s.to_string()),
|
||||
releases_dir: PathBuf::from(data_dir).join("releases"),
|
||||
active_release_dir: PathBuf::from(data_dir).join("active_release"),
|
||||
}
|
||||
@ -64,7 +71,7 @@ impl Config {
|
||||
self.active_release_dir.join("bin")
|
||||
}
|
||||
|
||||
pub fn release_dir(&self, release_sha256: &str) -> PathBuf {
|
||||
self.releases_dir.join(release_sha256)
|
||||
pub fn release_dir(&self, release_id: &str) -> PathBuf {
|
||||
self.releases_dir.join(release_id)
|
||||
}
|
||||
}
|
||||
|
@ -33,6 +33,13 @@ fn is_pubkey(string: String) -> Result<(), String> {
|
||||
}
|
||||
}
|
||||
|
||||
fn is_semver(string: String) -> Result<(), String> {
|
||||
match semver::Version::parse(&string) {
|
||||
Ok(_) => Ok(()),
|
||||
Err(err) => Err(format!("{:?}", err)),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn main() -> Result<(), String> {
|
||||
solana_logger::setup();
|
||||
|
||||
@ -98,7 +105,15 @@ pub fn main() -> Result<(), String> {
|
||||
Some(default_value) => arg.default_value(default_value),
|
||||
None => arg,
|
||||
}
|
||||
}),
|
||||
})
|
||||
.arg(
|
||||
Arg::with_name("release_semver")
|
||||
.value_name("release-semver")
|
||||
.index(1)
|
||||
.conflicts_with_all(&["json_rpc_url", "update_manifest_pubkey"])
|
||||
.validator(is_semver)
|
||||
.help("The exact version to install. Updates will not be available if this argument is used"),
|
||||
),
|
||||
)
|
||||
.subcommand(
|
||||
SubCommand::with_name("info")
|
||||
@ -191,6 +206,7 @@ pub fn main() -> Result<(), String> {
|
||||
.unwrap();
|
||||
let data_dir = matches.value_of("data_dir").unwrap();
|
||||
let no_modify_path = matches.is_present("no_modify_path");
|
||||
let release_semver = matches.value_of("release_semver");
|
||||
|
||||
command::init(
|
||||
config_file,
|
||||
@ -198,6 +214,7 @@ pub fn main() -> Result<(), String> {
|
||||
json_rpc_url,
|
||||
&update_manifest_pubkey,
|
||||
no_modify_path,
|
||||
release_semver,
|
||||
)
|
||||
}
|
||||
("info", Some(matches)) => {
|
||||
@ -292,6 +309,14 @@ pub fn main_init() -> Result<(), String> {
|
||||
None => arg,
|
||||
}
|
||||
})
|
||||
.arg(
|
||||
Arg::with_name("release_semver")
|
||||
.value_name("release-semver")
|
||||
.index(1)
|
||||
.conflicts_with_all(&["json_rpc_url", "update_manifest_pubkey"])
|
||||
.validator(is_semver)
|
||||
.help("The exact version to install. Updates will not be available if this argument is used"),
|
||||
)
|
||||
.get_matches();
|
||||
|
||||
let config_file = matches.value_of("config_file").unwrap();
|
||||
@ -304,6 +329,7 @@ pub fn main_init() -> Result<(), String> {
|
||||
.unwrap();
|
||||
let data_dir = matches.value_of("data_dir").unwrap();
|
||||
let no_modify_path = matches.is_present("no_modify_path");
|
||||
let release_semver = matches.value_of("release_semver");
|
||||
|
||||
command::init(
|
||||
config_file,
|
||||
@ -311,5 +337,6 @@ pub fn main_init() -> Result<(), String> {
|
||||
json_rpc_url,
|
||||
&update_manifest_pubkey,
|
||||
no_modify_path,
|
||||
release_semver,
|
||||
)
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-keygen"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana key generation utility"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -15,7 +15,7 @@ cuda = []
|
||||
[dependencies]
|
||||
clap = "2.33"
|
||||
dirs = "2.0.1"
|
||||
solana-sdk = { path = "../sdk", version = "0.16.5" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.6" }
|
||||
|
||||
[[bin]]
|
||||
name = "solana-keygen"
|
||||
|
@ -1,7 +1,7 @@
|
||||
[package]
|
||||
name = "solana-kvstore"
|
||||
description = "Embedded Key-Value store for solana"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
homepage = "https://solana.com/"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
|
@ -3,21 +3,22 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-ledger-tool"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
|
||||
[dependencies]
|
||||
bincode = "1.1.4"
|
||||
clap = "2.33.0"
|
||||
serde = "1.0.94"
|
||||
serde_derive = "1.0.94"
|
||||
serde_json = "1.0.40"
|
||||
serde_yaml = "0.8.9"
|
||||
solana = { path = "../core", version = "0.16.5" }
|
||||
solana-logger = { path = "../logger", version = "0.16.5" }
|
||||
solana-runtime = { path = "../runtime", version = "0.16.5" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.5" }
|
||||
solana = { path = "../core", version = "0.16.6" }
|
||||
solana-logger = { path = "../logger", version = "0.16.6" }
|
||||
solana-runtime = { path = "../runtime", version = "0.16.6" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.6" }
|
||||
|
||||
[dev-dependencies]
|
||||
assert_cmd = "0.11"
|
||||
|
@ -91,6 +91,7 @@ fn main() {
|
||||
.long("slot-list")
|
||||
.value_name("FILENAME")
|
||||
.takes_value(true)
|
||||
.required(true)
|
||||
.help("The location of the YAML file with a list of rollback slot heights and hashes"),
|
||||
))
|
||||
.subcommand(SubCommand::with_name("list-roots").about("Output upto last <num-roots> root hashes and their heights starting at the given block height").arg(
|
||||
@ -191,7 +192,7 @@ fn main() {
|
||||
.last()
|
||||
.expect("Failed to find a valid slot");
|
||||
println!("Prune at slot {:?} hash {:?}", target_slot, target_hash);
|
||||
// ToDo: Do the actual pruning of the database
|
||||
blocktree.prune(*target_slot);
|
||||
}
|
||||
}
|
||||
("list-roots", Some(args_matches)) => {
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-logger"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana Logger"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-merkle-tree"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana Merkle Tree"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -9,7 +9,7 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../sdk", version = "0.16.5" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.6" }
|
||||
|
||||
[dev-dependencies]
|
||||
hex = "0.3.2"
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-metrics"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana Metrics"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -14,7 +14,7 @@ influx_db_client = "0.3.6"
|
||||
lazy_static = "1.3.0"
|
||||
log = "0.4.2"
|
||||
reqwest = "0.9.18"
|
||||
solana-sdk = { path = "../sdk", version = "0.16.5" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.6" }
|
||||
sys-info = "0.5.7"
|
||||
|
||||
[dev-dependencies]
|
||||
|
@ -125,20 +125,11 @@ macro_rules! datapoint_debug {
|
||||
}
|
||||
|
||||
lazy_static! {
|
||||
static ref HOST_INFO: String = {
|
||||
let v = env::var("SOLANA_METRICS_DISPLAY_HOSTNAME")
|
||||
.map(|x| {
|
||||
x.parse()
|
||||
.expect("Failed to parse SOLANA_METRICS_DISPLAY_HOSTNAME")
|
||||
})
|
||||
.unwrap_or(0);
|
||||
|
||||
let name: String = hostname().unwrap_or_else(|_| "".to_string());
|
||||
if v == 0 {
|
||||
hash(name.as_bytes()).to_string()
|
||||
} else {
|
||||
name
|
||||
}
|
||||
static ref HOST_ID: String = {
|
||||
env::var("SOLANA_METRICS_HOST_ID").unwrap_or_else(|_| {
|
||||
let hostname: String = hostname().unwrap_or_else(|_| "".to_string());
|
||||
format!("host-{}", hash(hostname.as_bytes())).to_string()
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
@ -254,7 +245,7 @@ impl MetricsAgent {
|
||||
|
||||
let extra = influxdb::Point::new("metrics")
|
||||
.add_timestamp(timing::timestamp() as i64)
|
||||
.add_field("host_id", influxdb::Value::String(HOST_INFO.to_string()))
|
||||
.add_field("host_id", influxdb::Value::String(HOST_ID.to_string()))
|
||||
.add_field(
|
||||
"points_written",
|
||||
influxdb::Value::Integer(points_written as i64),
|
||||
@ -351,7 +342,7 @@ impl MetricsAgent {
|
||||
}
|
||||
|
||||
pub fn submit(&self, mut point: influxdb::Point, level: log::Level) {
|
||||
point.add_field("host_id", influxdb::Value::String(HOST_INFO.to_string()));
|
||||
point.add_field("host_id", influxdb::Value::String(HOST_ID.to_string()));
|
||||
if point.timestamp.is_none() {
|
||||
point.timestamp = Some(timing::timestamp() as i64);
|
||||
}
|
||||
@ -461,7 +452,7 @@ pub fn set_panic_hook(program: &'static str) {
|
||||
None => "?".to_string(),
|
||||
}),
|
||||
)
|
||||
.add_field("host_id", influxdb::Value::String(HOST_INFO.to_string()))
|
||||
.add_field("host_id", influxdb::Value::String(HOST_ID.to_string()))
|
||||
.to_owned(),
|
||||
Level::Error,
|
||||
);
|
||||
|
@ -81,7 +81,6 @@ setup_secondary_mount() {
|
||||
ln -sfT $SECONDARY_DISK_MOUNT_POINT/config-local "$SOLANA_CONFIG_DIR"
|
||||
fi
|
||||
}
|
||||
setup_secondary_mount
|
||||
|
||||
default_arg() {
|
||||
declare name=$1
|
||||
|
@ -18,15 +18,17 @@ fullnode_usage() {
|
||||
cat <<EOF
|
||||
|
||||
Fullnode Usage:
|
||||
usage: $0 [--blockstream PATH] [--init-complete-file FILE] [--label LABEL] [--stake LAMPORTS] [--no-voting] [--rpc-port port] [rsync network path to bootstrap leader configuration] [cluster entry point]
|
||||
usage: $0 [--config-dir PATH] [--blockstream PATH] [--init-complete-file FILE] [--label LABEL] [--stake LAMPORTS] [--no-voting] [--rpc-port port] [rsync network path to bootstrap leader configuration] [cluster entry point]
|
||||
|
||||
Start a validator or a replicator
|
||||
|
||||
--config-dir PATH - store configuration and data files under this PATH
|
||||
--blockstream PATH - open blockstream at this unix domain socket location
|
||||
--init-complete-file FILE - create this file, if it doesn't already exist, once node initialization is complete
|
||||
--label LABEL - Append the given label to the configuration files, useful when running
|
||||
multiple fullnodes in the same workspace
|
||||
--stake LAMPORTS - Number of lamports to stake
|
||||
--node-lamports LAMPORTS - Number of lamports this node has been funded from the genesis block
|
||||
--no-voting - start node without vote signer
|
||||
--rpc-port port - custom RPC port for this node
|
||||
--no-restart - do not restart the node if it exits
|
||||
@ -84,30 +86,46 @@ setup_validator_accounts() {
|
||||
echo "Vote and stake accounts have already been configured"
|
||||
else
|
||||
if ((airdrops_enabled)); then
|
||||
# Fund the node with enough tokens to fund its Vote, Staking, and Storage accounts
|
||||
declare fees=100 # TODO: No hardcoded transaction fees, fetch the current cluster fees
|
||||
$solana_wallet --keypair "$identity_keypair_path" --url "http://$entrypoint_ip:8899" airdrop $((node_lamports+stake_lamports+fees)) || return $?
|
||||
echo "Fund the node with enough tokens to fund its Vote, Staking, and Storage accounts"
|
||||
(
|
||||
declare fees=100 # TODO: No hardcoded transaction fees, fetch the current cluster fees
|
||||
set -x
|
||||
$solana_wallet --keypair "$identity_keypair_path" --url "http://$entrypoint_ip:8899" \
|
||||
airdrop $((node_lamports+stake_lamports+fees))
|
||||
) || return $?
|
||||
else
|
||||
echo "current account balance is "
|
||||
$solana_wallet --keypair "$identity_keypair_path" --url "http://$entrypoint_ip:8899" balance || return $?
|
||||
fi
|
||||
|
||||
# Fund the vote account from the node, with the node as the identity_pubkey
|
||||
$solana_wallet --keypair "$identity_keypair_path" --url "http://$entrypoint_ip:8899" \
|
||||
create-vote-account "$vote_pubkey" "$identity_pubkey" 1 --commission 127 || return $?
|
||||
echo "Fund the vote account from the node's identity pubkey"
|
||||
(
|
||||
set -x
|
||||
$solana_wallet --keypair "$identity_keypair_path" --url "http://$entrypoint_ip:8899" \
|
||||
create-vote-account "$vote_pubkey" "$identity_pubkey" 1 --commission 127
|
||||
) || return $?
|
||||
|
||||
# Fund the stake account from the node, with the node as the identity_pubkey
|
||||
$solana_wallet --keypair "$identity_keypair_path" --url "http://$entrypoint_ip:8899" \
|
||||
create-stake-account "$stake_pubkey" "$stake_lamports" || return $?
|
||||
echo "Fund the stake account from the node's identity pubkey"
|
||||
(
|
||||
set -x
|
||||
$solana_wallet --keypair "$identity_keypair_path" --url "http://$entrypoint_ip:8899" \
|
||||
create-stake-account "$stake_pubkey" "$stake_lamports"
|
||||
) || return $?
|
||||
|
||||
# Delegate the stake. The transaction fee is paid by the node but the
|
||||
echo "Delegate the stake account to the node's vote account"
|
||||
# transaction must be signed by the stake_keypair
|
||||
$solana_wallet --keypair "$identity_keypair_path" --url "http://$entrypoint_ip:8899" \
|
||||
delegate-stake "$stake_keypair_path" "$vote_pubkey" "$stake_lamports" || return $?
|
||||
(
|
||||
set -x
|
||||
$solana_wallet --keypair "$identity_keypair_path" --url "http://$entrypoint_ip:8899" \
|
||||
delegate-stake "$stake_keypair_path" "$vote_pubkey" "$stake_lamports"
|
||||
) || return $?
|
||||
|
||||
# Setup validator storage account
|
||||
$solana_wallet --keypair "$identity_keypair_path" --url "http://$entrypoint_ip:8899" \
|
||||
create-validator-storage-account "$identity_pubkey" "$storage_pubkey" || return $?
|
||||
echo "Create validator storage account"
|
||||
(
|
||||
set -x
|
||||
$solana_wallet --keypair "$identity_keypair_path" --url "http://$entrypoint_ip:8899" \
|
||||
create-validator-storage-account "$identity_pubkey" "$storage_pubkey"
|
||||
) || return $?
|
||||
|
||||
touch "$configured_flag"
|
||||
fi
|
||||
@ -134,21 +152,31 @@ setup_replicator_account() {
|
||||
echo "Replicator account has already been configured"
|
||||
else
|
||||
if ((airdrops_enabled)); then
|
||||
$solana_wallet --keypair "$identity_keypair_path" --url "http://$entrypoint_ip:8899" airdrop "$node_lamports" || return $?
|
||||
(
|
||||
set -x
|
||||
$solana_wallet --keypair "$identity_keypair_path" --url "http://$entrypoint_ip:8899"
|
||||
airdrop "$node_lamports"
|
||||
) || return $?
|
||||
else
|
||||
echo "current account balance is "
|
||||
$solana_wallet --keypair "$identity_keypair_path" --url "http://$entrypoint_ip:8899" balance || return $?
|
||||
fi
|
||||
|
||||
# Setup replicator storage account
|
||||
$solana_wallet --keypair "$identity_keypair_path" --url "http://$entrypoint_ip:8899" \
|
||||
create-replicator-storage-account "$identity_pubkey" "$storage_pubkey" || return $?
|
||||
echo "Create replicator storage account"
|
||||
(
|
||||
set -x
|
||||
$solana_wallet --keypair "$identity_keypair_path" --url "http://$entrypoint_ip:8899" \
|
||||
create-replicator-storage-account "$identity_pubkey" "$storage_pubkey"
|
||||
) || return $?
|
||||
|
||||
touch "$configured_flag"
|
||||
fi
|
||||
|
||||
$solana_wallet --keypair "$identity_keypair_path" --url "http://$entrypoint_ip:8899" \
|
||||
show-storage-account "$storage_pubkey"
|
||||
(
|
||||
set -x
|
||||
$solana_wallet --keypair "$identity_keypair_path" --url "http://$entrypoint_ip:8899" \
|
||||
show-storage-account "$storage_pubkey"
|
||||
)
|
||||
|
||||
return 0
|
||||
}
|
||||
@ -171,6 +199,8 @@ no_restart=0
|
||||
airdrops_enabled=1
|
||||
generate_snapshots=0
|
||||
boot_from_snapshot=1
|
||||
reset_ledger=0
|
||||
config_dir=
|
||||
|
||||
positional_args=()
|
||||
while [[ -n $1 ]]; do
|
||||
@ -217,9 +247,15 @@ while [[ -n $1 ]]; do
|
||||
elif [[ $1 = --stake ]]; then
|
||||
stake_lamports="$2"
|
||||
shift 2
|
||||
elif [[ $1 = --node-lamports ]]; then
|
||||
node_lamports="$2"
|
||||
shift 2
|
||||
elif [[ $1 = --no-voting ]]; then
|
||||
args+=("$1")
|
||||
shift
|
||||
elif [[ $1 = --skip-ledger-verify ]]; then
|
||||
args+=("$1")
|
||||
shift
|
||||
elif [[ $1 = --no-sigverify ]]; then
|
||||
args+=("$1")
|
||||
shift
|
||||
@ -235,6 +271,12 @@ while [[ -n $1 ]]; do
|
||||
elif [[ $1 = --no-airdrop ]]; then
|
||||
airdrops_enabled=0
|
||||
shift
|
||||
elif [[ $1 = --reset-ledger ]]; then
|
||||
reset_ledger=1
|
||||
shift
|
||||
elif [[ $1 = --config-dir ]]; then
|
||||
config_dir=$2
|
||||
shift 2
|
||||
elif [[ $1 = -h ]]; then
|
||||
fullnode_usage "$@"
|
||||
else
|
||||
@ -247,6 +289,16 @@ while [[ -n $1 ]]; do
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ -n $REQUIRE_CONFIG_DIR ]]; then
|
||||
if [[ -z $config_dir ]]; then
|
||||
fullnode_usage "Error: --config-dir not specified"
|
||||
fi
|
||||
|
||||
SOLANA_RSYNC_CONFIG_DIR="$config_dir"/config
|
||||
SOLANA_CONFIG_DIR="$config_dir"/config-local
|
||||
fi
|
||||
|
||||
setup_secondary_mount
|
||||
|
||||
if [[ $node_type = replicator ]]; then
|
||||
if [[ ${#positional_args[@]} -gt 2 ]]; then
|
||||
@ -328,6 +380,7 @@ else
|
||||
fi
|
||||
|
||||
identity_pubkey=$($solana_keygen pubkey "$identity_keypair_path")
|
||||
export SOLANA_METRICS_HOST_ID="$identity_pubkey"
|
||||
|
||||
if [[ $node_type != replicator ]]; then
|
||||
accounts_config_dir="$state_dir"/accounts
|
||||
@ -368,17 +421,31 @@ PS4="$(basename "$0"): "
|
||||
|
||||
pid=
|
||||
kill_fullnode() {
|
||||
# Note: do not echo anything from this function to ensure $pid is actually
|
||||
# killed when stdout/stderr are redirected
|
||||
set +ex
|
||||
if [[ -n $pid ]]; then
|
||||
declare _pid=$pid
|
||||
pid=
|
||||
echo "killing pid $_pid"
|
||||
kill "$_pid" || true
|
||||
wait "$_pid" || true
|
||||
echo "$_pid killed"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
trap 'kill_fullnode' INT TERM ERR
|
||||
|
||||
if ((reset_ledger)); then
|
||||
echo "Resetting ledger..."
|
||||
(
|
||||
set -x
|
||||
rm -rf "$state_dir"
|
||||
rm -rf "$ledger_config_dir"
|
||||
)
|
||||
if [[ -d "$SOLANA_RSYNC_CONFIG_DIR"/ledger/ ]]; then
|
||||
cp -a "$SOLANA_RSYNC_CONFIG_DIR"/ledger/ "$ledger_config_dir"
|
||||
fi
|
||||
fi
|
||||
|
||||
while true; do
|
||||
if [[ $node_type != bootstrap_leader ]] && new_gensis_block; then
|
||||
# If the genesis block has changed remove the now stale ledger and
|
||||
@ -494,8 +561,8 @@ EOF
|
||||
secs_to_next_genesis_poll=5
|
||||
secs_to_next_snapshot=30
|
||||
while true; do
|
||||
if ! kill -0 "$pid"; then
|
||||
wait "$pid" || true
|
||||
if [[ -z $pid ]] || ! kill -0 "$pid"; then
|
||||
[[ -z $pid ]] || wait "$pid"
|
||||
echo "############## $node_type exited, restarting ##############"
|
||||
break
|
||||
fi
|
||||
|
@ -3,6 +3,7 @@
|
||||
here=$(dirname "$0")
|
||||
# shellcheck source=multinode-demo/common.sh
|
||||
source "$here"/common.sh
|
||||
setup_secondary_mount
|
||||
|
||||
set -e
|
||||
"$here"/clear-config.sh
|
||||
|
148
net/net.sh
148
net/net.sh
@ -24,6 +24,8 @@ Operate a configured testnet
|
||||
restart - Shortcut for stop then start
|
||||
update - Live update all network nodes
|
||||
logs - Fetch remote logs from each network node
|
||||
startnode- Start an individual node (previously stopped with stopNode)
|
||||
stopnode - Stop an individual node
|
||||
|
||||
start/update-specific options:
|
||||
-T [tarFilename] - Deploy the specified release tarball
|
||||
@ -54,14 +56,27 @@ Operate a configured testnet
|
||||
|
||||
--hashes-per-tick NUM_HASHES|sleep|auto
|
||||
- Override the default --hashes-per-tick for the cluster
|
||||
--no-airdrop
|
||||
- If set, disables airdrops. Nodes must be funded in genesis block when airdrops are disabled.
|
||||
--lamports NUM_LAMPORTS_TO_MINT
|
||||
- Override the default 100000000000000 lamports minted in genesis
|
||||
--stake-internal-nodes NUM_LAMPORTS_PER_NODE
|
||||
- Amount to stake internal nodes in genesis block. If set, airdrops are disabled.
|
||||
--internal-nodes-stake-lamports NUM_LAMPORTS_PER_NODE
|
||||
- Amount to stake internal nodes.
|
||||
--internal-nodes-lamports NUM_LAMPORTS_PER_NODE
|
||||
- Amount to fund internal nodes in genesis block.
|
||||
--external-accounts-file FILE_PATH
|
||||
- A YML file with a list of account pubkeys and corresponding stakes for external nodes
|
||||
- A YML file with a list of account pubkeys and corresponding lamport balances in genesis block for external nodes
|
||||
--no-snapshot
|
||||
- If set, disables booting validators from a snapshot
|
||||
--skip-ledger-verify
|
||||
- If set, validators will skip verifying
|
||||
the ledger they already have saved to disk at
|
||||
boot (results in a much faster boot)
|
||||
--no-deploy
|
||||
- Don't deploy new software, use the
|
||||
existing deployment
|
||||
|
||||
|
||||
sanity/start/update-specific options:
|
||||
-F - Discard validator nodes that didn't bootup successfully
|
||||
-o noLedgerVerify - Skip ledger verification
|
||||
@ -75,6 +90,9 @@ Operate a configured testnet
|
||||
logs-specific options:
|
||||
none
|
||||
|
||||
startnode/stopnode-specific options:
|
||||
-i [ip address] - IP Address of the node to start or stop
|
||||
|
||||
Note: if RUST_LOG is set in the environment it will be propogated into the
|
||||
network nodes.
|
||||
EOF
|
||||
@ -89,6 +107,7 @@ skipSetup=false
|
||||
updateNodes=false
|
||||
customPrograms=
|
||||
updatePlatforms=
|
||||
nodeAddress=
|
||||
numBenchTpsClients=0
|
||||
numBenchExchangeClients=0
|
||||
benchTpsExtraArgs=
|
||||
@ -98,8 +117,11 @@ genesisOptions=
|
||||
numFullnodesRequested=
|
||||
externalPrimordialAccountsFile=
|
||||
remoteExternalPrimordialAccountsFile=
|
||||
stakeNodesInGenesisBlock=
|
||||
internalNodesStakeLamports=
|
||||
internalNodesLamports=
|
||||
maybeNoSnapshot=""
|
||||
maybeSkipLedgerVerify=""
|
||||
maybeDisableAirdrops=""
|
||||
|
||||
command=$1
|
||||
[[ -n $command ]] || usage
|
||||
@ -120,16 +142,28 @@ while [[ -n $1 ]]; do
|
||||
elif [[ $1 = --no-snapshot ]]; then
|
||||
maybeNoSnapshot="$1"
|
||||
shift 1
|
||||
elif [[ $1 = --no-deploy ]]; then
|
||||
deployMethod=skip
|
||||
shift 1
|
||||
elif [[ $1 = --skip-ledger-verify ]]; then
|
||||
maybeSkipLedgerVerify="$1"
|
||||
shift 1
|
||||
elif [[ $1 = --deploy-update ]]; then
|
||||
updatePlatforms="$updatePlatforms $2"
|
||||
shift 2
|
||||
elif [[ $1 = --stake-internal-nodes ]]; then
|
||||
stakeNodesInGenesisBlock="$2"
|
||||
elif [[ $1 = --internal-nodes-stake-lamports ]]; then
|
||||
internalNodesStakeLamports="$2"
|
||||
shift 2
|
||||
elif [[ $1 = --internal-nodes-lamports ]]; then
|
||||
internalNodesLamports="$2"
|
||||
shift 2
|
||||
elif [[ $1 = --external-accounts-file ]]; then
|
||||
externalPrimordialAccountsFile="$2"
|
||||
remoteExternalPrimordialAccountsFile=/tmp/external-primordial-accounts.yml
|
||||
shift 2
|
||||
elif [[ $1 = --no-airdrop ]]; then
|
||||
maybeDisableAirdrops="$1"
|
||||
shift 1
|
||||
else
|
||||
usage "Unknown long option: $1"
|
||||
fi
|
||||
@ -320,8 +354,8 @@ startCommon() {
|
||||
|
||||
startBootstrapLeader() {
|
||||
declare ipAddress=$1
|
||||
declare logFile="$2"
|
||||
declare nodeIndex="$3"
|
||||
declare nodeIndex="$2"
|
||||
declare logFile="$3"
|
||||
echo "--- Starting bootstrap leader: $ipAddress"
|
||||
echo "start log: $logFile"
|
||||
|
||||
@ -339,11 +373,14 @@ startBootstrapLeader() {
|
||||
local)
|
||||
rsync -vPrc -e "ssh ${sshOptions[*]}" "$SOLANA_ROOT"/farf/bin/* "$ipAddress:~/.cargo/bin/"
|
||||
;;
|
||||
skip)
|
||||
;;
|
||||
*)
|
||||
usage "Internal error: invalid deployMethod: $deployMethod"
|
||||
;;
|
||||
esac
|
||||
|
||||
# shellcheck disable=SC2086 # Don't want to double quote "$maybeNoSnapshot $maybeSkipLedgerVerify"
|
||||
ssh "${sshOptions[@]}" -n "$ipAddress" \
|
||||
"./solana/net/remote/remote-node.sh \
|
||||
$deployMethod \
|
||||
@ -354,12 +391,14 @@ startBootstrapLeader() {
|
||||
$skipSetup \
|
||||
$failOnValidatorBootupFailure \
|
||||
\"$remoteExternalPrimordialAccountsFile\" \
|
||||
\"$stakeNodesInGenesisBlock\" \
|
||||
\"$maybeDisableAirdrops\" \
|
||||
\"$internalNodesStakeLamports\" \
|
||||
\"$internalNodesLamports\" \
|
||||
$nodeIndex \
|
||||
$numBenchTpsClients \"$benchTpsExtraArgs\" \
|
||||
$numBenchExchangeClients \"$benchExchangeExtraArgs\" \
|
||||
\"$genesisOptions\" \
|
||||
$maybeNoSnapshot \
|
||||
"$maybeNoSnapshot $maybeSkipLedgerVerify" \
|
||||
"
|
||||
) >> "$logFile" 2>&1 || {
|
||||
cat "$logFile"
|
||||
@ -374,6 +413,16 @@ startNode() {
|
||||
declare nodeIndex="$3"
|
||||
declare logFile="$netLogDir/fullnode-$ipAddress.log"
|
||||
|
||||
if [[ -z $nodeType ]]; then
|
||||
echo nodeType not specified
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -z $nodeIndex ]]; then
|
||||
echo nodeIndex not specified
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "--- Starting $nodeType: $ipAddress"
|
||||
echo "start log: $logFile"
|
||||
(
|
||||
@ -406,10 +455,14 @@ startNode() {
|
||||
$skipSetup \
|
||||
$failOnValidatorBootupFailure \
|
||||
\"$remoteExternalPrimordialAccountsFile\" \
|
||||
\"$stakeNodesInGenesisBlock\" \
|
||||
\"$maybeDisableAirdrops\" \
|
||||
\"$internalNodesStakeLamports\" \
|
||||
\"$internalNodesLamports\" \
|
||||
$nodeIndex \
|
||||
$numBenchTpsClients \"$benchTpsExtraArgs\" \
|
||||
$numBenchExchangeClients \"$benchExchangeExtraArgs\" \
|
||||
\"$genesisOptions\" \
|
||||
$maybeNoSnapshot \
|
||||
\"$maybeNoSnapshot $maybeSkipLedgerVerify\" \
|
||||
"
|
||||
) >> "$logFile" 2>&1 &
|
||||
declare pid=$!
|
||||
@ -495,7 +548,35 @@ deployUpdate() {
|
||||
) || ok=false
|
||||
$ok || exit 1
|
||||
done
|
||||
}
|
||||
|
||||
getNodeType() {
|
||||
echo "getNodeType: $nodeAddress"
|
||||
[[ -n $nodeAddress ]] || {
|
||||
echo "Error: nodeAddress not set"
|
||||
exit 1
|
||||
}
|
||||
nodeIndex=0 # <-- global
|
||||
nodeType=validator # <-- global
|
||||
|
||||
for ipAddress in "${fullnodeIpList[@]}" b "${blockstreamerIpList[@]}" r "${replicatorIpList[@]}"; do
|
||||
if [[ $ipAddress = b ]]; then
|
||||
nodeType=blockstreamer
|
||||
continue
|
||||
elif [[ $ipAddress = r ]]; then
|
||||
nodeType=replicator
|
||||
continue
|
||||
fi
|
||||
|
||||
if [[ $ipAddress = "$nodeAddress" ]]; then
|
||||
echo "getNodeType: $nodeType ($nodeIndex)"
|
||||
return
|
||||
fi
|
||||
((nodeIndex = nodeIndex + 1))
|
||||
done
|
||||
|
||||
echo "Error: Unknown node: $nodeAddress"
|
||||
exit 1
|
||||
}
|
||||
|
||||
start() {
|
||||
@ -526,6 +607,8 @@ start() {
|
||||
local)
|
||||
build
|
||||
;;
|
||||
skip)
|
||||
;;
|
||||
*)
|
||||
usage "Internal error: invalid deployMethod: $deployMethod"
|
||||
;;
|
||||
@ -539,23 +622,14 @@ start() {
|
||||
fi
|
||||
|
||||
declare bootstrapLeader=true
|
||||
declare nodeType=validator
|
||||
declare loopCount=0
|
||||
for ipAddress in "${fullnodeIpList[@]}" b "${blockstreamerIpList[@]}" r "${replicatorIpList[@]}"; do
|
||||
if [[ $ipAddress = b ]]; then
|
||||
nodeType=blockstreamer
|
||||
continue
|
||||
elif [[ $ipAddress = r ]]; then
|
||||
nodeType=replicator
|
||||
continue
|
||||
fi
|
||||
if $updateNodes; then
|
||||
stopNode "$ipAddress" true
|
||||
fi
|
||||
for nodeAddress in "${fullnodeIpList[@]}" "${blockstreamerIpList[@]}" "${replicatorIpList[@]}"; do
|
||||
nodeType=
|
||||
nodeIndex=
|
||||
getNodeType
|
||||
if $bootstrapLeader; then
|
||||
SECONDS=0
|
||||
declare bootstrapNodeDeployTime=
|
||||
startBootstrapLeader "$ipAddress" "$netLogDir/bootstrap-leader-$ipAddress.log" $loopCount
|
||||
startBootstrapLeader "$nodeAddress" $nodeIndex "$netLogDir/bootstrap-leader-$ipAddress.log"
|
||||
bootstrapNodeDeployTime=$SECONDS
|
||||
$metricsWriteDatapoint "testnet-deploy net-bootnode-leader-started=1"
|
||||
|
||||
@ -563,15 +637,18 @@ start() {
|
||||
SECONDS=0
|
||||
pids=()
|
||||
else
|
||||
startNode "$ipAddress" $nodeType $loopCount
|
||||
startNode "$ipAddress" $nodeType $nodeIndex
|
||||
|
||||
# Stagger additional node start time. If too many nodes start simultaneously
|
||||
# the bootstrap node gets more rsync requests from the additional nodes than
|
||||
# it can handle.
|
||||
((loopCount++ % 2 == 0)) && sleep 2
|
||||
if ((nodeIndex % 2 == 0)); then
|
||||
sleep 2
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
for pid in "${pids[@]}"; do
|
||||
declare ok=true
|
||||
wait "$pid" || ok=false
|
||||
@ -627,6 +704,8 @@ start() {
|
||||
local)
|
||||
networkVersion="$(git rev-parse HEAD || echo local-unknown)"
|
||||
;;
|
||||
skip)
|
||||
;;
|
||||
*)
|
||||
usage "Internal error: invalid deployMethod: $deployMethod"
|
||||
;;
|
||||
@ -721,10 +800,21 @@ stop)
|
||||
stop
|
||||
;;
|
||||
stopnode)
|
||||
if [[ -z $nodeAddress ]]; then
|
||||
usage "node address (-i) not specified"
|
||||
exit 1
|
||||
fi
|
||||
stopNode "$nodeAddress" true
|
||||
;;
|
||||
startnode)
|
||||
startNode "$nodeAddress" validator
|
||||
if [[ -z $nodeAddress ]]; then
|
||||
usage "node address (-i) not specified"
|
||||
exit 1
|
||||
fi
|
||||
nodeType=
|
||||
nodeIndex=
|
||||
getNodeType
|
||||
startNode "$nodeAddress" $nodeType $nodeIndex
|
||||
;;
|
||||
logs)
|
||||
fetchRemoteLog() {
|
||||
|
@ -41,6 +41,8 @@ local|tar)
|
||||
|
||||
net/scripts/rsync-retry.sh -vPrc "$entrypointIp:~/.cargo/bin/solana*" ~/.cargo/bin/
|
||||
;;
|
||||
skip)
|
||||
;;
|
||||
*)
|
||||
echo "Unknown deployment method: $deployMethod"
|
||||
exit 1
|
||||
|
@ -12,14 +12,16 @@ RUST_LOG="$5"
|
||||
skipSetup="$6"
|
||||
failOnValidatorBootupFailure="$7"
|
||||
externalPrimordialAccountsFile="$8"
|
||||
stakeNodesInGenesisBlock="$9"
|
||||
nodeIndex="${10}"
|
||||
numBenchTpsClients="${11}"
|
||||
benchTpsExtraArgs="${12}"
|
||||
numBenchExchangeClients="${13}"
|
||||
benchExchangeExtraArgs="${14}"
|
||||
genesisOptions="${15}"
|
||||
noSnapshot="${16}"
|
||||
maybeDisableAirdrops="$9"
|
||||
internalNodesStakeLamports="${10}"
|
||||
internalNodesLamports="${11}"
|
||||
nodeIndex="${12}"
|
||||
numBenchTpsClients="${13}"
|
||||
benchTpsExtraArgs="${14}"
|
||||
numBenchExchangeClients="${15}"
|
||||
benchExchangeExtraArgs="${16}"
|
||||
genesisOptions="${17}"
|
||||
extraNodeArgs="${18}"
|
||||
set +x
|
||||
export RUST_LOG
|
||||
|
||||
@ -29,7 +31,7 @@ export RUST_LOG
|
||||
# trouble
|
||||
#
|
||||
# Ref: https://github.com/solana-labs/solana/issues/3798
|
||||
stake=424243
|
||||
stake=${internalNodesStakeLamports:=424243}
|
||||
|
||||
missing() {
|
||||
echo "Error: $1 not specified"
|
||||
@ -44,7 +46,7 @@ missing() {
|
||||
[[ -n $failOnValidatorBootupFailure ]] || missing failOnValidatorBootupFailure
|
||||
|
||||
airdropsEnabled=true
|
||||
if [[ -n $stakeNodesInGenesisBlock ]]; then
|
||||
if [[ -n $maybeDisableAirdrops ]]; then
|
||||
airdropsEnabled=false
|
||||
fi
|
||||
cat > deployConfig <<EOF
|
||||
@ -76,10 +78,9 @@ waitForNodeToInit() {
|
||||
}
|
||||
|
||||
case $deployMethod in
|
||||
local|tar)
|
||||
local|tar|skip)
|
||||
PATH="$HOME"/.cargo/bin:"$PATH"
|
||||
export USE_INSTALL=1
|
||||
export SOLANA_METRICS_DISPLAY_HOSTNAME=1
|
||||
|
||||
# Setup `/var/snap/solana/current` symlink so rsyncing the genesis
|
||||
# ledger works (reference: `net/scripts/install-rsync.sh`)
|
||||
@ -106,60 +107,64 @@ local|tar)
|
||||
export SOLANA_CUDA=1
|
||||
fi
|
||||
set -x
|
||||
rm -rf ./solana-node-keys
|
||||
rm -rf ./solana-node-stakes
|
||||
mkdir ./solana-node-stakes
|
||||
if [[ -n $stakeNodesInGenesisBlock ]]; then
|
||||
for i in $(seq 0 "$numNodes"); do
|
||||
solana-keygen new -o ./solana-node-keys/"$i"
|
||||
pubkey="$(solana-keygen pubkey ./solana-node-keys/"$i")"
|
||||
echo "${pubkey}: $stakeNodesInGenesisBlock" >> ./solana-node-stakes/fullnode-stakes.yml
|
||||
done
|
||||
fi
|
||||
|
||||
lamports_per_signature="42"
|
||||
# shellcheck disable=SC2206 # Do not want to quote $genesisOptions
|
||||
genesis_args=($genesisOptions)
|
||||
for i in "${!genesis_args[@]}"; do
|
||||
if [[ "${genesis_args[$i]}" = --target-lamports-per-signature ]]; then
|
||||
lamports_per_signature="${genesis_args[$((i+1))]}"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
rm -rf ./solana-client-accounts
|
||||
mkdir ./solana-client-accounts
|
||||
for i in $(seq 0 $((numBenchTpsClients-1))); do
|
||||
# shellcheck disable=SC2086 # Do not want to quote $benchTpsExtraArgs
|
||||
solana-bench-tps --write-client-keys ./solana-client-accounts/bench-tps"$i".yml \
|
||||
--target-lamports-per-signature "$lamports_per_signature" $benchTpsExtraArgs
|
||||
# Skip first line, as it contains header
|
||||
tail -n +2 -q ./solana-client-accounts/bench-tps"$i".yml >> ./solana-client-accounts/client-accounts.yml
|
||||
echo "" >> ./solana-client-accounts/client-accounts.yml
|
||||
done
|
||||
for i in $(seq 0 $((numBenchExchangeClients-1))); do
|
||||
# shellcheck disable=SC2086 # Do not want to quote $benchExchangeExtraArgs
|
||||
solana-bench-exchange --batch-size 1000 --fund-amount 20000 \
|
||||
--write-client-keys ./solana-client-accounts/bench-exchange"$i".yml $benchExchangeExtraArgs
|
||||
tail -n +2 -q ./solana-client-accounts/bench-exchange"$i".yml >> ./solana-client-accounts/client-accounts.yml
|
||||
echo "" >> ./solana-client-accounts/client-accounts.yml
|
||||
done
|
||||
[[ -z $externalPrimordialAccountsFile ]] || cat "$externalPrimordialAccountsFile" >> ./solana-node-stakes/fullnode-stakes.yml
|
||||
if [ -f ./solana-node-stakes/fullnode-stakes.yml ]; then
|
||||
genesisOptions+=" --primordial-accounts-file ./solana-node-stakes/fullnode-stakes.yml"
|
||||
fi
|
||||
if [ -f ./solana-client-accounts/client-accounts.yml ]; then
|
||||
genesisOptions+=" --primordial-keypairs-file ./solana-client-accounts/client-accounts.yml"
|
||||
fi
|
||||
if [[ $skipSetup != true ]]; then
|
||||
rm -rf ./solana-node-keys
|
||||
rm -rf ./solana-node-balances
|
||||
mkdir ./solana-node-balances
|
||||
if [[ -n $internalNodesLamports ]]; then
|
||||
for i in $(seq 0 "$numNodes"); do
|
||||
solana-keygen new -o ./solana-node-keys/"$i"
|
||||
pubkey="$(solana-keygen pubkey ./solana-node-keys/"$i")"
|
||||
echo "${pubkey}: $internalNodesLamports" >> ./solana-node-balances/fullnode-balances.yml
|
||||
done
|
||||
fi
|
||||
|
||||
lamports_per_signature="42"
|
||||
# shellcheck disable=SC2206 # Do not want to quote $genesisOptions
|
||||
genesis_args=($genesisOptions)
|
||||
for i in "${!genesis_args[@]}"; do
|
||||
if [[ "${genesis_args[$i]}" = --target-lamports-per-signature ]]; then
|
||||
lamports_per_signature="${genesis_args[$((i+1))]}"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
rm -rf ./solana-client-accounts
|
||||
mkdir ./solana-client-accounts
|
||||
for i in $(seq 0 $((numBenchTpsClients-1))); do
|
||||
# shellcheck disable=SC2086 # Do not want to quote $benchTpsExtraArgs
|
||||
solana-bench-tps --write-client-keys ./solana-client-accounts/bench-tps"$i".yml \
|
||||
--target-lamports-per-signature "$lamports_per_signature" $benchTpsExtraArgs
|
||||
# Skip first line, as it contains header
|
||||
tail -n +2 -q ./solana-client-accounts/bench-tps"$i".yml >> ./solana-client-accounts/client-accounts.yml
|
||||
echo "" >> ./solana-client-accounts/client-accounts.yml
|
||||
done
|
||||
for i in $(seq 0 $((numBenchExchangeClients-1))); do
|
||||
# shellcheck disable=SC2086 # Do not want to quote $benchExchangeExtraArgs
|
||||
solana-bench-exchange --batch-size 1000 --fund-amount 20000 \
|
||||
--write-client-keys ./solana-client-accounts/bench-exchange"$i".yml $benchExchangeExtraArgs
|
||||
tail -n +2 -q ./solana-client-accounts/bench-exchange"$i".yml >> ./solana-client-accounts/client-accounts.yml
|
||||
echo "" >> ./solana-client-accounts/client-accounts.yml
|
||||
done
|
||||
[[ -z $externalPrimordialAccountsFile ]] || cat "$externalPrimordialAccountsFile" >> ./solana-node-balances/fullnode-balances.yml
|
||||
if [ -f ./solana-node-balances/fullnode-balances.yml ]; then
|
||||
genesisOptions+=" --primordial-accounts-file ./solana-node-balances/fullnode-balances.yml"
|
||||
fi
|
||||
if [ -f ./solana-client-accounts/client-accounts.yml ]; then
|
||||
genesisOptions+=" --primordial-keypairs-file ./solana-client-accounts/client-accounts.yml"
|
||||
fi
|
||||
|
||||
args=(
|
||||
--bootstrap-leader-stake-lamports "$stake"
|
||||
)
|
||||
)
|
||||
if [[ -n $internalNodesLamports ]]; then
|
||||
args+=(--bootstrap-leader-lamports "$internalNodesLamports")
|
||||
fi
|
||||
# shellcheck disable=SC2206 # Do not want to quote $genesisOptions
|
||||
args+=($genesisOptions)
|
||||
./multinode-demo/setup.sh "${args[@]}"
|
||||
fi
|
||||
if [[ -z $stakeNodesInGenesisBlock ]]; then
|
||||
if [[ $airdropsEnabled = true ]]; then
|
||||
./multinode-demo/drone.sh > drone.log 2>&1 &
|
||||
fi
|
||||
args=(
|
||||
@ -167,19 +172,24 @@ local|tar)
|
||||
--gossip-port "$entrypointIp":8001
|
||||
)
|
||||
|
||||
if [[ -n $stakeNodesInGenesisBlock ]]; then
|
||||
if [[ $airdropsEnabled != true ]]; then
|
||||
args+=(--no-airdrop)
|
||||
fi
|
||||
args+=(--init-complete-file "$initCompleteFile")
|
||||
args+=("$noSnapshot")
|
||||
# shellcheck disable=SC2206 # Don't want to double quote $extraNodeArgs
|
||||
args+=($extraNodeArgs)
|
||||
nohup ./multinode-demo/validator.sh --bootstrap-leader "${args[@]}" > fullnode.log 2>&1 &
|
||||
waitForNodeToInit
|
||||
;;
|
||||
validator|blockstreamer)
|
||||
net/scripts/rsync-retry.sh -vPrc "$entrypointIp":~/.cargo/bin/ ~/.cargo/bin/
|
||||
rm -f ~/solana/fullnode-identity.json
|
||||
[[ -z $stakeNodesInGenesisBlock ]] || net/scripts/rsync-retry.sh -vPrc \
|
||||
"$entrypointIp":~/solana/solana-node-keys/"$nodeIndex" ~/solana/fullnode-identity.json
|
||||
if [[ $deployMethod != skip ]]; then
|
||||
net/scripts/rsync-retry.sh -vPrc "$entrypointIp":~/.cargo/bin/ ~/.cargo/bin/
|
||||
fi
|
||||
if [[ $skipSetup != true ]]; then
|
||||
rm -f ~/solana/fullnode-identity.json
|
||||
[[ -z $internalNodesLamports ]] || net/scripts/rsync-retry.sh -vPrc \
|
||||
"$entrypointIp":~/solana/solana-node-keys/"$nodeIndex" ~/solana/fullnode-identity.json
|
||||
fi
|
||||
|
||||
if [[ -e /dev/nvidia0 && -x ~/.cargo/bin/solana-validator-cuda ]]; then
|
||||
echo Selecting solana-validator-cuda
|
||||
@ -196,18 +206,20 @@ local|tar)
|
||||
--blockstream /tmp/solana-blockstream.sock
|
||||
--no-voting
|
||||
--stake 0
|
||||
--generate-snapshots
|
||||
)
|
||||
else
|
||||
args+=(--stake "$stake")
|
||||
args+=(--enable-rpc-exit)
|
||||
if [[ -n $internalNodesLamports ]]; then
|
||||
args+=(--node-lamports "$internalNodesLamports")
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ -f ~/solana/fullnode-identity.json ]]; then
|
||||
args+=(--identity ~/solana/fullnode-identity.json)
|
||||
fi
|
||||
|
||||
if [[ -n $stakeNodesInGenesisBlock ]]; then
|
||||
if [[ $airdropsEnabled != true ]]; then
|
||||
args+=(--no-airdrop)
|
||||
fi
|
||||
|
||||
@ -222,7 +234,7 @@ local|tar)
|
||||
# a static IP/DNS name for hosting the blockexplorer web app, and is
|
||||
# a location that somebody would expect to be able to airdrop from
|
||||
scp "$entrypointIp":~/solana/config-local/mint-keypair.json config-local/
|
||||
if [[ -z $stakeNodesInGenesisBlock ]]; then
|
||||
if [[ $airdropsEnabled = true ]]; then
|
||||
./multinode-demo/drone.sh > drone.log 2>&1 &
|
||||
fi
|
||||
|
||||
@ -233,7 +245,7 @@ local|tar)
|
||||
fi
|
||||
|
||||
export BLOCKEXPLORER_GEOIP_WHITELIST=$PWD/net/config/geoip.yml
|
||||
npm install @solana/blockexplorer@1.21.0
|
||||
npm install @solana/blockexplorer@1.27.0
|
||||
npx solana-blockexplorer > blockexplorer.log 2>&1 &
|
||||
|
||||
# Confirm the blockexplorer is accessible
|
||||
@ -249,25 +261,33 @@ local|tar)
|
||||
fi
|
||||
|
||||
args+=(--init-complete-file "$initCompleteFile")
|
||||
args+=("$noSnapshot")
|
||||
# shellcheck disable=SC2206 # Don't want to double quote $extraNodeArgs
|
||||
args+=($extraNodeArgs)
|
||||
nohup ./multinode-demo/validator.sh "${args[@]}" > fullnode.log 2>&1 &
|
||||
waitForNodeToInit
|
||||
;;
|
||||
replicator)
|
||||
net/scripts/rsync-retry.sh -vPrc "$entrypointIp":~/.cargo/bin/ ~/.cargo/bin/
|
||||
if [[ $deployMethod != skip ]]; then
|
||||
net/scripts/rsync-retry.sh -vPrc "$entrypointIp":~/.cargo/bin/ ~/.cargo/bin/
|
||||
fi
|
||||
|
||||
args=(
|
||||
"$entrypointIp":~/solana "$entrypointIp:8001"
|
||||
)
|
||||
|
||||
if [[ -n $stakeNodesInGenesisBlock ]]; then
|
||||
if [[ $airdropsEnabled != true ]]; then
|
||||
args+=(--no-airdrop)
|
||||
fi
|
||||
|
||||
if [[ -n $internalNodesLamports ]] ; then
|
||||
args+=(--node-lamports "$internalNodesLamports")
|
||||
fi
|
||||
|
||||
if [[ $skipSetup != true ]]; then
|
||||
./multinode-demo/clear-config.sh
|
||||
fi
|
||||
args+=("$noSnapshot")
|
||||
# shellcheck disable=SC2206 # Don't want to double quote $extraNodeArgs
|
||||
args+=($extraNodeArgs)
|
||||
nohup ./multinode-demo/replicator.sh "${args[@]}" > fullnode.log 2>&1 &
|
||||
sleep 1
|
||||
;;
|
||||
|
@ -67,7 +67,7 @@ source net/common.sh
|
||||
loadConfigFile
|
||||
|
||||
case $deployMethod in
|
||||
local|tar)
|
||||
local|tar|skip)
|
||||
PATH="$HOME"/.cargo/bin:"$PATH"
|
||||
export USE_INSTALL=1
|
||||
if [[ -r target/perf-libs/env.sh ]]; then
|
||||
@ -158,7 +158,7 @@ echo "--- $sanityTargetIp: validator sanity"
|
||||
if $validatorSanity; then
|
||||
(
|
||||
set -x -o pipefail
|
||||
timeout 10s ./multinode-demo/validator-x.sh --stake 0 \
|
||||
timeout 10s ./multinode-demo/validator-x.sh --no-restart --stake 0 \
|
||||
"$entrypointRsyncUrl" \
|
||||
"$sanityTargetIp:8001" 2>&1 | tee validator-sanity.log
|
||||
) || {
|
||||
|
@ -4,26 +4,29 @@ set -ex
|
||||
[[ $(uname) = Linux ]] || exit 1
|
||||
[[ $USER = root ]] || exit 1
|
||||
|
||||
adduser solana --gecos "" --disabled-password --quiet
|
||||
adduser solana sudo
|
||||
adduser solana adm
|
||||
echo "solana ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
|
||||
id solana
|
||||
if grep -q solana /etc/passwd ; then
|
||||
echo "User solana already exists"
|
||||
else
|
||||
adduser solana --gecos "" --disabled-password --quiet
|
||||
adduser solana sudo
|
||||
adduser solana adm
|
||||
echo "solana ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
|
||||
id solana
|
||||
|
||||
[[ -r /solana-id_ecdsa ]] || exit 1
|
||||
[[ -r /solana-id_ecdsa.pub ]] || exit 1
|
||||
|
||||
sudo -u solana bash -c "
|
||||
mkdir -p /home/solana/.ssh/
|
||||
cd /home/solana/.ssh/
|
||||
cp /solana-id_ecdsa.pub authorized_keys
|
||||
umask 377
|
||||
cp /solana-id_ecdsa id_ecdsa
|
||||
echo \"
|
||||
Host *
|
||||
BatchMode yes
|
||||
IdentityFile ~/.ssh/id_ecdsa
|
||||
StrictHostKeyChecking no
|
||||
\" > config
|
||||
"
|
||||
[[ -r /solana-id_ecdsa ]] || exit 1
|
||||
[[ -r /solana-id_ecdsa.pub ]] || exit 1
|
||||
|
||||
sudo -u solana bash -c "
|
||||
mkdir -p /home/solana/.ssh/
|
||||
cd /home/solana/.ssh/
|
||||
cp /solana-id_ecdsa.pub authorized_keys
|
||||
umask 377
|
||||
cp /solana-id_ecdsa id_ecdsa
|
||||
echo \"
|
||||
Host *
|
||||
BatchMode yes
|
||||
IdentityFile ~/.ssh/id_ecdsa
|
||||
StrictHostKeyChecking no
|
||||
\" > config
|
||||
"
|
||||
fi
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-netutil"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana Network Utilities"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -15,7 +15,7 @@ log = "0.4.2"
|
||||
nix = "0.14.1"
|
||||
rand = "0.6.1"
|
||||
socket2 = "0.3.9"
|
||||
solana-logger = { path = "../logger", version = "0.16.5" }
|
||||
solana-logger = { path = "../logger", version = "0.16.6" }
|
||||
tokio = "0.1"
|
||||
|
||||
[lib]
|
||||
|
@ -1,7 +1,7 @@
|
||||
[package]
|
||||
name = "solana-bpf-programs"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
documentation = "https://docs.rs/solana"
|
||||
homepage = "https://solana.com/"
|
||||
readme = "README.md"
|
||||
@ -22,10 +22,10 @@ walkdir = "2"
|
||||
bincode = "1.1.4"
|
||||
byteorder = "1.3.2"
|
||||
elf = "0.0.10"
|
||||
solana-bpf-loader-api = { path = "../bpf_loader_api", version = "0.16.5" }
|
||||
solana-logger = { path = "../../logger", version = "0.16.5" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.16.5" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.5" }
|
||||
solana-bpf-loader-api = { path = "../bpf_loader_api", version = "0.16.6" }
|
||||
solana-logger = { path = "../../logger", version = "0.16.6" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.16.6" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.6" }
|
||||
solana_rbpf = "=0.1.13"
|
||||
|
||||
[[bench]]
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-128bit"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana BPF iter program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -12,8 +12,8 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk-bpf-utils = { path = "../../../../sdk/bpf/rust/rust-utils", version = "0.16.5" }
|
||||
solana-bpf-rust-128bit-dep = { path = "../128bit_dep", version = "0.16.5" }
|
||||
solana-sdk-bpf-utils = { path = "../../../../sdk/bpf/rust/rust-utils", version = "0.16.6" }
|
||||
solana-bpf-rust-128bit-dep = { path = "../128bit_dep", version = "0.16.6" }
|
||||
|
||||
[workspace]
|
||||
members = []
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-128bit-dep"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana BPF many-args-dep program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -12,7 +12,7 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk-bpf-utils = { path = "../../../../sdk/bpf/rust/rust-utils", version = "0.16.5" }
|
||||
solana-sdk-bpf-utils = { path = "../../../../sdk/bpf/rust/rust-utils", version = "0.16.6" }
|
||||
|
||||
[workspace]
|
||||
members = []
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-alloc"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana BPF alloc program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -12,7 +12,7 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk-bpf-utils = { path = "../../../../sdk/bpf/rust/rust-utils", version = "0.16.5" }
|
||||
solana-sdk-bpf-utils = { path = "../../../../sdk/bpf/rust/rust-utils", version = "0.16.6" }
|
||||
|
||||
[workspace]
|
||||
members = []
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-dep-crate"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana BPF dep-crate program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -13,7 +13,7 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
byteorder = { version = "1", default-features = false }
|
||||
solana-sdk-bpf-utils = { path = "../../../../sdk/bpf/rust/rust-utils", version = "0.16.5" }
|
||||
solana-sdk-bpf-utils = { path = "../../../../sdk/bpf/rust/rust-utils", version = "0.16.6" }
|
||||
|
||||
[workspace]
|
||||
members = []
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-iter"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana BPF iter program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -12,7 +12,7 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk-bpf-utils = { path = "../../../../sdk/bpf/rust/rust-utils", version = "0.16.5" }
|
||||
solana-sdk-bpf-utils = { path = "../../../../sdk/bpf/rust/rust-utils", version = "0.16.6" }
|
||||
|
||||
[workspace]
|
||||
members = []
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-many-args"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana BPF many-args program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -12,8 +12,8 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk-bpf-utils = { path = "../../../../sdk/bpf/rust/rust-utils", version = "0.16.5" }
|
||||
solana-bpf-rust-many-args-dep = { path = "../many_args_dep", version = "0.16.5" }
|
||||
solana-sdk-bpf-utils = { path = "../../../../sdk/bpf/rust/rust-utils", version = "0.16.6" }
|
||||
solana-bpf-rust-many-args-dep = { path = "../many_args_dep", version = "0.16.6" }
|
||||
|
||||
[workspace]
|
||||
members = []
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-many-args-dep"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana BPF many-args-dep program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -12,7 +12,7 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk-bpf-utils = { path = "../../../../sdk/bpf/rust/rust-utils", version = "0.16.5" }
|
||||
solana-sdk-bpf-utils = { path = "../../../../sdk/bpf/rust/rust-utils", version = "0.16.6" }
|
||||
|
||||
[workspace]
|
||||
members = []
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-noop"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana BPF noop program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -12,7 +12,7 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk-bpf-utils = { path = "../../../../sdk/bpf/rust/rust-utils", version = "0.16.5" }
|
||||
solana-sdk-bpf-utils = { path = "../../../../sdk/bpf/rust/rust-utils", version = "0.16.6" }
|
||||
|
||||
[workspace]
|
||||
members = []
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-panic"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana BPF iter program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -12,7 +12,7 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk-bpf-utils = { path = "../../../../sdk/bpf/rust/rust-utils", version = "0.16.5" }
|
||||
solana-sdk-bpf-utils = { path = "../../../../sdk/bpf/rust/rust-utils", version = "0.16.6" }
|
||||
|
||||
[workspace]
|
||||
members = []
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-tick-height"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana BPF noop program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -14,7 +14,7 @@ edition = "2018"
|
||||
[dependencies]
|
||||
byteorder = { version = "1", default-features = false }
|
||||
|
||||
solana-sdk-bpf-utils = { path = "../../../../sdk/bpf/rust/rust-utils", version = "0.16.5" }
|
||||
solana-sdk-bpf-utils = { path = "../../../../sdk/bpf/rust/rust-utils", version = "0.16.6" }
|
||||
|
||||
[workspace]
|
||||
members = []
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-bpf-loader-api"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana BPF Loader"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -14,8 +14,8 @@ byteorder = "1.3.2"
|
||||
libc = "0.2.58"
|
||||
log = "0.4.2"
|
||||
serde = "1.0.92"
|
||||
solana-logger = { path = "../../logger", version = "0.16.5" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.5" }
|
||||
solana-logger = { path = "../../logger", version = "0.16.6" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.6" }
|
||||
solana_rbpf = "=0.1.13"
|
||||
|
||||
[lib]
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-bpf-loader-program"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana BPF Loader"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -10,9 +10,9 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
log = "0.4.2"
|
||||
solana-logger = { path = "../../logger", version = "0.16.5" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.5" }
|
||||
solana-bpf-loader-api = { path = "../bpf_loader_api", version = "0.16.5" }
|
||||
solana-logger = { path = "../../logger", version = "0.16.6" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.6" }
|
||||
solana-bpf-loader-api = { path = "../bpf_loader_api", version = "0.16.6" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib", "cdylib"]
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-budget-api"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana Budget program API"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -16,10 +16,10 @@ num-derive = "0.2"
|
||||
num-traits = "0.2"
|
||||
serde = "1.0.92"
|
||||
serde_derive = "1.0.92"
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.5" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.6" }
|
||||
|
||||
[dev-dependencies]
|
||||
solana-runtime = { path = "../../runtime", version = "0.16.5" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.16.6" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib"]
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-budget-program"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana budget program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -10,9 +10,9 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
log = "0.4.2"
|
||||
solana-budget-api = { path = "../budget_api", version = "0.16.5" }
|
||||
solana-logger = { path = "../../logger", version = "0.16.5" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.5" }
|
||||
solana-budget-api = { path = "../budget_api", version = "0.16.6" }
|
||||
solana-logger = { path = "../../logger", version = "0.16.6" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.6" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib", "cdylib"]
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-config-api"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "config program API"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -13,11 +13,11 @@ bincode = "1.1.4"
|
||||
log = "0.4.2"
|
||||
serde = "1.0.92"
|
||||
serde_derive = "1.0.92"
|
||||
solana-logger = { path = "../../logger", version = "0.16.5" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.5" }
|
||||
solana-logger = { path = "../../logger", version = "0.16.6" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.6" }
|
||||
|
||||
[dev-dependencies]
|
||||
solana-runtime = { path = "../../runtime", version = "0.16.5" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.16.6" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib"]
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-config-program"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "config program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -10,9 +10,9 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
log = "0.4.2"
|
||||
solana-config-api = { path = "../config_api", version = "0.16.5" }
|
||||
solana-logger = { path = "../../logger", version = "0.16.5" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.5" }
|
||||
solana-config-api = { path = "../config_api", version = "0.16.6" }
|
||||
solana-logger = { path = "../../logger", version = "0.16.6" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.6" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib", "cdylib"]
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-exchange-api"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana Exchange program API"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -13,12 +13,12 @@ bincode = "1.1.4"
|
||||
log = "0.4.2"
|
||||
serde = "1.0.92"
|
||||
serde_derive = "1.0.92"
|
||||
solana-logger = { path = "../../logger", version = "0.16.5" }
|
||||
solana-metrics = { path = "../../metrics", version = "0.16.5" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.5" }
|
||||
solana-logger = { path = "../../logger", version = "0.16.6" }
|
||||
solana-metrics = { path = "../../metrics", version = "0.16.6" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.6" }
|
||||
|
||||
[dev-dependencies]
|
||||
solana-runtime = { path = "../../runtime", version = "0.16.5" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.16.6" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib"]
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-exchange-program"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana exchange program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -10,9 +10,9 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
log = "0.4.2"
|
||||
solana-exchange-api = { path = "../exchange_api", version = "0.16.5" }
|
||||
solana-logger = { path = "../../logger", version = "0.16.5" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.5" }
|
||||
solana-exchange-api = { path = "../exchange_api", version = "0.16.6" }
|
||||
solana-logger = { path = "../../logger", version = "0.16.6" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.6" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib", "cdylib"]
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-failure-program"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana failure program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -10,10 +10,10 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
log = "0.4.2"
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.5" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.6" }
|
||||
|
||||
[dev-dependencies]
|
||||
solana-runtime = { path = "../../runtime", version = "0.16.5" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.16.6" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["cdylib"]
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-noop-program"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana noop program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -10,8 +10,8 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
log = "0.4.2"
|
||||
solana-logger = { path = "../../logger", version = "0.16.5" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.5" }
|
||||
solana-logger = { path = "../../logger", version = "0.16.6" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.6" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["cdylib"]
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-stake-api"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana Stake program API"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -14,10 +14,10 @@ log = "0.4.2"
|
||||
rand = "0.6.5"
|
||||
serde = "1.0.92"
|
||||
serde_derive = "1.0.92"
|
||||
solana-logger = { path = "../../logger", version = "0.16.5" }
|
||||
solana-metrics = { path = "../../metrics", version = "0.16.5" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.5" }
|
||||
solana-vote-api = { path = "../vote_api", version = "0.16.5" }
|
||||
solana-logger = { path = "../../logger", version = "0.16.6" }
|
||||
solana-metrics = { path = "../../metrics", version = "0.16.6" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.6" }
|
||||
solana-vote-api = { path = "../vote_api", version = "0.16.6" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib"]
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-stake-program"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana stake program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -10,9 +10,9 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
log = "0.4.2"
|
||||
solana-logger = { path = "../../logger", version = "0.16.5" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.5" }
|
||||
solana-stake-api = { path = "../stake_api", version = "0.16.5" }
|
||||
solana-logger = { path = "../../logger", version = "0.16.6" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.6" }
|
||||
solana-stake-api = { path = "../stake_api", version = "0.16.6" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib", "cdylib"]
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-storage-api"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana Storage program API"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -17,8 +17,8 @@ num-derive = "0.2"
|
||||
num-traits = "0.2"
|
||||
serde = "1.0.92"
|
||||
serde_derive = "1.0.92"
|
||||
solana-logger = { path = "../../logger", version = "0.16.5" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.5" }
|
||||
solana-logger = { path = "../../logger", version = "0.16.6" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.6" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib"]
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-storage-program"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana storage program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -10,12 +10,12 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
log = "0.4.2"
|
||||
solana-logger = { path = "../../logger", version = "0.16.5" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.5" }
|
||||
solana-storage-api = { path = "../storage_api", version = "0.16.5" }
|
||||
solana-logger = { path = "../../logger", version = "0.16.6" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.6" }
|
||||
solana-storage-api = { path = "../storage_api", version = "0.16.6" }
|
||||
|
||||
[dev-dependencies]
|
||||
solana-runtime = { path = "../../runtime", version = "0.16.5" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.16.6" }
|
||||
assert_matches = "1.3.0"
|
||||
bincode = "1.1.4"
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-token-api"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana Token API"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -15,8 +15,8 @@ num-derive = "0.2"
|
||||
num-traits = "0.2"
|
||||
serde = "1.0.92"
|
||||
serde_derive = "1.0.92"
|
||||
solana-logger = { path = "../../logger", version = "0.16.5" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.5" }
|
||||
solana-logger = { path = "../../logger", version = "0.16.6" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.6" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib"]
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-token-program"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana token program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -10,9 +10,9 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
log = "0.4.2"
|
||||
solana-logger = { path = "../../logger", version = "0.16.5" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.5" }
|
||||
solana-token-api = { path = "../token_api", version = "0.16.5" }
|
||||
solana-logger = { path = "../../logger", version = "0.16.6" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.6" }
|
||||
solana-token-api = { path = "../token_api", version = "0.16.6" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib", "cdylib"]
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-vote-api"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana Vote program API"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -13,9 +13,9 @@ bincode = "1.1.4"
|
||||
log = "0.4.2"
|
||||
serde = "1.0.92"
|
||||
serde_derive = "1.0.92"
|
||||
solana-logger = { path = "../../logger", version = "0.16.5" }
|
||||
solana-metrics = { path = "../../metrics", version = "0.16.5" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.5" }
|
||||
solana-logger = { path = "../../logger", version = "0.16.6" }
|
||||
solana-metrics = { path = "../../metrics", version = "0.16.6" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.6" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib"]
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-vote-program"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana Vote program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -10,9 +10,9 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
log = "0.4.2"
|
||||
solana-logger = { path = "../../logger", version = "0.16.5" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.5" }
|
||||
solana-vote-api = { path = "../vote_api", version = "0.16.5" }
|
||||
solana-logger = { path = "../../logger", version = "0.16.6" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.16.6" }
|
||||
solana-vote-api = { path = "../vote_api", version = "0.16.6" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib", "cdylib"]
|
||||
|
@ -2,17 +2,17 @@
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-replicator"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
|
||||
[dependencies]
|
||||
clap = "2.33.0"
|
||||
solana = { path = "../core", version = "0.16.5" }
|
||||
solana-logger = { path = "../logger", version = "0.16.5" }
|
||||
solana-netutil = { path = "../netutil", version = "0.16.5" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.5" }
|
||||
solana = { path = "../core", version = "0.16.6" }
|
||||
solana-logger = { path = "../logger", version = "0.16.6" }
|
||||
solana-netutil = { path = "../netutil", version = "0.16.6" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.6" }
|
||||
|
||||
[features]
|
||||
cuda = ["solana/cuda"]
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-runtime"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana runtime"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -25,17 +25,17 @@ rayon = "1.1.0"
|
||||
serde = "1.0.92"
|
||||
serde_derive = "1.0.92"
|
||||
serde_json = "1.0.38"
|
||||
solana-logger = { path = "../logger", version = "0.16.5" }
|
||||
solana-metrics = { path = "../metrics", version = "0.16.5" }
|
||||
solana-bpf-loader-api = { path = "../programs/bpf_loader_api", version = "0.16.5" }
|
||||
solana-bpf-loader-program = { path = "../programs/bpf_loader_program", version = "0.16.5" }
|
||||
solana-noop-program = { path = "../programs/noop_program", version = "0.16.5" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.5" }
|
||||
solana-stake-api = { path = "../programs/stake_api", version = "0.16.5" }
|
||||
solana-stake-program = { path = "../programs/stake_program", version = "0.16.5" }
|
||||
solana-storage-api = { path = "../programs/storage_api", version = "0.16.5" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.16.5" }
|
||||
solana-vote-program = { path = "../programs/vote_program", version = "0.16.5" }
|
||||
solana-logger = { path = "../logger", version = "0.16.6" }
|
||||
solana-metrics = { path = "../metrics", version = "0.16.6" }
|
||||
solana-bpf-loader-api = { path = "../programs/bpf_loader_api", version = "0.16.6" }
|
||||
solana-bpf-loader-program = { path = "../programs/bpf_loader_program", version = "0.16.6" }
|
||||
solana-noop-program = { path = "../programs/noop_program", version = "0.16.6" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.6" }
|
||||
solana-stake-api = { path = "../programs/stake_api", version = "0.16.6" }
|
||||
solana-stake-program = { path = "../programs/stake_program", version = "0.16.6" }
|
||||
solana-storage-api = { path = "../programs/storage_api", version = "0.16.6" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.16.6" }
|
||||
solana-vote-program = { path = "../programs/vote_program", version = "0.16.6" }
|
||||
sys-info = "0.5.7"
|
||||
|
||||
[lib]
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-sdk"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana SDK"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -28,5 +28,5 @@ serde_derive = "1.0.92"
|
||||
serde_json = "1.0.39"
|
||||
sha2 = "0.8.0"
|
||||
solana-ed25519-dalek = "0.2.0"
|
||||
solana-logger = { path = "../logger", version = "0.16.5" }
|
||||
solana-logger = { path = "../logger", version = "0.16.6" }
|
||||
untrusted = "0.6.2"
|
||||
|
@ -1,7 +1,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-sdk-bpf-utils"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana BPF SDK Rust Utils"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-upload-perf"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Metrics Upload Utility"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -12,7 +12,7 @@ publish = false
|
||||
[dependencies]
|
||||
log = "0.4.2"
|
||||
serde_json = "1.0.39"
|
||||
solana-metrics = { path = "../metrics", version = "0.16.5" }
|
||||
solana-metrics = { path = "../metrics", version = "0.16.6" }
|
||||
|
||||
[[bin]]
|
||||
name = "solana-upload-perf"
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-validator-info"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
description = "Solana validator registration tool"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -20,9 +20,9 @@ reqwest = "0.9.18"
|
||||
serde = "1.0.94"
|
||||
serde_derive = "1.0.94"
|
||||
serde_json = "1.0.40"
|
||||
solana-client = { path = "../client", version = "0.16.5" }
|
||||
solana-config-api = { path = "../programs/config_api", version = "0.16.5" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.5" }
|
||||
solana-client = { path = "../client", version = "0.16.6" }
|
||||
solana-config-api = { path = "../programs/config_api", version = "0.16.6" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.6" }
|
||||
url = "1.7.2"
|
||||
|
||||
[[bin]]
|
||||
|
@ -17,8 +17,8 @@ use std::process::exit;
|
||||
|
||||
pub const MAX_SHORT_FIELD_LENGTH: usize = 70;
|
||||
pub const MAX_LONG_FIELD_LENGTH: usize = 300;
|
||||
pub const MAX_VALIDATOR_INFO: u64 = 570;
|
||||
pub const JSON_RPC_URL: &str = "https://api.testnet.solana.com/";
|
||||
pub const MAX_VALIDATOR_INFO: u64 = 576;
|
||||
pub const JSON_RPC_URL: &str = "https://api.testnet.solana.com:8899";
|
||||
|
||||
// Config account key: Va1idator1nfo111111111111111111111111111111
|
||||
pub const REGISTER_CONFIG_KEY: [u8; 32] = [
|
||||
@ -103,23 +103,23 @@ fn check_details_length(string: String) -> Result<(), String> {
|
||||
|
||||
fn verify_keybase(
|
||||
validator_pubkey: &Pubkey,
|
||||
keybase_id: &Value,
|
||||
keybase_username: &Value,
|
||||
) -> Result<(), Box<dyn error::Error>> {
|
||||
if let Some(keybase_id) = keybase_id.as_str() {
|
||||
if let Some(keybase_username) = keybase_username.as_str() {
|
||||
let url = format!(
|
||||
"https://keybase.pub/{}/solana_pubkey_{:?}",
|
||||
keybase_id, validator_pubkey
|
||||
"https://keybase.pub/{}/solana/validator-{:?}",
|
||||
keybase_username, validator_pubkey
|
||||
);
|
||||
let client = Client::new();
|
||||
if client.head(&url).send()?.status().is_success() {
|
||||
Ok(())
|
||||
} else {
|
||||
Err(format!("keybase_id could not be confirmed at: {}. Please add this pubkey file to your keybase profile to connect", url))?
|
||||
Err(format!("keybase_username could not be confirmed at: {}. Please add this pubkey file to your keybase profile to connect", url))?
|
||||
}
|
||||
} else {
|
||||
Err(format!(
|
||||
"keybase_id could not be parsed as String: {}",
|
||||
keybase_id
|
||||
"keybase_username could not be parsed as String: {}",
|
||||
keybase_username
|
||||
))?
|
||||
}
|
||||
}
|
||||
@ -136,10 +136,10 @@ fn parse_args(matches: &ArgMatches<'_>) -> Value {
|
||||
if let Some(details) = matches.value_of("details") {
|
||||
map.insert("details".to_string(), Value::String(details.to_string()));
|
||||
}
|
||||
if let Some(keybase_id) = matches.value_of("keybase_id") {
|
||||
if let Some(keybase_username) = matches.value_of("keybase_username") {
|
||||
map.insert(
|
||||
"keybaseId".to_string(),
|
||||
Value::String(keybase_id.to_string()),
|
||||
"keybaseUsername".to_string(),
|
||||
Value::String(keybase_username.to_string()),
|
||||
);
|
||||
}
|
||||
Value::Object(map)
|
||||
@ -218,13 +218,13 @@ fn main() -> Result<(), Box<dyn error::Error>> {
|
||||
.help("Validator website url"),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name("keybase_id")
|
||||
Arg::with_name("keybase_username")
|
||||
.short("k")
|
||||
.long("keybase")
|
||||
.value_name("STRING")
|
||||
.takes_value(true)
|
||||
.validator(is_short_field)
|
||||
.help("Validator Keybase id"),
|
||||
.help("Validator Keybase username"),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name("details")
|
||||
@ -294,7 +294,7 @@ fn main() -> Result<(), Box<dyn error::Error>> {
|
||||
// Prepare validator info
|
||||
let keys = vec![(id(), false), (validator_keypair.pubkey(), true)];
|
||||
let validator_info = parse_args(&matches);
|
||||
if let Some(string) = validator_info.get("keybaseId") {
|
||||
if let Some(string) = validator_info.get("keybaseUsername") {
|
||||
verify_keybase(&validator_keypair.pubkey(), &string)?;
|
||||
}
|
||||
let validator_string = serde_json::to_string(&validator_info)?;
|
||||
@ -426,12 +426,16 @@ mod tests {
|
||||
let matches = App::new("test")
|
||||
.arg(Arg::with_name("name").short("n").takes_value(true))
|
||||
.arg(Arg::with_name("website").short("w").takes_value(true))
|
||||
.arg(Arg::with_name("keybase_id").short("k").takes_value(true))
|
||||
.arg(
|
||||
Arg::with_name("keybase_username")
|
||||
.short("k")
|
||||
.takes_value(true),
|
||||
)
|
||||
.arg(Arg::with_name("details").short("d").takes_value(true))
|
||||
.get_matches_from(vec!["test", "-n", "Alice", "-k", "464bb0f2956f7e83"]);
|
||||
.get_matches_from(vec!["test", "-n", "Alice", "-k", "alice_keybase"]);
|
||||
let expected = json!({
|
||||
"name": "Alice",
|
||||
"keybaseId": "464bb0f2956f7e83",
|
||||
"keybaseUsername": "alice_keybase",
|
||||
});
|
||||
assert_eq!(parse_args(&matches), expected);
|
||||
}
|
||||
@ -496,7 +500,10 @@ mod tests {
|
||||
"website".to_string(),
|
||||
Value::String(max_short_string.clone()),
|
||||
);
|
||||
info.insert("keybaseId".to_string(), Value::String(max_short_string));
|
||||
info.insert(
|
||||
"keybaseUsername".to_string(),
|
||||
Value::String(max_short_string),
|
||||
);
|
||||
info.insert("details".to_string(), Value::String(max_long_string));
|
||||
let info_string = serde_json::to_string(&Value::Object(info)).unwrap();
|
||||
|
||||
|
@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-validator"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@ -12,15 +12,15 @@ homepage = "https://solana.com/"
|
||||
clap = "2.33.0"
|
||||
log = "0.4.2"
|
||||
serde_json = "1.0.39"
|
||||
solana = { path = "../core", version = "0.16.5" }
|
||||
solana-drone = { path = "../drone", version = "0.16.5" }
|
||||
solana-logger = { path = "../logger", version = "0.16.5" }
|
||||
solana-metrics = { path = "../metrics", version = "0.16.5" }
|
||||
solana-netutil = { path = "../netutil", version = "0.16.5" }
|
||||
solana-runtime = { path = "../runtime", version = "0.16.5" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.5" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.16.5" }
|
||||
solana-vote-signer = { path = "../vote-signer", version = "0.16.5" }
|
||||
solana = { path = "../core", version = "0.16.6" }
|
||||
solana-drone = { path = "../drone", version = "0.16.6" }
|
||||
solana-logger = { path = "../logger", version = "0.16.6" }
|
||||
solana-metrics = { path = "../metrics", version = "0.16.6" }
|
||||
solana-netutil = { path = "../netutil", version = "0.16.6" }
|
||||
solana-runtime = { path = "../runtime", version = "0.16.6" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.6" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.16.6" }
|
||||
solana-vote-signer = { path = "../vote-signer", version = "0.16.6" }
|
||||
|
||||
[features]
|
||||
cuda = ["solana/cuda"]
|
||||
|
@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-vote-signer"
|
||||
description = "Solana Vote Signing Service"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@ -17,8 +17,8 @@ jsonrpc-http-server = "12.0.0"
|
||||
log = "0.4.2"
|
||||
serde = "1.0.92"
|
||||
serde_json = "1.0.39"
|
||||
solana-metrics = { path = "../metrics", version = "0.16.5" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.5" }
|
||||
solana-metrics = { path = "../metrics", version = "0.16.6" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.6" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib"]
|
||||
|
@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-wallet"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "0.16.5"
|
||||
version = "0.16.6"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@ -17,22 +17,22 @@ dirs = "2.0.1"
|
||||
log = "0.4.2"
|
||||
num-traits = "0.2"
|
||||
serde_json = "1.0.39"
|
||||
solana-budget-api = { path = "../programs/budget_api", version = "0.16.5" }
|
||||
solana-client = { path = "../client", version = "0.16.5" }
|
||||
solana-drone = { path = "../drone", version = "0.16.5" }
|
||||
solana-logger = { path = "../logger", version = "0.16.5" }
|
||||
solana-netutil = { path = "../netutil", version = "0.16.5" }
|
||||
solana-runtime = { path = "../runtime", version = "0.16.5" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.5" }
|
||||
solana-stake-api = { path = "../programs/stake_api", version = "0.16.5" }
|
||||
solana-storage-api = { path = "../programs/storage_api", version = "0.16.5" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.16.5" }
|
||||
solana-vote-signer = { path = "../vote-signer", version = "0.16.5" }
|
||||
solana-budget-api = { path = "../programs/budget_api", version = "0.16.6" }
|
||||
solana-client = { path = "../client", version = "0.16.6" }
|
||||
solana-drone = { path = "../drone", version = "0.16.6" }
|
||||
solana-logger = { path = "../logger", version = "0.16.6" }
|
||||
solana-netutil = { path = "../netutil", version = "0.16.6" }
|
||||
solana-runtime = { path = "../runtime", version = "0.16.6" }
|
||||
solana-sdk = { path = "../sdk", version = "0.16.6" }
|
||||
solana-stake-api = { path = "../programs/stake_api", version = "0.16.6" }
|
||||
solana-storage-api = { path = "../programs/storage_api", version = "0.16.6" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.16.6" }
|
||||
solana-vote-signer = { path = "../vote-signer", version = "0.16.6" }
|
||||
url = "1.7.2"
|
||||
|
||||
[dev-dependencies]
|
||||
solana = { path = "../core", version = "0.16.5" }
|
||||
solana-budget-program = { path = "../programs/budget_program", version = "0.16.5" }
|
||||
solana = { path = "../core", version = "0.16.6" }
|
||||
solana-budget-program = { path = "../programs/budget_program", version = "0.16.6" }
|
||||
|
||||
[features]
|
||||
cuda = []
|
||||
|
Reference in New Issue
Block a user