Compare commits
33 Commits
Author | SHA1 | Date | |
---|---|---|---|
94e06342ac | |||
ecfe655ba3 | |||
f8ea80850e | |||
657d9ad215 | |||
963ce0bbc3 | |||
1e0cd6549b | |||
395a7ec96e | |||
42ee738646 | |||
515ab21f07 | |||
7c5e5a06f3 | |||
7c0c7da72d | |||
b328e5f6ec | |||
0a4b6cedc7 | |||
d9a53eb9d4 | |||
a5b8ee645f | |||
1cbd1c42df | |||
b380bdd54f | |||
cb194eaee7 | |||
ff3f810284 | |||
7e7e9603c9 | |||
4c0e29cd2a | |||
065cf51a3f | |||
d4ec81fe61 | |||
e2508e5d12 | |||
c7fea37964 | |||
b197edea84 | |||
11f99faf0a | |||
728314c96f | |||
2530448474 | |||
49ad5e0b69 | |||
3c49d48666 | |||
2fe93101cc | |||
e90d97e244 |
351
Cargo.lock
generated
351
Cargo.lock
generated
@ -2136,7 +2136,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solana"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2166,20 +2166,20 @@ dependencies = [
|
||||
"serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-budget-api 0.13.0",
|
||||
"solana-budget-program 0.13.0",
|
||||
"solana-client 0.13.0",
|
||||
"solana-drone 0.13.0",
|
||||
"solana-kvstore 0.13.0",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-metrics 0.13.0",
|
||||
"solana-netutil 0.13.0",
|
||||
"solana-runtime 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-storage-api 0.13.0",
|
||||
"solana-vote-api 0.13.0",
|
||||
"solana-vote-program 0.13.0",
|
||||
"solana-vote-signer 0.13.0",
|
||||
"solana-budget-api 0.13.2",
|
||||
"solana-budget-program 0.13.2",
|
||||
"solana-client 0.13.2",
|
||||
"solana-drone 0.13.2",
|
||||
"solana-kvstore 0.13.2",
|
||||
"solana-logger 0.13.2",
|
||||
"solana-metrics 0.13.2",
|
||||
"solana-netutil 0.13.2",
|
||||
"solana-runtime 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
"solana-storage-api 0.13.2",
|
||||
"solana-vote-api 0.13.2",
|
||||
"solana-vote-program 0.13.2",
|
||||
"solana-vote-signer 0.13.2",
|
||||
"sys-info 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2188,85 +2188,85 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solana-bench-streamer"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana 0.13.0",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-netutil 0.13.0",
|
||||
"solana 0.13.2",
|
||||
"solana-logger 0.13.2",
|
||||
"solana-netutil 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-bench-tps"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana 0.13.0",
|
||||
"solana-client 0.13.0",
|
||||
"solana-drone 0.13.0",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-metrics 0.13.0",
|
||||
"solana-netutil 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana 0.13.2",
|
||||
"solana-client 0.13.2",
|
||||
"solana-drone 0.13.2",
|
||||
"solana-logger 0.13.2",
|
||||
"solana-metrics 0.13.2",
|
||||
"solana-netutil 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-bpf-programs"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"elf 0.0.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-bpfloader 0.13.0",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-runtime 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-bpfloader 0.13.2",
|
||||
"solana-logger 0.13.2",
|
||||
"solana-runtime 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
"solana_rbpf 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-bpfloader"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.51 (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.90 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-logger 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
"solana_rbpf 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-budget-api"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"chrono 0.4.6 (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.90 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-runtime 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-runtime 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-budget-program"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-budget-api 0.13.0",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-budget-api 0.13.2",
|
||||
"solana-logger 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-client"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2277,37 +2277,37 @@ dependencies = [
|
||||
"serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-netutil 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-logger 0.13.2",
|
||||
"solana-netutil 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-config-api"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"bincode 1.1.3 (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.90 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-runtime 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-logger 0.13.2",
|
||||
"solana-runtime 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-config-program"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-config-api 0.13.0",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-config-api 0.13.2",
|
||||
"solana-logger 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-drone"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2316,94 +2316,95 @@ dependencies = [
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-metrics 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-logger 0.13.2",
|
||||
"solana-metrics 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
"tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-exchange-api"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"bincode 1.1.3 (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.90 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-runtime 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-logger 0.13.2",
|
||||
"solana-runtime 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-exchange-program"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-exchange-api 0.13.0",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-exchange-api 0.13.2",
|
||||
"solana-logger 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-failure-program"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-runtime 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-runtime 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-fullnode"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
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.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana 0.13.0",
|
||||
"solana-drone 0.13.0",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-metrics 0.13.0",
|
||||
"solana-netutil 0.13.0",
|
||||
"solana-runtime 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-vote-api 0.13.0",
|
||||
"solana-vote-signer 0.13.0",
|
||||
"solana 0.13.2",
|
||||
"solana-drone 0.13.2",
|
||||
"solana-logger 0.13.2",
|
||||
"solana-metrics 0.13.2",
|
||||
"solana-netutil 0.13.2",
|
||||
"solana-runtime 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
"solana-vote-api 0.13.2",
|
||||
"solana-vote-signer 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-genesis"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"hashbrown 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana 0.13.0",
|
||||
"solana-budget-api 0.13.0",
|
||||
"solana-config-api 0.13.0",
|
||||
"solana-exchange-api 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-storage-api 0.13.0",
|
||||
"solana-token-api 0.13.0",
|
||||
"solana-vote-api 0.13.0",
|
||||
"solana 0.13.2",
|
||||
"solana-budget-api 0.13.2",
|
||||
"solana-config-api 0.13.2",
|
||||
"solana-exchange-api 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
"solana-stake-api 0.13.2",
|
||||
"solana-storage-api 0.13.2",
|
||||
"solana-token-api 0.13.2",
|
||||
"solana-vote-api 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-gossip"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
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.13.0",
|
||||
"solana-netutil 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana 0.13.2",
|
||||
"solana-netutil 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-install"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2420,10 +2421,10 @@ dependencies = [
|
||||
"serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_yaml 0.8.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-client 0.13.0",
|
||||
"solana-config-api 0.13.0",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-client 0.13.2",
|
||||
"solana-config-api 0.13.2",
|
||||
"solana-logger 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
"tar 0.4.22 (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)",
|
||||
@ -2431,16 +2432,16 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solana-keygen"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"dirs 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-sdk 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-kvstore"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2455,40 +2456,40 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solana-ledger-tool"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"assert_cmd 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana 0.13.0",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-runtime 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana 0.13.2",
|
||||
"solana-logger 0.13.2",
|
||||
"solana-runtime 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-logger"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-metrics"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"influx_db_client 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"lazy_static 1.3.0 (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)",
|
||||
"reqwest 0.9.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-sdk 0.13.2",
|
||||
"sys-info 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-netutil"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"ipnetwork 0.12.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2497,33 +2498,33 @@ dependencies = [
|
||||
"rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"reqwest 0.9.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-logger 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-noop-program"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-runtime 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-logger 0.13.2",
|
||||
"solana-runtime 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-replicator"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana 0.13.0",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-netutil 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana 0.13.2",
|
||||
"solana-logger 0.13.2",
|
||||
"solana-netutil 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-runtime"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bv 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2539,15 +2540,15 @@ dependencies = [
|
||||
"serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-metrics 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-vote-api 0.13.0",
|
||||
"solana-logger 0.13.2",
|
||||
"solana-metrics 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
"solana-vote-api 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-sdk"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2568,109 +2569,109 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solana-stake-api"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"bincode 1.1.3 (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.90 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-metrics 0.13.0",
|
||||
"solana-runtime 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-vote-api 0.13.0",
|
||||
"solana-logger 0.13.2",
|
||||
"solana-metrics 0.13.2",
|
||||
"solana-runtime 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
"solana-vote-api 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-stake-program"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-stake-api 0.13.0",
|
||||
"solana-logger 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
"solana-stake-api 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-storage-api"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"bincode 1.1.3 (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.90 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-runtime 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-logger 0.13.2",
|
||||
"solana-runtime 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-storage-program"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-storage-api 0.13.0",
|
||||
"solana-logger 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
"solana-storage-api 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-token-api"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"bincode 1.1.3 (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.90 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-logger 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-token-program"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-token-api 0.13.0",
|
||||
"solana-logger 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
"solana-token-api 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-upload-perf"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-metrics 0.13.0",
|
||||
"solana-metrics 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-vote-api"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"bincode 1.1.3 (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.90 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-metrics 0.13.0",
|
||||
"solana-runtime 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-logger 0.13.2",
|
||||
"solana-metrics 0.13.2",
|
||||
"solana-runtime 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-vote-program"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-vote-api 0.13.0",
|
||||
"solana-logger 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
"solana-vote-api 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-vote-signer"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
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)",
|
||||
@ -2680,13 +2681,13 @@ dependencies = [
|
||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana-metrics 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-metrics 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-wallet"
|
||||
version = "0.13.0"
|
||||
version = "0.13.2"
|
||||
dependencies = [
|
||||
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2695,16 +2696,16 @@ dependencies = [
|
||||
"dirs 1.0.5 (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.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"solana 0.13.0",
|
||||
"solana-budget-api 0.13.0",
|
||||
"solana-budget-program 0.13.0",
|
||||
"solana-client 0.13.0",
|
||||
"solana-drone 0.13.0",
|
||||
"solana-logger 0.13.0",
|
||||
"solana-netutil 0.13.0",
|
||||
"solana-sdk 0.13.0",
|
||||
"solana-vote-api 0.13.0",
|
||||
"solana-vote-signer 0.13.0",
|
||||
"solana 0.13.2",
|
||||
"solana-budget-api 0.13.2",
|
||||
"solana-budget-program 0.13.2",
|
||||
"solana-client 0.13.2",
|
||||
"solana-drone 0.13.2",
|
||||
"solana-logger 0.13.2",
|
||||
"solana-netutil 0.13.2",
|
||||
"solana-sdk 0.13.2",
|
||||
"solana-vote-api 0.13.2",
|
||||
"solana-vote-signer 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -2,16 +2,16 @@
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-bench-streamer"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
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.13.0" }
|
||||
solana-logger = { path = "../logger", version = "0.13.0" }
|
||||
solana-netutil = { path = "../netutil", version = "0.13.0" }
|
||||
solana = { path = "../core", version = "0.13.3" }
|
||||
solana-logger = { path = "../logger", version = "0.13.3" }
|
||||
solana-netutil = { path = "../netutil", version = "0.13.3" }
|
||||
|
||||
[features]
|
||||
cuda = ["solana/cuda"]
|
||||
|
@ -2,7 +2,7 @@
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-bench-tps"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@ -11,13 +11,13 @@ homepage = "https://solana.com/"
|
||||
clap = "2.33.0"
|
||||
rayon = "1.0.3"
|
||||
serde_json = "1.0.39"
|
||||
solana = { path = "../core", version = "0.13.0" }
|
||||
solana-client = { path = "../client", version = "0.13.0" }
|
||||
solana-drone = { path = "../drone", version = "0.13.0" }
|
||||
solana-logger = { path = "../logger", version = "0.13.0" }
|
||||
solana-metrics = { path = "../metrics", version = "0.13.0" }
|
||||
solana-netutil = { path = "../netutil", version = "0.13.0" }
|
||||
solana-sdk = { path = "../sdk", version = "0.13.0" }
|
||||
solana = { path = "../core", version = "0.13.3" }
|
||||
solana-client = { path = "../client", version = "0.13.3" }
|
||||
solana-drone = { path = "../drone", version = "0.13.3" }
|
||||
solana-logger = { path = "../logger", version = "0.13.3" }
|
||||
solana-metrics = { path = "../metrics", version = "0.13.3" }
|
||||
solana-netutil = { path = "../netutil", version = "0.13.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.13.3" }
|
||||
|
||||
[features]
|
||||
cuda = ["solana/cuda"]
|
||||
|
@ -24,8 +24,10 @@ Methods
|
||||
* [confirmTransaction](#confirmtransaction)
|
||||
* [getAccountInfo](#getaccountinfo)
|
||||
* [getBalance](#getbalance)
|
||||
* [getClusterNodes](#getclusternodes)
|
||||
* [getRecentBlockhash](#getrecentblockhash)
|
||||
* [getSignatureStatus](#getsignaturestatus)
|
||||
* [getSlotLeader](#getslotleader)
|
||||
* [getNumBlocksSinceSignatureConfirmation](#getnumblockssincesignatureconfirmation)
|
||||
* [getTransactionCount](#gettransactioncount)
|
||||
* [requestAirdrop](#requestairdrop)
|
||||
@ -114,6 +116,30 @@ curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0", "id":1, "
|
||||
|
||||
---
|
||||
|
||||
### getClusterNodes
|
||||
Returns information about all the nodes participating in the cluster
|
||||
|
||||
##### Parameters:
|
||||
None
|
||||
|
||||
##### Results:
|
||||
The result field will be an array of JSON objects, each with the following sub fields:
|
||||
* `id` - Node identifier, as base-58 encoded string
|
||||
* `gossip` - Gossip network address for the node
|
||||
* `tpu` - TPU network address for the node
|
||||
* `rpc` - JSON RPC network address for the node, or `null` if the JSON RPC service is not enabled
|
||||
|
||||
##### Example:
|
||||
```bash
|
||||
// Request
|
||||
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0", "id":1, "method":"getClusterNodes"}' http://localhost:8899
|
||||
|
||||
// Result
|
||||
{"jsonrpc":"2.0","result":[{"gossip":"10.239.6.48:8001","id":"9QzsJf7LPLj8GkXbYT3LFDKqsj2hHG7TA3xinJHu8epQ","rpc":"10.239.6.48:8899","tpu":"10.239.6.48:8856"}],"id":1}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### getAccountInfo
|
||||
Returns all information associated with the account of provided Pubkey
|
||||
|
||||
@ -183,7 +209,27 @@ curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0", "id":1, "
|
||||
{"jsonrpc":"2.0","result":"SignatureNotFound","id":1}
|
||||
```
|
||||
|
||||
---
|
||||
-----
|
||||
|
||||
### getSlotLeader
|
||||
Returns the current slot leader
|
||||
|
||||
##### Parameters:
|
||||
None
|
||||
|
||||
##### Results:
|
||||
* `string` - Node Id as base-58 encoded string
|
||||
|
||||
##### Example:
|
||||
```bash
|
||||
// Request
|
||||
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":1, "method":"getSlotLeader"}' http://localhost:8899
|
||||
|
||||
// Result
|
||||
{"jsonrpc":"2.0","result":"ENvAW7JScgYq6o4zKZwewtkzzJgDzuJAFxYasvmEQdpS","id":1}
|
||||
```
|
||||
|
||||
-----
|
||||
|
||||
### getNumBlocksSinceSignatureConfirmation
|
||||
Returns the current number of blocks since signature has been confirmed.
|
||||
|
@ -1,21 +1,22 @@
|
||||
## Testnet Participation
|
||||
This document describes how to participate in the beta testnet as a
|
||||
This document describes how to participate in the testnet as a
|
||||
validator node.
|
||||
|
||||
Please note some of the information and instructions described here may change
|
||||
in future releases.
|
||||
|
||||
### Beta Testnet Overview
|
||||
The beta testnet features a validator running at beta.testnet.solana.com, which
|
||||
### Testnet Overview
|
||||
The testnet features a validator running at .testnet.solana.com, which
|
||||
serves as the entrypoint to the cluster for your validator.
|
||||
|
||||
Additionally there is a blockexplorer available at http://beta.testnet.solana.com/.
|
||||
Additionally there is a blockexplorer available at
|
||||
[http://testnet.solana.com/](http://testnet.solana.com/).
|
||||
|
||||
The beta testnet is configured to reset the ledger every 24hours, or sooner
|
||||
The testnet is configured to reset the ledger every 24hours, or sooner
|
||||
should an hourly automated sanity test fail.
|
||||
|
||||
### Machine Requirements
|
||||
Since the beta testnet is not intended for stress testing of max transaction
|
||||
Since the testnet is not intended for stress testing of max transaction
|
||||
throughput, a higher-end machine with a GPU is not necessary to participate.
|
||||
|
||||
However ensure the machine used is not behind a residential NAT to avoid NAT
|
||||
@ -25,6 +26,27 @@ traversal issues. A cloud-hosted machine works best. Ensure that IP ports
|
||||
Prebuilt binaries are available for Linux x86_64 (Ubuntu 18.04 recommended).
|
||||
MacOS or WSL users may build from source.
|
||||
|
||||
#### Confirm The Testnet Is Reachable
|
||||
Before attaching a validator node, sanity check that the cluster is accessible
|
||||
to your machine by running some simple wallet commands. If any of these
|
||||
commands fail, please retry 5-10 minutes later to confirm the testnet is not
|
||||
just restarting itself before debugging further.
|
||||
|
||||
Fetch the current testnet transaction count over JSON RPC:
|
||||
```bash
|
||||
$ curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1, "method":"getTransactionCount"}' http://testnet.solana.com:8899
|
||||
```
|
||||
|
||||
Inspect the blockexplorer at [http://testnet.solana.com/](http://testnet.solana.com/) for activity.
|
||||
|
||||
Run the following command to join the gossip network and view all the other nodes in the cluster:
|
||||
```bash
|
||||
$ solana-gossip --network testnet.solana.com:8001
|
||||
```
|
||||
|
||||
View the [metrics dashboard](https://metrics.solana.com:3000/d/testnet-edge/testnet-monitor-edge?var-testnet=testnet)
|
||||
for more detail on cluster activity.
|
||||
|
||||
### Validator Setup
|
||||
#### Obtaining The Software
|
||||
##### Bootstrap with `solana-install`
|
||||
@ -35,13 +57,13 @@ software on Linux x86_64 systems.
|
||||
Install the latest release with a single shell command:
|
||||
```bash
|
||||
$ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.13.0/install/solana-install-init.sh | \
|
||||
sh -c - --url https://api.beta.testnet.solana.com
|
||||
sh -s - --url https://api.testnet.solana.com
|
||||
```
|
||||
|
||||
Alternatively build the `solana-install` program from source and run the
|
||||
following command to obtain the same result:
|
||||
```bash
|
||||
$ solana-install init --url https://api.beta.testnet.solana.com
|
||||
$ solana-install init --url https://api.testnet.solana.com
|
||||
```
|
||||
|
||||
After a successful install, `solana-install update` may be used to easily update the cluster
|
||||
@ -67,53 +89,37 @@ $ ./scripts/cargo-install-all.sh .
|
||||
$ export PATH=$PWD/bin:$PATH
|
||||
```
|
||||
|
||||
#### Confirm The Testnet Is Reachable
|
||||
Before attaching a validator node, sanity check that the cluster is accessible
|
||||
to your machine by running some simple wallet commands. If any of these
|
||||
commands fail, please retry 5-10 minutes later to confirm the testnet is not
|
||||
just restarting itself before debugging further.
|
||||
|
||||
Receive an airdrop of lamports from the testnet drone:
|
||||
```bash
|
||||
$ solana-wallet -n beta.testnet.solana.com airdrop 123
|
||||
$ solana-wallet -n beta.testnet.solana.com balance
|
||||
```
|
||||
|
||||
Fetch the current testnet transaction count over JSON RPC:
|
||||
```bash
|
||||
$ curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1, "method":"getTransactionCount"}' http://beta.testnet.solana.com:8899
|
||||
```
|
||||
|
||||
Inspect the blockexplorer at http://beta.testnet.solana.com/ for activity.
|
||||
|
||||
Run the following command to join the gossip network and view all the other nodes in the cluster:
|
||||
```bash
|
||||
$ solana-gossip --network beta.testnet.solana.com:8001
|
||||
```
|
||||
|
||||
### Starting The Validator
|
||||
The following command will start a new validator node.
|
||||
|
||||
Sanity check that you are able to interact with the cluster by receiving a small
|
||||
airdrop of lamports from the testnet drone:
|
||||
```bash
|
||||
$ solana-wallet -n testnet.solana.com airdrop 123
|
||||
$ solana-wallet -n testnet.solana.com balance
|
||||
```
|
||||
|
||||
Then the following command will start a new validator node.
|
||||
|
||||
If this is a `solana-install`-installation:
|
||||
```bash
|
||||
$ fullnode-x.sh --public-address --poll-for-new-genesis-block beta.testnet.solana.com:8001
|
||||
$ fullnode-x.sh --public-address --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
|
||||
$ solana-install run fullnode-x.sh --public-address --poll-for-new-genesis-block beta.testnet.solana.com:8001
|
||||
$ solana-install run fullnode-x.sh -- --public-address --poll-for-new-genesis-block testnet.solana.com
|
||||
```
|
||||
|
||||
When not using `solana-install`:
|
||||
```bash
|
||||
$ USE_INSTALL=1 ./multinode-demo/fullnode-x.sh --public-address --poll-for-new-genesis-block beta.testnet.solana.com:8001
|
||||
$ USE_INSTALL=1 ./multinode-demo/fullnode-x.sh --public-address --poll-for-new-genesis-block testnet.solana.com
|
||||
```
|
||||
|
||||
Then from another console, confirm the IP address if your node is now visible in
|
||||
the gossip network by running:
|
||||
```bash
|
||||
$ solana-gossip --network beta.testnet.solana.com:8001
|
||||
$ solana-gossip --network testnet.solana.com:8001
|
||||
```
|
||||
|
||||
Congratulations, you're now participating in the testnet cluster!
|
||||
@ -130,7 +136,6 @@ validator node:
|
||||
```bash
|
||||
export u="username obtained from the Solana maintainers"
|
||||
export p="password obtained from the Solana maintainers"
|
||||
export SOLANA_METRICS_CONFIG="db=testnet-beta,u=${u:?},p=${p:?}"
|
||||
export SOLANA_METRICS_CONFIG="db=testnet,u=${u:?},p=${p:?}"
|
||||
source scripts/configure-metrics.sh
|
||||
```
|
||||
Inspect for your contributions to our [metrics dashboard](https://metrics.solana.com:3000/d/U9-26Cqmk/testnet-monitor-cloud?refresh=60s&orgId=2&var-hostid=All).
|
||||
|
@ -55,7 +55,7 @@ while getopts "ch?i:k:brxR" opt; do
|
||||
restartInterval=$OPTARG
|
||||
;;
|
||||
b)
|
||||
maybeNoLeaderRotation="--only-bootstrap-stake"
|
||||
maybeNoLeaderRotation="--stake 0"
|
||||
;;
|
||||
x)
|
||||
extraNodes=$((extraNodes + 1))
|
||||
@ -78,7 +78,6 @@ source scripts/configure-metrics.sh
|
||||
nodes=(
|
||||
"multinode-demo/drone.sh"
|
||||
"multinode-demo/bootstrap-leader.sh \
|
||||
$maybeNoLeaderRotation \
|
||||
--enable-rpc-exit \
|
||||
--init-complete-file init-complete-node1.log"
|
||||
"multinode-demo/fullnode.sh \
|
||||
|
@ -19,9 +19,10 @@ CRATES=(
|
||||
metrics
|
||||
client
|
||||
drone
|
||||
programs/{budget_api,config_api,storage_api,token_api,vote_api}
|
||||
programs/{budget_api,config_api,stake_api,storage_api,token_api,vote_api,exchange_api}
|
||||
programs/{vote_program,budget_program,bpf_loader,config_program,exchange_program,failure_program}
|
||||
programs/{noop_program,stake_program,storage_program,token_program}
|
||||
runtime
|
||||
programs/{budget,bpf_loader,config,vote,storage,token,vote}
|
||||
vote-signer
|
||||
core
|
||||
fullnode
|
||||
@ -32,7 +33,6 @@ CRATES=(
|
||||
install
|
||||
)
|
||||
|
||||
|
||||
# Only package/publish if this is a tagged release
|
||||
[[ -n $TRIGGERED_BUILDKITE_TAG ]] || {
|
||||
echo TRIGGERED_BUILDKITE_TAG unset, skipped
|
||||
@ -55,7 +55,7 @@ for crate in "${CRATES[@]}"; do
|
||||
exit 1
|
||||
fi
|
||||
echo "-- $crate"
|
||||
grep -q "^version = \"$expectedCrateVersion\"$" Cargo.toml || {
|
||||
grep -q "^version = \"$expectedCrateVersion\"$" "$crate"/Cargo.toml || {
|
||||
echo "Error: $crate/Cargo.toml version is not $expectedCrateVersion"
|
||||
exit 1
|
||||
}
|
||||
|
@ -64,6 +64,36 @@ EOF
|
||||
exit 0
|
||||
fi
|
||||
|
||||
ci/channel-info.sh
|
||||
eval "$(ci/channel-info.sh)"
|
||||
|
||||
|
||||
EC2_ZONES=(us-west-1a sa-east-1a ap-northeast-2a eu-central-1a ca-central-1a)
|
||||
GCE_ZONES=(us-west1-b asia-east2-a europe-west4-a southamerica-east1-b us-east4-c)
|
||||
case $TESTNET in
|
||||
testnet-edge|testnet-edge-perf)
|
||||
CHANNEL_OR_TAG=edge
|
||||
CHANNEL_BRANCH=$EDGE_CHANNEL
|
||||
: "${TESTNET_DB_HOST:=https://clocktower-f1d56615.influxcloud.net:8086}"
|
||||
;;
|
||||
testnet-beta|testnet-beta-perf)
|
||||
CHANNEL_OR_TAG=beta
|
||||
CHANNEL_BRANCH=$BETA_CHANNEL
|
||||
: "${TESTNET_DB_HOST:=https://clocktower-f1d56615.influxcloud.net:8086}"
|
||||
: "${EC2_NODE_COUNT:=10}"
|
||||
: "${GCE_NODE_COUNT:=}"
|
||||
;;
|
||||
testnet|testnet-perf)
|
||||
CHANNEL_OR_TAG=$STABLE_CHANNEL_LATEST_TAG
|
||||
CHANNEL_BRANCH=$STABLE_CHANNEL
|
||||
: "${TESTNET_DB_HOST:=https://clocktower-f1d56615.influxcloud.net:8086}"
|
||||
;;
|
||||
*)
|
||||
echo "Error: Invalid TESTNET=$TESTNET"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
if [[ -n $TESTNET_DB_HOST ]]; then
|
||||
SOLANA_METRICS_PARTIAL_CONFIG="host=$TESTNET_DB_HOST,$SOLANA_METRICS_PARTIAL_CONFIG"
|
||||
fi
|
||||
@ -72,31 +102,9 @@ export SOLANA_METRICS_CONFIG="db=$TESTNET,$SOLANA_METRICS_PARTIAL_CONFIG"
|
||||
echo "SOLANA_METRICS_CONFIG: $SOLANA_METRICS_CONFIG"
|
||||
source scripts/configure-metrics.sh
|
||||
|
||||
ci/channel-info.sh
|
||||
eval "$(ci/channel-info.sh)"
|
||||
|
||||
if [[ -n $TESTNET_TAG ]]; then
|
||||
CHANNEL_OR_TAG=$TESTNET_TAG
|
||||
else
|
||||
case $TESTNET in
|
||||
testnet-edge|testnet-edge-perf)
|
||||
CHANNEL_OR_TAG=edge
|
||||
CHANNEL_BRANCH=$EDGE_CHANNEL
|
||||
;;
|
||||
testnet-beta|testnet-beta-perf)
|
||||
CHANNEL_OR_TAG=beta
|
||||
CHANNEL_BRANCH=$BETA_CHANNEL
|
||||
;;
|
||||
testnet|testnet-perf)
|
||||
CHANNEL_OR_TAG=$STABLE_CHANNEL_LATEST_TAG
|
||||
CHANNEL_BRANCH=$STABLE_CHANNEL
|
||||
;;
|
||||
*)
|
||||
echo "Error: Invalid TESTNET=$TESTNET"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
if [[ $BUILDKITE_BRANCH != "$CHANNEL_BRANCH" ]]; then
|
||||
(
|
||||
cat <<EOF
|
||||
@ -124,7 +132,8 @@ sanity() {
|
||||
testnet-edge)
|
||||
(
|
||||
set -x
|
||||
ci/testnet-sanity.sh edge-testnet-solana-com ec2 us-west-1a
|
||||
NO_LEDGER_VERIFY=1 \
|
||||
ci/testnet-sanity.sh edge-testnet-solana-com ec2 us-west-1a
|
||||
)
|
||||
;;
|
||||
testnet-edge-perf)
|
||||
@ -139,22 +148,21 @@ sanity() {
|
||||
testnet-beta)
|
||||
(
|
||||
set -x
|
||||
EC2_ZONES=(us-west-1a sa-east-1a ap-northeast-2a eu-central-1a ca-central-1a)
|
||||
ok=true
|
||||
for zone in "${EC2_ZONES[@]}"; do
|
||||
if ! $ok; then
|
||||
break
|
||||
fi
|
||||
ci/testnet-sanity.sh beta-testnet-solana-com ec2 "$zone" || ok=false
|
||||
done
|
||||
|
||||
GCE_ZONES=(us-west1-b asia-east2-a europe-west4-a southamerica-east1-b us-east4-c)
|
||||
for zone in "${GCE_ZONES[@]}"; do
|
||||
if ! $ok; then
|
||||
break
|
||||
ok=true
|
||||
if [[ -n $EC2_NODE_COUNT ]]; then
|
||||
NO_LEDGER_VERIFY=1 \
|
||||
ci/testnet-sanity.sh beta-testnet-solana-com ec2 "${EC2_ZONES[0]}" || ok=false
|
||||
fi
|
||||
|
||||
if $ok && [[ -n $GCE_NODE_COUNT ]]; then
|
||||
if [[ -n $EC2_NODE_COUNT ]]; then
|
||||
echo "TODO: Fix testnet-sanity.sh to work with a multinode testnet. It needs an '-x'-like argument"
|
||||
exit 1
|
||||
fi
|
||||
ci/testnet-sanity.sh beta-testnet-solana-com gce "$zone" || ok=false
|
||||
done
|
||||
NO_LEDGER_VERIFY=1 \
|
||||
ci/testnet-sanity.sh beta-testnet-solana-com gce "${GCE_ZONES[0]}" || ok=false
|
||||
fi
|
||||
$ok
|
||||
)
|
||||
;;
|
||||
@ -170,7 +178,8 @@ sanity() {
|
||||
testnet)
|
||||
(
|
||||
set -x
|
||||
ci/testnet-sanity.sh testnet-solana-com ec2 us-west-1a
|
||||
NO_LEDGER_VERIFY=1 \
|
||||
ci/testnet-sanity.sh testnet-solana-com ec2 us-west-1a
|
||||
#ci/testnet-sanity.sh testnet-solana-com gce us-east1-c
|
||||
)
|
||||
;;
|
||||
@ -227,8 +236,6 @@ start() {
|
||||
testnet-beta)
|
||||
(
|
||||
set -x
|
||||
EC2_ZONES=(us-west-1a sa-east-1a ap-northeast-2a eu-central-1a ca-central-1a)
|
||||
GCE_ZONES=(us-west1-b asia-east2-a europe-west4-a southamerica-east1-b us-east4-c)
|
||||
|
||||
# Build an array to pass as opts to testnet-deploy.sh: "-z zone1 -z zone2 ..."
|
||||
GCE_ZONE_ARGS=()
|
||||
@ -241,19 +248,23 @@ start() {
|
||||
EC2_ZONE_ARGS+=("-z $val")
|
||||
done
|
||||
|
||||
[[ -n $EC2_NODE_COUNT ]] || EC2_NODE_COUNT=60
|
||||
[[ -n $GCE_NODE_COUNT ]] || GCE_NODE_COUNT=40
|
||||
if [[ -n $EC2_NODE_COUNT ]]; then
|
||||
# shellcheck disable=SC2068
|
||||
ci/testnet-deploy.sh -p beta-testnet-solana-com -C ec2 ${EC2_ZONE_ARGS[@]} \
|
||||
-t "$CHANNEL_OR_TAG" -n "$EC2_NODE_COUNT" -c 0 -u -P -a eipalloc-0f286cf8a0771ce35 \
|
||||
${maybeReuseLedger:+-r} \
|
||||
${maybeDelete:+-D} \
|
||||
${GCE_NODE_COUNT:+-s}
|
||||
fi
|
||||
|
||||
# shellcheck disable=SC2068
|
||||
ci/testnet-deploy.sh -p beta-testnet-solana-com -C ec2 ${EC2_ZONE_ARGS[@]} \
|
||||
-t "$CHANNEL_OR_TAG" -n "$EC2_NODE_COUNT" -c 0 -s -u -P -a eipalloc-0f286cf8a0771ce35 \
|
||||
${maybeReuseLedger:+-r} \
|
||||
${maybeDelete:+-D}
|
||||
# shellcheck disable=SC2068
|
||||
ci/testnet-deploy.sh -p beta-testnet-solana-com -C gce ${GCE_ZONE_ARGS[@]} \
|
||||
-t "$CHANNEL_OR_TAG" -n "$GCE_NODE_COUNT" -c 0 -x -P \
|
||||
${maybeReuseLedger:+-r} \
|
||||
${maybeDelete:+-D}
|
||||
if [[ -n $GCE_NODE_COUNT ]]; then
|
||||
# shellcheck disable=SC2068
|
||||
ci/testnet-deploy.sh -p beta-testnet-solana-com -C gce ${GCE_ZONE_ARGS[@]} \
|
||||
-t "$CHANNEL_OR_TAG" -n "$GCE_NODE_COUNT" -c 0 -P \
|
||||
${maybeReuseLedger:+-r} \
|
||||
${maybeDelete:+-D} \
|
||||
${EC2_NODE_COUNT:+-x}
|
||||
fi
|
||||
)
|
||||
;;
|
||||
testnet-beta-perf)
|
||||
|
@ -11,13 +11,13 @@ usage() {
|
||||
echo "Error: $*"
|
||||
fi
|
||||
cat <<EOF
|
||||
usage: $0 [name] [cloud] [zone]
|
||||
usage: $0 [name] [cloud] [zone1] ... [zoneN]
|
||||
|
||||
Sanity check a CD testnet
|
||||
Sanity check a testnet
|
||||
|
||||
name - name of the network
|
||||
cloud - cloud provider to use (gce, ec2)
|
||||
zone - cloud provider zone of the network
|
||||
name - name of the network
|
||||
cloud - cloud provider to use (gce, ec2)
|
||||
zone1 .. zoneN - cloud provider zones to check
|
||||
|
||||
Note: the SOLANA_METRICS_CONFIG environment variable is used to configure
|
||||
metrics
|
||||
@ -27,10 +27,10 @@ EOF
|
||||
|
||||
netName=$1
|
||||
cloudProvider=$2
|
||||
zone=$3
|
||||
[[ -n $netName ]] || usage ""
|
||||
[[ -n $cloudProvider ]] || usage "Cloud provider not specified"
|
||||
[[ -n $zone ]] || usage "Zone not specified"
|
||||
shift 2
|
||||
[[ -n $1 ]] || usage "zone1 not specified"
|
||||
|
||||
shutdown() {
|
||||
exitcode=$?
|
||||
@ -52,17 +52,20 @@ rm -f net/config/config
|
||||
trap shutdown EXIT INT
|
||||
|
||||
set -x
|
||||
echo "--- $cloudProvider.sh config"
|
||||
timeout 5m net/"$cloudProvider".sh config -p "$netName" -z "$zone"
|
||||
net/init-metrics.sh -e
|
||||
echo "+++ $cloudProvider.sh info"
|
||||
net/"$cloudProvider".sh info
|
||||
echo --- net.sh sanity
|
||||
ok=true
|
||||
timeout 5m net/net.sh sanity \
|
||||
${NO_LEDGER_VERIFY:+-o noLedgerVerify} \
|
||||
${NO_VALIDATOR_SANITY:+-o noValidatorSanity} \
|
||||
${REJECT_EXTRA_NODES:+-o rejectExtraNodes} || ok=false
|
||||
for zone in "$@"; do
|
||||
echo "--- $cloudProvider config [$zone]"
|
||||
timeout 5m net/"$cloudProvider".sh config -p "$netName" -z "$zone"
|
||||
net/init-metrics.sh -e
|
||||
echo "+++ $cloudProvider.sh info"
|
||||
net/"$cloudProvider".sh info
|
||||
echo "--- net.sh sanity [$cloudProvider:$zone]"
|
||||
ok=true
|
||||
timeout 5m net/net.sh sanity \
|
||||
${NO_LEDGER_VERIFY:+-o noLedgerVerify} \
|
||||
${NO_VALIDATOR_SANITY:+-o noValidatorSanity} \
|
||||
${REJECT_EXTRA_NODES:+-o rejectExtraNodes} \
|
||||
$zone || ok=false
|
||||
|
||||
net/net.sh logs
|
||||
$ok
|
||||
net/net.sh logs
|
||||
$ok
|
||||
done
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-client"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
description = "Solana Client"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -17,10 +17,10 @@ reqwest = "0.9.11"
|
||||
serde = "1.0.89"
|
||||
serde_derive = "1.0.88"
|
||||
serde_json = "1.0.39"
|
||||
solana-netutil = { path = "../netutil", version = "0.13.0" }
|
||||
solana-sdk = { path = "../sdk", version = "0.13.0" }
|
||||
solana-netutil = { path = "../netutil", version = "0.13.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.13.3" }
|
||||
|
||||
[dev-dependencies]
|
||||
jsonrpc-core = "10.1.0"
|
||||
jsonrpc-http-server = "10.1.0"
|
||||
solana-logger = { path = "../logger", version = "0.13.0" }
|
||||
solana-logger = { path = "../logger", version = "0.13.3" }
|
||||
|
@ -1,7 +1,7 @@
|
||||
[package]
|
||||
name = "solana"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
documentation = "https://docs.rs/solana"
|
||||
homepage = "https://solana.com/"
|
||||
readme = "../README.md"
|
||||
@ -46,18 +46,18 @@ rocksdb = "0.11.0"
|
||||
serde = "1.0.89"
|
||||
serde_derive = "1.0.88"
|
||||
serde_json = "1.0.39"
|
||||
solana-budget-api = { path = "../programs/budget_api", version = "0.13.0" }
|
||||
solana-client = { path = "../client", version = "0.13.0" }
|
||||
solana-drone = { path = "../drone", version = "0.13.0" }
|
||||
solana-kvstore = { path = "../kvstore", version = "0.13.0", optional = true }
|
||||
solana-logger = { path = "../logger", version = "0.13.0" }
|
||||
solana-metrics = { path = "../metrics", version = "0.13.0" }
|
||||
solana-netutil = { path = "../netutil", version = "0.13.0" }
|
||||
solana-runtime = { path = "../runtime", version = "0.13.0" }
|
||||
solana-sdk = { path = "../sdk", version = "0.13.0" }
|
||||
solana-storage-api = { path = "../programs/storage_api", version = "0.13.0" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.13.0" }
|
||||
solana-vote-signer = { path = "../vote-signer", version = "0.13.0" }
|
||||
solana-budget-api = { path = "../programs/budget_api", version = "0.13.3" }
|
||||
solana-client = { path = "../client", version = "0.13.3" }
|
||||
solana-drone = { path = "../drone", version = "0.13.3" }
|
||||
solana-kvstore = { path = "../kvstore", version = "0.13.3", optional = true }
|
||||
solana-logger = { path = "../logger", version = "0.13.3" }
|
||||
solana-metrics = { path = "../metrics", version = "0.13.3" }
|
||||
solana-netutil = { path = "../netutil", version = "0.13.3" }
|
||||
solana-runtime = { path = "../runtime", version = "0.13.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.13.3" }
|
||||
solana-storage-api = { path = "../programs/storage_api", version = "0.13.3" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.13.3" }
|
||||
solana-vote-signer = { path = "../vote-signer", version = "0.13.3" }
|
||||
sys-info = "0.5.6"
|
||||
tokio = "0.1"
|
||||
tokio-codec = "0.1"
|
||||
@ -66,8 +66,8 @@ untrusted = "0.6.2"
|
||||
[dev-dependencies]
|
||||
hex-literal = "0.1.4"
|
||||
matches = "0.1.6"
|
||||
solana-vote-program = { path = "../programs/vote_program", version = "0.13.0" }
|
||||
solana-budget-program = { path = "../programs/budget_program", version = "0.13.0" }
|
||||
solana-vote-program = { path = "../programs/vote_program", version = "0.13.3" }
|
||||
solana-budget-program = { path = "../programs/budget_program", version = "0.13.3" }
|
||||
|
||||
[[bench]]
|
||||
name = "banking_stage"
|
||||
|
@ -296,8 +296,8 @@ impl Blocktree {
|
||||
|
||||
let slot_meta = &mut entry.0.borrow_mut();
|
||||
|
||||
// This slot is full, skip the bogus blob
|
||||
if slot_meta.is_full() {
|
||||
// Check if this blob should be inserted
|
||||
if !self.should_insert_blob(&slot_meta, &prev_inserted_blob_datas, blob) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -1036,12 +1036,6 @@ impl Blocktree {
|
||||
let blob_slot = blob_to_insert.slot();
|
||||
let blob_size = blob_to_insert.size();
|
||||
|
||||
if blob_index < slot_meta.consumed
|
||||
|| prev_inserted_blob_datas.contains_key(&(blob_slot, blob_index))
|
||||
{
|
||||
return Err(Error::BlocktreeError(BlocktreeError::BlobForIndexExists));
|
||||
}
|
||||
|
||||
let new_consumed = {
|
||||
if slot_meta.consumed == blob_index {
|
||||
let blob_datas = self.get_slot_consecutive_blobs(
|
||||
@ -1276,6 +1270,64 @@ impl Blocktree {
|
||||
self.db.write(batch)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn should_insert_blob(
|
||||
&self,
|
||||
slot: &SlotMeta,
|
||||
prev_inserted_blob_datas: &HashMap<(u64, u64), &[u8]>,
|
||||
blob: &Blob,
|
||||
) -> bool {
|
||||
let blob_index = blob.index();
|
||||
let blob_slot = blob.slot();
|
||||
|
||||
// Check that the blob doesn't already exist
|
||||
if blob_index < slot.consumed
|
||||
|| prev_inserted_blob_datas.contains_key(&(blob_slot, blob_index))
|
||||
|| self
|
||||
.get_data_blob_bytes(blob_slot, blob_index)
|
||||
.unwrap()
|
||||
.is_some()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check that we do not receive blobs >= than the last_index
|
||||
// for the slot
|
||||
let last_index = slot.last_index;
|
||||
if blob_index >= last_index {
|
||||
solana_metrics::submit(
|
||||
solana_metrics::influxdb::Point::new("blocktree_invalid_blob_error")
|
||||
.add_field(
|
||||
"error",
|
||||
solana_metrics::influxdb::Value::String(format!(
|
||||
"Received last blob with index {} >= slot.last_index {}",
|
||||
blob_index, last_index
|
||||
)),
|
||||
)
|
||||
.to_owned(),
|
||||
);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check that we do not receive a blob with "last_index" true, but index
|
||||
// less than our current received
|
||||
if blob.is_last_in_slot() && blob_index < slot.received {
|
||||
solana_metrics::submit(
|
||||
solana_metrics::influxdb::Point::new("blocktree_invalid_blob_error")
|
||||
.add_field(
|
||||
"error",
|
||||
solana_metrics::influxdb::Value::String(format!(
|
||||
"Received last blob with index {} < slot.received {}",
|
||||
blob_index, slot.received
|
||||
)),
|
||||
)
|
||||
.to_owned(),
|
||||
);
|
||||
return false;
|
||||
}
|
||||
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
// Creates a new ledger with slot 0 full of ticks (and only ticks).
|
||||
@ -2665,6 +2717,69 @@ pub mod tests {
|
||||
Blocktree::destroy(&blocktree_path).expect("Expected successful database destruction");
|
||||
}
|
||||
|
||||
#[test]
|
||||
pub fn test_should_insert_blob() {
|
||||
let (mut blobs, _) = make_slot_entries(0, 0, 20);
|
||||
let blocktree_path = get_tmp_ledger_path!();
|
||||
let blocktree = Blocktree::open(&blocktree_path).unwrap();
|
||||
|
||||
// Insert the first 5 blobs, we don't have a "is_last" blob yet
|
||||
blocktree.insert_data_blobs(&blobs[0..5]).unwrap();
|
||||
|
||||
// Trying to insert a blob less than consumed should fail
|
||||
let slot_meta = blocktree.meta(0).unwrap().unwrap();
|
||||
assert_eq!(slot_meta.consumed, 5);
|
||||
assert!(!blocktree.should_insert_blob(&slot_meta, &HashMap::new(), &blobs[4].clone()));
|
||||
|
||||
// Trying to insert the same blob again should fail
|
||||
blocktree.insert_data_blobs(&blobs[7..8]).unwrap();
|
||||
let slot_meta = blocktree.meta(0).unwrap().unwrap();
|
||||
assert!(!blocktree.should_insert_blob(&slot_meta, &HashMap::new(), &blobs[7].clone()));
|
||||
|
||||
// Trying to insert another "is_last" blob with index < the received index
|
||||
// should fail
|
||||
blocktree.insert_data_blobs(&blobs[8..9]).unwrap();
|
||||
let slot_meta = blocktree.meta(0).unwrap().unwrap();
|
||||
assert_eq!(slot_meta.received, 9);
|
||||
blobs[8].set_is_last_in_slot();
|
||||
assert!(!blocktree.should_insert_blob(&slot_meta, &HashMap::new(), &blobs[8].clone()));
|
||||
|
||||
// Insert the 10th blob, which is marked as "is_last"
|
||||
blobs[9].set_is_last_in_slot();
|
||||
blocktree.insert_data_blobs(&blobs[9..10]).unwrap();
|
||||
let slot_meta = blocktree.meta(0).unwrap().unwrap();
|
||||
|
||||
// Trying to insert a blob with index > the "is_last" blob should fail
|
||||
assert!(!blocktree.should_insert_blob(&slot_meta, &HashMap::new(), &blobs[10].clone()));
|
||||
|
||||
drop(blocktree);
|
||||
Blocktree::destroy(&blocktree_path).expect("Expected successful database destruction");
|
||||
}
|
||||
|
||||
#[test]
|
||||
pub fn test_insert_multiple_is_last() {
|
||||
let (mut blobs, _) = make_slot_entries(0, 0, 20);
|
||||
let blocktree_path = get_tmp_ledger_path!();
|
||||
let blocktree = Blocktree::open(&blocktree_path).unwrap();
|
||||
|
||||
// Inserting multiple blobs with the is_last flag set should only insert
|
||||
// the first blob with the "is_last" flag, and drop the rest
|
||||
for i in 6..20 {
|
||||
blobs[i].set_is_last_in_slot();
|
||||
}
|
||||
|
||||
blocktree.insert_data_blobs(&blobs[..]).unwrap();
|
||||
let slot_meta = blocktree.meta(0).unwrap().unwrap();
|
||||
|
||||
assert_eq!(slot_meta.consumed, 7);
|
||||
assert_eq!(slot_meta.received, 7);
|
||||
assert_eq!(slot_meta.last_index, 6);
|
||||
assert!(slot_meta.is_full());
|
||||
|
||||
drop(blocktree);
|
||||
Blocktree::destroy(&blocktree_path).expect("Expected successful database destruction");
|
||||
}
|
||||
|
||||
#[cfg(feature = "erasure")]
|
||||
mod erasure {
|
||||
use super::*;
|
||||
|
@ -5,7 +5,7 @@ use crate::cluster_info::{ClusterInfo, ClusterInfoError, DATA_PLANE_FANOUT};
|
||||
use crate::entry::{EntrySender, EntrySlice};
|
||||
#[cfg(feature = "erasure")]
|
||||
use crate::erasure::CodingGenerator;
|
||||
use crate::packet::index_blobs;
|
||||
use crate::packet::index_blobs_with_genesis;
|
||||
use crate::poh_recorder::WorkingBankEntries;
|
||||
use crate::result::{Error, Result};
|
||||
use crate::service::Service;
|
||||
@ -13,6 +13,7 @@ use crate::staking_utils;
|
||||
use rayon::prelude::*;
|
||||
use solana_metrics::counter::Counter;
|
||||
use solana_metrics::{influxdb, submit};
|
||||
use solana_sdk::hash::Hash;
|
||||
use solana_sdk::pubkey::Pubkey;
|
||||
use solana_sdk::timing::duration_as_ms;
|
||||
use std::net::UdpSocket;
|
||||
@ -42,6 +43,7 @@ impl Broadcast {
|
||||
sock: &UdpSocket,
|
||||
blocktree: &Arc<Blocktree>,
|
||||
storage_entry_sender: &EntrySender,
|
||||
genesis_blockhash: &Hash,
|
||||
) -> Result<()> {
|
||||
let timer = Duration::new(1, 0);
|
||||
let (mut bank, entries) = receiver.recv_timeout(timer)?;
|
||||
@ -103,9 +105,10 @@ impl Broadcast {
|
||||
.map(|meta| meta.consumed)
|
||||
.unwrap_or(0);
|
||||
|
||||
index_blobs(
|
||||
index_blobs_with_genesis(
|
||||
&blobs,
|
||||
&self.id,
|
||||
genesis_blockhash,
|
||||
blob_index,
|
||||
bank.slot(),
|
||||
bank.parent().map_or(0, |parent| parent.slot()),
|
||||
@ -192,6 +195,7 @@ impl BroadcastStage {
|
||||
receiver: &Receiver<WorkingBankEntries>,
|
||||
blocktree: &Arc<Blocktree>,
|
||||
storage_entry_sender: EntrySender,
|
||||
genesis_blockhash: &Hash,
|
||||
) -> BroadcastStageReturnType {
|
||||
let me = cluster_info.read().unwrap().my_data().clone();
|
||||
|
||||
@ -208,6 +212,7 @@ impl BroadcastStage {
|
||||
sock,
|
||||
blocktree,
|
||||
&storage_entry_sender,
|
||||
genesis_blockhash,
|
||||
) {
|
||||
match e {
|
||||
Error::RecvTimeoutError(RecvTimeoutError::Disconnected) | Error::SendError => {
|
||||
@ -247,9 +252,11 @@ impl BroadcastStage {
|
||||
exit_sender: &Arc<AtomicBool>,
|
||||
blocktree: &Arc<Blocktree>,
|
||||
storage_entry_sender: EntrySender,
|
||||
genesis_blockhash: &Hash,
|
||||
) -> Self {
|
||||
let blocktree = blocktree.clone();
|
||||
let exit_sender = exit_sender.clone();
|
||||
let genesis_blockhash = *genesis_blockhash;
|
||||
let thread_hdl = Builder::new()
|
||||
.name("solana-broadcaster".to_string())
|
||||
.spawn(move || {
|
||||
@ -260,6 +267,7 @@ impl BroadcastStage {
|
||||
&receiver,
|
||||
&blocktree,
|
||||
storage_entry_sender,
|
||||
&genesis_blockhash,
|
||||
)
|
||||
})
|
||||
.unwrap();
|
||||
@ -331,6 +339,7 @@ mod test {
|
||||
&exit_sender,
|
||||
&blocktree,
|
||||
storage_sender,
|
||||
&Hash::default(),
|
||||
);
|
||||
|
||||
MockBroadcastStage {
|
||||
|
@ -164,7 +164,7 @@ mod tests {
|
||||
use bs58;
|
||||
// golden needs to be updated if blob stuff changes....
|
||||
let golden = Hash::new(
|
||||
&bs58::decode("5NBn4cBZmNZRftkjxj3um8W1eyYPzn2RgUJSA3SVbHaJ")
|
||||
&bs58::decode("F5zEvoozmV87cgS1sfG226nYSJoupRjKA93QUQiWd31E")
|
||||
.into_vec()
|
||||
.unwrap(),
|
||||
);
|
||||
|
@ -338,6 +338,17 @@ impl ClusterInfo {
|
||||
.collect()
|
||||
}
|
||||
|
||||
// All nodes in gossip, including spy nodes
|
||||
pub(crate) fn all_peers(&self) -> Vec<ContactInfo> {
|
||||
self.gossip
|
||||
.crds
|
||||
.table
|
||||
.values()
|
||||
.filter_map(|x| x.value.contact_info())
|
||||
.cloned()
|
||||
.collect()
|
||||
}
|
||||
|
||||
pub fn gossip_peers(&self) -> Vec<ContactInfo> {
|
||||
let me = self.my_data().id;
|
||||
self.gossip
|
||||
@ -853,8 +864,6 @@ impl ClusterInfo {
|
||||
.collect();
|
||||
if pr.is_empty() {
|
||||
self.add_entrypoint(&mut pr);
|
||||
} else {
|
||||
self.entrypoint = None;
|
||||
}
|
||||
pr.into_iter()
|
||||
.map(|(peer, filter, gossip, self_info)| {
|
||||
@ -1071,21 +1080,16 @@ impl ClusterInfo {
|
||||
.process_pull_request(caller, filter, now);
|
||||
let len = data.len();
|
||||
trace!("get updates since response {}", len);
|
||||
if data.is_empty() {
|
||||
trace!("no updates me {}", self_id);
|
||||
vec![]
|
||||
} else {
|
||||
let rsp = Protocol::PullResponse(self_id, data);
|
||||
// the remote side may not know his public IP:PORT, record what he looks like to us
|
||||
// this may or may not be correct for everybody but it's better than leaving him with
|
||||
// an unspecified address in our table
|
||||
if from.gossip.ip().is_unspecified() {
|
||||
inc_new_counter_info!("cluster_info-window-request-updates-unspec-gossip", 1);
|
||||
from.gossip = *from_addr;
|
||||
}
|
||||
inc_new_counter_info!("cluster_info-pull_request-rsp", len);
|
||||
to_shared_blob(rsp, from.gossip).ok().into_iter().collect()
|
||||
let rsp = Protocol::PullResponse(self_id, data);
|
||||
// The remote node may not know its public IP:PORT. Record what it looks like to us.
|
||||
// This may or may not be correct for everybody, but it's better than leaving the remote with
|
||||
// an unspecified address in our table
|
||||
if from.gossip.ip().is_unspecified() {
|
||||
inc_new_counter_info!("cluster_info-window-request-updates-unspec-gossip", 1);
|
||||
from.gossip = *from_addr;
|
||||
}
|
||||
inc_new_counter_info!("cluster_info-pull_request-rsp", len);
|
||||
to_shared_blob(rsp, from.gossip).ok().into_iter().collect()
|
||||
}
|
||||
fn handle_pull_response(me: &Arc<RwLock<Self>>, from: &Pubkey, data: Vec<CrdsValue>) {
|
||||
let len = data.len();
|
||||
@ -2200,5 +2204,5 @@ fn test_add_entrypoint() {
|
||||
.unwrap()
|
||||
.new_pull_requests(&HashMap::new());
|
||||
assert_eq!(1, pulls.len());
|
||||
assert_eq!(cluster_info.read().unwrap().entrypoint, None);
|
||||
assert_eq!(cluster_info.read().unwrap().entrypoint, Some(entrypoint));
|
||||
}
|
||||
|
@ -100,6 +100,7 @@ impl Fullnode {
|
||||
let exit = Arc::new(AtomicBool::new(false));
|
||||
let bank_info = &bank_forks_info[0];
|
||||
let bank = bank_forks[bank_info.bank_slot].clone();
|
||||
let genesis_blockhash = bank.last_blockhash();
|
||||
|
||||
info!(
|
||||
"starting PoH... {} {}",
|
||||
@ -232,6 +233,7 @@ impl Fullnode {
|
||||
sender.clone(),
|
||||
receiver,
|
||||
&exit,
|
||||
&genesis_blockhash,
|
||||
);
|
||||
let tpu = Tpu::new(
|
||||
&id,
|
||||
@ -245,6 +247,7 @@ impl Fullnode {
|
||||
&blocktree,
|
||||
sender,
|
||||
&exit,
|
||||
&genesis_blockhash,
|
||||
);
|
||||
|
||||
inc_new_counter_info!("fullnode-new", 1);
|
||||
|
@ -5,6 +5,7 @@ use bincode;
|
||||
use byteorder::{ByteOrder, LittleEndian};
|
||||
use serde::Serialize;
|
||||
use solana_metrics::counter::Counter;
|
||||
use solana_sdk::hash::Hash;
|
||||
pub use solana_sdk::packet::PACKET_DATA_SIZE;
|
||||
use solana_sdk::pubkey::Pubkey;
|
||||
use std::borrow::Borrow;
|
||||
@ -363,7 +364,8 @@ const SLOT_RANGE: std::ops::Range<usize> = range!(PARENT_RANGE.end, u64);
|
||||
const INDEX_RANGE: std::ops::Range<usize> = range!(SLOT_RANGE.end, u64);
|
||||
const ID_RANGE: std::ops::Range<usize> = range!(INDEX_RANGE.end, Pubkey);
|
||||
const FORWARD_RANGE: std::ops::Range<usize> = range!(ID_RANGE.end, bool);
|
||||
const FLAGS_RANGE: std::ops::Range<usize> = range!(FORWARD_RANGE.end, u32);
|
||||
const GENESIS_RANGE: std::ops::Range<usize> = range!(FORWARD_RANGE.end, Hash);
|
||||
const FLAGS_RANGE: std::ops::Range<usize> = range!(GENESIS_RANGE.end, u32);
|
||||
const SIZE_RANGE: std::ops::Range<usize> = range!(FLAGS_RANGE.end, u64);
|
||||
|
||||
macro_rules! align {
|
||||
@ -439,6 +441,14 @@ impl Blob {
|
||||
self.data[FORWARD_RANGE][0] = u8::from(forward)
|
||||
}
|
||||
|
||||
pub fn set_genesis_blockhash(&mut self, blockhash: &Hash) {
|
||||
self.data[GENESIS_RANGE].copy_from_slice(blockhash.as_ref())
|
||||
}
|
||||
|
||||
pub fn genesis_blockhash(&self) -> Hash {
|
||||
Hash::new(&self.data[GENESIS_RANGE])
|
||||
}
|
||||
|
||||
pub fn flags(&self) -> u32 {
|
||||
LittleEndian::read_u32(&self.data[FLAGS_RANGE])
|
||||
}
|
||||
@ -577,12 +587,24 @@ impl Blob {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn index_blobs(blobs: &[SharedBlob], id: &Pubkey, mut blob_index: u64, slot: u64, parent: u64) {
|
||||
pub fn index_blobs(blobs: &[SharedBlob], id: &Pubkey, blob_index: u64, slot: u64, parent: u64) {
|
||||
index_blobs_with_genesis(blobs, id, &Hash::default(), blob_index, slot, parent)
|
||||
}
|
||||
|
||||
pub fn index_blobs_with_genesis(
|
||||
blobs: &[SharedBlob],
|
||||
id: &Pubkey,
|
||||
genesis: &Hash,
|
||||
mut blob_index: u64,
|
||||
slot: u64,
|
||||
parent: u64,
|
||||
) {
|
||||
// enumerate all the blobs, those are the indices
|
||||
for blob in blobs.iter() {
|
||||
let mut blob = blob.write().unwrap();
|
||||
|
||||
blob.set_index(blob_index);
|
||||
blob.set_genesis_blockhash(genesis);
|
||||
blob.set_slot(slot);
|
||||
blob.set_parent(parent);
|
||||
blob.set_id(id);
|
||||
@ -835,4 +857,14 @@ mod tests {
|
||||
assert!(p1 != p2);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_blob_genesis_blockhash() {
|
||||
let mut blob = Blob::default();
|
||||
assert_eq!(blob.genesis_blockhash(), Hash::default());
|
||||
|
||||
let hash = Hash::new(&Pubkey::new_rand().as_ref());
|
||||
blob.set_genesis_blockhash(&hash);
|
||||
assert_eq!(blob.genesis_blockhash(), hash);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -20,7 +20,6 @@ use solana_client::rpc_client::RpcClient;
|
||||
use solana_client::rpc_request::RpcRequest;
|
||||
use solana_client::thin_client::{create_client, ThinClient};
|
||||
use solana_sdk::client::{AsyncClient, SyncClient};
|
||||
|
||||
use solana_sdk::hash::{Hash, Hasher};
|
||||
use solana_sdk::signature::{Keypair, KeypairUtil, Signature};
|
||||
use solana_sdk::system_transaction;
|
||||
@ -239,6 +238,7 @@ impl Replicator {
|
||||
let (retransmit_sender, retransmit_receiver) = channel();
|
||||
|
||||
let window_service = WindowService::new(
|
||||
None, //TODO: need a way to validate blobs... https://github.com/solana-labs/solana/issues/3924
|
||||
blocktree.clone(),
|
||||
cluster_info.clone(),
|
||||
blob_fetch_receiver,
|
||||
@ -246,6 +246,7 @@ impl Replicator {
|
||||
repair_socket,
|
||||
&exit,
|
||||
Some(repair_slot_range),
|
||||
&Hash::default(),
|
||||
);
|
||||
|
||||
let client = create_client(cluster_entrypoint.client_facing_addr(), FULLNODE_PORT_RANGE);
|
||||
|
@ -14,6 +14,7 @@ use crate::streamer::BlobReceiver;
|
||||
use crate::window_service::WindowService;
|
||||
use solana_metrics::counter::Counter;
|
||||
use solana_metrics::{influxdb, submit};
|
||||
use solana_sdk::hash::Hash;
|
||||
use std::net::UdpSocket;
|
||||
use std::sync::atomic::AtomicBool;
|
||||
use std::sync::mpsc::channel;
|
||||
@ -79,6 +80,7 @@ fn retransmitter(
|
||||
cluster_info: Arc<RwLock<ClusterInfo>>,
|
||||
r: BlobReceiver,
|
||||
) -> JoinHandle<()> {
|
||||
let bank_forks = bank_forks.clone();
|
||||
Builder::new()
|
||||
.name("solana-retransmitter".to_string())
|
||||
.spawn(move || {
|
||||
@ -107,13 +109,14 @@ pub struct RetransmitStage {
|
||||
impl RetransmitStage {
|
||||
#[allow(clippy::new_ret_no_self)]
|
||||
pub fn new(
|
||||
bank_forks: &Arc<RwLock<BankForks>>,
|
||||
bank_forks: Arc<RwLock<BankForks>>,
|
||||
blocktree: Arc<Blocktree>,
|
||||
cluster_info: &Arc<RwLock<ClusterInfo>>,
|
||||
retransmit_socket: Arc<UdpSocket>,
|
||||
repair_socket: Arc<UdpSocket>,
|
||||
fetch_stage_receiver: BlobReceiver,
|
||||
exit: &Arc<AtomicBool>,
|
||||
genesis_blockhash: &Hash,
|
||||
) -> Self {
|
||||
let (retransmit_sender, retransmit_receiver) = channel();
|
||||
|
||||
@ -124,6 +127,7 @@ impl RetransmitStage {
|
||||
retransmit_receiver,
|
||||
);
|
||||
let window_service = WindowService::new(
|
||||
Some(bank_forks),
|
||||
blocktree,
|
||||
cluster_info.clone(),
|
||||
fetch_stage_receiver,
|
||||
@ -131,6 +135,7 @@ impl RetransmitStage {
|
||||
repair_socket,
|
||||
exit,
|
||||
None,
|
||||
genesis_blockhash,
|
||||
);
|
||||
|
||||
let thread_hdls = vec![t_retransmit];
|
||||
|
111
core/src/rpc.rs
111
core/src/rpc.rs
@ -2,6 +2,7 @@
|
||||
|
||||
use crate::bank_forks::BankForks;
|
||||
use crate::cluster_info::ClusterInfo;
|
||||
use crate::contact_info::ContactInfo;
|
||||
use crate::packet::PACKET_DATA_SIZE;
|
||||
use crate::storage_stage::StorageState;
|
||||
use bincode::{deserialize, serialize};
|
||||
@ -171,6 +172,18 @@ pub struct Meta {
|
||||
}
|
||||
impl Metadata for Meta {}
|
||||
|
||||
#[derive(Serialize, Deserialize, Clone, Debug)]
|
||||
pub struct RpcContactInfo {
|
||||
/// Base58 id
|
||||
pub id: String,
|
||||
/// Gossip port
|
||||
pub gossip: Option<SocketAddr>,
|
||||
/// Tpu port
|
||||
pub tpu: Option<SocketAddr>,
|
||||
/// JSON RPC port
|
||||
pub rpc: Option<SocketAddr>,
|
||||
}
|
||||
|
||||
#[rpc(server)]
|
||||
pub trait RpcSol {
|
||||
type Metadata;
|
||||
@ -184,6 +197,9 @@ pub trait RpcSol {
|
||||
#[rpc(meta, name = "getBalance")]
|
||||
fn get_balance(&self, _: Self::Metadata, _: String) -> Result<u64>;
|
||||
|
||||
#[rpc(meta, name = "getClusterNodes")]
|
||||
fn get_cluster_nodes(&self, _: Self::Metadata) -> Result<Vec<RpcContactInfo>>;
|
||||
|
||||
#[rpc(meta, name = "getRecentBlockhash")]
|
||||
fn get_recent_blockhash(&self, _: Self::Metadata) -> Result<String>;
|
||||
|
||||
@ -203,6 +219,9 @@ pub trait RpcSol {
|
||||
#[rpc(meta, name = "sendTransaction")]
|
||||
fn send_transaction(&self, _: Self::Metadata, _: Vec<u8>) -> Result<String>;
|
||||
|
||||
#[rpc(meta, name = "getSlotLeader")]
|
||||
fn get_slot_leader(&self, _: Self::Metadata) -> Result<String>;
|
||||
|
||||
#[rpc(meta, name = "getStorageBlockhash")]
|
||||
fn get_storage_blockhash(&self, _: Self::Metadata) -> Result<String>;
|
||||
|
||||
@ -263,6 +282,33 @@ impl RpcSol for RpcSolImpl {
|
||||
Ok(meta.request_processor.read().unwrap().get_balance(&pubkey))
|
||||
}
|
||||
|
||||
fn get_cluster_nodes(&self, meta: Self::Metadata) -> Result<Vec<RpcContactInfo>> {
|
||||
let cluster_info = meta.cluster_info.read().unwrap();
|
||||
fn valid_address_or_none(addr: &SocketAddr) -> Option<SocketAddr> {
|
||||
if ContactInfo::is_valid_address(addr) {
|
||||
Some(*addr)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
Ok(cluster_info
|
||||
.all_peers()
|
||||
.iter()
|
||||
.filter_map(|contact_info| {
|
||||
if ContactInfo::is_valid_address(&contact_info.gossip) {
|
||||
Some(RpcContactInfo {
|
||||
id: contact_info.id.to_string(),
|
||||
gossip: Some(contact_info.gossip),
|
||||
tpu: valid_address_or_none(&contact_info.tpu),
|
||||
rpc: valid_address_or_none(&contact_info.rpc),
|
||||
})
|
||||
} else {
|
||||
None // Exclude spy nodes
|
||||
}
|
||||
})
|
||||
.collect())
|
||||
}
|
||||
|
||||
fn get_recent_blockhash(&self, meta: Self::Metadata) -> Result<String> {
|
||||
debug!("get_recent_blockhash rpc request received");
|
||||
Ok(meta
|
||||
@ -402,6 +448,15 @@ impl RpcSol for RpcSolImpl {
|
||||
Ok(signature)
|
||||
}
|
||||
|
||||
fn get_slot_leader(&self, meta: Self::Metadata) -> Result<String> {
|
||||
let cluster_info = meta.cluster_info.read().unwrap();
|
||||
let leader_data_option = cluster_info.leader_data();
|
||||
Ok(leader_data_option
|
||||
.and_then(|leader_data| Some(leader_data.id))
|
||||
.unwrap_or_default()
|
||||
.to_string())
|
||||
}
|
||||
|
||||
fn get_storage_blockhash(&self, meta: Self::Metadata) -> Result<String> {
|
||||
meta.request_processor
|
||||
.read()
|
||||
@ -445,7 +500,9 @@ mod tests {
|
||||
use solana_sdk::transaction::TransactionError;
|
||||
use std::thread;
|
||||
|
||||
fn start_rpc_handler_with_tx(pubkey: &Pubkey) -> (MetaIoHandler<Meta>, Meta, Hash, Keypair) {
|
||||
fn start_rpc_handler_with_tx(
|
||||
pubkey: &Pubkey,
|
||||
) -> (MetaIoHandler<Meta>, Meta, Hash, Keypair, Pubkey) {
|
||||
let (bank_forks, alice) = new_bank_forks();
|
||||
let bank = bank_forks.read().unwrap().working_bank();
|
||||
let exit = Arc::new(AtomicBool::new(false));
|
||||
@ -477,7 +534,7 @@ mod tests {
|
||||
request_processor,
|
||||
cluster_info,
|
||||
};
|
||||
(io, meta, blockhash, alice)
|
||||
(io, meta, blockhash, alice, leader.id)
|
||||
}
|
||||
|
||||
#[test]
|
||||
@ -505,7 +562,7 @@ mod tests {
|
||||
#[test]
|
||||
fn test_rpc_get_balance() {
|
||||
let bob_pubkey = Pubkey::new_rand();
|
||||
let (io, meta, _blockhash, _alice) = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
let (io, meta, _blockhash, _alice, _leader_id) = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
|
||||
let req = format!(
|
||||
r#"{{"jsonrpc":"2.0","id":1,"method":"getBalance","params":["{}"]}}"#,
|
||||
@ -520,10 +577,46 @@ mod tests {
|
||||
assert_eq!(expected, result);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_rpc_get_cluster_nodes() {
|
||||
let bob_pubkey = Pubkey::new_rand();
|
||||
let (io, meta, _blockhash, _alice, leader_id) = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
|
||||
let req = format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getClusterNodes"}}"#);
|
||||
let res = io.handle_request_sync(&req, meta);
|
||||
let result: Response = serde_json::from_str(&res.expect("actual response"))
|
||||
.expect("actual response deserialization");
|
||||
|
||||
let expected = format!(
|
||||
r#"{{"jsonrpc":"2.0","result":[{{"id": "{}", "gossip": "127.0.0.1:1235", "tpu": "127.0.0.1:1234", "rpc": "127.0.0.1:8899"}}],"id":1}}"#,
|
||||
leader_id,
|
||||
);
|
||||
|
||||
let expected: Response =
|
||||
serde_json::from_str(&expected).expect("expected response deserialization");
|
||||
assert_eq!(expected, result);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_rpc_get_slot_leader() {
|
||||
let bob_pubkey = Pubkey::new_rand();
|
||||
let (io, meta, _blockhash, _alice, _leader_id) = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
|
||||
let req = format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getSlotLeader"}}"#);
|
||||
let res = io.handle_request_sync(&req, meta);
|
||||
let expected =
|
||||
format!(r#"{{"jsonrpc":"2.0","result":"11111111111111111111111111111111","id":1}}"#);
|
||||
let expected: Response =
|
||||
serde_json::from_str(&expected).expect("expected response deserialization");
|
||||
let result: Response = serde_json::from_str(&res.expect("actual response"))
|
||||
.expect("actual response deserialization");
|
||||
assert_eq!(expected, result);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_rpc_get_tx_count() {
|
||||
let bob_pubkey = Pubkey::new_rand();
|
||||
let (io, meta, _blockhash, _alice) = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
let (io, meta, _blockhash, _alice, _leader_id) = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
|
||||
let req = format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getTransactionCount"}}"#);
|
||||
let res = io.handle_request_sync(&req, meta);
|
||||
@ -538,7 +631,7 @@ mod tests {
|
||||
#[test]
|
||||
fn test_rpc_get_account_info() {
|
||||
let bob_pubkey = Pubkey::new_rand();
|
||||
let (io, meta, _blockhash, _alice) = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
let (io, meta, _blockhash, _alice, _leader_id) = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
|
||||
let req = format!(
|
||||
r#"{{"jsonrpc":"2.0","id":1,"method":"getAccountInfo","params":["{}"]}}"#,
|
||||
@ -565,7 +658,7 @@ mod tests {
|
||||
#[test]
|
||||
fn test_rpc_confirm_tx() {
|
||||
let bob_pubkey = Pubkey::new_rand();
|
||||
let (io, meta, blockhash, alice) = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
let (io, meta, blockhash, alice, _leader_id) = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
let tx = system_transaction::transfer(&alice, &bob_pubkey, 20, blockhash, 0);
|
||||
|
||||
let req = format!(
|
||||
@ -584,7 +677,7 @@ mod tests {
|
||||
#[test]
|
||||
fn test_rpc_get_signature_status() {
|
||||
let bob_pubkey = Pubkey::new_rand();
|
||||
let (io, meta, blockhash, alice) = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
let (io, meta, blockhash, alice, _leader_id) = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
let tx = system_transaction::transfer(&alice, &bob_pubkey, 20, blockhash, 0);
|
||||
|
||||
let req = format!(
|
||||
@ -648,7 +741,7 @@ mod tests {
|
||||
#[test]
|
||||
fn test_rpc_get_recent_blockhash() {
|
||||
let bob_pubkey = Pubkey::new_rand();
|
||||
let (io, meta, blockhash, _alice) = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
let (io, meta, blockhash, _alice, _leader_id) = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
|
||||
let req = format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getRecentBlockhash"}}"#);
|
||||
let res = io.handle_request_sync(&req, meta);
|
||||
@ -663,7 +756,7 @@ mod tests {
|
||||
#[test]
|
||||
fn test_rpc_fail_request_airdrop() {
|
||||
let bob_pubkey = Pubkey::new_rand();
|
||||
let (io, meta, _blockhash, _alice) = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
let (io, meta, _blockhash, _alice, _leader_id) = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
|
||||
// Expect internal error because no drone is available
|
||||
let req = format!(
|
||||
|
@ -229,7 +229,7 @@ mod tests {
|
||||
subscriptions.check_account(&alice.pubkey(), &account);
|
||||
let string = transport_receiver.poll();
|
||||
if let Async::Ready(Some(response)) = string.unwrap() {
|
||||
let expected = format!(r#"{{"jsonrpc":"2.0","method":"accountNotification","params":{{"result":{{"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"executable":false,"lamports":1,"owner":[129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},"subscription":0}}}}"#);
|
||||
let expected = format!(r#"{{"jsonrpc":"2.0","method":"accountNotification","params":{{"result":{{"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"executable":false,"lamports":1,"owner":[2,203,81,223,225,24,34,35,203,214,138,130,144,208,35,77,63,16,87,51,47,198,115,123,98,188,19,160,0,0,0,0]}},"subscription":0}}}}"#);
|
||||
assert_eq!(expected, response);
|
||||
}
|
||||
|
||||
@ -275,7 +275,7 @@ mod tests {
|
||||
subscriptions.check_program(&solana_budget_api::id(), &alice.pubkey(), &account);
|
||||
let string = transport_receiver.poll();
|
||||
if let Async::Ready(Some(response)) = string.unwrap() {
|
||||
let expected = format!(r#"{{"jsonrpc":"2.0","method":"programNotification","params":{{"result":["{:?}",{{"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"executable":false,"lamports":1,"owner":[129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}}],"subscription":0}}}}"#, alice.pubkey());
|
||||
let expected = format!(r#"{{"jsonrpc":"2.0","method":"programNotification","params":{{"result":["{:?}",{{"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"executable":false,"lamports":1,"owner":[2,203,81,223,225,24,34,35,203,214,138,130,144,208,35,77,63,16,87,51,47,198,115,123,98,188,19,160,0,0,0,0]}}],"subscription":0}}}}"#, alice.pubkey());
|
||||
assert_eq!(expected, response);
|
||||
}
|
||||
|
||||
|
@ -42,7 +42,7 @@ pub fn vote_account_balances_at_epoch(
|
||||
node_staked_accounts.map(|epoch_state| epoch_state.map(|(id, stake, _)| (*id, stake)).collect())
|
||||
}
|
||||
|
||||
/// At the specified epoch, collect the delgate account balance and vote states for delegates
|
||||
/// At the specified epoch, collect the delegate account balance and vote states for delegates
|
||||
/// that have non-zero balance in any of their managed staking accounts
|
||||
pub fn delegated_stakes_at_epoch(bank: &Bank, epoch_height: u64) -> Option<HashMap<Pubkey, u64>> {
|
||||
let node_staked_accounts = node_staked_accounts_at_epoch(bank, epoch_height);
|
||||
|
@ -11,6 +11,7 @@ use crate::fetch_stage::FetchStage;
|
||||
use crate::poh_recorder::{PohRecorder, WorkingBankEntries};
|
||||
use crate::service::Service;
|
||||
use crate::sigverify_stage::SigVerifyStage;
|
||||
use solana_sdk::hash::Hash;
|
||||
use solana_sdk::pubkey::Pubkey;
|
||||
use std::net::UdpSocket;
|
||||
use std::sync::atomic::AtomicBool;
|
||||
@ -40,6 +41,7 @@ impl Tpu {
|
||||
blocktree: &Arc<Blocktree>,
|
||||
storage_entry_sender: EntrySender,
|
||||
exit: &Arc<AtomicBool>,
|
||||
genesis_blockhash: &Hash,
|
||||
) -> Self {
|
||||
cluster_info.write().unwrap().set_leader(id);
|
||||
|
||||
@ -72,6 +74,7 @@ impl Tpu {
|
||||
&exit,
|
||||
blocktree,
|
||||
storage_entry_sender,
|
||||
genesis_blockhash,
|
||||
);
|
||||
|
||||
Self {
|
||||
|
@ -25,6 +25,7 @@ use crate::retransmit_stage::RetransmitStage;
|
||||
use crate::rpc_subscriptions::RpcSubscriptions;
|
||||
use crate::service::Service;
|
||||
use crate::storage_stage::{StorageStage, StorageState};
|
||||
use solana_sdk::hash::Hash;
|
||||
use solana_sdk::pubkey::Pubkey;
|
||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||
use std::net::UdpSocket;
|
||||
@ -72,6 +73,7 @@ impl Tvu {
|
||||
storage_entry_sender: EntrySender,
|
||||
storage_entry_receiver: EntryReceiver,
|
||||
exit: &Arc<AtomicBool>,
|
||||
genesis_blockhash: &Hash,
|
||||
) -> Self
|
||||
where
|
||||
T: 'static + KeypairUtil + Sync + Send,
|
||||
@ -100,13 +102,14 @@ impl Tvu {
|
||||
//the packets coming out of blob_receiver need to be sent to the GPU and verified
|
||||
//then sent to the window, which does the erasure coding reconstruction
|
||||
let retransmit_stage = RetransmitStage::new(
|
||||
&bank_forks,
|
||||
bank_forks.clone(),
|
||||
blocktree.clone(),
|
||||
&cluster_info,
|
||||
Arc::new(retransmit_socket),
|
||||
repair_socket,
|
||||
blob_fetch_receiver,
|
||||
&exit,
|
||||
genesis_blockhash,
|
||||
);
|
||||
|
||||
let (replay_stage, slot_full_receiver) = ReplayStage::new(
|
||||
@ -237,6 +240,7 @@ pub mod tests {
|
||||
storage_entry_sender,
|
||||
storage_entry_receiver,
|
||||
&exit,
|
||||
&Hash::default(),
|
||||
);
|
||||
exit.store(true, Ordering::Relaxed);
|
||||
tvu.join().unwrap();
|
||||
|
@ -1,15 +1,18 @@
|
||||
//! `window_service` handles the data plane incoming blobs, storing them in
|
||||
//! blocktree and retransmitting where required
|
||||
//!
|
||||
use crate::bank_forks::BankForks;
|
||||
use crate::blocktree::Blocktree;
|
||||
use crate::cluster_info::ClusterInfo;
|
||||
use crate::packet::{SharedBlob, BLOB_HEADER_SIZE};
|
||||
use crate::leader_schedule_utils::slot_leader_at;
|
||||
use crate::packet::{Blob, SharedBlob, BLOB_HEADER_SIZE};
|
||||
use crate::repair_service::{RepairService, RepairSlotRange};
|
||||
use crate::result::{Error, Result};
|
||||
use crate::service::Service;
|
||||
use crate::streamer::{BlobReceiver, BlobSender};
|
||||
use solana_metrics::counter::Counter;
|
||||
use solana_metrics::{influxdb, submit};
|
||||
use solana_runtime::bank::Bank;
|
||||
use solana_sdk::hash::Hash;
|
||||
use solana_sdk::pubkey::Pubkey;
|
||||
use solana_sdk::timing::duration_as_ms;
|
||||
use std::net::UdpSocket;
|
||||
@ -64,33 +67,57 @@ fn process_blobs(blobs: &[SharedBlob], blocktree: &Arc<Blocktree>) -> Result<()>
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// drop blobs that are from myself or not from the correct leader for the
|
||||
/// blob's slot
|
||||
fn should_retransmit_and_persist(blob: &Blob, bank: Option<&Arc<Bank>>, my_id: &Pubkey) -> bool {
|
||||
let slot_leader_id = bank.and_then(|bank| slot_leader_at(blob.slot(), &bank));
|
||||
|
||||
if blob.id() == *my_id {
|
||||
inc_new_counter_info!("streamer-recv_window-circular_transmission", 1);
|
||||
false
|
||||
} else if slot_leader_id == None {
|
||||
inc_new_counter_info!("streamer-recv_window-unknown_leader", 1);
|
||||
true
|
||||
} else if slot_leader_id != Some(blob.id()) {
|
||||
inc_new_counter_info!("streamer-recv_window-wrong_leader", 1);
|
||||
false
|
||||
} else {
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
fn recv_window(
|
||||
bank_forks: Option<&Arc<RwLock<BankForks>>>,
|
||||
blocktree: &Arc<Blocktree>,
|
||||
id: &Pubkey,
|
||||
my_id: &Pubkey,
|
||||
r: &BlobReceiver,
|
||||
retransmit: &BlobSender,
|
||||
genesis_blockhash: &Hash,
|
||||
) -> Result<()> {
|
||||
let timer = Duration::from_millis(200);
|
||||
let mut dq = r.recv_timeout(timer)?;
|
||||
let mut blobs = r.recv_timeout(timer)?;
|
||||
|
||||
while let Ok(mut nq) = r.try_recv() {
|
||||
dq.append(&mut nq)
|
||||
while let Ok(mut blob) = r.try_recv() {
|
||||
blobs.append(&mut blob)
|
||||
}
|
||||
let now = Instant::now();
|
||||
inc_new_counter_info!("streamer-recv_window-recv", dq.len(), 100);
|
||||
inc_new_counter_info!("streamer-recv_window-recv", blobs.len());
|
||||
|
||||
submit(
|
||||
influxdb::Point::new("recv-window")
|
||||
.add_field("count", influxdb::Value::Integer(dq.len() as i64))
|
||||
.to_owned(),
|
||||
);
|
||||
blobs.retain(|blob| {
|
||||
should_retransmit_and_persist(
|
||||
&blob.read().unwrap(),
|
||||
bank_forks
|
||||
.map(|bank_forks| bank_forks.read().unwrap().working_bank())
|
||||
.as_ref(),
|
||||
my_id,
|
||||
) && blob.read().unwrap().genesis_blockhash() == *genesis_blockhash
|
||||
});
|
||||
|
||||
retransmit_blobs(&dq, retransmit, id)?;
|
||||
retransmit_blobs(&blobs, retransmit, my_id)?;
|
||||
|
||||
//send a contiguous set of blocks
|
||||
trace!("{} num blobs received: {}", id, dq.len());
|
||||
trace!("{} num blobs received: {}", my_id, blobs.len());
|
||||
|
||||
process_blobs(&dq, blocktree)?;
|
||||
process_blobs(&blobs, blocktree)?;
|
||||
|
||||
trace!(
|
||||
"Elapsed processing time in recv_window(): {}",
|
||||
@ -124,7 +151,9 @@ pub struct WindowService {
|
||||
}
|
||||
|
||||
impl WindowService {
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
pub fn new(
|
||||
bank_forks: Option<Arc<RwLock<BankForks>>>,
|
||||
blocktree: Arc<Blocktree>,
|
||||
cluster_info: Arc<RwLock<ClusterInfo>>,
|
||||
r: BlobReceiver,
|
||||
@ -132,6 +161,7 @@ impl WindowService {
|
||||
repair_socket: Arc<UdpSocket>,
|
||||
exit: &Arc<AtomicBool>,
|
||||
repair_slot_range: Option<RepairSlotRange>,
|
||||
genesis_blockhash: &Hash,
|
||||
) -> WindowService {
|
||||
let repair_service = RepairService::new(
|
||||
blocktree.clone(),
|
||||
@ -141,6 +171,8 @@ impl WindowService {
|
||||
repair_slot_range,
|
||||
);
|
||||
let exit = exit.clone();
|
||||
let bank_forks = bank_forks.clone();
|
||||
let hash = *genesis_blockhash;
|
||||
let t_window = Builder::new()
|
||||
.name("solana-window".to_string())
|
||||
.spawn(move || {
|
||||
@ -151,7 +183,9 @@ impl WindowService {
|
||||
if exit.load(Ordering::Relaxed) {
|
||||
break;
|
||||
}
|
||||
if let Err(e) = recv_window(&blocktree, &id, &r, &retransmit) {
|
||||
if let Err(e) =
|
||||
recv_window(bank_forks.as_ref(), &blocktree, &id, &r, &retransmit, &hash)
|
||||
{
|
||||
match e {
|
||||
Error::RecvTimeoutError(RecvTimeoutError::Disconnected) => break,
|
||||
Error::RecvTimeoutError(RecvTimeoutError::Timeout) => (),
|
||||
@ -184,12 +218,15 @@ impl Service for WindowService {
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::*;
|
||||
use crate::bank_forks::BankForks;
|
||||
use crate::blocktree::{get_tmp_ledger_path, Blocktree};
|
||||
use crate::cluster_info::{ClusterInfo, Node};
|
||||
use crate::entry::{make_consecutive_blobs, make_tiny_test_entries, EntrySlice};
|
||||
use crate::packet::index_blobs;
|
||||
use crate::packet::{index_blobs, Blob};
|
||||
use crate::service::Service;
|
||||
use crate::streamer::{blob_receiver, responder};
|
||||
use solana_runtime::bank::Bank;
|
||||
use solana_sdk::genesis_block::GenesisBlock;
|
||||
use solana_sdk::hash::Hash;
|
||||
use std::fs::remove_dir_all;
|
||||
use std::net::UdpSocket;
|
||||
@ -221,6 +258,46 @@ mod test {
|
||||
Blocktree::destroy(&blocktree_path).expect("Expected successful database destruction");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_should_retransmit_and_persist() {
|
||||
let me_id = Pubkey::new_rand();
|
||||
let leader_id = Pubkey::new_rand();
|
||||
let bank = Arc::new(Bank::new(
|
||||
&GenesisBlock::new_with_leader(100, &leader_id, 10).0,
|
||||
));
|
||||
|
||||
let mut blob = Blob::default();
|
||||
blob.set_id(&leader_id);
|
||||
|
||||
// without a Bank and blobs not from me, blob continues
|
||||
assert_eq!(should_retransmit_and_persist(&blob, None, &me_id), true);
|
||||
|
||||
// with a Bank for slot 0, blob continues
|
||||
assert_eq!(
|
||||
should_retransmit_and_persist(&blob, Some(&bank), &me_id),
|
||||
true
|
||||
);
|
||||
|
||||
// set the blob to have come from the wrong leader
|
||||
blob.set_id(&Pubkey::new_rand());
|
||||
assert_eq!(
|
||||
should_retransmit_and_persist(&blob, Some(&bank), &me_id),
|
||||
false
|
||||
);
|
||||
|
||||
// with a Bank and no idea who leader is, we keep the blobs (for now)
|
||||
// TODO: persistr in blocktree that we didn't know who the leader was at the time?
|
||||
blob.set_slot(100);
|
||||
assert_eq!(
|
||||
should_retransmit_and_persist(&blob, Some(&bank), &me_id),
|
||||
true
|
||||
);
|
||||
|
||||
// if the blob came back from me, it doesn't continue, whether or not I have a bank
|
||||
blob.set_id(&me_id);
|
||||
assert_eq!(should_retransmit_and_persist(&blob, None, &me_id), false);
|
||||
}
|
||||
|
||||
#[test]
|
||||
pub fn window_send_test() {
|
||||
solana_logger::setup();
|
||||
@ -241,6 +318,10 @@ mod test {
|
||||
Blocktree::open(&blocktree_path).expect("Expected to be able to open database ledger"),
|
||||
);
|
||||
let t_window = WindowService::new(
|
||||
Some(Arc::new(RwLock::new(BankForks::new(
|
||||
0,
|
||||
Bank::new(&GenesisBlock::new_with_leader(100, &me_id, 10).0),
|
||||
)))),
|
||||
blocktree,
|
||||
subs,
|
||||
r_reader,
|
||||
@ -248,6 +329,7 @@ mod test {
|
||||
Arc::new(leader_node.sockets.repair),
|
||||
&exit,
|
||||
None,
|
||||
&Hash::default(),
|
||||
);
|
||||
let t_responder = {
|
||||
let (s_responder, r_responder) = channel();
|
||||
@ -313,6 +395,10 @@ mod test {
|
||||
Blocktree::open(&blocktree_path).expect("Expected to be able to open database ledger"),
|
||||
);
|
||||
let t_window = WindowService::new(
|
||||
Some(Arc::new(RwLock::new(BankForks::new(
|
||||
0,
|
||||
Bank::new(&GenesisBlock::new_with_leader(100, &me_id, 10).0),
|
||||
)))),
|
||||
blocktree,
|
||||
subs.clone(),
|
||||
r_reader,
|
||||
@ -320,6 +406,7 @@ mod test {
|
||||
Arc::new(leader_node.sockets.repair),
|
||||
&exit,
|
||||
None,
|
||||
&Hash::default(),
|
||||
);
|
||||
let t_responder = {
|
||||
let (s_responder, r_responder) = channel();
|
||||
|
@ -127,6 +127,7 @@ fn test_replay() {
|
||||
storage_sender,
|
||||
storage_receiver,
|
||||
&exit,
|
||||
&solana_sdk::hash::Hash::default(),
|
||||
);
|
||||
|
||||
let mut mint_ref_balance = starting_mint_balance;
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-drone"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
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.90"
|
||||
serde_derive = "1.0.90"
|
||||
solana-logger = { path = "../logger", version = "0.13.0" }
|
||||
solana-sdk = { path = "../sdk", version = "0.13.0" }
|
||||
solana-metrics = { path = "../metrics", version = "0.13.0" }
|
||||
solana-logger = { path = "../logger", version = "0.13.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.13.3" }
|
||||
solana-metrics = { path = "../metrics", version = "0.13.3" }
|
||||
tokio = "0.1"
|
||||
tokio-codec = "0.1"
|
||||
|
||||
|
@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-fullnode"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
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.13.0" }
|
||||
solana-drone = { path = "../drone", version = "0.13.0" }
|
||||
solana-logger = { path = "../logger", version = "0.13.0" }
|
||||
solana-netutil = { path = "../netutil", version = "0.13.0" }
|
||||
solana-metrics = { path = "../metrics", version = "0.13.0" }
|
||||
solana-runtime = { path = "../runtime", version = "0.13.0" }
|
||||
solana-sdk = { path = "../sdk", version = "0.13.0" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.13.0" }
|
||||
solana-vote-signer = { path = "../vote-signer", version = "0.13.0" }
|
||||
solana = { path = "../core", version = "0.13.3" }
|
||||
solana-drone = { path = "../drone", version = "0.13.3" }
|
||||
solana-logger = { path = "../logger", version = "0.13.3" }
|
||||
solana-netutil = { path = "../netutil", version = "0.13.3" }
|
||||
solana-metrics = { path = "../metrics", version = "0.13.3" }
|
||||
solana-runtime = { path = "../runtime", version = "0.13.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.13.3" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.13.3" }
|
||||
solana-vote-signer = { path = "../vote-signer", version = "0.13.3" }
|
||||
|
||||
[features]
|
||||
chacha = ["solana/chacha"]
|
||||
|
@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-genesis"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@ -11,18 +11,18 @@ homepage = "https://solana.com/"
|
||||
[dependencies]
|
||||
clap = "2.33.0"
|
||||
serde_json = "1.0.39"
|
||||
solana = { path = "../core", version = "0.13.0" }
|
||||
solana-sdk = { path = "../sdk", version = "0.13.0" }
|
||||
solana-budget-api = { path = "../programs/budget_api", version = "0.13.0" }
|
||||
solana-storage-api = { path = "../programs/storage_api", version = "0.13.0" }
|
||||
solana-token-api = { path = "../programs/token_api", version = "0.13.0" }
|
||||
solana-config-api = { path = "../programs/config_api", version = "0.13.0" }
|
||||
solana-exchange-api = { path = "../programs/exchange_api", version = "0.13.0" }
|
||||
|
||||
solana = { path = "../core", version = "0.13.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.13.3" }
|
||||
solana-budget-api = { path = "../programs/budget_api", version = "0.13.3" }
|
||||
solana-stake-api = { path = "../programs/stake_api", version = "0.13.3" }
|
||||
solana-storage-api = { path = "../programs/storage_api", version = "0.13.3" }
|
||||
solana-token-api = { path = "../programs/token_api", version = "0.13.3" }
|
||||
solana-config-api = { path = "../programs/config_api", version = "0.13.3" }
|
||||
solana-exchange-api = { path = "../programs/exchange_api", version = "0.13.3" }
|
||||
|
||||
[dev-dependencies]
|
||||
hashbrown = "0.2.1"
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.13.0" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.13.3" }
|
||||
|
||||
[features]
|
||||
cuda = ["solana/cuda"]
|
||||
|
@ -14,6 +14,7 @@ use std::error;
|
||||
pub const BOOTSTRAP_LEADER_LAMPORTS: u64 = 43;
|
||||
|
||||
fn main() -> Result<(), Box<dyn error::Error>> {
|
||||
let default_bootstrap_leader_lamports = &BOOTSTRAP_LEADER_LAMPORTS.to_string();
|
||||
let matches = App::new(crate_name!())
|
||||
.about(crate_description!())
|
||||
.version(crate_version!())
|
||||
@ -62,6 +63,15 @@ fn main() -> Result<(), Box<dyn error::Error>> {
|
||||
.required(true)
|
||||
.help("Path to file containing the bootstrap leader's staking keypair"),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name("bootstrap_leader_lamports")
|
||||
.long("bootstrap-leader-lamports")
|
||||
.value_name("LAMPORTS")
|
||||
.takes_value(true)
|
||||
.default_value(default_bootstrap_leader_lamports)
|
||||
.required(true)
|
||||
.help("Number of lamports to assign to the bootstrap leader"),
|
||||
)
|
||||
.get_matches();
|
||||
|
||||
let bootstrap_leader_keypair_file = matches.value_of("bootstrap_leader_keypair_file").unwrap();
|
||||
@ -69,6 +79,7 @@ fn main() -> Result<(), Box<dyn error::Error>> {
|
||||
let ledger_path = matches.value_of("ledger_path").unwrap();
|
||||
let mint_keypair_file = matches.value_of("mint_keypair_file").unwrap();
|
||||
let lamports = value_t_or_exit!(matches, "lamports", u64);
|
||||
let bootstrap_leader_lamports = value_t_or_exit!(matches, "bootstrap_leader_lamports", u64);
|
||||
|
||||
let bootstrap_leader_keypair = read_keypair(bootstrap_leader_keypair_file)?;
|
||||
let bootstrap_vote_keypair = read_keypair(bootstrap_vote_keypair_file)?;
|
||||
@ -77,7 +88,7 @@ fn main() -> Result<(), Box<dyn error::Error>> {
|
||||
let (mut genesis_block, _mint_keypair) = GenesisBlock::new_with_leader(
|
||||
lamports,
|
||||
&bootstrap_leader_keypair.pubkey(),
|
||||
BOOTSTRAP_LEADER_LAMPORTS,
|
||||
bootstrap_leader_lamports,
|
||||
);
|
||||
genesis_block.mint_id = mint_keypair.pubkey();
|
||||
genesis_block.bootstrap_leader_vote_account_id = bootstrap_vote_keypair.pubkey();
|
||||
@ -112,43 +123,39 @@ mod tests {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0,
|
||||
]);
|
||||
let native = Pubkey::new(&[
|
||||
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0,
|
||||
]);
|
||||
let bpf = Pubkey::new(&[
|
||||
128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0,
|
||||
]);
|
||||
let budget = Pubkey::new(&[
|
||||
129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0,
|
||||
]);
|
||||
let storage = Pubkey::new(&[
|
||||
130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0,
|
||||
]);
|
||||
let token = Pubkey::new(&[
|
||||
131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0,
|
||||
]);
|
||||
let vote = Pubkey::new(&[
|
||||
132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0,
|
||||
]);
|
||||
let config = Pubkey::new(&[
|
||||
133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0,
|
||||
]);
|
||||
let exchange = Pubkey::new(&[
|
||||
134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0,
|
||||
]);
|
||||
let native_loader = "NativeLoader1111111111111111111111111111111"
|
||||
.parse::<Pubkey>()
|
||||
.unwrap();
|
||||
let bpf_loader = "BPFLoader1111111111111111111111111111111111"
|
||||
.parse::<Pubkey>()
|
||||
.unwrap();
|
||||
let budget = "Budget1111111111111111111111111111111111111"
|
||||
.parse::<Pubkey>()
|
||||
.unwrap();
|
||||
let stake = "Stake11111111111111111111111111111111111111"
|
||||
.parse::<Pubkey>()
|
||||
.unwrap();
|
||||
let storage = "Storage111111111111111111111111111111111111"
|
||||
.parse::<Pubkey>()
|
||||
.unwrap();
|
||||
let token = "Token11111111111111111111111111111111111111"
|
||||
.parse::<Pubkey>()
|
||||
.unwrap();
|
||||
let vote = "Vote111111111111111111111111111111111111111"
|
||||
.parse::<Pubkey>()
|
||||
.unwrap();
|
||||
let config = "Config1111111111111111111111111111111111111"
|
||||
.parse::<Pubkey>()
|
||||
.unwrap();
|
||||
let exchange = "Exchange11111111111111111111111111111111111"
|
||||
.parse::<Pubkey>()
|
||||
.unwrap();
|
||||
|
||||
assert_eq!(solana_sdk::system_program::id(), system);
|
||||
assert_eq!(solana_sdk::native_loader::id(), native);
|
||||
assert_eq!(solana_sdk::bpf_loader::id(), bpf);
|
||||
assert_eq!(solana_sdk::native_loader::id(), native_loader);
|
||||
assert_eq!(solana_sdk::bpf_loader::id(), bpf_loader);
|
||||
assert_eq!(solana_budget_api::id(), budget);
|
||||
assert_eq!(solana_stake_api::id(), stake);
|
||||
assert_eq!(solana_storage_api::id(), storage);
|
||||
assert_eq!(solana_token_api::id(), token);
|
||||
assert_eq!(solana_vote_api::id(), vote);
|
||||
|
@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-gossip"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@ -11,9 +11,9 @@ homepage = "https://solana.com/"
|
||||
[dependencies]
|
||||
clap = "2.33.0"
|
||||
env_logger = "0.6.1"
|
||||
solana = { path = "../core", version = "0.13.0" }
|
||||
solana-netutil = { path = "../netutil", version = "0.13.0" }
|
||||
solana-sdk = { path = "../sdk", version = "0.13.0" }
|
||||
solana = { path = "../core", version = "0.13.3" }
|
||||
solana-netutil = { path = "../netutil", version = "0.13.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.13.3" }
|
||||
|
||||
[features]
|
||||
chacha = []
|
||||
|
@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-install"
|
||||
description = "The solana cluster software installer"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@ -28,10 +28,10 @@ ring = "0.13.2"
|
||||
serde = "1.0.90"
|
||||
serde_derive = "1.0.90"
|
||||
serde_yaml = "0.8.8"
|
||||
solana-client = { path = "../client", version = "0.13.0" }
|
||||
solana-config-api = { path = "../programs/config_api", version = "0.13.0" }
|
||||
solana-logger = { path = "../logger", version = "0.13.0" }
|
||||
solana-sdk = { path = "../sdk", version = "0.13.0" }
|
||||
solana-client = { path = "../client", version = "0.13.3" }
|
||||
solana-config-api = { path = "../programs/config_api", version = "0.13.3" }
|
||||
solana-logger = { path = "../logger", version = "0.13.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.13.3" }
|
||||
tar = "0.4.22"
|
||||
tempdir = "0.3.7"
|
||||
url = "1.7.2"
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-keygen"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
description = "Solana key generation utility"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -15,7 +15,7 @@ erasure = []
|
||||
[dependencies]
|
||||
dirs = "1.0.5"
|
||||
clap = "2.33"
|
||||
solana-sdk = { path = "../sdk", version = "0.13.0" }
|
||||
solana-sdk = { path = "../sdk", version = "0.13.3" }
|
||||
|
||||
[[bin]]
|
||||
name = "solana-keygen"
|
||||
|
@ -1,7 +1,7 @@
|
||||
[package]
|
||||
name = "solana-kvstore"
|
||||
description = "Embedded Key-Value store for solana"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
homepage = "https://solana.com/"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
|
@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-ledger-tool"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
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"
|
||||
serde_json = "1.0.39"
|
||||
solana = { path = "../core", version = "0.13.0" }
|
||||
solana-sdk = { path = "../sdk", version = "0.13.0" }
|
||||
solana-logger = { path = "../logger", version = "0.13.0" }
|
||||
solana-runtime = { path = "../runtime", version = "0.13.0" }
|
||||
solana = { path = "../core", version = "0.13.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.13.3" }
|
||||
solana-logger = { path = "../logger", version = "0.13.3" }
|
||||
solana-runtime = { path = "../runtime", version = "0.13.3" }
|
||||
|
||||
[dev-dependencies]
|
||||
assert_cmd = "0.11"
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-logger"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
description = "Solana Logger"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-metrics"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
description = "Solana Metrics"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -14,7 +14,7 @@ log = "0.4.2"
|
||||
reqwest = "0.9.15"
|
||||
lazy_static = "1.3.0"
|
||||
sys-info = "0.5.6"
|
||||
solana-sdk = { path = "../sdk", version = "0.13.0" }
|
||||
solana-sdk = { path = "../sdk", version = "0.13.3" }
|
||||
|
||||
[dev-dependencies]
|
||||
rand = "0.6.5"
|
||||
|
@ -138,6 +138,7 @@ setup_vote_account() {
|
||||
declare drone_address=$1
|
||||
declare node_id_path=$2
|
||||
declare vote_id_path=$3
|
||||
declare stake=$4
|
||||
|
||||
declare node_id
|
||||
node_id=$($solana_wallet --keypair "$node_id_path" address)
|
||||
@ -147,19 +148,17 @@ setup_vote_account() {
|
||||
|
||||
if [[ -f "$vote_id_path".configured ]]; then
|
||||
echo "Vote account has already been configured"
|
||||
return 0
|
||||
else
|
||||
airdrop "$node_id_path" "$drone_address" "$stake" || return $?
|
||||
|
||||
# Fund the vote account from the node, with the node as the node_id
|
||||
$solana_wallet --keypair "$node_id_path" --host "$drone_address" \
|
||||
create-vote-account "$vote_id" "$node_id" $((stake - 1)) || return $?
|
||||
|
||||
touch "$vote_id_path".configured
|
||||
fi
|
||||
|
||||
# A fullnode requires 43 lamports to function:
|
||||
# - one lamport to keep the node identity public key valid. TODO: really??
|
||||
# - 42 more for the vote account we fund
|
||||
airdrop "$node_id_path" "$drone_address" 43 || return $?
|
||||
|
||||
# Fund the vote account from the node, with the node as the node_id
|
||||
$solana_wallet --keypair "$node_id_path" --host "$drone_address" \
|
||||
create-vote-account "$vote_id" "$node_id" 42 || return $?
|
||||
|
||||
touch "$vote_id_path".configured
|
||||
$solana_wallet --keypair "$node_id_path" --host "$drone_address" show-vote-account "$vote_id"
|
||||
return 0
|
||||
}
|
||||
|
||||
@ -169,7 +168,7 @@ fullnode_usage() {
|
||||
echo
|
||||
fi
|
||||
cat <<EOF
|
||||
usage: $0 [-x] [--blockstream PATH] [--init-complete-file FILE] [--only-bootstrap-stake] [--no-voting] [--rpc-port port] [rsync network path to bootstrap leader configuration] [network entry point]
|
||||
usage: $0 [-x] [--blockstream PATH] [--init-complete-file FILE] [--stake LAMPORTS] [--no-voting] [--rpc-port port] [rsync network path to bootstrap leader configuration] [network entry point]
|
||||
|
||||
Start a full node on the specified network
|
||||
|
||||
@ -178,7 +177,7 @@ Start a full node on the specified network
|
||||
the specified label. Does not apply to the bootstrap leader
|
||||
--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
|
||||
--only-bootstrap-stake - Only stake the bootstrap leader, effectively disabling leader rotation
|
||||
--stake LAMPORTS - Number of lamports to stake
|
||||
--public-address - advertise public machine address in gossip. By default the local machine address is advertised
|
||||
--no-voting - start node without vote signer
|
||||
--rpc-port port - custom RPC port for this node
|
||||
|
@ -16,7 +16,7 @@ fi
|
||||
gossip_port=
|
||||
extra_fullnode_args=()
|
||||
self_setup=0
|
||||
setup_stakes=1
|
||||
stake=43 # number of lamports to assign as stake (plus transaction fee to setup the stake)
|
||||
poll_for_new_genesis_block=0
|
||||
|
||||
while [[ ${1:0:1} = - ]]; do
|
||||
@ -32,6 +32,7 @@ while [[ ${1:0:1} = - ]]; do
|
||||
poll_for_new_genesis_block=1
|
||||
shift
|
||||
elif [[ $1 = --blockstream ]]; then
|
||||
stake=0
|
||||
extra_fullnode_args+=("$1" "$2")
|
||||
shift 2
|
||||
elif [[ $1 = --enable-rpc-exit ]]; then
|
||||
@ -40,9 +41,9 @@ while [[ ${1:0:1} = - ]]; do
|
||||
elif [[ $1 = --init-complete-file ]]; then
|
||||
extra_fullnode_args+=("$1" "$2")
|
||||
shift 2
|
||||
elif [[ $1 = --only-bootstrap-stake ]]; then
|
||||
setup_stakes=0
|
||||
shift
|
||||
elif [[ $1 = --stake ]]; then
|
||||
stake="$2"
|
||||
shift 2
|
||||
elif [[ $1 = --public-address ]]; then
|
||||
extra_fullnode_args+=("$1")
|
||||
shift
|
||||
@ -169,6 +170,11 @@ while true; do
|
||||
fi
|
||||
|
||||
trap 'kill "$pid" && wait "$pid"' INT TERM ERR
|
||||
|
||||
if ((stake)); then
|
||||
setup_vote_account "${leader_address%:*}" "$fullnode_id_path" "$fullnode_vote_id_path" "$stake"
|
||||
fi
|
||||
|
||||
$program \
|
||||
--identity "$fullnode_id_path" \
|
||||
--voting-keypair "$fullnode_vote_id_path" \
|
||||
@ -182,9 +188,6 @@ while true; do
|
||||
pid=$!
|
||||
oom_score_adj "$pid" 1000
|
||||
|
||||
if ((setup_stakes)); then
|
||||
setup_vote_account "${leader_address%:*}" "$fullnode_id_path" "$fullnode_vote_id_path"
|
||||
fi
|
||||
set +x
|
||||
|
||||
while true; do
|
||||
@ -201,7 +204,7 @@ while true; do
|
||||
$rsync -r "$rsync_leader_url"/config/ledger "$SOLANA_RSYNC_CONFIG_DIR" || true
|
||||
if [[ -n $(diff "$SOLANA_RSYNC_CONFIG_DIR"/ledger/genesis.json "$ledger_config_dir"/genesis.json 2>&1) ]]; then
|
||||
echo "############## New genesis detected, restarting fullnode ##############"
|
||||
rm -rf "$ledger_config_dir"
|
||||
rm -rf "$ledger_config_dir" "$vote_id_path".configured
|
||||
kill "$pid" || true
|
||||
wait "$pid" || true
|
||||
break
|
||||
|
@ -29,8 +29,10 @@ EOF
|
||||
|
||||
lamports=1000000000
|
||||
bootstrap_leader=true
|
||||
bootstrap_leader_lamports=
|
||||
|
||||
fullnode=true
|
||||
while getopts "h?n:lpt:" opt; do
|
||||
while getopts "h?n:b:lpt:" opt; do
|
||||
case $opt in
|
||||
h|\?)
|
||||
usage
|
||||
@ -39,6 +41,9 @@ while getopts "h?n:lpt:" opt; do
|
||||
n)
|
||||
lamports="$OPTARG"
|
||||
;;
|
||||
b)
|
||||
bootstrap_leader_lamports="$OPTARG"
|
||||
;;
|
||||
t)
|
||||
node_type="$OPTARG"
|
||||
case $OPTARG in
|
||||
@ -77,12 +82,20 @@ if $bootstrap_leader; then
|
||||
$solana_keygen -o "$SOLANA_CONFIG_DIR"/mint-id.json
|
||||
$solana_keygen -o "$SOLANA_CONFIG_DIR"/bootstrap-leader-id.json
|
||||
$solana_keygen -o "$SOLANA_CONFIG_DIR"/bootstrap-leader-vote-id.json
|
||||
$solana_genesis \
|
||||
--bootstrap-leader-keypair "$SOLANA_CONFIG_DIR"/bootstrap-leader-id.json \
|
||||
--bootstrap-vote-keypair "$SOLANA_CONFIG_DIR"/bootstrap-leader-vote-id.json \
|
||||
--ledger "$SOLANA_RSYNC_CONFIG_DIR"/ledger \
|
||||
--mint "$SOLANA_CONFIG_DIR"/mint-id.json \
|
||||
|
||||
args=(
|
||||
--bootstrap-leader-keypair "$SOLANA_CONFIG_DIR"/bootstrap-leader-id.json
|
||||
--bootstrap-vote-keypair "$SOLANA_CONFIG_DIR"/bootstrap-leader-vote-id.json
|
||||
--ledger "$SOLANA_RSYNC_CONFIG_DIR"/ledger
|
||||
--mint "$SOLANA_CONFIG_DIR"/mint-id.json
|
||||
--lamports "$lamports"
|
||||
)
|
||||
|
||||
if [[ -n $bootstrap_leader_lamports ]]; then
|
||||
args+=(--bootstrap-leader-lamports "$bootstrap_leader_lamports")
|
||||
fi
|
||||
|
||||
$solana_genesis "${args[@]}"
|
||||
cp -a "$SOLANA_RSYNC_CONFIG_DIR"/ledger "$SOLANA_CONFIG_DIR"/bootstrap-leader-ledger
|
||||
)
|
||||
fi
|
||||
|
@ -427,7 +427,7 @@ start() {
|
||||
networkVersion="$(
|
||||
(
|
||||
set -o pipefail
|
||||
grep "^version: " "$SOLANA_ROOT"/solana-release/version.yml | head -n1 | cut -d\ -f2
|
||||
grep "^commit: " "$SOLANA_ROOT"/solana-release/version.yml | head -n1 | cut -d\ -f2
|
||||
) || echo "tar-unknown"
|
||||
)"
|
||||
;;
|
||||
|
@ -15,6 +15,14 @@ leaderRotation="$8"
|
||||
set +x
|
||||
export RUST_LOG
|
||||
|
||||
# Use a very large stake (relative to the default multinode-demo/ stake of 43)
|
||||
# for the testnet fullnodes setup by net/. This make it less likely that
|
||||
# low-staked ephemeral validator a random user may attach to testnet will cause
|
||||
# trouble
|
||||
#
|
||||
# Ref: https://github.com/solana-labs/solana/issues/3798
|
||||
stake=424243
|
||||
|
||||
missing() {
|
||||
echo "Error: $1 not specified"
|
||||
exit 1
|
||||
@ -69,20 +77,16 @@ local|tar)
|
||||
fi
|
||||
set -x
|
||||
if [[ $skipSetup != true ]]; then
|
||||
./multinode-demo/setup.sh -t bootstrap-leader
|
||||
./multinode-demo/setup.sh -t bootstrap-leader -b $stake
|
||||
fi
|
||||
./multinode-demo/drone.sh > drone.log 2>&1 &
|
||||
|
||||
maybeNoLeaderRotation=
|
||||
if ! $leaderRotation; then
|
||||
maybeNoLeaderRotation="--only-bootstrap-stake"
|
||||
fi
|
||||
maybePublicAddress=
|
||||
if $publicNetwork; then
|
||||
maybePublicAddress="--public-address"
|
||||
fi
|
||||
|
||||
./multinode-demo/bootstrap-leader.sh $maybeNoLeaderRotation $maybePublicAddress > bootstrap-leader.log 2>&1 &
|
||||
./multinode-demo/bootstrap-leader.sh $maybePublicAddress > bootstrap-leader.log 2>&1 &
|
||||
ln -sTf bootstrap-leader.log fullnode.log
|
||||
;;
|
||||
fullnode|blockstreamer)
|
||||
@ -94,9 +98,6 @@ local|tar)
|
||||
fi
|
||||
|
||||
args=()
|
||||
if ! $leaderRotation; then
|
||||
args+=("--only-bootstrap-stake")
|
||||
fi
|
||||
if $publicNetwork; then
|
||||
args+=("--public-address")
|
||||
fi
|
||||
@ -104,7 +105,14 @@ local|tar)
|
||||
args+=(
|
||||
--blockstream /tmp/solana-blockstream.sock
|
||||
--no-voting
|
||||
--stake 0
|
||||
)
|
||||
else
|
||||
if $leaderRotation; then
|
||||
args+=("--stake" "$stake")
|
||||
else
|
||||
args+=("--stake" 0)
|
||||
fi
|
||||
fi
|
||||
|
||||
args+=(
|
||||
|
@ -133,7 +133,7 @@ echo "--- $entrypointIp: validator sanity"
|
||||
if $validatorSanity; then
|
||||
(
|
||||
set -x -o pipefail
|
||||
timeout 10s ./multinode-demo/fullnode-x.sh \
|
||||
timeout 10s ./multinode-demo/fullnode-x.sh --stake 0 \
|
||||
"$entrypointRsyncUrl" \
|
||||
"$entrypointIp:8001" 2>&1 | tee validator-sanity.log
|
||||
) || {
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-netutil"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
description = "Solana Network Utilities"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -18,7 +18,7 @@ reqwest = "0.9.0"
|
||||
socket2 = "0.3.8"
|
||||
|
||||
[dev-dependencies]
|
||||
solana-logger = { path = "../logger", version = "0.13.0" }
|
||||
solana-logger = { path = "../logger", version = "0.13.3" }
|
||||
|
||||
[lib]
|
||||
name = "solana_netutil"
|
||||
|
@ -1,7 +1,7 @@
|
||||
[package]
|
||||
name = "solana-bpf-programs"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
documentation = "https://docs.rs/solana"
|
||||
homepage = "https://solana.com/"
|
||||
readme = "README.md"
|
||||
@ -22,10 +22,10 @@ bincode = "1.1.3"
|
||||
byteorder = "1.3.1"
|
||||
elf = "0.0.10"
|
||||
solana_rbpf = "=0.1.10"
|
||||
solana-bpfloader = { path = "../bpf_loader", version = "0.13.0" }
|
||||
solana-logger = { path = "../../logger", version = "0.13.0" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.13.0" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.0" }
|
||||
solana-bpfloader = { path = "../bpf_loader", version = "0.13.3" }
|
||||
solana-logger = { path = "../../logger", version = "0.13.3" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.13.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.3" }
|
||||
|
||||
[[bench]]
|
||||
name = "bpf_loader"
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-noop"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
description = "Solana BPF noop program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-bpfloader"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
description = "Solana BPF Loader"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -15,8 +15,8 @@ libc = "0.2.51"
|
||||
log = "0.4.2"
|
||||
solana_rbpf = "=0.1.10"
|
||||
serde = "1.0.90"
|
||||
solana-logger = { path = "../../logger", version = "0.13.0" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.0" }
|
||||
solana-logger = { path = "../../logger", version = "0.13.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.3" }
|
||||
|
||||
[lib]
|
||||
name = "solana_bpf_loader"
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-budget-api"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
description = "Solana Budget program API"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -14,10 +14,10 @@ chrono = { version = "0.4.0", features = ["serde"] }
|
||||
log = "0.4.2"
|
||||
serde = "1.0.90"
|
||||
serde_derive = "1.0.90"
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.0" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.3" }
|
||||
|
||||
[dev-dependencies]
|
||||
solana-runtime = { path = "../../runtime", version = "0.13.0" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.13.3" }
|
||||
|
||||
[lib]
|
||||
name = "solana_budget_api"
|
||||
|
@ -6,8 +6,8 @@ pub mod budget_state;
|
||||
use solana_sdk::pubkey::Pubkey;
|
||||
|
||||
const BUDGET_PROGRAM_ID: [u8; 32] = [
|
||||
129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0,
|
||||
2, 203, 81, 223, 225, 24, 34, 35, 203, 214, 138, 130, 144, 208, 35, 77, 63, 16, 87, 51, 47,
|
||||
198, 115, 123, 98, 188, 19, 160, 0, 0, 0, 0,
|
||||
];
|
||||
|
||||
pub fn id() -> Pubkey {
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-budget-program"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
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.13.0" }
|
||||
solana-logger = { path = "../../logger", version = "0.13.0" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.0" }
|
||||
solana-budget-api = { path = "../budget_api", version = "0.13.3" }
|
||||
solana-logger = { path = "../../logger", version = "0.13.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.3" }
|
||||
|
||||
[lib]
|
||||
name = "solana_budget_program"
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-config-api"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
description = "config program API"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -13,11 +13,11 @@ bincode = "1.1.3"
|
||||
log = "0.4.2"
|
||||
serde = "1.0.90"
|
||||
serde_derive = "1.0.90"
|
||||
solana-logger = { path = "../../logger", version = "0.13.0" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.0" }
|
||||
solana-logger = { path = "../../logger", version = "0.13.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.3" }
|
||||
|
||||
[dev-dependencies]
|
||||
solana-runtime = { path = "../../runtime", version = "0.13.0" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.13.3" }
|
||||
|
||||
[lib]
|
||||
name = "solana_config_api"
|
||||
|
@ -5,8 +5,8 @@ pub mod config_instruction;
|
||||
pub mod config_processor;
|
||||
|
||||
const CONFIG_PROGRAM_ID: [u8; 32] = [
|
||||
133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0,
|
||||
3, 6, 74, 163, 0, 47, 116, 220, 200, 110, 67, 49, 15, 12, 5, 42, 248, 197, 218, 39, 246, 16,
|
||||
64, 25, 163, 35, 239, 160, 0, 0, 0, 0,
|
||||
];
|
||||
|
||||
pub fn check_id(program_id: &Pubkey) -> bool {
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-config-program"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
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.13.0" }
|
||||
solana-logger = { path = "../../logger", version = "0.13.0" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.0" }
|
||||
solana-config-api = { path = "../config_api", version = "0.13.3" }
|
||||
solana-logger = { path = "../../logger", version = "0.13.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.3" }
|
||||
|
||||
[lib]
|
||||
name = "solana_config_program"
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-exchange-api"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
description = "Solana Exchange program API"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -13,11 +13,11 @@ log = "0.4.2"
|
||||
bincode = "1.1.3"
|
||||
serde = "1.0.90"
|
||||
serde_derive = "1.0.90"
|
||||
solana-logger = { path = "../../logger", version = "0.13.0" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.0" }
|
||||
solana-logger = { path = "../../logger", version = "0.13.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.3" }
|
||||
|
||||
[dev-dependencies]
|
||||
solana-runtime = { path = "../../runtime", version = "0.13.0" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.13.3" }
|
||||
|
||||
[lib]
|
||||
name = "solana_exchange_api"
|
||||
|
@ -5,8 +5,8 @@ pub mod exchange_state;
|
||||
use solana_sdk::pubkey::Pubkey;
|
||||
|
||||
pub const EXCHANGE_PROGRAM_ID: [u8; 32] = [
|
||||
134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0,
|
||||
3, 147, 111, 103, 210, 47, 14, 213, 108, 116, 49, 115, 232, 171, 14, 111, 167, 140, 221, 234,
|
||||
33, 70, 185, 192, 42, 31, 141, 152, 0, 0, 0, 0,
|
||||
];
|
||||
|
||||
pub fn check_id(program_id: &Pubkey) -> bool {
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-exchange-program"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
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.13.0" }
|
||||
solana-logger = { path = "../../logger", version = "0.13.0" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.0" }
|
||||
solana-exchange-api = { path = "../exchange_api", version = "0.13.3" }
|
||||
solana-logger = { path = "../../logger", version = "0.13.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.3" }
|
||||
|
||||
[lib]
|
||||
name = "solana_exchange_program"
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-failure-program"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
description = "Solana failure program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -9,11 +9,11 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.0" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.3" }
|
||||
log = "0.4.2"
|
||||
|
||||
[dev-dependencies]
|
||||
solana-runtime = { path = "../../runtime", version = "0.13.0" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.13.3" }
|
||||
|
||||
[lib]
|
||||
name = "solana_failure_program"
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-noop-program"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
description = "Solana noop program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -9,12 +9,12 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.0" }
|
||||
solana-logger = { path = "../../logger", version = "0.13.0" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.3" }
|
||||
solana-logger = { path = "../../logger", version = "0.13.3" }
|
||||
log = "0.4.2"
|
||||
|
||||
[dev-dependencies]
|
||||
solana-runtime = { path = "../../runtime", version = "0.13.0" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.13.3" }
|
||||
|
||||
[lib]
|
||||
name = "solana_noop_program"
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-stake-api"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
description = "Solana Stake program API"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -13,13 +13,13 @@ bincode = "1.1.3"
|
||||
log = "0.4.2"
|
||||
serde = "1.0.90"
|
||||
serde_derive = "1.0.90"
|
||||
solana-logger = { path = "../../logger", version = "0.13.0" }
|
||||
solana-metrics = { path = "../../metrics", version = "0.13.0" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.0" }
|
||||
solana-vote-api = { path = "../vote_api", version = "0.13.0" }
|
||||
solana-logger = { path = "../../logger", version = "0.13.3" }
|
||||
solana-metrics = { path = "../../metrics", version = "0.13.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.3" }
|
||||
solana-vote-api = { path = "../vote_api", version = "0.13.3" }
|
||||
|
||||
[dev-dependencies]
|
||||
solana-runtime = { path = "../../runtime", version = "0.13.0" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.13.3" }
|
||||
|
||||
[lib]
|
||||
name = "solana_stake_api"
|
||||
|
@ -4,8 +4,8 @@ pub mod stake_state;
|
||||
use solana_sdk::pubkey::Pubkey;
|
||||
|
||||
const STAKE_PROGRAM_ID: [u8; 32] = [
|
||||
135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0,
|
||||
6, 161, 216, 23, 145, 55, 84, 42, 152, 52, 55, 189, 254, 42, 122, 178, 85, 127, 83, 92, 138,
|
||||
120, 114, 43, 104, 164, 157, 192, 0, 0, 0, 0,
|
||||
];
|
||||
|
||||
pub fn check_id(program_id: &Pubkey) -> bool {
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-stake-program"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
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.13.0" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.0" }
|
||||
solana-stake-api = { path = "../stake_api", version = "0.13.0" }
|
||||
solana-logger = { path = "../../logger", version = "0.13.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.3" }
|
||||
solana-stake-api = { path = "../stake_api", version = "0.13.3" }
|
||||
|
||||
[lib]
|
||||
name = "solana_stake_program"
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-storage-api"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
description = "Solana Storage program API"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -13,11 +13,11 @@ bincode = "1.1.3"
|
||||
log = "0.4.2"
|
||||
serde = "1.0.90"
|
||||
serde_derive = "1.0.90"
|
||||
solana-logger = { path = "../../logger", version = "0.13.0" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.0" }
|
||||
solana-logger = { path = "../../logger", version = "0.13.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.3" }
|
||||
|
||||
[dev-dependencies]
|
||||
solana-runtime = { path = "../../runtime", version = "0.13.0" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.13.3" }
|
||||
|
||||
[lib]
|
||||
name = "solana_storage_api"
|
||||
|
@ -11,8 +11,8 @@ pub fn get_segment_from_entry(entry_height: u64) -> usize {
|
||||
}
|
||||
|
||||
const STORAGE_PROGRAM_ID: [u8; 32] = [
|
||||
130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0,
|
||||
6, 162, 25, 123, 127, 68, 233, 59, 131, 151, 21, 152, 162, 120, 90, 37, 154, 88, 86, 5, 156,
|
||||
221, 182, 201, 142, 103, 151, 112, 0, 0, 0, 0,
|
||||
];
|
||||
|
||||
pub fn check_id(program_id: &Pubkey) -> bool {
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-storage-program"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
description = "Solana storage 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.13.0" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.0" }
|
||||
solana-storage-api = { path = "../storage_api", version = "0.13.0" }
|
||||
solana-logger = { path = "../../logger", version = "0.13.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.3" }
|
||||
solana-storage-api = { path = "../storage_api", version = "0.13.3" }
|
||||
|
||||
[lib]
|
||||
name = "solana_storage_program"
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-token-api"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
description = "Solana Token API"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -13,8 +13,8 @@ bincode = "1.1.3"
|
||||
log = "0.4.2"
|
||||
serde = "1.0.90"
|
||||
serde_derive = "1.0.90"
|
||||
solana-logger = { path = "../../logger", version = "0.13.0" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.0" }
|
||||
solana-logger = { path = "../../logger", version = "0.13.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.3" }
|
||||
|
||||
[lib]
|
||||
name = "solana_token_api"
|
||||
|
@ -4,8 +4,8 @@ mod token_state;
|
||||
use solana_sdk::pubkey::Pubkey;
|
||||
|
||||
const TOKEN_PROGRAM_ID: [u8; 32] = [
|
||||
131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0,
|
||||
6, 221, 246, 225, 142, 57, 236, 63, 240, 189, 82, 112, 85, 219, 2, 165, 51, 122, 113, 201, 115,
|
||||
12, 217, 253, 72, 146, 220, 192, 0, 0, 0, 0,
|
||||
];
|
||||
|
||||
pub fn id() -> Pubkey {
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-token-program"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
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.13.0" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.0" }
|
||||
solana-token-api = { path = "../token_api", version = "0.13.0" }
|
||||
solana-logger = { path = "../../logger", version = "0.13.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.3" }
|
||||
solana-token-api = { path = "../token_api", version = "0.13.3" }
|
||||
|
||||
[lib]
|
||||
name = "solana_token_program"
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-vote-api"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
description = "Solana Vote program API"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -13,12 +13,12 @@ bincode = "1.1.3"
|
||||
log = "0.4.2"
|
||||
serde = "1.0.90"
|
||||
serde_derive = "1.0.90"
|
||||
solana-logger = { path = "../../logger", version = "0.13.0" }
|
||||
solana-metrics = { path = "../../metrics", version = "0.13.0" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.0" }
|
||||
solana-logger = { path = "../../logger", version = "0.13.3" }
|
||||
solana-metrics = { path = "../../metrics", version = "0.13.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.3" }
|
||||
|
||||
[dev-dependencies]
|
||||
solana-runtime = { path = "../../runtime", version = "0.13.0" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.13.3" }
|
||||
|
||||
[lib]
|
||||
name = "solana_vote_api"
|
||||
|
@ -4,8 +4,8 @@ pub mod vote_state;
|
||||
use solana_sdk::pubkey::Pubkey;
|
||||
|
||||
const VOTE_PROGRAM_ID: [u8; 32] = [
|
||||
132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0,
|
||||
7, 97, 72, 29, 53, 116, 116, 187, 124, 77, 118, 36, 235, 211, 189, 179, 216, 53, 94, 115, 209,
|
||||
16, 67, 252, 13, 163, 83, 128, 0, 0, 0, 0,
|
||||
];
|
||||
|
||||
pub fn check_id(program_id: &Pubkey) -> bool {
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-vote-program"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
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.13.0" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.0" }
|
||||
solana-vote-api = { path = "../vote_api", version = "0.13.0" }
|
||||
solana-logger = { path = "../../logger", version = "0.13.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.13.3" }
|
||||
solana-vote-api = { path = "../vote_api", version = "0.13.3" }
|
||||
|
||||
[lib]
|
||||
name = "solana_vote_program"
|
||||
|
@ -2,17 +2,17 @@
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-replicator"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
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.13.0" }
|
||||
solana-logger = { path = "../logger", version = "0.13.0" }
|
||||
solana-netutil = { path = "../netutil", version = "0.13.0" }
|
||||
solana-sdk = { path = "../sdk", version = "0.13.0" }
|
||||
solana = { path = "../core", version = "0.13.3" }
|
||||
solana-logger = { path = "../logger", version = "0.13.3" }
|
||||
solana-netutil = { path = "../netutil", version = "0.13.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.13.3" }
|
||||
|
||||
[features]
|
||||
chacha = ["solana/chacha"]
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-runtime"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
description = "Solana runtime"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -23,10 +23,10 @@ rayon = "1.0.0"
|
||||
serde = "1.0.88"
|
||||
serde_derive = "1.0.88"
|
||||
serde_json = "1.0.38"
|
||||
solana-logger = { path = "../logger", version = "0.13.0" }
|
||||
solana-metrics = { path = "../metrics", version = "0.13.0" }
|
||||
solana-sdk = { path = "../sdk", version = "0.13.0" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.13.0" }
|
||||
solana-logger = { path = "../logger", version = "0.13.3" }
|
||||
solana-metrics = { path = "../metrics", version = "0.13.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.13.3" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.13.3" }
|
||||
|
||||
[lib]
|
||||
name = "solana_runtime"
|
||||
|
@ -89,7 +89,7 @@ for Cargo_toml in "${Cargo_tomls[@]}"; do
|
||||
(
|
||||
set -x
|
||||
sed -i "$Cargo_toml" -e "
|
||||
s/^$crate = .*path = \"\([^\"]*\)\".*\$/$crate = \{ path = \"\1\", version = \"$newVersion\" \}/
|
||||
s/^$crate = { *path *= *\"\([^\"]*\)\" *, *version *= *\"[^\"]*\"\(.*\)} *\$/$crate = \{ path = \"\1\", version = \"$newVersion\"\2 \}/
|
||||
"
|
||||
)
|
||||
done
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-sdk"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
description = "Solana SDK"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
|
@ -1,8 +1,8 @@
|
||||
use crate::pubkey::Pubkey;
|
||||
|
||||
const BPF_LOADER_PROGRAM_ID: [u8; 32] = [
|
||||
128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0,
|
||||
2, 168, 246, 145, 78, 136, 161, 107, 189, 35, 149, 133, 95, 100, 4, 217, 180, 244, 86, 183,
|
||||
130, 27, 176, 20, 87, 73, 66, 140, 0, 0, 0, 0,
|
||||
];
|
||||
|
||||
pub fn id() -> Pubkey {
|
||||
|
@ -2,7 +2,8 @@ use crate::account::Account;
|
||||
use crate::pubkey::Pubkey;
|
||||
|
||||
const NATIVE_LOADER_PROGRAM_ID: [u8; 32] = [
|
||||
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
5, 135, 132, 191, 20, 139, 164, 40, 47, 176, 18, 87, 72, 136, 169, 241, 83, 160, 125, 173, 247,
|
||||
101, 192, 69, 92, 154, 151, 3, 128, 0, 0, 0,
|
||||
];
|
||||
|
||||
pub fn id() -> Pubkey {
|
||||
|
@ -1,6 +1,8 @@
|
||||
use crate::pubkey::Pubkey;
|
||||
|
||||
const SYSTEM_PROGRAM_ID: [u8; 32] = [0u8; 32];
|
||||
const SYSTEM_PROGRAM_ID: [u8; 32] = [
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
];
|
||||
|
||||
pub fn id() -> Pubkey {
|
||||
Pubkey::new(&SYSTEM_PROGRAM_ID)
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-upload-perf"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
description = "Metrics Upload Utility"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@ -10,7 +10,7 @@ homepage = "https://solana.com/"
|
||||
|
||||
[dependencies]
|
||||
serde_json = "1.0.39"
|
||||
solana-metrics = { path = "../metrics", version = "0.13.0" }
|
||||
solana-metrics = { path = "../metrics", version = "0.13.3" }
|
||||
|
||||
[[bin]]
|
||||
name = "solana-upload-perf"
|
||||
|
@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-vote-signer"
|
||||
description = "Solana Vote Signing Service"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@ -17,8 +17,8 @@ jsonrpc-derive = "11.0.0"
|
||||
jsonrpc-http-server = "11.0.0"
|
||||
serde = "1.0.90"
|
||||
serde_json = "1.0.39"
|
||||
solana-sdk = { path = "../sdk", version = "0.13.0" }
|
||||
solana-metrics = { path = "../metrics", version = "0.13.0" }
|
||||
solana-sdk = { path = "../sdk", version = "0.13.3" }
|
||||
solana-metrics = { path = "../metrics", version = "0.13.3" }
|
||||
|
||||
[lib]
|
||||
name = "solana_vote_signer"
|
||||
|
@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-wallet"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "0.13.0"
|
||||
version = "0.13.3"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@ -16,18 +16,18 @@ chrono = { version = "0.4.0", features = ["serde"] }
|
||||
dirs = "1.0.5"
|
||||
log = "0.4.2"
|
||||
serde_json = "1.0.39"
|
||||
solana-budget-api = { path = "../programs/budget_api", version = "0.13.0" }
|
||||
solana-client = { path = "../client", version = "0.13.0" }
|
||||
solana-drone = { path = "../drone", version = "0.13.0" }
|
||||
solana-logger = { path = "../logger", version = "0.13.0" }
|
||||
solana-netutil = { path = "../netutil", version = "0.13.0" }
|
||||
solana-sdk = { path = "../sdk", version = "0.13.0" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.13.0" }
|
||||
solana-vote-signer = { path = "../vote-signer", version = "0.13.0" }
|
||||
solana-budget-api = { path = "../programs/budget_api", version = "0.13.3" }
|
||||
solana-client = { path = "../client", version = "0.13.3" }
|
||||
solana-drone = { path = "../drone", version = "0.13.3" }
|
||||
solana-logger = { path = "../logger", version = "0.13.3" }
|
||||
solana-netutil = { path = "../netutil", version = "0.13.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.13.3" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.13.3" }
|
||||
solana-vote-signer = { path = "../vote-signer", version = "0.13.3" }
|
||||
|
||||
[dev-dependencies]
|
||||
solana-budget-program = { path = "../programs/budget_program", version = "0.13.0" }
|
||||
solana = { path = "../core", version = "0.13.0" }
|
||||
solana-budget-program = { path = "../programs/budget_program", version = "0.13.3" }
|
||||
solana = { path = "../core", version = "0.13.3" }
|
||||
|
||||
[features]
|
||||
cuda = []
|
||||
|
@ -268,6 +268,19 @@ fn main() -> Result<(), Box<dyn error::Error>> {
|
||||
),
|
||||
|
||||
)
|
||||
.subcommand(
|
||||
SubCommand::with_name("show-vote-account")
|
||||
.about("Show the contents of a vote account")
|
||||
.arg(
|
||||
Arg::with_name("voting_account_id")
|
||||
.index(1)
|
||||
.value_name("PUBKEY")
|
||||
.takes_value(true)
|
||||
.required(true)
|
||||
.validator(is_pubkey)
|
||||
.help("Vote account pubkey"),
|
||||
)
|
||||
)
|
||||
.subcommand(
|
||||
SubCommand::with_name("deploy")
|
||||
.about("Deploy a program")
|
||||
|
@ -38,6 +38,7 @@ pub enum WalletCommand {
|
||||
// ConfigureStakingAccount(delegate_id, authorized_voter_id)
|
||||
AuthorizeVoter(Pubkey),
|
||||
CreateVoteAccount(Pubkey, Pubkey, u32, u64),
|
||||
ShowVoteAccount(Pubkey),
|
||||
Deploy(String),
|
||||
GetTransactionCount,
|
||||
// Pay(lamports, to, timestamp, timestamp_pubkey, witness(es), cancelable)
|
||||
@ -184,6 +185,10 @@ pub fn parse_command(
|
||||
lamports,
|
||||
))
|
||||
}
|
||||
("show-vote-account", Some(matches)) => {
|
||||
let voting_account_id = pubkey_of(matches, "voting_account_id").unwrap();
|
||||
Ok(WalletCommand::ShowVoteAccount(voting_account_id))
|
||||
}
|
||||
("deploy", Some(deploy_matches)) => Ok(WalletCommand::Deploy(
|
||||
deploy_matches
|
||||
.value_of("program_location")
|
||||
@ -368,6 +373,43 @@ fn process_create_staking(
|
||||
Ok(signature_str.to_string())
|
||||
}
|
||||
|
||||
fn process_show_staking(
|
||||
rpc_client: &RpcClient,
|
||||
_config: &WalletConfig,
|
||||
voting_account_id: &Pubkey,
|
||||
) -> ProcessResult {
|
||||
use solana_vote_api::vote_state::VoteState;
|
||||
let vote_account_lamports = rpc_client.retry_get_balance(voting_account_id, 5)?;
|
||||
let vote_account_data = rpc_client.get_account_data(voting_account_id)?;
|
||||
let vote_state = VoteState::deserialize(&vote_account_data).unwrap();
|
||||
|
||||
println!("account lamports: {}", vote_account_lamports.unwrap());
|
||||
println!("node id: {}", vote_state.node_id);
|
||||
println!("authorized voter id: {}", vote_state.authorized_voter_id);
|
||||
println!("credits: {}", vote_state.credits());
|
||||
println!(
|
||||
"commission: {}%",
|
||||
f64::from(vote_state.commission) / f64::from(std::u32::MAX)
|
||||
);
|
||||
println!(
|
||||
"root slot: {}",
|
||||
match vote_state.root_slot {
|
||||
Some(slot) => slot.to_string(),
|
||||
None => "~".to_string(),
|
||||
}
|
||||
);
|
||||
if !vote_state.votes.is_empty() {
|
||||
println!("votes:");
|
||||
for vote in vote_state.votes {
|
||||
println!(
|
||||
"- slot={}, confirmation count={}",
|
||||
vote.slot, vote.confirmation_count
|
||||
);
|
||||
}
|
||||
}
|
||||
Ok("".to_string())
|
||||
}
|
||||
|
||||
fn process_deploy(
|
||||
rpc_client: &RpcClient,
|
||||
config: &WalletConfig,
|
||||
@ -635,6 +677,10 @@ pub fn process_command(config: &WalletConfig) -> ProcessResult {
|
||||
)
|
||||
}
|
||||
|
||||
WalletCommand::ShowVoteAccount(voting_account_id) => {
|
||||
process_show_staking(&rpc_client, config, &voting_account_id)
|
||||
}
|
||||
|
||||
// Deploy a custom program to the chain
|
||||
WalletCommand::Deploy(ref program_location) => {
|
||||
process_deploy(&rpc_client, config, program_location)
|
||||
|
Reference in New Issue
Block a user