Compare commits

...

28 Commits

Author SHA1 Message Date
1e0cd6549b Update testnet-participation.md 2019-04-25 21:07:50 -07:00
395a7ec96e Rename in-tree program_ids to be base-58 human readable (#4004)
automerge
2019-04-25 17:53:27 -07:00
42ee738646 Move testnet buildkite env variables back into the tree (#3989) 2019-04-25 11:45:21 -07:00
515ab21f07 Fix tar version check 2019-04-25 11:26:54 -07:00
7c5e5a06f3 Add getClusterNodes/getSlotLeader RPC API (#3980)
automerge
2019-04-24 17:49:14 -07:00
7c0c7da72d Increment Cargo.toml version to 0.13.2 2019-04-24 02:37:58 +00:00
b328e5f6ec Add genesis blockhashes to blobs (#3955)
* Add genesis blockhashes to blobs

* Update golden
2019-04-23 17:41:21 -07:00
0a4b6cedc7 Fix inserting bogus is_last blobs into blocktree (#3934) 2019-04-22 19:27:06 -07:00
d9a53eb9d4 verify that blobs match a known leader for the slot (#3927) (#3930)
* validate that blobs match a known leader for the slot

* clippy
2019-04-22 18:07:50 -07:00
a5b8ee645f Revert "Fix receiving bogus is_last blobs"
This reverts commit 1cbd1c42df.
2019-04-22 15:52:16 -07:00
1cbd1c42df Fix receiving bogus is_last blobs 2019-04-22 15:45:43 -07:00
b380bdd54f Flag vote account as configured once it has been configured 2019-04-18 19:12:32 -07:00
cb194eaee7 Ack on empty Gossip Pull Responses and keep Entrypoint around (#3881) (#3891)
* Ack on empty Gossip Pull Responses and keep Entrypoint around

* Address comments and fix test

* Update core/src/cluster_info.rs

Co-Authored-By: sagar-solana <sagar@solana.com>

* Update core/src/cluster_info.rs

Co-Authored-By: sagar-solana <sagar@solana.com>
2019-04-18 17:45:05 -07:00
ff3f810284 Reconfigure voting account on ledger restart 2019-04-18 14:33:53 -07:00
7e7e9603c9 Add packages and fix publish script (#3839) (#3880)
* Add packages and fix publish script

* Fixup
2019-04-18 14:46:46 -06:00
4c0e29cd2a Correct ./net.sh sanity argument order 2019-04-17 18:09:40 -07:00
065cf51a3f Disable testnet-sanity ledger verification, too slow 2019-04-17 15:20:57 -07:00
d4ec81fe61 Bump Cargo.toml versions to 0.13.1 (#3842) 2019-04-17 16:01:00 -06:00
e2508e5d12 Add --keypair to avoid writing a new one to ~ in CI 2019-04-17 10:13:52 -07:00
c7fea37964 testnet-beta sanity no longer tries to check inactive zones (#3822) 2019-04-17 09:38:48 -07:00
b197edea84 Add show-vote-account command (#3814) (#3820) 2019-04-17 08:30:44 -07:00
11f99faf0a Minor doc fixes++ 2019-04-16 17:45:26 -07:00
728314c96f Minor doc fixes 2019-04-16 17:44:12 -07:00
2530448474 net/ testnet nodes now stake more lamports (#3809)
* Add --bootstrap-leader-lamports

* Generalize --no-stake into --stake NUM

* Use a large stake for net/ fullnodes

* Setup vote account before starting fullnode to avoid mixed log output
2019-04-16 17:43:22 -07:00
49ad5e0b69 Preserve extra dependency annotations (optional=,features=) during version bump (#3811) 2019-04-16 15:12:03 -07:00
3c49d48666 Selectively deploy beta testnet to GCE/AWS or both clouds (#3805) (#3806) 2019-04-16 11:58:12 -07:00
2fe93101cc Remove stake from ./net sanity ephemeral validator (#3799) 2019-04-15 22:36:29 -07:00
e90d97e244 Revert "Revert "disable staking of blockstreamer node""
This reverts commit 03da63b41b.
2019-04-15 20:11:29 -07:00
82 changed files with 1125 additions and 612 deletions

351
Cargo.lock generated
View File

@ -2136,7 +2136,7 @@ dependencies = [
[[package]] [[package]]
name = "solana" name = "solana"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "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 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_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)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-budget-api 0.13.0", "solana-budget-api 0.13.2",
"solana-budget-program 0.13.0", "solana-budget-program 0.13.2",
"solana-client 0.13.0", "solana-client 0.13.2",
"solana-drone 0.13.0", "solana-drone 0.13.2",
"solana-kvstore 0.13.0", "solana-kvstore 0.13.2",
"solana-logger 0.13.0", "solana-logger 0.13.2",
"solana-metrics 0.13.0", "solana-metrics 0.13.2",
"solana-netutil 0.13.0", "solana-netutil 0.13.2",
"solana-runtime 0.13.0", "solana-runtime 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
"solana-storage-api 0.13.0", "solana-storage-api 0.13.2",
"solana-vote-api 0.13.0", "solana-vote-api 0.13.2",
"solana-vote-program 0.13.0", "solana-vote-program 0.13.2",
"solana-vote-signer 0.13.0", "solana-vote-signer 0.13.2",
"sys-info 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "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 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)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
@ -2188,85 +2188,85 @@ dependencies = [
[[package]] [[package]]
name = "solana-bench-streamer" name = "solana-bench-streamer"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
"solana 0.13.0", "solana 0.13.2",
"solana-logger 0.13.0", "solana-logger 0.13.2",
"solana-netutil 0.13.0", "solana-netutil 0.13.2",
] ]
[[package]] [[package]]
name = "solana-bench-tps" name = "solana-bench-tps"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "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)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
"solana 0.13.0", "solana 0.13.2",
"solana-client 0.13.0", "solana-client 0.13.2",
"solana-drone 0.13.0", "solana-drone 0.13.2",
"solana-logger 0.13.0", "solana-logger 0.13.2",
"solana-metrics 0.13.0", "solana-metrics 0.13.2",
"solana-netutil 0.13.0", "solana-netutil 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
] ]
[[package]] [[package]]
name = "solana-bpf-programs" name = "solana-bpf-programs"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "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)", "elf 0.0.10 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-bpfloader 0.13.0", "solana-bpfloader 0.13.2",
"solana-logger 0.13.0", "solana-logger 0.13.2",
"solana-runtime 0.13.0", "solana-runtime 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
"solana_rbpf 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "solana-bpfloader" name = "solana-bpfloader"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "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)", "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)", "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 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-logger 0.13.0", "solana-logger 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
"solana_rbpf 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "solana_rbpf 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "solana-budget-api" name = "solana-budget-api"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "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)", "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 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_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-runtime 0.13.0", "solana-runtime 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
] ]
[[package]] [[package]]
name = "solana-budget-program" name = "solana-budget-program"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"log 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)",
"solana-budget-api 0.13.0", "solana-budget-api 0.13.2",
"solana-logger 0.13.0", "solana-logger 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
] ]
[[package]] [[package]]
name = "solana-client" name = "solana-client"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "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 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_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)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-logger 0.13.0", "solana-logger 0.13.2",
"solana-netutil 0.13.0", "solana-netutil 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
] ]
[[package]] [[package]]
name = "solana-config-api" name = "solana-config-api"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "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 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_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-logger 0.13.0", "solana-logger 0.13.2",
"solana-runtime 0.13.0", "solana-runtime 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
] ]
[[package]] [[package]]
name = "solana-config-program" name = "solana-config-program"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"log 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)",
"solana-config-api 0.13.0", "solana-config-api 0.13.2",
"solana-logger 0.13.0", "solana-logger 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
] ]
[[package]] [[package]]
name = "solana-drone" name = "solana-drone"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "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)", "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 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_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-logger 0.13.0", "solana-logger 0.13.2",
"solana-metrics 0.13.0", "solana-metrics 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
"tokio 0.1.18 (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)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "solana-exchange-api" name = "solana-exchange-api"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "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 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_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-logger 0.13.0", "solana-logger 0.13.2",
"solana-runtime 0.13.0", "solana-runtime 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
] ]
[[package]] [[package]]
name = "solana-exchange-program" name = "solana-exchange-program"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"log 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)",
"solana-exchange-api 0.13.0", "solana-exchange-api 0.13.2",
"solana-logger 0.13.0", "solana-logger 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
] ]
[[package]] [[package]]
name = "solana-failure-program" name = "solana-failure-program"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"log 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)",
"solana-runtime 0.13.0", "solana-runtime 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
] ]
[[package]] [[package]]
name = "solana-fullnode" name = "solana-fullnode"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "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)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
"solana 0.13.0", "solana 0.13.2",
"solana-drone 0.13.0", "solana-drone 0.13.2",
"solana-logger 0.13.0", "solana-logger 0.13.2",
"solana-metrics 0.13.0", "solana-metrics 0.13.2",
"solana-netutil 0.13.0", "solana-netutil 0.13.2",
"solana-runtime 0.13.0", "solana-runtime 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
"solana-vote-api 0.13.0", "solana-vote-api 0.13.2",
"solana-vote-signer 0.13.0", "solana-vote-signer 0.13.2",
] ]
[[package]] [[package]]
name = "solana-genesis" name = "solana-genesis"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "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)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
"solana 0.13.0", "solana 0.13.2",
"solana-budget-api 0.13.0", "solana-budget-api 0.13.2",
"solana-config-api 0.13.0", "solana-config-api 0.13.2",
"solana-exchange-api 0.13.0", "solana-exchange-api 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
"solana-storage-api 0.13.0", "solana-stake-api 0.13.2",
"solana-token-api 0.13.0", "solana-storage-api 0.13.2",
"solana-vote-api 0.13.0", "solana-token-api 0.13.2",
"solana-vote-api 0.13.2",
] ]
[[package]] [[package]]
name = "solana-gossip" name = "solana-gossip"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
"solana 0.13.0", "solana 0.13.2",
"solana-netutil 0.13.0", "solana-netutil 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
] ]
[[package]] [[package]]
name = "solana-install" name = "solana-install"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "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 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_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)", "serde_yaml 0.8.8 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-client 0.13.0", "solana-client 0.13.2",
"solana-config-api 0.13.0", "solana-config-api 0.13.2",
"solana-logger 0.13.0", "solana-logger 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
"tar 0.4.22 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "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)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
@ -2431,16 +2432,16 @@ dependencies = [
[[package]] [[package]]
name = "solana-keygen" name = "solana-keygen"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "dirs 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
] ]
[[package]] [[package]]
name = "solana-kvstore" name = "solana-kvstore"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
@ -2455,40 +2456,40 @@ dependencies = [
[[package]] [[package]]
name = "solana-ledger-tool" name = "solana-ledger-tool"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"assert_cmd 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "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)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
"solana 0.13.0", "solana 0.13.2",
"solana-logger 0.13.0", "solana-logger 0.13.2",
"solana-runtime 0.13.0", "solana-runtime 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
] ]
[[package]] [[package]]
name = "solana-logger" name = "solana-logger"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "solana-metrics" name = "solana-metrics"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"influx_db_client 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "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)", "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)", "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)", "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)", "sys-info 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "solana-netutil" name = "solana-netutil"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"ipnetwork 0.12.8 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "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)", "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)", "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)", "socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-logger 0.13.0", "solana-logger 0.13.2",
] ]
[[package]] [[package]]
name = "solana-noop-program" name = "solana-noop-program"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"log 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)",
"solana-logger 0.13.0", "solana-logger 0.13.2",
"solana-runtime 0.13.0", "solana-runtime 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
] ]
[[package]] [[package]]
name = "solana-replicator" name = "solana-replicator"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
"solana 0.13.0", "solana 0.13.2",
"solana-logger 0.13.0", "solana-logger 0.13.2",
"solana-netutil 0.13.0", "solana-netutil 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
] ]
[[package]] [[package]]
name = "solana-runtime" name = "solana-runtime"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "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 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_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)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-logger 0.13.0", "solana-logger 0.13.2",
"solana-metrics 0.13.0", "solana-metrics 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
"solana-vote-api 0.13.0", "solana-vote-api 0.13.2",
] ]
[[package]] [[package]]
name = "solana-sdk" name = "solana-sdk"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
@ -2568,109 +2569,109 @@ dependencies = [
[[package]] [[package]]
name = "solana-stake-api" name = "solana-stake-api"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "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 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_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-logger 0.13.0", "solana-logger 0.13.2",
"solana-metrics 0.13.0", "solana-metrics 0.13.2",
"solana-runtime 0.13.0", "solana-runtime 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
"solana-vote-api 0.13.0", "solana-vote-api 0.13.2",
] ]
[[package]] [[package]]
name = "solana-stake-program" name = "solana-stake-program"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"log 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)",
"solana-logger 0.13.0", "solana-logger 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
"solana-stake-api 0.13.0", "solana-stake-api 0.13.2",
] ]
[[package]] [[package]]
name = "solana-storage-api" name = "solana-storage-api"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "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 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_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-logger 0.13.0", "solana-logger 0.13.2",
"solana-runtime 0.13.0", "solana-runtime 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
] ]
[[package]] [[package]]
name = "solana-storage-program" name = "solana-storage-program"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"log 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)",
"solana-logger 0.13.0", "solana-logger 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
"solana-storage-api 0.13.0", "solana-storage-api 0.13.2",
] ]
[[package]] [[package]]
name = "solana-token-api" name = "solana-token-api"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "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 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_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-logger 0.13.0", "solana-logger 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
] ]
[[package]] [[package]]
name = "solana-token-program" name = "solana-token-program"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"log 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)",
"solana-logger 0.13.0", "solana-logger 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
"solana-token-api 0.13.0", "solana-token-api 0.13.2",
] ]
[[package]] [[package]]
name = "solana-upload-perf" name = "solana-upload-perf"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"serde_json 1.0.39 (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-metrics 0.13.2",
] ]
[[package]] [[package]]
name = "solana-vote-api" name = "solana-vote-api"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "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 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_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-logger 0.13.0", "solana-logger 0.13.2",
"solana-metrics 0.13.0", "solana-metrics 0.13.2",
"solana-runtime 0.13.0", "solana-runtime 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
] ]
[[package]] [[package]]
name = "solana-vote-program" name = "solana-vote-program"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"log 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)",
"solana-logger 0.13.0", "solana-logger 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
"solana-vote-api 0.13.0", "solana-vote-api 0.13.2",
] ]
[[package]] [[package]]
name = "solana-vote-signer" name = "solana-vote-signer"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "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)", "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 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)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-metrics 0.13.0", "solana-metrics 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
] ]
[[package]] [[package]]
name = "solana-wallet" name = "solana-wallet"
version = "0.13.0" version = "0.13.2"
dependencies = [ dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "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)", "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)", "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)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
"solana 0.13.0", "solana 0.13.2",
"solana-budget-api 0.13.0", "solana-budget-api 0.13.2",
"solana-budget-program 0.13.0", "solana-budget-program 0.13.2",
"solana-client 0.13.0", "solana-client 0.13.2",
"solana-drone 0.13.0", "solana-drone 0.13.2",
"solana-logger 0.13.0", "solana-logger 0.13.2",
"solana-netutil 0.13.0", "solana-netutil 0.13.2",
"solana-sdk 0.13.0", "solana-sdk 0.13.2",
"solana-vote-api 0.13.0", "solana-vote-api 0.13.2",
"solana-vote-signer 0.13.0", "solana-vote-signer 0.13.2",
] ]
[[package]] [[package]]

View File

@ -2,16 +2,16 @@
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-bench-streamer" name = "solana-bench-streamer"
version = "0.13.0" version = "0.13.2"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
[dependencies] [dependencies]
clap = "2.33.0" clap = "2.33.0"
solana = { path = "../core", version = "0.13.0" } solana = { path = "../core", version = "0.13.2" }
solana-logger = { path = "../logger", version = "0.13.0" } solana-logger = { path = "../logger", version = "0.13.2" }
solana-netutil = { path = "../netutil", version = "0.13.0" } solana-netutil = { path = "../netutil", version = "0.13.2" }
[features] [features]
cuda = ["solana/cuda"] cuda = ["solana/cuda"]

View File

@ -2,7 +2,7 @@
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-bench-tps" name = "solana-bench-tps"
version = "0.13.0" version = "0.13.2"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@ -11,13 +11,13 @@ homepage = "https://solana.com/"
clap = "2.33.0" clap = "2.33.0"
rayon = "1.0.3" rayon = "1.0.3"
serde_json = "1.0.39" serde_json = "1.0.39"
solana = { path = "../core", version = "0.13.0" } solana = { path = "../core", version = "0.13.2" }
solana-client = { path = "../client", version = "0.13.0" } solana-client = { path = "../client", version = "0.13.2" }
solana-drone = { path = "../drone", version = "0.13.0" } solana-drone = { path = "../drone", version = "0.13.2" }
solana-logger = { path = "../logger", version = "0.13.0" } solana-logger = { path = "../logger", version = "0.13.2" }
solana-metrics = { path = "../metrics", version = "0.13.0" } solana-metrics = { path = "../metrics", version = "0.13.2" }
solana-netutil = { path = "../netutil", version = "0.13.0" } solana-netutil = { path = "../netutil", version = "0.13.2" }
solana-sdk = { path = "../sdk", version = "0.13.0" } solana-sdk = { path = "../sdk", version = "0.13.2" }
[features] [features]
cuda = ["solana/cuda"] cuda = ["solana/cuda"]

View File

@ -24,8 +24,10 @@ Methods
* [confirmTransaction](#confirmtransaction) * [confirmTransaction](#confirmtransaction)
* [getAccountInfo](#getaccountinfo) * [getAccountInfo](#getaccountinfo)
* [getBalance](#getbalance) * [getBalance](#getbalance)
* [getClusterNodes](#getclusternodes)
* [getRecentBlockhash](#getrecentblockhash) * [getRecentBlockhash](#getrecentblockhash)
* [getSignatureStatus](#getsignaturestatus) * [getSignatureStatus](#getsignaturestatus)
* [getSlotLeader](#getslotleader)
* [getNumBlocksSinceSignatureConfirmation](#getnumblockssincesignatureconfirmation) * [getNumBlocksSinceSignatureConfirmation](#getnumblockssincesignatureconfirmation)
* [getTransactionCount](#gettransactioncount) * [getTransactionCount](#gettransactioncount)
* [requestAirdrop](#requestairdrop) * [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 ### getAccountInfo
Returns all information associated with the account of provided Pubkey 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} {"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 ### getNumBlocksSinceSignatureConfirmation
Returns the current number of blocks since signature has been confirmed. Returns the current number of blocks since signature has been confirmed.

View File

@ -9,7 +9,8 @@ in future releases.
The beta testnet features a validator running at beta.testnet.solana.com, which The beta testnet features a validator running at beta.testnet.solana.com, which
serves as the entrypoint to the cluster for your validator. 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://beta.testnet.solana.com/](http://beta.testnet.solana.com/).
The beta testnet is configured to reset the ledger every 24hours, or sooner The beta testnet is configured to reset the ledger every 24hours, or sooner
should an hourly automated sanity test fail. should an hourly automated sanity test fail.
@ -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). Prebuilt binaries are available for Linux x86_64 (Ubuntu 18.04 recommended).
MacOS or WSL users may build from source. 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://beta.testnet.solana.com:8899
```
Inspect the blockexplorer at [http://beta.testnet.solana.com/](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
```
View the [metrics dashboard](https://metrics.solana.com:3000/d/testnet-edge/testnet-monitor-edge?var-testnet=testnet-beta)
for more detail on cluster activity.
### Validator Setup ### Validator Setup
#### Obtaining The Software #### Obtaining The Software
##### Bootstrap with `solana-install` ##### Bootstrap with `solana-install`
@ -35,7 +57,7 @@ software on Linux x86_64 systems.
Install the latest release with a single shell command: Install the latest release with a single shell command:
```bash ```bash
$ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.13.0/install/solana-install-init.sh | \ $ 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.beta.testnet.solana.com
``` ```
Alternatively build the `solana-install` program from source and run the Alternatively build the `solana-install` program from source and run the
@ -67,47 +89,31 @@ $ ./scripts/cargo-install-all.sh .
$ export PATH=$PWD/bin:$PATH $ export PATH=$PWD/bin:$PATH
``` ```
#### Confirm The Testnet Is Reachable ### Starting The Validator
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: Sanity check that you are able to interact with the cluster by receiving a small
airdrop of lamports from the testnet drone:
```bash ```bash
$ solana-wallet -n beta.testnet.solana.com airdrop 123 $ solana-wallet -n beta.testnet.solana.com airdrop 123
$ solana-wallet -n beta.testnet.solana.com balance $ solana-wallet -n beta.testnet.solana.com balance
``` ```
Fetch the current testnet transaction count over JSON RPC: Then the following command will start a new validator node.
```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.
If this is a `solana-install`-installation: If this is a `solana-install`-installation:
```bash ```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 beta.testnet.solana.com
``` ```
Alternatively, the `solana-install run` command can be used to run the validator Alternatively, the `solana-install run` command can be used to run the validator
node while periodically checking for and applying software updates: node while periodically checking for and applying software updates:
```bash ```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 beta.testnet.solana.com
``` ```
When not using `solana-install`: When not using `solana-install`:
```bash ```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 beta.testnet.solana.com
``` ```
Then from another console, confirm the IP address if your node is now visible in Then from another console, confirm the IP address if your node is now visible in
@ -133,4 +139,3 @@ 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-beta,u=${u:?},p=${p:?}"
source scripts/configure-metrics.sh 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).

View File

@ -55,7 +55,7 @@ while getopts "ch?i:k:brxR" opt; do
restartInterval=$OPTARG restartInterval=$OPTARG
;; ;;
b) b)
maybeNoLeaderRotation="--only-bootstrap-stake" maybeNoLeaderRotation="--stake 0"
;; ;;
x) x)
extraNodes=$((extraNodes + 1)) extraNodes=$((extraNodes + 1))
@ -78,7 +78,6 @@ source scripts/configure-metrics.sh
nodes=( nodes=(
"multinode-demo/drone.sh" "multinode-demo/drone.sh"
"multinode-demo/bootstrap-leader.sh \ "multinode-demo/bootstrap-leader.sh \
$maybeNoLeaderRotation \
--enable-rpc-exit \ --enable-rpc-exit \
--init-complete-file init-complete-node1.log" --init-complete-file init-complete-node1.log"
"multinode-demo/fullnode.sh \ "multinode-demo/fullnode.sh \

View File

@ -19,9 +19,10 @@ CRATES=(
metrics metrics
client client
drone 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 runtime
programs/{budget,bpf_loader,config,vote,storage,token,vote}
vote-signer vote-signer
core core
fullnode fullnode
@ -32,7 +33,6 @@ CRATES=(
install install
) )
# Only package/publish if this is a tagged release # Only package/publish if this is a tagged release
[[ -n $TRIGGERED_BUILDKITE_TAG ]] || { [[ -n $TRIGGERED_BUILDKITE_TAG ]] || {
echo TRIGGERED_BUILDKITE_TAG unset, skipped echo TRIGGERED_BUILDKITE_TAG unset, skipped
@ -55,7 +55,7 @@ for crate in "${CRATES[@]}"; do
exit 1 exit 1
fi fi
echo "-- $crate" echo "-- $crate"
grep -q "^version = \"$expectedCrateVersion\"$" Cargo.toml || { grep -q "^version = \"$expectedCrateVersion\"$" "$crate"/Cargo.toml || {
echo "Error: $crate/Cargo.toml version is not $expectedCrateVersion" echo "Error: $crate/Cargo.toml version is not $expectedCrateVersion"
exit 1 exit 1
} }

View File

@ -64,6 +64,35 @@ EOF
exit 0 exit 0
fi 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
;;
*)
echo "Error: Invalid TESTNET=$TESTNET"
exit 1
;;
esac
if [[ -n $TESTNET_DB_HOST ]]; then if [[ -n $TESTNET_DB_HOST ]]; then
SOLANA_METRICS_PARTIAL_CONFIG="host=$TESTNET_DB_HOST,$SOLANA_METRICS_PARTIAL_CONFIG" SOLANA_METRICS_PARTIAL_CONFIG="host=$TESTNET_DB_HOST,$SOLANA_METRICS_PARTIAL_CONFIG"
fi fi
@ -72,31 +101,9 @@ export SOLANA_METRICS_CONFIG="db=$TESTNET,$SOLANA_METRICS_PARTIAL_CONFIG"
echo "SOLANA_METRICS_CONFIG: $SOLANA_METRICS_CONFIG" echo "SOLANA_METRICS_CONFIG: $SOLANA_METRICS_CONFIG"
source scripts/configure-metrics.sh source scripts/configure-metrics.sh
ci/channel-info.sh
eval "$(ci/channel-info.sh)"
if [[ -n $TESTNET_TAG ]]; then if [[ -n $TESTNET_TAG ]]; then
CHANNEL_OR_TAG=$TESTNET_TAG CHANNEL_OR_TAG=$TESTNET_TAG
else 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 if [[ $BUILDKITE_BRANCH != "$CHANNEL_BRANCH" ]]; then
( (
cat <<EOF cat <<EOF
@ -124,7 +131,8 @@ sanity() {
testnet-edge) testnet-edge)
( (
set -x 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) testnet-edge-perf)
@ -139,22 +147,21 @@ sanity() {
testnet-beta) testnet-beta)
( (
set -x 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) ok=true
for zone in "${GCE_ZONES[@]}"; do if [[ -n $EC2_NODE_COUNT ]]; then
if ! $ok; then NO_LEDGER_VERIFY=1 \
break 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 fi
ci/testnet-sanity.sh beta-testnet-solana-com gce "$zone" || ok=false NO_LEDGER_VERIFY=1 \
done ci/testnet-sanity.sh beta-testnet-solana-com gce "${GCE_ZONES[0]}" || ok=false
fi
$ok $ok
) )
;; ;;
@ -170,7 +177,8 @@ sanity() {
testnet) testnet)
( (
set -x 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 #ci/testnet-sanity.sh testnet-solana-com gce us-east1-c
) )
;; ;;
@ -227,8 +235,6 @@ start() {
testnet-beta) testnet-beta)
( (
set -x 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 ..." # Build an array to pass as opts to testnet-deploy.sh: "-z zone1 -z zone2 ..."
GCE_ZONE_ARGS=() GCE_ZONE_ARGS=()
@ -241,19 +247,23 @@ start() {
EC2_ZONE_ARGS+=("-z $val") EC2_ZONE_ARGS+=("-z $val")
done done
[[ -n $EC2_NODE_COUNT ]] || EC2_NODE_COUNT=60 if [[ -n $EC2_NODE_COUNT ]]; then
[[ -n $GCE_NODE_COUNT ]] || GCE_NODE_COUNT=40 # 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 if [[ -n $GCE_NODE_COUNT ]]; then
ci/testnet-deploy.sh -p beta-testnet-solana-com -C ec2 ${EC2_ZONE_ARGS[@]} \ # shellcheck disable=SC2068
-t "$CHANNEL_OR_TAG" -n "$EC2_NODE_COUNT" -c 0 -s -u -P -a eipalloc-0f286cf8a0771ce35 \ ci/testnet-deploy.sh -p beta-testnet-solana-com -C gce ${GCE_ZONE_ARGS[@]} \
${maybeReuseLedger:+-r} \ -t "$CHANNEL_OR_TAG" -n "$GCE_NODE_COUNT" -c 0 -P \
${maybeDelete:+-D} ${maybeReuseLedger:+-r} \
# shellcheck disable=SC2068 ${maybeDelete:+-D} \
ci/testnet-deploy.sh -p beta-testnet-solana-com -C gce ${GCE_ZONE_ARGS[@]} \ ${EC2_NODE_COUNT:+-x}
-t "$CHANNEL_OR_TAG" -n "$GCE_NODE_COUNT" -c 0 -x -P \ fi
${maybeReuseLedger:+-r} \
${maybeDelete:+-D}
) )
;; ;;
testnet-beta-perf) testnet-beta-perf)

View File

@ -11,13 +11,13 @@ usage() {
echo "Error: $*" echo "Error: $*"
fi fi
cat <<EOF 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 name - name of the network
cloud - cloud provider to use (gce, ec2) cloud - cloud provider to use (gce, ec2)
zone - cloud provider zone of the network zone1 .. zoneN - cloud provider zones to check
Note: the SOLANA_METRICS_CONFIG environment variable is used to configure Note: the SOLANA_METRICS_CONFIG environment variable is used to configure
metrics metrics
@ -27,10 +27,10 @@ EOF
netName=$1 netName=$1
cloudProvider=$2 cloudProvider=$2
zone=$3
[[ -n $netName ]] || usage "" [[ -n $netName ]] || usage ""
[[ -n $cloudProvider ]] || usage "Cloud provider not specified" [[ -n $cloudProvider ]] || usage "Cloud provider not specified"
[[ -n $zone ]] || usage "Zone not specified" shift 2
[[ -n $1 ]] || usage "zone1 not specified"
shutdown() { shutdown() {
exitcode=$? exitcode=$?
@ -52,17 +52,20 @@ rm -f net/config/config
trap shutdown EXIT INT trap shutdown EXIT INT
set -x set -x
echo "--- $cloudProvider.sh config" for zone in "$@"; do
timeout 5m net/"$cloudProvider".sh config -p "$netName" -z "$zone" echo "--- $cloudProvider config [$zone]"
net/init-metrics.sh -e timeout 5m net/"$cloudProvider".sh config -p "$netName" -z "$zone"
echo "+++ $cloudProvider.sh info" net/init-metrics.sh -e
net/"$cloudProvider".sh info echo "+++ $cloudProvider.sh info"
echo --- net.sh sanity net/"$cloudProvider".sh info
ok=true echo "--- net.sh sanity [$cloudProvider:$zone]"
timeout 5m net/net.sh sanity \ ok=true
${NO_LEDGER_VERIFY:+-o noLedgerVerify} \ timeout 5m net/net.sh sanity \
${NO_VALIDATOR_SANITY:+-o noValidatorSanity} \ ${NO_LEDGER_VERIFY:+-o noLedgerVerify} \
${REJECT_EXTRA_NODES:+-o rejectExtraNodes} || ok=false ${NO_VALIDATOR_SANITY:+-o noValidatorSanity} \
${REJECT_EXTRA_NODES:+-o rejectExtraNodes} \
$zone || ok=false
net/net.sh logs net/net.sh logs
$ok $ok
done

View File

@ -1,6 +1,6 @@
[package] [package]
name = "solana-client" name = "solana-client"
version = "0.13.0" version = "0.13.2"
description = "Solana Client" description = "Solana Client"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@ -17,10 +17,10 @@ reqwest = "0.9.11"
serde = "1.0.89" serde = "1.0.89"
serde_derive = "1.0.88" serde_derive = "1.0.88"
serde_json = "1.0.39" serde_json = "1.0.39"
solana-netutil = { path = "../netutil", version = "0.13.0" } solana-netutil = { path = "../netutil", version = "0.13.2" }
solana-sdk = { path = "../sdk", version = "0.13.0" } solana-sdk = { path = "../sdk", version = "0.13.2" }
[dev-dependencies] [dev-dependencies]
jsonrpc-core = "10.1.0" jsonrpc-core = "10.1.0"
jsonrpc-http-server = "10.1.0" jsonrpc-http-server = "10.1.0"
solana-logger = { path = "../logger", version = "0.13.0" } solana-logger = { path = "../logger", version = "0.13.2" }

View File

@ -1,7 +1,7 @@
[package] [package]
name = "solana" name = "solana"
description = "Blockchain, Rebuilt for Scale" description = "Blockchain, Rebuilt for Scale"
version = "0.13.0" version = "0.13.2"
documentation = "https://docs.rs/solana" documentation = "https://docs.rs/solana"
homepage = "https://solana.com/" homepage = "https://solana.com/"
readme = "../README.md" readme = "../README.md"
@ -46,18 +46,18 @@ rocksdb = "0.11.0"
serde = "1.0.89" serde = "1.0.89"
serde_derive = "1.0.88" serde_derive = "1.0.88"
serde_json = "1.0.39" serde_json = "1.0.39"
solana-budget-api = { path = "../programs/budget_api", version = "0.13.0" } solana-budget-api = { path = "../programs/budget_api", version = "0.13.2" }
solana-client = { path = "../client", version = "0.13.0" } solana-client = { path = "../client", version = "0.13.2" }
solana-drone = { path = "../drone", version = "0.13.0" } solana-drone = { path = "../drone", version = "0.13.2" }
solana-kvstore = { path = "../kvstore", version = "0.13.0", optional = true } solana-kvstore = { path = "../kvstore", version = "0.13.2", optional = true }
solana-logger = { path = "../logger", version = "0.13.0" } solana-logger = { path = "../logger", version = "0.13.2" }
solana-metrics = { path = "../metrics", version = "0.13.0" } solana-metrics = { path = "../metrics", version = "0.13.2" }
solana-netutil = { path = "../netutil", version = "0.13.0" } solana-netutil = { path = "../netutil", version = "0.13.2" }
solana-runtime = { path = "../runtime", version = "0.13.0" } solana-runtime = { path = "../runtime", version = "0.13.2" }
solana-sdk = { path = "../sdk", version = "0.13.0" } solana-sdk = { path = "../sdk", version = "0.13.2" }
solana-storage-api = { path = "../programs/storage_api", version = "0.13.0" } solana-storage-api = { path = "../programs/storage_api", version = "0.13.2" }
solana-vote-api = { path = "../programs/vote_api", version = "0.13.0" } solana-vote-api = { path = "../programs/vote_api", version = "0.13.2" }
solana-vote-signer = { path = "../vote-signer", version = "0.13.0" } solana-vote-signer = { path = "../vote-signer", version = "0.13.2" }
sys-info = "0.5.6" sys-info = "0.5.6"
tokio = "0.1" tokio = "0.1"
tokio-codec = "0.1" tokio-codec = "0.1"
@ -66,8 +66,8 @@ untrusted = "0.6.2"
[dev-dependencies] [dev-dependencies]
hex-literal = "0.1.4" hex-literal = "0.1.4"
matches = "0.1.6" matches = "0.1.6"
solana-vote-program = { path = "../programs/vote_program", version = "0.13.0" } solana-vote-program = { path = "../programs/vote_program", version = "0.13.2" }
solana-budget-program = { path = "../programs/budget_program", version = "0.13.0" } solana-budget-program = { path = "../programs/budget_program", version = "0.13.2" }
[[bench]] [[bench]]
name = "banking_stage" name = "banking_stage"

View File

@ -296,8 +296,8 @@ impl Blocktree {
let slot_meta = &mut entry.0.borrow_mut(); let slot_meta = &mut entry.0.borrow_mut();
// This slot is full, skip the bogus blob // Check if this blob should be inserted
if slot_meta.is_full() { if !self.should_insert_blob(&slot_meta, &prev_inserted_blob_datas, blob) {
continue; continue;
} }
@ -1036,12 +1036,6 @@ impl Blocktree {
let blob_slot = blob_to_insert.slot(); let blob_slot = blob_to_insert.slot();
let blob_size = blob_to_insert.size(); 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 = { let new_consumed = {
if slot_meta.consumed == blob_index { if slot_meta.consumed == blob_index {
let blob_datas = self.get_slot_consecutive_blobs( let blob_datas = self.get_slot_consecutive_blobs(
@ -1276,6 +1270,64 @@ impl Blocktree {
self.db.write(batch)?; self.db.write(batch)?;
Ok(()) 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). // 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"); 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")] #[cfg(feature = "erasure")]
mod erasure { mod erasure {
use super::*; use super::*;

View File

@ -5,7 +5,7 @@ use crate::cluster_info::{ClusterInfo, ClusterInfoError, DATA_PLANE_FANOUT};
use crate::entry::{EntrySender, EntrySlice}; use crate::entry::{EntrySender, EntrySlice};
#[cfg(feature = "erasure")] #[cfg(feature = "erasure")]
use crate::erasure::CodingGenerator; use crate::erasure::CodingGenerator;
use crate::packet::index_blobs; use crate::packet::index_blobs_with_genesis;
use crate::poh_recorder::WorkingBankEntries; use crate::poh_recorder::WorkingBankEntries;
use crate::result::{Error, Result}; use crate::result::{Error, Result};
use crate::service::Service; use crate::service::Service;
@ -13,6 +13,7 @@ use crate::staking_utils;
use rayon::prelude::*; use rayon::prelude::*;
use solana_metrics::counter::Counter; use solana_metrics::counter::Counter;
use solana_metrics::{influxdb, submit}; use solana_metrics::{influxdb, submit};
use solana_sdk::hash::Hash;
use solana_sdk::pubkey::Pubkey; use solana_sdk::pubkey::Pubkey;
use solana_sdk::timing::duration_as_ms; use solana_sdk::timing::duration_as_ms;
use std::net::UdpSocket; use std::net::UdpSocket;
@ -42,6 +43,7 @@ impl Broadcast {
sock: &UdpSocket, sock: &UdpSocket,
blocktree: &Arc<Blocktree>, blocktree: &Arc<Blocktree>,
storage_entry_sender: &EntrySender, storage_entry_sender: &EntrySender,
genesis_blockhash: &Hash,
) -> Result<()> { ) -> Result<()> {
let timer = Duration::new(1, 0); let timer = Duration::new(1, 0);
let (mut bank, entries) = receiver.recv_timeout(timer)?; let (mut bank, entries) = receiver.recv_timeout(timer)?;
@ -103,9 +105,10 @@ impl Broadcast {
.map(|meta| meta.consumed) .map(|meta| meta.consumed)
.unwrap_or(0); .unwrap_or(0);
index_blobs( index_blobs_with_genesis(
&blobs, &blobs,
&self.id, &self.id,
genesis_blockhash,
blob_index, blob_index,
bank.slot(), bank.slot(),
bank.parent().map_or(0, |parent| parent.slot()), bank.parent().map_or(0, |parent| parent.slot()),
@ -192,6 +195,7 @@ impl BroadcastStage {
receiver: &Receiver<WorkingBankEntries>, receiver: &Receiver<WorkingBankEntries>,
blocktree: &Arc<Blocktree>, blocktree: &Arc<Blocktree>,
storage_entry_sender: EntrySender, storage_entry_sender: EntrySender,
genesis_blockhash: &Hash,
) -> BroadcastStageReturnType { ) -> BroadcastStageReturnType {
let me = cluster_info.read().unwrap().my_data().clone(); let me = cluster_info.read().unwrap().my_data().clone();
@ -208,6 +212,7 @@ impl BroadcastStage {
sock, sock,
blocktree, blocktree,
&storage_entry_sender, &storage_entry_sender,
genesis_blockhash,
) { ) {
match e { match e {
Error::RecvTimeoutError(RecvTimeoutError::Disconnected) | Error::SendError => { Error::RecvTimeoutError(RecvTimeoutError::Disconnected) | Error::SendError => {
@ -247,9 +252,11 @@ impl BroadcastStage {
exit_sender: &Arc<AtomicBool>, exit_sender: &Arc<AtomicBool>,
blocktree: &Arc<Blocktree>, blocktree: &Arc<Blocktree>,
storage_entry_sender: EntrySender, storage_entry_sender: EntrySender,
genesis_blockhash: &Hash,
) -> Self { ) -> Self {
let blocktree = blocktree.clone(); let blocktree = blocktree.clone();
let exit_sender = exit_sender.clone(); let exit_sender = exit_sender.clone();
let genesis_blockhash = *genesis_blockhash;
let thread_hdl = Builder::new() let thread_hdl = Builder::new()
.name("solana-broadcaster".to_string()) .name("solana-broadcaster".to_string())
.spawn(move || { .spawn(move || {
@ -260,6 +267,7 @@ impl BroadcastStage {
&receiver, &receiver,
&blocktree, &blocktree,
storage_entry_sender, storage_entry_sender,
&genesis_blockhash,
) )
}) })
.unwrap(); .unwrap();
@ -331,6 +339,7 @@ mod test {
&exit_sender, &exit_sender,
&blocktree, &blocktree,
storage_sender, storage_sender,
&Hash::default(),
); );
MockBroadcastStage { MockBroadcastStage {

View File

@ -164,7 +164,7 @@ mod tests {
use bs58; use bs58;
// golden needs to be updated if blob stuff changes.... // golden needs to be updated if blob stuff changes....
let golden = Hash::new( let golden = Hash::new(
&bs58::decode("5NBn4cBZmNZRftkjxj3um8W1eyYPzn2RgUJSA3SVbHaJ") &bs58::decode("F5zEvoozmV87cgS1sfG226nYSJoupRjKA93QUQiWd31E")
.into_vec() .into_vec()
.unwrap(), .unwrap(),
); );

View File

@ -338,6 +338,17 @@ impl ClusterInfo {
.collect() .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> { pub fn gossip_peers(&self) -> Vec<ContactInfo> {
let me = self.my_data().id; let me = self.my_data().id;
self.gossip self.gossip
@ -853,8 +864,6 @@ impl ClusterInfo {
.collect(); .collect();
if pr.is_empty() { if pr.is_empty() {
self.add_entrypoint(&mut pr); self.add_entrypoint(&mut pr);
} else {
self.entrypoint = None;
} }
pr.into_iter() pr.into_iter()
.map(|(peer, filter, gossip, self_info)| { .map(|(peer, filter, gossip, self_info)| {
@ -1071,21 +1080,16 @@ impl ClusterInfo {
.process_pull_request(caller, filter, now); .process_pull_request(caller, filter, now);
let len = data.len(); let len = data.len();
trace!("get updates since response {}", len); trace!("get updates since response {}", len);
if data.is_empty() { let rsp = Protocol::PullResponse(self_id, data);
trace!("no updates me {}", self_id); // The remote node may not know its public IP:PORT. Record what it looks like to us.
vec![] // This may or may not be correct for everybody, but it's better than leaving the remote with
} else { // an unspecified address in our table
let rsp = Protocol::PullResponse(self_id, data); if from.gossip.ip().is_unspecified() {
// the remote side may not know his public IP:PORT, record what he looks like to us inc_new_counter_info!("cluster_info-window-request-updates-unspec-gossip", 1);
// this may or may not be correct for everybody but it's better than leaving him with from.gossip = *from_addr;
// 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()
} }
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>) { fn handle_pull_response(me: &Arc<RwLock<Self>>, from: &Pubkey, data: Vec<CrdsValue>) {
let len = data.len(); let len = data.len();
@ -2200,5 +2204,5 @@ fn test_add_entrypoint() {
.unwrap() .unwrap()
.new_pull_requests(&HashMap::new()); .new_pull_requests(&HashMap::new());
assert_eq!(1, pulls.len()); assert_eq!(1, pulls.len());
assert_eq!(cluster_info.read().unwrap().entrypoint, None); assert_eq!(cluster_info.read().unwrap().entrypoint, Some(entrypoint));
} }

View File

@ -100,6 +100,7 @@ impl Fullnode {
let exit = Arc::new(AtomicBool::new(false)); let exit = Arc::new(AtomicBool::new(false));
let bank_info = &bank_forks_info[0]; let bank_info = &bank_forks_info[0];
let bank = bank_forks[bank_info.bank_slot].clone(); let bank = bank_forks[bank_info.bank_slot].clone();
let genesis_blockhash = bank.last_blockhash();
info!( info!(
"starting PoH... {} {}", "starting PoH... {} {}",
@ -232,6 +233,7 @@ impl Fullnode {
sender.clone(), sender.clone(),
receiver, receiver,
&exit, &exit,
&genesis_blockhash,
); );
let tpu = Tpu::new( let tpu = Tpu::new(
&id, &id,
@ -245,6 +247,7 @@ impl Fullnode {
&blocktree, &blocktree,
sender, sender,
&exit, &exit,
&genesis_blockhash,
); );
inc_new_counter_info!("fullnode-new", 1); inc_new_counter_info!("fullnode-new", 1);

View File

@ -5,6 +5,7 @@ use bincode;
use byteorder::{ByteOrder, LittleEndian}; use byteorder::{ByteOrder, LittleEndian};
use serde::Serialize; use serde::Serialize;
use solana_metrics::counter::Counter; use solana_metrics::counter::Counter;
use solana_sdk::hash::Hash;
pub use solana_sdk::packet::PACKET_DATA_SIZE; pub use solana_sdk::packet::PACKET_DATA_SIZE;
use solana_sdk::pubkey::Pubkey; use solana_sdk::pubkey::Pubkey;
use std::borrow::Borrow; 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 INDEX_RANGE: std::ops::Range<usize> = range!(SLOT_RANGE.end, u64);
const ID_RANGE: std::ops::Range<usize> = range!(INDEX_RANGE.end, Pubkey); 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 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); const SIZE_RANGE: std::ops::Range<usize> = range!(FLAGS_RANGE.end, u64);
macro_rules! align { macro_rules! align {
@ -439,6 +441,14 @@ impl Blob {
self.data[FORWARD_RANGE][0] = u8::from(forward) 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 { pub fn flags(&self) -> u32 {
LittleEndian::read_u32(&self.data[FLAGS_RANGE]) 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 // enumerate all the blobs, those are the indices
for blob in blobs.iter() { for blob in blobs.iter() {
let mut blob = blob.write().unwrap(); let mut blob = blob.write().unwrap();
blob.set_index(blob_index); blob.set_index(blob_index);
blob.set_genesis_blockhash(genesis);
blob.set_slot(slot); blob.set_slot(slot);
blob.set_parent(parent); blob.set_parent(parent);
blob.set_id(id); blob.set_id(id);
@ -835,4 +857,14 @@ mod tests {
assert!(p1 != p2); 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);
}
} }

View File

@ -20,7 +20,6 @@ use solana_client::rpc_client::RpcClient;
use solana_client::rpc_request::RpcRequest; use solana_client::rpc_request::RpcRequest;
use solana_client::thin_client::{create_client, ThinClient}; use solana_client::thin_client::{create_client, ThinClient};
use solana_sdk::client::{AsyncClient, SyncClient}; use solana_sdk::client::{AsyncClient, SyncClient};
use solana_sdk::hash::{Hash, Hasher}; use solana_sdk::hash::{Hash, Hasher};
use solana_sdk::signature::{Keypair, KeypairUtil, Signature}; use solana_sdk::signature::{Keypair, KeypairUtil, Signature};
use solana_sdk::system_transaction; use solana_sdk::system_transaction;
@ -239,6 +238,7 @@ impl Replicator {
let (retransmit_sender, retransmit_receiver) = channel(); let (retransmit_sender, retransmit_receiver) = channel();
let window_service = WindowService::new( let window_service = WindowService::new(
None, //TODO: need a way to validate blobs... https://github.com/solana-labs/solana/issues/3924
blocktree.clone(), blocktree.clone(),
cluster_info.clone(), cluster_info.clone(),
blob_fetch_receiver, blob_fetch_receiver,
@ -246,6 +246,7 @@ impl Replicator {
repair_socket, repair_socket,
&exit, &exit,
Some(repair_slot_range), Some(repair_slot_range),
&Hash::default(),
); );
let client = create_client(cluster_entrypoint.client_facing_addr(), FULLNODE_PORT_RANGE); let client = create_client(cluster_entrypoint.client_facing_addr(), FULLNODE_PORT_RANGE);

View File

@ -14,6 +14,7 @@ use crate::streamer::BlobReceiver;
use crate::window_service::WindowService; use crate::window_service::WindowService;
use solana_metrics::counter::Counter; use solana_metrics::counter::Counter;
use solana_metrics::{influxdb, submit}; use solana_metrics::{influxdb, submit};
use solana_sdk::hash::Hash;
use std::net::UdpSocket; use std::net::UdpSocket;
use std::sync::atomic::AtomicBool; use std::sync::atomic::AtomicBool;
use std::sync::mpsc::channel; use std::sync::mpsc::channel;
@ -79,6 +80,7 @@ fn retransmitter(
cluster_info: Arc<RwLock<ClusterInfo>>, cluster_info: Arc<RwLock<ClusterInfo>>,
r: BlobReceiver, r: BlobReceiver,
) -> JoinHandle<()> { ) -> JoinHandle<()> {
let bank_forks = bank_forks.clone();
Builder::new() Builder::new()
.name("solana-retransmitter".to_string()) .name("solana-retransmitter".to_string())
.spawn(move || { .spawn(move || {
@ -107,13 +109,14 @@ pub struct RetransmitStage {
impl RetransmitStage { impl RetransmitStage {
#[allow(clippy::new_ret_no_self)] #[allow(clippy::new_ret_no_self)]
pub fn new( pub fn new(
bank_forks: &Arc<RwLock<BankForks>>, bank_forks: Arc<RwLock<BankForks>>,
blocktree: Arc<Blocktree>, blocktree: Arc<Blocktree>,
cluster_info: &Arc<RwLock<ClusterInfo>>, cluster_info: &Arc<RwLock<ClusterInfo>>,
retransmit_socket: Arc<UdpSocket>, retransmit_socket: Arc<UdpSocket>,
repair_socket: Arc<UdpSocket>, repair_socket: Arc<UdpSocket>,
fetch_stage_receiver: BlobReceiver, fetch_stage_receiver: BlobReceiver,
exit: &Arc<AtomicBool>, exit: &Arc<AtomicBool>,
genesis_blockhash: &Hash,
) -> Self { ) -> Self {
let (retransmit_sender, retransmit_receiver) = channel(); let (retransmit_sender, retransmit_receiver) = channel();
@ -124,6 +127,7 @@ impl RetransmitStage {
retransmit_receiver, retransmit_receiver,
); );
let window_service = WindowService::new( let window_service = WindowService::new(
Some(bank_forks),
blocktree, blocktree,
cluster_info.clone(), cluster_info.clone(),
fetch_stage_receiver, fetch_stage_receiver,
@ -131,6 +135,7 @@ impl RetransmitStage {
repair_socket, repair_socket,
exit, exit,
None, None,
genesis_blockhash,
); );
let thread_hdls = vec![t_retransmit]; let thread_hdls = vec![t_retransmit];

View File

@ -2,6 +2,7 @@
use crate::bank_forks::BankForks; use crate::bank_forks::BankForks;
use crate::cluster_info::ClusterInfo; use crate::cluster_info::ClusterInfo;
use crate::contact_info::ContactInfo;
use crate::packet::PACKET_DATA_SIZE; use crate::packet::PACKET_DATA_SIZE;
use crate::storage_stage::StorageState; use crate::storage_stage::StorageState;
use bincode::{deserialize, serialize}; use bincode::{deserialize, serialize};
@ -171,6 +172,18 @@ pub struct Meta {
} }
impl Metadata for 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)] #[rpc(server)]
pub trait RpcSol { pub trait RpcSol {
type Metadata; type Metadata;
@ -184,6 +197,9 @@ pub trait RpcSol {
#[rpc(meta, name = "getBalance")] #[rpc(meta, name = "getBalance")]
fn get_balance(&self, _: Self::Metadata, _: String) -> Result<u64>; 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")] #[rpc(meta, name = "getRecentBlockhash")]
fn get_recent_blockhash(&self, _: Self::Metadata) -> Result<String>; fn get_recent_blockhash(&self, _: Self::Metadata) -> Result<String>;
@ -203,6 +219,9 @@ pub trait RpcSol {
#[rpc(meta, name = "sendTransaction")] #[rpc(meta, name = "sendTransaction")]
fn send_transaction(&self, _: Self::Metadata, _: Vec<u8>) -> Result<String>; 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")] #[rpc(meta, name = "getStorageBlockhash")]
fn get_storage_blockhash(&self, _: Self::Metadata) -> Result<String>; 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)) 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> { fn get_recent_blockhash(&self, meta: Self::Metadata) -> Result<String> {
debug!("get_recent_blockhash rpc request received"); debug!("get_recent_blockhash rpc request received");
Ok(meta Ok(meta
@ -402,6 +448,15 @@ impl RpcSol for RpcSolImpl {
Ok(signature) 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> { fn get_storage_blockhash(&self, meta: Self::Metadata) -> Result<String> {
meta.request_processor meta.request_processor
.read() .read()
@ -445,7 +500,9 @@ mod tests {
use solana_sdk::transaction::TransactionError; use solana_sdk::transaction::TransactionError;
use std::thread; 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_forks, alice) = new_bank_forks();
let bank = bank_forks.read().unwrap().working_bank(); let bank = bank_forks.read().unwrap().working_bank();
let exit = Arc::new(AtomicBool::new(false)); let exit = Arc::new(AtomicBool::new(false));
@ -477,7 +534,7 @@ mod tests {
request_processor, request_processor,
cluster_info, cluster_info,
}; };
(io, meta, blockhash, alice) (io, meta, blockhash, alice, leader.id)
} }
#[test] #[test]
@ -505,7 +562,7 @@ mod tests {
#[test] #[test]
fn test_rpc_get_balance() { fn test_rpc_get_balance() {
let bob_pubkey = Pubkey::new_rand(); 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!( let req = format!(
r#"{{"jsonrpc":"2.0","id":1,"method":"getBalance","params":["{}"]}}"#, r#"{{"jsonrpc":"2.0","id":1,"method":"getBalance","params":["{}"]}}"#,
@ -520,10 +577,46 @@ mod tests {
assert_eq!(expected, result); 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] #[test]
fn test_rpc_get_tx_count() { fn test_rpc_get_tx_count() {
let bob_pubkey = Pubkey::new_rand(); 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 req = format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getTransactionCount"}}"#);
let res = io.handle_request_sync(&req, meta); let res = io.handle_request_sync(&req, meta);
@ -538,7 +631,7 @@ mod tests {
#[test] #[test]
fn test_rpc_get_account_info() { fn test_rpc_get_account_info() {
let bob_pubkey = Pubkey::new_rand(); 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!( let req = format!(
r#"{{"jsonrpc":"2.0","id":1,"method":"getAccountInfo","params":["{}"]}}"#, r#"{{"jsonrpc":"2.0","id":1,"method":"getAccountInfo","params":["{}"]}}"#,
@ -565,7 +658,7 @@ mod tests {
#[test] #[test]
fn test_rpc_confirm_tx() { fn test_rpc_confirm_tx() {
let bob_pubkey = Pubkey::new_rand(); 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 tx = system_transaction::transfer(&alice, &bob_pubkey, 20, blockhash, 0);
let req = format!( let req = format!(
@ -584,7 +677,7 @@ mod tests {
#[test] #[test]
fn test_rpc_get_signature_status() { fn test_rpc_get_signature_status() {
let bob_pubkey = Pubkey::new_rand(); 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 tx = system_transaction::transfer(&alice, &bob_pubkey, 20, blockhash, 0);
let req = format!( let req = format!(
@ -648,7 +741,7 @@ mod tests {
#[test] #[test]
fn test_rpc_get_recent_blockhash() { fn test_rpc_get_recent_blockhash() {
let bob_pubkey = Pubkey::new_rand(); 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 req = format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getRecentBlockhash"}}"#);
let res = io.handle_request_sync(&req, meta); let res = io.handle_request_sync(&req, meta);
@ -663,7 +756,7 @@ mod tests {
#[test] #[test]
fn test_rpc_fail_request_airdrop() { fn test_rpc_fail_request_airdrop() {
let bob_pubkey = Pubkey::new_rand(); 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 // Expect internal error because no drone is available
let req = format!( let req = format!(

View File

@ -229,7 +229,7 @@ mod tests {
subscriptions.check_account(&alice.pubkey(), &account); subscriptions.check_account(&alice.pubkey(), &account);
let string = transport_receiver.poll(); let string = transport_receiver.poll();
if let Async::Ready(Some(response)) = string.unwrap() { 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); assert_eq!(expected, response);
} }
@ -275,7 +275,7 @@ mod tests {
subscriptions.check_program(&solana_budget_api::id(), &alice.pubkey(), &account); subscriptions.check_program(&solana_budget_api::id(), &alice.pubkey(), &account);
let string = transport_receiver.poll(); let string = transport_receiver.poll();
if let Async::Ready(Some(response)) = string.unwrap() { 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); assert_eq!(expected, response);
} }

View File

@ -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()) 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 /// 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>> { 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); let node_staked_accounts = node_staked_accounts_at_epoch(bank, epoch_height);

View File

@ -11,6 +11,7 @@ use crate::fetch_stage::FetchStage;
use crate::poh_recorder::{PohRecorder, WorkingBankEntries}; use crate::poh_recorder::{PohRecorder, WorkingBankEntries};
use crate::service::Service; use crate::service::Service;
use crate::sigverify_stage::SigVerifyStage; use crate::sigverify_stage::SigVerifyStage;
use solana_sdk::hash::Hash;
use solana_sdk::pubkey::Pubkey; use solana_sdk::pubkey::Pubkey;
use std::net::UdpSocket; use std::net::UdpSocket;
use std::sync::atomic::AtomicBool; use std::sync::atomic::AtomicBool;
@ -40,6 +41,7 @@ impl Tpu {
blocktree: &Arc<Blocktree>, blocktree: &Arc<Blocktree>,
storage_entry_sender: EntrySender, storage_entry_sender: EntrySender,
exit: &Arc<AtomicBool>, exit: &Arc<AtomicBool>,
genesis_blockhash: &Hash,
) -> Self { ) -> Self {
cluster_info.write().unwrap().set_leader(id); cluster_info.write().unwrap().set_leader(id);
@ -72,6 +74,7 @@ impl Tpu {
&exit, &exit,
blocktree, blocktree,
storage_entry_sender, storage_entry_sender,
genesis_blockhash,
); );
Self { Self {

View File

@ -25,6 +25,7 @@ use crate::retransmit_stage::RetransmitStage;
use crate::rpc_subscriptions::RpcSubscriptions; use crate::rpc_subscriptions::RpcSubscriptions;
use crate::service::Service; use crate::service::Service;
use crate::storage_stage::{StorageStage, StorageState}; use crate::storage_stage::{StorageStage, StorageState};
use solana_sdk::hash::Hash;
use solana_sdk::pubkey::Pubkey; use solana_sdk::pubkey::Pubkey;
use solana_sdk::signature::{Keypair, KeypairUtil}; use solana_sdk::signature::{Keypair, KeypairUtil};
use std::net::UdpSocket; use std::net::UdpSocket;
@ -72,6 +73,7 @@ impl Tvu {
storage_entry_sender: EntrySender, storage_entry_sender: EntrySender,
storage_entry_receiver: EntryReceiver, storage_entry_receiver: EntryReceiver,
exit: &Arc<AtomicBool>, exit: &Arc<AtomicBool>,
genesis_blockhash: &Hash,
) -> Self ) -> Self
where where
T: 'static + KeypairUtil + Sync + Send, 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 //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 //then sent to the window, which does the erasure coding reconstruction
let retransmit_stage = RetransmitStage::new( let retransmit_stage = RetransmitStage::new(
&bank_forks, bank_forks.clone(),
blocktree.clone(), blocktree.clone(),
&cluster_info, &cluster_info,
Arc::new(retransmit_socket), Arc::new(retransmit_socket),
repair_socket, repair_socket,
blob_fetch_receiver, blob_fetch_receiver,
&exit, &exit,
genesis_blockhash,
); );
let (replay_stage, slot_full_receiver) = ReplayStage::new( let (replay_stage, slot_full_receiver) = ReplayStage::new(
@ -237,6 +240,7 @@ pub mod tests {
storage_entry_sender, storage_entry_sender,
storage_entry_receiver, storage_entry_receiver,
&exit, &exit,
&Hash::default(),
); );
exit.store(true, Ordering::Relaxed); exit.store(true, Ordering::Relaxed);
tvu.join().unwrap(); tvu.join().unwrap();

View File

@ -1,15 +1,18 @@
//! `window_service` handles the data plane incoming blobs, storing them in //! `window_service` handles the data plane incoming blobs, storing them in
//! blocktree and retransmitting where required //! blocktree and retransmitting where required
//! //!
use crate::bank_forks::BankForks;
use crate::blocktree::Blocktree; use crate::blocktree::Blocktree;
use crate::cluster_info::ClusterInfo; 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::repair_service::{RepairService, RepairSlotRange};
use crate::result::{Error, Result}; use crate::result::{Error, Result};
use crate::service::Service; use crate::service::Service;
use crate::streamer::{BlobReceiver, BlobSender}; use crate::streamer::{BlobReceiver, BlobSender};
use solana_metrics::counter::Counter; 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::pubkey::Pubkey;
use solana_sdk::timing::duration_as_ms; use solana_sdk::timing::duration_as_ms;
use std::net::UdpSocket; use std::net::UdpSocket;
@ -64,33 +67,57 @@ fn process_blobs(blobs: &[SharedBlob], blocktree: &Arc<Blocktree>) -> Result<()>
Ok(()) 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( fn recv_window(
bank_forks: Option<&Arc<RwLock<BankForks>>>,
blocktree: &Arc<Blocktree>, blocktree: &Arc<Blocktree>,
id: &Pubkey, my_id: &Pubkey,
r: &BlobReceiver, r: &BlobReceiver,
retransmit: &BlobSender, retransmit: &BlobSender,
genesis_blockhash: &Hash,
) -> Result<()> { ) -> Result<()> {
let timer = Duration::from_millis(200); 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() { while let Ok(mut blob) = r.try_recv() {
dq.append(&mut nq) blobs.append(&mut blob)
} }
let now = Instant::now(); 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( blobs.retain(|blob| {
influxdb::Point::new("recv-window") should_retransmit_and_persist(
.add_field("count", influxdb::Value::Integer(dq.len() as i64)) &blob.read().unwrap(),
.to_owned(), 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: {}", my_id, blobs.len());
trace!("{} num blobs received: {}", id, dq.len());
process_blobs(&dq, blocktree)?; process_blobs(&blobs, blocktree)?;
trace!( trace!(
"Elapsed processing time in recv_window(): {}", "Elapsed processing time in recv_window(): {}",
@ -124,7 +151,9 @@ pub struct WindowService {
} }
impl WindowService { impl WindowService {
#[allow(clippy::too_many_arguments)]
pub fn new( pub fn new(
bank_forks: Option<Arc<RwLock<BankForks>>>,
blocktree: Arc<Blocktree>, blocktree: Arc<Blocktree>,
cluster_info: Arc<RwLock<ClusterInfo>>, cluster_info: Arc<RwLock<ClusterInfo>>,
r: BlobReceiver, r: BlobReceiver,
@ -132,6 +161,7 @@ impl WindowService {
repair_socket: Arc<UdpSocket>, repair_socket: Arc<UdpSocket>,
exit: &Arc<AtomicBool>, exit: &Arc<AtomicBool>,
repair_slot_range: Option<RepairSlotRange>, repair_slot_range: Option<RepairSlotRange>,
genesis_blockhash: &Hash,
) -> WindowService { ) -> WindowService {
let repair_service = RepairService::new( let repair_service = RepairService::new(
blocktree.clone(), blocktree.clone(),
@ -141,6 +171,8 @@ impl WindowService {
repair_slot_range, repair_slot_range,
); );
let exit = exit.clone(); let exit = exit.clone();
let bank_forks = bank_forks.clone();
let hash = *genesis_blockhash;
let t_window = Builder::new() let t_window = Builder::new()
.name("solana-window".to_string()) .name("solana-window".to_string())
.spawn(move || { .spawn(move || {
@ -151,7 +183,9 @@ impl WindowService {
if exit.load(Ordering::Relaxed) { if exit.load(Ordering::Relaxed) {
break; 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 { match e {
Error::RecvTimeoutError(RecvTimeoutError::Disconnected) => break, Error::RecvTimeoutError(RecvTimeoutError::Disconnected) => break,
Error::RecvTimeoutError(RecvTimeoutError::Timeout) => (), Error::RecvTimeoutError(RecvTimeoutError::Timeout) => (),
@ -184,12 +218,15 @@ impl Service for WindowService {
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use super::*; use super::*;
use crate::bank_forks::BankForks;
use crate::blocktree::{get_tmp_ledger_path, Blocktree}; use crate::blocktree::{get_tmp_ledger_path, Blocktree};
use crate::cluster_info::{ClusterInfo, Node}; use crate::cluster_info::{ClusterInfo, Node};
use crate::entry::{make_consecutive_blobs, make_tiny_test_entries, EntrySlice}; 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::service::Service;
use crate::streamer::{blob_receiver, responder}; use crate::streamer::{blob_receiver, responder};
use solana_runtime::bank::Bank;
use solana_sdk::genesis_block::GenesisBlock;
use solana_sdk::hash::Hash; use solana_sdk::hash::Hash;
use std::fs::remove_dir_all; use std::fs::remove_dir_all;
use std::net::UdpSocket; use std::net::UdpSocket;
@ -221,6 +258,46 @@ mod test {
Blocktree::destroy(&blocktree_path).expect("Expected successful database destruction"); 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] #[test]
pub fn window_send_test() { pub fn window_send_test() {
solana_logger::setup(); solana_logger::setup();
@ -241,6 +318,10 @@ mod test {
Blocktree::open(&blocktree_path).expect("Expected to be able to open database ledger"), Blocktree::open(&blocktree_path).expect("Expected to be able to open database ledger"),
); );
let t_window = WindowService::new( 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, blocktree,
subs, subs,
r_reader, r_reader,
@ -248,6 +329,7 @@ mod test {
Arc::new(leader_node.sockets.repair), Arc::new(leader_node.sockets.repair),
&exit, &exit,
None, None,
&Hash::default(),
); );
let t_responder = { let t_responder = {
let (s_responder, r_responder) = channel(); 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"), Blocktree::open(&blocktree_path).expect("Expected to be able to open database ledger"),
); );
let t_window = WindowService::new( 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, blocktree,
subs.clone(), subs.clone(),
r_reader, r_reader,
@ -320,6 +406,7 @@ mod test {
Arc::new(leader_node.sockets.repair), Arc::new(leader_node.sockets.repair),
&exit, &exit,
None, None,
&Hash::default(),
); );
let t_responder = { let t_responder = {
let (s_responder, r_responder) = channel(); let (s_responder, r_responder) = channel();

View File

@ -127,6 +127,7 @@ fn test_replay() {
storage_sender, storage_sender,
storage_receiver, storage_receiver,
&exit, &exit,
&solana_sdk::hash::Hash::default(),
); );
let mut mint_ref_balance = starting_mint_balance; let mut mint_ref_balance = starting_mint_balance;

View File

@ -1,6 +1,6 @@
[package] [package]
name = "solana-drone" name = "solana-drone"
version = "0.13.0" version = "0.13.2"
description = "Solana Drone" description = "Solana Drone"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@ -20,9 +20,9 @@ clap = "2.33"
log = "0.4.2" log = "0.4.2"
serde = "1.0.90" serde = "1.0.90"
serde_derive = "1.0.90" serde_derive = "1.0.90"
solana-logger = { path = "../logger", version = "0.13.0" } solana-logger = { path = "../logger", version = "0.13.2" }
solana-sdk = { path = "../sdk", version = "0.13.0" } solana-sdk = { path = "../sdk", version = "0.13.2" }
solana-metrics = { path = "../metrics", version = "0.13.0" } solana-metrics = { path = "../metrics", version = "0.13.2" }
tokio = "0.1" tokio = "0.1"
tokio-codec = "0.1" tokio-codec = "0.1"

View File

@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-fullnode" name = "solana-fullnode"
description = "Blockchain, Rebuilt for Scale" description = "Blockchain, Rebuilt for Scale"
version = "0.13.0" version = "0.13.2"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@ -12,15 +12,15 @@ homepage = "https://solana.com/"
clap = "2.33.0" clap = "2.33.0"
log = "0.4.2" log = "0.4.2"
serde_json = "1.0.39" serde_json = "1.0.39"
solana = { path = "../core", version = "0.13.0" } solana = { path = "../core", version = "0.13.2" }
solana-drone = { path = "../drone", version = "0.13.0" } solana-drone = { path = "../drone", version = "0.13.2" }
solana-logger = { path = "../logger", version = "0.13.0" } solana-logger = { path = "../logger", version = "0.13.2" }
solana-netutil = { path = "../netutil", version = "0.13.0" } solana-netutil = { path = "../netutil", version = "0.13.2" }
solana-metrics = { path = "../metrics", version = "0.13.0" } solana-metrics = { path = "../metrics", version = "0.13.2" }
solana-runtime = { path = "../runtime", version = "0.13.0" } solana-runtime = { path = "../runtime", version = "0.13.2" }
solana-sdk = { path = "../sdk", version = "0.13.0" } solana-sdk = { path = "../sdk", version = "0.13.2" }
solana-vote-api = { path = "../programs/vote_api", version = "0.13.0" } solana-vote-api = { path = "../programs/vote_api", version = "0.13.2" }
solana-vote-signer = { path = "../vote-signer", version = "0.13.0" } solana-vote-signer = { path = "../vote-signer", version = "0.13.2" }
[features] [features]
chacha = ["solana/chacha"] chacha = ["solana/chacha"]

View File

@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-genesis" name = "solana-genesis"
description = "Blockchain, Rebuilt for Scale" description = "Blockchain, Rebuilt for Scale"
version = "0.13.0" version = "0.13.2"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@ -11,18 +11,18 @@ homepage = "https://solana.com/"
[dependencies] [dependencies]
clap = "2.33.0" clap = "2.33.0"
serde_json = "1.0.39" serde_json = "1.0.39"
solana = { path = "../core", version = "0.13.0" } solana = { path = "../core", version = "0.13.2" }
solana-sdk = { path = "../sdk", version = "0.13.0" } solana-sdk = { path = "../sdk", version = "0.13.2" }
solana-budget-api = { path = "../programs/budget_api", version = "0.13.0" } solana-budget-api = { path = "../programs/budget_api", version = "0.13.2" }
solana-storage-api = { path = "../programs/storage_api", version = "0.13.0" } solana-stake-api = { path = "../programs/stake_api", version = "0.13.2" }
solana-token-api = { path = "../programs/token_api", version = "0.13.0" } solana-storage-api = { path = "../programs/storage_api", version = "0.13.2" }
solana-config-api = { path = "../programs/config_api", version = "0.13.0" } solana-token-api = { path = "../programs/token_api", version = "0.13.2" }
solana-exchange-api = { path = "../programs/exchange_api", version = "0.13.0" } solana-config-api = { path = "../programs/config_api", version = "0.13.2" }
solana-exchange-api = { path = "../programs/exchange_api", version = "0.13.2" }
[dev-dependencies] [dev-dependencies]
hashbrown = "0.2.1" 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.2" }
[features] [features]
cuda = ["solana/cuda"] cuda = ["solana/cuda"]

View File

@ -14,6 +14,7 @@ use std::error;
pub const BOOTSTRAP_LEADER_LAMPORTS: u64 = 43; pub const BOOTSTRAP_LEADER_LAMPORTS: u64 = 43;
fn main() -> Result<(), Box<dyn error::Error>> { fn main() -> Result<(), Box<dyn error::Error>> {
let default_bootstrap_leader_lamports = &BOOTSTRAP_LEADER_LAMPORTS.to_string();
let matches = App::new(crate_name!()) let matches = App::new(crate_name!())
.about(crate_description!()) .about(crate_description!())
.version(crate_version!()) .version(crate_version!())
@ -62,6 +63,15 @@ fn main() -> Result<(), Box<dyn error::Error>> {
.required(true) .required(true)
.help("Path to file containing the bootstrap leader's staking keypair"), .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(); .get_matches();
let bootstrap_leader_keypair_file = matches.value_of("bootstrap_leader_keypair_file").unwrap(); 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 ledger_path = matches.value_of("ledger_path").unwrap();
let mint_keypair_file = matches.value_of("mint_keypair_file").unwrap(); let mint_keypair_file = matches.value_of("mint_keypair_file").unwrap();
let lamports = value_t_or_exit!(matches, "lamports", u64); 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_leader_keypair = read_keypair(bootstrap_leader_keypair_file)?;
let bootstrap_vote_keypair = read_keypair(bootstrap_vote_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( let (mut genesis_block, _mint_keypair) = GenesisBlock::new_with_leader(
lamports, lamports,
&bootstrap_leader_keypair.pubkey(), &bootstrap_leader_keypair.pubkey(),
BOOTSTRAP_LEADER_LAMPORTS, bootstrap_leader_lamports,
); );
genesis_block.mint_id = mint_keypair.pubkey(); genesis_block.mint_id = mint_keypair.pubkey();
genesis_block.bootstrap_leader_vote_account_id = bootstrap_vote_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, 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(&[ let native_loader = "NativeLoader1111111111111111111111111111111"
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, .parse::<Pubkey>()
0, 0, 0, .unwrap();
]); let bpf_loader = "BPFLoader1111111111111111111111111111111111"
let bpf = Pubkey::new(&[ .parse::<Pubkey>()
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, .unwrap();
0, 0, 0, 0, let budget = "Budget1111111111111111111111111111111111111"
]); .parse::<Pubkey>()
let budget = Pubkey::new(&[ .unwrap();
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, let stake = "Stake11111111111111111111111111111111111111"
0, 0, 0, 0, .parse::<Pubkey>()
]); .unwrap();
let storage = Pubkey::new(&[ let storage = "Storage111111111111111111111111111111111111"
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, .parse::<Pubkey>()
0, 0, 0, 0, .unwrap();
]); let token = "Token11111111111111111111111111111111111111"
let token = Pubkey::new(&[ .parse::<Pubkey>()
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, .unwrap();
0, 0, 0, 0, let vote = "Vote111111111111111111111111111111111111111"
]); .parse::<Pubkey>()
let vote = Pubkey::new(&[ .unwrap();
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, let config = "Config1111111111111111111111111111111111111"
0, 0, 0, 0, .parse::<Pubkey>()
]); .unwrap();
let config = Pubkey::new(&[ let exchange = "Exchange11111111111111111111111111111111111"
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, .parse::<Pubkey>()
0, 0, 0, 0, .unwrap();
]);
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,
]);
assert_eq!(solana_sdk::system_program::id(), system); assert_eq!(solana_sdk::system_program::id(), system);
assert_eq!(solana_sdk::native_loader::id(), native); assert_eq!(solana_sdk::native_loader::id(), native_loader);
assert_eq!(solana_sdk::bpf_loader::id(), bpf); assert_eq!(solana_sdk::bpf_loader::id(), bpf_loader);
assert_eq!(solana_budget_api::id(), budget); assert_eq!(solana_budget_api::id(), budget);
assert_eq!(solana_stake_api::id(), stake);
assert_eq!(solana_storage_api::id(), storage); assert_eq!(solana_storage_api::id(), storage);
assert_eq!(solana_token_api::id(), token); assert_eq!(solana_token_api::id(), token);
assert_eq!(solana_vote_api::id(), vote); assert_eq!(solana_vote_api::id(), vote);

View File

@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-gossip" name = "solana-gossip"
description = "Blockchain, Rebuilt for Scale" description = "Blockchain, Rebuilt for Scale"
version = "0.13.0" version = "0.13.2"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@ -11,9 +11,9 @@ homepage = "https://solana.com/"
[dependencies] [dependencies]
clap = "2.33.0" clap = "2.33.0"
env_logger = "0.6.1" env_logger = "0.6.1"
solana = { path = "../core", version = "0.13.0" } solana = { path = "../core", version = "0.13.2" }
solana-netutil = { path = "../netutil", version = "0.13.0" } solana-netutil = { path = "../netutil", version = "0.13.2" }
solana-sdk = { path = "../sdk", version = "0.13.0" } solana-sdk = { path = "../sdk", version = "0.13.2" }
[features] [features]
chacha = [] chacha = []

View File

@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-install" name = "solana-install"
description = "The solana cluster software installer" description = "The solana cluster software installer"
version = "0.13.0" version = "0.13.2"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@ -28,10 +28,10 @@ ring = "0.13.2"
serde = "1.0.90" serde = "1.0.90"
serde_derive = "1.0.90" serde_derive = "1.0.90"
serde_yaml = "0.8.8" serde_yaml = "0.8.8"
solana-client = { path = "../client", version = "0.13.0" } solana-client = { path = "../client", version = "0.13.2" }
solana-config-api = { path = "../programs/config_api", version = "0.13.0" } solana-config-api = { path = "../programs/config_api", version = "0.13.2" }
solana-logger = { path = "../logger", version = "0.13.0" } solana-logger = { path = "../logger", version = "0.13.2" }
solana-sdk = { path = "../sdk", version = "0.13.0" } solana-sdk = { path = "../sdk", version = "0.13.2" }
tar = "0.4.22" tar = "0.4.22"
tempdir = "0.3.7" tempdir = "0.3.7"
url = "1.7.2" url = "1.7.2"

View File

@ -1,6 +1,6 @@
[package] [package]
name = "solana-keygen" name = "solana-keygen"
version = "0.13.0" version = "0.13.2"
description = "Solana key generation utility" description = "Solana key generation utility"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@ -15,7 +15,7 @@ erasure = []
[dependencies] [dependencies]
dirs = "1.0.5" dirs = "1.0.5"
clap = "2.33" clap = "2.33"
solana-sdk = { path = "../sdk", version = "0.13.0" } solana-sdk = { path = "../sdk", version = "0.13.2" }
[[bin]] [[bin]]
name = "solana-keygen" name = "solana-keygen"

View File

@ -1,7 +1,7 @@
[package] [package]
name = "solana-kvstore" name = "solana-kvstore"
description = "Embedded Key-Value store for solana" description = "Embedded Key-Value store for solana"
version = "0.13.0" version = "0.13.2"
homepage = "https://solana.com/" homepage = "https://solana.com/"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]

View File

@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-ledger-tool" name = "solana-ledger-tool"
description = "Blockchain, Rebuilt for Scale" description = "Blockchain, Rebuilt for Scale"
version = "0.13.0" version = "0.13.2"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@ -11,10 +11,10 @@ homepage = "https://solana.com/"
[dependencies] [dependencies]
clap = "2.33.0" clap = "2.33.0"
serde_json = "1.0.39" serde_json = "1.0.39"
solana = { path = "../core", version = "0.13.0" } solana = { path = "../core", version = "0.13.2" }
solana-sdk = { path = "../sdk", version = "0.13.0" } solana-sdk = { path = "../sdk", version = "0.13.2" }
solana-logger = { path = "../logger", version = "0.13.0" } solana-logger = { path = "../logger", version = "0.13.2" }
solana-runtime = { path = "../runtime", version = "0.13.0" } solana-runtime = { path = "../runtime", version = "0.13.2" }
[dev-dependencies] [dev-dependencies]
assert_cmd = "0.11" assert_cmd = "0.11"

View File

@ -1,6 +1,6 @@
[package] [package]
name = "solana-logger" name = "solana-logger"
version = "0.13.0" version = "0.13.2"
description = "Solana Logger" description = "Solana Logger"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"

View File

@ -1,6 +1,6 @@
[package] [package]
name = "solana-metrics" name = "solana-metrics"
version = "0.13.0" version = "0.13.2"
description = "Solana Metrics" description = "Solana Metrics"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@ -14,7 +14,7 @@ log = "0.4.2"
reqwest = "0.9.15" reqwest = "0.9.15"
lazy_static = "1.3.0" lazy_static = "1.3.0"
sys-info = "0.5.6" sys-info = "0.5.6"
solana-sdk = { path = "../sdk", version = "0.13.0" } solana-sdk = { path = "../sdk", version = "0.13.2" }
[dev-dependencies] [dev-dependencies]
rand = "0.6.5" rand = "0.6.5"

View File

@ -138,6 +138,7 @@ setup_vote_account() {
declare drone_address=$1 declare drone_address=$1
declare node_id_path=$2 declare node_id_path=$2
declare vote_id_path=$3 declare vote_id_path=$3
declare stake=$4
declare node_id declare node_id
node_id=$($solana_wallet --keypair "$node_id_path" address) node_id=$($solana_wallet --keypair "$node_id_path" address)
@ -147,19 +148,17 @@ setup_vote_account() {
if [[ -f "$vote_id_path".configured ]]; then if [[ -f "$vote_id_path".configured ]]; then
echo "Vote account has already been configured" 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 fi
# A fullnode requires 43 lamports to function: $solana_wallet --keypair "$node_id_path" --host "$drone_address" show-vote-account "$vote_id"
# - 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
return 0 return 0
} }
@ -169,7 +168,7 @@ fullnode_usage() {
echo echo
fi fi
cat <<EOF 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 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 the specified label. Does not apply to the bootstrap leader
--blockstream PATH - open blockstream at this unix domain socket location --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 --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 --public-address - advertise public machine address in gossip. By default the local machine address is advertised
--no-voting - start node without vote signer --no-voting - start node without vote signer
--rpc-port port - custom RPC port for this node --rpc-port port - custom RPC port for this node

View File

@ -16,7 +16,7 @@ fi
gossip_port= gossip_port=
extra_fullnode_args=() extra_fullnode_args=()
self_setup=0 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 poll_for_new_genesis_block=0
while [[ ${1:0:1} = - ]]; do while [[ ${1:0:1} = - ]]; do
@ -32,6 +32,7 @@ while [[ ${1:0:1} = - ]]; do
poll_for_new_genesis_block=1 poll_for_new_genesis_block=1
shift shift
elif [[ $1 = --blockstream ]]; then elif [[ $1 = --blockstream ]]; then
stake=0
extra_fullnode_args+=("$1" "$2") extra_fullnode_args+=("$1" "$2")
shift 2 shift 2
elif [[ $1 = --enable-rpc-exit ]]; then elif [[ $1 = --enable-rpc-exit ]]; then
@ -40,9 +41,9 @@ while [[ ${1:0:1} = - ]]; do
elif [[ $1 = --init-complete-file ]]; then elif [[ $1 = --init-complete-file ]]; then
extra_fullnode_args+=("$1" "$2") extra_fullnode_args+=("$1" "$2")
shift 2 shift 2
elif [[ $1 = --only-bootstrap-stake ]]; then elif [[ $1 = --stake ]]; then
setup_stakes=0 stake="$2"
shift shift 2
elif [[ $1 = --public-address ]]; then elif [[ $1 = --public-address ]]; then
extra_fullnode_args+=("$1") extra_fullnode_args+=("$1")
shift shift
@ -169,6 +170,11 @@ while true; do
fi fi
trap 'kill "$pid" && wait "$pid"' INT TERM ERR 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 \ $program \
--identity "$fullnode_id_path" \ --identity "$fullnode_id_path" \
--voting-keypair "$fullnode_vote_id_path" \ --voting-keypair "$fullnode_vote_id_path" \
@ -182,9 +188,6 @@ while true; do
pid=$! pid=$!
oom_score_adj "$pid" 1000 oom_score_adj "$pid" 1000
if ((setup_stakes)); then
setup_vote_account "${leader_address%:*}" "$fullnode_id_path" "$fullnode_vote_id_path"
fi
set +x set +x
while true; do while true; do
@ -201,7 +204,7 @@ while true; do
$rsync -r "$rsync_leader_url"/config/ledger "$SOLANA_RSYNC_CONFIG_DIR" || true $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 if [[ -n $(diff "$SOLANA_RSYNC_CONFIG_DIR"/ledger/genesis.json "$ledger_config_dir"/genesis.json 2>&1) ]]; then
echo "############## New genesis detected, restarting fullnode ##############" echo "############## New genesis detected, restarting fullnode ##############"
rm -rf "$ledger_config_dir" rm -rf "$ledger_config_dir" "$vote_id_path".configured
kill "$pid" || true kill "$pid" || true
wait "$pid" || true wait "$pid" || true
break break

View File

@ -29,8 +29,10 @@ EOF
lamports=1000000000 lamports=1000000000
bootstrap_leader=true bootstrap_leader=true
bootstrap_leader_lamports=
fullnode=true fullnode=true
while getopts "h?n:lpt:" opt; do while getopts "h?n:b:lpt:" opt; do
case $opt in case $opt in
h|\?) h|\?)
usage usage
@ -39,6 +41,9 @@ while getopts "h?n:lpt:" opt; do
n) n)
lamports="$OPTARG" lamports="$OPTARG"
;; ;;
b)
bootstrap_leader_lamports="$OPTARG"
;;
t) t)
node_type="$OPTARG" node_type="$OPTARG"
case $OPTARG in 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"/mint-id.json
$solana_keygen -o "$SOLANA_CONFIG_DIR"/bootstrap-leader-id.json $solana_keygen -o "$SOLANA_CONFIG_DIR"/bootstrap-leader-id.json
$solana_keygen -o "$SOLANA_CONFIG_DIR"/bootstrap-leader-vote-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 \ args=(
--bootstrap-vote-keypair "$SOLANA_CONFIG_DIR"/bootstrap-leader-vote-id.json \ --bootstrap-leader-keypair "$SOLANA_CONFIG_DIR"/bootstrap-leader-id.json
--ledger "$SOLANA_RSYNC_CONFIG_DIR"/ledger \ --bootstrap-vote-keypair "$SOLANA_CONFIG_DIR"/bootstrap-leader-vote-id.json
--mint "$SOLANA_CONFIG_DIR"/mint-id.json \ --ledger "$SOLANA_RSYNC_CONFIG_DIR"/ledger
--mint "$SOLANA_CONFIG_DIR"/mint-id.json
--lamports "$lamports" --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 cp -a "$SOLANA_RSYNC_CONFIG_DIR"/ledger "$SOLANA_CONFIG_DIR"/bootstrap-leader-ledger
) )
fi fi

View File

@ -427,7 +427,7 @@ start() {
networkVersion="$( networkVersion="$(
( (
set -o pipefail 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" ) || echo "tar-unknown"
)" )"
;; ;;

View File

@ -15,6 +15,14 @@ leaderRotation="$8"
set +x set +x
export RUST_LOG 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() { missing() {
echo "Error: $1 not specified" echo "Error: $1 not specified"
exit 1 exit 1
@ -69,20 +77,16 @@ local|tar)
fi fi
set -x set -x
if [[ $skipSetup != true ]]; then if [[ $skipSetup != true ]]; then
./multinode-demo/setup.sh -t bootstrap-leader ./multinode-demo/setup.sh -t bootstrap-leader -b $stake
fi fi
./multinode-demo/drone.sh > drone.log 2>&1 & ./multinode-demo/drone.sh > drone.log 2>&1 &
maybeNoLeaderRotation=
if ! $leaderRotation; then
maybeNoLeaderRotation="--only-bootstrap-stake"
fi
maybePublicAddress= maybePublicAddress=
if $publicNetwork; then if $publicNetwork; then
maybePublicAddress="--public-address" maybePublicAddress="--public-address"
fi 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 ln -sTf bootstrap-leader.log fullnode.log
;; ;;
fullnode|blockstreamer) fullnode|blockstreamer)
@ -94,9 +98,6 @@ local|tar)
fi fi
args=() args=()
if ! $leaderRotation; then
args+=("--only-bootstrap-stake")
fi
if $publicNetwork; then if $publicNetwork; then
args+=("--public-address") args+=("--public-address")
fi fi
@ -104,7 +105,14 @@ local|tar)
args+=( args+=(
--blockstream /tmp/solana-blockstream.sock --blockstream /tmp/solana-blockstream.sock
--no-voting --no-voting
--stake 0
) )
else
if $leaderRotation; then
args+=("--stake" "$stake")
else
args+=("--stake" 0)
fi
fi fi
args+=( args+=(

View File

@ -133,7 +133,7 @@ echo "--- $entrypointIp: validator sanity"
if $validatorSanity; then if $validatorSanity; then
( (
set -x -o pipefail set -x -o pipefail
timeout 10s ./multinode-demo/fullnode-x.sh \ timeout 10s ./multinode-demo/fullnode-x.sh --stake 0 \
"$entrypointRsyncUrl" \ "$entrypointRsyncUrl" \
"$entrypointIp:8001" 2>&1 | tee validator-sanity.log "$entrypointIp:8001" 2>&1 | tee validator-sanity.log
) || { ) || {

View File

@ -1,6 +1,6 @@
[package] [package]
name = "solana-netutil" name = "solana-netutil"
version = "0.13.0" version = "0.13.2"
description = "Solana Network Utilities" description = "Solana Network Utilities"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@ -18,7 +18,7 @@ reqwest = "0.9.0"
socket2 = "0.3.8" socket2 = "0.3.8"
[dev-dependencies] [dev-dependencies]
solana-logger = { path = "../logger", version = "0.13.0" } solana-logger = { path = "../logger", version = "0.13.2" }
[lib] [lib]
name = "solana_netutil" name = "solana_netutil"

View File

@ -1,7 +1,7 @@
[package] [package]
name = "solana-bpf-programs" name = "solana-bpf-programs"
description = "Blockchain, Rebuilt for Scale" description = "Blockchain, Rebuilt for Scale"
version = "0.13.0" version = "0.13.2"
documentation = "https://docs.rs/solana" documentation = "https://docs.rs/solana"
homepage = "https://solana.com/" homepage = "https://solana.com/"
readme = "README.md" readme = "README.md"
@ -22,10 +22,10 @@ bincode = "1.1.3"
byteorder = "1.3.1" byteorder = "1.3.1"
elf = "0.0.10" elf = "0.0.10"
solana_rbpf = "=0.1.10" solana_rbpf = "=0.1.10"
solana-bpfloader = { path = "../bpf_loader", version = "0.13.0" } solana-bpfloader = { path = "../bpf_loader", version = "0.13.2" }
solana-logger = { path = "../../logger", version = "0.13.0" } solana-logger = { path = "../../logger", version = "0.13.2" }
solana-runtime = { path = "../../runtime", version = "0.13.0" } solana-runtime = { path = "../../runtime", version = "0.13.2" }
solana-sdk = { path = "../../sdk", version = "0.13.0" } solana-sdk = { path = "../../sdk", version = "0.13.2" }
[[bench]] [[bench]]
name = "bpf_loader" name = "bpf_loader"

View File

@ -3,7 +3,7 @@
[package] [package]
name = "solana-bpf-rust-noop" name = "solana-bpf-rust-noop"
version = "0.13.0" version = "0.13.2"
description = "Solana BPF noop program written in Rust" description = "Solana BPF noop program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"

View File

@ -1,6 +1,6 @@
[package] [package]
name = "solana-bpfloader" name = "solana-bpfloader"
version = "0.13.0" version = "0.13.2"
description = "Solana BPF Loader" description = "Solana BPF Loader"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@ -15,8 +15,8 @@ libc = "0.2.51"
log = "0.4.2" log = "0.4.2"
solana_rbpf = "=0.1.10" solana_rbpf = "=0.1.10"
serde = "1.0.90" serde = "1.0.90"
solana-logger = { path = "../../logger", version = "0.13.0" } solana-logger = { path = "../../logger", version = "0.13.2" }
solana-sdk = { path = "../../sdk", version = "0.13.0" } solana-sdk = { path = "../../sdk", version = "0.13.2" }
[lib] [lib]
name = "solana_bpf_loader" name = "solana_bpf_loader"

View File

@ -1,6 +1,6 @@
[package] [package]
name = "solana-budget-api" name = "solana-budget-api"
version = "0.13.0" version = "0.13.2"
description = "Solana Budget program API" description = "Solana Budget program API"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@ -14,10 +14,10 @@ chrono = { version = "0.4.0", features = ["serde"] }
log = "0.4.2" log = "0.4.2"
serde = "1.0.90" serde = "1.0.90"
serde_derive = "1.0.90" serde_derive = "1.0.90"
solana-sdk = { path = "../../sdk", version = "0.13.0" } solana-sdk = { path = "../../sdk", version = "0.13.2" }
[dev-dependencies] [dev-dependencies]
solana-runtime = { path = "../../runtime", version = "0.13.0" } solana-runtime = { path = "../../runtime", version = "0.13.2" }
[lib] [lib]
name = "solana_budget_api" name = "solana_budget_api"

View File

@ -6,8 +6,8 @@ pub mod budget_state;
use solana_sdk::pubkey::Pubkey; use solana_sdk::pubkey::Pubkey;
const BUDGET_PROGRAM_ID: [u8; 32] = [ 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, 2, 203, 81, 223, 225, 24, 34, 35, 203, 214, 138, 130, 144, 208, 35, 77, 63, 16, 87, 51, 47,
0, 198, 115, 123, 98, 188, 19, 160, 0, 0, 0, 0,
]; ];
pub fn id() -> Pubkey { pub fn id() -> Pubkey {

View File

@ -1,6 +1,6 @@
[package] [package]
name = "solana-budget-program" name = "solana-budget-program"
version = "0.13.0" version = "0.13.2"
description = "Solana budget program" description = "Solana budget program"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@ -10,9 +10,9 @@ edition = "2018"
[dependencies] [dependencies]
log = "0.4.2" log = "0.4.2"
solana-budget-api = { path = "../budget_api", version = "0.13.0" } solana-budget-api = { path = "../budget_api", version = "0.13.2" }
solana-logger = { path = "../../logger", version = "0.13.0" } solana-logger = { path = "../../logger", version = "0.13.2" }
solana-sdk = { path = "../../sdk", version = "0.13.0" } solana-sdk = { path = "../../sdk", version = "0.13.2" }
[lib] [lib]
name = "solana_budget_program" name = "solana_budget_program"

View File

@ -1,6 +1,6 @@
[package] [package]
name = "solana-config-api" name = "solana-config-api"
version = "0.13.0" version = "0.13.2"
description = "config program API" description = "config program API"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@ -13,11 +13,11 @@ bincode = "1.1.3"
log = "0.4.2" log = "0.4.2"
serde = "1.0.90" serde = "1.0.90"
serde_derive = "1.0.90" serde_derive = "1.0.90"
solana-logger = { path = "../../logger", version = "0.13.0" } solana-logger = { path = "../../logger", version = "0.13.2" }
solana-sdk = { path = "../../sdk", version = "0.13.0" } solana-sdk = { path = "../../sdk", version = "0.13.2" }
[dev-dependencies] [dev-dependencies]
solana-runtime = { path = "../../runtime", version = "0.13.0" } solana-runtime = { path = "../../runtime", version = "0.13.2" }
[lib] [lib]
name = "solana_config_api" name = "solana_config_api"

View File

@ -5,8 +5,8 @@ pub mod config_instruction;
pub mod config_processor; pub mod config_processor;
const CONFIG_PROGRAM_ID: [u8; 32] = [ 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, 3, 6, 74, 163, 0, 47, 116, 220, 200, 110, 67, 49, 15, 12, 5, 42, 248, 197, 218, 39, 246, 16,
0, 64, 25, 163, 35, 239, 160, 0, 0, 0, 0,
]; ];
pub fn check_id(program_id: &Pubkey) -> bool { pub fn check_id(program_id: &Pubkey) -> bool {

View File

@ -1,6 +1,6 @@
[package] [package]
name = "solana-config-program" name = "solana-config-program"
version = "0.13.0" version = "0.13.2"
description = "config program" description = "config program"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@ -10,9 +10,9 @@ edition = "2018"
[dependencies] [dependencies]
log = "0.4.2" log = "0.4.2"
solana-config-api = { path = "../config_api", version = "0.13.0" } solana-config-api = { path = "../config_api", version = "0.13.2" }
solana-logger = { path = "../../logger", version = "0.13.0" } solana-logger = { path = "../../logger", version = "0.13.2" }
solana-sdk = { path = "../../sdk", version = "0.13.0" } solana-sdk = { path = "../../sdk", version = "0.13.2" }
[lib] [lib]
name = "solana_config_program" name = "solana_config_program"

View File

@ -1,6 +1,6 @@
[package] [package]
name = "solana-exchange-api" name = "solana-exchange-api"
version = "0.13.0" version = "0.13.2"
description = "Solana Exchange program API" description = "Solana Exchange program API"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@ -13,11 +13,11 @@ log = "0.4.2"
bincode = "1.1.3" bincode = "1.1.3"
serde = "1.0.90" serde = "1.0.90"
serde_derive = "1.0.90" serde_derive = "1.0.90"
solana-logger = { path = "../../logger", version = "0.13.0" } solana-logger = { path = "../../logger", version = "0.13.2" }
solana-sdk = { path = "../../sdk", version = "0.13.0" } solana-sdk = { path = "../../sdk", version = "0.13.2" }
[dev-dependencies] [dev-dependencies]
solana-runtime = { path = "../../runtime", version = "0.13.0" } solana-runtime = { path = "../../runtime", version = "0.13.2" }
[lib] [lib]
name = "solana_exchange_api" name = "solana_exchange_api"

View File

@ -5,8 +5,8 @@ pub mod exchange_state;
use solana_sdk::pubkey::Pubkey; use solana_sdk::pubkey::Pubkey;
pub const EXCHANGE_PROGRAM_ID: [u8; 32] = [ 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, 3, 147, 111, 103, 210, 47, 14, 213, 108, 116, 49, 115, 232, 171, 14, 111, 167, 140, 221, 234,
0, 33, 70, 185, 192, 42, 31, 141, 152, 0, 0, 0, 0,
]; ];
pub fn check_id(program_id: &Pubkey) -> bool { pub fn check_id(program_id: &Pubkey) -> bool {

View File

@ -1,6 +1,6 @@
[package] [package]
name = "solana-exchange-program" name = "solana-exchange-program"
version = "0.13.0" version = "0.13.2"
description = "Solana exchange program" description = "Solana exchange program"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@ -10,9 +10,9 @@ edition = "2018"
[dependencies] [dependencies]
log = "0.4.2" log = "0.4.2"
solana-exchange-api = { path = "../exchange_api", version = "0.13.0" } solana-exchange-api = { path = "../exchange_api", version = "0.13.2" }
solana-logger = { path = "../../logger", version = "0.13.0" } solana-logger = { path = "../../logger", version = "0.13.2" }
solana-sdk = { path = "../../sdk", version = "0.13.0" } solana-sdk = { path = "../../sdk", version = "0.13.2" }
[lib] [lib]
name = "solana_exchange_program" name = "solana_exchange_program"

View File

@ -1,6 +1,6 @@
[package] [package]
name = "solana-failure-program" name = "solana-failure-program"
version = "0.13.0" version = "0.13.2"
description = "Solana failure program" description = "Solana failure program"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@ -9,11 +9,11 @@ homepage = "https://solana.com/"
edition = "2018" edition = "2018"
[dependencies] [dependencies]
solana-sdk = { path = "../../sdk", version = "0.13.0" } solana-sdk = { path = "../../sdk", version = "0.13.2" }
log = "0.4.2" log = "0.4.2"
[dev-dependencies] [dev-dependencies]
solana-runtime = { path = "../../runtime", version = "0.13.0" } solana-runtime = { path = "../../runtime", version = "0.13.2" }
[lib] [lib]
name = "solana_failure_program" name = "solana_failure_program"

View File

@ -1,6 +1,6 @@
[package] [package]
name = "solana-noop-program" name = "solana-noop-program"
version = "0.13.0" version = "0.13.2"
description = "Solana noop program" description = "Solana noop program"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@ -9,12 +9,12 @@ homepage = "https://solana.com/"
edition = "2018" edition = "2018"
[dependencies] [dependencies]
solana-sdk = { path = "../../sdk", version = "0.13.0" } solana-sdk = { path = "../../sdk", version = "0.13.2" }
solana-logger = { path = "../../logger", version = "0.13.0" } solana-logger = { path = "../../logger", version = "0.13.2" }
log = "0.4.2" log = "0.4.2"
[dev-dependencies] [dev-dependencies]
solana-runtime = { path = "../../runtime", version = "0.13.0" } solana-runtime = { path = "../../runtime", version = "0.13.2" }
[lib] [lib]
name = "solana_noop_program" name = "solana_noop_program"

View File

@ -1,6 +1,6 @@
[package] [package]
name = "solana-stake-api" name = "solana-stake-api"
version = "0.13.0" version = "0.13.2"
description = "Solana Stake program API" description = "Solana Stake program API"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@ -13,13 +13,13 @@ bincode = "1.1.3"
log = "0.4.2" log = "0.4.2"
serde = "1.0.90" serde = "1.0.90"
serde_derive = "1.0.90" serde_derive = "1.0.90"
solana-logger = { path = "../../logger", version = "0.13.0" } solana-logger = { path = "../../logger", version = "0.13.2" }
solana-metrics = { path = "../../metrics", version = "0.13.0" } solana-metrics = { path = "../../metrics", version = "0.13.2" }
solana-sdk = { path = "../../sdk", version = "0.13.0" } solana-sdk = { path = "../../sdk", version = "0.13.2" }
solana-vote-api = { path = "../vote_api", version = "0.13.0" } solana-vote-api = { path = "../vote_api", version = "0.13.2" }
[dev-dependencies] [dev-dependencies]
solana-runtime = { path = "../../runtime", version = "0.13.0" } solana-runtime = { path = "../../runtime", version = "0.13.2" }
[lib] [lib]
name = "solana_stake_api" name = "solana_stake_api"

View File

@ -4,8 +4,8 @@ pub mod stake_state;
use solana_sdk::pubkey::Pubkey; use solana_sdk::pubkey::Pubkey;
const STAKE_PROGRAM_ID: [u8; 32] = [ 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, 6, 161, 216, 23, 145, 55, 84, 42, 152, 52, 55, 189, 254, 42, 122, 178, 85, 127, 83, 92, 138,
0, 120, 114, 43, 104, 164, 157, 192, 0, 0, 0, 0,
]; ];
pub fn check_id(program_id: &Pubkey) -> bool { pub fn check_id(program_id: &Pubkey) -> bool {

View File

@ -1,6 +1,6 @@
[package] [package]
name = "solana-stake-program" name = "solana-stake-program"
version = "0.13.0" version = "0.13.2"
description = "Solana stake program" description = "Solana stake program"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@ -10,9 +10,9 @@ edition = "2018"
[dependencies] [dependencies]
log = "0.4.2" log = "0.4.2"
solana-logger = { path = "../../logger", version = "0.13.0" } solana-logger = { path = "../../logger", version = "0.13.2" }
solana-sdk = { path = "../../sdk", version = "0.13.0" } solana-sdk = { path = "../../sdk", version = "0.13.2" }
solana-stake-api = { path = "../stake_api", version = "0.13.0" } solana-stake-api = { path = "../stake_api", version = "0.13.2" }
[lib] [lib]
name = "solana_stake_program" name = "solana_stake_program"

View File

@ -1,6 +1,6 @@
[package] [package]
name = "solana-storage-api" name = "solana-storage-api"
version = "0.13.0" version = "0.13.2"
description = "Solana Storage program API" description = "Solana Storage program API"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@ -13,11 +13,11 @@ bincode = "1.1.3"
log = "0.4.2" log = "0.4.2"
serde = "1.0.90" serde = "1.0.90"
serde_derive = "1.0.90" serde_derive = "1.0.90"
solana-logger = { path = "../../logger", version = "0.13.0" } solana-logger = { path = "../../logger", version = "0.13.2" }
solana-sdk = { path = "../../sdk", version = "0.13.0" } solana-sdk = { path = "../../sdk", version = "0.13.2" }
[dev-dependencies] [dev-dependencies]
solana-runtime = { path = "../../runtime", version = "0.13.0" } solana-runtime = { path = "../../runtime", version = "0.13.2" }
[lib] [lib]
name = "solana_storage_api" name = "solana_storage_api"

View File

@ -11,8 +11,8 @@ pub fn get_segment_from_entry(entry_height: u64) -> usize {
} }
const STORAGE_PROGRAM_ID: [u8; 32] = [ 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, 6, 162, 25, 123, 127, 68, 233, 59, 131, 151, 21, 152, 162, 120, 90, 37, 154, 88, 86, 5, 156,
0, 221, 182, 201, 142, 103, 151, 112, 0, 0, 0, 0,
]; ];
pub fn check_id(program_id: &Pubkey) -> bool { pub fn check_id(program_id: &Pubkey) -> bool {

View File

@ -1,6 +1,6 @@
[package] [package]
name = "solana-storage-program" name = "solana-storage-program"
version = "0.13.0" version = "0.13.2"
description = "Solana storage program" description = "Solana storage program"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@ -10,9 +10,9 @@ edition = "2018"
[dependencies] [dependencies]
log = "0.4.2" log = "0.4.2"
solana-logger = { path = "../../logger", version = "0.13.0" } solana-logger = { path = "../../logger", version = "0.13.2" }
solana-sdk = { path = "../../sdk", version = "0.13.0" } solana-sdk = { path = "../../sdk", version = "0.13.2" }
solana-storage-api = { path = "../storage_api", version = "0.13.0" } solana-storage-api = { path = "../storage_api", version = "0.13.2" }
[lib] [lib]
name = "solana_storage_program" name = "solana_storage_program"

View File

@ -1,6 +1,6 @@
[package] [package]
name = "solana-token-api" name = "solana-token-api"
version = "0.13.0" version = "0.13.2"
description = "Solana Token API" description = "Solana Token API"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@ -13,8 +13,8 @@ bincode = "1.1.3"
log = "0.4.2" log = "0.4.2"
serde = "1.0.90" serde = "1.0.90"
serde_derive = "1.0.90" serde_derive = "1.0.90"
solana-logger = { path = "../../logger", version = "0.13.0" } solana-logger = { path = "../../logger", version = "0.13.2" }
solana-sdk = { path = "../../sdk", version = "0.13.0" } solana-sdk = { path = "../../sdk", version = "0.13.2" }
[lib] [lib]
name = "solana_token_api" name = "solana_token_api"

View File

@ -4,8 +4,8 @@ mod token_state;
use solana_sdk::pubkey::Pubkey; use solana_sdk::pubkey::Pubkey;
const TOKEN_PROGRAM_ID: [u8; 32] = [ 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, 6, 221, 246, 225, 142, 57, 236, 63, 240, 189, 82, 112, 85, 219, 2, 165, 51, 122, 113, 201, 115,
0, 12, 217, 253, 72, 146, 220, 192, 0, 0, 0, 0,
]; ];
pub fn id() -> Pubkey { pub fn id() -> Pubkey {

View File

@ -1,6 +1,6 @@
[package] [package]
name = "solana-token-program" name = "solana-token-program"
version = "0.13.0" version = "0.13.2"
description = "Solana token program" description = "Solana token program"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@ -10,9 +10,9 @@ edition = "2018"
[dependencies] [dependencies]
log = "0.4.2" log = "0.4.2"
solana-logger = { path = "../../logger", version = "0.13.0" } solana-logger = { path = "../../logger", version = "0.13.2" }
solana-sdk = { path = "../../sdk", version = "0.13.0" } solana-sdk = { path = "../../sdk", version = "0.13.2" }
solana-token-api = { path = "../token_api", version = "0.13.0" } solana-token-api = { path = "../token_api", version = "0.13.2" }
[lib] [lib]
name = "solana_token_program" name = "solana_token_program"

View File

@ -1,6 +1,6 @@
[package] [package]
name = "solana-vote-api" name = "solana-vote-api"
version = "0.13.0" version = "0.13.2"
description = "Solana Vote program API" description = "Solana Vote program API"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@ -13,12 +13,12 @@ bincode = "1.1.3"
log = "0.4.2" log = "0.4.2"
serde = "1.0.90" serde = "1.0.90"
serde_derive = "1.0.90" serde_derive = "1.0.90"
solana-logger = { path = "../../logger", version = "0.13.0" } solana-logger = { path = "../../logger", version = "0.13.2" }
solana-metrics = { path = "../../metrics", version = "0.13.0" } solana-metrics = { path = "../../metrics", version = "0.13.2" }
solana-sdk = { path = "../../sdk", version = "0.13.0" } solana-sdk = { path = "../../sdk", version = "0.13.2" }
[dev-dependencies] [dev-dependencies]
solana-runtime = { path = "../../runtime", version = "0.13.0" } solana-runtime = { path = "../../runtime", version = "0.13.2" }
[lib] [lib]
name = "solana_vote_api" name = "solana_vote_api"

View File

@ -4,8 +4,8 @@ pub mod vote_state;
use solana_sdk::pubkey::Pubkey; use solana_sdk::pubkey::Pubkey;
const VOTE_PROGRAM_ID: [u8; 32] = [ 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, 7, 97, 72, 29, 53, 116, 116, 187, 124, 77, 118, 36, 235, 211, 189, 179, 216, 53, 94, 115, 209,
0, 16, 67, 252, 13, 163, 83, 128, 0, 0, 0, 0,
]; ];
pub fn check_id(program_id: &Pubkey) -> bool { pub fn check_id(program_id: &Pubkey) -> bool {

View File

@ -1,6 +1,6 @@
[package] [package]
name = "solana-vote-program" name = "solana-vote-program"
version = "0.13.0" version = "0.13.2"
description = "Solana vote program" description = "Solana vote program"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@ -10,9 +10,9 @@ edition = "2018"
[dependencies] [dependencies]
log = "0.4.2" log = "0.4.2"
solana-logger = { path = "../../logger", version = "0.13.0" } solana-logger = { path = "../../logger", version = "0.13.2" }
solana-sdk = { path = "../../sdk", version = "0.13.0" } solana-sdk = { path = "../../sdk", version = "0.13.2" }
solana-vote-api = { path = "../vote_api", version = "0.13.0" } solana-vote-api = { path = "../vote_api", version = "0.13.2" }
[lib] [lib]
name = "solana_vote_program" name = "solana_vote_program"

View File

@ -2,17 +2,17 @@
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-replicator" name = "solana-replicator"
version = "0.13.0" version = "0.13.2"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
[dependencies] [dependencies]
clap = "2.33.0" clap = "2.33.0"
solana = { path = "../core", version = "0.13.0" } solana = { path = "../core", version = "0.13.2" }
solana-logger = { path = "../logger", version = "0.13.0" } solana-logger = { path = "../logger", version = "0.13.2" }
solana-netutil = { path = "../netutil", version = "0.13.0" } solana-netutil = { path = "../netutil", version = "0.13.2" }
solana-sdk = { path = "../sdk", version = "0.13.0" } solana-sdk = { path = "../sdk", version = "0.13.2" }
[features] [features]
chacha = ["solana/chacha"] chacha = ["solana/chacha"]

View File

@ -1,6 +1,6 @@
[package] [package]
name = "solana-runtime" name = "solana-runtime"
version = "0.13.0" version = "0.13.2"
description = "Solana runtime" description = "Solana runtime"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@ -23,10 +23,10 @@ rayon = "1.0.0"
serde = "1.0.88" serde = "1.0.88"
serde_derive = "1.0.88" serde_derive = "1.0.88"
serde_json = "1.0.38" serde_json = "1.0.38"
solana-logger = { path = "../logger", version = "0.13.0" } solana-logger = { path = "../logger", version = "0.13.2" }
solana-metrics = { path = "../metrics", version = "0.13.0" } solana-metrics = { path = "../metrics", version = "0.13.2" }
solana-sdk = { path = "../sdk", version = "0.13.0" } solana-sdk = { path = "../sdk", version = "0.13.2" }
solana-vote-api = { path = "../programs/vote_api", version = "0.13.0" } solana-vote-api = { path = "../programs/vote_api", version = "0.13.2" }
[lib] [lib]
name = "solana_runtime" name = "solana_runtime"

View File

@ -89,7 +89,7 @@ for Cargo_toml in "${Cargo_tomls[@]}"; do
( (
set -x set -x
sed -i "$Cargo_toml" -e " sed -i "$Cargo_toml" -e "
s/^$crate = .*path = \"\([^\"]*\)\".*\$/$crate = \{ path = \"\1\", version = \"$newVersion\" \}/ s/^$crate = { *path *= *\"\([^\"]*\)\" *, *version *= *\"[^\"]*\"\(.*\)} *\$/$crate = \{ path = \"\1\", version = \"$newVersion\"\2 \}/
" "
) )
done done

View File

@ -1,6 +1,6 @@
[package] [package]
name = "solana-sdk" name = "solana-sdk"
version = "0.13.0" version = "0.13.2"
description = "Solana SDK" description = "Solana SDK"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"

View File

@ -1,8 +1,8 @@
use crate::pubkey::Pubkey; use crate::pubkey::Pubkey;
const BPF_LOADER_PROGRAM_ID: [u8; 32] = [ 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, 2, 168, 246, 145, 78, 136, 161, 107, 189, 35, 149, 133, 95, 100, 4, 217, 180, 244, 86, 183,
0, 130, 27, 176, 20, 87, 73, 66, 140, 0, 0, 0, 0,
]; ];
pub fn id() -> Pubkey { pub fn id() -> Pubkey {

View File

@ -2,7 +2,8 @@ use crate::account::Account;
use crate::pubkey::Pubkey; use crate::pubkey::Pubkey;
const NATIVE_LOADER_PROGRAM_ID: [u8; 32] = [ 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 { pub fn id() -> Pubkey {

View File

@ -1,6 +1,8 @@
use crate::pubkey::Pubkey; 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 { pub fn id() -> Pubkey {
Pubkey::new(&SYSTEM_PROGRAM_ID) Pubkey::new(&SYSTEM_PROGRAM_ID)

View File

@ -1,6 +1,6 @@
[package] [package]
name = "solana-upload-perf" name = "solana-upload-perf"
version = "0.13.0" version = "0.13.2"
description = "Metrics Upload Utility" description = "Metrics Upload Utility"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@ -10,7 +10,7 @@ homepage = "https://solana.com/"
[dependencies] [dependencies]
serde_json = "1.0.39" serde_json = "1.0.39"
solana-metrics = { path = "../metrics", version = "0.13.0" } solana-metrics = { path = "../metrics", version = "0.13.2" }
[[bin]] [[bin]]
name = "solana-upload-perf" name = "solana-upload-perf"

View File

@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-vote-signer" name = "solana-vote-signer"
description = "Solana Vote Signing Service" description = "Solana Vote Signing Service"
version = "0.13.0" version = "0.13.2"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@ -17,8 +17,8 @@ jsonrpc-derive = "11.0.0"
jsonrpc-http-server = "11.0.0" jsonrpc-http-server = "11.0.0"
serde = "1.0.90" serde = "1.0.90"
serde_json = "1.0.39" serde_json = "1.0.39"
solana-sdk = { path = "../sdk", version = "0.13.0" } solana-sdk = { path = "../sdk", version = "0.13.2" }
solana-metrics = { path = "../metrics", version = "0.13.0" } solana-metrics = { path = "../metrics", version = "0.13.2" }
[lib] [lib]
name = "solana_vote_signer" name = "solana_vote_signer"

View File

@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-wallet" name = "solana-wallet"
description = "Blockchain, Rebuilt for Scale" description = "Blockchain, Rebuilt for Scale"
version = "0.13.0" version = "0.13.2"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@ -16,18 +16,18 @@ chrono = { version = "0.4.0", features = ["serde"] }
dirs = "1.0.5" dirs = "1.0.5"
log = "0.4.2" log = "0.4.2"
serde_json = "1.0.39" serde_json = "1.0.39"
solana-budget-api = { path = "../programs/budget_api", version = "0.13.0" } solana-budget-api = { path = "../programs/budget_api", version = "0.13.2" }
solana-client = { path = "../client", version = "0.13.0" } solana-client = { path = "../client", version = "0.13.2" }
solana-drone = { path = "../drone", version = "0.13.0" } solana-drone = { path = "../drone", version = "0.13.2" }
solana-logger = { path = "../logger", version = "0.13.0" } solana-logger = { path = "../logger", version = "0.13.2" }
solana-netutil = { path = "../netutil", version = "0.13.0" } solana-netutil = { path = "../netutil", version = "0.13.2" }
solana-sdk = { path = "../sdk", version = "0.13.0" } solana-sdk = { path = "../sdk", version = "0.13.2" }
solana-vote-api = { path = "../programs/vote_api", version = "0.13.0" } solana-vote-api = { path = "../programs/vote_api", version = "0.13.2" }
solana-vote-signer = { path = "../vote-signer", version = "0.13.0" } solana-vote-signer = { path = "../vote-signer", version = "0.13.2" }
[dev-dependencies] [dev-dependencies]
solana-budget-program = { path = "../programs/budget_program", version = "0.13.0" } solana-budget-program = { path = "../programs/budget_program", version = "0.13.2" }
solana = { path = "../core", version = "0.13.0" } solana = { path = "../core", version = "0.13.2" }
[features] [features]
cuda = [] cuda = []

View File

@ -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(
SubCommand::with_name("deploy") SubCommand::with_name("deploy")
.about("Deploy a program") .about("Deploy a program")

View File

@ -38,6 +38,7 @@ pub enum WalletCommand {
// ConfigureStakingAccount(delegate_id, authorized_voter_id) // ConfigureStakingAccount(delegate_id, authorized_voter_id)
AuthorizeVoter(Pubkey), AuthorizeVoter(Pubkey),
CreateVoteAccount(Pubkey, Pubkey, u32, u64), CreateVoteAccount(Pubkey, Pubkey, u32, u64),
ShowVoteAccount(Pubkey),
Deploy(String), Deploy(String),
GetTransactionCount, GetTransactionCount,
// Pay(lamports, to, timestamp, timestamp_pubkey, witness(es), cancelable) // Pay(lamports, to, timestamp, timestamp_pubkey, witness(es), cancelable)
@ -184,6 +185,10 @@ pub fn parse_command(
lamports, 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", Some(deploy_matches)) => Ok(WalletCommand::Deploy(
deploy_matches deploy_matches
.value_of("program_location") .value_of("program_location")
@ -368,6 +373,43 @@ fn process_create_staking(
Ok(signature_str.to_string()) 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( fn process_deploy(
rpc_client: &RpcClient, rpc_client: &RpcClient,
config: &WalletConfig, 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 // Deploy a custom program to the chain
WalletCommand::Deploy(ref program_location) => { WalletCommand::Deploy(ref program_location) => {
process_deploy(&rpc_client, config, program_location) process_deploy(&rpc_client, config, program_location)