Compare commits

...

33 Commits

Author SHA1 Message Date
94e06342ac Revert "Initialize stopNetwork var"
This reverts commit ecfe655ba3.
2019-04-26 21:28:11 -07:00
ecfe655ba3 Initialize stopNetwork var 2019-04-26 21:11:06 -07:00
f8ea80850e Move validators from testnet-beta to testnet 2019-04-26 09:01:44 -07:00
657d9ad215 Move testnet influxdb datasource to influxcloud 2019-04-26 08:44:33 -07:00
963ce0bbc3 v0.13.3 2019-04-26 07:36:32 -07:00
1e0cd6549b Update testnet-participation.md 2019-04-25 21:07:50 -07:00
395a7ec96e Rename in-tree program_ids to be base-58 human readable (#4004)
automerge
2019-04-25 17:53:27 -07:00
42ee738646 Move testnet buildkite env variables back into the tree (#3989) 2019-04-25 11:45:21 -07:00
515ab21f07 Fix tar version check 2019-04-25 11:26:54 -07:00
7c5e5a06f3 Add getClusterNodes/getSlotLeader RPC API (#3980)
automerge
2019-04-24 17:49:14 -07:00
7c0c7da72d Increment Cargo.toml version to 0.13.2 2019-04-24 02:37:58 +00:00
b328e5f6ec Add genesis blockhashes to blobs (#3955)
* Add genesis blockhashes to blobs

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

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

* Address comments and fix test

* Update core/src/cluster_info.rs

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

* Update core/src/cluster_info.rs

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

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

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

* Use a large stake for net/ fullnodes

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

351
Cargo.lock generated
View File

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

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.3"
repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0"
homepage = "https://solana.com/"
[dependencies]
clap = "2.33.0"
solana = { path = "../core", version = "0.13.0" }
solana-logger = { path = "../logger", version = "0.13.0" }
solana-netutil = { path = "../netutil", version = "0.13.0" }
solana = { path = "../core", version = "0.13.3" }
solana-logger = { path = "../logger", version = "0.13.3" }
solana-netutil = { path = "../netutil", version = "0.13.3" }
[features]
cuda = ["solana/cuda"]

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.3"
repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0"
homepage = "https://solana.com/"
@ -11,13 +11,13 @@ homepage = "https://solana.com/"
clap = "2.33.0"
rayon = "1.0.3"
serde_json = "1.0.39"
solana = { path = "../core", version = "0.13.0" }
solana-client = { path = "../client", version = "0.13.0" }
solana-drone = { path = "../drone", version = "0.13.0" }
solana-logger = { path = "../logger", version = "0.13.0" }
solana-metrics = { path = "../metrics", version = "0.13.0" }
solana-netutil = { path = "../netutil", version = "0.13.0" }
solana-sdk = { path = "../sdk", version = "0.13.0" }
solana = { path = "../core", version = "0.13.3" }
solana-client = { path = "../client", version = "0.13.3" }
solana-drone = { path = "../drone", version = "0.13.3" }
solana-logger = { path = "../logger", version = "0.13.3" }
solana-metrics = { path = "../metrics", version = "0.13.3" }
solana-netutil = { path = "../netutil", version = "0.13.3" }
solana-sdk = { path = "../sdk", version = "0.13.3" }
[features]
cuda = ["solana/cuda"]

View File

@ -24,8 +24,10 @@ Methods
* [confirmTransaction](#confirmtransaction)
* [getAccountInfo](#getaccountinfo)
* [getBalance](#getbalance)
* [getClusterNodes](#getclusternodes)
* [getRecentBlockhash](#getrecentblockhash)
* [getSignatureStatus](#getsignaturestatus)
* [getSlotLeader](#getslotleader)
* [getNumBlocksSinceSignatureConfirmation](#getnumblockssincesignatureconfirmation)
* [getTransactionCount](#gettransactioncount)
* [requestAirdrop](#requestairdrop)
@ -114,6 +116,30 @@ curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0", "id":1, "
---
### getClusterNodes
Returns information about all the nodes participating in the cluster
##### Parameters:
None
##### Results:
The result field will be an array of JSON objects, each with the following sub fields:
* `id` - Node identifier, as base-58 encoded string
* `gossip` - Gossip network address for the node
* `tpu` - TPU network address for the node
* `rpc` - JSON RPC network address for the node, or `null` if the JSON RPC service is not enabled
##### Example:
```bash
// Request
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0", "id":1, "method":"getClusterNodes"}' http://localhost:8899
// Result
{"jsonrpc":"2.0","result":[{"gossip":"10.239.6.48:8001","id":"9QzsJf7LPLj8GkXbYT3LFDKqsj2hHG7TA3xinJHu8epQ","rpc":"10.239.6.48:8899","tpu":"10.239.6.48:8856"}],"id":1}
```
---
### getAccountInfo
Returns all information associated with the account of provided Pubkey
@ -183,7 +209,27 @@ curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0", "id":1, "
{"jsonrpc":"2.0","result":"SignatureNotFound","id":1}
```
---
-----
### getSlotLeader
Returns the current slot leader
##### Parameters:
None
##### Results:
* `string` - Node Id as base-58 encoded string
##### Example:
```bash
// Request
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":1, "method":"getSlotLeader"}' http://localhost:8899
// Result
{"jsonrpc":"2.0","result":"ENvAW7JScgYq6o4zKZwewtkzzJgDzuJAFxYasvmEQdpS","id":1}
```
-----
### getNumBlocksSinceSignatureConfirmation
Returns the current number of blocks since signature has been confirmed.

View File

@ -1,21 +1,22 @@
## Testnet Participation
This document describes how to participate in the beta testnet as a
This document describes how to participate in the testnet as a
validator node.
Please note some of the information and instructions described here may change
in future releases.
### Beta Testnet Overview
The beta testnet features a validator running at beta.testnet.solana.com, which
### Testnet Overview
The testnet features a validator running at .testnet.solana.com, which
serves as the entrypoint to the cluster for your validator.
Additionally there is a blockexplorer available at http://beta.testnet.solana.com/.
Additionally there is a blockexplorer available at
[http://testnet.solana.com/](http://testnet.solana.com/).
The beta testnet is configured to reset the ledger every 24hours, or sooner
The testnet is configured to reset the ledger every 24hours, or sooner
should an hourly automated sanity test fail.
### Machine Requirements
Since the beta testnet is not intended for stress testing of max transaction
Since the testnet is not intended for stress testing of max transaction
throughput, a higher-end machine with a GPU is not necessary to participate.
However ensure the machine used is not behind a residential NAT to avoid NAT
@ -25,6 +26,27 @@ traversal issues. A cloud-hosted machine works best. Ensure that IP ports
Prebuilt binaries are available for Linux x86_64 (Ubuntu 18.04 recommended).
MacOS or WSL users may build from source.
#### Confirm The Testnet Is Reachable
Before attaching a validator node, sanity check that the cluster is accessible
to your machine by running some simple wallet commands. If any of these
commands fail, please retry 5-10 minutes later to confirm the testnet is not
just restarting itself before debugging further.
Fetch the current testnet transaction count over JSON RPC:
```bash
$ curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1, "method":"getTransactionCount"}' http://testnet.solana.com:8899
```
Inspect the blockexplorer at [http://testnet.solana.com/](http://testnet.solana.com/) for activity.
Run the following command to join the gossip network and view all the other nodes in the cluster:
```bash
$ solana-gossip --network testnet.solana.com:8001
```
View the [metrics dashboard](https://metrics.solana.com:3000/d/testnet-edge/testnet-monitor-edge?var-testnet=testnet)
for more detail on cluster activity.
### Validator Setup
#### Obtaining The Software
##### Bootstrap with `solana-install`
@ -35,13 +57,13 @@ software on Linux x86_64 systems.
Install the latest release with a single shell command:
```bash
$ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.13.0/install/solana-install-init.sh | \
sh -c - --url https://api.beta.testnet.solana.com
sh -s - --url https://api.testnet.solana.com
```
Alternatively build the `solana-install` program from source and run the
following command to obtain the same result:
```bash
$ solana-install init --url https://api.beta.testnet.solana.com
$ solana-install init --url https://api.testnet.solana.com
```
After a successful install, `solana-install update` may be used to easily update the cluster
@ -67,53 +89,37 @@ $ ./scripts/cargo-install-all.sh .
$ export PATH=$PWD/bin:$PATH
```
#### Confirm The Testnet Is Reachable
Before attaching a validator node, sanity check that the cluster is accessible
to your machine by running some simple wallet commands. If any of these
commands fail, please retry 5-10 minutes later to confirm the testnet is not
just restarting itself before debugging further.
Receive an airdrop of lamports from the testnet drone:
```bash
$ solana-wallet -n beta.testnet.solana.com airdrop 123
$ solana-wallet -n beta.testnet.solana.com balance
```
Fetch the current testnet transaction count over JSON RPC:
```bash
$ curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1, "method":"getTransactionCount"}' http://beta.testnet.solana.com:8899
```
Inspect the blockexplorer at http://beta.testnet.solana.com/ for activity.
Run the following command to join the gossip network and view all the other nodes in the cluster:
```bash
$ solana-gossip --network beta.testnet.solana.com:8001
```
### Starting The Validator
The following command will start a new validator node.
Sanity check that you are able to interact with the cluster by receiving a small
airdrop of lamports from the testnet drone:
```bash
$ solana-wallet -n testnet.solana.com airdrop 123
$ solana-wallet -n testnet.solana.com balance
```
Then the following command will start a new validator node.
If this is a `solana-install`-installation:
```bash
$ fullnode-x.sh --public-address --poll-for-new-genesis-block beta.testnet.solana.com:8001
$ fullnode-x.sh --public-address --poll-for-new-genesis-block testnet.solana.com
```
Alternatively, the `solana-install run` command can be used to run the validator
node while periodically checking for and applying software updates:
```bash
$ solana-install run fullnode-x.sh --public-address --poll-for-new-genesis-block beta.testnet.solana.com:8001
$ solana-install run fullnode-x.sh -- --public-address --poll-for-new-genesis-block testnet.solana.com
```
When not using `solana-install`:
```bash
$ USE_INSTALL=1 ./multinode-demo/fullnode-x.sh --public-address --poll-for-new-genesis-block beta.testnet.solana.com:8001
$ USE_INSTALL=1 ./multinode-demo/fullnode-x.sh --public-address --poll-for-new-genesis-block testnet.solana.com
```
Then from another console, confirm the IP address if your node is now visible in
the gossip network by running:
```bash
$ solana-gossip --network beta.testnet.solana.com:8001
$ solana-gossip --network testnet.solana.com:8001
```
Congratulations, you're now participating in the testnet cluster!
@ -130,7 +136,6 @@ validator node:
```bash
export u="username obtained from the Solana maintainers"
export p="password obtained from the Solana maintainers"
export SOLANA_METRICS_CONFIG="db=testnet-beta,u=${u:?},p=${p:?}"
export SOLANA_METRICS_CONFIG="db=testnet,u=${u:?},p=${p:?}"
source scripts/configure-metrics.sh
```
Inspect for your contributions to our [metrics dashboard](https://metrics.solana.com:3000/d/U9-26Cqmk/testnet-monitor-cloud?refresh=60s&orgId=2&var-hostid=All).

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

@ -64,6 +64,36 @@ EOF
exit 0
fi
ci/channel-info.sh
eval "$(ci/channel-info.sh)"
EC2_ZONES=(us-west-1a sa-east-1a ap-northeast-2a eu-central-1a ca-central-1a)
GCE_ZONES=(us-west1-b asia-east2-a europe-west4-a southamerica-east1-b us-east4-c)
case $TESTNET in
testnet-edge|testnet-edge-perf)
CHANNEL_OR_TAG=edge
CHANNEL_BRANCH=$EDGE_CHANNEL
: "${TESTNET_DB_HOST:=https://clocktower-f1d56615.influxcloud.net:8086}"
;;
testnet-beta|testnet-beta-perf)
CHANNEL_OR_TAG=beta
CHANNEL_BRANCH=$BETA_CHANNEL
: "${TESTNET_DB_HOST:=https://clocktower-f1d56615.influxcloud.net:8086}"
: "${EC2_NODE_COUNT:=10}"
: "${GCE_NODE_COUNT:=}"
;;
testnet|testnet-perf)
CHANNEL_OR_TAG=$STABLE_CHANNEL_LATEST_TAG
CHANNEL_BRANCH=$STABLE_CHANNEL
: "${TESTNET_DB_HOST:=https://clocktower-f1d56615.influxcloud.net:8086}"
;;
*)
echo "Error: Invalid TESTNET=$TESTNET"
exit 1
;;
esac
if [[ -n $TESTNET_DB_HOST ]]; then
SOLANA_METRICS_PARTIAL_CONFIG="host=$TESTNET_DB_HOST,$SOLANA_METRICS_PARTIAL_CONFIG"
fi
@ -72,31 +102,9 @@ export SOLANA_METRICS_CONFIG="db=$TESTNET,$SOLANA_METRICS_PARTIAL_CONFIG"
echo "SOLANA_METRICS_CONFIG: $SOLANA_METRICS_CONFIG"
source scripts/configure-metrics.sh
ci/channel-info.sh
eval "$(ci/channel-info.sh)"
if [[ -n $TESTNET_TAG ]]; then
CHANNEL_OR_TAG=$TESTNET_TAG
else
case $TESTNET in
testnet-edge|testnet-edge-perf)
CHANNEL_OR_TAG=edge
CHANNEL_BRANCH=$EDGE_CHANNEL
;;
testnet-beta|testnet-beta-perf)
CHANNEL_OR_TAG=beta
CHANNEL_BRANCH=$BETA_CHANNEL
;;
testnet|testnet-perf)
CHANNEL_OR_TAG=$STABLE_CHANNEL_LATEST_TAG
CHANNEL_BRANCH=$STABLE_CHANNEL
;;
*)
echo "Error: Invalid TESTNET=$TESTNET"
exit 1
;;
esac
if [[ $BUILDKITE_BRANCH != "$CHANNEL_BRANCH" ]]; then
(
cat <<EOF
@ -124,7 +132,8 @@ sanity() {
testnet-edge)
(
set -x
ci/testnet-sanity.sh edge-testnet-solana-com ec2 us-west-1a
NO_LEDGER_VERIFY=1 \
ci/testnet-sanity.sh edge-testnet-solana-com ec2 us-west-1a
)
;;
testnet-edge-perf)
@ -139,22 +148,21 @@ sanity() {
testnet-beta)
(
set -x
EC2_ZONES=(us-west-1a sa-east-1a ap-northeast-2a eu-central-1a ca-central-1a)
ok=true
for zone in "${EC2_ZONES[@]}"; do
if ! $ok; then
break
fi
ci/testnet-sanity.sh beta-testnet-solana-com ec2 "$zone" || ok=false
done
GCE_ZONES=(us-west1-b asia-east2-a europe-west4-a southamerica-east1-b us-east4-c)
for zone in "${GCE_ZONES[@]}"; do
if ! $ok; then
break
ok=true
if [[ -n $EC2_NODE_COUNT ]]; then
NO_LEDGER_VERIFY=1 \
ci/testnet-sanity.sh beta-testnet-solana-com ec2 "${EC2_ZONES[0]}" || ok=false
fi
if $ok && [[ -n $GCE_NODE_COUNT ]]; then
if [[ -n $EC2_NODE_COUNT ]]; then
echo "TODO: Fix testnet-sanity.sh to work with a multinode testnet. It needs an '-x'-like argument"
exit 1
fi
ci/testnet-sanity.sh beta-testnet-solana-com gce "$zone" || ok=false
done
NO_LEDGER_VERIFY=1 \
ci/testnet-sanity.sh beta-testnet-solana-com gce "${GCE_ZONES[0]}" || ok=false
fi
$ok
)
;;
@ -170,7 +178,8 @@ sanity() {
testnet)
(
set -x
ci/testnet-sanity.sh testnet-solana-com ec2 us-west-1a
NO_LEDGER_VERIFY=1 \
ci/testnet-sanity.sh testnet-solana-com ec2 us-west-1a
#ci/testnet-sanity.sh testnet-solana-com gce us-east1-c
)
;;
@ -227,8 +236,6 @@ start() {
testnet-beta)
(
set -x
EC2_ZONES=(us-west-1a sa-east-1a ap-northeast-2a eu-central-1a ca-central-1a)
GCE_ZONES=(us-west1-b asia-east2-a europe-west4-a southamerica-east1-b us-east4-c)
# Build an array to pass as opts to testnet-deploy.sh: "-z zone1 -z zone2 ..."
GCE_ZONE_ARGS=()
@ -241,19 +248,23 @@ start() {
EC2_ZONE_ARGS+=("-z $val")
done
[[ -n $EC2_NODE_COUNT ]] || EC2_NODE_COUNT=60
[[ -n $GCE_NODE_COUNT ]] || GCE_NODE_COUNT=40
if [[ -n $EC2_NODE_COUNT ]]; then
# shellcheck disable=SC2068
ci/testnet-deploy.sh -p beta-testnet-solana-com -C ec2 ${EC2_ZONE_ARGS[@]} \
-t "$CHANNEL_OR_TAG" -n "$EC2_NODE_COUNT" -c 0 -u -P -a eipalloc-0f286cf8a0771ce35 \
${maybeReuseLedger:+-r} \
${maybeDelete:+-D} \
${GCE_NODE_COUNT:+-s}
fi
# shellcheck disable=SC2068
ci/testnet-deploy.sh -p beta-testnet-solana-com -C ec2 ${EC2_ZONE_ARGS[@]} \
-t "$CHANNEL_OR_TAG" -n "$EC2_NODE_COUNT" -c 0 -s -u -P -a eipalloc-0f286cf8a0771ce35 \
${maybeReuseLedger:+-r} \
${maybeDelete:+-D}
# shellcheck disable=SC2068
ci/testnet-deploy.sh -p beta-testnet-solana-com -C gce ${GCE_ZONE_ARGS[@]} \
-t "$CHANNEL_OR_TAG" -n "$GCE_NODE_COUNT" -c 0 -x -P \
${maybeReuseLedger:+-r} \
${maybeDelete:+-D}
if [[ -n $GCE_NODE_COUNT ]]; then
# shellcheck disable=SC2068
ci/testnet-deploy.sh -p beta-testnet-solana-com -C gce ${GCE_ZONE_ARGS[@]} \
-t "$CHANNEL_OR_TAG" -n "$GCE_NODE_COUNT" -c 0 -P \
${maybeReuseLedger:+-r} \
${maybeDelete:+-D} \
${EC2_NODE_COUNT:+-x}
fi
)
;;
testnet-beta-perf)

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.3"
description = "Solana Client"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@ -17,10 +17,10 @@ reqwest = "0.9.11"
serde = "1.0.89"
serde_derive = "1.0.88"
serde_json = "1.0.39"
solana-netutil = { path = "../netutil", version = "0.13.0" }
solana-sdk = { path = "../sdk", version = "0.13.0" }
solana-netutil = { path = "../netutil", version = "0.13.3" }
solana-sdk = { path = "../sdk", version = "0.13.3" }
[dev-dependencies]
jsonrpc-core = "10.1.0"
jsonrpc-http-server = "10.1.0"
solana-logger = { path = "../logger", version = "0.13.0" }
solana-logger = { path = "../logger", version = "0.13.3" }

View File

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

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

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

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

@ -2,6 +2,7 @@
use crate::bank_forks::BankForks;
use crate::cluster_info::ClusterInfo;
use crate::contact_info::ContactInfo;
use crate::packet::PACKET_DATA_SIZE;
use crate::storage_stage::StorageState;
use bincode::{deserialize, serialize};
@ -171,6 +172,18 @@ pub struct Meta {
}
impl Metadata for Meta {}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct RpcContactInfo {
/// Base58 id
pub id: String,
/// Gossip port
pub gossip: Option<SocketAddr>,
/// Tpu port
pub tpu: Option<SocketAddr>,
/// JSON RPC port
pub rpc: Option<SocketAddr>,
}
#[rpc(server)]
pub trait RpcSol {
type Metadata;
@ -184,6 +197,9 @@ pub trait RpcSol {
#[rpc(meta, name = "getBalance")]
fn get_balance(&self, _: Self::Metadata, _: String) -> Result<u64>;
#[rpc(meta, name = "getClusterNodes")]
fn get_cluster_nodes(&self, _: Self::Metadata) -> Result<Vec<RpcContactInfo>>;
#[rpc(meta, name = "getRecentBlockhash")]
fn get_recent_blockhash(&self, _: Self::Metadata) -> Result<String>;
@ -203,6 +219,9 @@ pub trait RpcSol {
#[rpc(meta, name = "sendTransaction")]
fn send_transaction(&self, _: Self::Metadata, _: Vec<u8>) -> Result<String>;
#[rpc(meta, name = "getSlotLeader")]
fn get_slot_leader(&self, _: Self::Metadata) -> Result<String>;
#[rpc(meta, name = "getStorageBlockhash")]
fn get_storage_blockhash(&self, _: Self::Metadata) -> Result<String>;
@ -263,6 +282,33 @@ impl RpcSol for RpcSolImpl {
Ok(meta.request_processor.read().unwrap().get_balance(&pubkey))
}
fn get_cluster_nodes(&self, meta: Self::Metadata) -> Result<Vec<RpcContactInfo>> {
let cluster_info = meta.cluster_info.read().unwrap();
fn valid_address_or_none(addr: &SocketAddr) -> Option<SocketAddr> {
if ContactInfo::is_valid_address(addr) {
Some(*addr)
} else {
None
}
}
Ok(cluster_info
.all_peers()
.iter()
.filter_map(|contact_info| {
if ContactInfo::is_valid_address(&contact_info.gossip) {
Some(RpcContactInfo {
id: contact_info.id.to_string(),
gossip: Some(contact_info.gossip),
tpu: valid_address_or_none(&contact_info.tpu),
rpc: valid_address_or_none(&contact_info.rpc),
})
} else {
None // Exclude spy nodes
}
})
.collect())
}
fn get_recent_blockhash(&self, meta: Self::Metadata) -> Result<String> {
debug!("get_recent_blockhash rpc request received");
Ok(meta
@ -402,6 +448,15 @@ impl RpcSol for RpcSolImpl {
Ok(signature)
}
fn get_slot_leader(&self, meta: Self::Metadata) -> Result<String> {
let cluster_info = meta.cluster_info.read().unwrap();
let leader_data_option = cluster_info.leader_data();
Ok(leader_data_option
.and_then(|leader_data| Some(leader_data.id))
.unwrap_or_default()
.to_string())
}
fn get_storage_blockhash(&self, meta: Self::Metadata) -> Result<String> {
meta.request_processor
.read()
@ -445,7 +500,9 @@ mod tests {
use solana_sdk::transaction::TransactionError;
use std::thread;
fn start_rpc_handler_with_tx(pubkey: &Pubkey) -> (MetaIoHandler<Meta>, Meta, Hash, Keypair) {
fn start_rpc_handler_with_tx(
pubkey: &Pubkey,
) -> (MetaIoHandler<Meta>, Meta, Hash, Keypair, Pubkey) {
let (bank_forks, alice) = new_bank_forks();
let bank = bank_forks.read().unwrap().working_bank();
let exit = Arc::new(AtomicBool::new(false));
@ -477,7 +534,7 @@ mod tests {
request_processor,
cluster_info,
};
(io, meta, blockhash, alice)
(io, meta, blockhash, alice, leader.id)
}
#[test]
@ -505,7 +562,7 @@ mod tests {
#[test]
fn test_rpc_get_balance() {
let bob_pubkey = Pubkey::new_rand();
let (io, meta, _blockhash, _alice) = start_rpc_handler_with_tx(&bob_pubkey);
let (io, meta, _blockhash, _alice, _leader_id) = start_rpc_handler_with_tx(&bob_pubkey);
let req = format!(
r#"{{"jsonrpc":"2.0","id":1,"method":"getBalance","params":["{}"]}}"#,
@ -520,10 +577,46 @@ mod tests {
assert_eq!(expected, result);
}
#[test]
fn test_rpc_get_cluster_nodes() {
let bob_pubkey = Pubkey::new_rand();
let (io, meta, _blockhash, _alice, leader_id) = start_rpc_handler_with_tx(&bob_pubkey);
let req = format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getClusterNodes"}}"#);
let res = io.handle_request_sync(&req, meta);
let result: Response = serde_json::from_str(&res.expect("actual response"))
.expect("actual response deserialization");
let expected = format!(
r#"{{"jsonrpc":"2.0","result":[{{"id": "{}", "gossip": "127.0.0.1:1235", "tpu": "127.0.0.1:1234", "rpc": "127.0.0.1:8899"}}],"id":1}}"#,
leader_id,
);
let expected: Response =
serde_json::from_str(&expected).expect("expected response deserialization");
assert_eq!(expected, result);
}
#[test]
fn test_rpc_get_slot_leader() {
let bob_pubkey = Pubkey::new_rand();
let (io, meta, _blockhash, _alice, _leader_id) = start_rpc_handler_with_tx(&bob_pubkey);
let req = format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getSlotLeader"}}"#);
let res = io.handle_request_sync(&req, meta);
let expected =
format!(r#"{{"jsonrpc":"2.0","result":"11111111111111111111111111111111","id":1}}"#);
let expected: Response =
serde_json::from_str(&expected).expect("expected response deserialization");
let result: Response = serde_json::from_str(&res.expect("actual response"))
.expect("actual response deserialization");
assert_eq!(expected, result);
}
#[test]
fn test_rpc_get_tx_count() {
let bob_pubkey = Pubkey::new_rand();
let (io, meta, _blockhash, _alice) = start_rpc_handler_with_tx(&bob_pubkey);
let (io, meta, _blockhash, _alice, _leader_id) = start_rpc_handler_with_tx(&bob_pubkey);
let req = format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getTransactionCount"}}"#);
let res = io.handle_request_sync(&req, meta);
@ -538,7 +631,7 @@ mod tests {
#[test]
fn test_rpc_get_account_info() {
let bob_pubkey = Pubkey::new_rand();
let (io, meta, _blockhash, _alice) = start_rpc_handler_with_tx(&bob_pubkey);
let (io, meta, _blockhash, _alice, _leader_id) = start_rpc_handler_with_tx(&bob_pubkey);
let req = format!(
r#"{{"jsonrpc":"2.0","id":1,"method":"getAccountInfo","params":["{}"]}}"#,
@ -565,7 +658,7 @@ mod tests {
#[test]
fn test_rpc_confirm_tx() {
let bob_pubkey = Pubkey::new_rand();
let (io, meta, blockhash, alice) = start_rpc_handler_with_tx(&bob_pubkey);
let (io, meta, blockhash, alice, _leader_id) = start_rpc_handler_with_tx(&bob_pubkey);
let tx = system_transaction::transfer(&alice, &bob_pubkey, 20, blockhash, 0);
let req = format!(
@ -584,7 +677,7 @@ mod tests {
#[test]
fn test_rpc_get_signature_status() {
let bob_pubkey = Pubkey::new_rand();
let (io, meta, blockhash, alice) = start_rpc_handler_with_tx(&bob_pubkey);
let (io, meta, blockhash, alice, _leader_id) = start_rpc_handler_with_tx(&bob_pubkey);
let tx = system_transaction::transfer(&alice, &bob_pubkey, 20, blockhash, 0);
let req = format!(
@ -648,7 +741,7 @@ mod tests {
#[test]
fn test_rpc_get_recent_blockhash() {
let bob_pubkey = Pubkey::new_rand();
let (io, meta, blockhash, _alice) = start_rpc_handler_with_tx(&bob_pubkey);
let (io, meta, blockhash, _alice, _leader_id) = start_rpc_handler_with_tx(&bob_pubkey);
let req = format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getRecentBlockhash"}}"#);
let res = io.handle_request_sync(&req, meta);
@ -663,7 +756,7 @@ mod tests {
#[test]
fn test_rpc_fail_request_airdrop() {
let bob_pubkey = Pubkey::new_rand();
let (io, meta, _blockhash, _alice) = start_rpc_handler_with_tx(&bob_pubkey);
let (io, meta, _blockhash, _alice, _leader_id) = start_rpc_handler_with_tx(&bob_pubkey);
// Expect internal error because no drone is available
let req = format!(

View File

@ -229,7 +229,7 @@ mod tests {
subscriptions.check_account(&alice.pubkey(), &account);
let string = transport_receiver.poll();
if let Async::Ready(Some(response)) = string.unwrap() {
let expected = format!(r#"{{"jsonrpc":"2.0","method":"accountNotification","params":{{"result":{{"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"executable":false,"lamports":1,"owner":[129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},"subscription":0}}}}"#);
let expected = format!(r#"{{"jsonrpc":"2.0","method":"accountNotification","params":{{"result":{{"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"executable":false,"lamports":1,"owner":[2,203,81,223,225,24,34,35,203,214,138,130,144,208,35,77,63,16,87,51,47,198,115,123,98,188,19,160,0,0,0,0]}},"subscription":0}}}}"#);
assert_eq!(expected, response);
}
@ -275,7 +275,7 @@ mod tests {
subscriptions.check_program(&solana_budget_api::id(), &alice.pubkey(), &account);
let string = transport_receiver.poll();
if let Async::Ready(Some(response)) = string.unwrap() {
let expected = format!(r#"{{"jsonrpc":"2.0","method":"programNotification","params":{{"result":["{:?}",{{"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"executable":false,"lamports":1,"owner":[129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}}],"subscription":0}}}}"#, alice.pubkey());
let expected = format!(r#"{{"jsonrpc":"2.0","method":"programNotification","params":{{"result":["{:?}",{{"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"executable":false,"lamports":1,"owner":[2,203,81,223,225,24,34,35,203,214,138,130,144,208,35,77,63,16,87,51,47,198,115,123,98,188,19,160,0,0,0,0]}}],"subscription":0}}}}"#, alice.pubkey());
assert_eq!(expected, response);
}

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.3"
description = "Solana Drone"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@ -20,9 +20,9 @@ clap = "2.33"
log = "0.4.2"
serde = "1.0.90"
serde_derive = "1.0.90"
solana-logger = { path = "../logger", version = "0.13.0" }
solana-sdk = { path = "../sdk", version = "0.13.0" }
solana-metrics = { path = "../metrics", version = "0.13.0" }
solana-logger = { path = "../logger", version = "0.13.3" }
solana-sdk = { path = "../sdk", version = "0.13.3" }
solana-metrics = { path = "../metrics", version = "0.13.3" }
tokio = "0.1"
tokio-codec = "0.1"

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.3"
repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0"
homepage = "https://solana.com/"
@ -12,15 +12,15 @@ homepage = "https://solana.com/"
clap = "2.33.0"
log = "0.4.2"
serde_json = "1.0.39"
solana = { path = "../core", version = "0.13.0" }
solana-drone = { path = "../drone", version = "0.13.0" }
solana-logger = { path = "../logger", version = "0.13.0" }
solana-netutil = { path = "../netutil", version = "0.13.0" }
solana-metrics = { path = "../metrics", version = "0.13.0" }
solana-runtime = { path = "../runtime", version = "0.13.0" }
solana-sdk = { path = "../sdk", version = "0.13.0" }
solana-vote-api = { path = "../programs/vote_api", version = "0.13.0" }
solana-vote-signer = { path = "../vote-signer", version = "0.13.0" }
solana = { path = "../core", version = "0.13.3" }
solana-drone = { path = "../drone", version = "0.13.3" }
solana-logger = { path = "../logger", version = "0.13.3" }
solana-netutil = { path = "../netutil", version = "0.13.3" }
solana-metrics = { path = "../metrics", version = "0.13.3" }
solana-runtime = { path = "../runtime", version = "0.13.3" }
solana-sdk = { path = "../sdk", version = "0.13.3" }
solana-vote-api = { path = "../programs/vote_api", version = "0.13.3" }
solana-vote-signer = { path = "../vote-signer", version = "0.13.3" }
[features]
chacha = ["solana/chacha"]

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.3"
repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0"
homepage = "https://solana.com/"
@ -11,18 +11,18 @@ homepage = "https://solana.com/"
[dependencies]
clap = "2.33.0"
serde_json = "1.0.39"
solana = { path = "../core", version = "0.13.0" }
solana-sdk = { path = "../sdk", version = "0.13.0" }
solana-budget-api = { path = "../programs/budget_api", version = "0.13.0" }
solana-storage-api = { path = "../programs/storage_api", version = "0.13.0" }
solana-token-api = { path = "../programs/token_api", version = "0.13.0" }
solana-config-api = { path = "../programs/config_api", version = "0.13.0" }
solana-exchange-api = { path = "../programs/exchange_api", version = "0.13.0" }
solana = { path = "../core", version = "0.13.3" }
solana-sdk = { path = "../sdk", version = "0.13.3" }
solana-budget-api = { path = "../programs/budget_api", version = "0.13.3" }
solana-stake-api = { path = "../programs/stake_api", version = "0.13.3" }
solana-storage-api = { path = "../programs/storage_api", version = "0.13.3" }
solana-token-api = { path = "../programs/token_api", version = "0.13.3" }
solana-config-api = { path = "../programs/config_api", version = "0.13.3" }
solana-exchange-api = { path = "../programs/exchange_api", version = "0.13.3" }
[dev-dependencies]
hashbrown = "0.2.1"
solana-vote-api = { path = "../programs/vote_api", version = "0.13.0" }
solana-vote-api = { path = "../programs/vote_api", version = "0.13.3" }
[features]
cuda = ["solana/cuda"]

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();
@ -112,43 +123,39 @@ mod tests {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0,
]);
let native = Pubkey::new(&[
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0,
]);
let bpf = Pubkey::new(&[
128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0,
]);
let budget = Pubkey::new(&[
129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0,
]);
let storage = Pubkey::new(&[
130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0,
]);
let token = Pubkey::new(&[
131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0,
]);
let vote = Pubkey::new(&[
132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0,
]);
let config = Pubkey::new(&[
133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0,
]);
let exchange = Pubkey::new(&[
134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0,
]);
let native_loader = "NativeLoader1111111111111111111111111111111"
.parse::<Pubkey>()
.unwrap();
let bpf_loader = "BPFLoader1111111111111111111111111111111111"
.parse::<Pubkey>()
.unwrap();
let budget = "Budget1111111111111111111111111111111111111"
.parse::<Pubkey>()
.unwrap();
let stake = "Stake11111111111111111111111111111111111111"
.parse::<Pubkey>()
.unwrap();
let storage = "Storage111111111111111111111111111111111111"
.parse::<Pubkey>()
.unwrap();
let token = "Token11111111111111111111111111111111111111"
.parse::<Pubkey>()
.unwrap();
let vote = "Vote111111111111111111111111111111111111111"
.parse::<Pubkey>()
.unwrap();
let config = "Config1111111111111111111111111111111111111"
.parse::<Pubkey>()
.unwrap();
let exchange = "Exchange11111111111111111111111111111111111"
.parse::<Pubkey>()
.unwrap();
assert_eq!(solana_sdk::system_program::id(), system);
assert_eq!(solana_sdk::native_loader::id(), native);
assert_eq!(solana_sdk::bpf_loader::id(), bpf);
assert_eq!(solana_sdk::native_loader::id(), native_loader);
assert_eq!(solana_sdk::bpf_loader::id(), bpf_loader);
assert_eq!(solana_budget_api::id(), budget);
assert_eq!(solana_stake_api::id(), stake);
assert_eq!(solana_storage_api::id(), storage);
assert_eq!(solana_token_api::id(), token);
assert_eq!(solana_vote_api::id(), vote);

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.3"
repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0"
homepage = "https://solana.com/"
@ -11,9 +11,9 @@ homepage = "https://solana.com/"
[dependencies]
clap = "2.33.0"
env_logger = "0.6.1"
solana = { path = "../core", version = "0.13.0" }
solana-netutil = { path = "../netutil", version = "0.13.0" }
solana-sdk = { path = "../sdk", version = "0.13.0" }
solana = { path = "../core", version = "0.13.3" }
solana-netutil = { path = "../netutil", version = "0.13.3" }
solana-sdk = { path = "../sdk", version = "0.13.3" }
[features]
chacha = []

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.3"
repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0"
homepage = "https://solana.com/"
@ -28,10 +28,10 @@ ring = "0.13.2"
serde = "1.0.90"
serde_derive = "1.0.90"
serde_yaml = "0.8.8"
solana-client = { path = "../client", version = "0.13.0" }
solana-config-api = { path = "../programs/config_api", version = "0.13.0" }
solana-logger = { path = "../logger", version = "0.13.0" }
solana-sdk = { path = "../sdk", version = "0.13.0" }
solana-client = { path = "../client", version = "0.13.3" }
solana-config-api = { path = "../programs/config_api", version = "0.13.3" }
solana-logger = { path = "../logger", version = "0.13.3" }
solana-sdk = { path = "../sdk", version = "0.13.3" }
tar = "0.4.22"
tempdir = "0.3.7"
url = "1.7.2"

View File

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

View File

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

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.3"
repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0"
homepage = "https://solana.com/"
@ -11,10 +11,10 @@ homepage = "https://solana.com/"
[dependencies]
clap = "2.33.0"
serde_json = "1.0.39"
solana = { path = "../core", version = "0.13.0" }
solana-sdk = { path = "../sdk", version = "0.13.0" }
solana-logger = { path = "../logger", version = "0.13.0" }
solana-runtime = { path = "../runtime", version = "0.13.0" }
solana = { path = "../core", version = "0.13.3" }
solana-sdk = { path = "../sdk", version = "0.13.3" }
solana-logger = { path = "../logger", version = "0.13.3" }
solana-runtime = { path = "../runtime", version = "0.13.3" }
[dev-dependencies]
assert_cmd = "0.11"

View File

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

View File

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

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

@ -427,7 +427,7 @@ start() {
networkVersion="$(
(
set -o pipefail
grep "^version: " "$SOLANA_ROOT"/solana-release/version.yml | head -n1 | cut -d\ -f2
grep "^commit: " "$SOLANA_ROOT"/solana-release/version.yml | head -n1 | cut -d\ -f2
) || echo "tar-unknown"
)"
;;

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.3"
description = "Solana Network Utilities"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@ -18,7 +18,7 @@ reqwest = "0.9.0"
socket2 = "0.3.8"
[dev-dependencies]
solana-logger = { path = "../logger", version = "0.13.0" }
solana-logger = { path = "../logger", version = "0.13.3" }
[lib]
name = "solana_netutil"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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.3"
description = "Solana SDK"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"

View File

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

View File

@ -2,7 +2,8 @@ use crate::account::Account;
use crate::pubkey::Pubkey;
const NATIVE_LOADER_PROGRAM_ID: [u8; 32] = [
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5, 135, 132, 191, 20, 139, 164, 40, 47, 176, 18, 87, 72, 136, 169, 241, 83, 160, 125, 173, 247,
101, 192, 69, 92, 154, 151, 3, 128, 0, 0, 0,
];
pub fn id() -> Pubkey {

View File

@ -1,6 +1,8 @@
use crate::pubkey::Pubkey;
const SYSTEM_PROGRAM_ID: [u8; 32] = [0u8; 32];
const SYSTEM_PROGRAM_ID: [u8; 32] = [
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
];
pub fn id() -> Pubkey {
Pubkey::new(&SYSTEM_PROGRAM_ID)

View File

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

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.3"
repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0"
homepage = "https://solana.com/"
@ -17,8 +17,8 @@ jsonrpc-derive = "11.0.0"
jsonrpc-http-server = "11.0.0"
serde = "1.0.90"
serde_json = "1.0.39"
solana-sdk = { path = "../sdk", version = "0.13.0" }
solana-metrics = { path = "../metrics", version = "0.13.0" }
solana-sdk = { path = "../sdk", version = "0.13.3" }
solana-metrics = { path = "../metrics", version = "0.13.3" }
[lib]
name = "solana_vote_signer"

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.3"
repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0"
homepage = "https://solana.com/"
@ -16,18 +16,18 @@ chrono = { version = "0.4.0", features = ["serde"] }
dirs = "1.0.5"
log = "0.4.2"
serde_json = "1.0.39"
solana-budget-api = { path = "../programs/budget_api", version = "0.13.0" }
solana-client = { path = "../client", version = "0.13.0" }
solana-drone = { path = "../drone", version = "0.13.0" }
solana-logger = { path = "../logger", version = "0.13.0" }
solana-netutil = { path = "../netutil", version = "0.13.0" }
solana-sdk = { path = "../sdk", version = "0.13.0" }
solana-vote-api = { path = "../programs/vote_api", version = "0.13.0" }
solana-vote-signer = { path = "../vote-signer", version = "0.13.0" }
solana-budget-api = { path = "../programs/budget_api", version = "0.13.3" }
solana-client = { path = "../client", version = "0.13.3" }
solana-drone = { path = "../drone", version = "0.13.3" }
solana-logger = { path = "../logger", version = "0.13.3" }
solana-netutil = { path = "../netutil", version = "0.13.3" }
solana-sdk = { path = "../sdk", version = "0.13.3" }
solana-vote-api = { path = "../programs/vote_api", version = "0.13.3" }
solana-vote-signer = { path = "../vote-signer", version = "0.13.3" }
[dev-dependencies]
solana-budget-program = { path = "../programs/budget_program", version = "0.13.0" }
solana = { path = "../core", version = "0.13.0" }
solana-budget-program = { path = "../programs/budget_program", version = "0.13.3" }
solana = { path = "../core", version = "0.13.3" }
[features]
cuda = []

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)