Compare commits

..

31 Commits

Author SHA1 Message Date
Michael Vines
ee5aa0c1a2 Support monitoring multiple validators 2020-03-09 21:07:32 -07:00
HM
55dee2901e watchtower: flag to suppress duplicate notifications (#8549)
* watchtower: send error message as notification

* watchtower: send all clear notification when ok again

* watchtower: add twilio sms notifications

* watchtower: flag to suppress duplicate notifications

* remove trailing space character

* changes as per suggestion on PR

* all changes together

* cargo fmt
2020-03-09 21:07:32 -07:00
Michael Vines
2b0824d18b watchtower now uses cli-config/
(cherry picked from commit 74e7da214a)
2020-03-09 20:40:18 -07:00
Michael Vines
b0709ea0ac Move cli-config default out of cli/ into cli-config/
(cherry picked from commit 756ba07b16)
2020-03-09 20:40:18 -07:00
Michael Vines
81b5499f7a Rename 'url' to 'json_rpc_url'
(cherry picked from commit 5c236fd06c)
2020-03-09 20:40:18 -07:00
Michael Vines
c96ce99705 Wait for 80% of the active stake instead of 75% 2020-03-09 20:31:44 -07:00
mergify[bot]
8dcd2d11e1 Docs: Fix missing CLI usage.md (#8745) (#8749)
automerge
2020-03-09 20:05:24 -07:00
mergify[bot]
777aae9059 Remove --derivation-path option (#8741) (#8747)
automerge
2020-03-09 19:17:14 -07:00
mergify[bot]
4dd1340236 Limit waiting-message to single- or last-chunk apdus (#8730) (#8733)
automerge
2020-03-09 15:44:17 -07:00
mergify[bot]
889b06e1d4 Allow passing of program_id to programs (bp #8639) (#8670)
automerge
2020-03-09 12:36:34 -07:00
mergify[bot]
f511296ee8 Fix account tests (#8615) (#8729)
automerge
2020-03-09 11:19:14 -07:00
mergify[bot]
c19eb717b4 Update rust-bpf to include matching cargo (#8598) (#8727)
automerge
2020-03-09 10:42:19 -07:00
mergify[bot]
dd54369e1b Cli: Fix create-with-seed (#8706) (#8723)
automerge
2020-03-09 00:16:29 -07:00
Michael Vines
bb563b4835 Permit --no-untrusted-rpc without any --trusted-validators 2020-03-08 22:34:53 -07:00
mergify[bot]
d061fadede Add purge function to ledger-tool (#8719) (#8720)
(cherry picked from commit de34187db0)

Co-authored-by: sakridge <sakridge@gmail.com>
2020-03-08 21:38:38 -07:00
mergify[bot]
577cd2bd3a Remove unnecessary snapshot hash verification (#8711) (#8714)
(cherry picked from commit f992ee3140)

Co-authored-by: Michael Vines <mvines@gmail.com>
2020-03-07 14:41:45 -07:00
mergify[bot]
9d1c8657e2 Groom ledger-tool bounds output (#8710) (#8715)
(cherry picked from commit acb23e8ef0)

Co-authored-by: Michael Vines <mvines@gmail.com>
2020-03-07 14:15:50 -07:00
mergify[bot]
67216ac7f5 Split staker infos (#8683)
automerge
2020-03-06 23:44:06 -08:00
mergify[bot]
e63b24c39f Remove ask-seed-phrase arg from validator, archiver (#8697) (#8713)
automerge
2020-03-06 23:34:20 -08:00
Greg Fitzgerald
d963f7afb4 Set withdrawer keys (#8707)
automerge
2020-03-06 21:21:00 -08:00
mergify[bot]
a07bf4870a Fix Ledger docs (#8705) (#8708)
automerge
2020-03-06 21:03:15 -08:00
mergify[bot]
8422d4b3fb Disable setLogFilter RPC API by default (#8693) (#8699)
automerge
2020-03-06 18:16:04 -08:00
mergify[bot]
ff4731cce2 RPC: Add getFeeCalculatorForBlockhash method call (#8687) (#8698)
automerge
2020-03-06 17:25:33 -08:00
mergify[bot]
659aaafff6 Ledger: return specific error if ledger-app-solana is not running (#8684) (#8695)
automerge
2020-03-06 16:28:53 -08:00
mergify[bot]
175651c497 Add shred version support to net/ (#8689) (#8694)
automerge
2020-03-06 15:41:16 -08:00
mergify[bot]
085e773f27 Properly escape current version (#8686) (#8688)
(cherry picked from commit a78a339407)

Co-authored-by: Michael Vines <mvines@gmail.com>
2020-03-06 14:37:41 -07:00
Michael Vines
5d3140c040 Cargo.lock 2020-03-06 14:25:54 -07:00
Michael Vines
d8d7238920 Bump version to 1.0.5 2020-03-06 14:14:53 -07:00
mergify[bot]
418c3cd4cf Delete Archiver installation docs (#8665) (#8669)
automerge
2020-03-06 12:49:52 -08:00
Michael Vines
9f532cb50f Publish initial snapshot hash in gossip on validator startup (#8678) 2020-03-05 23:01:35 -07:00
Michael Vines
c35f4927cd Bump version to 1.0.4 2020-03-05 16:10:24 -07:00
134 changed files with 1720 additions and 1383 deletions

View File

@@ -45,7 +45,7 @@ $ git pull --rebase upstream master
If there are no functional changes, PRs can be very large and that's no If there are no functional changes, PRs can be very large and that's no
problem. If, however, your changes are making meaningful changes or additions, problem. If, however, your changes are making meaningful changes or additions,
then about 1.0.3 lines of changes is about the most you should ask a Solana then about 1.0.5 lines of changes is about the most you should ask a Solana
maintainer to review. maintainer to review.
### Should I send small PRs as I develop large, new components? ### Should I send small PRs as I develop large, new components?

670
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-archiver-lib" name = "solana-archiver-lib"
version = "1.0.3" version = "1.0.5"
description = "Solana Archiver Library" description = "Solana Archiver Library"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -15,22 +15,22 @@ ed25519-dalek = "=1.0.0-pre.1"
log = "0.4.8" log = "0.4.8"
rand = "0.6.5" rand = "0.6.5"
rand_chacha = "0.1.1" rand_chacha = "0.1.1"
solana-client = { path = "../client", version = "1.0.3" } solana-client = { path = "../client", version = "1.0.5" }
solana-storage-program = { path = "../programs/storage", version = "1.0.3" } solana-storage-program = { path = "../programs/storage", version = "1.0.5" }
thiserror = "1.0" thiserror = "1.0"
serde = "1.0.104" serde = "1.0.104"
serde_json = "1.0.46" serde_json = "1.0.46"
serde_derive = "1.0.103" serde_derive = "1.0.103"
solana-net-utils = { path = "../net-utils", version = "1.0.3" } solana-net-utils = { path = "../net-utils", version = "1.0.5" }
solana-chacha = { path = "../chacha", version = "1.0.3" } solana-chacha = { path = "../chacha", version = "1.0.5" }
solana-chacha-sys = { path = "../chacha-sys", version = "1.0.3" } solana-chacha-sys = { path = "../chacha-sys", version = "1.0.5" }
solana-ledger = { path = "../ledger", version = "1.0.3" } solana-ledger = { path = "../ledger", version = "1.0.5" }
solana-logger = { path = "../logger", version = "1.0.3" } solana-logger = { path = "../logger", version = "1.0.5" }
solana-perf = { path = "../perf", version = "1.0.3" } solana-perf = { path = "../perf", version = "1.0.5" }
solana-sdk = { path = "../sdk", version = "1.0.3" } solana-sdk = { path = "../sdk", version = "1.0.5" }
solana-core = { path = "../core", version = "1.0.3" } solana-core = { path = "../core", version = "1.0.5" }
solana-archiver-utils = { path = "../archiver-utils", version = "1.0.3" } solana-archiver-utils = { path = "../archiver-utils", version = "1.0.5" }
solana-metrics = { path = "../metrics", version = "1.0.3" } solana-metrics = { path = "../metrics", version = "1.0.5" }
[dev-dependencies] [dev-dependencies]
hex = "0.4.0" hex = "0.4.0"

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-archiver-utils" name = "solana-archiver-utils"
version = "1.0.3" version = "1.0.5"
description = "Solana Archiver Utils" description = "Solana Archiver Utils"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -11,12 +11,12 @@ edition = "2018"
[dependencies] [dependencies]
log = "0.4.8" log = "0.4.8"
rand = "0.6.5" rand = "0.6.5"
solana-chacha = { path = "../chacha", version = "1.0.3" } solana-chacha = { path = "../chacha", version = "1.0.5" }
solana-chacha-sys = { path = "../chacha-sys", version = "1.0.3" } solana-chacha-sys = { path = "../chacha-sys", version = "1.0.5" }
solana-ledger = { path = "../ledger", version = "1.0.3" } solana-ledger = { path = "../ledger", version = "1.0.5" }
solana-logger = { path = "../logger", version = "1.0.3" } solana-logger = { path = "../logger", version = "1.0.5" }
solana-perf = { path = "../perf", version = "1.0.3" } solana-perf = { path = "../perf", version = "1.0.5" }
solana-sdk = { path = "../sdk", version = "1.0.3" } solana-sdk = { path = "../sdk", version = "1.0.5" }
[dev-dependencies] [dev-dependencies]
hex = "0.4.0" hex = "0.4.0"

View File

@@ -2,7 +2,7 @@
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-archiver" name = "solana-archiver"
version = "1.0.3" version = "1.0.5"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@@ -10,11 +10,11 @@ homepage = "https://solana.com/"
[dependencies] [dependencies]
clap = "2.33.0" clap = "2.33.0"
console = "0.9.2" console = "0.9.2"
solana-clap-utils = { path = "../clap-utils", version = "1.0.3" } solana-clap-utils = { path = "../clap-utils", version = "1.0.5" }
solana-core = { path = "../core", version = "1.0.3" } solana-core = { path = "../core", version = "1.0.5" }
solana-logger = { path = "../logger", version = "1.0.3" } solana-logger = { path = "../logger", version = "1.0.5" }
solana-metrics = { path = "../metrics", version = "1.0.3" } solana-metrics = { path = "../metrics", version = "1.0.5" }
solana-archiver-lib = { path = "../archiver-lib", version = "1.0.3" } solana-archiver-lib = { path = "../archiver-lib", version = "1.0.5" }
solana-net-utils = { path = "../net-utils", version = "1.0.3" } solana-net-utils = { path = "../net-utils", version = "1.0.5" }
solana-sdk = { path = "../sdk", version = "1.0.3" } solana-sdk = { path = "../sdk", version = "1.0.5" }

View File

@@ -2,21 +2,20 @@ use clap::{crate_description, crate_name, App, Arg};
use console::style; use console::style;
use solana_archiver_lib::archiver::Archiver; use solana_archiver_lib::archiver::Archiver;
use solana_clap_utils::{ use solana_clap_utils::{
input_validators::is_keypair, input_parsers::keypair_of, input_validators::is_keypair_or_ask_keyword,
keypair::{ keypair::SKIP_SEED_PHRASE_VALIDATION_ARG,
self, keypair_input, KeypairWithSource, ASK_SEED_PHRASE_ARG,
SKIP_SEED_PHRASE_VALIDATION_ARG,
},
}; };
use solana_core::{ use solana_core::{
cluster_info::{Node, VALIDATOR_PORT_RANGE}, cluster_info::{Node, VALIDATOR_PORT_RANGE},
contact_info::ContactInfo, contact_info::ContactInfo,
}; };
use solana_sdk::{commitment_config::CommitmentConfig, signature::Signer}; use solana_sdk::{
commitment_config::CommitmentConfig,
signature::{Keypair, Signer},
};
use std::{ use std::{
net::{IpAddr, Ipv4Addr, SocketAddr}, net::{IpAddr, Ipv4Addr, SocketAddr},
path::PathBuf, path::PathBuf,
process::exit,
sync::Arc, sync::Arc,
}; };
@@ -32,7 +31,7 @@ fn main() {
.long("identity-keypair") .long("identity-keypair")
.value_name("PATH") .value_name("PATH")
.takes_value(true) .takes_value(true)
.validator(is_keypair) .validator(is_keypair_or_ask_keyword)
.help("File containing an identity (keypair)"), .help("File containing an identity (keypair)"),
) )
.arg( .arg(
@@ -60,48 +59,27 @@ fn main() {
.long("storage-keypair") .long("storage-keypair")
.value_name("PATH") .value_name("PATH")
.takes_value(true) .takes_value(true)
.validator(is_keypair) .validator(is_keypair_or_ask_keyword)
.help("File containing the storage account keypair"), .help("File containing the storage account keypair"),
) )
.arg(
Arg::with_name(ASK_SEED_PHRASE_ARG.name)
.long(ASK_SEED_PHRASE_ARG.long)
.value_name("KEYPAIR NAME")
.multiple(true)
.takes_value(true)
.possible_values(&["identity-keypair", "storage-keypair"])
.help(ASK_SEED_PHRASE_ARG.help),
)
.arg( .arg(
Arg::with_name(SKIP_SEED_PHRASE_VALIDATION_ARG.name) Arg::with_name(SKIP_SEED_PHRASE_VALIDATION_ARG.name)
.long(SKIP_SEED_PHRASE_VALIDATION_ARG.long) .long(SKIP_SEED_PHRASE_VALIDATION_ARG.long)
.requires(ASK_SEED_PHRASE_ARG.name)
.help(SKIP_SEED_PHRASE_VALIDATION_ARG.help), .help(SKIP_SEED_PHRASE_VALIDATION_ARG.help),
) )
.get_matches(); .get_matches();
let ledger_path = PathBuf::from(matches.value_of("ledger").unwrap()); let ledger_path = PathBuf::from(matches.value_of("ledger").unwrap());
let identity_keypair = keypair_input(&matches, "identity_keypair") let identity_keypair = keypair_of(&matches, "identity_keypair").unwrap_or_else(Keypair::new);
.unwrap_or_else(|err| {
eprintln!("Identity keypair input failed: {}", err); let storage_keypair = keypair_of(&matches, "storage_keypair").unwrap_or_else(|| {
exit(1);
})
.keypair;
let KeypairWithSource {
keypair: storage_keypair,
source: storage_keypair_source,
} = keypair_input(&matches, "storage_keypair").unwrap_or_else(|err| {
eprintln!("Storage keypair input failed: {}", err);
exit(1);
});
if storage_keypair_source == keypair::Source::Generated {
clap::Error::with_description( clap::Error::with_description(
"The `storage-keypair` argument was not found", "The `storage-keypair` argument was not found",
clap::ErrorKind::ArgumentNotFound, clap::ErrorKind::ArgumentNotFound,
) )
.exit(); .exit();
} });
let entrypoint_addr = matches let entrypoint_addr = matches
.value_of("entrypoint") .value_of("entrypoint")

View File

@@ -2,7 +2,7 @@
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-banking-bench" name = "solana-banking-bench"
version = "1.0.3" version = "1.0.5"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@@ -10,11 +10,11 @@ homepage = "https://solana.com/"
[dependencies] [dependencies]
log = "0.4.6" log = "0.4.6"
rayon = "1.2.0" rayon = "1.2.0"
solana-core = { path = "../core", version = "1.0.3" } solana-core = { path = "../core", version = "1.0.5" }
solana-ledger = { path = "../ledger", version = "1.0.3" } solana-ledger = { path = "../ledger", version = "1.0.5" }
solana-logger = { path = "../logger", version = "1.0.3" } solana-logger = { path = "../logger", version = "1.0.5" }
solana-runtime = { path = "../runtime", version = "1.0.3" } solana-runtime = { path = "../runtime", version = "1.0.5" }
solana-measure = { path = "../measure", version = "1.0.3" } solana-measure = { path = "../measure", version = "1.0.5" }
solana-sdk = { path = "../sdk", version = "1.0.3" } solana-sdk = { path = "../sdk", version = "1.0.5" }
rand = "0.6.5" rand = "0.6.5"
crossbeam-channel = "0.3" crossbeam-channel = "0.3"

View File

@@ -2,7 +2,7 @@
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-bench-exchange" name = "solana-bench-exchange"
version = "1.0.3" version = "1.0.5"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@@ -18,17 +18,17 @@ rand = "0.6.5"
rayon = "1.2.0" rayon = "1.2.0"
serde_json = "1.0.46" serde_json = "1.0.46"
serde_yaml = "0.8.11" serde_yaml = "0.8.11"
solana-clap-utils = { path = "../clap-utils", version = "1.0.3" } solana-clap-utils = { path = "../clap-utils", version = "1.0.5" }
solana-core = { path = "../core", version = "1.0.3" } solana-core = { path = "../core", version = "1.0.5" }
solana-genesis = { path = "../genesis", version = "1.0.3" } solana-genesis = { path = "../genesis", version = "1.0.5" }
solana-client = { path = "../client", version = "1.0.3" } solana-client = { path = "../client", version = "1.0.5" }
solana-faucet = { path = "../faucet", version = "1.0.3" } solana-faucet = { path = "../faucet", version = "1.0.5" }
solana-exchange-program = { path = "../programs/exchange", version = "1.0.3" } solana-exchange-program = { path = "../programs/exchange", version = "1.0.5" }
solana-logger = { path = "../logger", version = "1.0.3" } solana-logger = { path = "../logger", version = "1.0.5" }
solana-metrics = { path = "../metrics", version = "1.0.3" } solana-metrics = { path = "../metrics", version = "1.0.5" }
solana-net-utils = { path = "../net-utils", version = "1.0.3" } solana-net-utils = { path = "../net-utils", version = "1.0.5" }
solana-runtime = { path = "../runtime", version = "1.0.3" } solana-runtime = { path = "../runtime", version = "1.0.5" }
solana-sdk = { path = "../sdk", version = "1.0.3" } solana-sdk = { path = "../sdk", version = "1.0.5" }
[dev-dependencies] [dev-dependencies]
solana-local-cluster = { path = "../local-cluster", version = "1.0.3" } solana-local-cluster = { path = "../local-cluster", version = "1.0.5" }

View File

@@ -2,14 +2,14 @@
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-bench-streamer" name = "solana-bench-streamer"
version = "1.0.3" version = "1.0.5"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
[dependencies] [dependencies]
clap = "2.33.0" clap = "2.33.0"
solana-clap-utils = { path = "../clap-utils", version = "1.0.3" } solana-clap-utils = { path = "../clap-utils", version = "1.0.5" }
solana-core = { path = "../core", version = "1.0.3" } solana-core = { path = "../core", version = "1.0.5" }
solana-logger = { path = "../logger", version = "1.0.3" } solana-logger = { path = "../logger", version = "1.0.5" }
solana-net-utils = { path = "../net-utils", version = "1.0.3" } solana-net-utils = { path = "../net-utils", version = "1.0.5" }

View File

@@ -2,7 +2,7 @@
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-bench-tps" name = "solana-bench-tps"
version = "1.0.3" version = "1.0.5"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@@ -14,24 +14,24 @@ log = "0.4.8"
rayon = "1.2.0" rayon = "1.2.0"
serde_json = "1.0.46" serde_json = "1.0.46"
serde_yaml = "0.8.11" serde_yaml = "0.8.11"
solana-clap-utils = { path = "../clap-utils", version = "1.0.3" } solana-clap-utils = { path = "../clap-utils", version = "1.0.5" }
solana-core = { path = "../core", version = "1.0.3" } solana-core = { path = "../core", version = "1.0.5" }
solana-genesis = { path = "../genesis", version = "1.0.3" } solana-genesis = { path = "../genesis", version = "1.0.5" }
solana-client = { path = "../client", version = "1.0.3" } solana-client = { path = "../client", version = "1.0.5" }
solana-faucet = { path = "../faucet", version = "1.0.3" } solana-faucet = { path = "../faucet", version = "1.0.5" }
solana-librapay = { path = "../programs/librapay", version = "1.0.3", optional = true } solana-librapay = { path = "../programs/librapay", version = "1.0.5", optional = true }
solana-logger = { path = "../logger", version = "1.0.3" } solana-logger = { path = "../logger", version = "1.0.5" }
solana-metrics = { path = "../metrics", version = "1.0.3" } solana-metrics = { path = "../metrics", version = "1.0.5" }
solana-measure = { path = "../measure", version = "1.0.3" } solana-measure = { path = "../measure", version = "1.0.5" }
solana-net-utils = { path = "../net-utils", version = "1.0.3" } solana-net-utils = { path = "../net-utils", version = "1.0.5" }
solana-runtime = { path = "../runtime", version = "1.0.3" } solana-runtime = { path = "../runtime", version = "1.0.5" }
solana-sdk = { path = "../sdk", version = "1.0.3" } solana-sdk = { path = "../sdk", version = "1.0.5" }
solana-move-loader-program = { path = "../programs/move_loader", version = "1.0.3", optional = true } solana-move-loader-program = { path = "../programs/move_loader", version = "1.0.5", optional = true }
[dev-dependencies] [dev-dependencies]
serial_test = "0.3.2" serial_test = "0.3.2"
serial_test_derive = "0.4.0" serial_test_derive = "0.4.0"
solana-local-cluster = { path = "../local-cluster", version = "1.0.3" } solana-local-cluster = { path = "../local-cluster", version = "1.0.5" }
[features] [features]
move = ["solana-librapay", "solana-move-loader-program"] move = ["solana-librapay", "solana-move-loader-program"]

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-chacha-cuda" name = "solana-chacha-cuda"
version = "1.0.3" version = "1.0.5"
description = "Solana Chacha Cuda APIs" description = "Solana Chacha Cuda APIs"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -10,12 +10,12 @@ edition = "2018"
[dependencies] [dependencies]
log = "0.4.8" log = "0.4.8"
solana-archiver-utils = { path = "../archiver-utils", version = "1.0.3" } solana-archiver-utils = { path = "../archiver-utils", version = "1.0.5" }
solana-chacha = { path = "../chacha", version = "1.0.3" } solana-chacha = { path = "../chacha", version = "1.0.5" }
solana-ledger = { path = "../ledger", version = "1.0.3" } solana-ledger = { path = "../ledger", version = "1.0.5" }
solana-logger = { path = "../logger", version = "1.0.3" } solana-logger = { path = "../logger", version = "1.0.5" }
solana-perf = { path = "../perf", version = "1.0.3" } solana-perf = { path = "../perf", version = "1.0.5" }
solana-sdk = { path = "../sdk", version = "1.0.3" } solana-sdk = { path = "../sdk", version = "1.0.5" }
[dev-dependencies] [dev-dependencies]
hex-literal = "0.2.1" hex-literal = "0.2.1"

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-chacha-sys" name = "solana-chacha-sys"
version = "1.0.3" version = "1.0.5"
description = "Solana chacha-sys" description = "Solana chacha-sys"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-chacha" name = "solana-chacha"
version = "1.0.3" version = "1.0.5"
description = "Solana Chacha APIs" description = "Solana Chacha APIs"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -12,11 +12,11 @@ edition = "2018"
log = "0.4.8" log = "0.4.8"
rand = "0.6.5" rand = "0.6.5"
rand_chacha = "0.1.1" rand_chacha = "0.1.1"
solana-chacha-sys = { path = "../chacha-sys", version = "1.0.3" } solana-chacha-sys = { path = "../chacha-sys", version = "1.0.5" }
solana-ledger = { path = "../ledger", version = "1.0.3" } solana-ledger = { path = "../ledger", version = "1.0.5" }
solana-logger = { path = "../logger", version = "1.0.3" } solana-logger = { path = "../logger", version = "1.0.5" }
solana-perf = { path = "../perf", version = "1.0.3" } solana-perf = { path = "../perf", version = "1.0.5" }
solana-sdk = { path = "../sdk", version = "1.0.3" } solana-sdk = { path = "../sdk", version = "1.0.5" }
[dev-dependencies] [dev-dependencies]
hex-literal = "0.2.1" hex-literal = "0.2.1"

View File

@@ -15,6 +15,7 @@ if [[ -n $CI_BRANCH ]]; then
) )
# make a local commit for the svgs # make a local commit for the svgs
git add -A -f docs/src/.gitbook/assets/. git add -A -f docs/src/.gitbook/assets/.
git add -f docs/src/cli/usage.md
if ! git diff-index --quiet HEAD; then if ! git diff-index --quiet HEAD; then
git config user.email maintainers@solana.com git config user.email maintainers@solana.com
git config user.name "$me" git config user.name "$me"

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-clap-utils" name = "solana-clap-utils"
version = "1.0.3" version = "1.0.5"
description = "Solana utilities for the clap" description = "Solana utilities for the clap"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -11,8 +11,8 @@ edition = "2018"
[dependencies] [dependencies]
clap = "2.33.0" clap = "2.33.0"
rpassword = "4.0" rpassword = "4.0"
solana-remote-wallet = { path = "../remote-wallet", version = "1.0.3" } solana-remote-wallet = { path = "../remote-wallet", version = "1.0.5" }
solana-sdk = { path = "../sdk", version = "1.0.3" } solana-sdk = { path = "../sdk", version = "1.0.5" }
tiny-bip39 = "0.7.0" tiny-bip39 = "0.7.0"
url = "2.1.0" url = "2.1.0"
chrono = "0.4" chrono = "0.4"

View File

@@ -1,9 +1,10 @@
use crate::keypair::{ use crate::keypair::{
keypair_from_seed_phrase, signer_from_path, ASK_KEYWORD, SKIP_SEED_PHRASE_VALIDATION_ARG, keypair_from_seed_phrase, pubkey_from_path, signer_from_path, ASK_KEYWORD,
SKIP_SEED_PHRASE_VALIDATION_ARG,
}; };
use chrono::DateTime; use chrono::DateTime;
use clap::ArgMatches; use clap::ArgMatches;
use solana_remote_wallet::remote_wallet::{DerivationPath, RemoteWalletManager}; use solana_remote_wallet::remote_wallet::RemoteWalletManager;
use solana_sdk::{ use solana_sdk::{
clock::UnixTimestamp, clock::UnixTimestamp,
native_token::sol_to_lamports, native_token::sol_to_lamports,
@@ -111,18 +112,25 @@ pub fn signer_of(
} }
} }
pub fn lamports_of_sol(matches: &ArgMatches<'_>, name: &str) -> Option<u64> { pub fn pubkey_of_signer(
value_of(matches, name).map(sol_to_lamports) matches: &ArgMatches<'_>,
name: &str,
wallet_manager: Option<&Arc<RemoteWalletManager>>,
) -> Result<Option<Pubkey>, Box<dyn std::error::Error>> {
if let Some(location) = matches.value_of(name) {
Ok(Some(pubkey_from_path(
matches,
location,
name,
wallet_manager,
)?))
} else {
Ok(None)
}
} }
pub fn derivation_of(matches: &ArgMatches<'_>, name: &str) -> Option<DerivationPath> { pub fn lamports_of_sol(matches: &ArgMatches<'_>, name: &str) -> Option<u64> {
matches.value_of(name).map(|derivation_str| { value_of(matches, name).map(sol_to_lamports)
let derivation_str = derivation_str.replace("'", "");
let mut parts = derivation_str.split('/');
let account = parts.next().map(|account| account.parse::<u32>().unwrap());
let change = parts.next().map(|change| change.parse::<u32>().unwrap());
DerivationPath { account, change }
})
} }
#[cfg(test)] #[cfg(test)]
@@ -299,40 +307,4 @@ mod tests {
.get_matches_from(vec!["test", "--single", "0.03"]); .get_matches_from(vec!["test", "--single", "0.03"]);
assert_eq!(lamports_of_sol(&matches, "single"), Some(30000000)); assert_eq!(lamports_of_sol(&matches, "single"), Some(30000000));
} }
#[test]
fn test_derivation_of() {
let matches = app()
.clone()
.get_matches_from(vec!["test", "--single", "2/3"]);
assert_eq!(
derivation_of(&matches, "single"),
Some(DerivationPath {
account: Some(2),
change: Some(3)
})
);
assert_eq!(derivation_of(&matches, "another"), None);
let matches = app()
.clone()
.get_matches_from(vec!["test", "--single", "2"]);
assert_eq!(
derivation_of(&matches, "single"),
Some(DerivationPath {
account: Some(2),
change: None
})
);
assert_eq!(derivation_of(&matches, "another"), None);
let matches = app()
.clone()
.get_matches_from(vec!["test", "--single", "2'/3'"]);
assert_eq!(
derivation_of(&matches, "single"),
Some(DerivationPath {
account: Some(2),
change: Some(3)
})
);
}
} }

View File

@@ -1,10 +1,6 @@
use crate::{ use crate::{input_parsers::pubkeys_sigs_of, offline::SIGNER_ARG, ArgConstant};
input_parsers::{derivation_of, pubkeys_sigs_of},
offline::SIGNER_ARG,
ArgConstant,
};
use bip39::{Language, Mnemonic, Seed}; use bip39::{Language, Mnemonic, Seed};
use clap::{values_t, ArgMatches, Error, ErrorKind}; use clap::{ArgMatches, Error, ErrorKind};
use rpassword::prompt_password_stderr; use rpassword::prompt_password_stderr;
use solana_remote_wallet::{ use solana_remote_wallet::{
remote_keypair::generate_remote_keypair, remote_keypair::generate_remote_keypair,
@@ -84,9 +80,9 @@ pub fn signer_from_path(
if let Some(wallet_manager) = wallet_manager { if let Some(wallet_manager) = wallet_manager {
Ok(Box::new(generate_remote_keypair( Ok(Box::new(generate_remote_keypair(
path, path,
derivation_of(matches, "derivation_path"),
wallet_manager, wallet_manager,
matches.is_present("confirm_key"), matches.is_present("confirm_key"),
keypair_name,
)?)) )?))
} else { } else {
Err(RemoteWalletError::NoDeviceFound.into()) Err(RemoteWalletError::NoDeviceFound.into())
@@ -109,39 +105,27 @@ pub fn signer_from_path(
} }
} }
pub fn pubkey_from_path(
matches: &ArgMatches,
path: &str,
keypair_name: &str,
wallet_manager: Option<&Arc<RemoteWalletManager>>,
) -> Result<Pubkey, Box<dyn error::Error>> {
match parse_keypair_path(path) {
KeypairUrl::Pubkey(pubkey) => Ok(pubkey),
_ => Ok(signer_from_path(matches, path, keypair_name, wallet_manager)?.pubkey()),
}
}
// Keyword used to indicate that the user should be asked for a keypair seed phrase // Keyword used to indicate that the user should be asked for a keypair seed phrase
pub const ASK_KEYWORD: &str = "ASK"; pub const ASK_KEYWORD: &str = "ASK";
pub const ASK_SEED_PHRASE_ARG: ArgConstant<'static> = ArgConstant {
long: "ask-seed-phrase",
name: "ask_seed_phrase",
help: "Recover a keypair using a seed phrase and optional passphrase",
};
pub const SKIP_SEED_PHRASE_VALIDATION_ARG: ArgConstant<'static> = ArgConstant { pub const SKIP_SEED_PHRASE_VALIDATION_ARG: ArgConstant<'static> = ArgConstant {
long: "skip-seed-phrase-validation", long: "skip-seed-phrase-validation",
name: "skip_seed_phrase_validation", name: "skip_seed_phrase_validation",
help: "Skip validation of seed phrases. Use this if your phrase does not use the BIP39 official English word list", help: "Skip validation of seed phrases. Use this if your phrase does not use the BIP39 official English word list",
}; };
#[derive(Debug, PartialEq)]
pub enum Source {
Generated,
Path,
SeedPhrase,
}
pub struct KeypairWithSource {
pub keypair: Keypair,
pub source: Source,
}
impl KeypairWithSource {
fn new(keypair: Keypair, source: Source) -> Self {
Self { keypair, source }
}
}
/// Prompts user for a passphrase and then asks for confirmirmation to check for mistakes /// Prompts user for a passphrase and then asks for confirmirmation to check for mistakes
pub fn prompt_passphrase(prompt: &str) -> Result<String, Box<dyn error::Error>> { pub fn prompt_passphrase(prompt: &str) -> Result<String, Box<dyn error::Error>> {
let passphrase = prompt_password_stderr(&prompt)?; let passphrase = prompt_password_stderr(&prompt)?;
@@ -195,47 +179,6 @@ pub fn keypair_from_seed_phrase(
Ok(keypair) Ok(keypair)
} }
/// Checks CLI arguments to determine whether a keypair should be:
/// - inputted securely via stdin,
/// - read in from a file,
/// - or newly generated
pub fn keypair_input(
matches: &clap::ArgMatches,
keypair_name: &str,
) -> Result<KeypairWithSource, Box<dyn error::Error>> {
let ask_seed_phrase_matches =
values_t!(matches.values_of(ASK_SEED_PHRASE_ARG.name), String).unwrap_or_default();
let keypair_match_name = keypair_name.replace('-', "_");
if ask_seed_phrase_matches
.iter()
.any(|s| s.as_str() == keypair_name)
{
if matches.value_of(keypair_match_name).is_some() {
clap::Error::with_description(
&format!(
"`--{} {}` cannot be used with `{} <PATH>`",
ASK_SEED_PHRASE_ARG.long, keypair_name, keypair_name
),
clap::ErrorKind::ArgumentConflict,
)
.exit();
}
let skip_validation = matches.is_present(SKIP_SEED_PHRASE_VALIDATION_ARG.name);
keypair_from_seed_phrase(keypair_name, skip_validation, true)
.map(|keypair| KeypairWithSource::new(keypair, Source::SeedPhrase))
} else if let Some(keypair_file) = matches.value_of(keypair_match_name) {
if keypair_file.starts_with("usb://") {
Ok(KeypairWithSource::new(Keypair::new(), Source::Path))
} else {
read_keypair_file(keypair_file)
.map(|keypair| KeypairWithSource::new(keypair, Source::Path))
}
} else {
Ok(KeypairWithSource::new(Keypair::new(), Source::Generated))
}
}
fn sanitize_seed_phrase(seed_phrase: &str) -> String { fn sanitize_seed_phrase(seed_phrase: &str) -> String {
seed_phrase seed_phrase
.split_whitespace() .split_whitespace()
@@ -246,14 +189,6 @@ fn sanitize_seed_phrase(seed_phrase: &str) -> String {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
use clap::ArgMatches;
#[test]
fn test_keypair_input() {
let arg_matches = ArgMatches::default();
let KeypairWithSource { source, .. } = keypair_input(&arg_matches, "").unwrap();
assert_eq!(source, Source::Generated);
}
#[test] #[test]
fn test_sanitize_seed_phrase() { fn test_sanitize_seed_phrase() {

View File

@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-cli-config" name = "solana-cli-config"
description = "Blockchain, Rebuilt for Scale" description = "Blockchain, Rebuilt for Scale"
version = "1.0.3" version = "1.0.5"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@@ -14,3 +14,4 @@ lazy_static = "1.4.0"
serde = "1.0.104" serde = "1.0.104"
serde_derive = "1.0.103" serde_derive = "1.0.103"
serde_yaml = "0.8.11" serde_yaml = "0.8.11"
url = "2.1.1"

View File

@@ -5,6 +5,7 @@ use std::{
io::{self, Write}, io::{self, Write},
path::Path, path::Path,
}; };
use url::Url;
lazy_static! { lazy_static! {
pub static ref CONFIG_FILE: Option<String> = { pub static ref CONFIG_FILE: Option<String> = {
@@ -15,22 +16,32 @@ lazy_static! {
}; };
} }
#[derive(Serialize, Deserialize, Default, Debug, PartialEq)] #[derive(Serialize, Deserialize, Debug, PartialEq)]
pub struct Config { pub struct Config {
pub url: String, pub json_rpc_url: String,
pub websocket_url: String, pub websocket_url: String,
pub keypair_path: String, pub keypair_path: String,
} }
impl Config { impl Default for Config {
pub fn new(url: &str, websocket_url: &str, keypair_path: &str) -> Self { fn default() -> Self {
Self { let keypair_path = {
url: url.to_string(), let mut keypair_path = dirs::home_dir().expect("home directory");
websocket_url: websocket_url.to_string(), keypair_path.extend(&[".config", "solana", "id.json"]);
keypair_path: keypair_path.to_string(), keypair_path.to_str().unwrap().to_string()
} };
} let json_rpc_url = "http://127.0.0.1:8899".to_string();
let websocket_url = Self::compute_websocket_url(&json_rpc_url);
Self {
json_rpc_url,
websocket_url,
keypair_path,
}
}
}
impl Config {
pub fn load(config_file: &str) -> Result<Self, io::Error> { pub fn load(config_file: &str) -> Result<Self, io::Error> {
let file = File::open(config_file.to_string())?; let file = File::open(config_file.to_string())?;
let config = serde_yaml::from_reader(file) let config = serde_yaml::from_reader(file)
@@ -50,4 +61,29 @@ impl Config {
Ok(()) Ok(())
} }
pub fn compute_websocket_url(json_rpc_url: &str) -> String {
let json_rpc_url: Option<Url> = json_rpc_url.parse().ok();
if json_rpc_url.is_none() {
return "".to_string();
}
let json_rpc_url = json_rpc_url.unwrap();
let is_secure = json_rpc_url.scheme().to_ascii_lowercase() == "https";
let mut ws_url = json_rpc_url.clone();
ws_url
.set_scheme(if is_secure { "wss" } else { "ws" })
.expect("unable to set scheme");
let ws_port = match json_rpc_url.port() {
Some(port) => port + 1,
None => {
if is_secure {
8901
} else {
8900
}
}
};
ws_url.set_port(Some(ws_port)).expect("unable to set port");
ws_url.to_string()
}
} }

View File

@@ -1,4 +1,5 @@
#[macro_use] #[macro_use]
extern crate lazy_static; extern crate lazy_static;
pub mod config; mod config;
pub use config::{Config, CONFIG_FILE};

View File

@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-cli" name = "solana-cli"
description = "Blockchain, Rebuilt for Scale" description = "Blockchain, Rebuilt for Scale"
version = "1.0.3" version = "1.0.5"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@@ -26,27 +26,27 @@ reqwest = { version = "0.10.1", default-features = false, features = ["blocking"
serde = "1.0.104" serde = "1.0.104"
serde_derive = "1.0.103" serde_derive = "1.0.103"
serde_json = "1.0.46" serde_json = "1.0.46"
solana-budget-program = { path = "../programs/budget", version = "1.0.3" } solana-budget-program = { path = "../programs/budget", version = "1.0.5" }
solana-clap-utils = { path = "../clap-utils", version = "1.0.3" } solana-clap-utils = { path = "../clap-utils", version = "1.0.5" }
solana-cli-config = { path = "../cli-config", version = "1.0.3" } solana-cli-config = { path = "../cli-config", version = "1.0.5" }
solana-client = { path = "../client", version = "1.0.3" } solana-client = { path = "../client", version = "1.0.5" }
solana-config-program = { path = "../programs/config", version = "1.0.3" } solana-config-program = { path = "../programs/config", version = "1.0.5" }
solana-faucet = { path = "../faucet", version = "1.0.3" } solana-faucet = { path = "../faucet", version = "1.0.5" }
solana-logger = { path = "../logger", version = "1.0.3" } solana-logger = { path = "../logger", version = "1.0.5" }
solana-net-utils = { path = "../net-utils", version = "1.0.3" } solana-net-utils = { path = "../net-utils", version = "1.0.5" }
solana-remote-wallet = { path = "../remote-wallet", version = "1.0.3" } solana-remote-wallet = { path = "../remote-wallet", version = "1.0.5" }
solana-runtime = { path = "../runtime", version = "1.0.3" } solana-runtime = { path = "../runtime", version = "1.0.5" }
solana-sdk = { path = "../sdk", version = "1.0.3" } solana-sdk = { path = "../sdk", version = "1.0.5" }
solana-stake-program = { path = "../programs/stake", version = "1.0.3" } solana-stake-program = { path = "../programs/stake", version = "1.0.5" }
solana-storage-program = { path = "../programs/storage", version = "1.0.3" } solana-storage-program = { path = "../programs/storage", version = "1.0.5" }
solana-vote-program = { path = "../programs/vote", version = "1.0.3" } solana-vote-program = { path = "../programs/vote", version = "1.0.5" }
solana-vote-signer = { path = "../vote-signer", version = "1.0.3" } solana-vote-signer = { path = "../vote-signer", version = "1.0.5" }
titlecase = "1.1.0" titlecase = "1.1.0"
url = "2.1.1" url = "2.1.1"
[dev-dependencies] [dev-dependencies]
solana-core = { path = "../core", version = "1.0.3" } solana-core = { path = "../core", version = "1.0.5" }
solana-budget-program = { path = "../programs/budget", version = "1.0.3" } solana-budget-program = { path = "../programs/budget", version = "1.0.5" }
tempfile = "3.1.0" tempfile = "3.1.0"
[[bin]] [[bin]]

View File

@@ -23,7 +23,7 @@ use solana_client::{client_error::ClientError, rpc_client::RpcClient};
use solana_faucet::faucet::request_airdrop_transaction; use solana_faucet::faucet::request_airdrop_transaction;
#[cfg(test)] #[cfg(test)]
use solana_faucet::faucet_mock::request_airdrop_transaction; use solana_faucet::faucet_mock::request_airdrop_transaction;
use solana_remote_wallet::remote_wallet::{DerivationPath, RemoteWalletManager}; use solana_remote_wallet::remote_wallet::RemoteWalletManager;
use solana_sdk::{ use solana_sdk::{
bpf_loader, bpf_loader,
clock::{Epoch, Slot}, clock::{Epoch, Slot},
@@ -452,49 +452,21 @@ pub struct CliConfig<'a> {
pub websocket_url: String, pub websocket_url: String,
pub signers: Vec<&'a dyn Signer>, pub signers: Vec<&'a dyn Signer>,
pub keypair_path: String, pub keypair_path: String,
pub derivation_path: Option<DerivationPath>,
pub rpc_client: Option<RpcClient>, pub rpc_client: Option<RpcClient>,
pub verbose: bool, pub verbose: bool,
} }
impl CliConfig<'_> { impl CliConfig<'_> {
fn default_keypair_path() -> String { fn default_keypair_path() -> String {
let mut keypair_path = dirs::home_dir().expect("home directory"); solana_cli_config::Config::default().keypair_path
keypair_path.extend(&[".config", "solana", "id.json"]);
keypair_path.to_str().unwrap().to_string()
} }
fn default_json_rpc_url() -> String { fn default_json_rpc_url() -> String {
"http://127.0.0.1:8899".to_string() solana_cli_config::Config::default().json_rpc_url
} }
fn default_websocket_url() -> String { fn default_websocket_url() -> String {
Self::compute_ws_url(&Self::default_json_rpc_url()) solana_cli_config::Config::default().websocket_url
}
fn compute_ws_url(rpc_url: &str) -> String {
let rpc_url: Option<Url> = rpc_url.parse().ok();
if rpc_url.is_none() {
return "".to_string();
}
let rpc_url = rpc_url.unwrap();
let is_secure = rpc_url.scheme().to_ascii_lowercase() == "https";
let mut ws_url = rpc_url.clone();
ws_url
.set_scheme(if is_secure { "wss" } else { "ws" })
.expect("unable to set scheme");
let ws_port = match rpc_url.port() {
Some(port) => port + 1,
None => {
if is_secure {
8901
} else {
8900
}
}
};
ws_url.set_port(Some(ws_port)).expect("unable to set port");
ws_url.to_string()
} }
fn first_nonempty_setting( fn first_nonempty_setting(
@@ -517,11 +489,11 @@ impl CliConfig<'_> {
(SettingType::Explicit, websocket_cfg_url.to_string()), (SettingType::Explicit, websocket_cfg_url.to_string()),
( (
SettingType::Computed, SettingType::Computed,
Self::compute_ws_url(json_rpc_cmd_url), solana_cli_config::Config::compute_websocket_url(json_rpc_cmd_url),
), ),
( (
SettingType::Computed, SettingType::Computed,
Self::compute_ws_url(json_rpc_cfg_url), solana_cli_config::Config::compute_websocket_url(json_rpc_cfg_url),
), ),
(SettingType::SystemDefault, Self::default_websocket_url()), (SettingType::SystemDefault, Self::default_websocket_url()),
]) ])
@@ -571,7 +543,6 @@ impl Default for CliConfig<'_> {
websocket_url: Self::default_websocket_url(), websocket_url: Self::default_websocket_url(),
signers: Vec::new(), signers: Vec::new(),
keypair_path: Self::default_keypair_path(), keypair_path: Self::default_keypair_path(),
derivation_path: None,
rpc_client: None, rpc_client: None,
verbose: false, verbose: false,
} }
@@ -590,7 +561,9 @@ pub fn parse_command(
command: CliCommand::ClusterVersion, command: CliCommand::ClusterVersion,
signers: vec![], signers: vec![],
}), }),
("create-address-with-seed", Some(matches)) => parse_create_address_with_seed(matches), ("create-address-with-seed", Some(matches)) => {
parse_create_address_with_seed(matches, default_signer_path, wallet_manager)
}
("fees", Some(_matches)) => Ok(CliCommandInfo { ("fees", Some(_matches)) => Ok(CliCommandInfo {
command: CliCommand::Fees, command: CliCommand::Fees,
signers: vec![], signers: vec![],
@@ -1036,8 +1009,20 @@ pub fn return_signers(tx: &Transaction) -> ProcessResult {
pub fn parse_create_address_with_seed( pub fn parse_create_address_with_seed(
matches: &ArgMatches<'_>, matches: &ArgMatches<'_>,
default_signer_path: &str,
wallet_manager: Option<&Arc<RemoteWalletManager>>,
) -> Result<CliCommandInfo, CliError> { ) -> Result<CliCommandInfo, CliError> {
let from_pubkey = pubkey_of(matches, "from"); let from_pubkey = pubkey_of_signer(matches, "from", wallet_manager)?;
let signers = if from_pubkey.is_some() {
vec![]
} else {
vec![signer_from_path(
matches,
default_signer_path,
"keypair",
wallet_manager,
)?]
};
let program_id = match matches.value_of("program_id").unwrap() { let program_id = match matches.value_of("program_id").unwrap() {
"STAKE" => solana_stake_program::id(), "STAKE" => solana_stake_program::id(),
@@ -1060,7 +1045,7 @@ pub fn parse_create_address_with_seed(
seed, seed,
program_id, program_id,
}, },
signers: vec![], signers,
}) })
} }
@@ -1070,9 +1055,12 @@ fn process_create_address_with_seed(
seed: &str, seed: &str,
program_id: &Pubkey, program_id: &Pubkey,
) -> ProcessResult { ) -> ProcessResult {
let config_pubkey = config.pubkey()?; let from_pubkey = if let Some(pubkey) = from_pubkey {
let from_pubkey = from_pubkey.unwrap_or(&config_pubkey); *pubkey
let address = create_address_with_seed(from_pubkey, seed, program_id)?; } else {
config.pubkey()?
};
let address = create_address_with_seed(&from_pubkey, seed, program_id)?;
Ok(address.to_string()) Ok(address.to_string())
} }
@@ -1957,7 +1945,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult {
} => { } => {
let faucet_addr = SocketAddr::new( let faucet_addr = SocketAddr::new(
faucet_host.unwrap_or_else(|| { faucet_host.unwrap_or_else(|| {
let faucet_host = url::Url::parse(&config.json_rpc_url) let faucet_host = Url::parse(&config.json_rpc_url)
.unwrap() .unwrap()
.host() .host()
.unwrap() .unwrap()
@@ -2288,7 +2276,7 @@ pub fn app<'ab, 'v>(name: &str, about: &'ab str, version: &'v str) -> App<'ab, '
.value_name("PUBKEY") .value_name("PUBKEY")
.takes_value(true) .takes_value(true)
.required(false) .required(false)
.validator(is_pubkey_or_keypair) .validator(is_valid_signer)
.help("From (base) key, defaults to client keypair."), .help("From (base) key, defaults to client keypair."),
), ),
) )
@@ -2721,14 +2709,14 @@ mod tests {
"STAKE", "STAKE",
]); ]);
assert_eq!( assert_eq!(
parse_command(&test_create_address_with_seed, "", None).unwrap(), parse_command(&test_create_address_with_seed, &keypair_file, None).unwrap(),
CliCommandInfo { CliCommandInfo {
command: CliCommand::CreateAddressWithSeed { command: CliCommand::CreateAddressWithSeed {
from_pubkey: None, from_pubkey: None,
seed: "seed".to_string(), seed: "seed".to_string(),
program_id: solana_stake_program::id(), program_id: solana_stake_program::id(),
}, },
signers: vec![], signers: vec![read_keypair_file(&keypair_file).unwrap().into()],
} }
); );
@@ -3332,8 +3320,22 @@ mod tests {
let signature = process_command(&config); let signature = process_command(&config);
assert_eq!(signature.unwrap(), SIGNATURE.to_string()); assert_eq!(signature.unwrap(), SIGNATURE.to_string());
// CreateAddressWithSeed
let from_pubkey = Pubkey::new_rand();
config.signers = vec![];
config.command = CliCommand::CreateAddressWithSeed {
from_pubkey: Some(from_pubkey),
seed: "seed".to_string(),
program_id: solana_stake_program::id(),
};
let address = process_command(&config);
let expected_address =
create_address_with_seed(&from_pubkey, "seed", &solana_stake_program::id()).unwrap();
assert_eq!(address.unwrap(), expected_address.to_string());
// Need airdrop cases // Need airdrop cases
let to = Pubkey::new_rand(); let to = Pubkey::new_rand();
config.signers = vec![&keypair];
config.command = CliCommand::Airdrop { config.command = CliCommand::Airdrop {
faucet_host: None, faucet_host: None,
faucet_port: 1234, faucet_port: 1234,

View File

@@ -1,16 +1,12 @@
use clap::{crate_description, crate_name, AppSettings, Arg, ArgGroup, ArgMatches, SubCommand}; use clap::{crate_description, crate_name, AppSettings, Arg, ArgGroup, ArgMatches, SubCommand};
use console::style; use console::style;
use solana_clap_utils::{ use solana_clap_utils::{input_validators::is_url, keypair::SKIP_SEED_PHRASE_VALIDATION_ARG};
input_parsers::derivation_of,
input_validators::{is_derivation, is_url},
keypair::SKIP_SEED_PHRASE_VALIDATION_ARG,
};
use solana_cli::{ use solana_cli::{
cli::{app, parse_command, process_command, CliCommandInfo, CliConfig, CliSigners}, cli::{app, parse_command, process_command, CliCommandInfo, CliConfig, CliSigners},
display::{println_name_value, println_name_value_or}, display::{println_name_value, println_name_value_or},
}; };
use solana_cli_config::config::{Config, CONFIG_FILE}; use solana_cli_config::{Config, CONFIG_FILE};
use solana_remote_wallet::remote_wallet::{maybe_wallet_manager, RemoteWalletManager}; use solana_remote_wallet::remote_wallet::{maybe_wallet_manager, RemoteWalletManager};
use std::{error, sync::Arc}; use std::{error, sync::Arc};
@@ -22,12 +18,12 @@ fn parse_settings(matches: &ArgMatches<'_>) -> Result<bool, Box<dyn error::Error
let config = Config::load(config_file).unwrap_or_default(); let config = Config::load(config_file).unwrap_or_default();
let (url_setting_type, json_rpc_url) = let (url_setting_type, json_rpc_url) =
CliConfig::compute_json_rpc_url_setting("", &config.url); CliConfig::compute_json_rpc_url_setting("", &config.json_rpc_url);
let (ws_setting_type, websocket_url) = CliConfig::compute_websocket_url_setting( let (ws_setting_type, websocket_url) = CliConfig::compute_websocket_url_setting(
"", "",
&config.websocket_url, &config.websocket_url,
"", "",
&config.url, &config.json_rpc_url,
); );
let (keypair_setting_type, keypair_path) = let (keypair_setting_type, keypair_path) =
CliConfig::compute_keypair_path_setting("", &config.keypair_path); CliConfig::compute_keypair_path_setting("", &config.keypair_path);
@@ -58,7 +54,7 @@ fn parse_settings(matches: &ArgMatches<'_>) -> Result<bool, Box<dyn error::Error
if let Some(config_file) = matches.value_of("config_file") { if let Some(config_file) = matches.value_of("config_file") {
let mut config = Config::load(config_file).unwrap_or_default(); let mut config = Config::load(config_file).unwrap_or_default();
if let Some(url) = subcommand_matches.value_of("json_rpc_url") { if let Some(url) = subcommand_matches.value_of("json_rpc_url") {
config.url = url.to_string(); config.json_rpc_url = url.to_string();
} }
if let Some(url) = subcommand_matches.value_of("websocket_url") { if let Some(url) = subcommand_matches.value_of("websocket_url") {
config.websocket_url = url.to_string(); config.websocket_url = url.to_string();
@@ -69,12 +65,12 @@ fn parse_settings(matches: &ArgMatches<'_>) -> Result<bool, Box<dyn error::Error
config.save(config_file)?; config.save(config_file)?;
let (url_setting_type, json_rpc_url) = let (url_setting_type, json_rpc_url) =
CliConfig::compute_json_rpc_url_setting("", &config.url); CliConfig::compute_json_rpc_url_setting("", &config.json_rpc_url);
let (ws_setting_type, websocket_url) = CliConfig::compute_websocket_url_setting( let (ws_setting_type, websocket_url) = CliConfig::compute_websocket_url_setting(
"", "",
&config.websocket_url, &config.websocket_url,
"", "",
&config.url, &config.json_rpc_url,
); );
let (keypair_setting_type, keypair_path) = let (keypair_setting_type, keypair_path) =
CliConfig::compute_keypair_path_setting("", &config.keypair_path); CliConfig::compute_keypair_path_setting("", &config.keypair_path);
@@ -109,13 +105,13 @@ pub fn parse_args<'a>(
}; };
let (_, json_rpc_url) = CliConfig::compute_json_rpc_url_setting( let (_, json_rpc_url) = CliConfig::compute_json_rpc_url_setting(
matches.value_of("json_rpc_url").unwrap_or(""), matches.value_of("json_rpc_url").unwrap_or(""),
&config.url, &config.json_rpc_url,
); );
let (_, websocket_url) = CliConfig::compute_websocket_url_setting( let (_, websocket_url) = CliConfig::compute_websocket_url_setting(
matches.value_of("websocket_url").unwrap_or(""), matches.value_of("websocket_url").unwrap_or(""),
&config.websocket_url, &config.websocket_url,
matches.value_of("json_rpc_url").unwrap_or(""), matches.value_of("json_rpc_url").unwrap_or(""),
&config.url, &config.json_rpc_url,
); );
let (_, default_signer_path) = CliConfig::compute_keypair_path_setting( let (_, default_signer_path) = CliConfig::compute_keypair_path_setting(
matches.value_of("keypair").unwrap_or(""), matches.value_of("keypair").unwrap_or(""),
@@ -132,7 +128,6 @@ pub fn parse_args<'a>(
websocket_url, websocket_url,
signers: vec![], signers: vec![],
keypair_path: default_signer_path, keypair_path: default_signer_path,
derivation_path: derivation_of(matches, "derivation_path"),
rpc_client: None, rpc_client: None,
verbose: matches.is_present("verbose"), verbose: matches.is_present("verbose"),
}, },
@@ -189,15 +184,6 @@ fn main() -> Result<(), Box<dyn error::Error>> {
.takes_value(true) .takes_value(true)
.help("/path/to/id.json or usb://remote/wallet/path"), .help("/path/to/id.json or usb://remote/wallet/path"),
) )
.arg(
Arg::with_name("derivation_path")
.long("derivation-path")
.value_name("ACCOUNT or ACCOUNT/CHANGE")
.global(true)
.takes_value(true)
.validator(is_derivation)
.help("Derivation path to use: m/44'/501'/ACCOUNT'/CHANGE'; default key is device base pubkey: m/44'/501'/0'")
)
.arg( .arg(
Arg::with_name("verbose") Arg::with_name("verbose")
.long("verbose") .long("verbose")

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-client" name = "solana-client"
version = "1.0.3" version = "1.0.5"
description = "Solana Client" description = "Solana Client"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -18,8 +18,8 @@ reqwest = { version = "0.10.1", default-features = false, features = ["blocking"
serde = "1.0.104" serde = "1.0.104"
serde_derive = "1.0.103" serde_derive = "1.0.103"
serde_json = "1.0.46" serde_json = "1.0.46"
solana-net-utils = { path = "../net-utils", version = "1.0.3" } solana-net-utils = { path = "../net-utils", version = "1.0.5" }
solana-sdk = { path = "../sdk", version = "1.0.3" } solana-sdk = { path = "../sdk", version = "1.0.5" }
thiserror = "1.0" thiserror = "1.0"
tungstenite = "0.10.1" tungstenite = "0.10.1"
url = "2.1.1" url = "2.1.1"
@@ -28,4 +28,4 @@ url = "2.1.1"
assert_matches = "1.3.0" assert_matches = "1.3.0"
jsonrpc-core = "14.0.5" jsonrpc-core = "14.0.5"
jsonrpc-http-server = "14.0.6" jsonrpc-http-server = "14.0.6"
solana-logger = { path = "../logger", version = "1.0.3" } solana-logger = { path = "../logger", version = "1.0.5" }

View File

@@ -71,6 +71,17 @@ impl GenericRpcClientRequest for MockRpcClientRequest {
serde_json::to_value(FeeCalculator::default()).unwrap(), serde_json::to_value(FeeCalculator::default()).unwrap(),
), ),
})?, })?,
RpcRequest::GetFeeCalculatorForBlockhash => {
let value = if self.url == "blockhash_expired" {
Value::Null
} else {
serde_json::to_value(Some(FeeCalculator::default())).unwrap()
};
serde_json::to_value(Response {
context: RpcResponseContext { slot: 1 },
value,
})?
}
RpcRequest::GetFeeRateGovernor => serde_json::to_value(Response { RpcRequest::GetFeeRateGovernor => serde_json::to_value(Response {
context: RpcResponseContext { slot: 1 }, context: RpcResponseContext { slot: 1 },
value: serde_json::to_value(FeeRateGovernor::default()).unwrap(), value: serde_json::to_value(FeeRateGovernor::default()).unwrap(),

View File

@@ -6,8 +6,8 @@ use crate::{
rpc_request::RpcRequest, rpc_request::RpcRequest,
rpc_response::{ rpc_response::{
Response, RpcAccount, RpcBlockhashFeeCalculator, RpcConfirmedBlock, RpcContactInfo, Response, RpcAccount, RpcBlockhashFeeCalculator, RpcConfirmedBlock, RpcContactInfo,
RpcEpochInfo, RpcFeeRateGovernor, RpcIdentity, RpcKeyedAccount, RpcLeaderSchedule, RpcEpochInfo, RpcFeeCalculator, RpcFeeRateGovernor, RpcIdentity, RpcKeyedAccount,
RpcResponse, RpcVersionInfo, RpcVoteAccountStatus, RpcLeaderSchedule, RpcResponse, RpcVersionInfo, RpcVoteAccountStatus,
}, },
}; };
use bincode::serialize; use bincode::serialize;
@@ -839,6 +839,35 @@ impl RpcClient {
}) })
} }
pub fn get_fee_calculator_for_blockhash(
&self,
blockhash: &Hash,
) -> io::Result<Option<FeeCalculator>> {
let response = self
.client
.send(
&RpcRequest::GetFeeCalculatorForBlockhash,
json!([blockhash.to_string()]),
0,
)
.map_err(|e| {
io::Error::new(
io::ErrorKind::Other,
format!("GetFeeCalculatorForBlockhash request failure: {:?}", e),
)
})?;
let Response { value, .. } = serde_json::from_value::<Response<Option<RpcFeeCalculator>>>(
response,
)
.map_err(|e| {
io::Error::new(
io::ErrorKind::Other,
format!("GetFeeCalculatorForBlockhash parse failure: {:?}", e),
)
})?;
Ok(value.map(|rf| rf.fee_calculator))
}
pub fn get_fee_rate_governor(&self) -> RpcResponse<FeeRateGovernor> { pub fn get_fee_rate_governor(&self) -> RpcResponse<FeeRateGovernor> {
let response = self let response = self
.client .client

View File

@@ -21,6 +21,7 @@ pub enum RpcRequest {
GetNumBlocksSinceSignatureConfirmation, GetNumBlocksSinceSignatureConfirmation,
GetProgramAccounts, GetProgramAccounts,
GetRecentBlockhash, GetRecentBlockhash,
GetFeeCalculatorForBlockhash,
GetFeeRateGovernor, GetFeeRateGovernor,
GetSignatureStatus, GetSignatureStatus,
GetSlot, GetSlot,
@@ -64,6 +65,7 @@ impl RpcRequest {
} }
RpcRequest::GetProgramAccounts => "getProgramAccounts", RpcRequest::GetProgramAccounts => "getProgramAccounts",
RpcRequest::GetRecentBlockhash => "getRecentBlockhash", RpcRequest::GetRecentBlockhash => "getRecentBlockhash",
RpcRequest::GetFeeCalculatorForBlockhash => "getFeeCalculatorForBlockhash",
RpcRequest::GetFeeRateGovernor => "getFeeRateGovernor", RpcRequest::GetFeeRateGovernor => "getFeeRateGovernor",
RpcRequest::GetSignatureStatus => "getSignatureStatus", RpcRequest::GetSignatureStatus => "getSignatureStatus",
RpcRequest::GetSlot => "getSlot", RpcRequest::GetSlot => "getSlot",
@@ -127,7 +129,7 @@ mod tests {
assert_eq!(request["params"], json!([addr])); assert_eq!(request["params"], json!([addr]));
let test_request = RpcRequest::GetBalance; let test_request = RpcRequest::GetBalance;
let request = test_request.build_request_json(1, json!([addr])); let request = test_request.build_request_json(1, json!([addr.clone()]));
assert_eq!(request["method"], "getBalance"); assert_eq!(request["method"], "getBalance");
let test_request = RpcRequest::GetEpochInfo; let test_request = RpcRequest::GetEpochInfo;
@@ -142,6 +144,10 @@ mod tests {
let request = test_request.build_request_json(1, Value::Null); let request = test_request.build_request_json(1, Value::Null);
assert_eq!(request["method"], "getRecentBlockhash"); assert_eq!(request["method"], "getRecentBlockhash");
let test_request = RpcRequest::GetFeeCalculatorForBlockhash;
let request = test_request.build_request_json(1, json!([addr.clone()]));
assert_eq!(request["method"], "getFeeCalculatorForBlockhash");
let test_request = RpcRequest::GetFeeRateGovernor; let test_request = RpcRequest::GetFeeRateGovernor;
let request = test_request.build_request_json(1, Value::Null); let request = test_request.build_request_json(1, Value::Null);
assert_eq!(request["method"], "getFeeRateGovernor"); assert_eq!(request["method"], "getFeeRateGovernor");

View File

@@ -152,6 +152,12 @@ pub struct RpcBlockhashFeeCalculator {
pub fee_calculator: FeeCalculator, pub fee_calculator: FeeCalculator,
} }
#[derive(Serialize, Deserialize, Clone, Debug)]
#[serde(rename_all = "camelCase")]
pub struct RpcFeeCalculator {
pub fee_calculator: FeeCalculator,
}
#[derive(Serialize, Deserialize, Clone, Debug)] #[derive(Serialize, Deserialize, Clone, Debug)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct RpcFeeRateGovernor { pub struct RpcFeeRateGovernor {

View File

@@ -445,6 +445,16 @@ impl SyncClient for ThinClient {
} }
} }
fn get_fee_calculator_for_blockhash(
&self,
blockhash: &Hash,
) -> TransportResult<Option<FeeCalculator>> {
let fee_calculator = self
.rpc_client()
.get_fee_calculator_for_blockhash(blockhash)?;
Ok(fee_calculator)
}
fn get_fee_rate_governor(&self) -> TransportResult<FeeRateGovernor> { fn get_fee_rate_governor(&self) -> TransportResult<FeeRateGovernor> {
let fee_rate_governor = self.rpc_client().get_fee_rate_governor()?; let fee_rate_governor = self.rpc_client().get_fee_rate_governor()?;
Ok(fee_rate_governor.value) Ok(fee_rate_governor.value)

View File

@@ -1,7 +1,7 @@
[package] [package]
name = "solana-core" name = "solana-core"
description = "Blockchain, Rebuilt for Scale" description = "Blockchain, Rebuilt for Scale"
version = "1.0.3" version = "1.0.5"
documentation = "https://docs.rs/solana" documentation = "https://docs.rs/solana"
homepage = "https://solana.com/" homepage = "https://solana.com/"
readme = "../README.md" readme = "../README.md"
@@ -41,26 +41,26 @@ regex = "1.3.4"
serde = "1.0.104" serde = "1.0.104"
serde_derive = "1.0.103" serde_derive = "1.0.103"
serde_json = "1.0.46" serde_json = "1.0.46"
solana-budget-program = { path = "../programs/budget", version = "1.0.3" } solana-budget-program = { path = "../programs/budget", version = "1.0.5" }
solana-clap-utils = { path = "../clap-utils", version = "1.0.3" } solana-clap-utils = { path = "../clap-utils", version = "1.0.5" }
solana-client = { path = "../client", version = "1.0.3" } solana-client = { path = "../client", version = "1.0.5" }
solana-faucet = { path = "../faucet", version = "1.0.3" } solana-faucet = { path = "../faucet", version = "1.0.5" }
ed25519-dalek = "=1.0.0-pre.1" ed25519-dalek = "=1.0.0-pre.1"
solana-ledger = { path = "../ledger", version = "1.0.3" } solana-ledger = { path = "../ledger", version = "1.0.5" }
solana-logger = { path = "../logger", version = "1.0.3" } solana-logger = { path = "../logger", version = "1.0.5" }
solana-merkle-tree = { path = "../merkle-tree", version = "1.0.3" } solana-merkle-tree = { path = "../merkle-tree", version = "1.0.5" }
solana-metrics = { path = "../metrics", version = "1.0.3" } solana-metrics = { path = "../metrics", version = "1.0.5" }
solana-measure = { path = "../measure", version = "1.0.3" } solana-measure = { path = "../measure", version = "1.0.5" }
solana-net-utils = { path = "../net-utils", version = "1.0.3" } solana-net-utils = { path = "../net-utils", version = "1.0.5" }
solana-chacha-cuda = { path = "../chacha-cuda", version = "1.0.3" } solana-chacha-cuda = { path = "../chacha-cuda", version = "1.0.5" }
solana-perf = { path = "../perf", version = "1.0.3" } solana-perf = { path = "../perf", version = "1.0.5" }
solana-runtime = { path = "../runtime", version = "1.0.3" } solana-runtime = { path = "../runtime", version = "1.0.5" }
solana-sdk = { path = "../sdk", version = "1.0.3" } solana-sdk = { path = "../sdk", version = "1.0.5" }
solana-stake-program = { path = "../programs/stake", version = "1.0.3" } solana-stake-program = { path = "../programs/stake", version = "1.0.5" }
solana-storage-program = { path = "../programs/storage", version = "1.0.3" } solana-storage-program = { path = "../programs/storage", version = "1.0.5" }
solana-vote-program = { path = "../programs/vote", version = "1.0.3" } solana-vote-program = { path = "../programs/vote", version = "1.0.5" }
solana-vote-signer = { path = "../vote-signer", version = "1.0.3" } solana-vote-signer = { path = "../vote-signer", version = "1.0.5" }
solana-sys-tuner = { path = "../sys-tuner", version = "1.0.3" } solana-sys-tuner = { path = "../sys-tuner", version = "1.0.5" }
sys-info = "0.5.9" sys-info = "0.5.9"
tempfile = "3.1.0" tempfile = "3.1.0"
thiserror = "1.0" thiserror = "1.0"
@@ -68,7 +68,7 @@ tokio = "0.1"
tokio-codec = "0.1" tokio-codec = "0.1"
tokio-fs = "0.1" tokio-fs = "0.1"
tokio-io = "0.1" tokio-io = "0.1"
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.3" } solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.5" }
trees = "0.2.1" trees = "0.2.1"
[dev-dependencies] [dev-dependencies]

View File

@@ -9,9 +9,10 @@ use jsonrpc_core::{Error, Metadata, Result};
use jsonrpc_derive::rpc; use jsonrpc_derive::rpc;
use solana_client::rpc_response::{ use solana_client::rpc_response::{
Response, RpcAccount, RpcBlockCommitment, RpcBlockhashFeeCalculator, RpcConfirmedBlock, Response, RpcAccount, RpcBlockCommitment, RpcBlockhashFeeCalculator, RpcConfirmedBlock,
RpcContactInfo, RpcEpochInfo, RpcFeeRateGovernor, RpcIdentity, RpcKeyedAccount, RpcContactInfo, RpcEpochInfo, RpcFeeCalculator, RpcFeeRateGovernor, RpcIdentity,
RpcLeaderSchedule, RpcResponseContext, RpcSignatureConfirmation, RpcStorageTurn, RpcKeyedAccount, RpcLeaderSchedule, RpcResponseContext, RpcSignatureConfirmation,
RpcTransactionEncoding, RpcVersionInfo, RpcVoteAccountInfo, RpcVoteAccountStatus, RpcStorageTurn, RpcTransactionEncoding, RpcVersionInfo, RpcVoteAccountInfo,
RpcVoteAccountStatus,
}; };
use solana_faucet::faucet::request_airdrop_transaction; use solana_faucet::faucet::request_airdrop_transaction;
use solana_ledger::{ use solana_ledger::{
@@ -33,6 +34,7 @@ use solana_vote_program::vote_state::{VoteState, MAX_LOCKOUT_HISTORY};
use std::{ use std::{
collections::HashMap, collections::HashMap,
net::{SocketAddr, UdpSocket}, net::{SocketAddr, UdpSocket},
str::FromStr,
sync::{Arc, RwLock}, sync::{Arc, RwLock},
thread::sleep, thread::sleep,
time::{Duration, Instant}, time::{Duration, Instant},
@@ -48,6 +50,7 @@ fn new_response<T>(bank: &Bank, value: T) -> RpcResponse<T> {
#[derive(Debug, Default, Clone)] #[derive(Debug, Default, Clone)]
pub struct JsonRpcConfig { pub struct JsonRpcConfig {
pub enable_validator_exit: bool, pub enable_validator_exit: bool,
pub enable_set_log_filter: bool,
pub enable_get_confirmed_block: bool, pub enable_get_confirmed_block: bool,
pub identity_pubkey: Pubkey, pub identity_pubkey: Pubkey,
pub faucet_addr: Option<SocketAddr>, pub faucet_addr: Option<SocketAddr>,
@@ -165,6 +168,18 @@ impl JsonRpcRequestProcessor {
) )
} }
fn get_fee_calculator_for_blockhash(
&self,
blockhash: &Hash,
) -> RpcResponse<Option<RpcFeeCalculator>> {
let bank = &*self.bank(None);
let fee_calculator = bank.get_fee_calculator(blockhash);
new_response(
bank,
fee_calculator.map(|fee_calculator| RpcFeeCalculator { fee_calculator }),
)
}
fn get_fee_rate_governor(&self) -> RpcResponse<RpcFeeRateGovernor> { fn get_fee_rate_governor(&self) -> RpcResponse<RpcFeeRateGovernor> {
let bank = &*self.bank(None); let bank = &*self.bank(None);
let fee_rate_governor = bank.get_fee_rate_governor(); let fee_rate_governor = bank.get_fee_rate_governor();
@@ -325,6 +340,13 @@ impl JsonRpcRequestProcessor {
Ok(pubkeys) Ok(pubkeys)
} }
pub fn set_log_filter(&self, filter: String) -> Result<()> {
if self.config.enable_set_log_filter {
solana_logger::setup_with(&filter);
}
Ok(())
}
pub fn validator_exit(&self) -> Result<bool> { pub fn validator_exit(&self) -> Result<bool> {
if self.config.enable_validator_exit { if self.config.enable_validator_exit {
warn!("validator_exit request..."); warn!("validator_exit request...");
@@ -503,6 +525,13 @@ pub trait RpcSol {
commitment: Option<CommitmentConfig>, commitment: Option<CommitmentConfig>,
) -> RpcResponse<RpcBlockhashFeeCalculator>; ) -> RpcResponse<RpcBlockhashFeeCalculator>;
#[rpc(meta, name = "getFeeCalculatorForBlockhash")]
fn get_fee_calculator_for_blockhash(
&self,
meta: Self::Metadata,
blockhash: String,
) -> RpcResponse<Option<RpcFeeCalculator>>;
#[rpc(meta, name = "getFeeRateGovernor")] #[rpc(meta, name = "getFeeRateGovernor")]
fn get_fee_rate_governor(&self, meta: Self::Metadata) -> RpcResponse<RpcFeeRateGovernor>; fn get_fee_rate_governor(&self, meta: Self::Metadata) -> RpcResponse<RpcFeeRateGovernor>;
@@ -831,6 +860,20 @@ impl RpcSol for RpcSolImpl {
.get_recent_blockhash(commitment) .get_recent_blockhash(commitment)
} }
fn get_fee_calculator_for_blockhash(
&self,
meta: Self::Metadata,
blockhash: String,
) -> RpcResponse<Option<RpcFeeCalculator>> {
debug!("get_fee_calculator_for_blockhash rpc request received");
let blockhash =
Hash::from_str(&blockhash).map_err(|e| Error::invalid_params(format!("{:?}", e)))?;
meta.request_processor
.read()
.unwrap()
.get_fee_calculator_for_blockhash(&blockhash)
}
fn get_fee_rate_governor(&self, meta: Self::Metadata) -> RpcResponse<RpcFeeRateGovernor> { fn get_fee_rate_governor(&self, meta: Self::Metadata) -> RpcResponse<RpcFeeRateGovernor> {
debug!("get_fee_rate_governor rpc request received"); debug!("get_fee_rate_governor rpc request received");
meta.request_processor meta.request_processor
@@ -1098,9 +1141,11 @@ impl RpcSol for RpcSolImpl {
}) })
} }
fn set_log_filter(&self, _meta: Self::Metadata, filter: String) -> Result<()> { fn set_log_filter(&self, meta: Self::Metadata, filter: String) -> Result<()> {
solana_logger::setup_with(&filter); meta.request_processor
Ok(()) .read()
.unwrap()
.set_log_filter(filter)
} }
fn get_confirmed_block( fn get_confirmed_block(
@@ -1821,6 +1866,54 @@ pub mod tests {
assert_eq!(expected, result); assert_eq!(expected, result);
} }
#[test]
fn test_rpc_get_fee_calculator_for_blockhash() {
let bob_pubkey = Pubkey::new_rand();
let RpcHandler { io, meta, bank, .. } = start_rpc_handler_with_tx(&bob_pubkey);
let (blockhash, fee_calculator) = bank.last_blockhash_with_fee_calculator();
let fee_calculator = RpcFeeCalculator { fee_calculator };
let req = format!(
r#"{{"jsonrpc":"2.0","id":1,"method":"getFeeCalculatorForBlockhash","params":["{:?}"]}}"#,
blockhash
);
let res = io.handle_request_sync(&req, meta.clone());
let expected = json!({
"jsonrpc": "2.0",
"result": {
"context":{"slot":0},
"value":fee_calculator,
},
"id": 1
});
let expected: Response =
serde_json::from_value(expected).expect("expected response deserialization");
let result: Response = serde_json::from_str(&res.expect("actual response"))
.expect("actual response deserialization");
assert_eq!(expected, result);
// Expired (non-existent) blockhash
let req = format!(
r#"{{"jsonrpc":"2.0","id":1,"method":"getFeeCalculatorForBlockhash","params":["{:?}"]}}"#,
Hash::default()
);
let res = io.handle_request_sync(&req, meta.clone());
let expected = json!({
"jsonrpc": "2.0",
"result": {
"context":{"slot":0},
"value":Value::Null,
},
"id": 1
});
let expected: Response =
serde_json::from_value(expected).expect("expected response deserialization");
let result: Response = serde_json::from_str(&res.expect("actual response"))
.expect("actual response deserialization");
assert_eq!(expected, result);
}
#[test] #[test]
fn test_rpc_get_fee_rate_governor() { fn test_rpc_get_fee_rate_governor() {
let bob_pubkey = Pubkey::new_rand(); let bob_pubkey = Pubkey::new_rand();

View File

@@ -1,7 +1,6 @@
use crate::cluster_info::{ClusterInfo, MAX_SNAPSHOT_HASHES}; use crate::cluster_info::{ClusterInfo, MAX_SNAPSHOT_HASHES};
use solana_ledger::{ use solana_ledger::{snapshot_package::SnapshotPackageReceiver, snapshot_utils};
snapshot_package::SnapshotPackageReceiver, snapshot_utils::archive_snapshot_package, use solana_sdk::{clock::Slot, hash::Hash};
};
use std::{ use std::{
sync::{ sync::{
atomic::{AtomicBool, Ordering}, atomic::{AtomicBool, Ordering},
@@ -19,15 +18,24 @@ pub struct SnapshotPackagerService {
impl SnapshotPackagerService { impl SnapshotPackagerService {
pub fn new( pub fn new(
snapshot_package_receiver: SnapshotPackageReceiver, snapshot_package_receiver: SnapshotPackageReceiver,
starting_snapshot_hash: Option<(Slot, Hash)>,
exit: &Arc<AtomicBool>, exit: &Arc<AtomicBool>,
cluster_info: &Arc<RwLock<ClusterInfo>>, cluster_info: &Arc<RwLock<ClusterInfo>>,
) -> Self { ) -> Self {
let exit = exit.clone(); let exit = exit.clone();
let cluster_info = cluster_info.clone(); let cluster_info = cluster_info.clone();
let t_snapshot_packager = Builder::new() let t_snapshot_packager = Builder::new()
.name("solana-snapshot-packager".to_string()) .name("solana-snapshot-packager".to_string())
.spawn(move || { .spawn(move || {
let mut hashes = vec![]; let mut hashes = vec![];
if let Some(starting_snapshot_hash) = starting_snapshot_hash {
hashes.push(starting_snapshot_hash);
}
cluster_info
.write()
.unwrap()
.push_snapshot_hashes(hashes.clone());
loop { loop {
if exit.load(Ordering::Relaxed) { if exit.load(Ordering::Relaxed) {
break; break;
@@ -41,7 +49,9 @@ impl SnapshotPackagerService {
{ {
snapshot_package = new_snapshot_package; snapshot_package = new_snapshot_package;
} }
if let Err(err) = archive_snapshot_package(&snapshot_package) { if let Err(err) =
snapshot_utils::archive_snapshot_package(&snapshot_package)
{
warn!("Failed to create snapshot archive: {}", err); warn!("Failed to create snapshot archive: {}", err);
} else { } else {
hashes.push((snapshot_package.root, snapshot_package.hash)); hashes.push((snapshot_package.root, snapshot_package.hash));

View File

@@ -14,7 +14,6 @@ use crate::{
shred_fetch_stage::ShredFetchStage, shred_fetch_stage::ShredFetchStage,
sigverify_shreds::ShredSigVerifier, sigverify_shreds::ShredSigVerifier,
sigverify_stage::{DisabledSigVerifier, SigVerifyStage}, sigverify_stage::{DisabledSigVerifier, SigVerifyStage},
snapshot_packager_service::SnapshotPackagerService,
storage_stage::{StorageStage, StorageState}, storage_stage::{StorageStage, StorageState},
}; };
use crossbeam_channel::unbounded; use crossbeam_channel::unbounded;
@@ -23,6 +22,7 @@ use solana_ledger::{
bank_forks::BankForks, bank_forks::BankForks,
blockstore::{Blockstore, CompletedSlotsReceiver}, blockstore::{Blockstore, CompletedSlotsReceiver},
blockstore_processor::TransactionStatusSender, blockstore_processor::TransactionStatusSender,
snapshot_package::SnapshotPackageSender,
}; };
use solana_sdk::{ use solana_sdk::{
pubkey::Pubkey, pubkey::Pubkey,
@@ -47,7 +47,6 @@ pub struct Tvu {
blockstream_service: Option<BlockstreamService>, blockstream_service: Option<BlockstreamService>,
ledger_cleanup_service: Option<LedgerCleanupService>, ledger_cleanup_service: Option<LedgerCleanupService>,
storage_stage: StorageStage, storage_stage: StorageStage,
snapshot_packager_service: Option<SnapshotPackagerService>,
} }
pub struct Sockets { pub struct Sockets {
@@ -88,6 +87,7 @@ impl Tvu {
shred_version: u16, shred_version: u16,
transaction_status_sender: Option<TransactionStatusSender>, transaction_status_sender: Option<TransactionStatusSender>,
rewards_recorder_sender: Option<RewardsRecorderSender>, rewards_recorder_sender: Option<RewardsRecorderSender>,
snapshot_package_sender: Option<SnapshotPackageSender>,
) -> Self { ) -> Self {
let keypair: Arc<Keypair> = cluster_info let keypair: Arc<Keypair> = cluster_info
.read() .read()
@@ -148,18 +148,6 @@ impl Tvu {
let (blockstream_slot_sender, blockstream_slot_receiver) = channel(); let (blockstream_slot_sender, blockstream_slot_receiver) = channel();
let (ledger_cleanup_slot_sender, ledger_cleanup_slot_receiver) = channel(); let (ledger_cleanup_slot_sender, ledger_cleanup_slot_receiver) = channel();
let (snapshot_packager_service, snapshot_package_sender) = {
let snapshot_config = { bank_forks.read().unwrap().snapshot_config().clone() };
if snapshot_config.is_some() {
// Start a snapshot packaging service
let (sender, receiver) = channel();
let snapshot_packager_service =
SnapshotPackagerService::new(receiver, exit, &cluster_info.clone());
(Some(snapshot_packager_service), Some(sender))
} else {
(None, None)
}
};
let replay_stage_config = ReplayStageConfig { let replay_stage_config = ReplayStageConfig {
my_pubkey: keypair.pubkey(), my_pubkey: keypair.pubkey(),
@@ -225,7 +213,6 @@ impl Tvu {
blockstream_service, blockstream_service,
ledger_cleanup_service, ledger_cleanup_service,
storage_stage, storage_stage,
snapshot_packager_service,
} }
} }
@@ -241,9 +228,6 @@ impl Tvu {
self.ledger_cleanup_service.unwrap().join()?; self.ledger_cleanup_service.unwrap().join()?;
} }
self.replay_stage.join()?; self.replay_stage.join()?;
if let Some(s) = self.snapshot_packager_service {
s.join()?;
}
Ok(()) Ok(())
} }
} }
@@ -317,6 +301,7 @@ pub mod tests {
0, 0,
None, None,
None, None,
None,
); );
exit.store(true, Ordering::Relaxed); exit.store(true, Ordering::Relaxed);
tvu.join().unwrap(); tvu.join().unwrap();

View File

@@ -16,6 +16,7 @@ use crate::{
serve_repair::ServeRepair, serve_repair::ServeRepair,
serve_repair_service::ServeRepairService, serve_repair_service::ServeRepairService,
sigverify, sigverify,
snapshot_packager_service::SnapshotPackagerService,
storage_stage::StorageState, storage_stage::StorageState,
tpu::Tpu, tpu::Tpu,
transaction_status_service::TransactionStatusService, transaction_status_service::TransactionStatusService,
@@ -50,7 +51,7 @@ use std::{
process, process,
sync::atomic::{AtomicBool, Ordering}, sync::atomic::{AtomicBool, Ordering},
sync::mpsc::Receiver, sync::mpsc::Receiver,
sync::{Arc, Mutex, RwLock}, sync::{mpsc::channel, Arc, Mutex, RwLock},
thread::{sleep, Result}, thread::{sleep, Result},
time::Duration, time::Duration,
}; };
@@ -127,6 +128,7 @@ pub struct Validator {
rewards_recorder_service: Option<RewardsRecorderService>, rewards_recorder_service: Option<RewardsRecorderService>,
gossip_service: GossipService, gossip_service: GossipService,
serve_repair_service: ServeRepairService, serve_repair_service: ServeRepairService,
snapshot_packager_service: Option<SnapshotPackagerService>,
poh_recorder: Arc<Mutex<PohRecorder>>, poh_recorder: Arc<Mutex<PohRecorder>>,
poh_service: PohService, poh_service: PohService,
tpu: Tpu, tpu: Tpu,
@@ -355,33 +357,16 @@ impl Validator {
.set_entrypoint(entrypoint_info.clone()); .set_entrypoint(entrypoint_info.clone());
} }
if let Some(snapshot_hash) = snapshot_hash { let (snapshot_packager_service, snapshot_package_sender) =
if let Some(ref trusted_validators) = config.trusted_validators { if config.snapshot_config.is_some() {
let mut trusted = false; // Start a snapshot packaging service
for _ in 0..10 { let (sender, receiver) = channel();
trusted = cluster_info let snapshot_packager_service =
.read() SnapshotPackagerService::new(receiver, snapshot_hash, &exit, &cluster_info);
.unwrap() (Some(snapshot_packager_service), Some(sender))
.get_snapshot_hash(snapshot_hash.0) } else {
.iter() (None, None)
.any(|(pubkey, hash)| { };
trusted_validators.contains(pubkey) && snapshot_hash.1 == *hash
});
if trusted {
break;
}
sleep(Duration::from_secs(1));
}
if !trusted {
error!(
"The snapshot hash for slot {} is not published by your trusted validators: {:?}",
snapshot_hash.0, trusted_validators
);
process::exit(1);
}
}
}
wait_for_supermajority(config, &bank, &cluster_info); wait_for_supermajority(config, &bank, &cluster_info);
@@ -445,6 +430,7 @@ impl Validator {
node.info.shred_version, node.info.shred_version,
transaction_status_sender.clone(), transaction_status_sender.clone(),
rewards_recorder_sender, rewards_recorder_sender,
snapshot_package_sender,
); );
if config.dev_sigverify_disabled { if config.dev_sigverify_disabled {
@@ -474,6 +460,7 @@ impl Validator {
rpc_service, rpc_service,
transaction_status_service, transaction_status_service,
rewards_recorder_service, rewards_recorder_service,
snapshot_packager_service,
tpu, tpu,
tvu, tvu,
poh_service, poh_service,
@@ -535,6 +522,10 @@ impl Validator {
rewards_recorder_service.join()?; rewards_recorder_service.join()?;
} }
if let Some(s) = self.snapshot_packager_service {
s.join()?;
}
self.gossip_service.join()?; self.gossip_service.join()?;
self.serve_repair_service.join()?; self.serve_repair_service.join()?;
self.tpu.join()?; self.tpu.join()?;
@@ -636,14 +627,14 @@ fn wait_for_supermajority(
} }
info!( info!(
"Waiting for more than 75% of activated stake at slot {} to be in gossip...", "Waiting for 80% of activated stake at slot {} to be in gossip...",
bank.slot() bank.slot()
); );
loop { loop {
let gossip_stake_percent = get_stake_percent_in_gossip(&bank, &cluster_info); let gossip_stake_percent = get_stake_percent_in_gossip(&bank, &cluster_info);
info!("{}% of activated stake in gossip", gossip_stake_percent,); info!("{}% of activated stake in gossip", gossip_stake_percent,);
if gossip_stake_percent > 75 { if gossip_stake_percent >= 80 {
break; break;
} }
sleep(Duration::new(1, 0)); sleep(Duration::new(1, 0));

View File

@@ -317,7 +317,7 @@ mod tests {
))); )));
let snapshot_packager_service = let snapshot_packager_service =
SnapshotPackagerService::new(receiver, &exit, &cluster_info); SnapshotPackagerService::new(receiver, None, &exit, &cluster_info);
// Close the channel so that the package service will exit after reading all the // Close the channel so that the package service will exit after reading all the
// packages off the channel // packages off the channel

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-crate-features" name = "solana-crate-features"
version = "1.0.3" version = "1.0.5"
description = "Solana Crate Features" description = "Solana Crate Features"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"

View File

@@ -46,7 +46,6 @@
* [Monitoring a Validator](running-validator/validator-monitor.md) * [Monitoring a Validator](running-validator/validator-monitor.md)
* [Publishing Validator Info](running-validator/validator-info.md) * [Publishing Validator Info](running-validator/validator-info.md)
* [Troubleshooting](running-validator/validator-troubleshoot.md) * [Troubleshooting](running-validator/validator-troubleshoot.md)
* [Running an Archiver](running-archiver.md)
* [Understanding Solana's Architecture](cluster/README.md) * [Understanding Solana's Architecture](cluster/README.md)
* [Synchronization](cluster/synchronization.md) * [Synchronization](cluster/synchronization.md)
* [Leader Rotation](cluster/leader-rotation.md) * [Leader Rotation](cluster/leader-rotation.md)

View File

@@ -24,6 +24,7 @@ To interact with a Solana node inside a JavaScript application, use the [solana-
* [getConfirmedBlocks](jsonrpc-api.md#getconfirmedblocks) * [getConfirmedBlocks](jsonrpc-api.md#getconfirmedblocks)
* [getEpochInfo](jsonrpc-api.md#getepochinfo) * [getEpochInfo](jsonrpc-api.md#getepochinfo)
* [getEpochSchedule](jsonrpc-api.md#getepochschedule) * [getEpochSchedule](jsonrpc-api.md#getepochschedule)
* [getFeeCalculatorForBlockhash](jsonrpc-api.md#getfeecalculatorforblockhash)
* [getFeeRateGovernor](jsonrpc-api.md#getfeerategovernor) * [getFeeRateGovernor](jsonrpc-api.md#getfeerategovernor)
* [getGenesisHash](jsonrpc-api.md#getgenesishash) * [getGenesisHash](jsonrpc-api.md#getgenesishash)
* [getIdentity](jsonrpc-api.md#getidentity) * [getIdentity](jsonrpc-api.md#getidentity)
@@ -316,13 +317,13 @@ The result field will be an object with the following fields:
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc": "2.0","id":1,"method":"getConfirmedBlock","params":[430, "json"]}' localhost:8899 curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc": "2.0","id":1,"method":"getConfirmedBlock","params":[430, "json"]}' localhost:8899
// Result // Result
{"jsonrpc":"2.0","result":{"blockhash":"Gp3t5bfDsJv1ovP8cB1SuRhXVuoTqDv7p3tymyubYg5","parentSlot":429,"previousBlockhash":"EFejToxii1L5aUF2NrK9dsbAEmZSNyN5nsipmZHQR1eA","transactions":[{"transaction":{"message":{"accountKeys":["6H94zdiaYfRfPfKjYLjyr2VFBg6JHXygy84r3qhc3NsC","39UAy8hsoYPywGPGdmun747omSr79zLSjqvPJN3zetoH","SysvarS1otHashes111111111111111111111111111","SysvarC1ock11111111111111111111111111111111","Vote111111111111111111111111111111111111111"],"header":{"numReadonlySignedAccounts":0,"numReadonlyUnsignedAccounts":3,"numRequiredSignatures":2},"instructions":[{"accounts":[1,2,3],"data":"29z5mr1JoRmJYQ6ynmk3pf31cGFRziAF1M3mT3L6sFXf5cKLdkEaMXMT8AqLpD4CpcupHmuMEmtZHpomrwfdZetSomNy3d","programIdIndex":4}],"recentBlockhash":"EFejToxii1L5aUF2NrK9dsbAEmZSNyN5nsipmZHQR1eA"},"signatures":["35YGay1Lwjwgxe9zaH6APSHbt9gYQUCtBWTNL3aVwVGn9xTFw2fgds7qK5AL29mP63A9j3rh8KpN1TgSR62XCaby","4vANMjSKiwEchGSXwVrQkwHnmsbKQmy9vdrsYxWdCup1bLsFzX8gKrFTSVDCZCae2dbxJB9mPNhqB2sD1vvr4sAD"]},"meta":{"fee":1.0.3,"postBalances":[499999972500,15298080,1,1,1],"preBalances":[499999990500,15298080,1,1,1],"status":{"Ok":null}}}]},"id":1} {"jsonrpc":"2.0","result":{"blockhash":"Gp3t5bfDsJv1ovP8cB1SuRhXVuoTqDv7p3tymyubYg5","parentSlot":429,"previousBlockhash":"EFejToxii1L5aUF2NrK9dsbAEmZSNyN5nsipmZHQR1eA","transactions":[{"transaction":{"message":{"accountKeys":["6H94zdiaYfRfPfKjYLjyr2VFBg6JHXygy84r3qhc3NsC","39UAy8hsoYPywGPGdmun747omSr79zLSjqvPJN3zetoH","SysvarS1otHashes111111111111111111111111111","SysvarC1ock11111111111111111111111111111111","Vote111111111111111111111111111111111111111"],"header":{"numReadonlySignedAccounts":0,"numReadonlyUnsignedAccounts":3,"numRequiredSignatures":2},"instructions":[{"accounts":[1,2,3],"data":"29z5mr1JoRmJYQ6ynmk3pf31cGFRziAF1M3mT3L6sFXf5cKLdkEaMXMT8AqLpD4CpcupHmuMEmtZHpomrwfdZetSomNy3d","programIdIndex":4}],"recentBlockhash":"EFejToxii1L5aUF2NrK9dsbAEmZSNyN5nsipmZHQR1eA"},"signatures":["35YGay1Lwjwgxe9zaH6APSHbt9gYQUCtBWTNL3aVwVGn9xTFw2fgds7qK5AL29mP63A9j3rh8KpN1TgSR62XCaby","4vANMjSKiwEchGSXwVrQkwHnmsbKQmy9vdrsYxWdCup1bLsFzX8gKrFTSVDCZCae2dbxJB9mPNhqB2sD1vvr4sAD"]},"meta":{"fee":1.0.5,"postBalances":[499999972500,15298080,1,1,1],"preBalances":[499999990500,15298080,1,1,1],"status":{"Ok":null}}}]},"id":1}
// Request // Request
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc": "2.0","id":1,"method":"getConfirmedBlock","params":[430, "binary"]}' localhost:8899 curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc": "2.0","id":1,"method":"getConfirmedBlock","params":[430, "binary"]}' localhost:8899
// Result // Result
{"jsonrpc":"2.0","result":{"blockhash":"Gp3t5bfDsJv1ovP8cB1SuRhXVuoTqDv7p3tymyubYg5","parentSlot":429,"previousBlockhash":"EFejToxii1L5aUF2NrK9dsbAEmZSNyN5nsipmZHQR1eA","transactions":[{"transaction":"81UZJt4dh4Do66jDhrgkQudS8J2N6iG3jaVav7gJrqJSFY4Ug53iA9JFJZh2gxKWcaFdLJwhHx9mRdg9JwDAWB4ywiu5154CRwXV4FMdnPLg7bhxRLwhhYaLsVgMF5AyNRcTzjCVoBvqFgDU7P8VEKDEiMvD3qxzm1pLZVxDG1LTQpT3Dz4Uviv4KQbFQNuC22KupBoyHFB7Zh6KFdMqux4M9PvhoqcoJsJKwXjWpKu7xmEKnnrSbfLadkgjBmmjhW3fdTrFvnhQdTkhtdJxUL1xS9GMuJQer8YgSKNtUXB1eXZQwXU8bU2BjYkZE6Q5Xww8hu9Z4E4Mo4QsooVtHoP6BM3NKw8zjVbWfoCQqxTrwuSzrNCWCWt58C24LHecH67CTt2uXbYSviixvrYkK7A3t68BxTJcF1dXJitEPTFe2ceTkauLJqrJgnER4iUrsjr26T8YgWvpY9wkkWFSviQW6wV5RASTCUasVEcrDiaKj8EQMkgyDoe9HyKitSVg67vMWJFpUXpQobseWJUs5FTWWzmfHmFp8FZ","meta":{"fee":1.0.3,"postBalances":[499999972500,15298080,1,1,1],"preBalances":[499999990500,15298080,1,1,1],"status":{"Ok":null}}}]},"id":1} {"jsonrpc":"2.0","result":{"blockhash":"Gp3t5bfDsJv1ovP8cB1SuRhXVuoTqDv7p3tymyubYg5","parentSlot":429,"previousBlockhash":"EFejToxii1L5aUF2NrK9dsbAEmZSNyN5nsipmZHQR1eA","transactions":[{"transaction":"81UZJt4dh4Do66jDhrgkQudS8J2N6iG3jaVav7gJrqJSFY4Ug53iA9JFJZh2gxKWcaFdLJwhHx9mRdg9JwDAWB4ywiu5154CRwXV4FMdnPLg7bhxRLwhhYaLsVgMF5AyNRcTzjCVoBvqFgDU7P8VEKDEiMvD3qxzm1pLZVxDG1LTQpT3Dz4Uviv4KQbFQNuC22KupBoyHFB7Zh6KFdMqux4M9PvhoqcoJsJKwXjWpKu7xmEKnnrSbfLadkgjBmmjhW3fdTrFvnhQdTkhtdJxUL1xS9GMuJQer8YgSKNtUXB1eXZQwXU8bU2BjYkZE6Q5Xww8hu9Z4E4Mo4QsooVtHoP6BM3NKw8zjVbWfoCQqxTrwuSzrNCWCWt58C24LHecH67CTt2uXbYSviixvrYkK7A3t68BxTJcF1dXJitEPTFe2ceTkauLJqrJgnER4iUrsjr26T8YgWvpY9wkkWFSviQW6wV5RASTCUasVEcrDiaKj8EQMkgyDoe9HyKitSVg67vMWJFpUXpQobseWJUs5FTWWzmfHmFp8FZ","meta":{"fee":1.0.5,"postBalances":[499999972500,15298080,1,1,1],"preBalances":[499999990500,15298080,1,1,1],"status":{"Ok":null}}}]},"id":1}
``` ```
### getConfirmedBlocks ### getConfirmedBlocks
@@ -405,6 +406,30 @@ curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":1, "m
{"jsonrpc":"2.0","result":{"firstNormalEpoch":8,"firstNormalSlot":8160,"leaderScheduleSlotOffset":8192,"slotsPerEpoch":8192,"warmup":true},"id":1} {"jsonrpc":"2.0","result":{"firstNormalEpoch":8,"firstNormalSlot":8160,"leaderScheduleSlotOffset":8192,"slotsPerEpoch":8192,"warmup":true},"id":1}
``` ```
### getFeeCalculatorForBlockhash
Returns the fee calculator associated with the query blockhash, or `null` if the blockhash has expired
#### Parameters:
* `blockhash: <string>`, query blockhash as a Base58 encoded string
#### Results:
The `result` field will be `null` if the query blockhash has expired, otherwise an `object` with the following fields:
* `feeCalculator: <object>`, `FeeCalculator` object describing the cluster fee rate at the queried blockhash
#### Example:
```bash
// Request
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":1, "method":"getFeeCalculatorForBlockhash", "params":["GJxqhuxcgfn5Tcj6y3f8X4FeCDd2RQ6SnEMo1AAxrPRZ"]}' http://localhost:8899
// Result
{"jsonrpc":"2.0","result":{"context":{"slot":221},"value":{"feeCalculator":{"lamportsPerSignature":5000}}},"id":1}
```
### getFeeRateGovernor ### getFeeRateGovernor
Returns the fee rate governor information from the root bank Returns the fee rate governor information from the root bank
@@ -632,7 +657,7 @@ An RpcResponse containing a JSON object consisting of a string blockhash and Fee
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":1, "method":"getRecentBlockhash"}' http://localhost:8899 curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":1, "method":"getRecentBlockhash"}' http://localhost:8899
// Result // Result
{"jsonrpc":"2.0","result":{"context":{"slot":1},"value":{"blockhash":"CSymwgTNX1j3E4qhKfJAUE41nBWEwXufoYryPbkde5RR","feeCalculator":{"burnPercent":50,"lamportsPerSignature":5000,"maxLamportsPerSignature":1.0.30,"minLamportsPerSignature":5000,"targetLamportsPerSignature":1.0.3,"targetSignaturesPerSlot":20000}}},"id":1} {"jsonrpc":"2.0","result":{"context":{"slot":1},"value":{"blockhash":"CSymwgTNX1j3E4qhKfJAUE41nBWEwXufoYryPbkde5RR","feeCalculator":{"burnPercent":50,"lamportsPerSignature":5000,"maxLamportsPerSignature":1.0.50,"minLamportsPerSignature":5000,"targetLamportsPerSignature":1.0.5,"targetSignaturesPerSlot":20000}}},"id":1}
``` ```
### getSignatureConfirmation ### getSignatureConfirmation
@@ -883,7 +908,7 @@ The result field will be a JSON object with the following fields:
// Request // Request
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":1, "method":"getVersion"}' http://localhost:8899 curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":1, "method":"getVersion"}' http://localhost:8899
// Result // Result
{"jsonrpc":"2.0","result":{"solana-core": "1.0.3"},"id":1} {"jsonrpc":"2.0","result":{"solana-core": "1.0.5"},"id":1}
``` ```
### getVoteAccounts ### getVoteAccounts

View File

@@ -52,7 +52,7 @@ $ NDEBUG=1 ./multinode-demo/faucet.sh
### Singlenode Testnet ### Singlenode Testnet
Before you start a validator, make sure you know the IP address of the machine you want to be the bootstrap validator for the demo, and make sure that udp ports 8000-1.0.3 are open on all the machines you want to test with. Before you start a validator, make sure you know the IP address of the machine you want to be the bootstrap validator for the demo, and make sure that udp ports 8000-1.0.5 are open on all the machines you want to test with.
Now start the bootstrap validator in a separate shell: Now start the bootstrap validator in a separate shell:
@@ -151,7 +151,7 @@ The stream will output a series of JSON objects:
## Public Testnet ## Public Testnet
In this example the client connects to our public testnet. To run validators on the testnet you would need to open udp ports `8000-1.0.3`. In this example the client connects to our public testnet. To run validators on the testnet you would need to open udp ports `8000-1.0.5`.
```bash ```bash
$ NDEBUG=1 ./multinode-demo/bench-tps.sh --entrypoint devnet.solana.com:8001 --faucet devnet.solana.com:9900 --duration 60 --tx_count 50 $ NDEBUG=1 ./multinode-demo/bench-tps.sh --entrypoint devnet.solana.com:8001 --faucet devnet.solana.com:9900 --duration 60 --tx_count 50

View File

@@ -171,7 +171,7 @@ $ solana send-timestamp <PUBKEY> <PROCESS_ID> --date 2018-12-24T23:59:00
## Usage ## Usage
### solana-cli ### solana-cli
```text ```text
solana-cli 1.0.3 [channel=unknown commit=unknown] solana-cli 1.0.5 [channel=unknown commit=unknown]
Blockchain, Rebuilt for Scale Blockchain, Rebuilt for Scale
USAGE: USAGE:

View File

@@ -17,7 +17,7 @@ Without a partition lasting longer than an epoch, the cluster will work as follo
For example: For example:
The epoch duration is 100 slots. The root fork is updated from fork computed at slot height 99 to a fork computed at slot height 102. Forks with slots at height 1.0.301 were skipped because of failures. The new leader schedule is computed using fork at slot height 102. It is active from slot 200 until it is updated again. The epoch duration is 100 slots. The root fork is updated from fork computed at slot height 99 to a fork computed at slot height 102. Forks with slots at height 1.0.501 were skipped because of failures. The new leader schedule is computed using fork at slot height 102. It is active from slot 200 until it is updated again.
No inconsistency can exist because every validator that is voting with the cluster has skipped 100 and 101 when its root passes 102. All validators, regardless of voting pattern, would be committing to a root that is either 102, or a descendant of 102. No inconsistency can exist because every validator that is voting with the cluster has skipped 100 and 101 when its root passes 102. All validators, regardless of voting pattern, would be committing to a root that is either 102, or a descendant of 102.

View File

@@ -166,14 +166,14 @@ Rewards are paid against the "effective" portion of the stake for that epoch.
#### Warmup example #### Warmup example
Consider the situation of a single stake of 1.0.3 activated at epoch N, with network warmup rate of 20%, and a quiescent total network stake at epoch N of 2,000. Consider the situation of a single stake of 1.0.5 activated at epoch N, with network warmup rate of 20%, and a quiescent total network stake at epoch N of 2,000.
At epoch N+1, the amount available to be activated for the network is 400 \(20% of 200\), and at epoch N, this example stake is the only stake activating, and so is entitled to all of the warmup room available. At epoch N+1, the amount available to be activated for the network is 400 \(20% of 200\), and at epoch N, this example stake is the only stake activating, and so is entitled to all of the warmup room available.
| epoch | effective | activating | total effective | total activating | | epoch | effective | activating | total effective | total activating |
| :--- | ---: | ---: | ---: | ---: | | :--- | ---: | ---: | ---: | ---: |
| N-1 | | | 2,000 | 0 | | N-1 | | | 2,000 | 0 |
| N | 0 | 1.0.3 | 2,000 | 1.0.3 | | N | 0 | 1.0.5 | 2,000 | 1.0.5 |
| N+1 | 400 | 600 | 2,400 | 600 | | N+1 | 400 | 600 | 2,400 | 600 |
| N+2 | 880 | 120 | 2,880 | 120 | | N+2 | 880 | 120 | 2,880 | 120 |
| N+3 | 1000 | 0 | 3,000 | 0 | | N+3 | 1000 | 0 | 3,000 | 0 |
@@ -183,7 +183,7 @@ Were 2 stakes \(X and Y\) to activate at epoch N, they would be awarded a portio
| epoch | X eff | X act | Y eff | Y act | total effective | total activating | | epoch | X eff | X act | Y eff | Y act | total effective | total activating |
| :--- | ---: | ---: | ---: | ---: | ---: | ---: | | :--- | ---: | ---: | ---: | ---: | ---: | ---: |
| N-1 | | | | | 2,000 | 0 | | N-1 | | | | | 2,000 | 0 |
| N | 0 | 1.0.3 | 0 | 200 | 2,000 | 1,200 | | N | 0 | 1.0.5 | 0 | 200 | 2,000 | 1,200 |
| N+1 | 333 | 667 | 67 | 133 | 2,400 | 800 | | N+1 | 333 | 667 | 67 | 133 | 2,400 | 800 |
| N+2 | 733 | 267 | 146 | 54 | 2,880 | 321 | | N+2 | 733 | 267 | 146 | 54 | 2,880 | 321 |
| N+3 | 1000 | 0 | 200 | 0 | 3,200 | 0 | | N+3 | 1000 | 0 | 200 | 0 | 3,200 | 0 |

View File

@@ -1,14 +1,14 @@
# Installing Solana # Installing Solana
Install the Solana release Install the Solana release
[v1.0.0](https://github.com/solana-labs/solana/releases/tag/v1.0.0) on your [v1.0.5](https://github.com/solana-labs/solana/releases/tag/v1.0.5) on your
machine by running: machine by running:
```bash ```bash
curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v1.0.0/install/solana-install-init.sh | sh -s - 1.0.0 curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v1.0.5/install/solana-install-init.sh | sh -s - 1.0.5
``` ```
If you are connecting to a different testnet, you can replace `1.0.0` with the If you are connecting to a different testnet, you can replace `1.0.5` with the
release tag matching the software version of your desired testnet, or replace it release tag matching the software version of your desired testnet, or replace it
with the named channel `stable`, `beta`, or `edge`. with the named channel `stable`, `beta`, or `edge`.
@@ -16,11 +16,11 @@ The following output indicates a successful update:
```text ```text
looking for latest release looking for latest release
downloading v1.0.0 installer downloading v1.0.5 installer
Configuration: /home/solana/.config/solana/install/config.yml Configuration: /home/solana/.config/solana/install/config.yml
Active release directory: /home/solana/.local/share/solana/install/active_release Active release directory: /home/solana/.local/share/solana/install/active_release
* Release version: 1.0.0 * Release version: 1.0.5
* Release URL: https://github.com/solana-labs/solana/releases/download/v1.0.0/solana-release-x86_64-unknown-linux-gnu.tar.bz2 * Release URL: https://github.com/solana-labs/solana/releases/download/v1.0.5/solana-release-x86_64-unknown-linux-gnu.tar.bz2
Update successful Update successful
``` ```

View File

@@ -18,7 +18,7 @@ All claims, content, designs, algorithms, estimates, roadmaps, specifications, a
In November of 2017, Anatoly Yakovenko published a whitepaper describing Proof of History, a technique for keeping time between computers that do not trust one another. From Anatoly's previous experience designing distributed systems at Qualcomm, Mesosphere and Dropbox, he knew that a reliable clock makes network synchronization very simple. When synchronization is simple the resulting network can be blazing fast, bound only by network bandwidth. In November of 2017, Anatoly Yakovenko published a whitepaper describing Proof of History, a technique for keeping time between computers that do not trust one another. From Anatoly's previous experience designing distributed systems at Qualcomm, Mesosphere and Dropbox, he knew that a reliable clock makes network synchronization very simple. When synchronization is simple the resulting network can be blazing fast, bound only by network bandwidth.
Anatoly watched as blockchain systems without clocks, such as Bitcoin and Ethereum, struggled to scale beyond 15 transactions per second worldwide when centralized payment systems such as Visa required peaks of 65,000 tps. Without a clock, it was clear they'd never graduate to being the global payment system or global supercomputer most had dreamed them to be. When Anatoly solved the problem of getting computers that dont trust each other to agree on time, he knew he had the key to bring 40 years of distributed systems research to the world of blockchain. The resulting cluster wouldn't be just 10 times faster, or a 100 times, or a 1.0.3 times, but 10,000 times faster, right out of the gate! Anatoly watched as blockchain systems without clocks, such as Bitcoin and Ethereum, struggled to scale beyond 15 transactions per second worldwide when centralized payment systems such as Visa required peaks of 65,000 tps. Without a clock, it was clear they'd never graduate to being the global payment system or global supercomputer most had dreamed them to be. When Anatoly solved the problem of getting computers that dont trust each other to agree on time, he knew he had the key to bring 40 years of distributed systems research to the world of blockchain. The resulting cluster wouldn't be just 10 times faster, or a 100 times, or a 1.0.5 times, but 10,000 times faster, right out of the gate!
Anatoly's implementation began in a private codebase and was implemented in the C programming language. Greg Fitzgerald, who had previously worked with Anatoly at semiconductor giant Qualcomm Incorporated, encouraged him to reimplement the project in the Rust programming language. Greg had worked on the LLVM compiler infrastructure, which underlies both the Clang C/C++ compiler as well as the Rust compiler. Greg claimed that the language's safety guarantees would improve software productivity and that its lack of a garbage collector would allow programs to perform as well as those written in C. Anatoly gave it a shot and just two weeks later, had migrated his entire codebase to Rust. Sold. With plans to weave all the world's transactions together on a single, scalable blockchain, Anatoly called the project Loom. Anatoly's implementation began in a private codebase and was implemented in the C programming language. Greg Fitzgerald, who had previously worked with Anatoly at semiconductor giant Qualcomm Incorporated, encouraged him to reimplement the project in the Rust programming language. Greg had worked on the LLVM compiler infrastructure, which underlies both the Clang C/C++ compiler as well as the Rust compiler. Greg claimed that the language's safety guarantees would improve software productivity and that its lack of a garbage collector would allow programs to perform as well as those written in C. Anatoly gave it a shot and just two weeks later, had migrated his entire codebase to Rust. Sold. With plans to weave all the world's transactions together on a single, scalable blockchain, Anatoly called the project Loom.

View File

@@ -222,7 +222,7 @@ expires and the transaction fails
```bash ```bash
$ solana pay -k alice.json --blockhash expiredDTaxfagttWjQweib42b6ZHADSx94Tw8gHx3W7 bob.json 1 $ solana pay -k alice.json --blockhash expiredDTaxfagttWjQweib42b6ZHADSx94Tw8gHx3W7 bob.json 1
[2020-01-02T18:48:28.46291.0.3Z ERROR solana_cli::cli] Io(Custom { kind: Other, error: "Transaction \"33gQQaoPc9jWePMvDAeyJpcnSPiGUAdtVg8zREWv4GiKjkcGNufgpcbFyRKRrA25NkgjZySEeKue5rawyeH5TzsV\" failed: None" }) [2020-01-02T18:48:28.46291.0.5Z ERROR solana_cli::cli] Io(Custom { kind: Other, error: "Transaction \"33gQQaoPc9jWePMvDAeyJpcnSPiGUAdtVg8zREWv4GiKjkcGNufgpcbFyRKRrA25NkgjZySEeKue5rawyeH5TzsV\" failed: None" })
Error: Io(Custom { kind: Other, error: "Transaction \"33gQQaoPc9jWePMvDAeyJpcnSPiGUAdtVg8zREWv4GiKjkcGNufgpcbFyRKRrA25NkgjZySEeKue5rawyeH5TzsV\" failed: None" }) Error: Io(Custom { kind: Other, error: "Transaction \"33gQQaoPc9jWePMvDAeyJpcnSPiGUAdtVg8zREWv4GiKjkcGNufgpcbFyRKRrA25NkgjZySEeKue5rawyeH5TzsV\" failed: None" })
``` ```

View File

@@ -233,21 +233,20 @@ done < public_keys.txt
In order to run a validator, you will need to specify an "identity keypair" In order to run a validator, you will need to specify an "identity keypair"
which will be used to fund all of the vote transactions signed by your validator. which will be used to fund all of the vote transactions signed by your validator.
Rather than specifying a path with `--identity-keypair <PATH>` you can use the Rather than specifying a path with `--identity-keypair <PATH>` you can pass
`--ask-seed-phrase` option. `ASK` to securely input the funding keypair.
```bash ```bash
solana-validator --ask-seed-phrase identity-keypair --ledger ... solana-validator --identity-keypair ASK --ledger ...
[identity-keypair] seed phrase: 🔒 [identity-keypair] seed phrase: 🔒
[identity-keypair] If this seed phrase has an associated passphrase, enter it now. Otherwise, press ENTER to continue: [identity-keypair] If this seed phrase has an associated passphrase, enter it now. Otherwise, press ENTER to continue:
``` ```
The `--ask-seed-phrase` option accepts multiple keypairs. If you wish to use this You can use this input method for your voting keypair as well:
input method for your voting keypair as well you can do the following:
```bash ```bash
solana-validator --ask-seed-phrase identity-keypair voting-keypair --ledger ... solana-validator --identity-keypair ASK --voting-keypair ASK --ledger ...
[identity-keypair] seed phrase: 🔒 [identity-keypair] seed phrase: 🔒
[identity-keypair] If this seed phrase has an associated passphrase, enter it now. Otherwise, press ENTER to continue: [identity-keypair] If this seed phrase has an associated passphrase, enter it now. Otherwise, press ENTER to continue:

View File

@@ -9,7 +9,6 @@ secure transaction signing.
- [Install the Solana command-line tools](../install-solana.md) - [Install the Solana command-line tools](../install-solana.md)
- [Initialize your Ledger Nano S](https://support.ledger.com/hc/en-us/articles/360000613793) - [Initialize your Ledger Nano S](https://support.ledger.com/hc/en-us/articles/360000613793)
- [Install the latest device firmware](https://support.ledgerwallet.com/hc/en-us/articles/360002731113-Update-Ledger-Nano-S-firmware) - [Install the latest device firmware](https://support.ledgerwallet.com/hc/en-us/articles/360002731113-Update-Ledger-Nano-S-firmware)
- [Install Ledger Live](https://support.ledger.com/hc/en-us/articles/360006395553/) software on your computer
## Install the Solana App on Ledger Nano S ## Install the Solana App on Ledger Nano S
@@ -31,10 +30,35 @@ longer be displayed.
5. An installation window appears and your device will display Processing… 5. An installation window appears and your device will display Processing…
6. The app installation is confirmed 6. The app installation is confirmed
### Troubleshooting
If you encounter the following error:
```text
Traceback (most recent call last):
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "ledger-env/lib/python3.7/site-packages/ledgerblue/loadApp.py", line 197, in <module>
dongle = getDongle(args.apdu)
File "ledger-env/lib/python3.7/site-packages/ledgerblue/comm.py", line 216, in getDongle
dev.open_path(hidDevicePath)
File "hid.pyx", line 72, in hid.device.open_path
OSError: open failed
```
To fix, check the following:
1. Ensure your Ledger device is connected to USB
2. Ensure your Ledger device is unlocked and not waiting for you to enter your pin
3. Ensure the Ledger Live application is not open
### Future: Installation once the Solana app is on Ledger Live ### Future: Installation once the Solana app is on Ledger Live
- [Install Ledger Live](https://support.ledger.com/hc/en-us/articles/360006395553/) software on your computer
1. Open the Manager in Ledger Live 1. Open the Manager in Ledger Live
1. Connect your Ledger device via USB and enter your pin to unlock it 2. Connect your Ledger device via USB and enter your pin to unlock it
3. When prompted, approve the manager on your device 3. When prompted, approve the manager on your device
4. Find Solana in the app catalog and click Install 4. Find Solana in the app catalog and click Install
5. An installation window appears and your device will display Processing… 5. An installation window appears and your device will display Processing…

View File

@@ -1,156 +0,0 @@
# Running an Archiver
This document describes how to setup an archiver in the testnet
Please note some of the information and instructions described here may change in future releases.
## Overview
Archivers are specialized light clients. They download a part of the ledger \(a.k.a Segment\) and store it. They earn rewards for storing segments.
The testnet features a validator running at devnet.solana.com, which serves as the entrypoint to the cluster for your archiver node.
Additionally there is a blockexplorer available at [http://devnet.solana.com/](http://devnet.solana.com/).
The testnet is configured to reset the ledger daily, or sooner should the hourly automated cluster sanity test fail.
## Machine Requirements
Archivers don't need specialized hardware. Anything with more than 128GB of disk space will be able to participate in the cluster as an archiver node.
Currently the disk space requirements are very low but we expect them to change in the future.
Prebuilt binaries are available for Linux x86\_64 \(Ubuntu 18.04 recommended\), macOS, and Windows.
### Confirm The Testnet Is Reachable
Before starting an archiver node, sanity check that the cluster is accessible to your machine by running some simple commands. If any of the commands fail, please retry 5-10 minutes later to confirm the testnet is not just restarting itself before debugging further.
Fetch the current transaction count over JSON RPC:
```bash
curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1, "method":"getTransactionCount"}' http://devnet.solana.com:8899
```
Inspect the blockexplorer at [http://devnet.solana.com/](http://devnet.solana.com/) for activity.
View the [metrics dashboard](https://metrics.solana.com:3000/d/testnet-beta/testnet-monitor-beta?var-testnet=testnet) for more detail on cluster activity.
## Archiver Setup
#### Obtaining The Software
#### Bootstrap with `solana-install`
The `solana-install` tool can be used to easily install and upgrade the cluster software.
#### Linux and mac OS
```bash
curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v1.0.0/install/solana-install-init.sh | sh -s
```
Alternatively build the `solana-install` program from source and run the following command to obtain the same result:
```bash
solana-install init
```
#### Windows
Download and install **solana-install-init** from [https://github.com/solana-labs/solana/releases/latest](https://github.com/solana-labs/solana/releases/latest)
After a successful install, `solana-install update` may be used to easily update the software to a newer version at any time.
#### Download Prebuilt Binaries
If you would rather not use `solana-install` to manage the install, you can manually download and install the binaries.
#### Linux
Download the binaries by navigating to [https://github.com/solana-labs/solana/releases/latest](https://github.com/solana-labs/solana/releases/latest), download **solana-release-x86\_64-unknown-linux-gnu.tar.bz2**, then extract the archive:
```bash
tar jxf solana-release-x86_64-unknown-linux-gnu.tar.bz2
cd solana-release/
export PATH=$PWD/bin:$PATH
```
#### mac OS
Download the binaries by navigating to [https://github.com/solana-labs/solana/releases/latest](https://github.com/solana-labs/solana/releases/latest), download **solana-release-x86\_64-apple-darwin.tar.bz2**, then extract the archive:
```bash
tar jxf solana-release-x86_64-apple-darwin.tar.bz2
cd solana-release/
export PATH=$PWD/bin:$PATH
```
#### Windows
Download the binaries by navigating to [https://github.com/solana-labs/solana/releases/latest](https://github.com/solana-labs/solana/releases/latest), download **solana-release-x86\_64-pc-windows-msvc.tar.bz2**, then extract it into a folder. It is a good idea to add this extracted folder to your windows PATH.
## Starting The Archiver
Try running following command to join the gossip network and view all the other nodes in the cluster:
```bash
solana-gossip spy --entrypoint devnet.solana.com:8001
# Press ^C to exit
```
Now configure the keypairs for your archiver by running:
Navigate to the solana install location and open a cmd prompt
```bash
solana-keygen new -o archiver-keypair.json
solana-keygen new -o storage-keypair.json
```
Use solana-keygen to show the public keys for each of the keypairs, they will be needed in the next step:
* Windows
```bash
# The archiver's identity
solana-keygen pubkey archiver-keypair.json
solana-keygen pubkey storage-keypair.json
```
* Linux and mac OS
\`\`\`bash
export ARCHIVER\_IDENTITY=$\(solana-keygen pubkey archiver-keypair.json\)
export STORAGE\_IDENTITY=$\(solana-keygen pubkey storage-keypair.json\)
```text
Then set up the storage accounts for your archiver by running:
```bash
solana --keypair archiver-keypair.json airdrop .0001
solana --keypair archiver-keypair.json create-archiver-storage-account $ARCHIVER_IDENTITY $STORAGE_IDENTITY
```
Note: Every time the testnet restarts, run the steps to setup the archiver accounts again.
To start the archiver:
```bash
solana-archiver --entrypoint devnet.solana.com:8001 --identity-keypair archiver-keypair.json --storage-keypair storage-keypair.json --ledger archiver-ledger
```
## Verify Archiver Setup
From another console, confirm the IP address and **identity pubkey** of your archiver is visible in the gossip network by running:
```bash
solana-gossip spy --entrypoint devnet.solana.com:8001
```
Provide the **storage account pubkey** to the `solana storage-account` command to view the recent mining activity from your archiver:
```bash
solana --keypair storage-keypair.json storage-account $STORAGE_IDENTITY
```

View File

@@ -36,7 +36,7 @@ Here are our recommendations for low, medium, and high end machine specification
* See [Installing Solana](../install-solana.md) for the current Solana software release. * See [Installing Solana](../install-solana.md) for the current Solana software release.
Be sure to ensure that the machine used is not behind a residential NAT to avoid Be sure to ensure that the machine used is not behind a residential NAT to avoid
NAT traversal issues. A cloud-hosted machine works best. **Ensure that IP ports 8000 through 1.0.3 are not blocked for Internet inbound and outbound traffic.** NAT traversal issues. A cloud-hosted machine works best. **Ensure that IP ports 8000 through 1.0.5 are not blocked for Internet inbound and outbound traffic.**
For more information on port forwarding with regards to residential networks, For more information on port forwarding with regards to residential networks,
see [this document](http://www.mcs.sdsmt.edu/lpyeatt/courses/314/PortForwardingSetup.pdf). see [this document](http://www.mcs.sdsmt.edu/lpyeatt/courses/314/PortForwardingSetup.pdf).

View File

@@ -174,9 +174,9 @@ If your validator is connected, its public key and IP address will appear in the
### Controlling local network port allocation ### Controlling local network port allocation
By default the validator will dynamically select available network ports in the By default the validator will dynamically select available network ports in the
8000-1.0.3 range, and may be overridden with `--dynamic-port-range`. For 8000-1.0.5 range, and may be overridden with `--dynamic-port-range`. For
example, `solana-validator --dynamic-port-range 1.0.3-1.0.3 ...` will restrict example, `solana-validator --dynamic-port-range 1.0.5-1.0.5 ...` will restrict
the validator to ports 1.0.3-1.0.3. the validator to ports 1.0.5-1.0.5.
### Limiting ledger size to conserve disk space ### Limiting ledger size to conserve disk space

View File

@@ -3,4 +3,4 @@
Please see the official [TOUR DE SOL PARTICIPATION TERMS](https://drive.google.com/a/solana.com/file/d/15ueLG6VJoQ5Hx4rnpjFeuL3pG5DbrBbE/view?usp=sharing) for complete details. Please see the official [TOUR DE SOL PARTICIPATION TERMS](https://drive.google.com/a/solana.com/file/d/15ueLG6VJoQ5Hx4rnpjFeuL3pG5DbrBbE/view?usp=sharing) for complete details.
Download below: Download below:
{% file src="../../.gitbook/assets/solana-tour-de-sol-participation-terms-201.0.33.pdf" caption="Tour de SOL Participation Terms" %} {% file src="../../.gitbook/assets/solana-tour-de-sol-participation-terms-201.0.53.pdf" caption="Tour de SOL Participation Terms" %}

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-faucet" name = "solana-faucet"
version = "1.0.3" version = "1.0.5"
description = "Solana Faucet" description = "Solana Faucet"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -19,10 +19,10 @@ clap = "2.33"
log = "0.4.8" log = "0.4.8"
serde = "1.0.104" serde = "1.0.104"
serde_derive = "1.0.103" serde_derive = "1.0.103"
solana-clap-utils = { path = "../clap-utils", version = "1.0.3" } solana-clap-utils = { path = "../clap-utils", version = "1.0.5" }
solana-logger = { path = "../logger", version = "1.0.3" } solana-logger = { path = "../logger", version = "1.0.5" }
solana-metrics = { path = "../metrics", version = "1.0.3" } solana-metrics = { path = "../metrics", version = "1.0.5" }
solana-sdk = { path = "../sdk", version = "1.0.3" } solana-sdk = { path = "../sdk", version = "1.0.5" }
tokio = "0.1" tokio = "0.1"
tokio-codec = "0.1" tokio-codec = "0.1"

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-genesis-programs" name = "solana-genesis-programs"
version = "1.0.3" version = "1.0.5"
description = "Solana genesis programs" description = "Solana genesis programs"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -10,16 +10,16 @@ edition = "2018"
[dependencies] [dependencies]
log = { version = "0.4.8" } log = { version = "0.4.8" }
solana-bpf-loader-program = { path = "../programs/bpf_loader", version = "1.0.3" } solana-bpf-loader-program = { path = "../programs/bpf_loader", version = "1.0.5" }
solana-budget-program = { path = "../programs/budget", version = "1.0.3" } solana-budget-program = { path = "../programs/budget", version = "1.0.5" }
solana-config-program = { path = "../programs/config", version = "1.0.3" } solana-config-program = { path = "../programs/config", version = "1.0.5" }
solana-exchange-program = { path = "../programs/exchange", version = "1.0.3" } solana-exchange-program = { path = "../programs/exchange", version = "1.0.5" }
solana-runtime = { path = "../runtime", version = "1.0.3" } solana-runtime = { path = "../runtime", version = "1.0.5" }
solana-sdk = { path = "../sdk", version = "1.0.3" } solana-sdk = { path = "../sdk", version = "1.0.5" }
solana-stake-program = { path = "../programs/stake", version = "1.0.3" } solana-stake-program = { path = "../programs/stake", version = "1.0.5" }
solana-storage-program = { path = "../programs/storage", version = "1.0.3" } solana-storage-program = { path = "../programs/storage", version = "1.0.5" }
solana-vest-program = { path = "../programs/vest", version = "1.0.3" } solana-vest-program = { path = "../programs/vest", version = "1.0.5" }
solana-vote-program = { path = "../programs/vote", version = "1.0.3" } solana-vote-program = { path = "../programs/vote", version = "1.0.5" }
[lib] [lib]
crate-type = ["lib"] crate-type = ["lib"]

View File

@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-genesis" name = "solana-genesis"
description = "Blockchain, Rebuilt for Scale" description = "Blockchain, Rebuilt for Scale"
version = "1.0.3" version = "1.0.5"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@@ -15,13 +15,13 @@ chrono = "0.4"
serde = "1.0.104" serde = "1.0.104"
serde_json = "1.0.46" serde_json = "1.0.46"
serde_yaml = "0.8.11" serde_yaml = "0.8.11"
solana-clap-utils = { path = "../clap-utils", version = "1.0.3" } solana-clap-utils = { path = "../clap-utils", version = "1.0.5" }
solana-genesis-programs = { path = "../genesis-programs", version = "1.0.3" } solana-genesis-programs = { path = "../genesis-programs", version = "1.0.5" }
solana-ledger = { path = "../ledger", version = "1.0.3" } solana-ledger = { path = "../ledger", version = "1.0.5" }
solana-sdk = { path = "../sdk", version = "1.0.3" } solana-sdk = { path = "../sdk", version = "1.0.5" }
solana-stake-program = { path = "../programs/stake", version = "1.0.3" } solana-stake-program = { path = "../programs/stake", version = "1.0.5" }
solana-storage-program = { path = "../programs/storage", version = "1.0.3" } solana-storage-program = { path = "../programs/storage", version = "1.0.5" }
solana-vote-program = { path = "../programs/vote", version = "1.0.3" } solana-vote-program = { path = "../programs/vote", version = "1.0.5" }
tempfile = "3.1.0" tempfile = "3.1.0"
[[bin]] [[bin]]

View File

@@ -10,7 +10,16 @@ const UNLOCKS_ALL_AT_9_MONTHS: UnlockInfo = UnlockInfo {
cliff_years: 0.75, cliff_years: 0.75,
unlocks: 0, unlocks: 0,
unlock_years: 0.0, unlock_years: 0.0,
custodian: "6LnFgiECFQKUcxNYDvUBMxgjeGQzzy4kgxGhantoxfUe", custodian: "Mc5XB47H3DKJHym5RLa9mPzWv5snERsF3KNv5AauXK8",
};
// 9 month schedule is 50% after 9 months, then monthly for 2 years
const UNLOCKS_HALF_AT_9_MONTHS: UnlockInfo = UnlockInfo {
cliff_fraction: 0.5,
cliff_years: 0.75,
unlocks: 24,
unlock_years: 2.0,
custodian: "Mc5XB47H3DKJHym5RLa9mPzWv5snERsF3KNv5AauXK8",
}; };
// no lockups // no lockups
@@ -19,114 +28,138 @@ const UNLOCKS_ALL_DAY_ZERO: UnlockInfo = UnlockInfo {
cliff_years: 0.0, cliff_years: 0.0,
unlocks: 0, unlocks: 0,
unlock_years: 0.0, unlock_years: 0.0,
custodian: "6LnFgiECFQKUcxNYDvUBMxgjeGQzzy4kgxGhantoxfUe", custodian: "Mc5XB47H3DKJHym5RLa9mPzWv5snERsF3KNv5AauXK8",
}; };
pub const BATCH_FOUR_STAKER_INFOS: &[StakerInfo] = &[ pub const CREATOR_STAKER_INFOS: &[StakerInfo] = &[
StakerInfo { StakerInfo {
name: "impossible pizza", name: "impossible pizza",
staker: "CDtJpwRSiPRDGeKrvymWQKM7JY9M3hU7iimEKBDxZyoP", staker: "CDtJpwRSiPRDGeKrvymWQKM7JY9M3hU7iimEKBDxZyoP",
lamports: 5_000_000 * LAMPORTS_PER_SOL, lamports: 5_000_000 * LAMPORTS_PER_SOL,
}, withdrawer: None,
StakerInfo {
name: "wretched texture",
staker: "HbENu65qjWLEB5TrMouSSWLq9mbtGx2bvfhPjk2FpYek",
lamports: 225_000 * LAMPORTS_PER_SOL,
}, },
StakerInfo { StakerInfo {
name: "nutritious examination", name: "nutritious examination",
staker: "C9CfFpmLDsQsz6wt7MrrZquNB5oS4QkpJkmDAiboVEZZ", staker: "C9CfFpmLDsQsz6wt7MrrZquNB5oS4QkpJkmDAiboVEZZ",
lamports: 5_000_000 * LAMPORTS_PER_SOL, lamports: 5_000_000 * LAMPORTS_PER_SOL,
withdrawer: None,
}, },
StakerInfo { StakerInfo {
name: "tidy impression", name: "tidy impression",
staker: "6ne6Rbag4FAnop1KNgVdM1SEHnJEysHSWyqvRpFrzaig", staker: "6ne6Rbag4FAnop1KNgVdM1SEHnJEysHSWyqvRpFrzaig",
lamports: 5_000_000 * LAMPORTS_PER_SOL, lamports: 5_000_000 * LAMPORTS_PER_SOL,
}, withdrawer: None,
StakerInfo {
name: "unbecoming silver",
staker: "4AcoZa1P8fF5XK21RJsiuMRZPEScbbWNc75oakRFHiBz",
lamports: 28_800 * LAMPORTS_PER_SOL,
}, },
StakerInfo { StakerInfo {
name: "dramatic treatment", name: "dramatic treatment",
staker: "GTyawCMwt3kMb51AgDtfdp97mDot7jNwc8ifuS9qqANg", staker: "GTyawCMwt3kMb51AgDtfdp97mDot7jNwc8ifuS9qqANg",
lamports: 1_205_602 * LAMPORTS_PER_SOL, lamports: 1_205_602 * LAMPORTS_PER_SOL,
withdrawer: None,
}, },
StakerInfo { StakerInfo {
name: "angry noise", name: "angry noise",
staker: "Fqxs9MhqjKuMq6YwjBG4ktEapuZQ3kj19mpuHLZKtkg9", staker: "Fqxs9MhqjKuMq6YwjBG4ktEapuZQ3kj19mpuHLZKtkg9",
lamports: 5_000_000 * LAMPORTS_PER_SOL, lamports: 5_000_000 * LAMPORTS_PER_SOL,
withdrawer: None,
}, },
StakerInfo { StakerInfo {
name: "hard cousin", name: "hard cousin",
staker: "9MYDzj7QuAX9QAK7da1GhzPB4gA3qbPNWsW3MMSZobru", staker: "9MYDzj7QuAX9QAK7da1GhzPB4gA3qbPNWsW3MMSZobru",
lamports: 5_000_000 * LAMPORTS_PER_SOL, lamports: 5_000_000 * LAMPORTS_PER_SOL,
}, withdrawer: None,
StakerInfo {
name: "inexpensive uncle",
staker: "E4DLNkmdL34ejA48ApfPDoFVuD9XWAFqi8bXzBGRhKst",
lamports: 300_000 * LAMPORTS_PER_SOL,
}, },
StakerInfo { StakerInfo {
name: "lopsided skill", name: "lopsided skill",
staker: "8cV7zCTF5UMrZakZXiL2Jw5uY3ms2Wz4twzFXEY9Kge2", staker: "8cV7zCTF5UMrZakZXiL2Jw5uY3ms2Wz4twzFXEY9Kge2",
lamports: 5_000_000 * LAMPORTS_PER_SOL, lamports: 5_000_000 * LAMPORTS_PER_SOL,
withdrawer: None,
}, },
StakerInfo { StakerInfo {
name: "red snake", name: "red snake",
staker: "JBGnGdLyo7V2z9hz51mnnbyDp9sBACtw5WYH9YRG8n7e", staker: "JBGnGdLyo7V2z9hz51mnnbyDp9sBACtw5WYH9YRG8n7e",
lamports: 3_655_292 * LAMPORTS_PER_SOL, lamports: 3_655_292 * LAMPORTS_PER_SOL,
}, withdrawer: None,
StakerInfo {
name: "hellish money",
staker: "CqKdQ57mBj2mKcAbpjWc28Ls7yXzBXboxSTCRWocmUVj",
lamports: 200_000 * LAMPORTS_PER_SOL,
},
StakerInfo {
name: "full grape",
staker: "2SCJKvh7wWo32PtfUZdVZQ84WnMWoUpF4WTm6ZxcCJ15",
lamports: 450_000 * LAMPORTS_PER_SOL,
},
StakerInfo {
name: "nice ghost",
staker: "FeumxB3gfzrVQzABBiha8AacKPY3Rf4BTFSh2aZWHqR8",
lamports: 650_000 * LAMPORTS_PER_SOL,
}, },
StakerInfo { StakerInfo {
name: "jolly year", name: "jolly year",
staker: "HBwFWNGPVZgkf3yqUKxuAds5aANGWX62LzUFvZVCWLdJ", staker: "HBwFWNGPVZgkf3yqUKxuAds5aANGWX62LzUFvZVCWLdJ",
lamports: 5_000_000 * LAMPORTS_PER_SOL, lamports: 5_000_000 * LAMPORTS_PER_SOL,
withdrawer: None,
}, },
StakerInfo { StakerInfo {
name: "typical initiative", name: "typical initiative",
staker: "3JMz3kaDUZEVK2JVjRqwERGMp7LbWbgUjAFBb42qxoHb", staker: "3JMz3kaDUZEVK2JVjRqwERGMp7LbWbgUjAFBb42qxoHb",
lamports: 5_000_000 * LAMPORTS_PER_SOL, lamports: 5_000_000 * LAMPORTS_PER_SOL,
withdrawer: None,
}, },
StakerInfo { StakerInfo {
name: "deserted window", name: "deserted window",
staker: "XTeBBZextvHkoRqDF8yb4hihjcraKQDwTEXhzjd8fip", staker: "XTeBBZextvHkoRqDF8yb4hihjcraKQDwTEXhzjd8fip",
lamports: 3_655_292 * LAMPORTS_PER_SOL, lamports: 3_655_292 * LAMPORTS_PER_SOL,
withdrawer: None,
}, },
StakerInfo { StakerInfo {
name: "eight nation", name: "eight nation",
staker: "E5bSU5ywqPiz3ije89ef5gaEC7jy81BAc72Zeb9MqeHY", staker: "E5bSU5ywqPiz3ije89ef5gaEC7jy81BAc72Zeb9MqeHY",
lamports: 103_519 * LAMPORTS_PER_SOL, lamports: 103_519 * LAMPORTS_PER_SOL,
withdrawer: None,
}, },
StakerInfo { StakerInfo {
name: "earsplitting meaning", name: "earsplitting meaning",
staker: "4ZemkSoE75RFE1SVLnnmHcaNWT4qN8KFrKP2wAYfv8CB", staker: "4ZemkSoE75RFE1SVLnnmHcaNWT4qN8KFrKP2wAYfv8CB",
lamports: 5_000_000 * LAMPORTS_PER_SOL, lamports: 5_000_000 * LAMPORTS_PER_SOL,
withdrawer: None,
}, },
StakerInfo { StakerInfo {
name: "alike cheese", name: "alike cheese",
staker: "72BGEwYee5txFonmpEarTEKCZVN2UxcSUgdphdhcx3V", staker: "72BGEwYee5txFonmpEarTEKCZVN2UxcSUgdphdhcx3V",
lamports: 3_880_295 * LAMPORTS_PER_SOL, lamports: 3_880_295 * LAMPORTS_PER_SOL,
withdrawer: None,
}, },
StakerInfo { StakerInfo {
name: "noisy honey", name: "noisy honey",
staker: "DRp1Scyn4yJZQfMAdQew2x8RtvRmsNELN37JTK5Xvzgn", staker: "DRp1Scyn4yJZQfMAdQew2x8RtvRmsNELN37JTK5Xvzgn",
lamports: 5_000_000 * LAMPORTS_PER_SOL, lamports: 5_000_000 * LAMPORTS_PER_SOL,
withdrawer: None,
},
];
pub const SERVICE_STAKER_INFOS: &[StakerInfo] = &[
StakerInfo {
name: "wretched texture",
staker: "HbENu65qjWLEB5TrMouSSWLq9mbtGx2bvfhPjk2FpYek",
lamports: 225_000 * LAMPORTS_PER_SOL,
withdrawer: None,
},
StakerInfo {
name: "unbecoming silver",
staker: "4AcoZa1P8fF5XK21RJsiuMRZPEScbbWNc75oakRFHiBz",
lamports: 28_800 * LAMPORTS_PER_SOL,
withdrawer: None,
},
StakerInfo {
name: "inexpensive uncle",
staker: "E4DLNkmdL34ejA48ApfPDoFVuD9XWAFqi8bXzBGRhKst",
lamports: 300_000 * LAMPORTS_PER_SOL,
withdrawer: None,
},
StakerInfo {
name: "hellish money",
staker: "CqKdQ57mBj2mKcAbpjWc28Ls7yXzBXboxSTCRWocmUVj",
lamports: 200_000 * LAMPORTS_PER_SOL,
withdrawer: None,
},
StakerInfo {
name: "full grape",
staker: "2SCJKvh7wWo32PtfUZdVZQ84WnMWoUpF4WTm6ZxcCJ15",
lamports: 450_000 * LAMPORTS_PER_SOL,
withdrawer: None,
},
StakerInfo {
name: "nice ghost",
staker: "FeumxB3gfzrVQzABBiha8AacKPY3Rf4BTFSh2aZWHqR8",
lamports: 650_000 * LAMPORTS_PER_SOL,
withdrawer: None,
}, },
]; ];
@@ -135,11 +168,13 @@ pub const FOUNDATION_STAKER_INFOS: &[StakerInfo] = &[
name: "lyrical supermarket", name: "lyrical supermarket",
staker: "GRZwoJGisLTszcxtWpeREJ98EGg8pZewhbtcrikoU7b3", staker: "GRZwoJGisLTszcxtWpeREJ98EGg8pZewhbtcrikoU7b3",
lamports: 5_000_000 * LAMPORTS_PER_SOL, lamports: 5_000_000 * LAMPORTS_PER_SOL,
withdrawer: None,
}, },
StakerInfo { StakerInfo {
name: "frequent description", name: "frequent description",
staker: "J51tinoLdmEdUR27LUVymrb2LB3xQo1aSHSgmbSGdj58", staker: "J51tinoLdmEdUR27LUVymrb2LB3xQo1aSHSgmbSGdj58",
lamports: 57_500_000 * LAMPORTS_PER_SOL, lamports: 57_500_000 * LAMPORTS_PER_SOL,
withdrawer: None,
}, },
]; ];
@@ -148,29 +183,34 @@ pub const GRANTS_STAKER_INFOS: &[StakerInfo] = &[
name: "rightful agreement", name: "rightful agreement",
staker: "DNaKiBwwbbqk1wVoC5AQxWQbuDhvaDVbAtXzsVos9mrc", staker: "DNaKiBwwbbqk1wVoC5AQxWQbuDhvaDVbAtXzsVos9mrc",
lamports: 5_000_000 * LAMPORTS_PER_SOL, lamports: 5_000_000 * LAMPORTS_PER_SOL,
withdrawer: None,
}, },
StakerInfo { StakerInfo {
name: "tasty location", name: "tasty location",
staker: "HvXQPXAijjG1vnQs6HXVtUUtFVzi5HNgXV9LGnHvYF85", staker: "HvXQPXAijjG1vnQs6HXVtUUtFVzi5HNgXV9LGnHvYF85",
lamports: 15_000_000 * LAMPORTS_PER_SOL, lamports: 15_000_000 * LAMPORTS_PER_SOL,
withdrawer: None,
}, },
]; ];
pub const COMMUNITY_STAKER_INFOS: &[StakerInfo] = &[ pub const COMMUNITY_STAKER_INFOS: &[StakerInfo] = &[
StakerInfo { StakerInfo {
name: "shrill charity", name: "shrill charity",
staker: "BzuqQFnu7oNUeok9ZoJezpqu2vZJU7XR1PxVLkk6wwUD", staker: "Eo1iDtrZZiAkQFA8u431hedChaSUnPbU8MWg849MFvEZ",
lamports: 5_000_000 * LAMPORTS_PER_SOL, lamports: 5_000_000 * LAMPORTS_PER_SOL,
withdrawer: Some("8CUUMKYNGxdgYio5CLHRHyzMEhhVRMcqefgE6dLqnVRK"),
}, },
StakerInfo { StakerInfo {
name: "legal gate", name: "legal gate",
staker: "FwMbkDZUb78aiMWhZY4BEroAcqmnrXZV77nwrg71C57d", staker: "7KCzZCbZz6V1U1YXUpBNaqQzQCg2DKo8JsNhKASKtYxe",
lamports: 16_086_641 * LAMPORTS_PER_SOL, lamports: 16_086_641 * LAMPORTS_PER_SOL,
withdrawer: Some("92viKFftk1dJjqJwreFqT2qHXxjSUuEE9VyHvTdY1mpY"),
}, },
StakerInfo { StakerInfo {
name: "cluttered complaint", name: "cluttered complaint",
staker: "4h1rt2ic4AXwG7p3Qqhw57EMDD4c3tLYb5J3QstGA2p5", staker: "2J8mJU6tWg78DdQVEqMfpN3rMeNbcRT9qGL3yLbmSXYL",
lamports: 153_333_633 * LAMPORTS_PER_SOL + 41 * LAMPORTS_PER_SOL / 100, lamports: 153_333_633 * LAMPORTS_PER_SOL + 41 * LAMPORTS_PER_SOL / 100,
withdrawer: Some("7kgfDmgbEfypBujqn4tyApjf8H7ZWuaL3F6Ah9vQHzgR"),
}, },
]; ];
@@ -191,7 +231,11 @@ pub fn add_genesis_accounts(genesis_config: &mut GenesisConfig, mut issued_lampo
issued_lamports += add_stakes( issued_lamports += add_stakes(
genesis_config, genesis_config,
&BATCH_FOUR_STAKER_INFOS, &CREATOR_STAKER_INFOS,
&UNLOCKS_HALF_AT_9_MONTHS,
) + add_stakes(
genesis_config,
&SERVICE_STAKER_INFOS,
&UNLOCKS_ALL_AT_9_MONTHS, &UNLOCKS_ALL_AT_9_MONTHS,
) + add_stakes( ) + add_stakes(
genesis_config, genesis_config,
@@ -209,8 +253,9 @@ pub fn add_genesis_accounts(genesis_config: &mut GenesisConfig, mut issued_lampo
genesis_config, genesis_config,
&StakerInfo { &StakerInfo {
name: "one thanks", name: "one thanks",
staker: "3b7akieYUyCgz3Cwt5sTSErMWjg8NEygD6mbGjhGkduB", staker: "7vEAL3nS9CWmy1q6njUUyHE7Cf5RmyQpND6CsoHjzPiR",
lamports: 500_000_000 * LAMPORTS_PER_SOL - issued_lamports, lamports: 500_000_000 * LAMPORTS_PER_SOL - issued_lamports,
withdrawer: Some("3FFaheyqtyAXZSYxDzsr5CVKvJuvZD1WE1VEsBtDbRqB"),
}, },
&UNLOCKS_ALL_DAY_ZERO, &UNLOCKS_ALL_DAY_ZERO,
None, None,

View File

@@ -16,6 +16,7 @@ use solana_stake_program::{
pub struct StakerInfo { pub struct StakerInfo {
pub name: &'static str, pub name: &'static str,
pub staker: &'static str, pub staker: &'static str,
pub withdrawer: Option<&'static str>,
pub lamports: u64, pub lamports: u64,
} }
@@ -44,12 +45,19 @@ pub fn create_and_add_stakes(
granularity: Option<u64>, granularity: Option<u64>,
) -> u64 { ) -> u64 {
let granularity = granularity.unwrap_or(std::u64::MAX); let granularity = granularity.unwrap_or(std::u64::MAX);
let authorized = Authorized::auto( let staker = &staker_info
&staker_info
.staker .staker
.parse::<Pubkey>() .parse::<Pubkey>()
.expect("invalid staker"), .expect("invalid staker");
); let withdrawer = &staker_info
.withdrawer
.unwrap_or(staker_info.staker)
.parse::<Pubkey>()
.expect("invalid staker");
let authorized = Authorized {
staker: *staker,
withdrawer: *withdrawer,
};
let custodian = unlock_info let custodian = unlock_info
.custodian .custodian
.parse::<Pubkey>() .parse::<Pubkey>()
@@ -240,6 +248,7 @@ mod tests {
name: "fun", name: "fun",
staker: "P1aceHo1derPubkey11111111111111111111111111", staker: "P1aceHo1derPubkey11111111111111111111111111",
lamports: total_lamports, lamports: total_lamports,
withdrawer: None,
}, },
&UnlockInfo { &UnlockInfo {
cliff_fraction: 0.5, cliff_fraction: 0.5,
@@ -265,6 +274,7 @@ mod tests {
name: "fun", name: "fun",
staker: "P1aceHo1derPubkey11111111111111111111111111", staker: "P1aceHo1derPubkey11111111111111111111111111",
lamports: total_lamports, lamports: total_lamports,
withdrawer: None,
}, },
&UnlockInfo { &UnlockInfo {
cliff_fraction: 0.5, cliff_fraction: 0.5,
@@ -290,6 +300,7 @@ mod tests {
name: "fun", name: "fun",
staker: "P1aceHo1derPubkey11111111111111111111111111", staker: "P1aceHo1derPubkey11111111111111111111111111",
lamports: total_lamports, lamports: total_lamports,
withdrawer: None,
}, },
&UnlockInfo { &UnlockInfo {
cliff_fraction: 0.5, cliff_fraction: 0.5,
@@ -314,6 +325,7 @@ mod tests {
name: "fun", name: "fun",
staker: "P1aceHo1derPubkey11111111111111111111111111", staker: "P1aceHo1derPubkey11111111111111111111111111",
lamports: total_lamports, lamports: total_lamports,
withdrawer: None,
}, },
&UnlockInfo { &UnlockInfo {
cliff_fraction: 0.5, cliff_fraction: 0.5,

View File

@@ -3,19 +3,19 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-gossip" name = "solana-gossip"
description = "Blockchain, Rebuilt for Scale" description = "Blockchain, Rebuilt for Scale"
version = "1.0.3" version = "1.0.5"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
[dependencies] [dependencies]
clap = "2.33.0" clap = "2.33.0"
solana-clap-utils = { path = "../clap-utils", version = "1.0.3" } solana-clap-utils = { path = "../clap-utils", version = "1.0.5" }
solana-core = { path = "../core", version = "1.0.3" } solana-core = { path = "../core", version = "1.0.5" }
solana-client = { path = "../client", version = "1.0.3" } solana-client = { path = "../client", version = "1.0.5" }
solana-logger = { path = "../logger", version = "1.0.3" } solana-logger = { path = "../logger", version = "1.0.5" }
solana-net-utils = { path = "../net-utils", version = "1.0.3" } solana-net-utils = { path = "../net-utils", version = "1.0.5" }
solana-sdk = { path = "../sdk", version = "1.0.3" } solana-sdk = { path = "../sdk", version = "1.0.5" }

View File

@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-install" name = "solana-install"
description = "The solana cluster software installer" description = "The solana cluster software installer"
version = "1.0.3" version = "1.0.5"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@@ -24,11 +24,11 @@ reqwest = { version = "0.10.1", default-features = false, features = ["blocking"
serde = "1.0.104" serde = "1.0.104"
serde_derive = "1.0.103" serde_derive = "1.0.103"
serde_yaml = "0.8.11" serde_yaml = "0.8.11"
solana-clap-utils = { path = "../clap-utils", version = "1.0.3" } solana-clap-utils = { path = "../clap-utils", version = "1.0.5" }
solana-client = { path = "../client", version = "1.0.3" } solana-client = { path = "../client", version = "1.0.5" }
solana-config-program = { path = "../programs/config", version = "1.0.3" } solana-config-program = { path = "../programs/config", version = "1.0.5" }
solana-logger = { path = "../logger", version = "1.0.3" } solana-logger = { path = "../logger", version = "1.0.5" }
solana-sdk = { path = "../sdk", version = "1.0.3" } solana-sdk = { path = "../sdk", version = "1.0.5" }
semver = "0.9.0" semver = "0.9.0"
tar = "0.4.26" tar = "0.4.26"
tempdir = "0.3.7" tempdir = "0.3.7"

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-keygen" name = "solana-keygen"
version = "1.0.3" version = "1.0.5"
description = "Solana key generation utility" description = "Solana key generation utility"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -13,10 +13,10 @@ bs58 = "0.3.0"
clap = "2.33" clap = "2.33"
dirs = "2.0.2" dirs = "2.0.2"
num_cpus = "1.12.0" num_cpus = "1.12.0"
solana-clap-utils = { path = "../clap-utils", version = "1.0.3" } solana-clap-utils = { path = "../clap-utils", version = "1.0.5" }
solana-cli-config = { path = "../cli-config", version = "1.0.3" } solana-cli-config = { path = "../cli-config", version = "1.0.5" }
solana-remote-wallet = { path = "../remote-wallet", version = "1.0.3" } solana-remote-wallet = { path = "../remote-wallet", version = "1.0.5" }
solana-sdk = { path = "../sdk", version = "1.0.3" } solana-sdk = { path = "../sdk", version = "1.0.5" }
tiny-bip39 = "0.7.0" tiny-bip39 = "0.7.0"
[[bin]] [[bin]]

View File

@@ -12,7 +12,7 @@ use solana_clap_utils::{
SKIP_SEED_PHRASE_VALIDATION_ARG, SKIP_SEED_PHRASE_VALIDATION_ARG,
}, },
}; };
use solana_cli_config::config::{Config, CONFIG_FILE}; use solana_cli_config::{Config, CONFIG_FILE};
use solana_remote_wallet::remote_wallet::{maybe_wallet_manager, RemoteWalletManager}; use solana_remote_wallet::remote_wallet::{maybe_wallet_manager, RemoteWalletManager};
use solana_sdk::{ use solana_sdk::{
instruction::{AccountMeta, Instruction}, instruction::{AccountMeta, Instruction},

View File

@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-ledger-tool" name = "solana-ledger-tool"
description = "Blockchain, Rebuilt for Scale" description = "Blockchain, Rebuilt for Scale"
version = "1.0.3" version = "1.0.5"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@@ -14,12 +14,12 @@ clap = "2.33.0"
histogram = "*" histogram = "*"
serde_json = "1.0.46" serde_json = "1.0.46"
serde_yaml = "0.8.11" serde_yaml = "0.8.11"
solana-clap-utils = { path = "../clap-utils", version = "1.0.3" } solana-clap-utils = { path = "../clap-utils", version = "1.0.5" }
solana-ledger = { path = "../ledger", version = "1.0.3" } solana-ledger = { path = "../ledger", version = "1.0.5" }
solana-logger = { path = "../logger", version = "1.0.3" } solana-logger = { path = "../logger", version = "1.0.5" }
solana-runtime = { path = "../runtime", version = "1.0.3" } solana-runtime = { path = "../runtime", version = "1.0.5" }
solana-sdk = { path = "../sdk", version = "1.0.3" } solana-sdk = { path = "../sdk", version = "1.0.5" }
solana-vote-program = { path = "../programs/vote", version = "1.0.3" } solana-vote-program = { path = "../programs/vote", version = "1.0.5" }
tempfile = "3.1.0" tempfile = "3.1.0"
[dev-dependencies] [dev-dependencies]

View File

@@ -718,6 +718,24 @@ fn main() {
.required(true) .required(true)
.help("The location of the YAML file with a list of rollback slot heights and hashes"), .help("The location of the YAML file with a list of rollback slot heights and hashes"),
) )
).subcommand(
SubCommand::with_name("purge")
.about("Purge the ledger at the block height")
.arg(
Arg::with_name("start_slot")
.index(1)
.value_name("SLOT")
.takes_value(true)
.required(true)
.help("Start slot to purge from."),
)
.arg(
Arg::with_name("end_slot")
.index(2)
.value_name("SLOT")
.takes_value(true)
.help("Optional ending slot to stop purging."),
)
) )
.subcommand( .subcommand(
SubCommand::with_name("list-roots") SubCommand::with_name("list-roots")
@@ -998,6 +1016,13 @@ fn main() {
} }
} }
} }
("purge", Some(arg_matches)) => {
let start_slot = value_t_or_exit!(arg_matches, "start_slot", Slot);
let end_slot = value_t!(arg_matches, "end_slot", Slot);
let end_slot = end_slot.map_or(None, Some);
let blockstore = open_blockstore(&ledger_path);
blockstore.purge_slots(start_slot, end_slot);
}
("prune", Some(arg_matches)) => { ("prune", Some(arg_matches)) => {
if let Some(prune_file_path) = arg_matches.value_of("slot_list") { if let Some(prune_file_path) = arg_matches.value_of("slot_list") {
let blockstore = open_blockstore(&ledger_path); let blockstore = open_blockstore(&ledger_path);
@@ -1093,20 +1118,19 @@ fn main() {
Ok(metas) => { Ok(metas) => {
let all = arg_matches.is_present("all"); let all = arg_matches.is_present("all");
println!("Collecting Ledger information...");
let slots: Vec<_> = metas.map(|(slot, _)| slot).collect(); let slots: Vec<_> = metas.map(|(slot, _)| slot).collect();
if slots.is_empty() { if slots.is_empty() {
println!("Ledger is empty. No slots found."); println!("Ledger is empty");
} else { } else {
let first = slots.first().unwrap(); let first = slots.first().unwrap();
let last = slots.last().unwrap_or_else(|| first); let last = slots.last().unwrap_or_else(|| first);
if first != last { if first != last {
println!("Ledger contains data from slots {:?} to {:?}", first, last); println!("Ledger has data for slots {:?} to {:?}", first, last);
if all { if all {
println!("Non-empty slots: {:?}", slots); println!("Non-empty slots: {:?}", slots);
} }
} else { } else {
println!("Ledger only contains some data for slot {:?}", first); println!("Ledger has data for slot {:?}", first);
} }
} }
} }

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-ledger" name = "solana-ledger"
version = "1.0.3" version = "1.0.5"
description = "Solana ledger" description = "Solana ledger"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -27,19 +27,19 @@ reed-solomon-erasure = { package = "solana-reed-solomon-erasure", version = "4.0
regex = "1.3.4" regex = "1.3.4"
serde = "1.0.104" serde = "1.0.104"
serde_bytes = "0.11.3" serde_bytes = "0.11.3"
solana-client = { path = "../client", version = "1.0.3" } solana-client = { path = "../client", version = "1.0.5" }
solana-genesis-programs = { path = "../genesis-programs", version = "1.0.3" } solana-genesis-programs = { path = "../genesis-programs", version = "1.0.5" }
solana-logger = { path = "../logger", version = "1.0.3" } solana-logger = { path = "../logger", version = "1.0.5" }
solana-measure = { path = "../measure", version = "1.0.3" } solana-measure = { path = "../measure", version = "1.0.5" }
solana-merkle-tree = { path = "../merkle-tree", version = "1.0.3" } solana-merkle-tree = { path = "../merkle-tree", version = "1.0.5" }
solana-metrics = { path = "../metrics", version = "1.0.3" } solana-metrics = { path = "../metrics", version = "1.0.5" }
solana-perf = { path = "../perf", version = "1.0.3" } solana-perf = { path = "../perf", version = "1.0.5" }
ed25519-dalek = "1.0.0-pre.1" ed25519-dalek = "1.0.0-pre.1"
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.3" } solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.5" }
solana-runtime = { path = "../runtime", version = "1.0.3" } solana-runtime = { path = "../runtime", version = "1.0.5" }
solana-sdk = { path = "../sdk", version = "1.0.3" } solana-sdk = { path = "../sdk", version = "1.0.5" }
solana-stake-program = { path = "../programs/stake", version = "1.0.3" } solana-stake-program = { path = "../programs/stake", version = "1.0.5" }
solana-vote-program = { path = "../programs/vote", version = "1.0.3" } solana-vote-program = { path = "../programs/vote", version = "1.0.5" }
sys-info = "0.5.9" sys-info = "0.5.9"
symlink = "0.1.0" symlink = "0.1.0"
tar = "0.4.26" tar = "0.4.26"
@@ -57,7 +57,7 @@ features = ["lz4"]
[dev-dependencies] [dev-dependencies]
assert_matches = "1.3.0" assert_matches = "1.3.0"
matches = "0.1.6" matches = "0.1.6"
solana-budget-program = { path = "../programs/budget", version = "1.0.3" } solana-budget-program = { path = "../programs/budget", version = "1.0.5" }
[lib] [lib]
crate-type = ["lib"] crate-type = ["lib"]

View File

@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-local-cluster" name = "solana-local-cluster"
description = "Blockchain, Rebuilt for Scale" description = "Blockchain, Rebuilt for Scale"
version = "1.0.3" version = "1.0.5"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@@ -12,23 +12,23 @@ homepage = "https://solana.com/"
itertools = "0.8.1" itertools = "0.8.1"
log = "0.4.8" log = "0.4.8"
rand = "0.6.5" rand = "0.6.5"
solana-archiver-lib = { path = "../archiver-lib", version = "1.0.3" } solana-archiver-lib = { path = "../archiver-lib", version = "1.0.5" }
solana-config-program = { path = "../programs/config", version = "1.0.3" } solana-config-program = { path = "../programs/config", version = "1.0.5" }
solana-core = { path = "../core", version = "1.0.3" } solana-core = { path = "../core", version = "1.0.5" }
solana-client = { path = "../client", version = "1.0.3" } solana-client = { path = "../client", version = "1.0.5" }
solana-faucet = { path = "../faucet", version = "1.0.3" } solana-faucet = { path = "../faucet", version = "1.0.5" }
solana-exchange-program = { path = "../programs/exchange", version = "1.0.3" } solana-exchange-program = { path = "../programs/exchange", version = "1.0.5" }
solana-genesis-programs = { path = "../genesis-programs", version = "1.0.3" } solana-genesis-programs = { path = "../genesis-programs", version = "1.0.5" }
solana-ledger = { path = "../ledger", version = "1.0.3" } solana-ledger = { path = "../ledger", version = "1.0.5" }
solana-logger = { path = "../logger", version = "1.0.3" } solana-logger = { path = "../logger", version = "1.0.5" }
solana-runtime = { path = "../runtime", version = "1.0.3" } solana-runtime = { path = "../runtime", version = "1.0.5" }
solana-sdk = { path = "../sdk", version = "1.0.3" } solana-sdk = { path = "../sdk", version = "1.0.5" }
solana-stake-program = { path = "../programs/stake", version = "1.0.3" } solana-stake-program = { path = "../programs/stake", version = "1.0.5" }
solana-storage-program = { path = "../programs/storage", version = "1.0.3" } solana-storage-program = { path = "../programs/storage", version = "1.0.5" }
solana-vest-program = { path = "../programs/vest", version = "1.0.3" } solana-vest-program = { path = "../programs/vest", version = "1.0.5" }
solana-vote-program = { path = "../programs/vote", version = "1.0.3" } solana-vote-program = { path = "../programs/vote", version = "1.0.5" }
tempfile = "3.1.0" tempfile = "3.1.0"
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.3" } solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.5" }
[dev-dependencies] [dev-dependencies]
assert_matches = "1.3.0" assert_matches = "1.3.0"

View File

@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-log-analyzer" name = "solana-log-analyzer"
description = "The solana cluster network analysis tool" description = "The solana cluster network analysis tool"
version = "1.0.3" version = "1.0.5"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@@ -14,8 +14,8 @@ byte-unit = "3.0.3"
clap = "2.33.0" clap = "2.33.0"
serde = "1.0.104" serde = "1.0.104"
serde_json = "1.0.46" serde_json = "1.0.46"
solana-clap-utils = { path = "../clap-utils", version = "1.0.3" } solana-clap-utils = { path = "../clap-utils", version = "1.0.5" }
solana-logger = { path = "../logger", version = "1.0.3" } solana-logger = { path = "../logger", version = "1.0.5" }
[[bin]] [[bin]]
name = "solana-log-analyzer" name = "solana-log-analyzer"

View File

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

View File

@@ -1,7 +1,7 @@
[package] [package]
name = "solana-measure" name = "solana-measure"
description = "Blockchain, Rebuilt for Scale" description = "Blockchain, Rebuilt for Scale"
version = "1.0.3" version = "1.0.5"
documentation = "https://docs.rs/solana" documentation = "https://docs.rs/solana"
homepage = "https://solana.com/" homepage = "https://solana.com/"
readme = "../README.md" readme = "../README.md"
@@ -12,8 +12,8 @@ edition = "2018"
[dependencies] [dependencies]
log = "0.4.8" log = "0.4.8"
solana-sdk = { path = "../sdk", version = "1.0.3" } solana-sdk = { path = "../sdk", version = "1.0.5" }
solana-metrics = { path = "../metrics", version = "1.0.3" } solana-metrics = { path = "../metrics", version = "1.0.5" }
[target."cfg(unix)".dependencies] [target."cfg(unix)".dependencies]
jemallocator = "0.3.2" jemallocator = "0.3.2"

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-merkle-tree" name = "solana-merkle-tree"
version = "1.0.3" version = "1.0.5"
description = "Solana Merkle Tree" description = "Solana Merkle Tree"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -9,7 +9,7 @@ homepage = "https://solana.com/"
edition = "2018" edition = "2018"
[dependencies] [dependencies]
solana-sdk = { path = "../sdk", version = "1.0.3" } solana-sdk = { path = "../sdk", version = "1.0.5" }
[dev-dependencies] [dev-dependencies]
hex = "0.4.0" hex = "0.4.0"

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-metrics" name = "solana-metrics"
version = "1.0.3" version = "1.0.5"
description = "Solana Metrics" description = "Solana Metrics"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -13,7 +13,7 @@ env_logger = "0.7.1"
lazy_static = "1.4.0" lazy_static = "1.4.0"
log = "0.4.8" log = "0.4.8"
reqwest = { version = "0.10.1", default-features = false, features = ["blocking", "rustls-tls"] } reqwest = { version = "0.10.1", default-features = false, features = ["blocking", "rustls-tls"] }
solana-sdk = { path = "../sdk", version = "1.0.3" } solana-sdk = { path = "../sdk", version = "1.0.5" }
sys-info = "0.5.9" sys-info = "0.5.9"
[dev-dependencies] [dev-dependencies]

View File

@@ -77,6 +77,7 @@ ledger_dir="$SOLANA_CONFIG_DIR"/bootstrap-validator
args+=( args+=(
--enable-rpc-exit --enable-rpc-exit
--enable-rpc-set-log-filter
--ledger "$ledger_dir" --ledger "$ledger_dir"
--rpc-port 8899 --rpc-port 8899
--snapshot-interval-slots 100 --snapshot-interval-slots 100

View File

@@ -66,6 +66,9 @@ while [[ -n $1 ]]; do
elif [[ $1 = --expected-genesis-hash ]]; then elif [[ $1 = --expected-genesis-hash ]]; then
args+=("$1" "$2") args+=("$1" "$2")
shift 2 shift 2
elif [[ $1 = --expected-shred-version ]]; then
args+=("$1" "$2")
shift 2
elif [[ $1 = --identity-keypair ]]; then elif [[ $1 = --identity-keypair ]]; then
identity_keypair_path=$2 identity_keypair_path=$2
args+=("$1" "$2") args+=("$1" "$2")
@@ -216,6 +219,8 @@ default_arg --voting-keypair "$voting_keypair_path"
default_arg --storage-keypair "$storage_keypair_path" default_arg --storage-keypair "$storage_keypair_path"
default_arg --ledger "$ledger_dir" default_arg --ledger "$ledger_dir"
default_arg --log - default_arg --log -
default_arg --enable-rpc-exit
default_arg --enable-rpc-set-log-filter
if [[ -n $SOLANA_CUDA ]]; then if [[ -n $SOLANA_CUDA ]]; then
program=$solana_validator_cuda program=$solana_validator_cuda

View File

@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-net-shaper" name = "solana-net-shaper"
description = "The solana cluster network shaping tool" description = "The solana cluster network shaping tool"
version = "1.0.3" version = "1.0.5"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@@ -13,8 +13,8 @@ publish = false
clap = "2.33.0" clap = "2.33.0"
serde = "1.0.104" serde = "1.0.104"
serde_json = "1.0.46" serde_json = "1.0.46"
solana-clap-utils = { path = "../clap-utils", version = "1.0.3" } solana-clap-utils = { path = "../clap-utils", version = "1.0.5" }
solana-logger = { path = "../logger", version = "1.0.3" } solana-logger = { path = "../logger", version = "1.0.5" }
rand = "0.6.5" rand = "0.6.5"
[[bin]] [[bin]]

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-net-utils" name = "solana-net-utils"
version = "1.0.3" version = "1.0.5"
description = "Solana Network Utilities" description = "Solana Network Utilities"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -18,8 +18,8 @@ rand = "0.6.1"
serde = "1.0.104" serde = "1.0.104"
serde_derive = "1.0.103" serde_derive = "1.0.103"
socket2 = "0.3.11" socket2 = "0.3.11"
solana-clap-utils = { path = "../clap-utils", version = "1.0.3" } solana-clap-utils = { path = "../clap-utils", version = "1.0.5" }
solana-logger = { path = "../logger", version = "1.0.3" } solana-logger = { path = "../logger", version = "1.0.5" }
tokio = "0.1" tokio = "0.1"
tokio-codec = "0.1" tokio-codec = "0.1"

View File

@@ -228,6 +228,8 @@ EOF
export BOOTSTRAP_VALIDATOR_IDENTITY_KEYPAIR=net/keypairs/bootstrap-validator-identity.json export BOOTSTRAP_VALIDATOR_IDENTITY_KEYPAIR=net/keypairs/bootstrap-validator-identity.json
fi fi
multinode-demo/setup.sh "${args[@]}" multinode-demo/setup.sh "${args[@]}"
solana-ledger-tool -l config/bootstrap-validator shred-version | tee config/shred-version
fi fi
args=( args=(
--gossip-host "$entrypointIp" --gossip-host "$entrypointIp"
@@ -273,12 +275,15 @@ EOF
net/scripts/rsync-retry.sh -vPrc \ net/scripts/rsync-retry.sh -vPrc \
"$entrypointIp":~/solana/config/validator-identity-"$nodeIndex".json config/validator-identity.json "$entrypointIp":~/solana/config/validator-identity-"$nodeIndex".json config/validator-identity.json
fi fi
net/scripts/rsync-retry.sh -vPrc \
"$entrypointIp":~/solana/config/shred-version config/shred-version
fi fi
args=( args=(
--entrypoint "$entrypointIp:8001" --entrypoint "$entrypointIp:8001"
--gossip-port 8001 --gossip-port 8001
--rpc-port 8899 --rpc-port 8899
--expected-shred-version "$(cat config/shred-version)"
) )
if [[ $nodeType = blockstreamer ]]; then if [[ $nodeType = blockstreamer ]]; then
args+=( args+=(
@@ -288,7 +293,6 @@ EOF
--enable-rpc-get-confirmed-block --enable-rpc-get-confirmed-block
) )
else else
args+=(--enable-rpc-exit)
if [[ -n $internalNodesLamports ]]; then if [[ -n $internalNodesLamports ]]; then
args+=(--node-lamports "$internalNodesLamports") args+=(--node-lamports "$internalNodesLamports")
fi fi

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-perf" name = "solana-perf"
version = "1.0.3" version = "1.0.5"
description = "Solana Performance APIs" description = "Solana Performance APIs"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -17,11 +17,11 @@ serde = "1.0.104"
dlopen_derive = "0.1.4" dlopen_derive = "0.1.4"
lazy_static = "1.4.0" lazy_static = "1.4.0"
log = "0.4.8" log = "0.4.8"
solana-sdk = { path = "../sdk", version = "1.0.3" } solana-sdk = { path = "../sdk", version = "1.0.5" }
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.3" } solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.5" }
solana-budget-program = { path = "../programs/budget", version = "1.0.3" } solana-budget-program = { path = "../programs/budget", version = "1.0.5" }
solana-logger = { path = "../logger", version = "1.0.3" } solana-logger = { path = "../logger", version = "1.0.5" }
solana-metrics = { path = "../metrics", version = "1.0.3" } solana-metrics = { path = "../metrics", version = "1.0.5" }
[lib] [lib]
name = "solana_perf" name = "solana_perf"

View File

@@ -1,7 +1,7 @@
[package] [package]
name = "solana-bpf-programs" name = "solana-bpf-programs"
description = "Blockchain, Rebuilt for Scale" description = "Blockchain, Rebuilt for Scale"
version = "1.0.3" version = "1.0.5"
documentation = "https://docs.rs/solana" documentation = "https://docs.rs/solana"
homepage = "https://solana.com/" homepage = "https://solana.com/"
readme = "README.md" readme = "README.md"
@@ -22,10 +22,10 @@ walkdir = "2"
bincode = "1.1.4" bincode = "1.1.4"
byteorder = "1.3.2" byteorder = "1.3.2"
elf = "0.0.10" elf = "0.0.10"
solana-bpf-loader-program = { path = "../bpf_loader", version = "1.0.3" } solana-bpf-loader-program = { path = "../bpf_loader", version = "1.0.5" }
solana-logger = { path = "../../logger", version = "1.0.3" } solana-logger = { path = "../../logger", version = "1.0.5" }
solana-runtime = { path = "../../runtime", version = "1.0.3" } solana-runtime = { path = "../../runtime", version = "1.0.5" }
solana-sdk = { path = "../../sdk", version = "1.0.3" } solana-sdk = { path = "../../sdk", version = "1.0.5" }
solana_rbpf = "=0.1.21" solana_rbpf = "=0.1.21"
[[bench]] [[bench]]

View File

@@ -3,7 +3,7 @@
[package] [package]
name = "solana-bpf-rust-128bit" name = "solana-bpf-rust-128bit"
version = "1.0.3" version = "1.0.5"
description = "Solana BPF test program written in Rust" description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -12,11 +12,11 @@ homepage = "https://solana.com/"
edition = "2018" edition = "2018"
[dependencies] [dependencies]
solana-sdk = { path = "../../../../sdk/", version = "1.0.3", default-features = false } solana-sdk = { path = "../../../../sdk/", version = "1.0.5", default-features = false }
solana-bpf-rust-128bit-dep = { path = "../128bit_dep", version = "1.0.3" } solana-bpf-rust-128bit-dep = { path = "../128bit_dep", version = "1.0.5" }
[dev_dependencies] [dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.3" } solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.5" }
[features] [features]
program = ["solana-sdk/program"] program = ["solana-sdk/program"]

View File

@@ -3,7 +3,7 @@
[package] [package]
name = "solana-bpf-rust-128bit-dep" name = "solana-bpf-rust-128bit-dep"
version = "1.0.3" version = "1.0.5"
description = "Solana BPF test program written in Rust" description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
edition = "2018" edition = "2018"
[dependencies] [dependencies]
solana-sdk = { path = "../../../../sdk/", version = "1.0.3", default-features = false } solana-sdk = { path = "../../../../sdk/", version = "1.0.5", default-features = false }
[dev_dependencies] [dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.3" } solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.5" }
[features] [features]
program = ["solana-sdk/program"] program = ["solana-sdk/program"]

View File

@@ -3,7 +3,7 @@
[package] [package]
name = "solana-bpf-rust-alloc" name = "solana-bpf-rust-alloc"
version = "1.0.3" version = "1.0.5"
description = "Solana BPF test program written in Rust" description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
edition = "2018" edition = "2018"
[dependencies] [dependencies]
solana-sdk = { path = "../../../../sdk/", version = "1.0.3", default-features = false } solana-sdk = { path = "../../../../sdk/", version = "1.0.5", default-features = false }
[dev_dependencies] [dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.3" } solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.5" }
[features] [features]
program = ["solana-sdk/program"] program = ["solana-sdk/program"]

View File

@@ -3,7 +3,7 @@
[package] [package]
name = "solana-bpf-rust-dep-crate" name = "solana-bpf-rust-dep-crate"
version = "1.0.3" version = "1.0.5"
description = "Solana BPF test program written in Rust" description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -13,10 +13,10 @@ edition = "2018"
[dependencies] [dependencies]
byteorder = { version = "1", default-features = false } byteorder = { version = "1", default-features = false }
solana-sdk = { path = "../../../../sdk/", version = "1.0.3", default-features = false } solana-sdk = { path = "../../../../sdk/", version = "1.0.5", default-features = false }
[dev_dependencies] [dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.3" } solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.5" }
[features] [features]
program = ["solana-sdk/program"] program = ["solana-sdk/program"]

View File

@@ -3,7 +3,7 @@
[package] [package]
name = "solana-bpf-rust-dup-accounts" name = "solana-bpf-rust-dup-accounts"
version = "1.0.3" version = "1.0.5"
description = "Solana BPF test program written in Rust" description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
edition = "2018" edition = "2018"
[dependencies] [dependencies]
solana-sdk = { path = "../../../../sdk/", version = "1.0.3", default-features = false } solana-sdk = { path = "../../../../sdk/", version = "1.0.5", default-features = false }
[dev_dependencies] [dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.3" } solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.5" }
[features] [features]
program = ["solana-sdk/program"] program = ["solana-sdk/program"]

View File

@@ -3,7 +3,7 @@
[package] [package]
name = "solana-bpf-rust-error-handling" name = "solana-bpf-rust-error-handling"
version = "1.0.3" version = "1.0.5"
description = "Solana BPF test program written in Rust" description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -14,11 +14,11 @@ edition = "2018"
[dependencies] [dependencies]
num-derive = "0.2" num-derive = "0.2"
num-traits = "0.2" num-traits = "0.2"
solana-sdk = { path = "../../../../sdk/", version = "1.0.3", default-features = false } solana-sdk = { path = "../../../../sdk/", version = "1.0.5", default-features = false }
thiserror = "1.0" thiserror = "1.0"
[dev_dependencies] [dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.3" } solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.5" }
[features] [features]
program = ["solana-sdk/program"] program = ["solana-sdk/program"]

View File

@@ -3,7 +3,7 @@
[package] [package]
name = "solana-bpf-rust-external-spend" name = "solana-bpf-rust-external-spend"
version = "1.0.3" version = "1.0.5"
description = "Solana BPF test program written in Rust" description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
edition = "2018" edition = "2018"
[dependencies] [dependencies]
solana-sdk = { path = "../../../../sdk/", version = "1.0.3", default-features = false } solana-sdk = { path = "../../../../sdk/", version = "1.0.5", default-features = false }
[dev_dependencies] [dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.3" } solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.5" }
[features] [features]
program = ["solana-sdk/program"] program = ["solana-sdk/program"]

View File

@@ -3,7 +3,7 @@
[package] [package]
name = "solana-bpf-rust-iter" name = "solana-bpf-rust-iter"
version = "1.0.3" version = "1.0.5"
description = "Solana BPF test program written in Rust" description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
edition = "2018" edition = "2018"
[dependencies] [dependencies]
solana-sdk = { path = "../../../../sdk/", version = "1.0.3", default-features = false } solana-sdk = { path = "../../../../sdk/", version = "1.0.5", default-features = false }
[dev_dependencies] [dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.3" } solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.5" }
[features] [features]
program = ["solana-sdk/program"] program = ["solana-sdk/program"]

View File

@@ -3,7 +3,7 @@
[package] [package]
name = "solana-bpf-rust-many-args" name = "solana-bpf-rust-many-args"
version = "1.0.3" version = "1.0.5"
description = "Solana BPF test program written in Rust" description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -12,11 +12,11 @@ homepage = "https://solana.com/"
edition = "2018" edition = "2018"
[dependencies] [dependencies]
solana-sdk = { path = "../../../../sdk/", version = "1.0.3", default-features = false } solana-sdk = { path = "../../../../sdk/", version = "1.0.5", default-features = false }
solana-bpf-rust-many-args-dep = { path = "../many_args_dep", version = "1.0.3" } solana-bpf-rust-many-args-dep = { path = "../many_args_dep", version = "1.0.5" }
[dev_dependencies] [dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.3" } solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.5" }
[features] [features]
program = ["solana-sdk/program"] program = ["solana-sdk/program"]

View File

@@ -3,7 +3,7 @@
[package] [package]
name = "solana-bpf-rust-many-args-dep" name = "solana-bpf-rust-many-args-dep"
version = "1.0.3" version = "1.0.5"
description = "Solana BPF test program written in Rust" description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
edition = "2018" edition = "2018"
[dependencies] [dependencies]
solana-sdk = { path = "../../../../sdk/", version = "1.0.3", default-features = false } solana-sdk = { path = "../../../../sdk/", version = "1.0.5", default-features = false }
[dev_dependencies] [dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.3" } solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.5" }
[features] [features]
program = ["solana-sdk/program"] program = ["solana-sdk/program"]

View File

@@ -3,7 +3,7 @@
[package] [package]
name = "solana-bpf-rust-noop" name = "solana-bpf-rust-noop"
version = "1.0.3" version = "1.0.5"
description = "Solana BPF test program written in Rust" description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
edition = "2018" edition = "2018"
[dependencies] [dependencies]
solana-sdk = { path = "../../../../sdk/", version = "1.0.3", default-features = false } solana-sdk = { path = "../../../../sdk/", version = "1.0.5", default-features = false }
[dev_dependencies] [dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.3" } solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.5" }
[features] [features]
program = ["solana-sdk/program"] program = ["solana-sdk/program"]

View File

@@ -3,7 +3,7 @@
[package] [package]
name = "solana-bpf-rust-panic" name = "solana-bpf-rust-panic"
version = "1.0.3" version = "1.0.5"
description = "Solana BPF test program written in Rust" description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
edition = "2018" edition = "2018"
[dependencies] [dependencies]
solana-sdk = { path = "../../../../sdk/", version = "1.0.3", default-features = false } solana-sdk = { path = "../../../../sdk/", version = "1.0.5", default-features = false }
[dev_dependencies] [dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.3" } solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.5" }
[features] [features]
program = ["solana-sdk/program"] program = ["solana-sdk/program"]

View File

@@ -3,7 +3,7 @@
[package] [package]
name = "solana-bpf-rust-param-passing" name = "solana-bpf-rust-param-passing"
version = "1.0.3" version = "1.0.5"
description = "Solana BPF test program written in Rust" description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -12,11 +12,11 @@ homepage = "https://solana.com/"
edition = "2018" edition = "2018"
[dependencies] [dependencies]
solana-sdk = { path = "../../../../sdk/", version = "1.0.3", default-features = false } solana-sdk = { path = "../../../../sdk/", version = "1.0.5", default-features = false }
solana-bpf-rust-param-passing-dep = { path = "../param_passing_dep", version = "1.0.3" } solana-bpf-rust-param-passing-dep = { path = "../param_passing_dep", version = "1.0.5" }
[dev_dependencies] [dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.3" } solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.5" }
[features] [features]
program = ["solana-sdk/program"] program = ["solana-sdk/program"]

View File

@@ -3,7 +3,7 @@
[package] [package]
name = "solana-bpf-rust-param-passing-dep" name = "solana-bpf-rust-param-passing-dep"
version = "1.0.3" version = "1.0.5"
description = "Solana BPF program written in Rust" description = "Solana BPF program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
edition = "2018" edition = "2018"
[dependencies] [dependencies]
solana-sdk = { path = "../../../../sdk/", version = "1.0.3", default-features = false } solana-sdk = { path = "../../../../sdk/", version = "1.0.5", default-features = false }
[dev_dependencies] [dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.3" } solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.5" }
[features] [features]
program = ["solana-sdk/program"] program = ["solana-sdk/program"]

View File

@@ -3,7 +3,7 @@
[package] [package]
name = "solana-bpf-rust-sysval" name = "solana-bpf-rust-sysval"
version = "1.0.3" version = "1.0.5"
description = "Solana BPF test program written in Rust" description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
edition = "2018" edition = "2018"
[dependencies] [dependencies]
solana-sdk = { path = "../../../../sdk/", version = "1.0.3", default-features = false } solana-sdk = { path = "../../../../sdk/", version = "1.0.5", default-features = false }
[dev_dependencies] [dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.3" } solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.5" }
[features] [features]
program = ["solana-sdk/program"] program = ["solana-sdk/program"]

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-bpf-loader-program" name = "solana-bpf-loader-program"
version = "1.0.3" version = "1.0.5"
description = "Solana BPF loader" description = "Solana BPF loader"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -15,8 +15,8 @@ libc = "0.2.66"
log = "0.4.8" log = "0.4.8"
num-derive = { version = "0.3" } num-derive = { version = "0.3" }
num-traits = { version = "0.2" } num-traits = { version = "0.2" }
solana-logger = { path = "../../logger", version = "1.0.3" } solana-logger = { path = "../../logger", version = "1.0.5" }
solana-sdk = { path = "../../sdk", version = "1.0.3" } solana-sdk = { path = "../../sdk", version = "1.0.5" }
solana_rbpf = "=0.1.21" solana_rbpf = "=0.1.21"
thiserror = "1.0" thiserror = "1.0"

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-btc-spv-program" name = "solana-btc-spv-program"
version = "1.0.3" version = "1.0.5"
description = "Solana Bitcoin spv parsing program" description = "Solana Bitcoin spv parsing program"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -15,7 +15,7 @@ num-derive = "0.3"
num-traits = "0.2" num-traits = "0.2"
serde = "1.0.104" serde = "1.0.104"
serde_derive = "1.0.103" serde_derive = "1.0.103"
solana-sdk = { path = "../../sdk", version = "1.0.3"} solana-sdk = { path = "../../sdk", version = "1.0.5"}
hex = "0.3.2" hex = "0.3.2"
[lib] [lib]

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "btc_spv_bin" name = "btc_spv_bin"
version = "1.0.3" version = "1.0.5"
description = "Solana Bitcoin spv parsing program" description = "Solana Bitcoin spv parsing program"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-budget-program" name = "solana-budget-program"
version = "1.0.3" version = "1.0.5"
description = "Solana Budget program" description = "Solana Budget program"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -16,11 +16,11 @@ num-derive = "0.3"
num-traits = "0.2" num-traits = "0.2"
serde = "1.0.104" serde = "1.0.104"
serde_derive = "1.0.103" serde_derive = "1.0.103"
solana-sdk = { path = "../../sdk", version = "1.0.3" } solana-sdk = { path = "../../sdk", version = "1.0.5" }
thiserror = "1.0" thiserror = "1.0"
[dev-dependencies] [dev-dependencies]
solana-runtime = { path = "../../runtime", version = "1.0.3" } solana-runtime = { path = "../../runtime", version = "1.0.5" }
[lib] [lib]
crate-type = ["lib", "cdylib"] crate-type = ["lib", "cdylib"]

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-config-program" name = "solana-config-program"
version = "1.0.3" version = "1.0.5"
description = "Solana Config program" description = "Solana Config program"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -14,8 +14,8 @@ chrono = { version = "0.4.10", features = ["serde"] }
log = "0.4.8" log = "0.4.8"
serde = "1.0.104" serde = "1.0.104"
serde_derive = "1.0.103" serde_derive = "1.0.103"
solana-logger = { path = "../../logger", version = "1.0.3" } solana-logger = { path = "../../logger", version = "1.0.5" }
solana-sdk = { path = "../../sdk", version = "1.0.3" } solana-sdk = { path = "../../sdk", version = "1.0.5" }
[lib] [lib]
crate-type = ["lib", "cdylib"] crate-type = ["lib", "cdylib"]

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-exchange-program" name = "solana-exchange-program"
version = "1.0.3" version = "1.0.5"
description = "Solana Exchange program" description = "Solana Exchange program"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -15,13 +15,13 @@ num-derive = { version = "0.3" }
num-traits = { version = "0.2" } num-traits = { version = "0.2" }
serde = "1.0.104" serde = "1.0.104"
serde_derive = "1.0.103" serde_derive = "1.0.103"
solana-logger = { path = "../../logger", version = "1.0.3" } solana-logger = { path = "../../logger", version = "1.0.5" }
solana-metrics = { path = "../../metrics", version = "1.0.3" } solana-metrics = { path = "../../metrics", version = "1.0.5" }
solana-sdk = { path = "../../sdk", version = "1.0.3" } solana-sdk = { path = "../../sdk", version = "1.0.5" }
thiserror = "1.0" thiserror = "1.0"
[dev-dependencies] [dev-dependencies]
solana-runtime = { path = "../../runtime", version = "1.0.3" } solana-runtime = { path = "../../runtime", version = "1.0.5" }
[lib] [lib]
crate-type = ["lib", "cdylib"] crate-type = ["lib", "cdylib"]

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-failure-program" name = "solana-failure-program"
version = "1.0.3" version = "1.0.5"
description = "Solana failure program" description = "Solana failure program"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -9,10 +9,10 @@ homepage = "https://solana.com/"
edition = "2018" edition = "2018"
[dependencies] [dependencies]
solana-sdk = { path = "../../sdk", version = "1.0.3" } solana-sdk = { path = "../../sdk", version = "1.0.5" }
[dev-dependencies] [dev-dependencies]
solana-runtime = { path = "../../runtime", version = "1.0.3" } solana-runtime = { path = "../../runtime", version = "1.0.5" }
[lib] [lib]
crate-type = ["lib", "cdylib"] crate-type = ["lib", "cdylib"]

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-librapay" name = "solana-librapay"
version = "1.0.3" version = "1.0.5"
description = "Solana Libra Payment" description = "Solana Libra Payment"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -11,10 +11,10 @@ edition = "2018"
[dependencies] [dependencies]
bincode = "1.2.0" bincode = "1.2.0"
log = "0.4.8" log = "0.4.8"
solana-logger = { path = "../../logger", version = "1.0.3" } solana-logger = { path = "../../logger", version = "1.0.5" }
solana-move-loader-program = { path = "../move_loader", version = "1.0.3" } solana-move-loader-program = { path = "../move_loader", version = "1.0.5" }
solana-runtime = { path = "../../runtime", version = "1.0.3" } solana-runtime = { path = "../../runtime", version = "1.0.5" }
solana-sdk = { path = "../../sdk", version = "1.0.3" } solana-sdk = { path = "../../sdk", version = "1.0.5" }
types = { version = "0.0.1-sol4", package = "solana_libra_types" } types = { version = "0.0.1-sol4", package = "solana_libra_types" }
[lib] [lib]

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-move-loader-program" name = "solana-move-loader-program"
version = "1.0.3" version = "1.0.5"
description = "Solana Move loader" description = "Solana Move loader"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -16,8 +16,8 @@ serde = "1.0.104"
serde_bytes = "0.11" serde_bytes = "0.11"
serde_derive = "1.0.103" serde_derive = "1.0.103"
serde_json = "1.0.46" serde_json = "1.0.46"
solana-logger = { path = "../../logger", version = "1.0.3" } solana-logger = { path = "../../logger", version = "1.0.5" }
solana-sdk = { path = "../../sdk", version = "1.0.3" } solana-sdk = { path = "../../sdk", version = "1.0.5" }
bytecode_verifier = { version = "0.0.1-sol4", package = "solana_libra_bytecode_verifier" } bytecode_verifier = { version = "0.0.1-sol4", package = "solana_libra_bytecode_verifier" }
canonical_serialization = { version = "0.0.1-sol4", package = "solana_libra_canonical_serialization" } canonical_serialization = { version = "0.0.1-sol4", package = "solana_libra_canonical_serialization" }

Some files were not shown because too many files have changed in this diff Show More