Compare commits

...

22 Commits

Author SHA1 Message Date
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
68 changed files with 884 additions and 524 deletions

350
Cargo.lock generated
View File

@ -2136,7 +2136,7 @@ dependencies = [
[[package]]
name = "solana"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
@ -2166,20 +2166,20 @@ dependencies = [
"serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-budget-api 0.13.0",
"solana-budget-program 0.13.0",
"solana-client 0.13.0",
"solana-drone 0.13.0",
"solana-kvstore 0.13.0",
"solana-logger 0.13.0",
"solana-metrics 0.13.0",
"solana-netutil 0.13.0",
"solana-runtime 0.13.0",
"solana-sdk 0.13.0",
"solana-storage-api 0.13.0",
"solana-vote-api 0.13.0",
"solana-vote-program 0.13.0",
"solana-vote-signer 0.13.0",
"solana-budget-api 0.13.1",
"solana-budget-program 0.13.1",
"solana-client 0.13.1",
"solana-drone 0.13.1",
"solana-kvstore 0.13.1",
"solana-logger 0.13.1",
"solana-metrics 0.13.1",
"solana-netutil 0.13.1",
"solana-runtime 0.13.1",
"solana-sdk 0.13.1",
"solana-storage-api 0.13.1",
"solana-vote-api 0.13.1",
"solana-vote-program 0.13.1",
"solana-vote-signer 0.13.1",
"sys-info 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
"tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
"tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
@ -2188,85 +2188,85 @@ dependencies = [
[[package]]
name = "solana-bench-streamer"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
"solana 0.13.0",
"solana-logger 0.13.0",
"solana-netutil 0.13.0",
"solana 0.13.1",
"solana-logger 0.13.1",
"solana-netutil 0.13.1",
]
[[package]]
name = "solana-bench-tps"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
"rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
"solana 0.13.0",
"solana-client 0.13.0",
"solana-drone 0.13.0",
"solana-logger 0.13.0",
"solana-metrics 0.13.0",
"solana-netutil 0.13.0",
"solana-sdk 0.13.0",
"solana 0.13.1",
"solana-client 0.13.1",
"solana-drone 0.13.1",
"solana-logger 0.13.1",
"solana-metrics 0.13.1",
"solana-netutil 0.13.1",
"solana-sdk 0.13.1",
]
[[package]]
name = "solana-bpf-programs"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
"elf 0.0.10 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-bpfloader 0.13.0",
"solana-logger 0.13.0",
"solana-runtime 0.13.0",
"solana-sdk 0.13.0",
"solana-bpfloader 0.13.1",
"solana-logger 0.13.1",
"solana-runtime 0.13.1",
"solana-sdk 0.13.1",
"solana_rbpf 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
"walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "solana-bpfloader"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-logger 0.13.0",
"solana-sdk 0.13.0",
"solana-logger 0.13.1",
"solana-sdk 0.13.1",
"solana_rbpf 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "solana-budget-api"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-runtime 0.13.0",
"solana-sdk 0.13.0",
"solana-runtime 0.13.1",
"solana-sdk 0.13.1",
]
[[package]]
name = "solana-budget-program"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-budget-api 0.13.0",
"solana-logger 0.13.0",
"solana-sdk 0.13.0",
"solana-budget-api 0.13.1",
"solana-logger 0.13.1",
"solana-sdk 0.13.1",
]
[[package]]
name = "solana-client"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
@ -2277,37 +2277,37 @@ dependencies = [
"serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-logger 0.13.0",
"solana-netutil 0.13.0",
"solana-sdk 0.13.0",
"solana-logger 0.13.1",
"solana-netutil 0.13.1",
"solana-sdk 0.13.1",
]
[[package]]
name = "solana-config-api"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-logger 0.13.0",
"solana-runtime 0.13.0",
"solana-sdk 0.13.0",
"solana-logger 0.13.1",
"solana-runtime 0.13.1",
"solana-sdk 0.13.1",
]
[[package]]
name = "solana-config-program"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-config-api 0.13.0",
"solana-logger 0.13.0",
"solana-sdk 0.13.0",
"solana-config-api 0.13.1",
"solana-logger 0.13.1",
"solana-sdk 0.13.1",
]
[[package]]
name = "solana-drone"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
@ -2316,94 +2316,94 @@ dependencies = [
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-logger 0.13.0",
"solana-metrics 0.13.0",
"solana-sdk 0.13.0",
"solana-logger 0.13.1",
"solana-metrics 0.13.1",
"solana-sdk 0.13.1",
"tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
"tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "solana-exchange-api"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-logger 0.13.0",
"solana-runtime 0.13.0",
"solana-sdk 0.13.0",
"solana-logger 0.13.1",
"solana-runtime 0.13.1",
"solana-sdk 0.13.1",
]
[[package]]
name = "solana-exchange-program"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-exchange-api 0.13.0",
"solana-logger 0.13.0",
"solana-sdk 0.13.0",
"solana-exchange-api 0.13.1",
"solana-logger 0.13.1",
"solana-sdk 0.13.1",
]
[[package]]
name = "solana-failure-program"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-runtime 0.13.0",
"solana-sdk 0.13.0",
"solana-runtime 0.13.1",
"solana-sdk 0.13.1",
]
[[package]]
name = "solana-fullnode"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
"solana 0.13.0",
"solana-drone 0.13.0",
"solana-logger 0.13.0",
"solana-metrics 0.13.0",
"solana-netutil 0.13.0",
"solana-runtime 0.13.0",
"solana-sdk 0.13.0",
"solana-vote-api 0.13.0",
"solana-vote-signer 0.13.0",
"solana 0.13.1",
"solana-drone 0.13.1",
"solana-logger 0.13.1",
"solana-metrics 0.13.1",
"solana-netutil 0.13.1",
"solana-runtime 0.13.1",
"solana-sdk 0.13.1",
"solana-vote-api 0.13.1",
"solana-vote-signer 0.13.1",
]
[[package]]
name = "solana-genesis"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
"hashbrown 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
"solana 0.13.0",
"solana-budget-api 0.13.0",
"solana-config-api 0.13.0",
"solana-exchange-api 0.13.0",
"solana-sdk 0.13.0",
"solana-storage-api 0.13.0",
"solana-token-api 0.13.0",
"solana-vote-api 0.13.0",
"solana 0.13.1",
"solana-budget-api 0.13.1",
"solana-config-api 0.13.1",
"solana-exchange-api 0.13.1",
"solana-sdk 0.13.1",
"solana-storage-api 0.13.1",
"solana-token-api 0.13.1",
"solana-vote-api 0.13.1",
]
[[package]]
name = "solana-gossip"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
"env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
"solana 0.13.0",
"solana-netutil 0.13.0",
"solana-sdk 0.13.0",
"solana 0.13.1",
"solana-netutil 0.13.1",
"solana-sdk 0.13.1",
]
[[package]]
name = "solana-install"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
@ -2420,10 +2420,10 @@ dependencies = [
"serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_yaml 0.8.8 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-client 0.13.0",
"solana-config-api 0.13.0",
"solana-logger 0.13.0",
"solana-sdk 0.13.0",
"solana-client 0.13.1",
"solana-config-api 0.13.1",
"solana-logger 0.13.1",
"solana-sdk 0.13.1",
"tar 0.4.22 (registry+https://github.com/rust-lang/crates.io-index)",
"tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
"url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
@ -2431,16 +2431,16 @@ dependencies = [
[[package]]
name = "solana-keygen"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
"dirs 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-sdk 0.13.0",
"solana-sdk 0.13.1",
]
[[package]]
name = "solana-kvstore"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
@ -2455,40 +2455,40 @@ dependencies = [
[[package]]
name = "solana-ledger-tool"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"assert_cmd 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)",
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
"solana 0.13.0",
"solana-logger 0.13.0",
"solana-runtime 0.13.0",
"solana-sdk 0.13.0",
"solana 0.13.1",
"solana-logger 0.13.1",
"solana-runtime 0.13.1",
"solana-sdk 0.13.1",
]
[[package]]
name = "solana-logger"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "solana-metrics"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"influx_db_client 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
"reqwest 0.9.15 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-sdk 0.13.0",
"solana-sdk 0.13.1",
"sys-info 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "solana-netutil"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"ipnetwork 0.12.8 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
@ -2497,33 +2497,33 @@ dependencies = [
"rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
"reqwest 0.9.15 (registry+https://github.com/rust-lang/crates.io-index)",
"socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-logger 0.13.0",
"solana-logger 0.13.1",
]
[[package]]
name = "solana-noop-program"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-logger 0.13.0",
"solana-runtime 0.13.0",
"solana-sdk 0.13.0",
"solana-logger 0.13.1",
"solana-runtime 0.13.1",
"solana-sdk 0.13.1",
]
[[package]]
name = "solana-replicator"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
"solana 0.13.0",
"solana-logger 0.13.0",
"solana-netutil 0.13.0",
"solana-sdk 0.13.0",
"solana 0.13.1",
"solana-logger 0.13.1",
"solana-netutil 0.13.1",
"solana-sdk 0.13.1",
]
[[package]]
name = "solana-runtime"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"bv 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
@ -2539,15 +2539,15 @@ dependencies = [
"serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-logger 0.13.0",
"solana-metrics 0.13.0",
"solana-sdk 0.13.0",
"solana-vote-api 0.13.0",
"solana-logger 0.13.1",
"solana-metrics 0.13.1",
"solana-sdk 0.13.1",
"solana-vote-api 0.13.1",
]
[[package]]
name = "solana-sdk"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
@ -2568,109 +2568,109 @@ dependencies = [
[[package]]
name = "solana-stake-api"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-logger 0.13.0",
"solana-metrics 0.13.0",
"solana-runtime 0.13.0",
"solana-sdk 0.13.0",
"solana-vote-api 0.13.0",
"solana-logger 0.13.1",
"solana-metrics 0.13.1",
"solana-runtime 0.13.1",
"solana-sdk 0.13.1",
"solana-vote-api 0.13.1",
]
[[package]]
name = "solana-stake-program"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-logger 0.13.0",
"solana-sdk 0.13.0",
"solana-stake-api 0.13.0",
"solana-logger 0.13.1",
"solana-sdk 0.13.1",
"solana-stake-api 0.13.1",
]
[[package]]
name = "solana-storage-api"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-logger 0.13.0",
"solana-runtime 0.13.0",
"solana-sdk 0.13.0",
"solana-logger 0.13.1",
"solana-runtime 0.13.1",
"solana-sdk 0.13.1",
]
[[package]]
name = "solana-storage-program"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-logger 0.13.0",
"solana-sdk 0.13.0",
"solana-storage-api 0.13.0",
"solana-logger 0.13.1",
"solana-sdk 0.13.1",
"solana-storage-api 0.13.1",
]
[[package]]
name = "solana-token-api"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-logger 0.13.0",
"solana-sdk 0.13.0",
"solana-logger 0.13.1",
"solana-sdk 0.13.1",
]
[[package]]
name = "solana-token-program"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-logger 0.13.0",
"solana-sdk 0.13.0",
"solana-token-api 0.13.0",
"solana-logger 0.13.1",
"solana-sdk 0.13.1",
"solana-token-api 0.13.1",
]
[[package]]
name = "solana-upload-perf"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-metrics 0.13.0",
"solana-metrics 0.13.1",
]
[[package]]
name = "solana-vote-api"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-logger 0.13.0",
"solana-metrics 0.13.0",
"solana-runtime 0.13.0",
"solana-sdk 0.13.0",
"solana-logger 0.13.1",
"solana-metrics 0.13.1",
"solana-runtime 0.13.1",
"solana-sdk 0.13.1",
]
[[package]]
name = "solana-vote-program"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-logger 0.13.0",
"solana-sdk 0.13.0",
"solana-vote-api 0.13.0",
"solana-logger 0.13.1",
"solana-sdk 0.13.1",
"solana-vote-api 0.13.1",
]
[[package]]
name = "solana-vote-signer"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
@ -2680,13 +2680,13 @@ dependencies = [
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-metrics 0.13.0",
"solana-sdk 0.13.0",
"solana-metrics 0.13.1",
"solana-sdk 0.13.1",
]
[[package]]
name = "solana-wallet"
version = "0.13.0"
version = "0.13.1"
dependencies = [
"bincode 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
@ -2695,16 +2695,16 @@ dependencies = [
"dirs 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
"solana 0.13.0",
"solana-budget-api 0.13.0",
"solana-budget-program 0.13.0",
"solana-client 0.13.0",
"solana-drone 0.13.0",
"solana-logger 0.13.0",
"solana-netutil 0.13.0",
"solana-sdk 0.13.0",
"solana-vote-api 0.13.0",
"solana-vote-signer 0.13.0",
"solana 0.13.1",
"solana-budget-api 0.13.1",
"solana-budget-program 0.13.1",
"solana-client 0.13.1",
"solana-drone 0.13.1",
"solana-logger 0.13.1",
"solana-netutil 0.13.1",
"solana-sdk 0.13.1",
"solana-vote-api 0.13.1",
"solana-vote-signer 0.13.1",
]
[[package]]

View File

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

View File

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

View File

@ -9,7 +9,8 @@ in future releases.
The beta testnet features a validator running at beta.testnet.solana.com, which
serves as the entrypoint to the cluster for your validator.
Additionally there is a blockexplorer available at http://beta.testnet.solana.com/.
Additionally there is a blockexplorer available at
[http://beta.testnet.solana.com/](http://beta.testnet.solana.com/).
The beta testnet is configured to reset the ledger every 24hours, or sooner
should an hourly automated sanity test fail.
@ -25,6 +26,28 @@ traversal issues. A cloud-hosted machine works best. Ensure that IP ports
Prebuilt binaries are available for Linux x86_64 (Ubuntu 18.04 recommended).
MacOS or WSL users may build from source.
#### Confirm The Testnet Is Reachable
Before attaching a validator node, sanity check that the cluster is accessible
to your machine by running some simple wallet commands. If any of these
commands fail, please retry 5-10 minutes later to confirm the testnet is not
just restarting itself before debugging further.
Fetch the current testnet transaction count over JSON RPC:
```bash
$ curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1, "method":"getTransactionCount"}' http://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/U9-26Cqmk/testnet-monitor-cloud?refresh=60s&orgId=2&var-testnet=testnet-beta&var-hostid=All)
for more detail on cluster activity.
### Validator Setup
#### Obtaining The Software
##### Bootstrap with `solana-install`
@ -35,7 +58,7 @@ software on Linux x86_64 systems.
Install the latest release with a single shell command:
```bash
$ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.13.0/install/solana-install-init.sh | \
sh -c - --url https://api.beta.testnet.solana.com
sh -s - --url https://api.beta.testnet.solana.com
```
Alternatively build the `solana-install` program from source and run the
@ -67,47 +90,31 @@ $ ./scripts/cargo-install-all.sh .
$ export PATH=$PWD/bin:$PATH
```
#### Confirm The Testnet Is Reachable
Before attaching a validator node, sanity check that the cluster is accessible
to your machine by running some simple wallet commands. If any of these
commands fail, please retry 5-10 minutes later to confirm the testnet is not
just restarting itself before debugging further.
### Starting The Validator
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
$ solana-wallet -n beta.testnet.solana.com airdrop 123
$ solana-wallet -n beta.testnet.solana.com balance
```
Fetch the current testnet transaction count over JSON RPC:
```bash
$ curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1, "method":"getTransactionCount"}' http://beta.testnet.solana.com:8899
```
Inspect the blockexplorer at http://beta.testnet.solana.com/ for activity.
Run the following command to join the gossip network and view all the other nodes in the cluster:
```bash
$ solana-gossip --network beta.testnet.solana.com:8001
```
### Starting The Validator
The following command will start a new validator node.
Then the following command will start a new validator node.
If this is a `solana-install`-installation:
```bash
$ fullnode-x.sh --public-address --poll-for-new-genesis-block beta.testnet.solana.com:8001
$ fullnode-x.sh --public-address --poll-for-new-genesis-block beta.testnet.solana.com
```
Alternatively, the `solana-install run` command can be used to run the validator
node while periodically checking for and applying software updates:
```bash
$ solana-install run fullnode-x.sh --public-address --poll-for-new-genesis-block beta.testnet.solana.com:8001
$ solana-install run fullnode-x.sh -- --public-address --poll-for-new-genesis-block beta.testnet.solana.com
```
When not using `solana-install`:
```bash
$ USE_INSTALL=1 ./multinode-demo/fullnode-x.sh --public-address --poll-for-new-genesis-block beta.testnet.solana.com:8001
$ USE_INSTALL=1 ./multinode-demo/fullnode-x.sh --public-address --poll-for-new-genesis-block beta.testnet.solana.com
```
Then from another console, confirm the IP address if your node is now visible in
@ -133,4 +140,3 @@ export p="password obtained from the Solana maintainers"
export SOLANA_METRICS_CONFIG="db=testnet-beta,u=${u:?},p=${p:?}"
source scripts/configure-metrics.sh
```
Inspect for your contributions to our [metrics dashboard](https://metrics.solana.com:3000/d/U9-26Cqmk/testnet-monitor-cloud?refresh=60s&orgId=2&var-hostid=All).

View File

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

View File

@ -19,9 +19,10 @@ CRATES=(
metrics
client
drone
programs/{budget_api,config_api,storage_api,token_api,vote_api}
programs/{budget_api,config_api,stake_api,storage_api,token_api,vote_api,exchange_api}
programs/{vote_program,budget_program,bpf_loader,config_program,exchange_program,failure_program}
programs/{noop_program,stake_program,storage_program,token_program}
runtime
programs/{budget,bpf_loader,config,vote,storage,token,vote}
vote-signer
core
fullnode
@ -32,7 +33,6 @@ CRATES=(
install
)
# Only package/publish if this is a tagged release
[[ -n $TRIGGERED_BUILDKITE_TAG ]] || {
echo TRIGGERED_BUILDKITE_TAG unset, skipped
@ -55,7 +55,7 @@ for crate in "${CRATES[@]}"; do
exit 1
fi
echo "-- $crate"
grep -q "^version = \"$expectedCrateVersion\"$" Cargo.toml || {
grep -q "^version = \"$expectedCrateVersion\"$" "$crate"/Cargo.toml || {
echo "Error: $crate/Cargo.toml version is not $expectedCrateVersion"
exit 1
}

View File

@ -72,6 +72,9 @@ export SOLANA_METRICS_CONFIG="db=$TESTNET,$SOLANA_METRICS_PARTIAL_CONFIG"
echo "SOLANA_METRICS_CONFIG: $SOLANA_METRICS_CONFIG"
source scripts/configure-metrics.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)
ci/channel-info.sh
eval "$(ci/channel-info.sh)"
@ -124,7 +127,8 @@ sanity() {
testnet-edge)
(
set -x
ci/testnet-sanity.sh edge-testnet-solana-com ec2 us-west-1a
NO_LEDGER_VERIFY=1 \
ci/testnet-sanity.sh edge-testnet-solana-com ec2 us-west-1a
)
;;
testnet-edge-perf)
@ -139,22 +143,21 @@ sanity() {
testnet-beta)
(
set -x
EC2_ZONES=(us-west-1a sa-east-1a ap-northeast-2a eu-central-1a ca-central-1a)
ok=true
for zone in "${EC2_ZONES[@]}"; do
if ! $ok; then
break
fi
ci/testnet-sanity.sh beta-testnet-solana-com ec2 "$zone" || ok=false
done
GCE_ZONES=(us-west1-b asia-east2-a europe-west4-a southamerica-east1-b us-east4-c)
for zone in "${GCE_ZONES[@]}"; do
if ! $ok; then
break
ok=true
if [[ -n $EC2_NODE_COUNT ]]; then
NO_LEDGER_VERIFY=1 \
ci/testnet-sanity.sh beta-testnet-solana-com ec2 "${EC2_ZONES[0]}" || ok=false
fi
if $ok && [[ -n $GCE_NODE_COUNT ]]; then
if [[ -n $EC2_NODE_COUNT ]]; then
echo "TODO: Fix testnet-sanity.sh to work with a multinode testnet. It needs an '-x'-like argument"
exit 1
fi
ci/testnet-sanity.sh beta-testnet-solana-com gce "$zone" || ok=false
done
NO_LEDGER_VERIFY=1 \
ci/testnet-sanity.sh beta-testnet-solana-com gce "${GCE_ZONES[0]}" || ok=false
fi
$ok
)
;;
@ -170,7 +173,8 @@ sanity() {
testnet)
(
set -x
ci/testnet-sanity.sh testnet-solana-com ec2 us-west-1a
NO_LEDGER_VERIFY=1 \
ci/testnet-sanity.sh testnet-solana-com ec2 us-west-1a
#ci/testnet-sanity.sh testnet-solana-com gce us-east1-c
)
;;
@ -227,8 +231,6 @@ start() {
testnet-beta)
(
set -x
EC2_ZONES=(us-west-1a sa-east-1a ap-northeast-2a eu-central-1a ca-central-1a)
GCE_ZONES=(us-west1-b asia-east2-a europe-west4-a southamerica-east1-b us-east4-c)
# Build an array to pass as opts to testnet-deploy.sh: "-z zone1 -z zone2 ..."
GCE_ZONE_ARGS=()
@ -241,19 +243,23 @@ start() {
EC2_ZONE_ARGS+=("-z $val")
done
[[ -n $EC2_NODE_COUNT ]] || EC2_NODE_COUNT=60
[[ -n $GCE_NODE_COUNT ]] || GCE_NODE_COUNT=40
if [[ -n $EC2_NODE_COUNT ]]; then
# shellcheck disable=SC2068
ci/testnet-deploy.sh -p beta-testnet-solana-com -C ec2 ${EC2_ZONE_ARGS[@]} \
-t "$CHANNEL_OR_TAG" -n "$EC2_NODE_COUNT" -c 0 -u -P -a eipalloc-0f286cf8a0771ce35 \
${maybeReuseLedger:+-r} \
${maybeDelete:+-D} \
${GCE_NODE_COUNT:+-s}
fi
# shellcheck disable=SC2068
ci/testnet-deploy.sh -p beta-testnet-solana-com -C ec2 ${EC2_ZONE_ARGS[@]} \
-t "$CHANNEL_OR_TAG" -n "$EC2_NODE_COUNT" -c 0 -s -u -P -a eipalloc-0f286cf8a0771ce35 \
${maybeReuseLedger:+-r} \
${maybeDelete:+-D}
# shellcheck disable=SC2068
ci/testnet-deploy.sh -p beta-testnet-solana-com -C gce ${GCE_ZONE_ARGS[@]} \
-t "$CHANNEL_OR_TAG" -n "$GCE_NODE_COUNT" -c 0 -x -P \
${maybeReuseLedger:+-r} \
${maybeDelete:+-D}
if [[ -n $GCE_NODE_COUNT ]]; then
# shellcheck disable=SC2068
ci/testnet-deploy.sh -p beta-testnet-solana-com -C gce ${GCE_ZONE_ARGS[@]} \
-t "$CHANNEL_OR_TAG" -n "$GCE_NODE_COUNT" -c 0 -P \
${maybeReuseLedger:+-r} \
${maybeDelete:+-D} \
${EC2_NODE_COUNT:+-x}
fi
)
;;
testnet-beta-perf)

View File

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

View File

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

View File

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

View File

@ -296,8 +296,8 @@ impl Blocktree {
let slot_meta = &mut entry.0.borrow_mut();
// This slot is full, skip the bogus blob
if slot_meta.is_full() {
// Check if this blob should be inserted
if !self.should_insert_blob(&slot_meta, &prev_inserted_blob_datas, blob) {
continue;
}
@ -1036,12 +1036,6 @@ impl Blocktree {
let blob_slot = blob_to_insert.slot();
let blob_size = blob_to_insert.size();
if blob_index < slot_meta.consumed
|| prev_inserted_blob_datas.contains_key(&(blob_slot, blob_index))
{
return Err(Error::BlocktreeError(BlocktreeError::BlobForIndexExists));
}
let new_consumed = {
if slot_meta.consumed == blob_index {
let blob_datas = self.get_slot_consecutive_blobs(
@ -1276,6 +1270,64 @@ impl Blocktree {
self.db.write(batch)?;
Ok(())
}
fn should_insert_blob(
&self,
slot: &SlotMeta,
prev_inserted_blob_datas: &HashMap<(u64, u64), &[u8]>,
blob: &Blob,
) -> bool {
let blob_index = blob.index();
let blob_slot = blob.slot();
// Check that the blob doesn't already exist
if blob_index < slot.consumed
|| prev_inserted_blob_datas.contains_key(&(blob_slot, blob_index))
|| self
.get_data_blob_bytes(blob_slot, blob_index)
.unwrap()
.is_some()
{
return false;
}
// Check that we do not receive blobs >= than the last_index
// for the slot
let last_index = slot.last_index;
if blob_index >= last_index {
solana_metrics::submit(
solana_metrics::influxdb::Point::new("blocktree_invalid_blob_error")
.add_field(
"error",
solana_metrics::influxdb::Value::String(format!(
"Received last blob with index {} >= slot.last_index {}",
blob_index, last_index
)),
)
.to_owned(),
);
return false;
}
// Check that we do not receive a blob with "last_index" true, but index
// less than our current received
if blob.is_last_in_slot() && blob_index < slot.received {
solana_metrics::submit(
solana_metrics::influxdb::Point::new("blocktree_invalid_blob_error")
.add_field(
"error",
solana_metrics::influxdb::Value::String(format!(
"Received last blob with index {} < slot.received {}",
blob_index, slot.received
)),
)
.to_owned(),
);
return false;
}
true
}
}
// Creates a new ledger with slot 0 full of ticks (and only ticks).
@ -2665,6 +2717,69 @@ pub mod tests {
Blocktree::destroy(&blocktree_path).expect("Expected successful database destruction");
}
#[test]
pub fn test_should_insert_blob() {
let (mut blobs, _) = make_slot_entries(0, 0, 20);
let blocktree_path = get_tmp_ledger_path!();
let blocktree = Blocktree::open(&blocktree_path).unwrap();
// Insert the first 5 blobs, we don't have a "is_last" blob yet
blocktree.insert_data_blobs(&blobs[0..5]).unwrap();
// Trying to insert a blob less than consumed should fail
let slot_meta = blocktree.meta(0).unwrap().unwrap();
assert_eq!(slot_meta.consumed, 5);
assert!(!blocktree.should_insert_blob(&slot_meta, &HashMap::new(), &blobs[4].clone()));
// Trying to insert the same blob again should fail
blocktree.insert_data_blobs(&blobs[7..8]).unwrap();
let slot_meta = blocktree.meta(0).unwrap().unwrap();
assert!(!blocktree.should_insert_blob(&slot_meta, &HashMap::new(), &blobs[7].clone()));
// Trying to insert another "is_last" blob with index < the received index
// should fail
blocktree.insert_data_blobs(&blobs[8..9]).unwrap();
let slot_meta = blocktree.meta(0).unwrap().unwrap();
assert_eq!(slot_meta.received, 9);
blobs[8].set_is_last_in_slot();
assert!(!blocktree.should_insert_blob(&slot_meta, &HashMap::new(), &blobs[8].clone()));
// Insert the 10th blob, which is marked as "is_last"
blobs[9].set_is_last_in_slot();
blocktree.insert_data_blobs(&blobs[9..10]).unwrap();
let slot_meta = blocktree.meta(0).unwrap().unwrap();
// Trying to insert a blob with index > the "is_last" blob should fail
assert!(!blocktree.should_insert_blob(&slot_meta, &HashMap::new(), &blobs[10].clone()));
drop(blocktree);
Blocktree::destroy(&blocktree_path).expect("Expected successful database destruction");
}
#[test]
pub fn test_insert_multiple_is_last() {
let (mut blobs, _) = make_slot_entries(0, 0, 20);
let blocktree_path = get_tmp_ledger_path!();
let blocktree = Blocktree::open(&blocktree_path).unwrap();
// Inserting multiple blobs with the is_last flag set should only insert
// the first blob with the "is_last" flag, and drop the rest
for i in 6..20 {
blobs[i].set_is_last_in_slot();
}
blocktree.insert_data_blobs(&blobs[..]).unwrap();
let slot_meta = blocktree.meta(0).unwrap().unwrap();
assert_eq!(slot_meta.consumed, 7);
assert_eq!(slot_meta.received, 7);
assert_eq!(slot_meta.last_index, 6);
assert!(slot_meta.is_full());
drop(blocktree);
Blocktree::destroy(&blocktree_path).expect("Expected successful database destruction");
}
#[cfg(feature = "erasure")]
mod erasure {
use super::*;

View File

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

View File

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

View File

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

View File

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

View File

@ -5,6 +5,7 @@ use bincode;
use byteorder::{ByteOrder, LittleEndian};
use serde::Serialize;
use solana_metrics::counter::Counter;
use solana_sdk::hash::Hash;
pub use solana_sdk::packet::PACKET_DATA_SIZE;
use solana_sdk::pubkey::Pubkey;
use std::borrow::Borrow;
@ -363,7 +364,8 @@ const SLOT_RANGE: std::ops::Range<usize> = range!(PARENT_RANGE.end, u64);
const INDEX_RANGE: std::ops::Range<usize> = range!(SLOT_RANGE.end, u64);
const ID_RANGE: std::ops::Range<usize> = range!(INDEX_RANGE.end, Pubkey);
const FORWARD_RANGE: std::ops::Range<usize> = range!(ID_RANGE.end, bool);
const FLAGS_RANGE: std::ops::Range<usize> = range!(FORWARD_RANGE.end, u32);
const GENESIS_RANGE: std::ops::Range<usize> = range!(FORWARD_RANGE.end, Hash);
const FLAGS_RANGE: std::ops::Range<usize> = range!(GENESIS_RANGE.end, u32);
const SIZE_RANGE: std::ops::Range<usize> = range!(FLAGS_RANGE.end, u64);
macro_rules! align {
@ -439,6 +441,14 @@ impl Blob {
self.data[FORWARD_RANGE][0] = u8::from(forward)
}
pub fn set_genesis_blockhash(&mut self, blockhash: &Hash) {
self.data[GENESIS_RANGE].copy_from_slice(blockhash.as_ref())
}
pub fn genesis_blockhash(&self) -> Hash {
Hash::new(&self.data[GENESIS_RANGE])
}
pub fn flags(&self) -> u32 {
LittleEndian::read_u32(&self.data[FLAGS_RANGE])
}
@ -577,12 +587,24 @@ impl Blob {
}
}
pub fn index_blobs(blobs: &[SharedBlob], id: &Pubkey, mut blob_index: u64, slot: u64, parent: u64) {
pub fn index_blobs(blobs: &[SharedBlob], id: &Pubkey, blob_index: u64, slot: u64, parent: u64) {
index_blobs_with_genesis(blobs, id, &Hash::default(), blob_index, slot, parent)
}
pub fn index_blobs_with_genesis(
blobs: &[SharedBlob],
id: &Pubkey,
genesis: &Hash,
mut blob_index: u64,
slot: u64,
parent: u64,
) {
// enumerate all the blobs, those are the indices
for blob in blobs.iter() {
let mut blob = blob.write().unwrap();
blob.set_index(blob_index);
blob.set_genesis_blockhash(genesis);
blob.set_slot(slot);
blob.set_parent(parent);
blob.set_id(id);
@ -835,4 +857,14 @@ mod tests {
assert!(p1 != p2);
}
#[test]
fn test_blob_genesis_blockhash() {
let mut blob = Blob::default();
assert_eq!(blob.genesis_blockhash(), Hash::default());
let hash = Hash::new(&Pubkey::new_rand().as_ref());
blob.set_genesis_blockhash(&hash);
assert_eq!(blob.genesis_blockhash(), hash);
}
}

View File

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

View File

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

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())
}
/// At the specified epoch, collect the delgate account balance and vote states for delegates
/// At the specified epoch, collect the delegate account balance and vote states for delegates
/// that have non-zero balance in any of their managed staking accounts
pub fn delegated_stakes_at_epoch(bank: &Bank, epoch_height: u64) -> Option<HashMap<Pubkey, u64>> {
let node_staked_accounts = node_staked_accounts_at_epoch(bank, epoch_height);

View File

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

View File

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

View File

@ -1,15 +1,18 @@
//! `window_service` handles the data plane incoming blobs, storing them in
//! blocktree and retransmitting where required
//!
use crate::bank_forks::BankForks;
use crate::blocktree::Blocktree;
use crate::cluster_info::ClusterInfo;
use crate::packet::{SharedBlob, BLOB_HEADER_SIZE};
use crate::leader_schedule_utils::slot_leader_at;
use crate::packet::{Blob, SharedBlob, BLOB_HEADER_SIZE};
use crate::repair_service::{RepairService, RepairSlotRange};
use crate::result::{Error, Result};
use crate::service::Service;
use crate::streamer::{BlobReceiver, BlobSender};
use solana_metrics::counter::Counter;
use solana_metrics::{influxdb, submit};
use solana_runtime::bank::Bank;
use solana_sdk::hash::Hash;
use solana_sdk::pubkey::Pubkey;
use solana_sdk::timing::duration_as_ms;
use std::net::UdpSocket;
@ -64,33 +67,57 @@ fn process_blobs(blobs: &[SharedBlob], blocktree: &Arc<Blocktree>) -> Result<()>
Ok(())
}
/// drop blobs that are from myself or not from the correct leader for the
/// blob's slot
fn should_retransmit_and_persist(blob: &Blob, bank: Option<&Arc<Bank>>, my_id: &Pubkey) -> bool {
let slot_leader_id = bank.and_then(|bank| slot_leader_at(blob.slot(), &bank));
if blob.id() == *my_id {
inc_new_counter_info!("streamer-recv_window-circular_transmission", 1);
false
} else if slot_leader_id == None {
inc_new_counter_info!("streamer-recv_window-unknown_leader", 1);
true
} else if slot_leader_id != Some(blob.id()) {
inc_new_counter_info!("streamer-recv_window-wrong_leader", 1);
false
} else {
true
}
}
fn recv_window(
bank_forks: Option<&Arc<RwLock<BankForks>>>,
blocktree: &Arc<Blocktree>,
id: &Pubkey,
my_id: &Pubkey,
r: &BlobReceiver,
retransmit: &BlobSender,
genesis_blockhash: &Hash,
) -> Result<()> {
let timer = Duration::from_millis(200);
let mut dq = r.recv_timeout(timer)?;
let mut blobs = r.recv_timeout(timer)?;
while let Ok(mut nq) = r.try_recv() {
dq.append(&mut nq)
while let Ok(mut blob) = r.try_recv() {
blobs.append(&mut blob)
}
let now = Instant::now();
inc_new_counter_info!("streamer-recv_window-recv", dq.len(), 100);
inc_new_counter_info!("streamer-recv_window-recv", blobs.len());
submit(
influxdb::Point::new("recv-window")
.add_field("count", influxdb::Value::Integer(dq.len() as i64))
.to_owned(),
);
blobs.retain(|blob| {
should_retransmit_and_persist(
&blob.read().unwrap(),
bank_forks
.map(|bank_forks| bank_forks.read().unwrap().working_bank())
.as_ref(),
my_id,
) && blob.read().unwrap().genesis_blockhash() == *genesis_blockhash
});
retransmit_blobs(&dq, retransmit, id)?;
retransmit_blobs(&blobs, retransmit, my_id)?;
//send a contiguous set of blocks
trace!("{} num blobs received: {}", id, dq.len());
trace!("{} num blobs received: {}", my_id, blobs.len());
process_blobs(&dq, blocktree)?;
process_blobs(&blobs, blocktree)?;
trace!(
"Elapsed processing time in recv_window(): {}",
@ -124,7 +151,9 @@ pub struct WindowService {
}
impl WindowService {
#[allow(clippy::too_many_arguments)]
pub fn new(
bank_forks: Option<Arc<RwLock<BankForks>>>,
blocktree: Arc<Blocktree>,
cluster_info: Arc<RwLock<ClusterInfo>>,
r: BlobReceiver,
@ -132,6 +161,7 @@ impl WindowService {
repair_socket: Arc<UdpSocket>,
exit: &Arc<AtomicBool>,
repair_slot_range: Option<RepairSlotRange>,
genesis_blockhash: &Hash,
) -> WindowService {
let repair_service = RepairService::new(
blocktree.clone(),
@ -141,6 +171,8 @@ impl WindowService {
repair_slot_range,
);
let exit = exit.clone();
let bank_forks = bank_forks.clone();
let hash = *genesis_blockhash;
let t_window = Builder::new()
.name("solana-window".to_string())
.spawn(move || {
@ -151,7 +183,9 @@ impl WindowService {
if exit.load(Ordering::Relaxed) {
break;
}
if let Err(e) = recv_window(&blocktree, &id, &r, &retransmit) {
if let Err(e) =
recv_window(bank_forks.as_ref(), &blocktree, &id, &r, &retransmit, &hash)
{
match e {
Error::RecvTimeoutError(RecvTimeoutError::Disconnected) => break,
Error::RecvTimeoutError(RecvTimeoutError::Timeout) => (),
@ -184,12 +218,15 @@ impl Service for WindowService {
#[cfg(test)]
mod test {
use super::*;
use crate::bank_forks::BankForks;
use crate::blocktree::{get_tmp_ledger_path, Blocktree};
use crate::cluster_info::{ClusterInfo, Node};
use crate::entry::{make_consecutive_blobs, make_tiny_test_entries, EntrySlice};
use crate::packet::index_blobs;
use crate::packet::{index_blobs, Blob};
use crate::service::Service;
use crate::streamer::{blob_receiver, responder};
use solana_runtime::bank::Bank;
use solana_sdk::genesis_block::GenesisBlock;
use solana_sdk::hash::Hash;
use std::fs::remove_dir_all;
use std::net::UdpSocket;
@ -221,6 +258,46 @@ mod test {
Blocktree::destroy(&blocktree_path).expect("Expected successful database destruction");
}
#[test]
fn test_should_retransmit_and_persist() {
let me_id = Pubkey::new_rand();
let leader_id = Pubkey::new_rand();
let bank = Arc::new(Bank::new(
&GenesisBlock::new_with_leader(100, &leader_id, 10).0,
));
let mut blob = Blob::default();
blob.set_id(&leader_id);
// without a Bank and blobs not from me, blob continues
assert_eq!(should_retransmit_and_persist(&blob, None, &me_id), true);
// with a Bank for slot 0, blob continues
assert_eq!(
should_retransmit_and_persist(&blob, Some(&bank), &me_id),
true
);
// set the blob to have come from the wrong leader
blob.set_id(&Pubkey::new_rand());
assert_eq!(
should_retransmit_and_persist(&blob, Some(&bank), &me_id),
false
);
// with a Bank and no idea who leader is, we keep the blobs (for now)
// TODO: persistr in blocktree that we didn't know who the leader was at the time?
blob.set_slot(100);
assert_eq!(
should_retransmit_and_persist(&blob, Some(&bank), &me_id),
true
);
// if the blob came back from me, it doesn't continue, whether or not I have a bank
blob.set_id(&me_id);
assert_eq!(should_retransmit_and_persist(&blob, None, &me_id), false);
}
#[test]
pub fn window_send_test() {
solana_logger::setup();
@ -241,6 +318,10 @@ mod test {
Blocktree::open(&blocktree_path).expect("Expected to be able to open database ledger"),
);
let t_window = WindowService::new(
Some(Arc::new(RwLock::new(BankForks::new(
0,
Bank::new(&GenesisBlock::new_with_leader(100, &me_id, 10).0),
)))),
blocktree,
subs,
r_reader,
@ -248,6 +329,7 @@ mod test {
Arc::new(leader_node.sockets.repair),
&exit,
None,
&Hash::default(),
);
let t_responder = {
let (s_responder, r_responder) = channel();
@ -313,6 +395,10 @@ mod test {
Blocktree::open(&blocktree_path).expect("Expected to be able to open database ledger"),
);
let t_window = WindowService::new(
Some(Arc::new(RwLock::new(BankForks::new(
0,
Bank::new(&GenesisBlock::new_with_leader(100, &me_id, 10).0),
)))),
blocktree,
subs.clone(),
r_reader,
@ -320,6 +406,7 @@ mod test {
Arc::new(leader_node.sockets.repair),
&exit,
None,
&Hash::default(),
);
let t_responder = {
let (s_responder, r_responder) = channel();

View File

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

View File

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

View File

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

View File

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

View File

@ -14,6 +14,7 @@ use std::error;
pub const BOOTSTRAP_LEADER_LAMPORTS: u64 = 43;
fn main() -> Result<(), Box<dyn error::Error>> {
let default_bootstrap_leader_lamports = &BOOTSTRAP_LEADER_LAMPORTS.to_string();
let matches = App::new(crate_name!())
.about(crate_description!())
.version(crate_version!())
@ -62,6 +63,15 @@ fn main() -> Result<(), Box<dyn error::Error>> {
.required(true)
.help("Path to file containing the bootstrap leader's staking keypair"),
)
.arg(
Arg::with_name("bootstrap_leader_lamports")
.long("bootstrap-leader-lamports")
.value_name("LAMPORTS")
.takes_value(true)
.default_value(default_bootstrap_leader_lamports)
.required(true)
.help("Number of lamports to assign to the bootstrap leader"),
)
.get_matches();
let bootstrap_leader_keypair_file = matches.value_of("bootstrap_leader_keypair_file").unwrap();
@ -69,6 +79,7 @@ fn main() -> Result<(), Box<dyn error::Error>> {
let ledger_path = matches.value_of("ledger_path").unwrap();
let mint_keypair_file = matches.value_of("mint_keypair_file").unwrap();
let lamports = value_t_or_exit!(matches, "lamports", u64);
let bootstrap_leader_lamports = value_t_or_exit!(matches, "bootstrap_leader_lamports", u64);
let bootstrap_leader_keypair = read_keypair(bootstrap_leader_keypair_file)?;
let bootstrap_vote_keypair = read_keypair(bootstrap_vote_keypair_file)?;
@ -77,7 +88,7 @@ fn main() -> Result<(), Box<dyn error::Error>> {
let (mut genesis_block, _mint_keypair) = GenesisBlock::new_with_leader(
lamports,
&bootstrap_leader_keypair.pubkey(),
BOOTSTRAP_LEADER_LAMPORTS,
bootstrap_leader_lamports,
);
genesis_block.mint_id = mint_keypair.pubkey();
genesis_block.bootstrap_leader_vote_account_id = bootstrap_vote_keypair.pubkey();

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -138,6 +138,7 @@ setup_vote_account() {
declare drone_address=$1
declare node_id_path=$2
declare vote_id_path=$3
declare stake=$4
declare node_id
node_id=$($solana_wallet --keypair "$node_id_path" address)
@ -147,19 +148,17 @@ setup_vote_account() {
if [[ -f "$vote_id_path".configured ]]; then
echo "Vote account has already been configured"
return 0
else
airdrop "$node_id_path" "$drone_address" "$stake" || return $?
# Fund the vote account from the node, with the node as the node_id
$solana_wallet --keypair "$node_id_path" --host "$drone_address" \
create-vote-account "$vote_id" "$node_id" $((stake - 1)) || return $?
touch "$vote_id_path".configured
fi
# A fullnode requires 43 lamports to function:
# - one lamport to keep the node identity public key valid. TODO: really??
# - 42 more for the vote account we fund
airdrop "$node_id_path" "$drone_address" 43 || return $?
# Fund the vote account from the node, with the node as the node_id
$solana_wallet --keypair "$node_id_path" --host "$drone_address" \
create-vote-account "$vote_id" "$node_id" 42 || return $?
touch "$vote_id_path".configured
$solana_wallet --keypair "$node_id_path" --host "$drone_address" show-vote-account "$vote_id"
return 0
}
@ -169,7 +168,7 @@ fullnode_usage() {
echo
fi
cat <<EOF
usage: $0 [-x] [--blockstream PATH] [--init-complete-file FILE] [--only-bootstrap-stake] [--no-voting] [--rpc-port port] [rsync network path to bootstrap leader configuration] [network entry point]
usage: $0 [-x] [--blockstream PATH] [--init-complete-file FILE] [--stake LAMPORTS] [--no-voting] [--rpc-port port] [rsync network path to bootstrap leader configuration] [network entry point]
Start a full node on the specified network
@ -178,7 +177,7 @@ Start a full node on the specified network
the specified label. Does not apply to the bootstrap leader
--blockstream PATH - open blockstream at this unix domain socket location
--init-complete-file FILE - create this file, if it doesn't already exist, once node initialization is complete
--only-bootstrap-stake - Only stake the bootstrap leader, effectively disabling leader rotation
--stake LAMPORTS - Number of lamports to stake
--public-address - advertise public machine address in gossip. By default the local machine address is advertised
--no-voting - start node without vote signer
--rpc-port port - custom RPC port for this node

View File

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

View File

@ -29,8 +29,10 @@ EOF
lamports=1000000000
bootstrap_leader=true
bootstrap_leader_lamports=
fullnode=true
while getopts "h?n:lpt:" opt; do
while getopts "h?n:b:lpt:" opt; do
case $opt in
h|\?)
usage
@ -39,6 +41,9 @@ while getopts "h?n:lpt:" opt; do
n)
lamports="$OPTARG"
;;
b)
bootstrap_leader_lamports="$OPTARG"
;;
t)
node_type="$OPTARG"
case $OPTARG in
@ -77,12 +82,20 @@ if $bootstrap_leader; then
$solana_keygen -o "$SOLANA_CONFIG_DIR"/mint-id.json
$solana_keygen -o "$SOLANA_CONFIG_DIR"/bootstrap-leader-id.json
$solana_keygen -o "$SOLANA_CONFIG_DIR"/bootstrap-leader-vote-id.json
$solana_genesis \
--bootstrap-leader-keypair "$SOLANA_CONFIG_DIR"/bootstrap-leader-id.json \
--bootstrap-vote-keypair "$SOLANA_CONFIG_DIR"/bootstrap-leader-vote-id.json \
--ledger "$SOLANA_RSYNC_CONFIG_DIR"/ledger \
--mint "$SOLANA_CONFIG_DIR"/mint-id.json \
args=(
--bootstrap-leader-keypair "$SOLANA_CONFIG_DIR"/bootstrap-leader-id.json
--bootstrap-vote-keypair "$SOLANA_CONFIG_DIR"/bootstrap-leader-vote-id.json
--ledger "$SOLANA_RSYNC_CONFIG_DIR"/ledger
--mint "$SOLANA_CONFIG_DIR"/mint-id.json
--lamports "$lamports"
)
if [[ -n $bootstrap_leader_lamports ]]; then
args+=(--bootstrap-leader-lamports "$bootstrap_leader_lamports")
fi
$solana_genesis "${args[@]}"
cp -a "$SOLANA_RSYNC_CONFIG_DIR"/ledger "$SOLANA_CONFIG_DIR"/bootstrap-leader-ledger
)
fi

View File

@ -15,6 +15,14 @@ leaderRotation="$8"
set +x
export RUST_LOG
# Use a very large stake (relative to the default multinode-demo/ stake of 43)
# for the testnet fullnodes setup by net/. This make it less likely that
# low-staked ephemeral validator a random user may attach to testnet will cause
# trouble
#
# Ref: https://github.com/solana-labs/solana/issues/3798
stake=424243
missing() {
echo "Error: $1 not specified"
exit 1
@ -69,20 +77,16 @@ local|tar)
fi
set -x
if [[ $skipSetup != true ]]; then
./multinode-demo/setup.sh -t bootstrap-leader
./multinode-demo/setup.sh -t bootstrap-leader -b $stake
fi
./multinode-demo/drone.sh > drone.log 2>&1 &
maybeNoLeaderRotation=
if ! $leaderRotation; then
maybeNoLeaderRotation="--only-bootstrap-stake"
fi
maybePublicAddress=
if $publicNetwork; then
maybePublicAddress="--public-address"
fi
./multinode-demo/bootstrap-leader.sh $maybeNoLeaderRotation $maybePublicAddress > bootstrap-leader.log 2>&1 &
./multinode-demo/bootstrap-leader.sh $maybePublicAddress > bootstrap-leader.log 2>&1 &
ln -sTf bootstrap-leader.log fullnode.log
;;
fullnode|blockstreamer)
@ -94,9 +98,6 @@ local|tar)
fi
args=()
if ! $leaderRotation; then
args+=("--only-bootstrap-stake")
fi
if $publicNetwork; then
args+=("--public-address")
fi
@ -104,7 +105,14 @@ local|tar)
args+=(
--blockstream /tmp/solana-blockstream.sock
--no-voting
--stake 0
)
else
if $leaderRotation; then
args+=("--stake" "$stake")
else
args+=("--stake" 0)
fi
fi
args+=(

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -38,6 +38,7 @@ pub enum WalletCommand {
// ConfigureStakingAccount(delegate_id, authorized_voter_id)
AuthorizeVoter(Pubkey),
CreateVoteAccount(Pubkey, Pubkey, u32, u64),
ShowVoteAccount(Pubkey),
Deploy(String),
GetTransactionCount,
// Pay(lamports, to, timestamp, timestamp_pubkey, witness(es), cancelable)
@ -184,6 +185,10 @@ pub fn parse_command(
lamports,
))
}
("show-vote-account", Some(matches)) => {
let voting_account_id = pubkey_of(matches, "voting_account_id").unwrap();
Ok(WalletCommand::ShowVoteAccount(voting_account_id))
}
("deploy", Some(deploy_matches)) => Ok(WalletCommand::Deploy(
deploy_matches
.value_of("program_location")
@ -368,6 +373,43 @@ fn process_create_staking(
Ok(signature_str.to_string())
}
fn process_show_staking(
rpc_client: &RpcClient,
_config: &WalletConfig,
voting_account_id: &Pubkey,
) -> ProcessResult {
use solana_vote_api::vote_state::VoteState;
let vote_account_lamports = rpc_client.retry_get_balance(voting_account_id, 5)?;
let vote_account_data = rpc_client.get_account_data(voting_account_id)?;
let vote_state = VoteState::deserialize(&vote_account_data).unwrap();
println!("account lamports: {}", vote_account_lamports.unwrap());
println!("node id: {}", vote_state.node_id);
println!("authorized voter id: {}", vote_state.authorized_voter_id);
println!("credits: {}", vote_state.credits());
println!(
"commission: {}%",
f64::from(vote_state.commission) / f64::from(std::u32::MAX)
);
println!(
"root slot: {}",
match vote_state.root_slot {
Some(slot) => slot.to_string(),
None => "~".to_string(),
}
);
if !vote_state.votes.is_empty() {
println!("votes:");
for vote in vote_state.votes {
println!(
"- slot={}, confirmation count={}",
vote.slot, vote.confirmation_count
);
}
}
Ok("".to_string())
}
fn process_deploy(
rpc_client: &RpcClient,
config: &WalletConfig,
@ -635,6 +677,10 @@ pub fn process_command(config: &WalletConfig) -> ProcessResult {
)
}
WalletCommand::ShowVoteAccount(voting_account_id) => {
process_show_staking(&rpc_client, config, &voting_account_id)
}
// Deploy a custom program to the chain
WalletCommand::Deploy(ref program_location) => {
process_deploy(&rpc_client, config, program_location)