Compare commits
16 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
02a83e7c6e | ||
|
83263e1737 | ||
|
1f7ac22b60 | ||
|
747debae56 | ||
|
00b4186469 | ||
|
b087dabf4f | ||
|
e00eb0a069 | ||
|
d4e49ffd06 | ||
|
0f34a190ea | ||
|
df2fb8f5b3 | ||
|
80d2a6046b | ||
|
24273b826f | ||
|
68d2616e35 | ||
|
f506d39339 | ||
|
bc58c9ec7e | ||
|
b57a52cd85 |
704
Cargo.lock
generated
704
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-archiver-lib"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana Archiver Library"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -15,22 +15,22 @@ ed25519-dalek = "=1.0.0-pre.1"
|
||||
log = "0.4.8"
|
||||
rand = "0.6.5"
|
||||
rand_chacha = "0.1.1"
|
||||
solana-client = { path = "../client", version = "1.0.14" }
|
||||
solana-storage-program = { path = "../programs/storage", version = "1.0.14" }
|
||||
solana-client = { path = "../client", version = "1.0.16" }
|
||||
solana-storage-program = { path = "../programs/storage", version = "1.0.16" }
|
||||
thiserror = "1.0"
|
||||
serde = "1.0.104"
|
||||
serde_json = "1.0.46"
|
||||
serde_derive = "1.0.103"
|
||||
solana-net-utils = { path = "../net-utils", version = "1.0.14" }
|
||||
solana-chacha = { path = "../chacha", version = "1.0.14" }
|
||||
solana-chacha-sys = { path = "../chacha-sys", version = "1.0.14" }
|
||||
solana-ledger = { path = "../ledger", version = "1.0.14" }
|
||||
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||
solana-perf = { path = "../perf", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-core = { path = "../core", version = "1.0.14" }
|
||||
solana-archiver-utils = { path = "../archiver-utils", version = "1.0.14" }
|
||||
solana-metrics = { path = "../metrics", version = "1.0.14" }
|
||||
solana-net-utils = { path = "../net-utils", version = "1.0.16" }
|
||||
solana-chacha = { path = "../chacha", version = "1.0.16" }
|
||||
solana-chacha-sys = { path = "../chacha-sys", version = "1.0.16" }
|
||||
solana-ledger = { path = "../ledger", version = "1.0.16" }
|
||||
solana-logger = { path = "../logger", version = "1.0.16" }
|
||||
solana-perf = { path = "../perf", version = "1.0.16" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
solana-core = { path = "../core", version = "1.0.16" }
|
||||
solana-archiver-utils = { path = "../archiver-utils", version = "1.0.16" }
|
||||
solana-metrics = { path = "../metrics", version = "1.0.16" }
|
||||
|
||||
[dev-dependencies]
|
||||
hex = "0.4.0"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-archiver-utils"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana Archiver Utils"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -11,12 +11,12 @@ edition = "2018"
|
||||
[dependencies]
|
||||
log = "0.4.8"
|
||||
rand = "0.6.5"
|
||||
solana-chacha = { path = "../chacha", version = "1.0.14" }
|
||||
solana-chacha-sys = { path = "../chacha-sys", version = "1.0.14" }
|
||||
solana-ledger = { path = "../ledger", version = "1.0.14" }
|
||||
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||
solana-perf = { path = "../perf", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-chacha = { path = "../chacha", version = "1.0.16" }
|
||||
solana-chacha-sys = { path = "../chacha-sys", version = "1.0.16" }
|
||||
solana-ledger = { path = "../ledger", version = "1.0.16" }
|
||||
solana-logger = { path = "../logger", version = "1.0.16" }
|
||||
solana-perf = { path = "../perf", version = "1.0.16" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
|
||||
[dev-dependencies]
|
||||
hex = "0.4.0"
|
||||
|
@@ -2,7 +2,7 @@
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-archiver"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@@ -10,11 +10,11 @@ homepage = "https://solana.com/"
|
||||
[dependencies]
|
||||
clap = "2.33.0"
|
||||
console = "0.9.2"
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||
solana-core = { path = "../core", version = "1.0.14" }
|
||||
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||
solana-metrics = { path = "../metrics", version = "1.0.14" }
|
||||
solana-archiver-lib = { path = "../archiver-lib", version = "1.0.14" }
|
||||
solana-net-utils = { path = "../net-utils", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.16" }
|
||||
solana-core = { path = "../core", version = "1.0.16" }
|
||||
solana-logger = { path = "../logger", version = "1.0.16" }
|
||||
solana-metrics = { path = "../metrics", version = "1.0.16" }
|
||||
solana-archiver-lib = { path = "../archiver-lib", version = "1.0.16" }
|
||||
solana-net-utils = { path = "../net-utils", version = "1.0.16" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
|
||||
|
@@ -2,7 +2,7 @@
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-banking-bench"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@@ -10,11 +10,11 @@ homepage = "https://solana.com/"
|
||||
[dependencies]
|
||||
log = "0.4.6"
|
||||
rayon = "1.2.0"
|
||||
solana-core = { path = "../core", version = "1.0.14" }
|
||||
solana-ledger = { path = "../ledger", version = "1.0.14" }
|
||||
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||
solana-runtime = { path = "../runtime", version = "1.0.14" }
|
||||
solana-measure = { path = "../measure", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-core = { path = "../core", version = "1.0.16" }
|
||||
solana-ledger = { path = "../ledger", version = "1.0.16" }
|
||||
solana-logger = { path = "../logger", version = "1.0.16" }
|
||||
solana-runtime = { path = "../runtime", version = "1.0.16" }
|
||||
solana-measure = { path = "../measure", version = "1.0.16" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
rand = "0.6.5"
|
||||
crossbeam-channel = "0.3"
|
||||
|
@@ -2,7 +2,7 @@
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-bench-exchange"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@@ -18,17 +18,17 @@ rand = "0.6.5"
|
||||
rayon = "1.2.0"
|
||||
serde_json = "1.0.46"
|
||||
serde_yaml = "0.8.11"
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||
solana-core = { path = "../core", version = "1.0.14" }
|
||||
solana-genesis = { path = "../genesis", version = "1.0.14" }
|
||||
solana-client = { path = "../client", version = "1.0.14" }
|
||||
solana-faucet = { path = "../faucet", version = "1.0.14" }
|
||||
solana-exchange-program = { path = "../programs/exchange", version = "1.0.14" }
|
||||
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||
solana-metrics = { path = "../metrics", version = "1.0.14" }
|
||||
solana-net-utils = { path = "../net-utils", version = "1.0.14" }
|
||||
solana-runtime = { path = "../runtime", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.16" }
|
||||
solana-core = { path = "../core", version = "1.0.16" }
|
||||
solana-genesis = { path = "../genesis", version = "1.0.16" }
|
||||
solana-client = { path = "../client", version = "1.0.16" }
|
||||
solana-faucet = { path = "../faucet", version = "1.0.16" }
|
||||
solana-exchange-program = { path = "../programs/exchange", version = "1.0.16" }
|
||||
solana-logger = { path = "../logger", version = "1.0.16" }
|
||||
solana-metrics = { path = "../metrics", version = "1.0.16" }
|
||||
solana-net-utils = { path = "../net-utils", version = "1.0.16" }
|
||||
solana-runtime = { path = "../runtime", version = "1.0.16" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
|
||||
[dev-dependencies]
|
||||
solana-local-cluster = { path = "../local-cluster", version = "1.0.14" }
|
||||
solana-local-cluster = { path = "../local-cluster", version = "1.0.16" }
|
||||
|
@@ -2,14 +2,14 @@
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-bench-streamer"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
|
||||
[dependencies]
|
||||
clap = "2.33.0"
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||
solana-core = { path = "../core", version = "1.0.14" }
|
||||
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||
solana-net-utils = { path = "../net-utils", version = "1.0.14" }
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.16" }
|
||||
solana-core = { path = "../core", version = "1.0.16" }
|
||||
solana-logger = { path = "../logger", version = "1.0.16" }
|
||||
solana-net-utils = { path = "../net-utils", version = "1.0.16" }
|
||||
|
@@ -2,7 +2,7 @@
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-bench-tps"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@@ -14,24 +14,24 @@ log = "0.4.8"
|
||||
rayon = "1.2.0"
|
||||
serde_json = "1.0.46"
|
||||
serde_yaml = "0.8.11"
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||
solana-core = { path = "../core", version = "1.0.14" }
|
||||
solana-genesis = { path = "../genesis", version = "1.0.14" }
|
||||
solana-client = { path = "../client", version = "1.0.14" }
|
||||
solana-faucet = { path = "../faucet", version = "1.0.14" }
|
||||
solana-librapay = { path = "../programs/librapay", version = "1.0.14", optional = true }
|
||||
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||
solana-metrics = { path = "../metrics", version = "1.0.14" }
|
||||
solana-measure = { path = "../measure", version = "1.0.14" }
|
||||
solana-net-utils = { path = "../net-utils", version = "1.0.14" }
|
||||
solana-runtime = { path = "../runtime", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-move-loader-program = { path = "../programs/move_loader", version = "1.0.14", optional = true }
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.16" }
|
||||
solana-core = { path = "../core", version = "1.0.16" }
|
||||
solana-genesis = { path = "../genesis", version = "1.0.16" }
|
||||
solana-client = { path = "../client", version = "1.0.16" }
|
||||
solana-faucet = { path = "../faucet", version = "1.0.16" }
|
||||
solana-librapay = { path = "../programs/librapay", version = "1.0.16", optional = true }
|
||||
solana-logger = { path = "../logger", version = "1.0.16" }
|
||||
solana-metrics = { path = "../metrics", version = "1.0.16" }
|
||||
solana-measure = { path = "../measure", version = "1.0.16" }
|
||||
solana-net-utils = { path = "../net-utils", version = "1.0.16" }
|
||||
solana-runtime = { path = "../runtime", version = "1.0.16" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
solana-move-loader-program = { path = "../programs/move_loader", version = "1.0.16", optional = true }
|
||||
|
||||
[dev-dependencies]
|
||||
serial_test = "0.3.2"
|
||||
serial_test_derive = "0.4.0"
|
||||
solana-local-cluster = { path = "../local-cluster", version = "1.0.14" }
|
||||
solana-local-cluster = { path = "../local-cluster", version = "1.0.16" }
|
||||
|
||||
[features]
|
||||
move = ["solana-librapay", "solana-move-loader-program"]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-chacha-cuda"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana Chacha Cuda APIs"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -10,12 +10,12 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
log = "0.4.8"
|
||||
solana-archiver-utils = { path = "../archiver-utils", version = "1.0.14" }
|
||||
solana-chacha = { path = "../chacha", version = "1.0.14" }
|
||||
solana-ledger = { path = "../ledger", version = "1.0.14" }
|
||||
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||
solana-perf = { path = "../perf", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-archiver-utils = { path = "../archiver-utils", version = "1.0.16" }
|
||||
solana-chacha = { path = "../chacha", version = "1.0.16" }
|
||||
solana-ledger = { path = "../ledger", version = "1.0.16" }
|
||||
solana-logger = { path = "../logger", version = "1.0.16" }
|
||||
solana-perf = { path = "../perf", version = "1.0.16" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
|
||||
[dev-dependencies]
|
||||
hex-literal = "0.2.1"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-chacha-sys"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana chacha-sys"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-chacha"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana Chacha APIs"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -12,11 +12,11 @@ edition = "2018"
|
||||
log = "0.4.8"
|
||||
rand = "0.6.5"
|
||||
rand_chacha = "0.1.1"
|
||||
solana-chacha-sys = { path = "../chacha-sys", version = "1.0.14" }
|
||||
solana-ledger = { path = "../ledger", version = "1.0.14" }
|
||||
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||
solana-perf = { path = "../perf", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-chacha-sys = { path = "../chacha-sys", version = "1.0.16" }
|
||||
solana-ledger = { path = "../ledger", version = "1.0.16" }
|
||||
solana-logger = { path = "../logger", version = "1.0.16" }
|
||||
solana-perf = { path = "../perf", version = "1.0.16" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
|
||||
[dev-dependencies]
|
||||
hex-literal = "0.2.1"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-clap-utils"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana utilities for the clap"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -11,8 +11,8 @@ edition = "2018"
|
||||
[dependencies]
|
||||
clap = "2.33.0"
|
||||
rpassword = "4.0"
|
||||
solana-remote-wallet = { path = "../remote-wallet", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-remote-wallet = { path = "../remote-wallet", version = "1.0.16" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
thiserror = "1.0.11"
|
||||
tiny-bip39 = "0.7.0"
|
||||
url = "2.1.0"
|
||||
|
@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-cli-config"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
|
@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-cli"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@@ -26,28 +26,28 @@ reqwest = { version = "0.10.1", default-features = false, features = ["blocking"
|
||||
serde = "1.0.104"
|
||||
serde_derive = "1.0.103"
|
||||
serde_json = "1.0.46"
|
||||
solana-budget-program = { path = "../programs/budget", version = "1.0.14" }
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||
solana-cli-config = { path = "../cli-config", version = "1.0.14" }
|
||||
solana-client = { path = "../client", version = "1.0.14" }
|
||||
solana-config-program = { path = "../programs/config", version = "1.0.14" }
|
||||
solana-faucet = { path = "../faucet", version = "1.0.14" }
|
||||
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||
solana-net-utils = { path = "../net-utils", version = "1.0.14" }
|
||||
solana-remote-wallet = { path = "../remote-wallet", version = "1.0.14" }
|
||||
solana-runtime = { path = "../runtime", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-stake-program = { path = "../programs/stake", version = "1.0.14" }
|
||||
solana-storage-program = { path = "../programs/storage", version = "1.0.14" }
|
||||
solana-vote-program = { path = "../programs/vote", version = "1.0.14" }
|
||||
solana-vote-signer = { path = "../vote-signer", version = "1.0.14" }
|
||||
solana-budget-program = { path = "../programs/budget", version = "1.0.16" }
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.16" }
|
||||
solana-cli-config = { path = "../cli-config", version = "1.0.16" }
|
||||
solana-client = { path = "../client", version = "1.0.16" }
|
||||
solana-config-program = { path = "../programs/config", version = "1.0.16" }
|
||||
solana-faucet = { path = "../faucet", version = "1.0.16" }
|
||||
solana-logger = { path = "../logger", version = "1.0.16" }
|
||||
solana-net-utils = { path = "../net-utils", version = "1.0.16" }
|
||||
solana-remote-wallet = { path = "../remote-wallet", version = "1.0.16" }
|
||||
solana-runtime = { path = "../runtime", version = "1.0.16" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
solana-stake-program = { path = "../programs/stake", version = "1.0.16" }
|
||||
solana-storage-program = { path = "../programs/storage", version = "1.0.16" }
|
||||
solana-vote-program = { path = "../programs/vote", version = "1.0.16" }
|
||||
solana-vote-signer = { path = "../vote-signer", version = "1.0.16" }
|
||||
titlecase = "1.1.0"
|
||||
thiserror = "1.0.11"
|
||||
url = "2.1.1"
|
||||
|
||||
[dev-dependencies]
|
||||
solana-core = { path = "../core", version = "1.0.14" }
|
||||
solana-budget-program = { path = "../programs/budget", version = "1.0.14" }
|
||||
solana-core = { path = "../core", version = "1.0.16" }
|
||||
solana-budget-program = { path = "../programs/budget", version = "1.0.16" }
|
||||
tempfile = "3.1.0"
|
||||
|
||||
[[bin]]
|
||||
|
@@ -405,6 +405,7 @@ pub enum CliCommand {
|
||||
to: Pubkey,
|
||||
from: SignerIndex,
|
||||
sign_only: bool,
|
||||
no_wait: bool,
|
||||
blockhash_query: BlockhashQuery,
|
||||
nonce_account: Option<Pubkey>,
|
||||
nonce_authority: SignerIndex,
|
||||
@@ -902,6 +903,7 @@ pub fn parse_command(
|
||||
let lamports = lamports_of_sol(matches, "amount").unwrap();
|
||||
let to = pubkey_of_signer(matches, "to", wallet_manager)?.unwrap();
|
||||
let sign_only = matches.is_present(SIGN_ONLY_ARG.name);
|
||||
let no_wait = matches.is_present("no_wait");
|
||||
let blockhash_query = BlockhashQuery::new_from_matches(matches);
|
||||
let nonce_account = pubkey_of_signer(matches, NONCE_ARG.name, wallet_manager)?;
|
||||
let (nonce_authority, nonce_authority_pubkey) =
|
||||
@@ -927,6 +929,7 @@ pub fn parse_command(
|
||||
lamports,
|
||||
to,
|
||||
sign_only,
|
||||
no_wait,
|
||||
blockhash_query,
|
||||
nonce_account,
|
||||
nonce_authority: signer_info.index_of(nonce_authority_pubkey).unwrap(),
|
||||
@@ -1488,6 +1491,7 @@ fn process_transfer(
|
||||
to: &Pubkey,
|
||||
from: SignerIndex,
|
||||
sign_only: bool,
|
||||
no_wait: bool,
|
||||
blockhash_query: &BlockhashQuery,
|
||||
nonce_account: Option<&Pubkey>,
|
||||
nonce_authority: SignerIndex,
|
||||
@@ -1534,7 +1538,11 @@ fn process_transfer(
|
||||
&fee_calculator,
|
||||
&tx.message,
|
||||
)?;
|
||||
let result = rpc_client.send_and_confirm_transaction_with_spinner(&mut tx, &config.signers);
|
||||
let result = if no_wait {
|
||||
rpc_client.send_transaction(&tx)
|
||||
} else {
|
||||
rpc_client.send_and_confirm_transaction_with_spinner(&mut tx, &config.signers)
|
||||
};
|
||||
log_instruction_custom_error::<SystemError>(result)
|
||||
}
|
||||
}
|
||||
@@ -2080,6 +2088,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult {
|
||||
to,
|
||||
from,
|
||||
sign_only,
|
||||
no_wait,
|
||||
ref blockhash_query,
|
||||
ref nonce_account,
|
||||
nonce_authority,
|
||||
@@ -2091,6 +2100,7 @@ pub fn process_command(config: &CliConfig) -> ProcessResult {
|
||||
to,
|
||||
*from,
|
||||
*sign_only,
|
||||
*no_wait,
|
||||
blockhash_query,
|
||||
nonce_account.as_ref(),
|
||||
*nonce_authority,
|
||||
@@ -2497,6 +2507,12 @@ pub fn app<'ab, 'v>(name: &str, about: &'ab str, version: &'v str) -> App<'ab, '
|
||||
.validator(is_valid_signer)
|
||||
.help("Source account of funds (if different from client local account)"),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name("no_wait")
|
||||
.long("no-wait")
|
||||
.takes_value(false)
|
||||
.help("Return signature immediately after submitting the transaction, instead of waiting for confirmations"),
|
||||
)
|
||||
.offline_args()
|
||||
.arg(nonce_arg())
|
||||
.arg(nonce_authority_arg())
|
||||
@@ -3557,6 +3573,33 @@ mod tests {
|
||||
to: to_pubkey,
|
||||
from: 0,
|
||||
sign_only: false,
|
||||
no_wait: false,
|
||||
blockhash_query: BlockhashQuery::All(blockhash_query::Source::Cluster),
|
||||
nonce_account: None,
|
||||
nonce_authority: 0,
|
||||
fee_payer: 0,
|
||||
},
|
||||
signers: vec![read_keypair_file(&default_keypair_file).unwrap().into()],
|
||||
}
|
||||
);
|
||||
|
||||
// Test Transfer no-wait
|
||||
let test_transfer = test_commands.clone().get_matches_from(vec![
|
||||
"test",
|
||||
"transfer",
|
||||
"--no-wait",
|
||||
&to_string,
|
||||
"42",
|
||||
]);
|
||||
assert_eq!(
|
||||
parse_command(&test_transfer, &default_keypair_file, None).unwrap(),
|
||||
CliCommandInfo {
|
||||
command: CliCommand::Transfer {
|
||||
lamports: 42_000_000_000,
|
||||
to: to_pubkey,
|
||||
from: 0,
|
||||
sign_only: false,
|
||||
no_wait: true,
|
||||
blockhash_query: BlockhashQuery::All(blockhash_query::Source::Cluster),
|
||||
nonce_account: None,
|
||||
nonce_authority: 0,
|
||||
@@ -3586,6 +3629,7 @@ mod tests {
|
||||
to: to_pubkey,
|
||||
from: 0,
|
||||
sign_only: true,
|
||||
no_wait: false,
|
||||
blockhash_query: BlockhashQuery::None(blockhash),
|
||||
nonce_account: None,
|
||||
nonce_authority: 0,
|
||||
@@ -3620,6 +3664,7 @@ mod tests {
|
||||
to: to_pubkey,
|
||||
from: 0,
|
||||
sign_only: false,
|
||||
no_wait: false,
|
||||
blockhash_query: BlockhashQuery::FeeCalculator(
|
||||
blockhash_query::Source::Cluster,
|
||||
blockhash
|
||||
@@ -3658,6 +3703,7 @@ mod tests {
|
||||
to: to_pubkey,
|
||||
from: 0,
|
||||
sign_only: false,
|
||||
no_wait: false,
|
||||
blockhash_query: BlockhashQuery::FeeCalculator(
|
||||
blockhash_query::Source::NonceAccount(nonce_address),
|
||||
blockhash
|
||||
|
@@ -338,6 +338,7 @@ fn test_create_account_with_seed() {
|
||||
to: to_address,
|
||||
from: 0,
|
||||
sign_only: true,
|
||||
no_wait: false,
|
||||
blockhash_query: BlockhashQuery::None(nonce_hash),
|
||||
nonce_account: Some(nonce_address),
|
||||
nonce_authority: 0,
|
||||
@@ -358,6 +359,7 @@ fn test_create_account_with_seed() {
|
||||
to: to_address,
|
||||
from: 0,
|
||||
sign_only: false,
|
||||
no_wait: false,
|
||||
blockhash_query: BlockhashQuery::FeeCalculator(
|
||||
blockhash_query::Source::NonceAccount(nonce_address),
|
||||
sign_only.blockhash,
|
||||
|
@@ -68,6 +68,7 @@ fn test_transfer() {
|
||||
to: recipient_pubkey,
|
||||
from: 0,
|
||||
sign_only: false,
|
||||
no_wait: false,
|
||||
blockhash_query: BlockhashQuery::All(blockhash_query::Source::Cluster),
|
||||
nonce_account: None,
|
||||
nonce_authority: 0,
|
||||
@@ -95,6 +96,7 @@ fn test_transfer() {
|
||||
to: recipient_pubkey,
|
||||
from: 0,
|
||||
sign_only: true,
|
||||
no_wait: false,
|
||||
blockhash_query: BlockhashQuery::None(blockhash),
|
||||
nonce_account: None,
|
||||
nonce_authority: 0,
|
||||
@@ -110,6 +112,7 @@ fn test_transfer() {
|
||||
to: recipient_pubkey,
|
||||
from: 0,
|
||||
sign_only: false,
|
||||
no_wait: false,
|
||||
blockhash_query: BlockhashQuery::FeeCalculator(blockhash_query::Source::Cluster, blockhash),
|
||||
nonce_account: None,
|
||||
nonce_authority: 0,
|
||||
@@ -147,6 +150,7 @@ fn test_transfer() {
|
||||
to: recipient_pubkey,
|
||||
from: 0,
|
||||
sign_only: false,
|
||||
no_wait: false,
|
||||
blockhash_query: BlockhashQuery::FeeCalculator(
|
||||
blockhash_query::Source::NonceAccount(nonce_account.pubkey()),
|
||||
nonce_hash,
|
||||
@@ -187,6 +191,7 @@ fn test_transfer() {
|
||||
to: recipient_pubkey,
|
||||
from: 0,
|
||||
sign_only: true,
|
||||
no_wait: false,
|
||||
blockhash_query: BlockhashQuery::None(nonce_hash),
|
||||
nonce_account: Some(nonce_account.pubkey()),
|
||||
nonce_authority: 0,
|
||||
@@ -202,6 +207,7 @@ fn test_transfer() {
|
||||
to: recipient_pubkey,
|
||||
from: 0,
|
||||
sign_only: false,
|
||||
no_wait: false,
|
||||
blockhash_query: BlockhashQuery::FeeCalculator(
|
||||
blockhash_query::Source::NonceAccount(nonce_account.pubkey()),
|
||||
sign_only.blockhash,
|
||||
@@ -269,6 +275,7 @@ fn test_transfer_multisession_signing() {
|
||||
to: to_pubkey,
|
||||
from: 1,
|
||||
sign_only: true,
|
||||
no_wait: false,
|
||||
blockhash_query: BlockhashQuery::None(blockhash),
|
||||
nonce_account: None,
|
||||
nonce_authority: 0,
|
||||
@@ -293,6 +300,7 @@ fn test_transfer_multisession_signing() {
|
||||
to: to_pubkey,
|
||||
from: 1,
|
||||
sign_only: true,
|
||||
no_wait: false,
|
||||
blockhash_query: BlockhashQuery::None(blockhash),
|
||||
nonce_account: None,
|
||||
nonce_authority: 0,
|
||||
@@ -314,6 +322,7 @@ fn test_transfer_multisession_signing() {
|
||||
to: to_pubkey,
|
||||
from: 1,
|
||||
sign_only: false,
|
||||
no_wait: false,
|
||||
blockhash_query: BlockhashQuery::FeeCalculator(blockhash_query::Source::Cluster, blockhash),
|
||||
nonce_account: None,
|
||||
nonce_authority: 0,
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-client"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana Client"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -19,10 +19,10 @@ reqwest = { version = "0.10.1", default-features = false, features = ["blocking"
|
||||
serde = "1.0.104"
|
||||
serde_derive = "1.0.103"
|
||||
serde_json = "1.0.46"
|
||||
solana-net-utils = { path = "../net-utils", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-transaction-status = { path = "../transaction-status", version = "1.0.14" }
|
||||
solana-vote-program = { path = "../programs/vote", version = "1.0.14" }
|
||||
solana-net-utils = { path = "../net-utils", version = "1.0.16" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
solana-transaction-status = { path = "../transaction-status", version = "1.0.16" }
|
||||
solana-vote-program = { path = "../programs/vote", version = "1.0.16" }
|
||||
thiserror = "1.0"
|
||||
tungstenite = "0.10.1"
|
||||
url = "2.1.1"
|
||||
@@ -31,4 +31,4 @@ url = "2.1.1"
|
||||
assert_matches = "1.3.0"
|
||||
jsonrpc-core = "14.0.5"
|
||||
jsonrpc-http-server = "14.0.6"
|
||||
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||
solana-logger = { path = "../logger", version = "1.0.16" }
|
||||
|
@@ -1,7 +1,7 @@
|
||||
[package]
|
||||
name = "solana-core"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
documentation = "https://docs.rs/solana"
|
||||
homepage = "https://solana.com/"
|
||||
readme = "../README.md"
|
||||
@@ -43,34 +43,34 @@ regex = "1.3.4"
|
||||
serde = "1.0.104"
|
||||
serde_derive = "1.0.103"
|
||||
serde_json = "1.0.46"
|
||||
solana-budget-program = { path = "../programs/budget", version = "1.0.14" }
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||
solana-client = { path = "../client", version = "1.0.14" }
|
||||
solana-transaction-status = { path = "../transaction-status", version = "1.0.14" }
|
||||
solana-faucet = { path = "../faucet", version = "1.0.14" }
|
||||
solana-budget-program = { path = "../programs/budget", version = "1.0.16" }
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.16" }
|
||||
solana-client = { path = "../client", version = "1.0.16" }
|
||||
solana-transaction-status = { path = "../transaction-status", version = "1.0.16" }
|
||||
solana-faucet = { path = "../faucet", version = "1.0.16" }
|
||||
ed25519-dalek = "=1.0.0-pre.1"
|
||||
solana-ledger = { path = "../ledger", version = "1.0.14" }
|
||||
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||
solana-merkle-tree = { path = "../merkle-tree", version = "1.0.14" }
|
||||
solana-metrics = { path = "../metrics", version = "1.0.14" }
|
||||
solana-measure = { path = "../measure", version = "1.0.14" }
|
||||
solana-net-utils = { path = "../net-utils", version = "1.0.14" }
|
||||
solana-chacha-cuda = { path = "../chacha-cuda", version = "1.0.14" }
|
||||
solana-perf = { path = "../perf", version = "1.0.14" }
|
||||
solana-runtime = { path = "../runtime", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-stake-program = { path = "../programs/stake", version = "1.0.14" }
|
||||
solana-storage-program = { path = "../programs/storage", version = "1.0.14" }
|
||||
solana-vote-program = { path = "../programs/vote", version = "1.0.14" }
|
||||
solana-vote-signer = { path = "../vote-signer", version = "1.0.14" }
|
||||
solana-sys-tuner = { path = "../sys-tuner", version = "1.0.14" }
|
||||
solana-ledger = { path = "../ledger", version = "1.0.16" }
|
||||
solana-logger = { path = "../logger", version = "1.0.16" }
|
||||
solana-merkle-tree = { path = "../merkle-tree", version = "1.0.16" }
|
||||
solana-metrics = { path = "../metrics", version = "1.0.16" }
|
||||
solana-measure = { path = "../measure", version = "1.0.16" }
|
||||
solana-net-utils = { path = "../net-utils", version = "1.0.16" }
|
||||
solana-chacha-cuda = { path = "../chacha-cuda", version = "1.0.16" }
|
||||
solana-perf = { path = "../perf", version = "1.0.16" }
|
||||
solana-runtime = { path = "../runtime", version = "1.0.16" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
solana-stake-program = { path = "../programs/stake", version = "1.0.16" }
|
||||
solana-storage-program = { path = "../programs/storage", version = "1.0.16" }
|
||||
solana-vote-program = { path = "../programs/vote", version = "1.0.16" }
|
||||
solana-vote-signer = { path = "../vote-signer", version = "1.0.16" }
|
||||
solana-sys-tuner = { path = "../sys-tuner", version = "1.0.16" }
|
||||
tempfile = "3.1.0"
|
||||
thiserror = "1.0"
|
||||
tokio = "0.1"
|
||||
tokio-codec = "0.1"
|
||||
tokio-fs = "0.1"
|
||||
tokio-io = "0.1"
|
||||
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.14" }
|
||||
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.16" }
|
||||
trees = "0.2.1"
|
||||
|
||||
[dev-dependencies]
|
||||
|
@@ -13,15 +13,18 @@ use std::thread;
|
||||
use std::thread::{Builder, JoinHandle};
|
||||
use std::time::Duration;
|
||||
|
||||
// - To try and keep the RocksDB size under 512GB:
|
||||
// Seeing about 1600b/shred, using 2000b/shred for margin, so 250m shreds can be stored in 512gb.
|
||||
// at 5k shreds/slot at 50k tps, this is 500k slots (~5.5 hours).
|
||||
// - To try and keep the RocksDB size under 400GB:
|
||||
// Seeing about 1600b/shred, using 2000b/shred for margin, so 200m shreds can be stored in 400gb.
|
||||
// at 5k shreds/slot at 50k tps, this is 500k slots (~5 hours).
|
||||
// At idle, 60 shreds/slot this is about 4m slots (18 days)
|
||||
// This is chosen to allow enough time for
|
||||
// - A validator to download a snapshot from a peer and boot from it
|
||||
// - To make sure that if a validator needs to reboot from its own snapshot, it has enough slots locally
|
||||
// to catch back up to where it was when it stopped
|
||||
pub const DEFAULT_MAX_LEDGER_SHREDS: u64 = 250_000_000;
|
||||
pub const DEFAULT_MAX_LEDGER_SHREDS: u64 = 200_000_000;
|
||||
|
||||
// Allow down to 50m, or 3.5 days at idle, 1hr at 50k load, around ~100GB
|
||||
pub const DEFAULT_MIN_MAX_LEDGER_SHREDS: u64 = 50_000_000;
|
||||
|
||||
// Check for removing slots at this interval so we don't purge too often
|
||||
// and starve other blockstore users.
|
||||
|
@@ -24,7 +24,9 @@ use solana_sdk::{
|
||||
timing::slot_duration_from_slots_per_year,
|
||||
transaction::{self, Transaction},
|
||||
};
|
||||
use solana_transaction_status::{ConfirmedBlock, TransactionEncoding, TransactionStatus};
|
||||
use solana_transaction_status::{
|
||||
ConfirmedBlock, ConfirmedTransaction, TransactionEncoding, TransactionStatus,
|
||||
};
|
||||
use solana_vote_program::vote_state::{VoteState, MAX_LOCKOUT_HISTORY};
|
||||
use std::{
|
||||
collections::HashMap,
|
||||
@@ -36,6 +38,7 @@ use std::{
|
||||
};
|
||||
|
||||
const MAX_QUERY_ITEMS: usize = 256;
|
||||
const MAX_SLOT_RANGE: u64 = 10_000;
|
||||
|
||||
type RpcResponse<T> = Result<Response<T>>;
|
||||
|
||||
@@ -503,6 +506,37 @@ impl JsonRpcRequestProcessor {
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
pub fn get_confirmed_transaction(
|
||||
&self,
|
||||
signature: Signature,
|
||||
encoding: Option<TransactionEncoding>,
|
||||
) -> Result<Option<ConfirmedTransaction>> {
|
||||
if self.config.enable_rpc_transaction_history {
|
||||
Ok(self
|
||||
.blockstore
|
||||
.get_confirmed_transaction(signature, encoding)
|
||||
.unwrap_or(None))
|
||||
} else {
|
||||
Ok(None)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_confirmed_signatures_for_address(
|
||||
&self,
|
||||
pubkey: Pubkey,
|
||||
start_slot: Slot,
|
||||
end_slot: Slot,
|
||||
) -> Result<Vec<Signature>> {
|
||||
if self.config.enable_rpc_transaction_history {
|
||||
Ok(self
|
||||
.blockstore
|
||||
.get_confirmed_signatures_for_address(pubkey, start_slot, end_slot)
|
||||
.unwrap_or_else(|_| vec![]))
|
||||
} else {
|
||||
Ok(vec![])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn get_tpu_addr(cluster_info: &Arc<RwLock<ClusterInfo>>) -> Result<SocketAddr> {
|
||||
@@ -744,6 +778,23 @@ pub trait RpcSol {
|
||||
start_slot: Slot,
|
||||
end_slot: Option<Slot>,
|
||||
) -> Result<Vec<Slot>>;
|
||||
|
||||
#[rpc(meta, name = "getConfirmedTransaction")]
|
||||
fn get_confirmed_transaction(
|
||||
&self,
|
||||
meta: Self::Metadata,
|
||||
signature_str: String,
|
||||
encoding: Option<TransactionEncoding>,
|
||||
) -> Result<Option<ConfirmedTransaction>>;
|
||||
|
||||
#[rpc(meta, name = "getConfirmedSignaturesForAddress")]
|
||||
fn get_confirmed_signatures_for_address(
|
||||
&self,
|
||||
meta: Self::Metadata,
|
||||
pubkey_str: String,
|
||||
start_slot: Slot,
|
||||
end_slot: Slot,
|
||||
) -> Result<Vec<String>>;
|
||||
}
|
||||
|
||||
pub struct RpcSolImpl;
|
||||
@@ -1287,6 +1338,51 @@ impl RpcSol for RpcSolImpl {
|
||||
fn get_block_time(&self, meta: Self::Metadata, slot: Slot) -> Result<Option<UnixTimestamp>> {
|
||||
meta.request_processor.read().unwrap().get_block_time(slot)
|
||||
}
|
||||
|
||||
fn get_confirmed_transaction(
|
||||
&self,
|
||||
meta: Self::Metadata,
|
||||
signature_str: String,
|
||||
encoding: Option<TransactionEncoding>,
|
||||
) -> Result<Option<ConfirmedTransaction>> {
|
||||
let signature = verify_signature(&signature_str)?;
|
||||
meta.request_processor
|
||||
.read()
|
||||
.unwrap()
|
||||
.get_confirmed_transaction(signature, encoding)
|
||||
}
|
||||
|
||||
fn get_confirmed_signatures_for_address(
|
||||
&self,
|
||||
meta: Self::Metadata,
|
||||
pubkey_str: String,
|
||||
start_slot: Slot,
|
||||
end_slot: Slot,
|
||||
) -> Result<Vec<String>> {
|
||||
let pubkey = verify_pubkey(pubkey_str)?;
|
||||
if end_slot <= start_slot {
|
||||
return Err(Error::invalid_params(format!(
|
||||
"start_slot {} must be smaller than end_slot {}",
|
||||
start_slot, end_slot
|
||||
)));
|
||||
}
|
||||
if end_slot - start_slot > MAX_SLOT_RANGE {
|
||||
return Err(Error::invalid_params(format!(
|
||||
"Slot range too large; max {}",
|
||||
MAX_SLOT_RANGE
|
||||
)));
|
||||
}
|
||||
meta.request_processor
|
||||
.read()
|
||||
.unwrap()
|
||||
.get_confirmed_signatures_for_address(pubkey, start_slot, end_slot)
|
||||
.map(|signatures| {
|
||||
signatures
|
||||
.iter()
|
||||
.map(|signature| signature.to_string())
|
||||
.collect()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
|
@@ -70,9 +70,14 @@ impl TransactionStatusService {
|
||||
}
|
||||
.expect("FeeCalculator must exist");
|
||||
let fee = fee_calculator.calculate_fee(transaction.message());
|
||||
let (writable_keys, readonly_keys) =
|
||||
transaction.message.get_account_keys_by_lock_type();
|
||||
blockstore
|
||||
.write_transaction_status(
|
||||
(transaction.signatures[0], slot),
|
||||
slot,
|
||||
transaction.signatures[0],
|
||||
writable_keys,
|
||||
readonly_keys,
|
||||
&TransactionStatusMeta {
|
||||
status,
|
||||
fee,
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-crate-features"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana Crate Features"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 25 KiB |
Binary file not shown.
Before Width: | Height: | Size: 120 KiB |
Binary file not shown.
Before Width: | Height: | Size: 30 KiB |
Binary file not shown.
Before Width: | Height: | Size: 83 KiB |
@@ -21,6 +21,8 @@ To interact with a Solana node inside a JavaScript application, use the [solana-
|
||||
* [getClusterNodes](jsonrpc-api.md#getclusternodes)
|
||||
* [getConfirmedBlock](jsonrpc-api.md#getconfirmedblock)
|
||||
* [getConfirmedBlocks](jsonrpc-api.md#getconfirmedblocks)
|
||||
* [getConfirmedSignaturesForAddress](jsonrpc-api.md#getconfirmedsignaturesforaddress)
|
||||
* [getConfirmedTransaction](jsonrpc-api.md#getconfirmedtransaction)
|
||||
* [getEpochInfo](jsonrpc-api.md#getepochinfo)
|
||||
* [getEpochSchedule](jsonrpc-api.md#getepochschedule)
|
||||
* [getFeeCalculatorForBlockhash](jsonrpc-api.md#getfeecalculatorforblockhash)
|
||||
@@ -345,6 +347,72 @@ curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc": "2.0","id":1,"m
|
||||
{"jsonrpc":"2.0","result":[5,6,7,8,9,10],"id":1}
|
||||
```
|
||||
|
||||
### getConfirmedSignaturesForAddress
|
||||
|
||||
Returns a list of all the confirmed signatures for transactions involving an address, within a specified Slot range. Max range allowed is 10_000 Slots.
|
||||
|
||||
#### Parameters:
|
||||
|
||||
* `<string>` - account address as base-58 encoded string
|
||||
* `<u64>` - start slot, inclusive
|
||||
* `<u64>` - end slot, inclusive
|
||||
|
||||
#### Results:
|
||||
|
||||
The result field will be an array of:
|
||||
* `<string>` - transaction signature as base-58 encoded string
|
||||
|
||||
The signatures will be ordered based on the Slot in which they were confirmed in, from lowest to highest Slot
|
||||
|
||||
#### Example:
|
||||
|
||||
```bash
|
||||
// Request
|
||||
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc": "2.0","id":1,"method":"getConfirmedSignaturesForAddress","params":["6H94zdiaYfRfPfKjYLjyr2VFBg6JHXygy84r3qhc3NsC", 0, 100]}' localhost:8899
|
||||
|
||||
// Result
|
||||
{"jsonrpc":"2.0","result":{["35YGay1Lwjwgxe9zaH6APSHbt9gYQUCtBWTNL3aVwVGn9xTFw2fgds7qK5AL29mP63A9j3rh8KpN1TgSR62XCaby","4bJdGN8Tt2kLWZ3Fa1dpwPSEkXWWTSszPSf1rRVsCwNjxbbUdwTeiWtmi8soA26YmwnKD4aAxNp8ci1Gjpdv4gsr","4LQ14a7BYY27578Uj8LPCaVhSdJGLn9DJqnUJHpy95FMqdKf9acAhUhecPQNjNUy6VoNFUbvwYkPociFSf87cWbG"]},"id":1}
|
||||
```
|
||||
|
||||
### getConfirmedTransaction
|
||||
|
||||
Returns transaction details for a confirmed transaction
|
||||
|
||||
#### Parameters:
|
||||
|
||||
* `<string>` - transaction signature as base-58 encoded string
|
||||
* `<string>` - (optional) encoding for the returned Transaction, either "json" or "binary". If not provided, the default encoding is JSON.
|
||||
|
||||
#### Results:
|
||||
|
||||
The result field will be an object with the following fields:
|
||||
* `slot: <u64>` - the slot this transaction was processed in
|
||||
* `transaction: <object|string>` - [Transaction](#transaction-structure) object, either in JSON format or base-58 encoded binary data, depending on encoding parameter
|
||||
* `meta: <object>` - transaction status metadata object, containing `null` or:
|
||||
* `err: <object | null>` - Error if transaction failed, null if transaction succeeded. [TransactionError definitions](https://github.com/solana-labs/solana/blob/master/sdk/src/transaction.rs#L14)
|
||||
* `fee: <u64>` - fee this transaction was charged, as u64 integer
|
||||
* `preBalances: <array>` - array of u64 account balances from before the transaction was processed
|
||||
* `postBalances: <array>` - array of u64 account balances after the transaction was processed
|
||||
* DEPRECATED: `status: <object>` - Transaction status
|
||||
* `"Ok": <null>` - Transaction was successful
|
||||
* `"Err": <ERR>` - Transaction failed with TransactionError
|
||||
|
||||
#### Example:
|
||||
|
||||
```bash
|
||||
// Request
|
||||
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc": "2.0","id":1,"method":"getConfirmedTransaction","params":["35YGay1Lwjwgxe9zaH6APSHbt9gYQUCtBWTNL3aVwVGn9xTFw2fgds7qK5AL29mP63A9j3rh8KpN1TgSR62XCaby", "json"]}' localhost:8899
|
||||
|
||||
// Result
|
||||
{"jsonrpc":"2.0","result":{"slot":430,"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":{"err":null,"fee":18000,"postBalances":[499999972500,15298080,1,1,1],"preBalances":[499999990500,15298080,1,1,1],"status":{"Ok":null}}},"id":1}
|
||||
|
||||
// Request
|
||||
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc": "2.0","id":1,"method":"getConfirmedTransaction","params":["35YGay1Lwjwgxe9zaH6APSHbt9gYQUCtBWTNL3aVwVGn9xTFw2fgds7qK5AL29mP63A9j3rh8KpN1TgSR62XCaby", "binary"]}' localhost:8899
|
||||
|
||||
// Result
|
||||
{"jsonrpc":"2.0","result":{"slot":430,"transaction":"81UZJt4dh4Do66jDhrgkQudS8J2N6iG3jaVav7gJrqJSFY4Ug53iA9JFJZh2gxKWcaFdLJwhHx9mRdg9JwDAWB4ywiu5154CRwXV4FMdnPLg7bhxRLwhhYaLsVgMF5AyNRcTzjCVoBvqFgDU7P8VEKDEiMvD3qxzm1pLZVxDG1LTQpT3Dz4Uviv4KQbFQNuC22KupBoyHFB7Zh6KFdMqux4M9PvhoqcoJsJKwXjWpKu7xmEKnnrSbfLadkgjBmmjhW3fdTrFvnhQdTkhtdJxUL1xS9GMuJQer8YgSKNtUXB1eXZQwXU8bU2BjYkZE6Q5Xww8hu9Z4E4Mo4QsooVtHoP6BM3NKw8zjVbWfoCQqxTrwuSzrNCWCWt58C24LHecH67CTt2uXbYSviixvrYkK7A3t68BxTJcF1dXJitEPTFe2ceTkauLJqrJgnER4iUrsjr26T8YgWvpY9wkkWFSviQW6wV5RASTCUasVEcrDiaKj8EQMkgyDoe9HyKitSVg67vMWJFpUXpQobseWJUs5FTWWzmfHmFp8FZ","meta":{"err":null,"fee":18000,"postBalances":[499999972500,15298080,1,1,1],"preBalances":[499999990500,15298080,1,1,1],"status":{"Ok":null}}},"id":1}
|
||||
```
|
||||
|
||||
### getEpochInfo
|
||||
|
||||
Returns information about the current epoch
|
||||
@@ -872,7 +940,7 @@ The result field will be a JSON object with the following fields:
|
||||
// Request
|
||||
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":1, "method":"getVersion"}' http://localhost:8899
|
||||
// Result
|
||||
{"jsonrpc":"2.0","result":{"solana-core": "1.0.14"},"id":1}
|
||||
{"jsonrpc":"2.0","result":{"solana-core": "1.0.16"},"id":1}
|
||||
```
|
||||
|
||||
### getVoteAccounts
|
||||
|
@@ -171,7 +171,7 @@ $ solana send-timestamp <PUBKEY> <PROCESS_ID> --date 2018-12-24T23:59:00
|
||||
## Usage
|
||||
### solana-cli
|
||||
```text
|
||||
solana-cli 1.0.14 [channel=unknown commit=unknown]
|
||||
solana-cli 1.0.16 [channel=unknown commit=unknown]
|
||||
Blockchain, Rebuilt for Scale
|
||||
|
||||
USAGE:
|
||||
|
@@ -5,50 +5,18 @@ simplest way for most users to get started with a Solana wallet.
|
||||
## Install Trust Wallet
|
||||
|
||||
#### iOS
|
||||
|
||||
- Open the App Store
|
||||
- Download “Trust: Crypto & Bitcoin Wallet” from Six Days LLC
|
||||
- Requires iOS 13.0 or higher
|
||||
- Open Trust Wallet and follow the app prompts to get started
|
||||
|
||||
***
|
||||
|
||||
#### Android
|
||||
|
||||
**NOTE: At this time, Solana's SOL tokens are only supported in the Beta version
|
||||
of Trust Wallet for Android. The following steps explain how to install this
|
||||
Beta version to start using your Solana wallet. Check back here or check the
|
||||
latest official Trust Wallet release notes for when support is added to their
|
||||
official Android release.**
|
||||
|
||||
- Open the Play Store
|
||||
- Download the official version of Trust Wallet
|
||||
- “Trust: Crypto & Bitcoin Wallet” from Six Days LLC
|
||||
- Download “Trust Crypto Wallet” from Six Days LLC
|
||||
- Requires Android 6.0 or higher
|
||||
|
||||

|
||||
|
||||
##### Enable Beta version of Trust Wallet
|
||||
- Make sure you already have the official version installed
|
||||
- Open Play Store and view Trust Wallet's app page
|
||||
- Scroll down to the bottom to the "Beta" section and tap "Join"
|
||||
- It may take a few minutes for your device to get access to the Beta version
|
||||
|
||||

|
||||
|
||||
##### Upgrade to the Beta version
|
||||
- Open Play Store .
|
||||
- Tap Menu --> My apps and games --> Beta.
|
||||
- Tap Trust Wallet
|
||||
- Tap Upgrade when brought back to the Trust Wallet (Beta) install page
|
||||
|
||||

|
||||
|
||||
***
|
||||
|
||||

|
||||
|
||||
##### Beta Install Support for Android
|
||||
- [Google's Official Help for Installing Beta Versions of Apps](https://support.google.com/googleplay/answer/7003180?hl=en)
|
||||
- Open Trust Wallet and follow the app prompts to get started
|
||||
|
||||
## Add Solana (SOL) tokens to your wallet
|
||||
- From the main page, go to the “Tokens” tab at the top of the screen
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-faucet"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana Faucet"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -19,10 +19,10 @@ clap = "2.33"
|
||||
log = "0.4.8"
|
||||
serde = "1.0.104"
|
||||
serde_derive = "1.0.103"
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||
solana-metrics = { path = "../metrics", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.16" }
|
||||
solana-logger = { path = "../logger", version = "1.0.16" }
|
||||
solana-metrics = { path = "../metrics", version = "1.0.16" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
tokio = "0.1"
|
||||
tokio-codec = "0.1"
|
||||
|
||||
|
@@ -21,10 +21,20 @@ if [[ ! -f target/perf-libs/.$VERSION ]]; then
|
||||
(
|
||||
set -x
|
||||
cd target/perf-libs
|
||||
curl -L --retry 5 --retry-delay 2 --retry-connrefused -o solana-perf.tgz \
|
||||
https://github.com/solana-labs/solana-perf-libs/releases/download/$PERF_LIBS_VERSION/solana-perf.tgz
|
||||
|
||||
if [[ -r ~/.cache/solana-perf-$PERF_LIBS_VERSION.tgz ]]; then
|
||||
cp ~/.cache/solana-perf-$PERF_LIBS_VERSION.tgz solana-perf.tgz
|
||||
else
|
||||
curl -L --retry 5 --retry-delay 2 --retry-connrefused -o solana-perf.tgz \
|
||||
https://github.com/solana-labs/solana-perf-libs/releases/download/$PERF_LIBS_VERSION/solana-perf.tgz
|
||||
fi
|
||||
tar zxvf solana-perf.tgz
|
||||
rm -f solana-perf.tgz
|
||||
|
||||
if [[ ! -r ~/.cache/solana-perf-$PERF_LIBS_VERSION.tgz ]]; then
|
||||
# Save it for next time
|
||||
mkdir -p ~/.cache
|
||||
mv solana-perf.tgz ~/.cache/solana-perf-$PERF_LIBS_VERSION.tgz
|
||||
fi
|
||||
touch .$VERSION
|
||||
)
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-genesis-programs"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana genesis programs"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -10,16 +10,16 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
log = { version = "0.4.8" }
|
||||
solana-bpf-loader-program = { path = "../programs/bpf_loader", version = "1.0.14" }
|
||||
solana-budget-program = { path = "../programs/budget", version = "1.0.14" }
|
||||
solana-config-program = { path = "../programs/config", version = "1.0.14" }
|
||||
solana-exchange-program = { path = "../programs/exchange", version = "1.0.14" }
|
||||
solana-runtime = { path = "../runtime", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-stake-program = { path = "../programs/stake", version = "1.0.14" }
|
||||
solana-storage-program = { path = "../programs/storage", version = "1.0.14" }
|
||||
solana-vest-program = { path = "../programs/vest", version = "1.0.14" }
|
||||
solana-vote-program = { path = "../programs/vote", version = "1.0.14" }
|
||||
solana-bpf-loader-program = { path = "../programs/bpf_loader", version = "1.0.16" }
|
||||
solana-budget-program = { path = "../programs/budget", version = "1.0.16" }
|
||||
solana-config-program = { path = "../programs/config", version = "1.0.16" }
|
||||
solana-exchange-program = { path = "../programs/exchange", version = "1.0.16" }
|
||||
solana-runtime = { path = "../runtime", version = "1.0.16" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
solana-stake-program = { path = "../programs/stake", version = "1.0.16" }
|
||||
solana-storage-program = { path = "../programs/storage", version = "1.0.16" }
|
||||
solana-vest-program = { path = "../programs/vest", version = "1.0.16" }
|
||||
solana-vote-program = { path = "../programs/vote", version = "1.0.16" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib"]
|
||||
|
@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-genesis"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@@ -15,13 +15,13 @@ chrono = "0.4"
|
||||
serde = "1.0.104"
|
||||
serde_json = "1.0.46"
|
||||
serde_yaml = "0.8.11"
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||
solana-genesis-programs = { path = "../genesis-programs", version = "1.0.14" }
|
||||
solana-ledger = { path = "../ledger", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-stake-program = { path = "../programs/stake", version = "1.0.14" }
|
||||
solana-storage-program = { path = "../programs/storage", version = "1.0.14" }
|
||||
solana-vote-program = { path = "../programs/vote", version = "1.0.14" }
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.16" }
|
||||
solana-genesis-programs = { path = "../genesis-programs", version = "1.0.16" }
|
||||
solana-ledger = { path = "../ledger", version = "1.0.16" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
solana-stake-program = { path = "../programs/stake", version = "1.0.16" }
|
||||
solana-storage-program = { path = "../programs/storage", version = "1.0.16" }
|
||||
solana-vote-program = { path = "../programs/vote", version = "1.0.16" }
|
||||
tempfile = "3.1.0"
|
||||
|
||||
[[bin]]
|
||||
|
@@ -3,19 +3,19 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-gossip"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
|
||||
[dependencies]
|
||||
clap = "2.33.0"
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||
solana-core = { path = "../core", version = "1.0.14" }
|
||||
solana-client = { path = "../client", version = "1.0.14" }
|
||||
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||
solana-net-utils = { path = "../net-utils", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.16" }
|
||||
solana-core = { path = "../core", version = "1.0.16" }
|
||||
solana-client = { path = "../client", version = "1.0.16" }
|
||||
solana-logger = { path = "../logger", version = "1.0.16" }
|
||||
solana-net-utils = { path = "../net-utils", version = "1.0.16" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
|
||||
|
||||
|
||||
|
@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-install"
|
||||
description = "The solana cluster software installer"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@@ -24,11 +24,11 @@ reqwest = { version = "0.10.1", default-features = false, features = ["blocking"
|
||||
serde = "1.0.104"
|
||||
serde_derive = "1.0.103"
|
||||
serde_yaml = "0.8.11"
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||
solana-client = { path = "../client", version = "1.0.14" }
|
||||
solana-config-program = { path = "../programs/config", version = "1.0.14" }
|
||||
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.16" }
|
||||
solana-client = { path = "../client", version = "1.0.16" }
|
||||
solana-config-program = { path = "../programs/config", version = "1.0.16" }
|
||||
solana-logger = { path = "../logger", version = "1.0.16" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
semver = "0.9.0"
|
||||
tar = "0.4.26"
|
||||
tempdir = "0.3.7"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-keygen"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana key generation utility"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -13,10 +13,10 @@ bs58 = "0.3.0"
|
||||
clap = "2.33"
|
||||
dirs = "2.0.2"
|
||||
num_cpus = "1.12.0"
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||
solana-cli-config = { path = "../cli-config", version = "1.0.14" }
|
||||
solana-remote-wallet = { path = "../remote-wallet", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.16" }
|
||||
solana-cli-config = { path = "../cli-config", version = "1.0.16" }
|
||||
solana-remote-wallet = { path = "../remote-wallet", version = "1.0.16" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
tiny-bip39 = "0.7.0"
|
||||
|
||||
[[bin]]
|
||||
|
@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-ledger-tool"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@@ -14,13 +14,13 @@ clap = "2.33.0"
|
||||
histogram = "*"
|
||||
serde_json = "1.0.46"
|
||||
serde_yaml = "0.8.11"
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||
solana-ledger = { path = "../ledger", version = "1.0.14" }
|
||||
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||
solana-runtime = { path = "../runtime", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-vote-program = { path = "../programs/vote", version = "1.0.14" }
|
||||
solana-stake-program = { path = "../programs/stake", version = "1.0.14" }
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.16" }
|
||||
solana-ledger = { path = "../ledger", version = "1.0.16" }
|
||||
solana-logger = { path = "../logger", version = "1.0.16" }
|
||||
solana-runtime = { path = "../runtime", version = "1.0.16" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
solana-vote-program = { path = "../programs/vote", version = "1.0.16" }
|
||||
solana-stake-program = { path = "../programs/stake", version = "1.0.16" }
|
||||
tempfile = "3.1.0"
|
||||
|
||||
[dev-dependencies]
|
||||
|
@@ -808,6 +808,12 @@ fn main() {
|
||||
.arg(&account_paths_arg)
|
||||
.arg(&halt_at_slot_arg)
|
||||
.arg(&hard_forks_arg)
|
||||
.arg(
|
||||
Arg::with_name("include_sysvars")
|
||||
.long("include-sysvars")
|
||||
.takes_value(false)
|
||||
.help("Include sysvars too"),
|
||||
)
|
||||
).subcommand(
|
||||
SubCommand::with_name("prune")
|
||||
.about("Prune the ledger at the block height")
|
||||
@@ -1090,6 +1096,7 @@ fn main() {
|
||||
..ProcessOptions::default()
|
||||
};
|
||||
let genesis_config = open_genesis_config(&ledger_path);
|
||||
let include_sysvars = arg_matches.is_present("include_sysvars");
|
||||
match load_bank_forks(arg_matches, &ledger_path, &genesis_config, process_options) {
|
||||
Ok((bank_forks, bank_forks_info, _leader_schedule_cache, _snapshot_hash)) => {
|
||||
let slot = dev_halt_at_slot.unwrap_or_else(|| {
|
||||
@@ -1105,19 +1112,23 @@ fn main() {
|
||||
exit(1);
|
||||
});
|
||||
|
||||
let accounts: Vec<_> = bank
|
||||
let accounts: BTreeMap<_, _> = bank
|
||||
.get_program_accounts(None)
|
||||
.into_iter()
|
||||
.filter(|(pubkey, _account)| !solana_sdk::sysvar::is_sysvar_id(pubkey))
|
||||
.filter(|(pubkey, _account)| {
|
||||
include_sysvars || !solana_sdk::sysvar::is_sysvar_id(pubkey)
|
||||
})
|
||||
.collect();
|
||||
|
||||
println!("---");
|
||||
for (pubkey, account) in accounts.into_iter() {
|
||||
let data_len = account.data.len();
|
||||
println!("{}:", pubkey);
|
||||
println!(" - lamports: {}", account.lamports);
|
||||
println!(" - owner: '{}'", account.owner);
|
||||
println!(" - executable: {}", account.executable);
|
||||
println!(" - data: '{}'", bs58::encode(account.data).into_string());
|
||||
println!(" - data_len: {}", data_len);
|
||||
}
|
||||
}
|
||||
Err(err) => {
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-ledger"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana ledger"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -28,19 +28,19 @@ reed-solomon-erasure = { package = "solana-reed-solomon-erasure", version = "4.0
|
||||
regex = "1.3.4"
|
||||
serde = "1.0.104"
|
||||
serde_bytes = "0.11.3"
|
||||
solana-transaction-status = { path = "../transaction-status", version = "1.0.14" }
|
||||
solana-genesis-programs = { path = "../genesis-programs", version = "1.0.14" }
|
||||
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||
solana-measure = { path = "../measure", version = "1.0.14" }
|
||||
solana-merkle-tree = { path = "../merkle-tree", version = "1.0.14" }
|
||||
solana-metrics = { path = "../metrics", version = "1.0.14" }
|
||||
solana-perf = { path = "../perf", version = "1.0.14" }
|
||||
solana-transaction-status = { path = "../transaction-status", version = "1.0.16" }
|
||||
solana-genesis-programs = { path = "../genesis-programs", version = "1.0.16" }
|
||||
solana-logger = { path = "../logger", version = "1.0.16" }
|
||||
solana-measure = { path = "../measure", version = "1.0.16" }
|
||||
solana-merkle-tree = { path = "../merkle-tree", version = "1.0.16" }
|
||||
solana-metrics = { path = "../metrics", version = "1.0.16" }
|
||||
solana-perf = { path = "../perf", version = "1.0.16" }
|
||||
ed25519-dalek = "1.0.0-pre.1"
|
||||
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.14" }
|
||||
solana-runtime = { path = "../runtime", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-stake-program = { path = "../programs/stake", version = "1.0.14" }
|
||||
solana-vote-program = { path = "../programs/vote", version = "1.0.14" }
|
||||
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.16" }
|
||||
solana-runtime = { path = "../runtime", version = "1.0.16" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
solana-stake-program = { path = "../programs/stake", version = "1.0.16" }
|
||||
solana-vote-program = { path = "../programs/vote", version = "1.0.16" }
|
||||
symlink = "0.1.0"
|
||||
tar = "0.4.26"
|
||||
thiserror = "1.0"
|
||||
@@ -57,7 +57,7 @@ features = ["lz4"]
|
||||
[dev-dependencies]
|
||||
assert_matches = "1.3.0"
|
||||
matches = "0.1.6"
|
||||
solana-budget-program = { path = "../programs/budget", version = "1.0.14" }
|
||||
solana-budget-program = { path = "../programs/budget", version = "1.0.16" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib"]
|
||||
|
@@ -37,8 +37,8 @@ use solana_sdk::{
|
||||
transaction::Transaction,
|
||||
};
|
||||
use solana_transaction_status::{
|
||||
ConfirmedBlock, EncodedTransaction, Rewards, RpcTransactionStatusMeta, TransactionEncoding,
|
||||
TransactionStatusMeta, TransactionWithStatusMeta,
|
||||
ConfirmedBlock, ConfirmedTransaction, EncodedTransaction, Rewards, RpcTransactionStatusMeta,
|
||||
TransactionEncoding, TransactionStatusMeta, TransactionWithStatusMeta,
|
||||
};
|
||||
use solana_vote_program::{vote_instruction::VoteInstruction, vote_state::TIMESTAMP_SLOT_INTERVAL};
|
||||
use std::{
|
||||
@@ -87,6 +87,7 @@ pub struct Blockstore {
|
||||
data_shred_cf: LedgerColumn<cf::ShredData>,
|
||||
code_shred_cf: LedgerColumn<cf::ShredCode>,
|
||||
transaction_status_cf: LedgerColumn<cf::TransactionStatus>,
|
||||
address_signatures_cf: LedgerColumn<cf::AddressSignatures>,
|
||||
transaction_status_index_cf: LedgerColumn<cf::TransactionStatusIndex>,
|
||||
active_transaction_status_index: RwLock<u64>,
|
||||
rewards_cf: LedgerColumn<cf::Rewards>,
|
||||
@@ -201,6 +202,7 @@ impl Blockstore {
|
||||
let data_shred_cf = db.column();
|
||||
let code_shred_cf = db.column();
|
||||
let transaction_status_cf = db.column();
|
||||
let address_signatures_cf = db.column();
|
||||
let transaction_status_index_cf = db.column();
|
||||
let rewards_cf = db.column();
|
||||
|
||||
@@ -217,7 +219,9 @@ impl Blockstore {
|
||||
// Get active transaction-status index or 0
|
||||
let active_transaction_status_index = db
|
||||
.iter::<cf::TransactionStatusIndex>(IteratorMode::Start)?
|
||||
.next()
|
||||
.next();
|
||||
let initialize_transaction_status_index = active_transaction_status_index.is_none();
|
||||
let active_transaction_status_index = active_transaction_status_index
|
||||
.and_then(|(_, data)| {
|
||||
let index0: TransactionStatusIndexMeta = deserialize(&data).unwrap();
|
||||
if index0.frozen {
|
||||
@@ -241,6 +245,7 @@ impl Blockstore {
|
||||
data_shred_cf,
|
||||
code_shred_cf,
|
||||
transaction_status_cf,
|
||||
address_signatures_cf,
|
||||
transaction_status_index_cf,
|
||||
active_transaction_status_index: RwLock::new(active_transaction_status_index),
|
||||
rewards_cf,
|
||||
@@ -251,6 +256,9 @@ impl Blockstore {
|
||||
lowest_cleanup_slot: Arc::new(RwLock::new(0)),
|
||||
no_compaction: false,
|
||||
};
|
||||
if initialize_transaction_status_index {
|
||||
blockstore.initialize_transaction_status_index()?;
|
||||
}
|
||||
Ok(blockstore)
|
||||
}
|
||||
|
||||
@@ -386,10 +394,14 @@ impl Blockstore {
|
||||
&mut w_active_transaction_status_index,
|
||||
to_slot,
|
||||
)? {
|
||||
columns_empty &= &self
|
||||
columns_empty &= self
|
||||
.db
|
||||
.delete_range_cf::<cf::TransactionStatus>(&mut write_batch, index, index + 1)
|
||||
.unwrap_or(false);
|
||||
.unwrap_or(false)
|
||||
& self
|
||||
.db
|
||||
.delete_range_cf::<cf::AddressSignatures>(&mut write_batch, index, index + 1)
|
||||
.unwrap_or(false);
|
||||
}
|
||||
let mut write_timer = Measure::start("write_batch");
|
||||
if let Err(e) = self.db.write(write_batch) {
|
||||
@@ -449,6 +461,14 @@ impl Blockstore {
|
||||
.transaction_status_cf
|
||||
.compact_range(0, 2)
|
||||
.unwrap_or(false)
|
||||
&& self
|
||||
.address_signatures_cf
|
||||
.compact_range(0, 2)
|
||||
.unwrap_or(false)
|
||||
&& self
|
||||
.transaction_status_index_cf
|
||||
.compact_range(0, 2)
|
||||
.unwrap_or(false)
|
||||
&& self
|
||||
.rewards_cf
|
||||
.compact_range(from_slot, to_slot)
|
||||
@@ -1512,8 +1532,12 @@ impl Blockstore {
|
||||
.put(1, &TransactionStatusIndexMeta::default())?;
|
||||
// This dummy status improves compaction performance
|
||||
self.transaction_status_cf.put(
|
||||
(2, Signature::default(), 0),
|
||||
cf::TransactionStatus::as_index(2),
|
||||
&TransactionStatusMeta::default(),
|
||||
)?;
|
||||
self.address_signatures_cf.put(
|
||||
cf::AddressSignatures::as_index(2),
|
||||
&AddressSignatureMeta::default(),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1564,15 +1588,11 @@ impl Blockstore {
|
||||
}
|
||||
}
|
||||
|
||||
fn make_transaction_status_index(
|
||||
fn get_primary_index(
|
||||
&self,
|
||||
index: (Signature, Slot),
|
||||
slot: Slot,
|
||||
w_active_transaction_status_index: &mut u64,
|
||||
) -> Result<(u64, Signature, Slot)> {
|
||||
let (signature, slot) = index;
|
||||
if self.transaction_status_index_cf.get(0)?.is_none() {
|
||||
self.initialize_transaction_status_index()?;
|
||||
}
|
||||
) -> Result<u64> {
|
||||
let i = *w_active_transaction_status_index;
|
||||
let mut index_meta = self.transaction_status_index_cf.get(i)?.unwrap();
|
||||
if slot > index_meta.max_slot {
|
||||
@@ -1580,7 +1600,7 @@ impl Blockstore {
|
||||
index_meta.max_slot = slot;
|
||||
self.transaction_status_index_cf.put(i, &index_meta)?;
|
||||
}
|
||||
Ok((i, signature, slot))
|
||||
Ok(i)
|
||||
}
|
||||
|
||||
pub fn read_transaction_status(
|
||||
@@ -1598,16 +1618,32 @@ impl Blockstore {
|
||||
|
||||
pub fn write_transaction_status(
|
||||
&self,
|
||||
index: (Signature, Slot),
|
||||
slot: Slot,
|
||||
signature: Signature,
|
||||
writable_keys: Vec<&Pubkey>,
|
||||
readonly_keys: Vec<&Pubkey>,
|
||||
status: &TransactionStatusMeta,
|
||||
) -> Result<()> {
|
||||
// This write lock prevents interleaving issues with the transactions_status_index_cf by
|
||||
// gating writes to that column
|
||||
// This write lock prevents interleaving issues with the transaction_status_index_cf by gating
|
||||
// writes to that column
|
||||
let mut w_active_transaction_status_index =
|
||||
self.active_transaction_status_index.write().unwrap();
|
||||
let index =
|
||||
self.make_transaction_status_index(index, &mut w_active_transaction_status_index)?;
|
||||
self.transaction_status_cf.put(index, status)
|
||||
let primary_index = self.get_primary_index(slot, &mut w_active_transaction_status_index)?;
|
||||
self.transaction_status_cf
|
||||
.put((primary_index, signature, slot), status)?;
|
||||
for address in writable_keys {
|
||||
self.address_signatures_cf.put(
|
||||
(primary_index, *address, slot, signature),
|
||||
&AddressSignatureMeta { writeable: true },
|
||||
)?;
|
||||
}
|
||||
for address in readonly_keys {
|
||||
self.address_signatures_cf.put(
|
||||
(primary_index, *address, slot, signature),
|
||||
&AddressSignatureMeta { writeable: false },
|
||||
)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
// Returns a transaction status if it was processed in a root, as well as a loop counter for
|
||||
@@ -1645,6 +1681,85 @@ impl Blockstore {
|
||||
.map(|(status, _)| status)
|
||||
}
|
||||
|
||||
/// Returns a complete transaction if it was processed in a root
|
||||
pub fn get_confirmed_transaction(
|
||||
&self,
|
||||
signature: Signature,
|
||||
encoding: Option<TransactionEncoding>,
|
||||
) -> Result<Option<ConfirmedTransaction>> {
|
||||
if let Some((slot, status)) = self.get_transaction_status(signature.clone())? {
|
||||
let transaction = self.find_transaction_in_slot(slot, signature)?
|
||||
.expect("Transaction to exist in slot entries if it exists in statuses and hasn't been cleaned up");
|
||||
let encoding = encoding.unwrap_or(TransactionEncoding::Json);
|
||||
let encoded_transaction = EncodedTransaction::encode(transaction, encoding);
|
||||
Ok(Some(ConfirmedTransaction {
|
||||
slot,
|
||||
transaction: TransactionWithStatusMeta {
|
||||
transaction: encoded_transaction,
|
||||
meta: Some(status.into()),
|
||||
},
|
||||
}))
|
||||
} else {
|
||||
Ok(None)
|
||||
}
|
||||
}
|
||||
|
||||
fn find_transaction_in_slot(
|
||||
&self,
|
||||
slot: Slot,
|
||||
signature: Signature,
|
||||
) -> Result<Option<Transaction>> {
|
||||
let slot_entries = self.get_slot_entries(slot, 0, None)?;
|
||||
Ok(slot_entries
|
||||
.iter()
|
||||
.cloned()
|
||||
.flat_map(|entry| entry.transactions)
|
||||
.find(|transaction| transaction.signatures[0] == signature))
|
||||
}
|
||||
|
||||
// Returns all cached signatures for an address, ordered by slot that the transaction was
|
||||
// processed in
|
||||
fn find_address_signatures(
|
||||
&self,
|
||||
pubkey: Pubkey,
|
||||
start_slot: Slot,
|
||||
end_slot: Slot,
|
||||
) -> Result<Vec<(Slot, Signature)>> {
|
||||
let mut signatures: Vec<(Slot, Signature)> = vec![];
|
||||
for transaction_status_cf_primary_index in 0..=1 {
|
||||
let index_iterator = self.address_signatures_cf.iter(IteratorMode::From(
|
||||
(
|
||||
transaction_status_cf_primary_index,
|
||||
pubkey,
|
||||
start_slot,
|
||||
Signature::default(),
|
||||
),
|
||||
IteratorDirection::Forward,
|
||||
))?;
|
||||
for ((i, address, slot, signature), _) in index_iterator {
|
||||
if i != transaction_status_cf_primary_index || slot > end_slot || address != pubkey
|
||||
{
|
||||
break;
|
||||
}
|
||||
if self.is_root(slot) {
|
||||
signatures.push((slot, signature));
|
||||
}
|
||||
}
|
||||
}
|
||||
signatures.sort_by(|a, b| a.0.partial_cmp(&b.0).unwrap());
|
||||
Ok(signatures)
|
||||
}
|
||||
|
||||
pub fn get_confirmed_signatures_for_address(
|
||||
&self,
|
||||
pubkey: Pubkey,
|
||||
start_slot: Slot,
|
||||
end_slot: Slot,
|
||||
) -> Result<Vec<Signature>> {
|
||||
self.find_address_signatures(pubkey, start_slot, end_slot)
|
||||
.map(|signatures| signatures.iter().map(|(_, signature)| *signature).collect())
|
||||
}
|
||||
|
||||
pub fn read_rewards(&self, index: Slot) -> Result<Option<Rewards>> {
|
||||
self.rewards_cf.get(index)
|
||||
}
|
||||
@@ -2771,7 +2886,18 @@ pub mod tests {
|
||||
.iter::<cf::TransactionStatus>(IteratorMode::Start)
|
||||
.unwrap()
|
||||
.next()
|
||||
.map(|((_, _, slot), _)| slot >= min_slot)
|
||||
.map(|((primary_index, _, slot), _)| {
|
||||
slot >= min_slot || (primary_index == 2 && slot == 0)
|
||||
})
|
||||
.unwrap_or(true)
|
||||
& blockstore
|
||||
.db
|
||||
.iter::<cf::AddressSignatures>(IteratorMode::Start)
|
||||
.unwrap()
|
||||
.next()
|
||||
.map(|((primary_index, _, slot, _), _)| {
|
||||
slot >= min_slot || (primary_index == 2 && slot == 0)
|
||||
})
|
||||
.unwrap_or(true)
|
||||
& blockstore
|
||||
.db
|
||||
@@ -5344,14 +5470,18 @@ pub mod tests {
|
||||
let transaction_status_index_cf = blockstore.db.column::<cf::TransactionStatusIndex>();
|
||||
let slot0 = 10;
|
||||
|
||||
assert!(transaction_status_index_cf.get(0).unwrap().is_none());
|
||||
assert!(transaction_status_index_cf.get(1).unwrap().is_none());
|
||||
// Primary index column is initialized on Blockstore::open
|
||||
assert!(transaction_status_index_cf.get(0).unwrap().is_some());
|
||||
assert!(transaction_status_index_cf.get(1).unwrap().is_some());
|
||||
|
||||
for _ in 0..5 {
|
||||
let random_bytes: Vec<u8> = (0..64).map(|_| rand::random::<u8>()).collect();
|
||||
blockstore
|
||||
.write_transaction_status(
|
||||
(Signature::new(&random_bytes), slot0),
|
||||
slot0,
|
||||
Signature::new(&random_bytes),
|
||||
vec![&Pubkey::new(&random_bytes[0..32])],
|
||||
vec![&Pubkey::new(&random_bytes[32..])],
|
||||
&TransactionStatusMeta::default(),
|
||||
)
|
||||
.unwrap();
|
||||
@@ -5373,7 +5503,7 @@ pub mod tests {
|
||||
let first_status_entry = blockstore
|
||||
.db
|
||||
.iter::<cf::TransactionStatus>(IteratorMode::From(
|
||||
(0, Signature::default(), 0),
|
||||
cf::TransactionStatus::as_index(0),
|
||||
IteratorDirection::Forward,
|
||||
))
|
||||
.unwrap()
|
||||
@@ -5382,6 +5512,18 @@ pub mod tests {
|
||||
.0;
|
||||
assert_eq!(first_status_entry.0, 0);
|
||||
assert_eq!(first_status_entry.2, slot0);
|
||||
let first_address_entry = blockstore
|
||||
.db
|
||||
.iter::<cf::AddressSignatures>(IteratorMode::From(
|
||||
cf::AddressSignatures::as_index(0),
|
||||
IteratorDirection::Forward,
|
||||
))
|
||||
.unwrap()
|
||||
.next()
|
||||
.unwrap()
|
||||
.0;
|
||||
assert_eq!(first_address_entry.0, 0);
|
||||
assert_eq!(first_address_entry.2, slot0);
|
||||
|
||||
blockstore.run_purge(0, 8).unwrap();
|
||||
// First successful prune freezes index 0
|
||||
@@ -5402,7 +5544,10 @@ pub mod tests {
|
||||
let random_bytes: Vec<u8> = (0..64).map(|_| rand::random::<u8>()).collect();
|
||||
blockstore
|
||||
.write_transaction_status(
|
||||
(Signature::new(&random_bytes), slot1),
|
||||
slot1,
|
||||
Signature::new(&random_bytes),
|
||||
vec![&Pubkey::new(&random_bytes[0..32])],
|
||||
vec![&Pubkey::new(&random_bytes[32..])],
|
||||
&TransactionStatusMeta::default(),
|
||||
)
|
||||
.unwrap();
|
||||
@@ -5424,11 +5569,11 @@ pub mod tests {
|
||||
}
|
||||
);
|
||||
|
||||
// Index 0 statuses still exist
|
||||
// Index 0 statuses and address records still exist
|
||||
let first_status_entry = blockstore
|
||||
.db
|
||||
.iter::<cf::TransactionStatus>(IteratorMode::From(
|
||||
(0, Signature::default(), 0),
|
||||
cf::TransactionStatus::as_index(0),
|
||||
IteratorDirection::Forward,
|
||||
))
|
||||
.unwrap()
|
||||
@@ -5437,11 +5582,23 @@ pub mod tests {
|
||||
.0;
|
||||
assert_eq!(first_status_entry.0, 0);
|
||||
assert_eq!(first_status_entry.2, 10);
|
||||
// New statuses are stored in index 1
|
||||
let first_address_entry = blockstore
|
||||
.db
|
||||
.iter::<cf::AddressSignatures>(IteratorMode::From(
|
||||
cf::AddressSignatures::as_index(0),
|
||||
IteratorDirection::Forward,
|
||||
))
|
||||
.unwrap()
|
||||
.next()
|
||||
.unwrap()
|
||||
.0;
|
||||
assert_eq!(first_address_entry.0, 0);
|
||||
assert_eq!(first_address_entry.2, slot0);
|
||||
// New statuses and address records are stored in index 1
|
||||
let index1_first_status_entry = blockstore
|
||||
.db
|
||||
.iter::<cf::TransactionStatus>(IteratorMode::From(
|
||||
(1, Signature::default(), 0),
|
||||
cf::TransactionStatus::as_index(1),
|
||||
IteratorDirection::Forward,
|
||||
))
|
||||
.unwrap()
|
||||
@@ -5450,6 +5607,18 @@ pub mod tests {
|
||||
.0;
|
||||
assert_eq!(index1_first_status_entry.0, 1);
|
||||
assert_eq!(index1_first_status_entry.2, slot1);
|
||||
let index1_first_address_entry = blockstore
|
||||
.db
|
||||
.iter::<cf::AddressSignatures>(IteratorMode::From(
|
||||
cf::AddressSignatures::as_index(1),
|
||||
IteratorDirection::Forward,
|
||||
))
|
||||
.unwrap()
|
||||
.next()
|
||||
.unwrap()
|
||||
.0;
|
||||
assert_eq!(index1_first_address_entry.0, 1);
|
||||
assert_eq!(index1_first_address_entry.2, slot1);
|
||||
|
||||
blockstore.run_purge(0, 18).unwrap();
|
||||
// Successful prune toggles TransactionStatusIndex
|
||||
@@ -5468,11 +5637,11 @@ pub mod tests {
|
||||
}
|
||||
);
|
||||
|
||||
// Index 0 has been pruned, so first status entry is now index 1
|
||||
// Index 0 has been pruned, so first status and address entries are now index 1
|
||||
let first_status_entry = blockstore
|
||||
.db
|
||||
.iter::<cf::TransactionStatus>(IteratorMode::From(
|
||||
(0, Signature::default(), 0),
|
||||
cf::TransactionStatus::as_index(0),
|
||||
IteratorDirection::Forward,
|
||||
))
|
||||
.unwrap()
|
||||
@@ -5481,6 +5650,18 @@ pub mod tests {
|
||||
.0;
|
||||
assert_eq!(first_status_entry.0, 1);
|
||||
assert_eq!(first_status_entry.2, slot1);
|
||||
let first_address_entry = blockstore
|
||||
.db
|
||||
.iter::<cf::AddressSignatures>(IteratorMode::From(
|
||||
cf::AddressSignatures::as_index(0),
|
||||
IteratorDirection::Forward,
|
||||
))
|
||||
.unwrap()
|
||||
.next()
|
||||
.unwrap()
|
||||
.0;
|
||||
assert_eq!(first_address_entry.0, 1);
|
||||
assert_eq!(first_address_entry.2, slot1);
|
||||
}
|
||||
Blockstore::destroy(&blockstore_path).expect("Expected successful database destruction");
|
||||
}
|
||||
@@ -5496,7 +5677,10 @@ pub mod tests {
|
||||
let random_bytes: Vec<u8> = (0..64).map(|_| rand::random::<u8>()).collect();
|
||||
blockstore
|
||||
.write_transaction_status(
|
||||
(Signature::new(&random_bytes), slot),
|
||||
slot,
|
||||
Signature::new(&random_bytes),
|
||||
vec![&Pubkey::new(&random_bytes[0..32])],
|
||||
vec![&Pubkey::new(&random_bytes[32..])],
|
||||
&TransactionStatusMeta::default(),
|
||||
)
|
||||
.unwrap();
|
||||
@@ -5506,7 +5690,7 @@ pub mod tests {
|
||||
let mut status_entry_iterator = blockstore
|
||||
.db
|
||||
.iter::<cf::TransactionStatus>(IteratorMode::From(
|
||||
(0, Signature::default(), 0),
|
||||
cf::TransactionStatus::as_index(0),
|
||||
IteratorDirection::Forward,
|
||||
))
|
||||
.unwrap();
|
||||
@@ -5515,6 +5699,18 @@ pub mod tests {
|
||||
assert_eq!(entry.0, 0);
|
||||
assert_eq!(entry.2, slot);
|
||||
}
|
||||
let mut address_transactions_iterator = blockstore
|
||||
.db
|
||||
.iter::<cf::AddressSignatures>(IteratorMode::From(
|
||||
(0, Pubkey::default(), 0, Signature::default()),
|
||||
IteratorDirection::Forward,
|
||||
))
|
||||
.unwrap();
|
||||
for _ in 0..10 {
|
||||
let entry = address_transactions_iterator.next().unwrap().0;
|
||||
assert_eq!(entry.0, 0);
|
||||
assert_eq!(entry.2, slot);
|
||||
}
|
||||
assert_eq!(
|
||||
transaction_status_index_cf.get(0).unwrap().unwrap(),
|
||||
TransactionStatusIndexMeta {
|
||||
@@ -5528,7 +5724,7 @@ pub mod tests {
|
||||
let mut status_entry_iterator = blockstore
|
||||
.db
|
||||
.iter::<cf::TransactionStatus>(IteratorMode::From(
|
||||
(0, Signature::default(), 0),
|
||||
cf::TransactionStatus::as_index(0),
|
||||
IteratorDirection::Forward,
|
||||
))
|
||||
.unwrap();
|
||||
@@ -5537,6 +5733,18 @@ pub mod tests {
|
||||
assert_eq!(entry.0, 0);
|
||||
assert_eq!(entry.2, slot);
|
||||
}
|
||||
let mut address_transactions_iterator = blockstore
|
||||
.db
|
||||
.iter::<cf::AddressSignatures>(IteratorMode::From(
|
||||
cf::AddressSignatures::as_index(0),
|
||||
IteratorDirection::Forward,
|
||||
))
|
||||
.unwrap();
|
||||
for _ in 0..10 {
|
||||
let entry = address_transactions_iterator.next().unwrap().0;
|
||||
assert_eq!(entry.0, 0);
|
||||
assert_eq!(entry.2, slot);
|
||||
}
|
||||
assert_eq!(
|
||||
transaction_status_index_cf.get(0).unwrap().unwrap(),
|
||||
TransactionStatusIndexMeta {
|
||||
@@ -5550,7 +5758,7 @@ pub mod tests {
|
||||
let mut status_entry_iterator = blockstore
|
||||
.db
|
||||
.iter::<cf::TransactionStatus>(IteratorMode::From(
|
||||
(0, Signature::default(), 0),
|
||||
cf::TransactionStatus::as_index(0),
|
||||
IteratorDirection::Forward,
|
||||
))
|
||||
.unwrap();
|
||||
@@ -5559,6 +5767,18 @@ pub mod tests {
|
||||
assert_eq!(entry.0, 0);
|
||||
assert_eq!(entry.2, slot);
|
||||
}
|
||||
let mut address_transactions_iterator = blockstore
|
||||
.db
|
||||
.iter::<cf::AddressSignatures>(IteratorMode::From(
|
||||
cf::AddressSignatures::as_index(0),
|
||||
IteratorDirection::Forward,
|
||||
))
|
||||
.unwrap();
|
||||
for _ in 0..10 {
|
||||
let entry = address_transactions_iterator.next().unwrap().0;
|
||||
assert_eq!(entry.0, 0);
|
||||
assert_eq!(entry.2, slot);
|
||||
}
|
||||
assert_eq!(
|
||||
transaction_status_index_cf.get(0).unwrap().unwrap(),
|
||||
TransactionStatusIndexMeta {
|
||||
@@ -5571,7 +5791,7 @@ pub mod tests {
|
||||
let mut status_entry_iterator = blockstore
|
||||
.db
|
||||
.iter::<cf::TransactionStatus>(IteratorMode::From(
|
||||
(0, Signature::default(), 0),
|
||||
cf::TransactionStatus::as_index(0),
|
||||
IteratorDirection::Forward,
|
||||
))
|
||||
.unwrap();
|
||||
@@ -5579,6 +5799,17 @@ pub mod tests {
|
||||
assert_eq!(padding_entry.0, 2);
|
||||
assert_eq!(padding_entry.2, 0);
|
||||
assert!(status_entry_iterator.next().is_none());
|
||||
let mut address_transactions_iterator = blockstore
|
||||
.db
|
||||
.iter::<cf::AddressSignatures>(IteratorMode::From(
|
||||
cf::AddressSignatures::as_index(0),
|
||||
IteratorDirection::Forward,
|
||||
))
|
||||
.unwrap();
|
||||
let padding_entry = address_transactions_iterator.next().unwrap().0;
|
||||
assert_eq!(padding_entry.0, 2);
|
||||
assert_eq!(padding_entry.2, 0);
|
||||
assert!(address_transactions_iterator.next().is_none());
|
||||
assert_eq!(
|
||||
transaction_status_index_cf.get(0).unwrap().unwrap(),
|
||||
TransactionStatusIndexMeta {
|
||||
@@ -5602,6 +5833,7 @@ pub mod tests {
|
||||
let blockstore_path = get_tmp_ledger_path!();
|
||||
{
|
||||
let blockstore = Blockstore::open(&blockstore_path).unwrap();
|
||||
// TransactionStatus column opens initialized with one entry at index 2
|
||||
let transaction_status_cf = blockstore.db.column::<cf::TransactionStatus>();
|
||||
|
||||
let pre_balances_vec = vec![1, 2, 3];
|
||||
@@ -5692,7 +5924,7 @@ pub mod tests {
|
||||
.get_transaction_status_with_counter(signature5)
|
||||
.unwrap();
|
||||
assert_eq!(status, None);
|
||||
assert_eq!(counter, 5);
|
||||
assert_eq!(counter, 6);
|
||||
|
||||
// Signature does not exist, smaller than existing entries
|
||||
let (status, counter) = blockstore
|
||||
@@ -5713,7 +5945,227 @@ pub mod tests {
|
||||
.get_transaction_status_with_counter(signature6)
|
||||
.unwrap();
|
||||
assert_eq!(status, None);
|
||||
assert_eq!(counter, 1);
|
||||
assert_eq!(counter, 2);
|
||||
}
|
||||
Blockstore::destroy(&blockstore_path).expect("Expected successful database destruction");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_get_confirmed_transaction() {
|
||||
let slot = 2;
|
||||
let entries = make_slot_entries_with_transactions(5);
|
||||
let shreds = entries_to_test_shreds(entries.clone(), slot, slot - 1, true, 0);
|
||||
let ledger_path = get_tmp_ledger_path!();
|
||||
let blockstore = Blockstore::open(&ledger_path).unwrap();
|
||||
blockstore.insert_shreds(shreds, None, false).unwrap();
|
||||
blockstore.set_roots(&[slot - 1, slot]).unwrap();
|
||||
|
||||
let expected_transactions: Vec<(Transaction, Option<RpcTransactionStatusMeta>)> = entries
|
||||
.iter()
|
||||
.cloned()
|
||||
.filter(|entry| !entry.is_tick())
|
||||
.flat_map(|entry| entry.transactions)
|
||||
.map(|transaction| {
|
||||
let mut pre_balances: Vec<u64> = vec![];
|
||||
let mut post_balances: Vec<u64> = vec![];
|
||||
for (i, _account_key) in transaction.message.account_keys.iter().enumerate() {
|
||||
pre_balances.push(i as u64 * 10);
|
||||
post_balances.push(i as u64 * 11);
|
||||
}
|
||||
let signature = transaction.signatures[0];
|
||||
blockstore
|
||||
.transaction_status_cf
|
||||
.put(
|
||||
(0, signature, slot),
|
||||
&TransactionStatusMeta {
|
||||
status: Ok(()),
|
||||
fee: 42,
|
||||
pre_balances: pre_balances.clone(),
|
||||
post_balances: post_balances.clone(),
|
||||
},
|
||||
)
|
||||
.unwrap();
|
||||
(
|
||||
transaction,
|
||||
Some(
|
||||
TransactionStatusMeta {
|
||||
status: Ok(()),
|
||||
fee: 42,
|
||||
pre_balances,
|
||||
post_balances,
|
||||
}
|
||||
.into(),
|
||||
),
|
||||
)
|
||||
})
|
||||
.collect();
|
||||
|
||||
for (transaction, status) in expected_transactions.clone() {
|
||||
let signature = transaction.signatures[0];
|
||||
let encoded_transaction =
|
||||
EncodedTransaction::encode(transaction, TransactionEncoding::Json);
|
||||
let expected_transaction = ConfirmedTransaction {
|
||||
slot,
|
||||
transaction: TransactionWithStatusMeta {
|
||||
transaction: encoded_transaction,
|
||||
meta: status,
|
||||
},
|
||||
};
|
||||
assert_eq!(
|
||||
blockstore
|
||||
.get_confirmed_transaction(signature, None)
|
||||
.unwrap(),
|
||||
Some(expected_transaction)
|
||||
);
|
||||
}
|
||||
|
||||
blockstore.run_purge(0, 2).unwrap();
|
||||
*blockstore.lowest_cleanup_slot.write().unwrap() = slot;
|
||||
for (transaction, _) in expected_transactions {
|
||||
let signature = transaction.signatures[0];
|
||||
assert_eq!(
|
||||
blockstore
|
||||
.get_confirmed_transaction(signature, None)
|
||||
.unwrap(),
|
||||
None,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_get_confirmed_signatures_for_address() {
|
||||
let blockstore_path = get_tmp_ledger_path!();
|
||||
{
|
||||
let blockstore = Blockstore::open(&blockstore_path).unwrap();
|
||||
|
||||
let address0 = Pubkey::new_rand();
|
||||
let address1 = Pubkey::new_rand();
|
||||
|
||||
let slot0 = 10;
|
||||
for x in 1..5 {
|
||||
let signature = Signature::new(&[x; 64]);
|
||||
blockstore
|
||||
.write_transaction_status(
|
||||
slot0,
|
||||
signature,
|
||||
vec![&address0],
|
||||
vec![&address1],
|
||||
&TransactionStatusMeta::default(),
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
// Purge to freeze index 0
|
||||
blockstore.run_purge(0, 1).unwrap();
|
||||
let slot1 = 20;
|
||||
for x in 5..9 {
|
||||
let signature = Signature::new(&[x; 64]);
|
||||
blockstore
|
||||
.write_transaction_status(
|
||||
slot1,
|
||||
signature,
|
||||
vec![&address0],
|
||||
vec![&address1],
|
||||
&TransactionStatusMeta::default(),
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
blockstore.set_roots(&[slot0, slot1]).unwrap();
|
||||
|
||||
let all0 = blockstore
|
||||
.get_confirmed_signatures_for_address(address0, 0, 50)
|
||||
.unwrap();
|
||||
assert_eq!(all0.len(), 8);
|
||||
for x in 1..9 {
|
||||
let expected_signature = Signature::new(&[x; 64]);
|
||||
assert_eq!(all0[x as usize - 1], expected_signature);
|
||||
}
|
||||
assert_eq!(
|
||||
blockstore
|
||||
.get_confirmed_signatures_for_address(address0, 20, 50)
|
||||
.unwrap()
|
||||
.len(),
|
||||
4
|
||||
);
|
||||
assert_eq!(
|
||||
blockstore
|
||||
.get_confirmed_signatures_for_address(address0, 0, 10)
|
||||
.unwrap()
|
||||
.len(),
|
||||
4
|
||||
);
|
||||
assert!(blockstore
|
||||
.get_confirmed_signatures_for_address(address0, 1, 5)
|
||||
.unwrap()
|
||||
.is_empty());
|
||||
assert_eq!(
|
||||
blockstore
|
||||
.get_confirmed_signatures_for_address(address0, 1, 15)
|
||||
.unwrap()
|
||||
.len(),
|
||||
4
|
||||
);
|
||||
|
||||
let all1 = blockstore
|
||||
.get_confirmed_signatures_for_address(address1, 0, 50)
|
||||
.unwrap();
|
||||
assert_eq!(all1.len(), 8);
|
||||
for x in 1..9 {
|
||||
let expected_signature = Signature::new(&[x; 64]);
|
||||
assert_eq!(all1[x as usize - 1], expected_signature);
|
||||
}
|
||||
|
||||
// Purge index 0
|
||||
blockstore.run_purge(0, 10).unwrap();
|
||||
assert_eq!(
|
||||
blockstore
|
||||
.get_confirmed_signatures_for_address(address0, 0, 50)
|
||||
.unwrap()
|
||||
.len(),
|
||||
4
|
||||
);
|
||||
assert_eq!(
|
||||
blockstore
|
||||
.get_confirmed_signatures_for_address(address0, 20, 50)
|
||||
.unwrap()
|
||||
.len(),
|
||||
4
|
||||
);
|
||||
assert!(blockstore
|
||||
.get_confirmed_signatures_for_address(address0, 0, 10)
|
||||
.unwrap()
|
||||
.is_empty());
|
||||
assert!(blockstore
|
||||
.get_confirmed_signatures_for_address(address0, 1, 5)
|
||||
.unwrap()
|
||||
.is_empty());
|
||||
assert_eq!(
|
||||
blockstore
|
||||
.get_confirmed_signatures_for_address(address0, 1, 25)
|
||||
.unwrap()
|
||||
.len(),
|
||||
4
|
||||
);
|
||||
|
||||
// Test sort, regardless of entry order or signature value
|
||||
for slot in (21..25).rev() {
|
||||
let random_bytes: Vec<u8> = (0..64).map(|_| rand::random::<u8>()).collect();
|
||||
let signature = Signature::new(&random_bytes);
|
||||
blockstore
|
||||
.write_transaction_status(
|
||||
slot,
|
||||
signature,
|
||||
vec![&address0],
|
||||
vec![&address1],
|
||||
&TransactionStatusMeta::default(),
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
blockstore.set_roots(&[21, 22, 23, 24]).unwrap();
|
||||
let mut past_slot = 0;
|
||||
for (slot, _) in blockstore.find_address_signatures(address0, 1, 25).unwrap() {
|
||||
assert!(slot >= past_slot);
|
||||
past_slot = slot;
|
||||
}
|
||||
}
|
||||
Blockstore::destroy(&blockstore_path).expect("Expected successful database destruction");
|
||||
}
|
||||
|
@@ -10,7 +10,7 @@ use rocksdb::{
|
||||
};
|
||||
use serde::de::DeserializeOwned;
|
||||
use serde::Serialize;
|
||||
use solana_sdk::{clock::Slot, signature::Signature};
|
||||
use solana_sdk::{clock::Slot, pubkey::Pubkey, signature::Signature};
|
||||
use solana_transaction_status::{Rewards, TransactionStatusMeta};
|
||||
use std::{collections::HashMap, fs, marker::PhantomData, path::Path, sync::Arc};
|
||||
use thiserror::Error;
|
||||
@@ -38,7 +38,9 @@ const DATA_SHRED_CF: &str = "data_shred";
|
||||
const CODE_SHRED_CF: &str = "code_shred";
|
||||
/// Column family for Transaction Status
|
||||
const TRANSACTION_STATUS_CF: &str = "transaction_status";
|
||||
/// Column family for Transaction Status
|
||||
/// Column family for Address Signatures
|
||||
const ADDRESS_SIGNATURES_CF: &str = "address_signatures";
|
||||
/// Column family for Transaction Status Index
|
||||
const TRANSACTION_STATUS_INDEX_CF: &str = "transaction_status_index";
|
||||
/// Column family for Rewards
|
||||
const REWARDS_CF: &str = "rewards";
|
||||
@@ -110,6 +112,10 @@ pub mod columns {
|
||||
/// The transaction status column
|
||||
pub struct TransactionStatus;
|
||||
|
||||
#[derive(Debug)]
|
||||
/// The address signatures column
|
||||
pub struct AddressSignatures;
|
||||
|
||||
#[derive(Debug)]
|
||||
/// The transaction status index column
|
||||
pub struct TransactionStatusIndex;
|
||||
@@ -125,8 +131,8 @@ struct Rocks(rocksdb::DB);
|
||||
impl Rocks {
|
||||
fn open(path: &Path) -> Result<Rocks> {
|
||||
use columns::{
|
||||
DeadSlots, DuplicateSlots, ErasureMeta, Index, Orphans, Rewards, Root, ShredCode,
|
||||
ShredData, SlotMeta, TransactionStatus, TransactionStatusIndex,
|
||||
AddressSignatures, DeadSlots, DuplicateSlots, ErasureMeta, Index, Orphans, Rewards,
|
||||
Root, ShredCode, ShredData, SlotMeta, TransactionStatus, TransactionStatusIndex,
|
||||
};
|
||||
|
||||
fs::create_dir_all(&path)?;
|
||||
@@ -151,6 +157,8 @@ impl Rocks {
|
||||
ColumnFamilyDescriptor::new(ShredCode::NAME, get_cf_options());
|
||||
let transaction_status_cf_descriptor =
|
||||
ColumnFamilyDescriptor::new(TransactionStatus::NAME, get_cf_options());
|
||||
let address_signatures_cf_descriptor =
|
||||
ColumnFamilyDescriptor::new(AddressSignatures::NAME, get_cf_options());
|
||||
let transaction_status_index_cf_descriptor =
|
||||
ColumnFamilyDescriptor::new(TransactionStatusIndex::NAME, get_cf_options());
|
||||
let rewards_cf_descriptor = ColumnFamilyDescriptor::new(Rewards::NAME, get_cf_options());
|
||||
@@ -166,6 +174,7 @@ impl Rocks {
|
||||
shred_data_cf_descriptor,
|
||||
shred_code_cf_descriptor,
|
||||
transaction_status_cf_descriptor,
|
||||
address_signatures_cf_descriptor,
|
||||
transaction_status_index_cf_descriptor,
|
||||
rewards_cf_descriptor,
|
||||
];
|
||||
@@ -178,8 +187,8 @@ impl Rocks {
|
||||
|
||||
fn columns(&self) -> Vec<&'static str> {
|
||||
use columns::{
|
||||
DeadSlots, DuplicateSlots, ErasureMeta, Index, Orphans, Rewards, Root, ShredCode,
|
||||
ShredData, SlotMeta, TransactionStatus, TransactionStatusIndex,
|
||||
AddressSignatures, DeadSlots, DuplicateSlots, ErasureMeta, Index, Orphans, Rewards,
|
||||
Root, ShredCode, ShredData, SlotMeta, TransactionStatus, TransactionStatusIndex,
|
||||
};
|
||||
|
||||
vec![
|
||||
@@ -193,6 +202,7 @@ impl Rocks {
|
||||
ShredData::NAME,
|
||||
ShredCode::NAME,
|
||||
TransactionStatus::NAME,
|
||||
AddressSignatures::NAME,
|
||||
TransactionStatusIndex::NAME,
|
||||
Rewards::NAME,
|
||||
]
|
||||
@@ -282,6 +292,10 @@ impl TypedColumn for columns::TransactionStatus {
|
||||
type Type = TransactionStatusMeta;
|
||||
}
|
||||
|
||||
impl TypedColumn for columns::AddressSignatures {
|
||||
type Type = blockstore_meta::AddressSignatureMeta;
|
||||
}
|
||||
|
||||
impl TypedColumn for columns::TransactionStatusIndex {
|
||||
type Type = blockstore_meta::TransactionStatusIndexMeta;
|
||||
}
|
||||
@@ -314,7 +328,7 @@ impl Column for columns::TransactionStatus {
|
||||
type Index = (u64, Signature, Slot);
|
||||
|
||||
fn key((index, signature, slot): (u64, Signature, Slot)) -> Vec<u8> {
|
||||
let mut key = vec![0; 8 + 8 + 64];
|
||||
let mut key = vec![0; 8 + 64 + 8]; // size_of u64 + size_of Signature + size_of Slot
|
||||
BigEndian::write_u64(&mut key[0..8], index);
|
||||
key[8..72].clone_from_slice(&signature.as_ref()[0..64]);
|
||||
BigEndian::write_u64(&mut key[72..80], slot);
|
||||
@@ -341,6 +355,39 @@ impl ColumnName for columns::TransactionStatus {
|
||||
const NAME: &'static str = TRANSACTION_STATUS_CF;
|
||||
}
|
||||
|
||||
impl Column for columns::AddressSignatures {
|
||||
type Index = (u64, Pubkey, Slot, Signature);
|
||||
|
||||
fn key((index, pubkey, slot, signature): (u64, Pubkey, Slot, Signature)) -> Vec<u8> {
|
||||
let mut key = vec![0; 8 + 32 + 8 + 64]; // size_of u64 + size_of Pubkey + size_of Slot + size_of Signature
|
||||
BigEndian::write_u64(&mut key[0..8], index);
|
||||
key[8..40].clone_from_slice(&pubkey.as_ref()[0..32]);
|
||||
BigEndian::write_u64(&mut key[40..48], slot);
|
||||
key[48..112].clone_from_slice(&signature.as_ref()[0..64]);
|
||||
key
|
||||
}
|
||||
|
||||
fn index(key: &[u8]) -> (u64, Pubkey, Slot, Signature) {
|
||||
let index = BigEndian::read_u64(&key[0..8]);
|
||||
let pubkey = Pubkey::new(&key[8..40]);
|
||||
let slot = BigEndian::read_u64(&key[40..48]);
|
||||
let signature = Signature::new(&key[48..112]);
|
||||
(index, pubkey, slot, signature)
|
||||
}
|
||||
|
||||
fn primary_index(index: Self::Index) -> u64 {
|
||||
index.0
|
||||
}
|
||||
|
||||
fn as_index(index: u64) -> Self::Index {
|
||||
(index, Pubkey::default(), 0, Signature::default())
|
||||
}
|
||||
}
|
||||
|
||||
impl ColumnName for columns::AddressSignatures {
|
||||
const NAME: &'static str = ADDRESS_SIGNATURES_CF;
|
||||
}
|
||||
|
||||
impl Column for columns::TransactionStatusIndex {
|
||||
type Index = u64;
|
||||
|
||||
|
@@ -228,6 +228,11 @@ pub struct TransactionStatusIndexMeta {
|
||||
pub frozen: bool,
|
||||
}
|
||||
|
||||
#[derive(Debug, Default, Deserialize, Serialize, PartialEq)]
|
||||
pub struct AddressSignatureMeta {
|
||||
pub writeable: bool,
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::*;
|
||||
|
@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-local-cluster"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@@ -12,23 +12,23 @@ homepage = "https://solana.com/"
|
||||
itertools = "0.8.1"
|
||||
log = "0.4.8"
|
||||
rand = "0.6.5"
|
||||
solana-archiver-lib = { path = "../archiver-lib", version = "1.0.14" }
|
||||
solana-config-program = { path = "../programs/config", version = "1.0.14" }
|
||||
solana-core = { path = "../core", version = "1.0.14" }
|
||||
solana-client = { path = "../client", version = "1.0.14" }
|
||||
solana-faucet = { path = "../faucet", version = "1.0.14" }
|
||||
solana-exchange-program = { path = "../programs/exchange", version = "1.0.14" }
|
||||
solana-genesis-programs = { path = "../genesis-programs", version = "1.0.14" }
|
||||
solana-ledger = { path = "../ledger", version = "1.0.14" }
|
||||
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||
solana-runtime = { path = "../runtime", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-stake-program = { path = "../programs/stake", version = "1.0.14" }
|
||||
solana-storage-program = { path = "../programs/storage", version = "1.0.14" }
|
||||
solana-vest-program = { path = "../programs/vest", version = "1.0.14" }
|
||||
solana-vote-program = { path = "../programs/vote", version = "1.0.14" }
|
||||
solana-archiver-lib = { path = "../archiver-lib", version = "1.0.16" }
|
||||
solana-config-program = { path = "../programs/config", version = "1.0.16" }
|
||||
solana-core = { path = "../core", version = "1.0.16" }
|
||||
solana-client = { path = "../client", version = "1.0.16" }
|
||||
solana-faucet = { path = "../faucet", version = "1.0.16" }
|
||||
solana-exchange-program = { path = "../programs/exchange", version = "1.0.16" }
|
||||
solana-genesis-programs = { path = "../genesis-programs", version = "1.0.16" }
|
||||
solana-ledger = { path = "../ledger", version = "1.0.16" }
|
||||
solana-logger = { path = "../logger", version = "1.0.16" }
|
||||
solana-runtime = { path = "../runtime", version = "1.0.16" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
solana-stake-program = { path = "../programs/stake", version = "1.0.16" }
|
||||
solana-storage-program = { path = "../programs/storage", version = "1.0.16" }
|
||||
solana-vest-program = { path = "../programs/vest", version = "1.0.16" }
|
||||
solana-vote-program = { path = "../programs/vote", version = "1.0.16" }
|
||||
tempfile = "3.1.0"
|
||||
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.14" }
|
||||
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.16" }
|
||||
|
||||
[dev-dependencies]
|
||||
assert_matches = "1.3.0"
|
||||
|
@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-log-analyzer"
|
||||
description = "The solana cluster network analysis tool"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@@ -14,8 +14,8 @@ byte-unit = "3.0.3"
|
||||
clap = "2.33.0"
|
||||
serde = "1.0.104"
|
||||
serde_json = "1.0.46"
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.16" }
|
||||
solana-logger = { path = "../logger", version = "1.0.16" }
|
||||
|
||||
[[bin]]
|
||||
name = "solana-log-analyzer"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-logger"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana Logger"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
|
@@ -1,7 +1,7 @@
|
||||
[package]
|
||||
name = "solana-measure"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
documentation = "https://docs.rs/solana"
|
||||
homepage = "https://solana.com/"
|
||||
readme = "../README.md"
|
||||
@@ -12,8 +12,8 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
log = "0.4.8"
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-metrics = { path = "../metrics", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
solana-metrics = { path = "../metrics", version = "1.0.16" }
|
||||
|
||||
[target."cfg(unix)".dependencies]
|
||||
jemallocator = "0.3.2"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-merkle-tree"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana Merkle Tree"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -9,7 +9,7 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
|
||||
[dev-dependencies]
|
||||
hex = "0.4.0"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-metrics"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana Metrics"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -14,7 +14,7 @@ gethostname = "0.2.1"
|
||||
lazy_static = "1.4.0"
|
||||
log = "0.4.8"
|
||||
reqwest = { version = "0.10.1", default-features = false, features = ["blocking", "rustls-tls"] }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
|
||||
[dev-dependencies]
|
||||
rand = "0.6.5"
|
||||
|
@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-net-shaper"
|
||||
description = "The solana cluster network shaping tool"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@@ -13,8 +13,8 @@ publish = false
|
||||
clap = "2.33.0"
|
||||
serde = "1.0.104"
|
||||
serde_json = "1.0.46"
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.16" }
|
||||
solana-logger = { path = "../logger", version = "1.0.16" }
|
||||
rand = "0.6.5"
|
||||
|
||||
[[bin]]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-net-utils"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana Network Utilities"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -18,8 +18,8 @@ rand = "0.6.1"
|
||||
serde = "1.0.104"
|
||||
serde_derive = "1.0.103"
|
||||
socket2 = "0.3.11"
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.16" }
|
||||
solana-logger = { path = "../logger", version = "1.0.16" }
|
||||
tokio = "0.1"
|
||||
tokio-codec = "0.1"
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-perf"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana Performance APIs"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -17,11 +17,11 @@ serde = "1.0.104"
|
||||
dlopen_derive = "0.1.4"
|
||||
lazy_static = "1.4.0"
|
||||
log = "0.4.8"
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.14" }
|
||||
solana-budget-program = { path = "../programs/budget", version = "1.0.14" }
|
||||
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||
solana-metrics = { path = "../metrics", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.16" }
|
||||
solana-budget-program = { path = "../programs/budget", version = "1.0.16" }
|
||||
solana-logger = { path = "../logger", version = "1.0.16" }
|
||||
solana-metrics = { path = "../metrics", version = "1.0.16" }
|
||||
|
||||
[lib]
|
||||
name = "solana_perf"
|
||||
|
@@ -1,7 +1,7 @@
|
||||
[package]
|
||||
name = "solana-bpf-programs"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
documentation = "https://docs.rs/solana"
|
||||
homepage = "https://solana.com/"
|
||||
readme = "README.md"
|
||||
@@ -22,10 +22,10 @@ walkdir = "2"
|
||||
bincode = "1.1.4"
|
||||
byteorder = "1.3.2"
|
||||
elf = "0.0.10"
|
||||
solana-bpf-loader-program = { path = "../bpf_loader", version = "1.0.14" }
|
||||
solana-logger = { path = "../../logger", version = "1.0.14" }
|
||||
solana-runtime = { path = "../../runtime", version = "1.0.14" }
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||
solana-bpf-loader-program = { path = "../bpf_loader", version = "1.0.16" }
|
||||
solana-logger = { path = "../../logger", version = "1.0.16" }
|
||||
solana-runtime = { path = "../../runtime", version = "1.0.16" }
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.16" }
|
||||
solana_rbpf = "=0.1.21"
|
||||
|
||||
[[bench]]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-128bit"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana BPF test program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -12,11 +12,11 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||
solana-bpf-rust-128bit-dep = { path = "../128bit_dep", version = "1.0.14" }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.16", default-features = false }
|
||||
solana-bpf-rust-128bit-dep = { path = "../128bit_dep", version = "1.0.16" }
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.16" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-128bit-dep"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana BPF test program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.16", default-features = false }
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.16" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-alloc"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana BPF test program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.16", default-features = false }
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.16" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-dep-crate"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana BPF test program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -13,10 +13,10 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
byteorder = { version = "1", default-features = false }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.16", default-features = false }
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.16" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-dup-accounts"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana BPF test program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.16", default-features = false }
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.16" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-error-handling"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana BPF test program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -14,11 +14,11 @@ edition = "2018"
|
||||
[dependencies]
|
||||
num-derive = "0.2"
|
||||
num-traits = "0.2"
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.16", default-features = false }
|
||||
thiserror = "1.0"
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.16" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-external-spend"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana BPF test program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.16", default-features = false }
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.16" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-iter"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana BPF test program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.16", default-features = false }
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.16" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-many-args"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana BPF test program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -12,11 +12,11 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||
solana-bpf-rust-many-args-dep = { path = "../many_args_dep", version = "1.0.14" }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.16", default-features = false }
|
||||
solana-bpf-rust-many-args-dep = { path = "../many_args_dep", version = "1.0.16" }
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.16" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-many-args-dep"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana BPF test program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.16", default-features = false }
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.16" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-noop"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana BPF test program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.16", default-features = false }
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.16" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-panic"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana BPF test program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.16", default-features = false }
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.16" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-param-passing"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana BPF test program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -12,11 +12,11 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||
solana-bpf-rust-param-passing-dep = { path = "../param_passing_dep", version = "1.0.14" }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.16", default-features = false }
|
||||
solana-bpf-rust-param-passing-dep = { path = "../param_passing_dep", version = "1.0.16" }
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.16" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-param-passing-dep"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana BPF program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.16", default-features = false }
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.16" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-sysval"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana BPF test program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.16", default-features = false }
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.16" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-bpf-loader-program"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana BPF loader"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -15,8 +15,8 @@ libc = "0.2.66"
|
||||
log = "0.4.8"
|
||||
num-derive = { version = "0.3" }
|
||||
num-traits = { version = "0.2" }
|
||||
solana-logger = { path = "../../logger", version = "1.0.14" }
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||
solana-logger = { path = "../../logger", version = "1.0.16" }
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.16" }
|
||||
solana_rbpf = "=0.1.21"
|
||||
thiserror = "1.0"
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-btc-spv-program"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana Bitcoin spv parsing program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -15,7 +15,7 @@ num-derive = "0.3"
|
||||
num-traits = "0.2"
|
||||
serde = "1.0.104"
|
||||
serde_derive = "1.0.103"
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.14"}
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.16"}
|
||||
hex = "0.3.2"
|
||||
|
||||
[lib]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "btc_spv_bin"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana Bitcoin spv parsing program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-budget-program"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana Budget program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -16,11 +16,11 @@ num-derive = "0.3"
|
||||
num-traits = "0.2"
|
||||
serde = "1.0.104"
|
||||
serde_derive = "1.0.103"
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.16" }
|
||||
thiserror = "1.0"
|
||||
|
||||
[dev-dependencies]
|
||||
solana-runtime = { path = "../../runtime", version = "1.0.14" }
|
||||
solana-runtime = { path = "../../runtime", version = "1.0.16" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib", "cdylib"]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-config-program"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana Config program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -14,8 +14,8 @@ chrono = { version = "0.4.10", features = ["serde"] }
|
||||
log = "0.4.8"
|
||||
serde = "1.0.104"
|
||||
serde_derive = "1.0.103"
|
||||
solana-logger = { path = "../../logger", version = "1.0.14" }
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||
solana-logger = { path = "../../logger", version = "1.0.16" }
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.16" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib", "cdylib"]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-exchange-program"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana Exchange program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -15,13 +15,13 @@ num-derive = { version = "0.3" }
|
||||
num-traits = { version = "0.2" }
|
||||
serde = "1.0.104"
|
||||
serde_derive = "1.0.103"
|
||||
solana-logger = { path = "../../logger", version = "1.0.14" }
|
||||
solana-metrics = { path = "../../metrics", version = "1.0.14" }
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||
solana-logger = { path = "../../logger", version = "1.0.16" }
|
||||
solana-metrics = { path = "../../metrics", version = "1.0.16" }
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.16" }
|
||||
thiserror = "1.0"
|
||||
|
||||
[dev-dependencies]
|
||||
solana-runtime = { path = "../../runtime", version = "1.0.14" }
|
||||
solana-runtime = { path = "../../runtime", version = "1.0.16" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib", "cdylib"]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-failure-program"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana failure program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -9,10 +9,10 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.16" }
|
||||
|
||||
[dev-dependencies]
|
||||
solana-runtime = { path = "../../runtime", version = "1.0.14" }
|
||||
solana-runtime = { path = "../../runtime", version = "1.0.16" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib", "cdylib"]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-librapay"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana Libra Payment"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -11,10 +11,10 @@ edition = "2018"
|
||||
[dependencies]
|
||||
bincode = "1.2.0"
|
||||
log = "0.4.8"
|
||||
solana-logger = { path = "../../logger", version = "1.0.14" }
|
||||
solana-move-loader-program = { path = "../move_loader", version = "1.0.14" }
|
||||
solana-runtime = { path = "../../runtime", version = "1.0.14" }
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||
solana-logger = { path = "../../logger", version = "1.0.16" }
|
||||
solana-move-loader-program = { path = "../move_loader", version = "1.0.16" }
|
||||
solana-runtime = { path = "../../runtime", version = "1.0.16" }
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.16" }
|
||||
types = { version = "0.0.1-sol4", package = "solana_libra_types" }
|
||||
|
||||
[lib]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-move-loader-program"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana Move loader"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -16,8 +16,8 @@ serde = "1.0.104"
|
||||
serde_bytes = "0.11"
|
||||
serde_derive = "1.0.103"
|
||||
serde_json = "1.0.46"
|
||||
solana-logger = { path = "../../logger", version = "1.0.14" }
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||
solana-logger = { path = "../../logger", version = "1.0.16" }
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.16" }
|
||||
|
||||
bytecode_verifier = { version = "0.0.1-sol4", package = "solana_libra_bytecode_verifier" }
|
||||
canonical_serialization = { version = "0.0.1-sol4", package = "solana_libra_canonical_serialization" }
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-noop-program"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana Noop program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -10,8 +10,8 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
log = "0.4.8"
|
||||
solana-logger = { path = "../../logger", version = "1.0.14" }
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||
solana-logger = { path = "../../logger", version = "1.0.16" }
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.16" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib", "cdylib"]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-ownable"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "ownable program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -10,13 +10,13 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
bincode = "1.2.1"
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.16" }
|
||||
num-derive = "0.3"
|
||||
num-traits = "0.2"
|
||||
thiserror = "1.0"
|
||||
|
||||
[dev-dependencies]
|
||||
solana-runtime = { path = "../../runtime", version = "1.0.14" }
|
||||
solana-runtime = { path = "../../runtime", version = "1.0.16" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib", "cdylib"]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-stake-program"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana Stake program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -15,11 +15,11 @@ num-derive = "0.3"
|
||||
num-traits = "0.2"
|
||||
serde = "1.0.104"
|
||||
serde_derive = "1.0.103"
|
||||
solana-logger = { path = "../../logger", version = "1.0.14" }
|
||||
solana-metrics = { path = "../../metrics", version = "1.0.14" }
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||
solana-vote-program = { path = "../vote", version = "1.0.14" }
|
||||
solana-config-program = { path = "../config", version = "1.0.14" }
|
||||
solana-logger = { path = "../../logger", version = "1.0.16" }
|
||||
solana-metrics = { path = "../../metrics", version = "1.0.16" }
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.16" }
|
||||
solana-vote-program = { path = "../vote", version = "1.0.16" }
|
||||
solana-config-program = { path = "../config", version = "1.0.16" }
|
||||
thiserror = "1.0"
|
||||
|
||||
[lib]
|
||||
|
@@ -151,7 +151,8 @@ impl Meta {
|
||||
) -> Result<(), InstructionError> {
|
||||
// verify that lockup has expired or that the authorization
|
||||
// is *also* signed by the custodian
|
||||
if self.lockup.is_in_force(clock, signers) {
|
||||
if stake_authorize == StakeAuthorize::Withdrawer && self.lockup.is_in_force(clock, signers)
|
||||
{
|
||||
return Err(StakeError::LockupInForce.into());
|
||||
}
|
||||
self.authorized
|
||||
@@ -948,23 +949,28 @@ mod tests {
|
||||
meta.authorize(&staker, StakeAuthorize::Staker, &signers, &clock),
|
||||
Ok(())
|
||||
);
|
||||
// verify lockup check
|
||||
// verify staker not subject to lockup, but withdrawer is
|
||||
meta.lockup.epoch = 1;
|
||||
assert_eq!(
|
||||
meta.authorize(&staker, StakeAuthorize::Staker, &signers, &clock),
|
||||
Ok(())
|
||||
);
|
||||
// verify lockup check
|
||||
assert_eq!(
|
||||
meta.authorize(&staker, StakeAuthorize::Withdrawer, &signers, &clock),
|
||||
Err(StakeError::LockupInForce.into())
|
||||
);
|
||||
// verify lockup check defeated by custodian
|
||||
signers.insert(custodian);
|
||||
assert_eq!(
|
||||
meta.authorize(&staker, StakeAuthorize::Staker, &signers, &clock),
|
||||
meta.authorize(&staker, StakeAuthorize::Withdrawer, &signers, &clock),
|
||||
Ok(())
|
||||
);
|
||||
// verify lock expiry
|
||||
signers.remove(&custodian);
|
||||
clock.epoch = 1;
|
||||
assert_eq!(
|
||||
meta.authorize(&staker, StakeAuthorize::Staker, &signers, &clock),
|
||||
meta.authorize(&staker, StakeAuthorize::Withdrawer, &signers, &clock),
|
||||
Ok(())
|
||||
);
|
||||
}
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-storage-program"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana Storage program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -16,8 +16,8 @@ num-derive = "0.3"
|
||||
num-traits = "0.2"
|
||||
serde = "1.0.104"
|
||||
serde_derive = "1.0.103"
|
||||
solana-logger = { path = "../../logger", version = "1.0.14" }
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||
solana-logger = { path = "../../logger", version = "1.0.16" }
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.16" }
|
||||
|
||||
[dev-dependencies]
|
||||
assert_matches = "1.3.0"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-vest-program"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana Vest program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -15,12 +15,12 @@ num-derive = "0.2"
|
||||
num-traits = "0.2"
|
||||
serde = "1.0.104"
|
||||
serde_derive = "1.0.103"
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||
solana-config-program = { path = "../config", version = "1.0.14" }
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.16" }
|
||||
solana-config-program = { path = "../config", version = "1.0.16" }
|
||||
thiserror = "1.0"
|
||||
|
||||
[dev-dependencies]
|
||||
solana-runtime = { path = "../../runtime", version = "1.0.14" }
|
||||
solana-runtime = { path = "../../runtime", version = "1.0.16" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib"]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-vote-program"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana Vote program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -15,9 +15,9 @@ num-derive = "0.3"
|
||||
num-traits = "0.2"
|
||||
serde = "1.0.104"
|
||||
serde_derive = "1.0.103"
|
||||
solana-logger = { path = "../../logger", version = "1.0.14" }
|
||||
solana-metrics = { path = "../../metrics", version = "1.0.14" }
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||
solana-logger = { path = "../../logger", version = "1.0.16" }
|
||||
solana-metrics = { path = "../../metrics", version = "1.0.16" }
|
||||
solana-sdk = { path = "../../sdk", version = "1.0.16" }
|
||||
thiserror = "1.0"
|
||||
|
||||
[lib]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-rayon-threadlimit"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "solana-rayon-threadlimit"
|
||||
homepage = "https://solana.com/"
|
||||
readme = "../README.md"
|
||||
|
@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-remote-wallet"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@@ -16,7 +16,7 @@ hidapi = { version = "1.1.1", default-features = false }
|
||||
log = "0.4.8"
|
||||
parking_lot = "0.10"
|
||||
semver = "0.9"
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
thiserror = "1.0"
|
||||
url = "2.1.1"
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-runtime"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana runtime"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -26,15 +26,15 @@ rand = "0.6.5"
|
||||
rayon = "1.2.0"
|
||||
serde = { version = "1.0.104", features = ["rc"] }
|
||||
serde_derive = "1.0.103"
|
||||
solana-bpf-loader-program = { path = "../programs/bpf_loader", version = "1.0.14" }
|
||||
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||
solana-measure = { path = "../measure", version = "1.0.14" }
|
||||
solana-metrics = { path = "../metrics", version = "1.0.14" }
|
||||
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-stake-program = { path = "../programs/stake", version = "1.0.14" }
|
||||
solana-storage-program = { path = "../programs/storage", version = "1.0.14" }
|
||||
solana-vote-program = { path = "../programs/vote", version = "1.0.14" }
|
||||
solana-bpf-loader-program = { path = "../programs/bpf_loader", version = "1.0.16" }
|
||||
solana-logger = { path = "../logger", version = "1.0.16" }
|
||||
solana-measure = { path = "../measure", version = "1.0.16" }
|
||||
solana-metrics = { path = "../metrics", version = "1.0.16" }
|
||||
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.16" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
solana-stake-program = { path = "../programs/stake", version = "1.0.16" }
|
||||
solana-storage-program = { path = "../programs/storage", version = "1.0.16" }
|
||||
solana-vote-program = { path = "../programs/vote", version = "1.0.16" }
|
||||
tempfile = "3.1.0"
|
||||
thiserror = "1.0"
|
||||
|
||||
@@ -45,4 +45,4 @@ name = "solana_runtime"
|
||||
|
||||
[dev-dependencies]
|
||||
assert_matches = "1.3.0"
|
||||
solana-noop-program = { path = "../programs/noop", version = "1.0.14" }
|
||||
solana-noop-program = { path = "../programs/noop", version = "1.0.16" }
|
||||
|
@@ -681,6 +681,74 @@ impl AccountsDB {
|
||||
drop(accounts_index);
|
||||
}
|
||||
|
||||
fn inc_store_counts(
|
||||
no_delete_id: AppendVecId,
|
||||
purges: &HashMap<Pubkey, Vec<(Slot, AccountInfo)>>,
|
||||
store_counts: &mut HashMap<AppendVecId, usize>,
|
||||
already_counted: &mut HashSet<AppendVecId>,
|
||||
) {
|
||||
if already_counted.contains(&no_delete_id) {
|
||||
return;
|
||||
}
|
||||
*store_counts.get_mut(&no_delete_id).unwrap() += 1;
|
||||
already_counted.insert(no_delete_id);
|
||||
let mut affected_pubkeys = HashSet::new();
|
||||
for (key, account_infos) in purges {
|
||||
for (_slot, account_info) in account_infos {
|
||||
if account_info.store_id == no_delete_id {
|
||||
affected_pubkeys.insert(key);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
for key in affected_pubkeys {
|
||||
for (_slot, account_info) in purges.get(&key).unwrap() {
|
||||
Self::inc_store_counts(
|
||||
account_info.store_id,
|
||||
purges,
|
||||
store_counts,
|
||||
already_counted,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn calc_delete_dependencies(
|
||||
accounts_index: &AccountsIndex<AccountInfo>,
|
||||
purges: &HashMap<Pubkey, Vec<(Slot, AccountInfo)>>,
|
||||
store_counts: &mut HashMap<AppendVecId, usize>,
|
||||
) {
|
||||
// Another pass to check if there are some filtered accounts which
|
||||
// do not match the criteria of deleting all appendvecs which contain them
|
||||
// then increment their storage count.
|
||||
let mut already_counted = HashSet::new();
|
||||
for (pubkey, account_infos) in purges.iter() {
|
||||
let no_delete =
|
||||
if account_infos.len() as u64 != accounts_index.ref_count_from_storage(&pubkey) {
|
||||
true
|
||||
} else {
|
||||
let mut no_delete = false;
|
||||
for (_slot, account_info) in account_infos {
|
||||
if *store_counts.get(&account_info.store_id).unwrap() != 0 {
|
||||
no_delete = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
no_delete
|
||||
};
|
||||
if no_delete {
|
||||
for (_slot_id, account_info) in account_infos {
|
||||
Self::inc_store_counts(
|
||||
account_info.store_id,
|
||||
&purges,
|
||||
store_counts,
|
||||
&mut already_counted,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Purge zero lamport accounts and older rooted account states as garbage
|
||||
// collection
|
||||
// Only remove those accounts where the entire rooted history of the account
|
||||
@@ -727,29 +795,7 @@ impl AccountsDB {
|
||||
}
|
||||
}
|
||||
|
||||
// Another pass to check if there are some filtered accounts which
|
||||
// do not match the criteria of deleting all appendvecs which contain them
|
||||
// then increment their storage count.
|
||||
for (pubkey, account_infos) in &purges {
|
||||
let no_delete =
|
||||
if account_infos.len() as u64 != accounts_index.ref_count_from_storage(&pubkey) {
|
||||
true
|
||||
} else {
|
||||
let mut no_delete = false;
|
||||
for (_slot, account_info) in account_infos {
|
||||
if *store_counts.get(&account_info.store_id).unwrap() != 0 {
|
||||
no_delete = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
no_delete
|
||||
};
|
||||
if no_delete {
|
||||
for (_slot_id, account_info) in account_infos {
|
||||
*store_counts.get_mut(&account_info.store_id).unwrap() += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
Self::calc_delete_dependencies(&accounts_index, &purges, &mut store_counts);
|
||||
|
||||
// Only keep purges where the entire history of the account in the root set
|
||||
// can be purged. All AppendVecs for those updates are dead.
|
||||
@@ -3388,4 +3434,69 @@ pub mod tests {
|
||||
dead_slots.insert(10);
|
||||
accounts.clean_dead_slots(&mut dead_slots);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_delete_dependencies() {
|
||||
solana_logger::setup();
|
||||
let mut accounts_index = AccountsIndex::default();
|
||||
let key0 = Pubkey::new_from_array([0u8; 32]);
|
||||
let key1 = Pubkey::new_from_array([1u8; 32]);
|
||||
let key2 = Pubkey::new_from_array([2u8; 32]);
|
||||
let info0 = AccountInfo {
|
||||
store_id: 0,
|
||||
offset: 0,
|
||||
lamports: 0,
|
||||
};
|
||||
let info1 = AccountInfo {
|
||||
store_id: 1,
|
||||
offset: 0,
|
||||
lamports: 0,
|
||||
};
|
||||
let info2 = AccountInfo {
|
||||
store_id: 2,
|
||||
offset: 0,
|
||||
lamports: 0,
|
||||
};
|
||||
let info3 = AccountInfo {
|
||||
store_id: 3,
|
||||
offset: 0,
|
||||
lamports: 0,
|
||||
};
|
||||
let mut reclaims = vec![];
|
||||
accounts_index.insert(0, &key0, info0.clone(), &mut reclaims);
|
||||
accounts_index.insert(1, &key0, info1.clone(), &mut reclaims);
|
||||
accounts_index.insert(1, &key1, info1.clone(), &mut reclaims);
|
||||
accounts_index.insert(2, &key1, info2.clone(), &mut reclaims);
|
||||
accounts_index.insert(2, &key2, info2.clone(), &mut reclaims);
|
||||
accounts_index.insert(3, &key2, info3.clone(), &mut reclaims);
|
||||
accounts_index.add_root(0);
|
||||
accounts_index.add_root(1);
|
||||
accounts_index.add_root(2);
|
||||
accounts_index.add_root(3);
|
||||
let mut purges = HashMap::new();
|
||||
purges.insert(key0, accounts_index.would_purge(&key0));
|
||||
purges.insert(key1, accounts_index.would_purge(&key1));
|
||||
purges.insert(key2, accounts_index.would_purge(&key2));
|
||||
for (key, list) in &purges {
|
||||
info!(" purge {} =>", key);
|
||||
for x in list {
|
||||
info!(" {:?}", x);
|
||||
}
|
||||
}
|
||||
|
||||
let mut store_counts = HashMap::new();
|
||||
store_counts.insert(0, 0);
|
||||
store_counts.insert(1, 0);
|
||||
store_counts.insert(2, 0);
|
||||
store_counts.insert(3, 1);
|
||||
AccountsDB::calc_delete_dependencies(&accounts_index, &purges, &mut store_counts);
|
||||
let mut stores: Vec<_> = store_counts.keys().cloned().collect();
|
||||
stores.sort();
|
||||
for store in &stores {
|
||||
info!("store: {:?} : {}", store, store_counts.get(&store).unwrap());
|
||||
}
|
||||
for x in 0..3 {
|
||||
assert!(store_counts[&x] >= 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-scripts"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
|
@@ -31,27 +31,33 @@ export RUST_MIN_STACK=8388608
|
||||
|
||||
echo "--- remove old coverage results"
|
||||
if [[ -d target/cov ]]; then
|
||||
find target/cov -name \*.gcda -delete
|
||||
find target/cov -type f -name '*.gcda' -delete
|
||||
fi
|
||||
rm -rf target/cov/$reportName
|
||||
mkdir -p target/cov
|
||||
|
||||
# Mark the base time for a clean room dir
|
||||
timing_file=target/cov/before-test
|
||||
touch "$timing_file"
|
||||
touch target/cov/before-test
|
||||
|
||||
source ci/rust-version.sh nightly
|
||||
|
||||
# Force rebuild of possibly-cached proc macro crates and build.rs because
|
||||
# we always want stable coverage for them
|
||||
# Don't support odd file names in our repo ever
|
||||
# shellcheck disable=SC2046
|
||||
touch \
|
||||
$(git ls-files :**/build.rs) \
|
||||
$(git grep -l "proc-macro.*true" :**/Cargo.toml | sed 's|Cargo.toml|src/lib.rs|')
|
||||
if [[ -n $CI || -z $1 ]]; then
|
||||
# shellcheck disable=SC2046
|
||||
touch \
|
||||
$(git ls-files :**/build.rs) \
|
||||
$(git grep -l "proc-macro.*true" :**/Cargo.toml | sed 's|Cargo.toml|src/lib.rs|')
|
||||
fi
|
||||
|
||||
RUST_LOG=solana=trace _ cargo +$rust_nightly test --target-dir target/cov --no-run "${packages[@]}"
|
||||
RUST_LOG=solana=trace _ cargo +$rust_nightly test --target-dir target/cov "${packages[@]}" 2> target/cov/coverage-stderr.log
|
||||
if RUST_LOG=solana=trace _ cargo +$rust_nightly test --target-dir target/cov "${packages[@]}" 2> target/cov/coverage-stderr.log; then
|
||||
test_status=0
|
||||
else
|
||||
test_status=$?
|
||||
fi
|
||||
touch target/cov/after-test
|
||||
|
||||
echo "--- grcov"
|
||||
|
||||
@@ -62,7 +68,7 @@ mkdir -p target/cov/tmp
|
||||
|
||||
# Can't use a simpler construct under the condition of SC2044 and bash 3
|
||||
# (macOS's default). See: https://github.com/koalaman/shellcheck/wiki/SC2044
|
||||
find target/cov -name \*.gcda -newer "$timing_file" -print0 |
|
||||
find target/cov -type f -name '*.gcda' -newer target/cov/before-test ! -newer target/cov/after-test -print0 |
|
||||
(while IFS= read -r -d '' gcda_file; do
|
||||
gcno_file="${gcda_file%.gcda}.gcno"
|
||||
ln -sf "../../../$gcda_file" "target/cov/tmp/$(basename "$gcda_file")"
|
||||
@@ -115,3 +121,6 @@ genhtml --output-directory target/cov/$reportName \
|
||||
)
|
||||
|
||||
ls -l target/cov/$reportName/index.html
|
||||
ln -sfT $reportName target/cov/LATEST
|
||||
|
||||
exit $test_status
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-sdk-c"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana SDK C"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -18,7 +18,7 @@ bs58 = "0.3.0"
|
||||
libc = "0.2.66"
|
||||
rand_chacha = "0.1.1"
|
||||
rand_core = { version = ">=0.2, <0.4", default-features = false }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
ed25519-dalek = "1.0.0-pre.1"
|
||||
|
||||
[build-dependencies]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-sdk"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana SDK"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -50,9 +50,9 @@ serde_json = { version = "1.0.46", optional = true }
|
||||
sha2 = "0.8.1"
|
||||
thiserror = "1.0"
|
||||
ed25519-dalek = { version = "=1.0.0-pre.1", optional = true }
|
||||
solana-crate-features = { path = "../crate-features", version = "1.0.14", optional = true }
|
||||
solana-logger = { path = "../logger", version = "1.0.14", optional = true }
|
||||
solana-sdk-macro = { path = "macro", version = "1.0.14" }
|
||||
solana-crate-features = { path = "../crate-features", version = "1.0.16", optional = true }
|
||||
solana-logger = { path = "../logger", version = "1.0.16", optional = true }
|
||||
solana-sdk-macro = { path = "macro", version = "1.0.16" }
|
||||
|
||||
[dev-dependencies]
|
||||
tiny-bip39 = "0.7.0"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-sdk-bpf-test"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana BPF SDK test utilities"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
|
@@ -12,6 +12,12 @@ download() {
|
||||
declare url=$1
|
||||
declare filename=$2
|
||||
declare progress=$3
|
||||
declare cache_filename=~/.cache/${filename//:\//_}
|
||||
|
||||
if [[ -r $cache_filename ]]; then
|
||||
ln -s "$cache_filename" "$filename"
|
||||
return
|
||||
fi
|
||||
|
||||
declare args=(
|
||||
"$url" -O "$filename"
|
||||
@@ -19,7 +25,12 @@ download() {
|
||||
"--retry-connrefused"
|
||||
"--read-timeout=30"
|
||||
)
|
||||
wget "${args[@]}"
|
||||
if wget "${args[@]}"; then
|
||||
mkdir -p ~/.cache
|
||||
cp "$filename" "$cache_filename"
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
# Install xargo
|
||||
@@ -123,11 +134,12 @@ fi
|
||||
# Install Rust-BPF Sysroot sources
|
||||
version=v0.12
|
||||
if [[ ! -f rust-bpf-sysroot-$version.md ]]; then
|
||||
|
||||
(
|
||||
set -ex
|
||||
rm -rf rust-bpf-sysroot*
|
||||
rm -rf xargo
|
||||
cmd="git clone --recursive --single-branch --branch $version https://github.com/solana-labs/rust-bpf-sysroot.git"
|
||||
cmd="git clone --recursive --depth 1 --single-branch --branch $version https://github.com/solana-labs/rust-bpf-sysroot.git"
|
||||
$cmd
|
||||
|
||||
echo "$cmd" > rust-bpf-sysroot-$version.md
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-sdk-macro"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
description = "Solana SDK Macro"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
|
@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-stake-monitor"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@@ -14,20 +14,20 @@ console = "0.10.0"
|
||||
log = "0.4.8"
|
||||
serde = "1.0.105"
|
||||
serde_yaml = "0.8.11"
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||
solana-cli-config = { path = "../cli-config", version = "1.0.14" }
|
||||
solana-client = { path = "../client", version = "1.0.14" }
|
||||
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||
solana-metrics = { path = "../metrics", version = "1.0.14" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||
solana-stake-program = { path = "../programs/stake", version = "1.0.14" }
|
||||
solana-transaction-status = { path = "../transaction-status", version = "1.0.14" }
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.16" }
|
||||
solana-cli-config = { path = "../cli-config", version = "1.0.16" }
|
||||
solana-client = { path = "../client", version = "1.0.16" }
|
||||
solana-logger = { path = "../logger", version = "1.0.16" }
|
||||
solana-metrics = { path = "../metrics", version = "1.0.16" }
|
||||
solana-sdk = { path = "../sdk", version = "1.0.16" }
|
||||
solana-stake-program = { path = "../programs/stake", version = "1.0.16" }
|
||||
solana-transaction-status = { path = "../transaction-status", version = "1.0.16" }
|
||||
|
||||
[dev-dependencies]
|
||||
serial_test = "0.4.0"
|
||||
serial_test_derive = "0.4.0"
|
||||
solana-local-cluster = { path = "../local-cluster", version = "1.0.14" }
|
||||
solana-core = { path = "../core", version = "1.0.14" }
|
||||
solana-local-cluster = { path = "../local-cluster", version = "1.0.16" }
|
||||
solana-core = { path = "../core", version = "1.0.16" }
|
||||
tempfile = "3.1.0"
|
||||
|
||||
[[bin]]
|
||||
|
@@ -12,3 +12,6 @@ In terms of `solana` command-line subcommands:
|
||||
* `delegate-stake` / `deactivate-stake` / `stake-authorize` / `split-stake`: These commands do not affect compliance
|
||||
* `withdraw-stake` / `stake-set-lockup`: These commands will cause non-compliance
|
||||
* `transfer`: Any additional funds transferred after `create-stake-account` are excluded from the "compliant balance"
|
||||
|
||||
System accounts can also be manually enrolled with the `solana-stake-monitor enroll` subcommand.
|
||||
An enrolled system account must always maintain a balance greater than the balance it had at enrollment minus 1 SOL.
|
||||
|
@@ -3,8 +3,8 @@ use serde::{Deserialize, Serialize};
|
||||
use solana_client::{client_error::Result as ClientResult, rpc_client::RpcClient};
|
||||
use solana_metrics::{datapoint_error, datapoint_info};
|
||||
use solana_sdk::{
|
||||
clock::Slot, program_utils::limited_deserialize, pubkey::Pubkey, signature::Signature,
|
||||
transaction::Transaction,
|
||||
clock::Slot, native_token::LAMPORTS_PER_SOL, program_utils::limited_deserialize,
|
||||
pubkey::Pubkey, signature::Signature, transaction::Transaction,
|
||||
};
|
||||
use solana_stake_program::{stake_instruction::StakeInstruction, stake_state::Lockup};
|
||||
use solana_transaction_status::{ConfirmedBlock, RpcTransactionStatusMeta, TransactionEncoding};
|
||||
@@ -203,7 +203,9 @@ fn process_transaction(
|
||||
for (index, account_pubkey) in message.account_keys.iter().enumerate() {
|
||||
if let Some(mut account_info) = accounts.get_mut(&account_pubkey.to_string()) {
|
||||
let post_balance = meta.post_balances[index];
|
||||
if account_info.compliant_since.is_some() && post_balance < account_info.lamports {
|
||||
if account_info.compliant_since.is_some()
|
||||
&& post_balance <= account_info.lamports.saturating_sub(LAMPORTS_PER_SOL)
|
||||
{
|
||||
account_info.compliant_since = None;
|
||||
account_info.transactions.push(AccountTransactionInfo {
|
||||
op: AccountOperation::FailedToMaintainMinimumBalance,
|
||||
|
@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-sys-tuner"
|
||||
description = "The solana cluster system tuner daemon"
|
||||
version = "1.0.14"
|
||||
version = "1.0.16"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@@ -13,8 +13,8 @@ publish = true
|
||||
clap = "2.33.0"
|
||||
log = "0.4.8"
|
||||
libc = "0.2.66"
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.16" }
|
||||
solana-logger = { path = "../logger", version = "1.0.16" }
|
||||
|
||||
[target."cfg(unix)".dependencies]
|
||||
unix_socket2 = "0.5.4"
|
||||
|
@@ -93,7 +93,7 @@ fn tune_kernel_udp_buffers_and_vmmap() {
|
||||
sysctl_write("net.core.wmem_default", "134217728");
|
||||
|
||||
// increase mmap counts for many append_vecs
|
||||
sysctl_write("vm.max_map_count", "262144");
|
||||
sysctl_write("vm.max_map_count", "1000000");
|
||||
}
|
||||
|
||||
#[cfg(unix)]
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user