Compare commits
10 Commits
Author | SHA1 | Date | |
---|---|---|---|
8631be42ac | |||
09367369ef | |||
23b8c95cc4 | |||
e61392b057 | |||
7deba20395 | |||
274c097f84 | |||
1c7cea1af4 | |||
4406496d2f | |||
a15fa4840c | |||
c9030660d6 |
733
Cargo.lock
generated
733
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@ -48,6 +48,7 @@ members = [
|
|||||||
"sdk",
|
"sdk",
|
||||||
"sdk-c",
|
"sdk-c",
|
||||||
"scripts",
|
"scripts",
|
||||||
|
"stake-monitor",
|
||||||
"sys-tuner",
|
"sys-tuner",
|
||||||
"transaction-status",
|
"transaction-status",
|
||||||
"upload-perf",
|
"upload-perf",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-archiver-lib"
|
name = "solana-archiver-lib"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana Archiver Library"
|
description = "Solana Archiver Library"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -15,22 +15,22 @@ ed25519-dalek = "=1.0.0-pre.1"
|
|||||||
log = "0.4.8"
|
log = "0.4.8"
|
||||||
rand = "0.6.5"
|
rand = "0.6.5"
|
||||||
rand_chacha = "0.1.1"
|
rand_chacha = "0.1.1"
|
||||||
solana-client = { path = "../client", version = "1.0.13" }
|
solana-client = { path = "../client", version = "1.0.14" }
|
||||||
solana-storage-program = { path = "../programs/storage", version = "1.0.13" }
|
solana-storage-program = { path = "../programs/storage", version = "1.0.14" }
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
serde = "1.0.104"
|
serde = "1.0.104"
|
||||||
serde_json = "1.0.46"
|
serde_json = "1.0.46"
|
||||||
serde_derive = "1.0.103"
|
serde_derive = "1.0.103"
|
||||||
solana-net-utils = { path = "../net-utils", version = "1.0.13" }
|
solana-net-utils = { path = "../net-utils", version = "1.0.14" }
|
||||||
solana-chacha = { path = "../chacha", version = "1.0.13" }
|
solana-chacha = { path = "../chacha", version = "1.0.14" }
|
||||||
solana-chacha-sys = { path = "../chacha-sys", version = "1.0.13" }
|
solana-chacha-sys = { path = "../chacha-sys", version = "1.0.14" }
|
||||||
solana-ledger = { path = "../ledger", version = "1.0.13" }
|
solana-ledger = { path = "../ledger", version = "1.0.14" }
|
||||||
solana-logger = { path = "../logger", version = "1.0.13" }
|
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||||
solana-perf = { path = "../perf", version = "1.0.13" }
|
solana-perf = { path = "../perf", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
solana-core = { path = "../core", version = "1.0.13" }
|
solana-core = { path = "../core", version = "1.0.14" }
|
||||||
solana-archiver-utils = { path = "../archiver-utils", version = "1.0.13" }
|
solana-archiver-utils = { path = "../archiver-utils", version = "1.0.14" }
|
||||||
solana-metrics = { path = "../metrics", version = "1.0.13" }
|
solana-metrics = { path = "../metrics", version = "1.0.14" }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
hex = "0.4.0"
|
hex = "0.4.0"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-archiver-utils"
|
name = "solana-archiver-utils"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana Archiver Utils"
|
description = "Solana Archiver Utils"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -11,12 +11,12 @@ edition = "2018"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
log = "0.4.8"
|
log = "0.4.8"
|
||||||
rand = "0.6.5"
|
rand = "0.6.5"
|
||||||
solana-chacha = { path = "../chacha", version = "1.0.13" }
|
solana-chacha = { path = "../chacha", version = "1.0.14" }
|
||||||
solana-chacha-sys = { path = "../chacha-sys", version = "1.0.13" }
|
solana-chacha-sys = { path = "../chacha-sys", version = "1.0.14" }
|
||||||
solana-ledger = { path = "../ledger", version = "1.0.13" }
|
solana-ledger = { path = "../ledger", version = "1.0.14" }
|
||||||
solana-logger = { path = "../logger", version = "1.0.13" }
|
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||||
solana-perf = { path = "../perf", version = "1.0.13" }
|
solana-perf = { path = "../perf", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
hex = "0.4.0"
|
hex = "0.4.0"
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "solana-archiver"
|
name = "solana-archiver"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
@ -10,11 +10,11 @@ homepage = "https://solana.com/"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
clap = "2.33.0"
|
clap = "2.33.0"
|
||||||
console = "0.9.2"
|
console = "0.9.2"
|
||||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.13" }
|
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||||
solana-core = { path = "../core", version = "1.0.13" }
|
solana-core = { path = "../core", version = "1.0.14" }
|
||||||
solana-logger = { path = "../logger", version = "1.0.13" }
|
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||||
solana-metrics = { path = "../metrics", version = "1.0.13" }
|
solana-metrics = { path = "../metrics", version = "1.0.14" }
|
||||||
solana-archiver-lib = { path = "../archiver-lib", version = "1.0.13" }
|
solana-archiver-lib = { path = "../archiver-lib", version = "1.0.14" }
|
||||||
solana-net-utils = { path = "../net-utils", version = "1.0.13" }
|
solana-net-utils = { path = "../net-utils", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "solana-banking-bench"
|
name = "solana-banking-bench"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
@ -10,11 +10,11 @@ homepage = "https://solana.com/"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
log = "0.4.6"
|
log = "0.4.6"
|
||||||
rayon = "1.2.0"
|
rayon = "1.2.0"
|
||||||
solana-core = { path = "../core", version = "1.0.13" }
|
solana-core = { path = "../core", version = "1.0.14" }
|
||||||
solana-ledger = { path = "../ledger", version = "1.0.13" }
|
solana-ledger = { path = "../ledger", version = "1.0.14" }
|
||||||
solana-logger = { path = "../logger", version = "1.0.13" }
|
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||||
solana-runtime = { path = "../runtime", version = "1.0.13" }
|
solana-runtime = { path = "../runtime", version = "1.0.14" }
|
||||||
solana-measure = { path = "../measure", version = "1.0.13" }
|
solana-measure = { path = "../measure", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
rand = "0.6.5"
|
rand = "0.6.5"
|
||||||
crossbeam-channel = "0.3"
|
crossbeam-channel = "0.3"
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "solana-bench-exchange"
|
name = "solana-bench-exchange"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
@ -18,17 +18,17 @@ rand = "0.6.5"
|
|||||||
rayon = "1.2.0"
|
rayon = "1.2.0"
|
||||||
serde_json = "1.0.46"
|
serde_json = "1.0.46"
|
||||||
serde_yaml = "0.8.11"
|
serde_yaml = "0.8.11"
|
||||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.13" }
|
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||||
solana-core = { path = "../core", version = "1.0.13" }
|
solana-core = { path = "../core", version = "1.0.14" }
|
||||||
solana-genesis = { path = "../genesis", version = "1.0.13" }
|
solana-genesis = { path = "../genesis", version = "1.0.14" }
|
||||||
solana-client = { path = "../client", version = "1.0.13" }
|
solana-client = { path = "../client", version = "1.0.14" }
|
||||||
solana-faucet = { path = "../faucet", version = "1.0.13" }
|
solana-faucet = { path = "../faucet", version = "1.0.14" }
|
||||||
solana-exchange-program = { path = "../programs/exchange", version = "1.0.13" }
|
solana-exchange-program = { path = "../programs/exchange", version = "1.0.14" }
|
||||||
solana-logger = { path = "../logger", version = "1.0.13" }
|
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||||
solana-metrics = { path = "../metrics", version = "1.0.13" }
|
solana-metrics = { path = "../metrics", version = "1.0.14" }
|
||||||
solana-net-utils = { path = "../net-utils", version = "1.0.13" }
|
solana-net-utils = { path = "../net-utils", version = "1.0.14" }
|
||||||
solana-runtime = { path = "../runtime", version = "1.0.13" }
|
solana-runtime = { path = "../runtime", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
solana-local-cluster = { path = "../local-cluster", version = "1.0.13" }
|
solana-local-cluster = { path = "../local-cluster", version = "1.0.14" }
|
||||||
|
@ -2,14 +2,14 @@
|
|||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "solana-bench-streamer"
|
name = "solana-bench-streamer"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
clap = "2.33.0"
|
clap = "2.33.0"
|
||||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.13" }
|
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||||
solana-core = { path = "../core", version = "1.0.13" }
|
solana-core = { path = "../core", version = "1.0.14" }
|
||||||
solana-logger = { path = "../logger", version = "1.0.13" }
|
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||||
solana-net-utils = { path = "../net-utils", version = "1.0.13" }
|
solana-net-utils = { path = "../net-utils", version = "1.0.14" }
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "solana-bench-tps"
|
name = "solana-bench-tps"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
@ -14,24 +14,24 @@ log = "0.4.8"
|
|||||||
rayon = "1.2.0"
|
rayon = "1.2.0"
|
||||||
serde_json = "1.0.46"
|
serde_json = "1.0.46"
|
||||||
serde_yaml = "0.8.11"
|
serde_yaml = "0.8.11"
|
||||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.13" }
|
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||||
solana-core = { path = "../core", version = "1.0.13" }
|
solana-core = { path = "../core", version = "1.0.14" }
|
||||||
solana-genesis = { path = "../genesis", version = "1.0.13" }
|
solana-genesis = { path = "../genesis", version = "1.0.14" }
|
||||||
solana-client = { path = "../client", version = "1.0.13" }
|
solana-client = { path = "../client", version = "1.0.14" }
|
||||||
solana-faucet = { path = "../faucet", version = "1.0.13" }
|
solana-faucet = { path = "../faucet", version = "1.0.14" }
|
||||||
solana-librapay = { path = "../programs/librapay", version = "1.0.13", optional = true }
|
solana-librapay = { path = "../programs/librapay", version = "1.0.14", optional = true }
|
||||||
solana-logger = { path = "../logger", version = "1.0.13" }
|
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||||
solana-metrics = { path = "../metrics", version = "1.0.13" }
|
solana-metrics = { path = "../metrics", version = "1.0.14" }
|
||||||
solana-measure = { path = "../measure", version = "1.0.13" }
|
solana-measure = { path = "../measure", version = "1.0.14" }
|
||||||
solana-net-utils = { path = "../net-utils", version = "1.0.13" }
|
solana-net-utils = { path = "../net-utils", version = "1.0.14" }
|
||||||
solana-runtime = { path = "../runtime", version = "1.0.13" }
|
solana-runtime = { path = "../runtime", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
solana-move-loader-program = { path = "../programs/move_loader", version = "1.0.13", optional = true }
|
solana-move-loader-program = { path = "../programs/move_loader", version = "1.0.14", optional = true }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
serial_test = "0.3.2"
|
serial_test = "0.3.2"
|
||||||
serial_test_derive = "0.4.0"
|
serial_test_derive = "0.4.0"
|
||||||
solana-local-cluster = { path = "../local-cluster", version = "1.0.13" }
|
solana-local-cluster = { path = "../local-cluster", version = "1.0.14" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
move = ["solana-librapay", "solana-move-loader-program"]
|
move = ["solana-librapay", "solana-move-loader-program"]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-chacha-cuda"
|
name = "solana-chacha-cuda"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana Chacha Cuda APIs"
|
description = "Solana Chacha Cuda APIs"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -10,12 +10,12 @@ edition = "2018"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
log = "0.4.8"
|
log = "0.4.8"
|
||||||
solana-archiver-utils = { path = "../archiver-utils", version = "1.0.13" }
|
solana-archiver-utils = { path = "../archiver-utils", version = "1.0.14" }
|
||||||
solana-chacha = { path = "../chacha", version = "1.0.13" }
|
solana-chacha = { path = "../chacha", version = "1.0.14" }
|
||||||
solana-ledger = { path = "../ledger", version = "1.0.13" }
|
solana-ledger = { path = "../ledger", version = "1.0.14" }
|
||||||
solana-logger = { path = "../logger", version = "1.0.13" }
|
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||||
solana-perf = { path = "../perf", version = "1.0.13" }
|
solana-perf = { path = "../perf", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
hex-literal = "0.2.1"
|
hex-literal = "0.2.1"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-chacha-sys"
|
name = "solana-chacha-sys"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana chacha-sys"
|
description = "Solana chacha-sys"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-chacha"
|
name = "solana-chacha"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana Chacha APIs"
|
description = "Solana Chacha APIs"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -12,11 +12,11 @@ edition = "2018"
|
|||||||
log = "0.4.8"
|
log = "0.4.8"
|
||||||
rand = "0.6.5"
|
rand = "0.6.5"
|
||||||
rand_chacha = "0.1.1"
|
rand_chacha = "0.1.1"
|
||||||
solana-chacha-sys = { path = "../chacha-sys", version = "1.0.13" }
|
solana-chacha-sys = { path = "../chacha-sys", version = "1.0.14" }
|
||||||
solana-ledger = { path = "../ledger", version = "1.0.13" }
|
solana-ledger = { path = "../ledger", version = "1.0.14" }
|
||||||
solana-logger = { path = "../logger", version = "1.0.13" }
|
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||||
solana-perf = { path = "../perf", version = "1.0.13" }
|
solana-perf = { path = "../perf", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
hex-literal = "0.2.1"
|
hex-literal = "0.2.1"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-clap-utils"
|
name = "solana-clap-utils"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana utilities for the clap"
|
description = "Solana utilities for the clap"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -11,8 +11,8 @@ edition = "2018"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
clap = "2.33.0"
|
clap = "2.33.0"
|
||||||
rpassword = "4.0"
|
rpassword = "4.0"
|
||||||
solana-remote-wallet = { path = "../remote-wallet", version = "1.0.13" }
|
solana-remote-wallet = { path = "../remote-wallet", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
thiserror = "1.0.11"
|
thiserror = "1.0.11"
|
||||||
tiny-bip39 = "0.7.0"
|
tiny-bip39 = "0.7.0"
|
||||||
url = "2.1.0"
|
url = "2.1.0"
|
||||||
|
@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "solana-cli-config"
|
name = "solana-cli-config"
|
||||||
description = "Blockchain, Rebuilt for Scale"
|
description = "Blockchain, Rebuilt for Scale"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
|
@ -1,10 +1,6 @@
|
|||||||
// Wallet settings that can be configured for long-term use
|
// Wallet settings that can be configured for long-term use
|
||||||
use serde_derive::{Deserialize, Serialize};
|
use serde_derive::{Deserialize, Serialize};
|
||||||
use std::{
|
use std::io;
|
||||||
fs::{create_dir_all, File},
|
|
||||||
io::{self, Write},
|
|
||||||
path::Path,
|
|
||||||
};
|
|
||||||
use url::Url;
|
use url::Url;
|
||||||
|
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
@ -46,23 +42,11 @@ impl Default for Config {
|
|||||||
|
|
||||||
impl Config {
|
impl Config {
|
||||||
pub fn load(config_file: &str) -> Result<Self, io::Error> {
|
pub fn load(config_file: &str) -> Result<Self, io::Error> {
|
||||||
let file = File::open(config_file.to_string())?;
|
crate::load_config_file(config_file)
|
||||||
let config = serde_yaml::from_reader(file)
|
|
||||||
.map_err(|err| io::Error::new(io::ErrorKind::Other, format!("{:?}", err)))?;
|
|
||||||
Ok(config)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn save(&self, config_file: &str) -> Result<(), io::Error> {
|
pub fn save(&self, config_file: &str) -> Result<(), io::Error> {
|
||||||
let serialized = serde_yaml::to_string(self)
|
crate::save_config_file(self, config_file)
|
||||||
.map_err(|err| io::Error::new(io::ErrorKind::Other, format!("{:?}", err)))?;
|
|
||||||
|
|
||||||
if let Some(outdir) = Path::new(&config_file).parent() {
|
|
||||||
create_dir_all(outdir)?;
|
|
||||||
}
|
|
||||||
let mut file = File::create(config_file)?;
|
|
||||||
file.write_all(&serialized.into_bytes())?;
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn compute_websocket_url(json_rpc_url: &str) -> String {
|
pub fn compute_websocket_url(json_rpc_url: &str) -> String {
|
||||||
|
@ -3,3 +3,37 @@ extern crate lazy_static;
|
|||||||
|
|
||||||
mod config;
|
mod config;
|
||||||
pub use config::{Config, CONFIG_FILE};
|
pub use config::{Config, CONFIG_FILE};
|
||||||
|
|
||||||
|
use std::{
|
||||||
|
fs::{create_dir_all, File},
|
||||||
|
io::{self, Write},
|
||||||
|
path::Path,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub fn load_config_file<T, P>(config_file: P) -> Result<T, io::Error>
|
||||||
|
where
|
||||||
|
T: serde::de::DeserializeOwned,
|
||||||
|
P: AsRef<Path>,
|
||||||
|
{
|
||||||
|
let file = File::open(config_file)?;
|
||||||
|
let config = serde_yaml::from_reader(file)
|
||||||
|
.map_err(|err| io::Error::new(io::ErrorKind::Other, format!("{:?}", err)))?;
|
||||||
|
Ok(config)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn save_config_file<T, P>(config: &T, config_file: P) -> Result<(), io::Error>
|
||||||
|
where
|
||||||
|
T: serde::ser::Serialize,
|
||||||
|
P: AsRef<Path>,
|
||||||
|
{
|
||||||
|
let serialized = serde_yaml::to_string(config)
|
||||||
|
.map_err(|err| io::Error::new(io::ErrorKind::Other, format!("{:?}", err)))?;
|
||||||
|
|
||||||
|
if let Some(outdir) = config_file.as_ref().parent() {
|
||||||
|
create_dir_all(outdir)?;
|
||||||
|
}
|
||||||
|
let mut file = File::create(config_file)?;
|
||||||
|
file.write_all(&serialized.into_bytes())?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "solana-cli"
|
name = "solana-cli"
|
||||||
description = "Blockchain, Rebuilt for Scale"
|
description = "Blockchain, Rebuilt for Scale"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
@ -26,28 +26,28 @@ reqwest = { version = "0.10.1", default-features = false, features = ["blocking"
|
|||||||
serde = "1.0.104"
|
serde = "1.0.104"
|
||||||
serde_derive = "1.0.103"
|
serde_derive = "1.0.103"
|
||||||
serde_json = "1.0.46"
|
serde_json = "1.0.46"
|
||||||
solana-budget-program = { path = "../programs/budget", version = "1.0.13" }
|
solana-budget-program = { path = "../programs/budget", version = "1.0.14" }
|
||||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.13" }
|
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||||
solana-cli-config = { path = "../cli-config", version = "1.0.13" }
|
solana-cli-config = { path = "../cli-config", version = "1.0.14" }
|
||||||
solana-client = { path = "../client", version = "1.0.13" }
|
solana-client = { path = "../client", version = "1.0.14" }
|
||||||
solana-config-program = { path = "../programs/config", version = "1.0.13" }
|
solana-config-program = { path = "../programs/config", version = "1.0.14" }
|
||||||
solana-faucet = { path = "../faucet", version = "1.0.13" }
|
solana-faucet = { path = "../faucet", version = "1.0.14" }
|
||||||
solana-logger = { path = "../logger", version = "1.0.13" }
|
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||||
solana-net-utils = { path = "../net-utils", version = "1.0.13" }
|
solana-net-utils = { path = "../net-utils", version = "1.0.14" }
|
||||||
solana-remote-wallet = { path = "../remote-wallet", version = "1.0.13" }
|
solana-remote-wallet = { path = "../remote-wallet", version = "1.0.14" }
|
||||||
solana-runtime = { path = "../runtime", version = "1.0.13" }
|
solana-runtime = { path = "../runtime", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
solana-stake-program = { path = "../programs/stake", version = "1.0.13" }
|
solana-stake-program = { path = "../programs/stake", version = "1.0.14" }
|
||||||
solana-storage-program = { path = "../programs/storage", version = "1.0.13" }
|
solana-storage-program = { path = "../programs/storage", version = "1.0.14" }
|
||||||
solana-vote-program = { path = "../programs/vote", version = "1.0.13" }
|
solana-vote-program = { path = "../programs/vote", version = "1.0.14" }
|
||||||
solana-vote-signer = { path = "../vote-signer", version = "1.0.13" }
|
solana-vote-signer = { path = "../vote-signer", version = "1.0.14" }
|
||||||
titlecase = "1.1.0"
|
titlecase = "1.1.0"
|
||||||
thiserror = "1.0.11"
|
thiserror = "1.0.11"
|
||||||
url = "2.1.1"
|
url = "2.1.1"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
solana-core = { path = "../core", version = "1.0.13" }
|
solana-core = { path = "../core", version = "1.0.14" }
|
||||||
solana-budget-program = { path = "../programs/budget", version = "1.0.13" }
|
solana-budget-program = { path = "../programs/budget", version = "1.0.14" }
|
||||||
tempfile = "3.1.0"
|
tempfile = "3.1.0"
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
|
@ -1153,7 +1153,7 @@ fn process_balance(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn process_confirm(rpc_client: &RpcClient, signature: &Signature) -> ProcessResult {
|
fn process_confirm(rpc_client: &RpcClient, signature: &Signature) -> ProcessResult {
|
||||||
match rpc_client.get_signature_status(&signature.to_string()) {
|
match rpc_client.get_signature_status(&signature) {
|
||||||
Ok(status) => {
|
Ok(status) => {
|
||||||
if let Some(result) = status {
|
if let Some(result) = status {
|
||||||
match result {
|
match result {
|
||||||
@ -2165,7 +2165,7 @@ pub fn request_and_confirm_airdrop(
|
|||||||
log_instruction_custom_error::<SystemError>(result)
|
log_instruction_custom_error::<SystemError>(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn log_instruction_custom_error<E>(result: ClientResult<String>) -> ProcessResult
|
pub fn log_instruction_custom_error<E>(result: ClientResult<Signature>) -> ProcessResult
|
||||||
where
|
where
|
||||||
E: 'static + std::error::Error + DecodeError<E> + FromPrimitive,
|
E: 'static + std::error::Error + DecodeError<E> + FromPrimitive,
|
||||||
{
|
{
|
||||||
@ -2182,7 +2182,7 @@ where
|
|||||||
}
|
}
|
||||||
Err(err.into())
|
Err(err.into())
|
||||||
}
|
}
|
||||||
Ok(sig) => Ok(sig),
|
Ok(sig) => Ok(sig.to_string()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -266,8 +266,8 @@ pub fn process_claim_storage_reward(
|
|||||||
&fee_calculator,
|
&fee_calculator,
|
||||||
&tx.message,
|
&tx.message,
|
||||||
)?;
|
)?;
|
||||||
let signature_str = rpc_client.send_and_confirm_transaction_with_spinner(&mut tx, &signers)?;
|
let signature = rpc_client.send_and_confirm_transaction_with_spinner(&mut tx, &signers)?;
|
||||||
Ok(signature_str)
|
Ok(signature.to_string())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn process_show_storage_account(
|
pub fn process_show_storage_account(
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-client"
|
name = "solana-client"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana Client"
|
description = "Solana Client"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -19,10 +19,10 @@ reqwest = { version = "0.10.1", default-features = false, features = ["blocking"
|
|||||||
serde = "1.0.104"
|
serde = "1.0.104"
|
||||||
serde_derive = "1.0.103"
|
serde_derive = "1.0.103"
|
||||||
serde_json = "1.0.46"
|
serde_json = "1.0.46"
|
||||||
solana-net-utils = { path = "../net-utils", version = "1.0.13" }
|
solana-net-utils = { path = "../net-utils", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
solana-transaction-status = { path = "../transaction-status", version = "1.0.13" }
|
solana-transaction-status = { path = "../transaction-status", version = "1.0.14" }
|
||||||
solana-vote-program = { path = "../programs/vote", version = "1.0.13" }
|
solana-vote-program = { path = "../programs/vote", version = "1.0.14" }
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
tungstenite = "0.10.1"
|
tungstenite = "0.10.1"
|
||||||
url = "2.1.1"
|
url = "2.1.1"
|
||||||
@ -31,4 +31,4 @@ url = "2.1.1"
|
|||||||
assert_matches = "1.3.0"
|
assert_matches = "1.3.0"
|
||||||
jsonrpc-core = "14.0.5"
|
jsonrpc-core = "14.0.5"
|
||||||
jsonrpc-http-server = "14.0.6"
|
jsonrpc-http-server = "14.0.6"
|
||||||
solana-logger = { path = "../logger", version = "1.0.13" }
|
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||||
|
@ -40,7 +40,7 @@ impl GenericRpcClientRequest for MockRpcClientRequest {
|
|||||||
fn send(
|
fn send(
|
||||||
&self,
|
&self,
|
||||||
request: &RpcRequest,
|
request: &RpcRequest,
|
||||||
params: serde_json::Value,
|
_params: serde_json::Value,
|
||||||
_retries: usize,
|
_retries: usize,
|
||||||
) -> Result<serde_json::Value> {
|
) -> Result<serde_json::Value> {
|
||||||
if let Some(value) = self.mocks.write().unwrap().remove(request) {
|
if let Some(value) = self.mocks.write().unwrap().remove(request) {
|
||||||
@ -50,17 +50,6 @@ impl GenericRpcClientRequest for MockRpcClientRequest {
|
|||||||
return Ok(Value::Null);
|
return Ok(Value::Null);
|
||||||
}
|
}
|
||||||
let val = match request {
|
let val = match request {
|
||||||
RpcRequest::ConfirmTransaction => {
|
|
||||||
if let Some(params_array) = params.as_array() {
|
|
||||||
if let Value::String(param_string) = ¶ms_array[0] {
|
|
||||||
Value::Bool(param_string == SIGNATURE)
|
|
||||||
} else {
|
|
||||||
Value::Null
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Value::Null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
RpcRequest::GetBalance => serde_json::to_value(Response {
|
RpcRequest::GetBalance => serde_json::to_value(Response {
|
||||||
context: RpcResponseContext { slot: 1 },
|
context: RpcResponseContext { slot: 1 },
|
||||||
value: Value::Number(Number::from(50)),
|
value: Value::Number(Number::from(50)),
|
||||||
@ -87,21 +76,6 @@ impl GenericRpcClientRequest for MockRpcClientRequest {
|
|||||||
context: RpcResponseContext { slot: 1 },
|
context: RpcResponseContext { slot: 1 },
|
||||||
value: serde_json::to_value(FeeRateGovernor::default()).unwrap(),
|
value: serde_json::to_value(FeeRateGovernor::default()).unwrap(),
|
||||||
})?,
|
})?,
|
||||||
RpcRequest::GetSignatureStatus => {
|
|
||||||
let response: Option<transaction::Result<()>> = if self.url == "account_in_use" {
|
|
||||||
Some(Err(TransactionError::AccountInUse))
|
|
||||||
} else if self.url == "instruction_error" {
|
|
||||||
Some(Err(TransactionError::InstructionError(
|
|
||||||
0,
|
|
||||||
InstructionError::UninitializedAccount,
|
|
||||||
)))
|
|
||||||
} else if self.url == "sig_not_found" {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
Some(Ok(()))
|
|
||||||
};
|
|
||||||
serde_json::to_value(response).unwrap()
|
|
||||||
}
|
|
||||||
RpcRequest::GetSignatureStatuses => {
|
RpcRequest::GetSignatureStatuses => {
|
||||||
let status: transaction::Result<()> = if self.url == "account_in_use" {
|
let status: transaction::Result<()> = if self.url == "account_in_use" {
|
||||||
Err(TransactionError::AccountInUse)
|
Err(TransactionError::AccountInUse)
|
||||||
@ -116,10 +90,12 @@ impl GenericRpcClientRequest for MockRpcClientRequest {
|
|||||||
let status = if self.url == "sig_not_found" {
|
let status = if self.url == "sig_not_found" {
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
|
let err = status.clone().err();
|
||||||
Some(TransactionStatus {
|
Some(TransactionStatus {
|
||||||
status,
|
status,
|
||||||
slot: 1,
|
slot: 1,
|
||||||
confirmations: Some(0),
|
confirmations: None,
|
||||||
|
err,
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
serde_json::to_value(Response {
|
serde_json::to_value(Response {
|
||||||
|
@ -27,12 +27,11 @@ use solana_sdk::{
|
|||||||
signers::Signers,
|
signers::Signers,
|
||||||
transaction::{self, Transaction, TransactionError},
|
transaction::{self, Transaction, TransactionError},
|
||||||
};
|
};
|
||||||
use solana_transaction_status::{ConfirmedBlock, TransactionStatus};
|
use solana_transaction_status::{ConfirmedBlock, TransactionEncoding, TransactionStatus};
|
||||||
use solana_vote_program::vote_state::MAX_LOCKOUT_HISTORY;
|
use solana_vote_program::vote_state::MAX_LOCKOUT_HISTORY;
|
||||||
use std::{
|
use std::{
|
||||||
error,
|
error,
|
||||||
net::SocketAddr,
|
net::SocketAddr,
|
||||||
str::FromStr,
|
|
||||||
thread::sleep,
|
thread::sleep,
|
||||||
time::{Duration, Instant},
|
time::{Duration, Instant},
|
||||||
};
|
};
|
||||||
@ -71,7 +70,7 @@ impl RpcClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn confirm_transaction(&self, signature: &str) -> ClientResult<bool> {
|
pub fn confirm_transaction(&self, signature: &Signature) -> ClientResult<bool> {
|
||||||
Ok(self
|
Ok(self
|
||||||
.confirm_transaction_with_commitment(signature, CommitmentConfig::default())?
|
.confirm_transaction_with_commitment(signature, CommitmentConfig::default())?
|
||||||
.value)
|
.value)
|
||||||
@ -79,49 +78,64 @@ impl RpcClient {
|
|||||||
|
|
||||||
pub fn confirm_transaction_with_commitment(
|
pub fn confirm_transaction_with_commitment(
|
||||||
&self,
|
&self,
|
||||||
signature: &str,
|
signature: &Signature,
|
||||||
commitment_config: CommitmentConfig,
|
commitment_config: CommitmentConfig,
|
||||||
) -> RpcResult<bool> {
|
) -> RpcResult<bool> {
|
||||||
let response = self
|
let Response { context, value } = self.get_signature_statuses(&[*signature])?;
|
||||||
.client
|
|
||||||
.send(
|
|
||||||
&RpcRequest::ConfirmTransaction,
|
|
||||||
json!([signature, commitment_config]),
|
|
||||||
0,
|
|
||||||
)
|
|
||||||
.map_err(|err| err.into_with_command("ConfirmTransaction"))?;
|
|
||||||
|
|
||||||
serde_json::from_value::<Response<bool>>(response)
|
Ok(Response {
|
||||||
.map_err(|err| ClientError::new_with_command(err.into(), "ConfirmTransaction"))
|
context,
|
||||||
|
value: value[0]
|
||||||
|
.as_ref()
|
||||||
|
.filter(|result| result.satisfies_commitment(commitment_config))
|
||||||
|
.map(|result| result.status.is_ok())
|
||||||
|
.unwrap_or_default(),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn send_transaction(&self, transaction: &Transaction) -> ClientResult<String> {
|
pub fn send_transaction(&self, transaction: &Transaction) -> ClientResult<Signature> {
|
||||||
let serialized_encoded = bs58::encode(serialize(transaction).unwrap()).into_string();
|
let serialized_encoded = bs58::encode(serialize(transaction).unwrap()).into_string();
|
||||||
let signature =
|
let response =
|
||||||
self.client
|
self.client
|
||||||
.send(&RpcRequest::SendTransaction, json!([serialized_encoded]), 5)?;
|
.send(&RpcRequest::SendTransaction, json!([serialized_encoded]), 5)?;
|
||||||
if signature.as_str().is_none() {
|
|
||||||
|
match response.as_str() {
|
||||||
|
None => {
|
||||||
Err(RpcError::ForUser("Received result of an unexpected type".to_string()).into())
|
Err(RpcError::ForUser("Received result of an unexpected type".to_string()).into())
|
||||||
} else {
|
}
|
||||||
Ok(signature.as_str().unwrap().to_string())
|
Some(signature_base58_str) => signature_base58_str
|
||||||
|
.parse::<Signature>()
|
||||||
|
.map_err(|err| RpcError::ParseError(err.to_string()).into()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_signature_status(
|
pub fn get_signature_status(
|
||||||
&self,
|
&self,
|
||||||
signature: &str,
|
signature: &Signature,
|
||||||
) -> ClientResult<Option<transaction::Result<()>>> {
|
) -> ClientResult<Option<transaction::Result<()>>> {
|
||||||
self.get_signature_status_with_commitment(signature, CommitmentConfig::default())
|
self.get_signature_status_with_commitment(signature, CommitmentConfig::default())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_signature_statuses(
|
||||||
|
&self,
|
||||||
|
signatures: &[Signature],
|
||||||
|
) -> RpcResult<Vec<Option<TransactionStatus>>> {
|
||||||
|
let signatures: Vec<_> = signatures.iter().map(|s| s.to_string()).collect();
|
||||||
|
let signature_status =
|
||||||
|
self.client
|
||||||
|
.send(&RpcRequest::GetSignatureStatuses, json!([signatures]), 5)?;
|
||||||
|
Ok(serde_json::from_value(signature_status)
|
||||||
|
.map_err(|err| ClientError::new_with_command(err.into(), "GetSignatureStatuses"))?)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get_signature_status_with_commitment(
|
pub fn get_signature_status_with_commitment(
|
||||||
&self,
|
&self,
|
||||||
signature: &str,
|
signature: &Signature,
|
||||||
commitment_config: CommitmentConfig,
|
commitment_config: CommitmentConfig,
|
||||||
) -> ClientResult<Option<transaction::Result<()>>> {
|
) -> ClientResult<Option<transaction::Result<()>>> {
|
||||||
let signature_status = self.client.send(
|
let signature_status = self.client.send(
|
||||||
&RpcRequest::GetSignatureStatuses,
|
&RpcRequest::GetSignatureStatuses,
|
||||||
json!([[signature.to_string()], commitment_config]),
|
json!([[signature.to_string()]]),
|
||||||
5,
|
5,
|
||||||
)?;
|
)?;
|
||||||
let result: Response<Vec<Option<TransactionStatus>>> =
|
let result: Response<Vec<Option<TransactionStatus>>> =
|
||||||
@ -129,6 +143,7 @@ impl RpcClient {
|
|||||||
.map_err(|err| ClientError::new_with_command(err.into(), "GetSignatureStatuses"))?;
|
.map_err(|err| ClientError::new_with_command(err.into(), "GetSignatureStatuses"))?;
|
||||||
Ok(result.value[0]
|
Ok(result.value[0]
|
||||||
.clone()
|
.clone()
|
||||||
|
.filter(|result| result.satisfies_commitment(commitment_config))
|
||||||
.map(|status_meta| status_meta.status))
|
.map(|status_meta| status_meta.status))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -177,9 +192,17 @@ impl RpcClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_confirmed_block(&self, slot: Slot) -> ClientResult<ConfirmedBlock> {
|
pub fn get_confirmed_block(&self, slot: Slot) -> ClientResult<ConfirmedBlock> {
|
||||||
|
self.get_confirmed_block_with_encoding(slot, TransactionEncoding::Json)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_confirmed_block_with_encoding(
|
||||||
|
&self,
|
||||||
|
slot: Slot,
|
||||||
|
encoding: TransactionEncoding,
|
||||||
|
) -> ClientResult<ConfirmedBlock> {
|
||||||
let response = self
|
let response = self
|
||||||
.client
|
.client
|
||||||
.send(&RpcRequest::GetConfirmedBlock, json!([slot]), 0)
|
.send(&RpcRequest::GetConfirmedBlock, json!([slot, encoding]), 0)
|
||||||
.map_err(|err| err.into_with_command("GetConfirmedBlock"))?;
|
.map_err(|err| err.into_with_command("GetConfirmedBlock"))?;
|
||||||
|
|
||||||
serde_json::from_value(response)
|
serde_json::from_value(response)
|
||||||
@ -326,13 +349,13 @@ impl RpcClient {
|
|||||||
&self,
|
&self,
|
||||||
transaction: &mut Transaction,
|
transaction: &mut Transaction,
|
||||||
signer_keys: &T,
|
signer_keys: &T,
|
||||||
) -> ClientResult<String> {
|
) -> ClientResult<Signature> {
|
||||||
let mut send_retries = 20;
|
let mut send_retries = 20;
|
||||||
loop {
|
loop {
|
||||||
let mut status_retries = 15;
|
let mut status_retries = 15;
|
||||||
let signature_str = self.send_transaction(transaction)?;
|
let signature = self.send_transaction(transaction)?;
|
||||||
let status = loop {
|
let status = loop {
|
||||||
let status = self.get_signature_status(&signature_str)?;
|
let status = self.get_signature_status(&signature)?;
|
||||||
if status.is_none() {
|
if status.is_none() {
|
||||||
status_retries -= 1;
|
status_retries -= 1;
|
||||||
if status_retries == 0 {
|
if status_retries == 0 {
|
||||||
@ -348,7 +371,7 @@ impl RpcClient {
|
|||||||
};
|
};
|
||||||
send_retries = if let Some(result) = status.clone() {
|
send_retries = if let Some(result) = status.clone() {
|
||||||
match result {
|
match result {
|
||||||
Ok(_) => return Ok(signature_str),
|
Ok(_) => return Ok(signature),
|
||||||
Err(TransactionError::AccountInUse) => {
|
Err(TransactionError::AccountInUse) => {
|
||||||
// Fetch a new blockhash and re-sign the transaction before sending it again
|
// Fetch a new blockhash and re-sign the transaction before sending it again
|
||||||
self.resign_transaction(transaction, signer_keys)?;
|
self.resign_transaction(transaction, signer_keys)?;
|
||||||
@ -810,10 +833,9 @@ impl RpcClient {
|
|||||||
) -> ClientResult<()> {
|
) -> ClientResult<()> {
|
||||||
let now = Instant::now();
|
let now = Instant::now();
|
||||||
loop {
|
loop {
|
||||||
if let Ok(Some(_)) = self.get_signature_status_with_commitment(
|
if let Ok(Some(_)) =
|
||||||
&signature.to_string(),
|
self.get_signature_status_with_commitment(&signature, commitment_config.clone())
|
||||||
commitment_config.clone(),
|
{
|
||||||
) {
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if now.elapsed().as_secs() > 15 {
|
if now.elapsed().as_secs() > 15 {
|
||||||
@ -833,14 +855,13 @@ impl RpcClient {
|
|||||||
trace!("check_signature: {:?}", signature);
|
trace!("check_signature: {:?}", signature);
|
||||||
|
|
||||||
for _ in 0..30 {
|
for _ in 0..30 {
|
||||||
let response = self.client.send(
|
let response =
|
||||||
&RpcRequest::ConfirmTransaction,
|
self.confirm_transaction_with_commitment(signature, CommitmentConfig::recent());
|
||||||
json!([signature.to_string(), CommitmentConfig::recent()]),
|
|
||||||
0,
|
|
||||||
);
|
|
||||||
|
|
||||||
match response {
|
match response {
|
||||||
Ok(Value::Bool(signature_status)) => {
|
Ok(Response {
|
||||||
|
value: signature_status,
|
||||||
|
..
|
||||||
|
}) => {
|
||||||
if signature_status {
|
if signature_status {
|
||||||
trace!("Response found signature");
|
trace!("Response found signature");
|
||||||
} else {
|
} else {
|
||||||
@ -849,12 +870,6 @@ impl RpcClient {
|
|||||||
|
|
||||||
return signature_status;
|
return signature_status;
|
||||||
}
|
}
|
||||||
Ok(other) => {
|
|
||||||
debug!(
|
|
||||||
"check_signature request failed, expected bool, got: {:?}",
|
|
||||||
other
|
|
||||||
);
|
|
||||||
}
|
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
debug!("check_signature request failed: {:?}", err);
|
debug!("check_signature request failed: {:?}", err);
|
||||||
}
|
}
|
||||||
@ -927,7 +942,7 @@ impl RpcClient {
|
|||||||
.client
|
.client
|
||||||
.send(
|
.send(
|
||||||
&RpcRequest::GetSignatureStatuses,
|
&RpcRequest::GetSignatureStatuses,
|
||||||
json!([[signature.to_string()], CommitmentConfig::recent().ok()]),
|
json!([[signature.to_string()]]),
|
||||||
1,
|
1,
|
||||||
)
|
)
|
||||||
.map_err(|err| err.into_with_command("GetSignatureStatuses"))?;
|
.map_err(|err| err.into_with_command("GetSignatureStatuses"))?;
|
||||||
@ -951,7 +966,7 @@ impl RpcClient {
|
|||||||
&self,
|
&self,
|
||||||
transaction: &mut Transaction,
|
transaction: &mut Transaction,
|
||||||
signer_keys: &T,
|
signer_keys: &T,
|
||||||
) -> ClientResult<String> {
|
) -> ClientResult<Signature> {
|
||||||
let mut confirmations = 0;
|
let mut confirmations = 0;
|
||||||
|
|
||||||
let progress_bar = new_spinner_progress_bar();
|
let progress_bar = new_spinner_progress_bar();
|
||||||
@ -962,23 +977,21 @@ impl RpcClient {
|
|||||||
));
|
));
|
||||||
|
|
||||||
let mut send_retries = 20;
|
let mut send_retries = 20;
|
||||||
let signature_str = loop {
|
let signature = loop {
|
||||||
let mut status_retries = 15;
|
let mut status_retries = 15;
|
||||||
let (signature_str, status) = loop {
|
let (signature, status) = loop {
|
||||||
let signature_str = self.send_transaction(transaction)?;
|
let signature = self.send_transaction(transaction)?;
|
||||||
|
|
||||||
// Get recent commitment in order to count confirmations for successful transactions
|
// Get recent commitment in order to count confirmations for successful transactions
|
||||||
let status = self.get_signature_status_with_commitment(
|
let status = self
|
||||||
&signature_str,
|
.get_signature_status_with_commitment(&signature, CommitmentConfig::recent())?;
|
||||||
CommitmentConfig::recent(),
|
|
||||||
)?;
|
|
||||||
if status.is_none() {
|
if status.is_none() {
|
||||||
status_retries -= 1;
|
status_retries -= 1;
|
||||||
if status_retries == 0 {
|
if status_retries == 0 {
|
||||||
break (signature_str, status);
|
break (signature, status);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
break (signature_str, status);
|
break (signature, status);
|
||||||
}
|
}
|
||||||
|
|
||||||
if cfg!(not(test)) {
|
if cfg!(not(test)) {
|
||||||
@ -1003,7 +1016,7 @@ impl RpcClient {
|
|||||||
if let Some(result) = status {
|
if let Some(result) = status {
|
||||||
match result {
|
match result {
|
||||||
Ok(_) => {
|
Ok(_) => {
|
||||||
break signature_str;
|
break signature;
|
||||||
}
|
}
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
return Err(err.into());
|
return Err(err.into());
|
||||||
@ -1016,19 +1029,13 @@ impl RpcClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let signature = Signature::from_str(&signature_str).map_err(|_| {
|
|
||||||
ClientError::from(ClientErrorKind::Custom(format!(
|
|
||||||
"Returned string {} cannot be parsed as a signature",
|
|
||||||
signature_str
|
|
||||||
)))
|
|
||||||
})?;
|
|
||||||
loop {
|
loop {
|
||||||
// Return when default (max) commitment is reached
|
// Return when default (max) commitment is reached
|
||||||
// Failed transactions have already been eliminated, `is_some` check is sufficient
|
// Failed transactions have already been eliminated, `is_some` check is sufficient
|
||||||
if self.get_signature_status(&signature_str)?.is_some() {
|
if self.get_signature_status(&signature)?.is_some() {
|
||||||
progress_bar.set_message("Transaction confirmed");
|
progress_bar.set_message("Transaction confirmed");
|
||||||
progress_bar.finish_and_clear();
|
progress_bar.finish_and_clear();
|
||||||
return Ok(signature_str);
|
return Ok(signature);
|
||||||
}
|
}
|
||||||
progress_bar.set_message(&format!(
|
progress_bar.set_message(&format!(
|
||||||
"[{}/{}] Waiting for confirmations",
|
"[{}/{}] Waiting for confirmations",
|
||||||
@ -1190,7 +1197,7 @@ mod tests {
|
|||||||
let tx = system_transaction::transfer(&key, &to, 50, blockhash);
|
let tx = system_transaction::transfer(&key, &to, 50, blockhash);
|
||||||
|
|
||||||
let signature = rpc_client.send_transaction(&tx);
|
let signature = rpc_client.send_transaction(&tx);
|
||||||
assert_eq!(signature.unwrap(), SIGNATURE.to_string());
|
assert_eq!(signature.unwrap(), SIGNATURE.parse().unwrap());
|
||||||
|
|
||||||
let rpc_client = RpcClient::new_mock("fails".to_string());
|
let rpc_client = RpcClient::new_mock("fails".to_string());
|
||||||
|
|
||||||
@ -1213,18 +1220,17 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_get_signature_status() {
|
fn test_get_signature_status() {
|
||||||
|
let signature = Signature::default();
|
||||||
|
|
||||||
let rpc_client = RpcClient::new_mock("succeeds".to_string());
|
let rpc_client = RpcClient::new_mock("succeeds".to_string());
|
||||||
let signature = "good_signature";
|
|
||||||
let status = rpc_client.get_signature_status(&signature).unwrap();
|
let status = rpc_client.get_signature_status(&signature).unwrap();
|
||||||
assert_eq!(status, Some(Ok(())));
|
assert_eq!(status, Some(Ok(())));
|
||||||
|
|
||||||
let rpc_client = RpcClient::new_mock("sig_not_found".to_string());
|
let rpc_client = RpcClient::new_mock("sig_not_found".to_string());
|
||||||
let signature = "sig_not_found";
|
|
||||||
let status = rpc_client.get_signature_status(&signature).unwrap();
|
let status = rpc_client.get_signature_status(&signature).unwrap();
|
||||||
assert_eq!(status, None);
|
assert_eq!(status, None);
|
||||||
|
|
||||||
let rpc_client = RpcClient::new_mock("account_in_use".to_string());
|
let rpc_client = RpcClient::new_mock("account_in_use".to_string());
|
||||||
let signature = "account_in_use";
|
|
||||||
let status = rpc_client.get_signature_status(&signature).unwrap();
|
let status = rpc_client.get_signature_status(&signature).unwrap();
|
||||||
assert_eq!(status, Some(Err(TransactionError::AccountInUse)));
|
assert_eq!(status, Some(Err(TransactionError::AccountInUse)));
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,6 @@ use thiserror::Error;
|
|||||||
|
|
||||||
#[derive(Debug, PartialEq, Eq, Hash)]
|
#[derive(Debug, PartialEq, Eq, Hash)]
|
||||||
pub enum RpcRequest {
|
pub enum RpcRequest {
|
||||||
ConfirmTransaction,
|
|
||||||
DeregisterNode,
|
DeregisterNode,
|
||||||
ValidatorExit,
|
ValidatorExit,
|
||||||
GetAccountInfo,
|
GetAccountInfo,
|
||||||
@ -22,7 +21,6 @@ pub enum RpcRequest {
|
|||||||
GetRecentBlockhash,
|
GetRecentBlockhash,
|
||||||
GetFeeCalculatorForBlockhash,
|
GetFeeCalculatorForBlockhash,
|
||||||
GetFeeRateGovernor,
|
GetFeeRateGovernor,
|
||||||
GetSignatureStatus,
|
|
||||||
GetSignatureStatuses,
|
GetSignatureStatuses,
|
||||||
GetSlot,
|
GetSlot,
|
||||||
GetSlotLeader,
|
GetSlotLeader,
|
||||||
@ -45,7 +43,6 @@ impl RpcRequest {
|
|||||||
pub(crate) fn build_request_json(&self, id: u64, params: Value) -> Value {
|
pub(crate) fn build_request_json(&self, id: u64, params: Value) -> Value {
|
||||||
let jsonrpc = "2.0";
|
let jsonrpc = "2.0";
|
||||||
let method = match self {
|
let method = match self {
|
||||||
RpcRequest::ConfirmTransaction => "confirmTransaction",
|
|
||||||
RpcRequest::DeregisterNode => "deregisterNode",
|
RpcRequest::DeregisterNode => "deregisterNode",
|
||||||
RpcRequest::ValidatorExit => "validatorExit",
|
RpcRequest::ValidatorExit => "validatorExit",
|
||||||
RpcRequest::GetAccountInfo => "getAccountInfo",
|
RpcRequest::GetAccountInfo => "getAccountInfo",
|
||||||
@ -64,7 +61,6 @@ impl RpcRequest {
|
|||||||
RpcRequest::GetRecentBlockhash => "getRecentBlockhash",
|
RpcRequest::GetRecentBlockhash => "getRecentBlockhash",
|
||||||
RpcRequest::GetFeeCalculatorForBlockhash => "getFeeCalculatorForBlockhash",
|
RpcRequest::GetFeeCalculatorForBlockhash => "getFeeCalculatorForBlockhash",
|
||||||
RpcRequest::GetFeeRateGovernor => "getFeeRateGovernor",
|
RpcRequest::GetFeeRateGovernor => "getFeeRateGovernor",
|
||||||
RpcRequest::GetSignatureStatus => "getSignatureStatus",
|
|
||||||
RpcRequest::GetSignatureStatuses => "getSignatureStatuses",
|
RpcRequest::GetSignatureStatuses => "getSignatureStatuses",
|
||||||
RpcRequest::GetSlot => "getSlot",
|
RpcRequest::GetSlot => "getSlot",
|
||||||
RpcRequest::GetSlotLeader => "getSlotLeader",
|
RpcRequest::GetSlotLeader => "getSlotLeader",
|
||||||
|
@ -4,7 +4,7 @@ use solana_sdk::{
|
|||||||
clock::{Epoch, Slot},
|
clock::{Epoch, Slot},
|
||||||
fee_calculator::{FeeCalculator, FeeRateGovernor},
|
fee_calculator::{FeeCalculator, FeeRateGovernor},
|
||||||
pubkey::Pubkey,
|
pubkey::Pubkey,
|
||||||
transaction::Result,
|
transaction::{Result, TransactionError},
|
||||||
};
|
};
|
||||||
use std::{collections::HashMap, net::SocketAddr, str::FromStr};
|
use std::{collections::HashMap, net::SocketAddr, str::FromStr};
|
||||||
|
|
||||||
@ -54,6 +54,12 @@ pub struct RpcKeyedAccount {
|
|||||||
pub account: RpcAccount,
|
pub account: RpcAccount,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Clone, Debug)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct RpcSignatureResult {
|
||||||
|
pub err: Option<TransactionError>,
|
||||||
|
}
|
||||||
|
|
||||||
/// A duplicate representation of a Message for pretty JSON serialization
|
/// A duplicate representation of a Message for pretty JSON serialization
|
||||||
#[derive(Serialize, Deserialize, Clone, Debug)]
|
#[derive(Serialize, Deserialize, Clone, Debug)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
|
@ -471,7 +471,7 @@ impl SyncClient for ThinClient {
|
|||||||
) -> TransportResult<Option<transaction::Result<()>>> {
|
) -> TransportResult<Option<transaction::Result<()>>> {
|
||||||
let status = self
|
let status = self
|
||||||
.rpc_client()
|
.rpc_client()
|
||||||
.get_signature_status(&signature.to_string())
|
.get_signature_status(&signature)
|
||||||
.map_err(|err| {
|
.map_err(|err| {
|
||||||
io::Error::new(
|
io::Error::new(
|
||||||
io::ErrorKind::Other,
|
io::ErrorKind::Other,
|
||||||
@ -488,7 +488,7 @@ impl SyncClient for ThinClient {
|
|||||||
) -> TransportResult<Option<transaction::Result<()>>> {
|
) -> TransportResult<Option<transaction::Result<()>>> {
|
||||||
let status = self
|
let status = self
|
||||||
.rpc_client()
|
.rpc_client()
|
||||||
.get_signature_status_with_commitment(&signature.to_string(), commitment_config)
|
.get_signature_status_with_commitment(&signature, commitment_config)
|
||||||
.map_err(|err| {
|
.map_err(|err| {
|
||||||
io::Error::new(
|
io::Error::new(
|
||||||
io::ErrorKind::Other,
|
io::ErrorKind::Other,
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-core"
|
name = "solana-core"
|
||||||
description = "Blockchain, Rebuilt for Scale"
|
description = "Blockchain, Rebuilt for Scale"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
documentation = "https://docs.rs/solana"
|
documentation = "https://docs.rs/solana"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
readme = "../README.md"
|
readme = "../README.md"
|
||||||
@ -43,34 +43,34 @@ regex = "1.3.4"
|
|||||||
serde = "1.0.104"
|
serde = "1.0.104"
|
||||||
serde_derive = "1.0.103"
|
serde_derive = "1.0.103"
|
||||||
serde_json = "1.0.46"
|
serde_json = "1.0.46"
|
||||||
solana-budget-program = { path = "../programs/budget", version = "1.0.13" }
|
solana-budget-program = { path = "../programs/budget", version = "1.0.14" }
|
||||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.13" }
|
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||||
solana-client = { path = "../client", version = "1.0.13" }
|
solana-client = { path = "../client", version = "1.0.14" }
|
||||||
solana-transaction-status = { path = "../transaction-status", version = "1.0.13" }
|
solana-transaction-status = { path = "../transaction-status", version = "1.0.14" }
|
||||||
solana-faucet = { path = "../faucet", version = "1.0.13" }
|
solana-faucet = { path = "../faucet", version = "1.0.14" }
|
||||||
ed25519-dalek = "=1.0.0-pre.1"
|
ed25519-dalek = "=1.0.0-pre.1"
|
||||||
solana-ledger = { path = "../ledger", version = "1.0.13" }
|
solana-ledger = { path = "../ledger", version = "1.0.14" }
|
||||||
solana-logger = { path = "../logger", version = "1.0.13" }
|
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||||
solana-merkle-tree = { path = "../merkle-tree", version = "1.0.13" }
|
solana-merkle-tree = { path = "../merkle-tree", version = "1.0.14" }
|
||||||
solana-metrics = { path = "../metrics", version = "1.0.13" }
|
solana-metrics = { path = "../metrics", version = "1.0.14" }
|
||||||
solana-measure = { path = "../measure", version = "1.0.13" }
|
solana-measure = { path = "../measure", version = "1.0.14" }
|
||||||
solana-net-utils = { path = "../net-utils", version = "1.0.13" }
|
solana-net-utils = { path = "../net-utils", version = "1.0.14" }
|
||||||
solana-chacha-cuda = { path = "../chacha-cuda", version = "1.0.13" }
|
solana-chacha-cuda = { path = "../chacha-cuda", version = "1.0.14" }
|
||||||
solana-perf = { path = "../perf", version = "1.0.13" }
|
solana-perf = { path = "../perf", version = "1.0.14" }
|
||||||
solana-runtime = { path = "../runtime", version = "1.0.13" }
|
solana-runtime = { path = "../runtime", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
solana-stake-program = { path = "../programs/stake", version = "1.0.13" }
|
solana-stake-program = { path = "../programs/stake", version = "1.0.14" }
|
||||||
solana-storage-program = { path = "../programs/storage", version = "1.0.13" }
|
solana-storage-program = { path = "../programs/storage", version = "1.0.14" }
|
||||||
solana-vote-program = { path = "../programs/vote", version = "1.0.13" }
|
solana-vote-program = { path = "../programs/vote", version = "1.0.14" }
|
||||||
solana-vote-signer = { path = "../vote-signer", version = "1.0.13" }
|
solana-vote-signer = { path = "../vote-signer", version = "1.0.14" }
|
||||||
solana-sys-tuner = { path = "../sys-tuner", version = "1.0.13" }
|
solana-sys-tuner = { path = "../sys-tuner", version = "1.0.14" }
|
||||||
tempfile = "3.1.0"
|
tempfile = "3.1.0"
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
tokio = "0.1"
|
tokio = "0.1"
|
||||||
tokio-codec = "0.1"
|
tokio-codec = "0.1"
|
||||||
tokio-fs = "0.1"
|
tokio-fs = "0.1"
|
||||||
tokio-io = "0.1"
|
tokio-io = "0.1"
|
||||||
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.13" }
|
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.14" }
|
||||||
trees = "0.2.1"
|
trees = "0.2.1"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
|
@ -1980,10 +1980,20 @@ mod tests {
|
|||||||
{
|
{
|
||||||
if let EncodedTransaction::Json(transaction) = transaction {
|
if let EncodedTransaction::Json(transaction) = transaction {
|
||||||
if transaction.signatures[0] == success_signature.to_string() {
|
if transaction.signatures[0] == success_signature.to_string() {
|
||||||
assert_eq!(meta.unwrap().status, Ok(()));
|
let meta = meta.unwrap();
|
||||||
|
assert_eq!(meta.err, None);
|
||||||
|
assert_eq!(meta.status, Ok(()));
|
||||||
} else if transaction.signatures[0] == ix_error_signature.to_string() {
|
} else if transaction.signatures[0] == ix_error_signature.to_string() {
|
||||||
|
let meta = meta.unwrap();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
meta.unwrap().status,
|
meta.err,
|
||||||
|
Some(TransactionError::InstructionError(
|
||||||
|
0,
|
||||||
|
InstructionError::CustomError(1)
|
||||||
|
))
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
meta.status,
|
||||||
Err(TransactionError::InstructionError(
|
Err(TransactionError::InstructionError(
|
||||||
0,
|
0,
|
||||||
InstructionError::CustomError(1)
|
InstructionError::CustomError(1)
|
||||||
|
@ -1932,10 +1932,20 @@ pub(crate) mod tests {
|
|||||||
{
|
{
|
||||||
if let EncodedTransaction::Json(transaction) = transaction {
|
if let EncodedTransaction::Json(transaction) = transaction {
|
||||||
if transaction.signatures[0] == signatures[0].to_string() {
|
if transaction.signatures[0] == signatures[0].to_string() {
|
||||||
assert_eq!(meta.unwrap().status, Ok(()));
|
let meta = meta.unwrap();
|
||||||
|
assert_eq!(meta.err, None);
|
||||||
|
assert_eq!(meta.status, Ok(()));
|
||||||
} else if transaction.signatures[0] == signatures[1].to_string() {
|
} else if transaction.signatures[0] == signatures[1].to_string() {
|
||||||
|
let meta = meta.unwrap();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
meta.unwrap().status,
|
meta.err,
|
||||||
|
Some(TransactionError::InstructionError(
|
||||||
|
0,
|
||||||
|
InstructionError::CustomError(1)
|
||||||
|
))
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
meta.status,
|
||||||
Err(TransactionError::InstructionError(
|
Err(TransactionError::InstructionError(
|
||||||
0,
|
0,
|
||||||
InstructionError::CustomError(1)
|
InstructionError::CustomError(1)
|
||||||
|
121
core/src/rpc.rs
121
core/src/rpc.rs
@ -35,6 +35,8 @@ use std::{
|
|||||||
time::{Duration, Instant},
|
time::{Duration, Instant},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const MAX_QUERY_ITEMS: usize = 256;
|
||||||
|
|
||||||
type RpcResponse<T> = Result<Response<T>>;
|
type RpcResponse<T> = Result<Response<T>>;
|
||||||
|
|
||||||
fn new_response<T>(bank: &Bank, value: T) -> RpcResponse<T> {
|
fn new_response<T>(bank: &Bank, value: T) -> RpcResponse<T> {
|
||||||
@ -51,6 +53,15 @@ pub struct JsonRpcConfig {
|
|||||||
pub faucet_addr: Option<SocketAddr>,
|
pub faucet_addr: Option<SocketAddr>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct RpcSignatureStatusConfig {
|
||||||
|
pub search_transaction_history: Option<bool>,
|
||||||
|
// DEPRECATED
|
||||||
|
#[serde(flatten)]
|
||||||
|
pub commitment: Option<CommitmentConfig>,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct JsonRpcRequestProcessor {
|
pub struct JsonRpcRequestProcessor {
|
||||||
bank_forks: Arc<RwLock<BankForks>>,
|
bank_forks: Arc<RwLock<BankForks>>,
|
||||||
@ -425,14 +436,40 @@ impl JsonRpcRequestProcessor {
|
|||||||
pub fn get_signature_statuses(
|
pub fn get_signature_statuses(
|
||||||
&self,
|
&self,
|
||||||
signatures: Vec<Signature>,
|
signatures: Vec<Signature>,
|
||||||
commitment: Option<CommitmentConfig>,
|
config: Option<RpcSignatureStatusConfig>,
|
||||||
) -> RpcResponse<Vec<Option<TransactionStatus>>> {
|
) -> RpcResponse<Vec<Option<TransactionStatus>>> {
|
||||||
let mut statuses: Vec<Option<TransactionStatus>> = vec![];
|
let mut statuses: Vec<Option<TransactionStatus>> = vec![];
|
||||||
|
|
||||||
|
// DEPRECATED
|
||||||
|
let commitment = config
|
||||||
|
.clone()
|
||||||
|
.and_then(|x| x.commitment)
|
||||||
|
.or_else(|| Some(CommitmentConfig::recent()));
|
||||||
|
|
||||||
|
let search_transaction_history = config
|
||||||
|
.and_then(|x| x.search_transaction_history)
|
||||||
|
.unwrap_or(false);
|
||||||
let bank = self.bank(commitment);
|
let bank = self.bank(commitment);
|
||||||
|
|
||||||
for signature in signatures {
|
for signature in signatures {
|
||||||
let status = self.get_transaction_status(signature, &bank);
|
let status = if let Some(status) = self.get_transaction_status(signature, &bank) {
|
||||||
|
Some(status)
|
||||||
|
} else if self.config.enable_rpc_transaction_history && search_transaction_history {
|
||||||
|
self.blockstore
|
||||||
|
.get_transaction_status(signature)
|
||||||
|
.map_err(|_| Error::internal_error())?
|
||||||
|
.map(|(slot, status_meta)| {
|
||||||
|
let err = status_meta.status.clone().err();
|
||||||
|
TransactionStatus {
|
||||||
|
slot,
|
||||||
|
status: status_meta.status,
|
||||||
|
confirmations: None,
|
||||||
|
err,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
};
|
||||||
statuses.push(status);
|
statuses.push(status);
|
||||||
}
|
}
|
||||||
Ok(Response {
|
Ok(Response {
|
||||||
@ -457,10 +494,12 @@ impl JsonRpcRequestProcessor {
|
|||||||
.get_confirmation_count(slot)
|
.get_confirmation_count(slot)
|
||||||
.or(Some(0))
|
.or(Some(0))
|
||||||
};
|
};
|
||||||
|
let err = status.clone().err();
|
||||||
TransactionStatus {
|
TransactionStatus {
|
||||||
slot,
|
slot,
|
||||||
status,
|
status,
|
||||||
confirmations,
|
confirmations,
|
||||||
|
err,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -491,6 +530,7 @@ impl Metadata for Meta {}
|
|||||||
pub trait RpcSol {
|
pub trait RpcSol {
|
||||||
type Metadata;
|
type Metadata;
|
||||||
|
|
||||||
|
// DEPRECATED
|
||||||
#[rpc(meta, name = "confirmTransaction")]
|
#[rpc(meta, name = "confirmTransaction")]
|
||||||
fn confirm_transaction(
|
fn confirm_transaction(
|
||||||
&self,
|
&self,
|
||||||
@ -499,6 +539,24 @@ pub trait RpcSol {
|
|||||||
commitment: Option<CommitmentConfig>,
|
commitment: Option<CommitmentConfig>,
|
||||||
) -> RpcResponse<bool>;
|
) -> RpcResponse<bool>;
|
||||||
|
|
||||||
|
// DEPRECATED
|
||||||
|
#[rpc(meta, name = "getSignatureStatus")]
|
||||||
|
fn get_signature_status(
|
||||||
|
&self,
|
||||||
|
meta: Self::Metadata,
|
||||||
|
signature_str: String,
|
||||||
|
commitment: Option<CommitmentConfig>,
|
||||||
|
) -> Result<Option<transaction::Result<()>>>;
|
||||||
|
|
||||||
|
// DEPRECATED (used by Trust Wallet)
|
||||||
|
#[rpc(meta, name = "getSignatureConfirmation")]
|
||||||
|
fn get_signature_confirmation(
|
||||||
|
&self,
|
||||||
|
meta: Self::Metadata,
|
||||||
|
signature_str: String,
|
||||||
|
commitment: Option<CommitmentConfig>,
|
||||||
|
) -> Result<Option<RpcSignatureConfirmation>>;
|
||||||
|
|
||||||
#[rpc(meta, name = "getAccountInfo")]
|
#[rpc(meta, name = "getAccountInfo")]
|
||||||
fn get_account_info(
|
fn get_account_info(
|
||||||
&self,
|
&self,
|
||||||
@ -586,28 +644,12 @@ pub trait RpcSol {
|
|||||||
#[rpc(meta, name = "getFeeRateGovernor")]
|
#[rpc(meta, name = "getFeeRateGovernor")]
|
||||||
fn get_fee_rate_governor(&self, meta: Self::Metadata) -> RpcResponse<RpcFeeRateGovernor>;
|
fn get_fee_rate_governor(&self, meta: Self::Metadata) -> RpcResponse<RpcFeeRateGovernor>;
|
||||||
|
|
||||||
#[rpc(meta, name = "getSignatureConfirmation")]
|
|
||||||
fn get_signature_confirmation(
|
|
||||||
&self,
|
|
||||||
meta: Self::Metadata,
|
|
||||||
signature_str: String,
|
|
||||||
commitment: Option<CommitmentConfig>,
|
|
||||||
) -> Result<Option<RpcSignatureConfirmation>>;
|
|
||||||
|
|
||||||
#[rpc(meta, name = "getSignatureStatus")]
|
|
||||||
fn get_signature_status(
|
|
||||||
&self,
|
|
||||||
meta: Self::Metadata,
|
|
||||||
signature_str: String,
|
|
||||||
commitment: Option<CommitmentConfig>,
|
|
||||||
) -> Result<Option<transaction::Result<()>>>;
|
|
||||||
|
|
||||||
#[rpc(meta, name = "getSignatureStatuses")]
|
#[rpc(meta, name = "getSignatureStatuses")]
|
||||||
fn get_signature_statuses(
|
fn get_signature_statuses(
|
||||||
&self,
|
&self,
|
||||||
meta: Self::Metadata,
|
meta: Self::Metadata,
|
||||||
signature_strs: Vec<String>,
|
signature_strs: Vec<String>,
|
||||||
commitment: Option<CommitmentConfig>,
|
config: Option<RpcSignatureStatusConfig>,
|
||||||
) -> RpcResponse<Vec<Option<TransactionStatus>>>;
|
) -> RpcResponse<Vec<Option<TransactionStatus>>>;
|
||||||
|
|
||||||
#[rpc(meta, name = "getSlot")]
|
#[rpc(meta, name = "getSlot")]
|
||||||
@ -969,8 +1011,14 @@ impl RpcSol for RpcSolImpl {
|
|||||||
&self,
|
&self,
|
||||||
meta: Self::Metadata,
|
meta: Self::Metadata,
|
||||||
signature_strs: Vec<String>,
|
signature_strs: Vec<String>,
|
||||||
commitment: Option<CommitmentConfig>,
|
config: Option<RpcSignatureStatusConfig>,
|
||||||
) -> RpcResponse<Vec<Option<TransactionStatus>>> {
|
) -> RpcResponse<Vec<Option<TransactionStatus>>> {
|
||||||
|
if signature_strs.len() > MAX_QUERY_ITEMS {
|
||||||
|
return Err(Error::invalid_params(format!(
|
||||||
|
"Too many inputs provided; max {}",
|
||||||
|
MAX_QUERY_ITEMS
|
||||||
|
)));
|
||||||
|
}
|
||||||
let mut signatures: Vec<Signature> = vec![];
|
let mut signatures: Vec<Signature> = vec![];
|
||||||
for signature_str in signature_strs {
|
for signature_str in signature_strs {
|
||||||
signatures.push(verify_signature(&signature_str)?);
|
signatures.push(verify_signature(&signature_str)?);
|
||||||
@ -978,7 +1026,7 @@ impl RpcSol for RpcSolImpl {
|
|||||||
meta.request_processor
|
meta.request_processor
|
||||||
.read()
|
.read()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.get_signature_statuses(signatures, commitment)
|
.get_signature_statuses(signatures, config)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_slot(&self, meta: Self::Metadata, commitment: Option<CommitmentConfig>) -> Result<u64> {
|
fn get_slot(&self, meta: Self::Metadata, commitment: Option<CommitmentConfig>) -> Result<u64> {
|
||||||
@ -1071,9 +1119,10 @@ impl RpcSol for RpcSolImpl {
|
|||||||
.request_processor
|
.request_processor
|
||||||
.read()
|
.read()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.get_signature_statuses(vec![signature], commitment.clone())?
|
.get_signature_statuses(vec![signature], None)?
|
||||||
.value[0]
|
.value[0]
|
||||||
.clone()
|
.clone()
|
||||||
|
.filter(|result| result.satisfies_commitment(commitment.unwrap_or_default()))
|
||||||
.map(|x| x.status);
|
.map(|x| x.status);
|
||||||
|
|
||||||
if signature_status == Some(Ok(())) {
|
if signature_status == Some(Ok(())) {
|
||||||
@ -2412,11 +2461,21 @@ pub mod tests {
|
|||||||
{
|
{
|
||||||
if let EncodedTransaction::Json(transaction) = transaction {
|
if let EncodedTransaction::Json(transaction) = transaction {
|
||||||
if transaction.signatures[0] == confirmed_block_signatures[0].to_string() {
|
if transaction.signatures[0] == confirmed_block_signatures[0].to_string() {
|
||||||
|
let meta = meta.unwrap();
|
||||||
assert_eq!(transaction.message.recent_blockhash, blockhash.to_string());
|
assert_eq!(transaction.message.recent_blockhash, blockhash.to_string());
|
||||||
assert_eq!(meta.unwrap().status, Ok(()));
|
assert_eq!(meta.status, Ok(()));
|
||||||
|
assert_eq!(meta.err, None);
|
||||||
} else if transaction.signatures[0] == confirmed_block_signatures[1].to_string() {
|
} else if transaction.signatures[0] == confirmed_block_signatures[1].to_string() {
|
||||||
|
let meta = meta.unwrap();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
meta.unwrap().status,
|
meta.err,
|
||||||
|
Some(TransactionError::InstructionError(
|
||||||
|
0,
|
||||||
|
InstructionError::CustomError(1)
|
||||||
|
))
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
meta.status,
|
||||||
Err(TransactionError::InstructionError(
|
Err(TransactionError::InstructionError(
|
||||||
0,
|
0,
|
||||||
InstructionError::CustomError(1)
|
InstructionError::CustomError(1)
|
||||||
@ -2446,11 +2505,21 @@ pub mod tests {
|
|||||||
let decoded_transaction: Transaction =
|
let decoded_transaction: Transaction =
|
||||||
deserialize(&bs58::decode(&transaction).into_vec().unwrap()).unwrap();
|
deserialize(&bs58::decode(&transaction).into_vec().unwrap()).unwrap();
|
||||||
if decoded_transaction.signatures[0] == confirmed_block_signatures[0] {
|
if decoded_transaction.signatures[0] == confirmed_block_signatures[0] {
|
||||||
|
let meta = meta.unwrap();
|
||||||
assert_eq!(decoded_transaction.message.recent_blockhash, blockhash);
|
assert_eq!(decoded_transaction.message.recent_blockhash, blockhash);
|
||||||
assert_eq!(meta.unwrap().status, Ok(()));
|
assert_eq!(meta.status, Ok(()));
|
||||||
|
assert_eq!(meta.err, None);
|
||||||
} else if decoded_transaction.signatures[0] == confirmed_block_signatures[1] {
|
} else if decoded_transaction.signatures[0] == confirmed_block_signatures[1] {
|
||||||
|
let meta = meta.unwrap();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
meta.unwrap().status,
|
meta.err,
|
||||||
|
Some(TransactionError::InstructionError(
|
||||||
|
0,
|
||||||
|
InstructionError::CustomError(1)
|
||||||
|
))
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
meta.status,
|
||||||
Err(TransactionError::InstructionError(
|
Err(TransactionError::InstructionError(
|
||||||
0,
|
0,
|
||||||
InstructionError::CustomError(1)
|
InstructionError::CustomError(1)
|
||||||
|
@ -4,8 +4,10 @@ use crate::rpc_subscriptions::{Confirmations, RpcSubscriptions, SlotInfo};
|
|||||||
use jsonrpc_core::{Error, ErrorCode, Result};
|
use jsonrpc_core::{Error, ErrorCode, Result};
|
||||||
use jsonrpc_derive::rpc;
|
use jsonrpc_derive::rpc;
|
||||||
use jsonrpc_pubsub::{typed::Subscriber, Session, SubscriptionId};
|
use jsonrpc_pubsub::{typed::Subscriber, Session, SubscriptionId};
|
||||||
use solana_client::rpc_response::{Response as RpcResponse, RpcAccount, RpcKeyedAccount};
|
use solana_client::rpc_response::{
|
||||||
use solana_sdk::{clock::Slot, pubkey::Pubkey, signature::Signature, transaction};
|
Response as RpcResponse, RpcAccount, RpcKeyedAccount, RpcSignatureResult,
|
||||||
|
};
|
||||||
|
use solana_sdk::{clock::Slot, pubkey::Pubkey, signature::Signature};
|
||||||
use std::sync::{atomic, Arc};
|
use std::sync::{atomic, Arc};
|
||||||
|
|
||||||
// Suppress needless_return due to
|
// Suppress needless_return due to
|
||||||
@ -74,7 +76,7 @@ pub trait RpcSolPubSub {
|
|||||||
fn signature_subscribe(
|
fn signature_subscribe(
|
||||||
&self,
|
&self,
|
||||||
meta: Self::Metadata,
|
meta: Self::Metadata,
|
||||||
subscriber: Subscriber<RpcResponse<transaction::Result<()>>>,
|
subscriber: Subscriber<RpcResponse<RpcSignatureResult>>,
|
||||||
signature_str: String,
|
signature_str: String,
|
||||||
confirmations: Option<Confirmations>,
|
confirmations: Option<Confirmations>,
|
||||||
);
|
);
|
||||||
@ -225,7 +227,7 @@ impl RpcSolPubSub for RpcSolPubSubImpl {
|
|||||||
fn signature_subscribe(
|
fn signature_subscribe(
|
||||||
&self,
|
&self,
|
||||||
_meta: Self::Metadata,
|
_meta: Self::Metadata,
|
||||||
subscriber: Subscriber<RpcResponse<transaction::Result<()>>>,
|
subscriber: Subscriber<RpcResponse<RpcSignatureResult>>,
|
||||||
signature_str: String,
|
signature_str: String,
|
||||||
confirmations: Option<Confirmations>,
|
confirmations: Option<Confirmations>,
|
||||||
) {
|
) {
|
||||||
@ -385,7 +387,7 @@ mod tests {
|
|||||||
|
|
||||||
// Test signature confirmation notification
|
// Test signature confirmation notification
|
||||||
let (response, _) = robust_poll_or_panic(receiver);
|
let (response, _) = robust_poll_or_panic(receiver);
|
||||||
let expected_res: Option<transaction::Result<()>> = Some(Ok(()));
|
let expected_res = RpcSignatureResult { err: None };
|
||||||
let expected = json!({
|
let expected = json!({
|
||||||
"jsonrpc": "2.0",
|
"jsonrpc": "2.0",
|
||||||
"method": "signatureNotification",
|
"method": "signatureNotification",
|
||||||
|
@ -8,7 +8,9 @@ use jsonrpc_pubsub::{
|
|||||||
SubscriptionId,
|
SubscriptionId,
|
||||||
};
|
};
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use solana_client::rpc_response::{Response, RpcAccount, RpcKeyedAccount, RpcResponseContext};
|
use solana_client::rpc_response::{
|
||||||
|
Response, RpcAccount, RpcKeyedAccount, RpcResponseContext, RpcSignatureResult,
|
||||||
|
};
|
||||||
use solana_ledger::bank_forks::BankForks;
|
use solana_ledger::bank_forks::BankForks;
|
||||||
use solana_runtime::bank::Bank;
|
use solana_runtime::bank::Bank;
|
||||||
use solana_sdk::{
|
use solana_sdk::{
|
||||||
@ -66,7 +68,7 @@ type RpcProgramSubscriptions = RwLock<
|
|||||||
type RpcSignatureSubscriptions = RwLock<
|
type RpcSignatureSubscriptions = RwLock<
|
||||||
HashMap<
|
HashMap<
|
||||||
Signature,
|
Signature,
|
||||||
HashMap<SubscriptionId, (Sink<Response<transaction::Result<()>>>, Confirmations)>,
|
HashMap<SubscriptionId, (Sink<Response<RpcSignatureResult>>, Confirmations)>,
|
||||||
>,
|
>,
|
||||||
>;
|
>;
|
||||||
type RpcSlotSubscriptions = RwLock<HashMap<SubscriptionId, Sink<SlotInfo>>>;
|
type RpcSlotSubscriptions = RwLock<HashMap<SubscriptionId, Sink<SlotInfo>>>;
|
||||||
@ -207,11 +209,15 @@ fn filter_account_result(
|
|||||||
Box::new(iter::empty())
|
Box::new(iter::empty())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn filter_signature_result<S>(result: Option<S>, _root: Slot) -> Box<dyn Iterator<Item = S>>
|
fn filter_signature_result(
|
||||||
where
|
result: Option<transaction::Result<()>>,
|
||||||
S: 'static + Clone + Serialize,
|
_root: Slot,
|
||||||
{
|
) -> Box<dyn Iterator<Item = RpcSignatureResult>> {
|
||||||
Box::new(result.into_iter())
|
Box::new(
|
||||||
|
result
|
||||||
|
.into_iter()
|
||||||
|
.map(|result| RpcSignatureResult { err: result.err() }),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn filter_program_results(
|
fn filter_program_results(
|
||||||
@ -430,7 +436,7 @@ impl RpcSubscriptions {
|
|||||||
signature: Signature,
|
signature: Signature,
|
||||||
confirmations: Option<Confirmations>,
|
confirmations: Option<Confirmations>,
|
||||||
sub_id: SubscriptionId,
|
sub_id: SubscriptionId,
|
||||||
subscriber: Subscriber<Response<transaction::Result<()>>>,
|
subscriber: Subscriber<Response<RpcSignatureResult>>,
|
||||||
) {
|
) {
|
||||||
let mut subscriptions = self.signature_subscriptions.write().unwrap();
|
let mut subscriptions = self.signature_subscriptions.write().unwrap();
|
||||||
add_subscription(
|
add_subscription(
|
||||||
@ -892,7 +898,7 @@ pub(crate) mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
subscriptions.notify_subscribers(1, &bank_forks);
|
subscriptions.notify_subscribers(1, &bank_forks);
|
||||||
let expected_res: Option<transaction::Result<()>> = Some(Ok(()));
|
let expected_res = RpcSignatureResult { err: None };
|
||||||
|
|
||||||
struct Notification {
|
struct Notification {
|
||||||
slot: Slot,
|
slot: Slot,
|
||||||
|
@ -9,6 +9,7 @@ use crate::{
|
|||||||
use bincode::serialize;
|
use bincode::serialize;
|
||||||
use rand::{thread_rng, Rng};
|
use rand::{thread_rng, Rng};
|
||||||
use solana_ledger::blockstore::Blockstore;
|
use solana_ledger::blockstore::Blockstore;
|
||||||
|
use solana_measure::measure::Measure;
|
||||||
use solana_measure::thread_mem_usage;
|
use solana_measure::thread_mem_usage;
|
||||||
use solana_metrics::{datapoint_debug, inc_new_counter_debug};
|
use solana_metrics::{datapoint_debug, inc_new_counter_debug};
|
||||||
use solana_perf::packet::{Packets, PacketsRecycler};
|
use solana_perf::packet::{Packets, PacketsRecycler};
|
||||||
@ -184,12 +185,33 @@ impl ServeRepair {
|
|||||||
blockstore: Option<&Arc<Blockstore>>,
|
blockstore: Option<&Arc<Blockstore>>,
|
||||||
requests_receiver: &PacketReceiver,
|
requests_receiver: &PacketReceiver,
|
||||||
response_sender: &PacketSender,
|
response_sender: &PacketSender,
|
||||||
|
max_packets: &mut usize,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
//TODO cache connections
|
//TODO cache connections
|
||||||
let timeout = Duration::new(1, 0);
|
let timeout = Duration::new(1, 0);
|
||||||
let reqs = requests_receiver.recv_timeout(timeout)?;
|
let mut reqs_v = vec![requests_receiver.recv_timeout(timeout)?];
|
||||||
|
let mut total_packets = reqs_v[0].packets.len();
|
||||||
|
|
||||||
|
while let Ok(more) = requests_receiver.try_recv() {
|
||||||
|
total_packets += more.packets.len();
|
||||||
|
if total_packets < *max_packets {
|
||||||
|
// Drop the rest in the channel in case of dos
|
||||||
|
reqs_v.push(more);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut time = Measure::start("repair::handle_packets");
|
||||||
|
for reqs in reqs_v {
|
||||||
Self::handle_packets(obj, &recycler, blockstore, reqs, response_sender);
|
Self::handle_packets(obj, &recycler, blockstore, reqs, response_sender);
|
||||||
|
}
|
||||||
|
time.stop();
|
||||||
|
if total_packets >= *max_packets {
|
||||||
|
if time.as_ms() > 1000 {
|
||||||
|
*max_packets = (*max_packets * 9) / 10;
|
||||||
|
} else {
|
||||||
|
*max_packets = (*max_packets * 10) / 9;
|
||||||
|
}
|
||||||
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -204,13 +226,16 @@ impl ServeRepair {
|
|||||||
let recycler = PacketsRecycler::default();
|
let recycler = PacketsRecycler::default();
|
||||||
Builder::new()
|
Builder::new()
|
||||||
.name("solana-repair-listen".to_string())
|
.name("solana-repair-listen".to_string())
|
||||||
.spawn(move || loop {
|
.spawn(move || {
|
||||||
|
let mut max_packets = 1024;
|
||||||
|
loop {
|
||||||
let result = Self::run_listen(
|
let result = Self::run_listen(
|
||||||
&me,
|
&me,
|
||||||
&recycler,
|
&recycler,
|
||||||
blockstore.as_ref(),
|
blockstore.as_ref(),
|
||||||
&requests_receiver,
|
&requests_receiver,
|
||||||
&response_sender,
|
&response_sender,
|
||||||
|
&mut max_packets,
|
||||||
);
|
);
|
||||||
match result {
|
match result {
|
||||||
Err(Error::RecvTimeoutError(_)) | Ok(_) => {}
|
Err(Error::RecvTimeoutError(_)) | Ok(_) => {}
|
||||||
@ -220,6 +245,7 @@ impl ServeRepair {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
thread_mem_usage::datapoint("solana-repair-listen");
|
thread_mem_usage::datapoint("solana-repair-listen");
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.unwrap()
|
.unwrap()
|
||||||
}
|
}
|
||||||
|
@ -72,7 +72,7 @@ impl TransactionStatusService {
|
|||||||
let fee = fee_calculator.calculate_fee(transaction.message());
|
let fee = fee_calculator.calculate_fee(transaction.message());
|
||||||
blockstore
|
blockstore
|
||||||
.write_transaction_status(
|
.write_transaction_status(
|
||||||
(slot, transaction.signatures[0]),
|
(transaction.signatures[0], slot),
|
||||||
&TransactionStatusMeta {
|
&TransactionStatusMeta {
|
||||||
status,
|
status,
|
||||||
fee,
|
fee,
|
||||||
|
@ -58,7 +58,7 @@ fn test_rpc_client() {
|
|||||||
let now = Instant::now();
|
let now = Instant::now();
|
||||||
while now.elapsed().as_secs() <= 20 {
|
while now.elapsed().as_secs() <= 20 {
|
||||||
let response = client
|
let response = client
|
||||||
.confirm_transaction_with_commitment(signature.as_str(), CommitmentConfig::default())
|
.confirm_transaction_with_commitment(&signature, CommitmentConfig::default())
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
if response.value {
|
if response.value {
|
||||||
|
@ -9,15 +9,12 @@ use reqwest::{self, header::CONTENT_TYPE};
|
|||||||
use serde_json::{json, Value};
|
use serde_json::{json, Value};
|
||||||
use solana_client::{
|
use solana_client::{
|
||||||
rpc_client::{get_rpc_request_str, RpcClient},
|
rpc_client::{get_rpc_request_str, RpcClient},
|
||||||
rpc_response::Response,
|
rpc_response::{Response, RpcSignatureResult},
|
||||||
};
|
};
|
||||||
use solana_core::{rpc_pubsub::gen_client::Client as PubsubClient, validator::TestValidator};
|
use solana_core::{rpc_pubsub::gen_client::Client as PubsubClient, validator::TestValidator};
|
||||||
use solana_sdk::{
|
use solana_sdk::{
|
||||||
commitment_config::CommitmentConfig,
|
commitment_config::CommitmentConfig, hash::Hash, pubkey::Pubkey, system_transaction,
|
||||||
hash::Hash,
|
transaction::Transaction,
|
||||||
pubkey::Pubkey,
|
|
||||||
system_transaction,
|
|
||||||
transaction::{self, Transaction},
|
|
||||||
};
|
};
|
||||||
use std::{
|
use std::{
|
||||||
collections::HashSet,
|
collections::HashSet,
|
||||||
@ -224,7 +221,7 @@ fn test_rpc_subscriptions() {
|
|||||||
let mut rt = Runtime::new().unwrap();
|
let mut rt = Runtime::new().unwrap();
|
||||||
let rpc_pubsub_url = format!("ws://{}/", leader_data.rpc_pubsub);
|
let rpc_pubsub_url = format!("ws://{}/", leader_data.rpc_pubsub);
|
||||||
|
|
||||||
let (status_sender, status_receiver) = channel::<(String, Response<transaction::Result<()>>)>();
|
let (status_sender, status_receiver) = channel::<(String, Response<RpcSignatureResult>)>();
|
||||||
let status_sender = Arc::new(Mutex::new(status_sender));
|
let status_sender = Arc::new(Mutex::new(status_sender));
|
||||||
let (sent_sender, sent_receiver) = channel::<()>();
|
let (sent_sender, sent_receiver) = channel::<()>();
|
||||||
let sent_sender = Arc::new(Mutex::new(sent_sender));
|
let sent_sender = Arc::new(Mutex::new(sent_sender));
|
||||||
@ -296,7 +293,7 @@ fn test_rpc_subscriptions() {
|
|||||||
let timeout = deadline.saturating_duration_since(Instant::now());
|
let timeout = deadline.saturating_duration_since(Instant::now());
|
||||||
match status_receiver.recv_timeout(timeout) {
|
match status_receiver.recv_timeout(timeout) {
|
||||||
Ok((sig, result)) => {
|
Ok((sig, result)) => {
|
||||||
assert!(result.value.is_ok());
|
assert!(result.value.err.is_none());
|
||||||
assert!(signature_set.remove(&sig));
|
assert!(signature_set.remove(&sig));
|
||||||
}
|
}
|
||||||
Err(_err) => {
|
Err(_err) => {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-crate-features"
|
name = "solana-crate-features"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana Crate Features"
|
description = "Solana Crate Features"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
|
@ -14,7 +14,6 @@ To interact with a Solana node inside a JavaScript application, use the [solana-
|
|||||||
|
|
||||||
## Methods
|
## Methods
|
||||||
|
|
||||||
* [confirmTransaction](jsonrpc-api.md#confirmtransaction)
|
|
||||||
* [getAccountInfo](jsonrpc-api.md#getaccountinfo)
|
* [getAccountInfo](jsonrpc-api.md#getaccountinfo)
|
||||||
* [getBalance](jsonrpc-api.md#getbalance)
|
* [getBalance](jsonrpc-api.md#getbalance)
|
||||||
* [getBlockCommitment](jsonrpc-api.md#getblockcommitment)
|
* [getBlockCommitment](jsonrpc-api.md#getblockcommitment)
|
||||||
@ -33,7 +32,6 @@ To interact with a Solana node inside a JavaScript application, use the [solana-
|
|||||||
* [getMinimumBalanceForRentExemption](jsonrpc-api.md#getminimumbalanceforrentexemption)
|
* [getMinimumBalanceForRentExemption](jsonrpc-api.md#getminimumbalanceforrentexemption)
|
||||||
* [getProgramAccounts](jsonrpc-api.md#getprogramaccounts)
|
* [getProgramAccounts](jsonrpc-api.md#getprogramaccounts)
|
||||||
* [getRecentBlockhash](jsonrpc-api.md#getrecentblockhash)
|
* [getRecentBlockhash](jsonrpc-api.md#getrecentblockhash)
|
||||||
* [getSignatureStatus](jsonrpc-api.md#getsignaturestatus)
|
|
||||||
* [getSignatureStatuses](jsonrpc-api.md#getsignaturestatuses)
|
* [getSignatureStatuses](jsonrpc-api.md#getsignaturestatuses)
|
||||||
* [getSlot](jsonrpc-api.md#getslot)
|
* [getSlot](jsonrpc-api.md#getslot)
|
||||||
* [getSlotLeader](jsonrpc-api.md#getslotleader)
|
* [getSlotLeader](jsonrpc-api.md#getslotleader)
|
||||||
@ -117,29 +115,6 @@ Many methods that take a commitment parameter return an RpcResponse JSON object
|
|||||||
|
|
||||||
## JSON RPC API Reference
|
## JSON RPC API Reference
|
||||||
|
|
||||||
### confirmTransaction
|
|
||||||
|
|
||||||
Returns a transaction receipt. This method only searches the recent status cache of signatures, which retains all active slots plus `MAX_RECENT_BLOCKHASHES` rooted slots.
|
|
||||||
|
|
||||||
#### Parameters:
|
|
||||||
|
|
||||||
* `<string>` - Signature of Transaction to confirm, as base-58 encoded string
|
|
||||||
* `<object>` - (optional) [Commitment](jsonrpc-api.md#configuring-state-commitment)
|
|
||||||
|
|
||||||
#### Results:
|
|
||||||
|
|
||||||
* `RpcResponse<bool>` - RpcResponse JSON object with `value` field set to Transaction status, boolean true if Transaction is confirmed
|
|
||||||
|
|
||||||
#### Example:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
// Request
|
|
||||||
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0", "id":1, "method":"confirmTransaction", "params":["5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW"]}' http://localhost:8899
|
|
||||||
|
|
||||||
// Result
|
|
||||||
{"jsonrpc":"2.0","result":{"context":{"slot":1},"value":true},"id":1}
|
|
||||||
```
|
|
||||||
|
|
||||||
### getAccountInfo
|
### getAccountInfo
|
||||||
|
|
||||||
Returns all information associated with the account of provided Pubkey
|
Returns all information associated with the account of provided Pubkey
|
||||||
@ -299,12 +274,13 @@ The result field will be an object with the following fields:
|
|||||||
* `transactions: <array>` - an array of JSON objects containing:
|
* `transactions: <array>` - an array of JSON objects containing:
|
||||||
* `transaction: <object|string>` - [Transaction](#transaction-structure) object, either in JSON format or base-58 encoded binary data, depending on encoding parameter
|
* `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:
|
* `meta: <object>` - transaction status metadata object, containing `null` or:
|
||||||
* `status: <object>` - Transaction status:
|
* `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)
|
||||||
* `"Ok": null` - Transaction was successful
|
|
||||||
* `"Err": <ERR>` - Transaction failed with TransactionError [TransactionError definitions](https://github.com/solana-labs/solana/blob/master/sdk/src/transaction.rs#L18)
|
|
||||||
* `fee: <u64>` - fee this transaction was charged, as u64 integer
|
* `fee: <u64>` - fee this transaction was charged, as u64 integer
|
||||||
* `preBalances: <array>` - array of u64 account balances from before the transaction was processed
|
* `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
|
* `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
|
||||||
* `rewards: <array>` - an array of JSON objects containing:
|
* `rewards: <array>` - an array of JSON objects containing:
|
||||||
* `pubkey: <string>` - The public key, as base-58 encoded string, of the account that received the reward
|
* `pubkey: <string>` - The public key, as base-58 encoded string, of the account that received the reward
|
||||||
* `lamports: <i64>`- number of reward lamports credited or debited by the account, as a i64
|
* `lamports: <i64>`- number of reward lamports credited or debited by the account, as a i64
|
||||||
@ -316,13 +292,13 @@ The result field will be an object with the following fields:
|
|||||||
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc": "2.0","id":1,"method":"getConfirmedBlock","params":[430, "json"]}' localhost:8899
|
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc": "2.0","id":1,"method":"getConfirmedBlock","params":[430, "json"]}' localhost:8899
|
||||||
|
|
||||||
// Result
|
// Result
|
||||||
{"jsonrpc":"2.0","result":{"blockhash":"Gp3t5bfDsJv1ovP8cB1SuRhXVuoTqDv7p3tymyubYg5","parentSlot":429,"previousBlockhash":"EFejToxii1L5aUF2NrK9dsbAEmZSNyN5nsipmZHQR1eA","transactions":[{"transaction":{"message":{"accountKeys":["6H94zdiaYfRfPfKjYLjyr2VFBg6JHXygy84r3qhc3NsC","39UAy8hsoYPywGPGdmun747omSr79zLSjqvPJN3zetoH","SysvarS1otHashes111111111111111111111111111","SysvarC1ock11111111111111111111111111111111","Vote111111111111111111111111111111111111111"],"header":{"numReadonlySignedAccounts":0,"numReadonlyUnsignedAccounts":3,"numRequiredSignatures":2},"instructions":[{"accounts":[1,2,3],"data":"29z5mr1JoRmJYQ6ynmk3pf31cGFRziAF1M3mT3L6sFXf5cKLdkEaMXMT8AqLpD4CpcupHmuMEmtZHpomrwfdZetSomNy3d","programIdIndex":4}],"recentBlockhash":"EFejToxii1L5aUF2NrK9dsbAEmZSNyN5nsipmZHQR1eA"},"signatures":["35YGay1Lwjwgxe9zaH6APSHbt9gYQUCtBWTNL3aVwVGn9xTFw2fgds7qK5AL29mP63A9j3rh8KpN1TgSR62XCaby","4vANMjSKiwEchGSXwVrQkwHnmsbKQmy9vdrsYxWdCup1bLsFzX8gKrFTSVDCZCae2dbxJB9mPNhqB2sD1vvr4sAD"]},"meta":{"fee":1000,"postBalances":[499999972500,15298080,1,1,1],"preBalances":[499999990500,15298080,1,1,1],"status":{"Ok":null}}}]},"id":1}
|
{"jsonrpc":"2.0","result":{"blockhash":"Gp3t5bfDsJv1ovP8cB1SuRhXVuoTqDv7p3tymyubYg5","parentSlot":429,"previousBlockhash":"EFejToxii1L5aUF2NrK9dsbAEmZSNyN5nsipmZHQR1eA","transactions":[{"transaction":{"message":{"accountKeys":["6H94zdiaYfRfPfKjYLjyr2VFBg6JHXygy84r3qhc3NsC","39UAy8hsoYPywGPGdmun747omSr79zLSjqvPJN3zetoH","SysvarS1otHashes111111111111111111111111111","SysvarC1ock11111111111111111111111111111111","Vote111111111111111111111111111111111111111"],"header":{"numReadonlySignedAccounts":0,"numReadonlyUnsignedAccounts":3,"numRequiredSignatures":2},"instructions":[{"accounts":[1,2,3],"data":"29z5mr1JoRmJYQ6ynmk3pf31cGFRziAF1M3mT3L6sFXf5cKLdkEaMXMT8AqLpD4CpcupHmuMEmtZHpomrwfdZetSomNy3d","programIdIndex":4}],"recentBlockhash":"EFejToxii1L5aUF2NrK9dsbAEmZSNyN5nsipmZHQR1eA"},"signatures":["35YGay1Lwjwgxe9zaH6APSHbt9gYQUCtBWTNL3aVwVGn9xTFw2fgds7qK5AL29mP63A9j3rh8KpN1TgSR62XCaby","4vANMjSKiwEchGSXwVrQkwHnmsbKQmy9vdrsYxWdCup1bLsFzX8gKrFTSVDCZCae2dbxJB9mPNhqB2sD1vvr4sAD"]},"meta":{"err":null,"fee":18000,"postBalances":[499999972500,15298080,1,1,1],"preBalances":[499999990500,15298080,1,1,1],"status":{"Ok":null}}}]},"id":1}
|
||||||
|
|
||||||
// Request
|
// Request
|
||||||
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc": "2.0","id":1,"method":"getConfirmedBlock","params":[430, "binary"]}' localhost:8899
|
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc": "2.0","id":1,"method":"getConfirmedBlock","params":[430, "binary"]}' localhost:8899
|
||||||
|
|
||||||
// Result
|
// Result
|
||||||
{"jsonrpc":"2.0","result":{"blockhash":"Gp3t5bfDsJv1ovP8cB1SuRhXVuoTqDv7p3tymyubYg5","parentSlot":429,"previousBlockhash":"EFejToxii1L5aUF2NrK9dsbAEmZSNyN5nsipmZHQR1eA","transactions":[{"transaction":"81UZJt4dh4Do66jDhrgkQudS8J2N6iG3jaVav7gJrqJSFY4Ug53iA9JFJZh2gxKWcaFdLJwhHx9mRdg9JwDAWB4ywiu5154CRwXV4FMdnPLg7bhxRLwhhYaLsVgMF5AyNRcTzjCVoBvqFgDU7P8VEKDEiMvD3qxzm1pLZVxDG1LTQpT3Dz4Uviv4KQbFQNuC22KupBoyHFB7Zh6KFdMqux4M9PvhoqcoJsJKwXjWpKu7xmEKnnrSbfLadkgjBmmjhW3fdTrFvnhQdTkhtdJxUL1xS9GMuJQer8YgSKNtUXB1eXZQwXU8bU2BjYkZE6Q5Xww8hu9Z4E4Mo4QsooVtHoP6BM3NKw8zjVbWfoCQqxTrwuSzrNCWCWt58C24LHecH67CTt2uXbYSviixvrYkK7A3t68BxTJcF1dXJitEPTFe2ceTkauLJqrJgnER4iUrsjr26T8YgWvpY9wkkWFSviQW6wV5RASTCUasVEcrDiaKj8EQMkgyDoe9HyKitSVg67vMWJFpUXpQobseWJUs5FTWWzmfHmFp8FZ","meta":{"fee":1000,"postBalances":[499999972500,15298080,1,1,1],"preBalances":[499999990500,15298080,1,1,1],"status":{"Ok":null}}}]},"id":1}
|
{"jsonrpc":"2.0","result":{"blockhash":"Gp3t5bfDsJv1ovP8cB1SuRhXVuoTqDv7p3tymyubYg5","parentSlot":429,"previousBlockhash":"EFejToxii1L5aUF2NrK9dsbAEmZSNyN5nsipmZHQR1eA","transactions":[{"transaction":"81UZJt4dh4Do66jDhrgkQudS8J2N6iG3jaVav7gJrqJSFY4Ug53iA9JFJZh2gxKWcaFdLJwhHx9mRdg9JwDAWB4ywiu5154CRwXV4FMdnPLg7bhxRLwhhYaLsVgMF5AyNRcTzjCVoBvqFgDU7P8VEKDEiMvD3qxzm1pLZVxDG1LTQpT3Dz4Uviv4KQbFQNuC22KupBoyHFB7Zh6KFdMqux4M9PvhoqcoJsJKwXjWpKu7xmEKnnrSbfLadkgjBmmjhW3fdTrFvnhQdTkhtdJxUL1xS9GMuJQer8YgSKNtUXB1eXZQwXU8bU2BjYkZE6Q5Xww8hu9Z4E4Mo4QsooVtHoP6BM3NKw8zjVbWfoCQqxTrwuSzrNCWCWt58C24LHecH67CTt2uXbYSviixvrYkK7A3t68BxTJcF1dXJitEPTFe2ceTkauLJqrJgnER4iUrsjr26T8YgWvpY9wkkWFSviQW6wV5RASTCUasVEcrDiaKj8EQMkgyDoe9HyKitSVg67vMWJFpUXpQobseWJUs5FTWWzmfHmFp8FZ","meta":{"err":null,"fee":18000,"postBalances":[499999972500,15298080,1,1,1],"preBalances":[499999990500,15298080,1,1,1],"status":{"Ok":null}}}]},"id":1}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Transaction Structure
|
#### Transaction Structure
|
||||||
@ -655,41 +631,18 @@ curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":1, "m
|
|||||||
{"jsonrpc":"2.0","result":{"context":{"slot":1},"value":{"blockhash":"CSymwgTNX1j3E4qhKfJAUE41nBWEwXufoYryPbkde5RR","feeCalculator":{"burnPercent":50,"lamportsPerSignature":5000,"maxLamportsPerSignature":10000,"minLamportsPerSignature":5000,"targetLamportsPerSignature":1000,"targetSignaturesPerSlot":20000}}},"id":1}
|
{"jsonrpc":"2.0","result":{"context":{"slot":1},"value":{"blockhash":"CSymwgTNX1j3E4qhKfJAUE41nBWEwXufoYryPbkde5RR","feeCalculator":{"burnPercent":50,"lamportsPerSignature":5000,"maxLamportsPerSignature":10000,"minLamportsPerSignature":5000,"targetLamportsPerSignature":1000,"targetSignaturesPerSlot":20000}}},"id":1}
|
||||||
```
|
```
|
||||||
|
|
||||||
### getSignatureStatus
|
|
||||||
|
|
||||||
Returns the status of a given signature. This method is similar to [confirmTransaction](jsonrpc-api.md#confirmtransaction) but provides more resolution for error events. This method only searches the recent status cache of signatures, which retains all active slots plus `MAX_RECENT_BLOCKHASHES` rooted slots.
|
|
||||||
|
|
||||||
#### Parameters:
|
|
||||||
|
|
||||||
* `<string>` - Signature of Transaction to confirm, as base-58 encoded string
|
|
||||||
* `<object>` - (optional) [Commitment](jsonrpc-api.md#configuring-state-commitment)
|
|
||||||
|
|
||||||
#### Results:
|
|
||||||
|
|
||||||
* `<null>` - Unknown transaction
|
|
||||||
* `<object>` - Transaction status:
|
|
||||||
* `"Ok": <null>` - Transaction was successful
|
|
||||||
* `"Err": <ERR>` - Transaction failed with TransactionError [TransactionError definitions](https://github.com/solana-labs/solana/blob/master/sdk/src/transaction.rs#L14)
|
|
||||||
|
|
||||||
#### Example:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
// Request
|
|
||||||
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0", "id":1, "method":"getSignatureStatus", "params":["5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW"]}' http://localhost:8899
|
|
||||||
|
|
||||||
// Result
|
|
||||||
{"jsonrpc":"2.0","result":{"Ok": null},"id":1}
|
|
||||||
```
|
|
||||||
|
|
||||||
### getSignatureStatuses
|
### getSignatureStatuses
|
||||||
|
|
||||||
Returns the statuses of a list of signatures. This method is similar to [confirmTransaction](jsonrpc-api.md#confirmtransaction) but provides more resolution for error events. This method only searches the recent status cache of signatures, which retains all active slots plus `MAX_RECENT_BLOCKHASHES` rooted slots.
|
Returns the statuses of a list of signatures. Unless the
|
||||||
|
`searchTransactionHistory` configuration parameter is included, this method only
|
||||||
|
searches the recent status cache of signatures, which retains statuses for all
|
||||||
|
active slots plus `MAX_RECENT_BLOCKHASHES` rooted slots.
|
||||||
|
|
||||||
#### Parameters:
|
#### Parameters:
|
||||||
|
|
||||||
* `<array>` - An array of transaction signatures to confirm, as base-58 encoded strings
|
* `<array>` - An array of transaction signatures to confirm, as base-58 encoded strings
|
||||||
* `<object>` - (optional) Extended Rpc configuration, containing the following optional fields:
|
* `<object>` - (optional) Configuration object containing the following field:
|
||||||
* `commitment: <string>` - [Commitment](jsonrpc-api.md#configuring-state-commitment)
|
* `searchTransactionHistory: <bool>` - if true, a Solana node will search its ledger cache for any signatures not found in the recent status cache
|
||||||
|
|
||||||
#### Results:
|
#### Results:
|
||||||
|
|
||||||
@ -703,21 +656,25 @@ An array of:
|
|||||||
* `<object>`
|
* `<object>`
|
||||||
* `slot: <u64>` - The slot the transaction was processed
|
* `slot: <u64>` - The slot the transaction was processed
|
||||||
* `confirmations: <usize | null>` - Number of blocks since signature confirmation, null if rooted
|
* `confirmations: <usize | null>` - Number of blocks since signature confirmation, null if rooted
|
||||||
* `status: <object>` - Transaction status
|
* `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)
|
||||||
|
* DEPRECATED: `status: <object>` - Transaction status
|
||||||
* `"Ok": <null>` - Transaction was successful
|
* `"Ok": <null>` - Transaction was successful
|
||||||
* `"Err": <ERR>` - Transaction failed with TransactionError [TransactionError definitions](https://github.com/solana-labs/solana/blob/master/sdk/src/transaction.rs#L14)
|
* `"Err": <ERR>` - Transaction failed with TransactionError
|
||||||
|
|
||||||
#### Example:
|
#### Example:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
// Request
|
// Request
|
||||||
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0", "id":1, "method":"getSignatureStatus", "params":[["5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW", "5j7s6NiJS3JAkvgkoc18WVAsiSaci2pxB2A6ueCJP4tprA2TFg9wSyTLeYouxPBJEMzJinENTkpA52YStRW5Dia7"]]]}' http://localhost:8899
|
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0", "id":1, "method":"getSignatureStatuses", "params":[["5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW", "5j7s6NiJS3JAkvgkoc18WVAsiSaci2pxB2A6ueCJP4tprA2TFg9wSyTLeYouxPBJEMzJinENTkpA52YStRW5Dia7"]]}' http://localhost:8899
|
||||||
|
|
||||||
|
// Request with configuration
|
||||||
|
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0", "id":1, "method":"getSignatureStatuses", "params":[["5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW"], {"searchTransactionHistory": true}]}' http://localhost:8899
|
||||||
|
|
||||||
// Result
|
// Result
|
||||||
{"jsonrpc":"2.0","result":{"context":{"slot":82},"value":[{"slot": 72, "confirmations": 10, "status": {"Ok": null}}, null]},"id":1}
|
{"jsonrpc":"2.0","result":{"context":{"slot":82},"value":[{"slot": 72, "confirmations": 10, "err": null, "status": {"Ok": null}}, null]},"id":1}
|
||||||
|
|
||||||
// Result, first transaction rooted
|
// Result, first transaction rooted
|
||||||
{"jsonrpc":"2.0","result":{"context":{"slot":82},"value":[{"slot": 48, "confirmations": null, "status": {"Ok": null}}, null]},"id":1}
|
{"jsonrpc":"2.0","result":{"context":{"slot":82},"value":[{"slot": 48, "confirmations": null, "err": null, "status": {"Ok": null}}, null]},"id":1}
|
||||||
```
|
```
|
||||||
|
|
||||||
### getSlot
|
### getSlot
|
||||||
@ -915,7 +872,7 @@ The result field will be a JSON object with the following fields:
|
|||||||
// Request
|
// Request
|
||||||
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":1, "method":"getVersion"}' http://localhost:8899
|
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":1, "method":"getVersion"}' http://localhost:8899
|
||||||
// Result
|
// Result
|
||||||
{"jsonrpc":"2.0","result":{"solana-core": "1.0.13"},"id":1}
|
{"jsonrpc":"2.0","result":{"solana-core": "1.0.14"},"id":1}
|
||||||
```
|
```
|
||||||
|
|
||||||
### getVoteAccounts
|
### getVoteAccounts
|
||||||
@ -1226,7 +1183,7 @@ Subscribe to a transaction signature to receive notification when the transactio
|
|||||||
#### Notification Format:
|
#### Notification Format:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
{"jsonrpc": "2.0","method": "signatureNotification", "params": {"result": "Confirmed","subscription":0}}
|
{"jsonrpc": "2.0","method": "signatureNotification", "params": {"result": {"err": null}, "subscription":0}}
|
||||||
```
|
```
|
||||||
|
|
||||||
### signatureUnsubscribe
|
### signatureUnsubscribe
|
||||||
|
@ -171,7 +171,7 @@ $ solana send-timestamp <PUBKEY> <PROCESS_ID> --date 2018-12-24T23:59:00
|
|||||||
## Usage
|
## Usage
|
||||||
### solana-cli
|
### solana-cli
|
||||||
```text
|
```text
|
||||||
solana-cli 1.0.13 [channel=unknown commit=unknown]
|
solana-cli 1.0.14 [channel=unknown commit=unknown]
|
||||||
Blockchain, Rebuilt for Scale
|
Blockchain, Rebuilt for Scale
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-faucet"
|
name = "solana-faucet"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana Faucet"
|
description = "Solana Faucet"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -19,10 +19,10 @@ clap = "2.33"
|
|||||||
log = "0.4.8"
|
log = "0.4.8"
|
||||||
serde = "1.0.104"
|
serde = "1.0.104"
|
||||||
serde_derive = "1.0.103"
|
serde_derive = "1.0.103"
|
||||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.13" }
|
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||||
solana-logger = { path = "../logger", version = "1.0.13" }
|
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||||
solana-metrics = { path = "../metrics", version = "1.0.13" }
|
solana-metrics = { path = "../metrics", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
tokio = "0.1"
|
tokio = "0.1"
|
||||||
tokio-codec = "0.1"
|
tokio-codec = "0.1"
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-genesis-programs"
|
name = "solana-genesis-programs"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana genesis programs"
|
description = "Solana genesis programs"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -10,16 +10,16 @@ edition = "2018"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
log = { version = "0.4.8" }
|
log = { version = "0.4.8" }
|
||||||
solana-bpf-loader-program = { path = "../programs/bpf_loader", version = "1.0.13" }
|
solana-bpf-loader-program = { path = "../programs/bpf_loader", version = "1.0.14" }
|
||||||
solana-budget-program = { path = "../programs/budget", version = "1.0.13" }
|
solana-budget-program = { path = "../programs/budget", version = "1.0.14" }
|
||||||
solana-config-program = { path = "../programs/config", version = "1.0.13" }
|
solana-config-program = { path = "../programs/config", version = "1.0.14" }
|
||||||
solana-exchange-program = { path = "../programs/exchange", version = "1.0.13" }
|
solana-exchange-program = { path = "../programs/exchange", version = "1.0.14" }
|
||||||
solana-runtime = { path = "../runtime", version = "1.0.13" }
|
solana-runtime = { path = "../runtime", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
solana-stake-program = { path = "../programs/stake", version = "1.0.13" }
|
solana-stake-program = { path = "../programs/stake", version = "1.0.14" }
|
||||||
solana-storage-program = { path = "../programs/storage", version = "1.0.13" }
|
solana-storage-program = { path = "../programs/storage", version = "1.0.14" }
|
||||||
solana-vest-program = { path = "../programs/vest", version = "1.0.13" }
|
solana-vest-program = { path = "../programs/vest", version = "1.0.14" }
|
||||||
solana-vote-program = { path = "../programs/vote", version = "1.0.13" }
|
solana-vote-program = { path = "../programs/vote", version = "1.0.14" }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
crate-type = ["lib"]
|
crate-type = ["lib"]
|
||||||
|
@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "solana-genesis"
|
name = "solana-genesis"
|
||||||
description = "Blockchain, Rebuilt for Scale"
|
description = "Blockchain, Rebuilt for Scale"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
@ -15,13 +15,13 @@ chrono = "0.4"
|
|||||||
serde = "1.0.104"
|
serde = "1.0.104"
|
||||||
serde_json = "1.0.46"
|
serde_json = "1.0.46"
|
||||||
serde_yaml = "0.8.11"
|
serde_yaml = "0.8.11"
|
||||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.13" }
|
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||||
solana-genesis-programs = { path = "../genesis-programs", version = "1.0.13" }
|
solana-genesis-programs = { path = "../genesis-programs", version = "1.0.14" }
|
||||||
solana-ledger = { path = "../ledger", version = "1.0.13" }
|
solana-ledger = { path = "../ledger", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
solana-stake-program = { path = "../programs/stake", version = "1.0.13" }
|
solana-stake-program = { path = "../programs/stake", version = "1.0.14" }
|
||||||
solana-storage-program = { path = "../programs/storage", version = "1.0.13" }
|
solana-storage-program = { path = "../programs/storage", version = "1.0.14" }
|
||||||
solana-vote-program = { path = "../programs/vote", version = "1.0.13" }
|
solana-vote-program = { path = "../programs/vote", version = "1.0.14" }
|
||||||
tempfile = "3.1.0"
|
tempfile = "3.1.0"
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
|
@ -3,19 +3,19 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "solana-gossip"
|
name = "solana-gossip"
|
||||||
description = "Blockchain, Rebuilt for Scale"
|
description = "Blockchain, Rebuilt for Scale"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
clap = "2.33.0"
|
clap = "2.33.0"
|
||||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.13" }
|
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||||
solana-core = { path = "../core", version = "1.0.13" }
|
solana-core = { path = "../core", version = "1.0.14" }
|
||||||
solana-client = { path = "../client", version = "1.0.13" }
|
solana-client = { path = "../client", version = "1.0.14" }
|
||||||
solana-logger = { path = "../logger", version = "1.0.13" }
|
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||||
solana-net-utils = { path = "../net-utils", version = "1.0.13" }
|
solana-net-utils = { path = "../net-utils", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "solana-install"
|
name = "solana-install"
|
||||||
description = "The solana cluster software installer"
|
description = "The solana cluster software installer"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
@ -24,11 +24,11 @@ reqwest = { version = "0.10.1", default-features = false, features = ["blocking"
|
|||||||
serde = "1.0.104"
|
serde = "1.0.104"
|
||||||
serde_derive = "1.0.103"
|
serde_derive = "1.0.103"
|
||||||
serde_yaml = "0.8.11"
|
serde_yaml = "0.8.11"
|
||||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.13" }
|
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||||
solana-client = { path = "../client", version = "1.0.13" }
|
solana-client = { path = "../client", version = "1.0.14" }
|
||||||
solana-config-program = { path = "../programs/config", version = "1.0.13" }
|
solana-config-program = { path = "../programs/config", version = "1.0.14" }
|
||||||
solana-logger = { path = "../logger", version = "1.0.13" }
|
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
semver = "0.9.0"
|
semver = "0.9.0"
|
||||||
tar = "0.4.26"
|
tar = "0.4.26"
|
||||||
tempdir = "0.3.7"
|
tempdir = "0.3.7"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-keygen"
|
name = "solana-keygen"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana key generation utility"
|
description = "Solana key generation utility"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -13,10 +13,10 @@ bs58 = "0.3.0"
|
|||||||
clap = "2.33"
|
clap = "2.33"
|
||||||
dirs = "2.0.2"
|
dirs = "2.0.2"
|
||||||
num_cpus = "1.12.0"
|
num_cpus = "1.12.0"
|
||||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.13" }
|
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||||
solana-cli-config = { path = "../cli-config", version = "1.0.13" }
|
solana-cli-config = { path = "../cli-config", version = "1.0.14" }
|
||||||
solana-remote-wallet = { path = "../remote-wallet", version = "1.0.13" }
|
solana-remote-wallet = { path = "../remote-wallet", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
tiny-bip39 = "0.7.0"
|
tiny-bip39 = "0.7.0"
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
|
@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "solana-ledger-tool"
|
name = "solana-ledger-tool"
|
||||||
description = "Blockchain, Rebuilt for Scale"
|
description = "Blockchain, Rebuilt for Scale"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
@ -14,13 +14,13 @@ clap = "2.33.0"
|
|||||||
histogram = "*"
|
histogram = "*"
|
||||||
serde_json = "1.0.46"
|
serde_json = "1.0.46"
|
||||||
serde_yaml = "0.8.11"
|
serde_yaml = "0.8.11"
|
||||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.13" }
|
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||||
solana-ledger = { path = "../ledger", version = "1.0.13" }
|
solana-ledger = { path = "../ledger", version = "1.0.14" }
|
||||||
solana-logger = { path = "../logger", version = "1.0.13" }
|
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||||
solana-runtime = { path = "../runtime", version = "1.0.13" }
|
solana-runtime = { path = "../runtime", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
solana-vote-program = { path = "../programs/vote", version = "1.0.13" }
|
solana-vote-program = { path = "../programs/vote", version = "1.0.14" }
|
||||||
solana-stake-program = { path = "../programs/stake", version = "1.0.13" }
|
solana-stake-program = { path = "../programs/stake", version = "1.0.14" }
|
||||||
tempfile = "3.1.0"
|
tempfile = "3.1.0"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
|
@ -144,7 +144,7 @@ fn output_slot(
|
|||||||
println!(" Data: {:?}", instruction.data);
|
println!(" Data: {:?}", instruction.data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
match blockstore.read_transaction_status((slot, transaction.signatures[0])) {
|
match blockstore.read_transaction_status((transaction.signatures[0], slot)) {
|
||||||
Ok(transaction_status) => {
|
Ok(transaction_status) => {
|
||||||
if let Some(transaction_status) = transaction_status {
|
if let Some(transaction_status) = transaction_status {
|
||||||
println!(
|
println!(
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-ledger"
|
name = "solana-ledger"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana ledger"
|
description = "Solana ledger"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -28,19 +28,19 @@ reed-solomon-erasure = { package = "solana-reed-solomon-erasure", version = "4.0
|
|||||||
regex = "1.3.4"
|
regex = "1.3.4"
|
||||||
serde = "1.0.104"
|
serde = "1.0.104"
|
||||||
serde_bytes = "0.11.3"
|
serde_bytes = "0.11.3"
|
||||||
solana-transaction-status = { path = "../transaction-status", version = "1.0.13" }
|
solana-transaction-status = { path = "../transaction-status", version = "1.0.14" }
|
||||||
solana-genesis-programs = { path = "../genesis-programs", version = "1.0.13" }
|
solana-genesis-programs = { path = "../genesis-programs", version = "1.0.14" }
|
||||||
solana-logger = { path = "../logger", version = "1.0.13" }
|
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||||
solana-measure = { path = "../measure", version = "1.0.13" }
|
solana-measure = { path = "../measure", version = "1.0.14" }
|
||||||
solana-merkle-tree = { path = "../merkle-tree", version = "1.0.13" }
|
solana-merkle-tree = { path = "../merkle-tree", version = "1.0.14" }
|
||||||
solana-metrics = { path = "../metrics", version = "1.0.13" }
|
solana-metrics = { path = "../metrics", version = "1.0.14" }
|
||||||
solana-perf = { path = "../perf", version = "1.0.13" }
|
solana-perf = { path = "../perf", version = "1.0.14" }
|
||||||
ed25519-dalek = "1.0.0-pre.1"
|
ed25519-dalek = "1.0.0-pre.1"
|
||||||
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.13" }
|
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.14" }
|
||||||
solana-runtime = { path = "../runtime", version = "1.0.13" }
|
solana-runtime = { path = "../runtime", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
solana-stake-program = { path = "../programs/stake", version = "1.0.13" }
|
solana-stake-program = { path = "../programs/stake", version = "1.0.14" }
|
||||||
solana-vote-program = { path = "../programs/vote", version = "1.0.13" }
|
solana-vote-program = { path = "../programs/vote", version = "1.0.14" }
|
||||||
symlink = "0.1.0"
|
symlink = "0.1.0"
|
||||||
tar = "0.4.26"
|
tar = "0.4.26"
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
@ -57,7 +57,7 @@ features = ["lz4"]
|
|||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
assert_matches = "1.3.0"
|
assert_matches = "1.3.0"
|
||||||
matches = "0.1.6"
|
matches = "0.1.6"
|
||||||
solana-budget-program = { path = "../programs/budget", version = "1.0.13" }
|
solana-budget-program = { path = "../programs/budget", version = "1.0.14" }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
crate-type = ["lib"]
|
crate-type = ["lib"]
|
||||||
|
@ -37,8 +37,8 @@ use solana_sdk::{
|
|||||||
transaction::Transaction,
|
transaction::Transaction,
|
||||||
};
|
};
|
||||||
use solana_transaction_status::{
|
use solana_transaction_status::{
|
||||||
ConfirmedBlock, EncodedTransaction, Rewards, TransactionEncoding, TransactionStatusMeta,
|
ConfirmedBlock, EncodedTransaction, Rewards, RpcTransactionStatusMeta, TransactionEncoding,
|
||||||
TransactionWithStatusMeta,
|
TransactionStatusMeta, TransactionWithStatusMeta,
|
||||||
};
|
};
|
||||||
use solana_vote_program::{vote_instruction::VoteInstruction, vote_state::TIMESTAMP_SLOT_INTERVAL};
|
use solana_vote_program::{vote_instruction::VoteInstruction, vote_state::TIMESTAMP_SLOT_INTERVAL};
|
||||||
use std::{
|
use std::{
|
||||||
@ -87,6 +87,8 @@ pub struct Blockstore {
|
|||||||
data_shred_cf: LedgerColumn<cf::ShredData>,
|
data_shred_cf: LedgerColumn<cf::ShredData>,
|
||||||
code_shred_cf: LedgerColumn<cf::ShredCode>,
|
code_shred_cf: LedgerColumn<cf::ShredCode>,
|
||||||
transaction_status_cf: LedgerColumn<cf::TransactionStatus>,
|
transaction_status_cf: LedgerColumn<cf::TransactionStatus>,
|
||||||
|
transaction_status_index_cf: LedgerColumn<cf::TransactionStatusIndex>,
|
||||||
|
active_transaction_status_index: RwLock<u64>,
|
||||||
rewards_cf: LedgerColumn<cf::Rewards>,
|
rewards_cf: LedgerColumn<cf::Rewards>,
|
||||||
last_root: Arc<RwLock<Slot>>,
|
last_root: Arc<RwLock<Slot>>,
|
||||||
insert_shreds_lock: Arc<Mutex<()>>,
|
insert_shreds_lock: Arc<Mutex<()>>,
|
||||||
@ -179,6 +181,7 @@ impl Blockstore {
|
|||||||
|
|
||||||
// Open the database
|
// Open the database
|
||||||
let mut measure = Measure::start("open");
|
let mut measure = Measure::start("open");
|
||||||
|
info!("Opening database at {:?}", blockstore_path);
|
||||||
let db = Database::open(&blockstore_path)?;
|
let db = Database::open(&blockstore_path)?;
|
||||||
|
|
||||||
// Create the metadata column family
|
// Create the metadata column family
|
||||||
@ -198,6 +201,7 @@ impl Blockstore {
|
|||||||
let data_shred_cf = db.column();
|
let data_shred_cf = db.column();
|
||||||
let code_shred_cf = db.column();
|
let code_shred_cf = db.column();
|
||||||
let transaction_status_cf = db.column();
|
let transaction_status_cf = db.column();
|
||||||
|
let transaction_status_index_cf = db.column();
|
||||||
let rewards_cf = db.column();
|
let rewards_cf = db.column();
|
||||||
|
|
||||||
let db = Arc::new(db);
|
let db = Arc::new(db);
|
||||||
@ -210,6 +214,20 @@ impl Blockstore {
|
|||||||
.unwrap_or(0);
|
.unwrap_or(0);
|
||||||
let last_root = Arc::new(RwLock::new(max_root));
|
let last_root = Arc::new(RwLock::new(max_root));
|
||||||
|
|
||||||
|
// Get active transaction-status index or 0
|
||||||
|
let active_transaction_status_index = db
|
||||||
|
.iter::<cf::TransactionStatusIndex>(IteratorMode::Start)?
|
||||||
|
.next()
|
||||||
|
.and_then(|(_, data)| {
|
||||||
|
let index0: TransactionStatusIndexMeta = deserialize(&data).unwrap();
|
||||||
|
if index0.frozen {
|
||||||
|
Some(1)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.unwrap_or(0);
|
||||||
|
|
||||||
measure.stop();
|
measure.stop();
|
||||||
info!("{:?} {}", blockstore_path, measure);
|
info!("{:?} {}", blockstore_path, measure);
|
||||||
let blockstore = Blockstore {
|
let blockstore = Blockstore {
|
||||||
@ -223,6 +241,8 @@ impl Blockstore {
|
|||||||
data_shred_cf,
|
data_shred_cf,
|
||||||
code_shred_cf,
|
code_shred_cf,
|
||||||
transaction_status_cf,
|
transaction_status_cf,
|
||||||
|
transaction_status_index_cf,
|
||||||
|
active_transaction_status_index: RwLock::new(active_transaction_status_index),
|
||||||
rewards_cf,
|
rewards_cf,
|
||||||
new_shreds_signals: vec![],
|
new_shreds_signals: vec![],
|
||||||
completed_slots_senders: vec![],
|
completed_slots_senders: vec![],
|
||||||
@ -319,7 +339,7 @@ impl Blockstore {
|
|||||||
.expect("Database Error: Failed to get write batch");
|
.expect("Database Error: Failed to get write batch");
|
||||||
// delete range cf is not inclusive
|
// delete range cf is not inclusive
|
||||||
let to_slot = to_slot.checked_add(1).unwrap_or_else(|| std::u64::MAX);
|
let to_slot = to_slot.checked_add(1).unwrap_or_else(|| std::u64::MAX);
|
||||||
let columns_empty = self
|
let mut columns_empty = self
|
||||||
.db
|
.db
|
||||||
.delete_range_cf::<cf::SlotMeta>(&mut write_batch, from_slot, to_slot)
|
.delete_range_cf::<cf::SlotMeta>(&mut write_batch, from_slot, to_slot)
|
||||||
.unwrap_or(false)
|
.unwrap_or(false)
|
||||||
@ -355,14 +375,23 @@ impl Blockstore {
|
|||||||
.db
|
.db
|
||||||
.delete_range_cf::<cf::Index>(&mut write_batch, from_slot, to_slot)
|
.delete_range_cf::<cf::Index>(&mut write_batch, from_slot, to_slot)
|
||||||
.unwrap_or(false)
|
.unwrap_or(false)
|
||||||
& self
|
|
||||||
.db
|
|
||||||
.delete_range_cf::<cf::TransactionStatus>(&mut write_batch, from_slot, to_slot)
|
|
||||||
.unwrap_or(false)
|
|
||||||
& self
|
& self
|
||||||
.db
|
.db
|
||||||
.delete_range_cf::<cf::Rewards>(&mut write_batch, from_slot, to_slot)
|
.delete_range_cf::<cf::Rewards>(&mut write_batch, from_slot, to_slot)
|
||||||
.unwrap_or(false);
|
.unwrap_or(false);
|
||||||
|
let mut w_active_transaction_status_index =
|
||||||
|
self.active_transaction_status_index.write().unwrap();
|
||||||
|
if let Some(index) = self.toggle_transaction_status_index(
|
||||||
|
&mut write_batch,
|
||||||
|
&mut w_active_transaction_status_index,
|
||||||
|
to_slot,
|
||||||
|
)? {
|
||||||
|
columns_empty &= &self
|
||||||
|
.db
|
||||||
|
.delete_range_cf::<cf::TransactionStatus>(&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) {
|
if let Err(e) = self.db.write(write_batch) {
|
||||||
error!(
|
error!(
|
||||||
"Error: {:?} while submitting write batch for slot {:?} retrying...",
|
"Error: {:?} while submitting write batch for slot {:?} retrying...",
|
||||||
@ -370,6 +399,11 @@ impl Blockstore {
|
|||||||
);
|
);
|
||||||
return Err(e);
|
return Err(e);
|
||||||
}
|
}
|
||||||
|
write_timer.stop();
|
||||||
|
datapoint_info!(
|
||||||
|
"blockstore-purge",
|
||||||
|
("write_batch_ns", write_timer.as_us() as i64, i64)
|
||||||
|
);
|
||||||
Ok(columns_empty)
|
Ok(columns_empty)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -413,7 +447,7 @@ impl Blockstore {
|
|||||||
.unwrap_or(false)
|
.unwrap_or(false)
|
||||||
&& self
|
&& self
|
||||||
.transaction_status_cf
|
.transaction_status_cf
|
||||||
.compact_range(from_slot, to_slot)
|
.compact_range(0, 2)
|
||||||
.unwrap_or(false)
|
.unwrap_or(false)
|
||||||
&& self
|
&& self
|
||||||
.rewards_cf
|
.rewards_cf
|
||||||
@ -1463,29 +1497,154 @@ impl Blockstore {
|
|||||||
TransactionWithStatusMeta {
|
TransactionWithStatusMeta {
|
||||||
transaction: encoded_transaction,
|
transaction: encoded_transaction,
|
||||||
meta: self
|
meta: self
|
||||||
.transaction_status_cf
|
.read_transaction_status((signature, slot))
|
||||||
.get((slot, signature))
|
.expect("Expect database get to succeed")
|
||||||
.expect("Expect database get to succeed"),
|
.map(RpcTransactionStatusMeta::from),
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn initialize_transaction_status_index(&self) -> Result<()> {
|
||||||
|
self.transaction_status_index_cf
|
||||||
|
.put(0, &TransactionStatusIndexMeta::default())?;
|
||||||
|
self.transaction_status_index_cf
|
||||||
|
.put(1, &TransactionStatusIndexMeta::default())?;
|
||||||
|
// This dummy status improves compaction performance
|
||||||
|
self.transaction_status_cf.put(
|
||||||
|
(2, Signature::default(), 0),
|
||||||
|
&TransactionStatusMeta::default(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn toggle_transaction_status_index(
|
||||||
|
&self,
|
||||||
|
batch: &mut WriteBatch,
|
||||||
|
w_active_transaction_status_index: &mut u64,
|
||||||
|
to_slot: Slot,
|
||||||
|
) -> Result<Option<u64>> {
|
||||||
|
let index0 = self.transaction_status_index_cf.get(0)?;
|
||||||
|
if index0.is_none() {
|
||||||
|
return Ok(None);
|
||||||
|
}
|
||||||
|
let mut index0 = index0.unwrap();
|
||||||
|
let mut index1 = self.transaction_status_index_cf.get(1)?.unwrap();
|
||||||
|
|
||||||
|
if !index0.frozen && !index1.frozen {
|
||||||
|
index0.frozen = true;
|
||||||
|
*w_active_transaction_status_index = 1;
|
||||||
|
batch.put::<cf::TransactionStatusIndex>(0, &index0)?;
|
||||||
|
Ok(None)
|
||||||
|
} else {
|
||||||
|
let result = if index0.frozen && to_slot > index0.max_slot {
|
||||||
|
debug!("Pruning transaction index 0 at slot {}", index0.max_slot);
|
||||||
|
Some(0)
|
||||||
|
} else if index1.frozen && to_slot > index1.max_slot {
|
||||||
|
debug!("Pruning transaction index 1 at slot {}", index1.max_slot);
|
||||||
|
Some(1)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
};
|
||||||
|
|
||||||
|
if result.is_some() {
|
||||||
|
*w_active_transaction_status_index = if index0.frozen { 0 } else { 1 };
|
||||||
|
if index0.frozen {
|
||||||
|
index0.max_slot = 0
|
||||||
|
};
|
||||||
|
index0.frozen = !index0.frozen;
|
||||||
|
batch.put::<cf::TransactionStatusIndex>(0, &index0)?;
|
||||||
|
if index1.frozen {
|
||||||
|
index1.max_slot = 0
|
||||||
|
};
|
||||||
|
index1.frozen = !index1.frozen;
|
||||||
|
batch.put::<cf::TransactionStatusIndex>(1, &index1)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn make_transaction_status_index(
|
||||||
|
&self,
|
||||||
|
index: (Signature, 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()?;
|
||||||
|
}
|
||||||
|
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 {
|
||||||
|
assert!(!index_meta.frozen);
|
||||||
|
index_meta.max_slot = slot;
|
||||||
|
self.transaction_status_index_cf.put(i, &index_meta)?;
|
||||||
|
}
|
||||||
|
Ok((i, signature, slot))
|
||||||
|
}
|
||||||
|
|
||||||
pub fn read_transaction_status(
|
pub fn read_transaction_status(
|
||||||
&self,
|
&self,
|
||||||
index: (Slot, Signature),
|
index: (Signature, Slot),
|
||||||
) -> Result<Option<TransactionStatusMeta>> {
|
) -> Result<Option<TransactionStatusMeta>> {
|
||||||
self.transaction_status_cf.get(index)
|
let (signature, slot) = index;
|
||||||
|
let result = self.transaction_status_cf.get((0, signature, slot))?;
|
||||||
|
if result.is_none() {
|
||||||
|
Ok(self.transaction_status_cf.get((1, signature, slot))?)
|
||||||
|
} else {
|
||||||
|
Ok(result)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn write_transaction_status(
|
pub fn write_transaction_status(
|
||||||
&self,
|
&self,
|
||||||
index: (Slot, Signature),
|
index: (Signature, Slot),
|
||||||
status: &TransactionStatusMeta,
|
status: &TransactionStatusMeta,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
|
// This write lock prevents interleaving issues with the transactions_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)
|
self.transaction_status_cf.put(index, status)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns a transaction status if it was processed in a root, as well as a loop counter for
|
||||||
|
// unit testing
|
||||||
|
fn get_transaction_status_with_counter(
|
||||||
|
&self,
|
||||||
|
signature: Signature,
|
||||||
|
) -> Result<(Option<(Slot, TransactionStatusMeta)>, u64)> {
|
||||||
|
let mut counter = 0;
|
||||||
|
for transaction_status_cf_primary_index in 0..=1 {
|
||||||
|
let index_iterator = self.transaction_status_cf.iter(IteratorMode::From(
|
||||||
|
(transaction_status_cf_primary_index, signature, 0),
|
||||||
|
IteratorDirection::Forward,
|
||||||
|
))?;
|
||||||
|
for ((_, sig, slot), data) in index_iterator {
|
||||||
|
counter += 1;
|
||||||
|
if sig != signature {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if self.is_root(slot) {
|
||||||
|
let status: TransactionStatusMeta = deserialize(&data)?;
|
||||||
|
return Ok((Some((slot, status)), counter));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok((None, counter))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns a transaction status if it was processed in a root
|
||||||
|
pub fn get_transaction_status(
|
||||||
|
&self,
|
||||||
|
signature: Signature,
|
||||||
|
) -> Result<Option<(Slot, TransactionStatusMeta)>> {
|
||||||
|
self.get_transaction_status_with_counter(signature)
|
||||||
|
.map(|(status, _)| status)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn read_rewards(&self, index: Slot) -> Result<Option<Rewards>> {
|
pub fn read_rewards(&self, index: Slot) -> Result<Option<Rewards>> {
|
||||||
self.rewards_cf.get(index)
|
self.rewards_cf.get(index)
|
||||||
}
|
}
|
||||||
@ -2612,7 +2771,7 @@ pub mod tests {
|
|||||||
.iter::<cf::TransactionStatus>(IteratorMode::Start)
|
.iter::<cf::TransactionStatus>(IteratorMode::Start)
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.next()
|
.next()
|
||||||
.map(|((slot, _), _)| slot >= min_slot)
|
.map(|((_, _, slot), _)| slot >= min_slot)
|
||||||
.unwrap_or(true)
|
.unwrap_or(true)
|
||||||
& blockstore
|
& blockstore
|
||||||
.db
|
.db
|
||||||
@ -4813,7 +4972,7 @@ pub mod tests {
|
|||||||
.put_meta_bytes(slot - 1, &serialize(&parent_meta).unwrap())
|
.put_meta_bytes(slot - 1, &serialize(&parent_meta).unwrap())
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let expected_transactions: Vec<(Transaction, Option<TransactionStatusMeta>)> = entries
|
let expected_transactions: Vec<(Transaction, Option<RpcTransactionStatusMeta>)> = entries
|
||||||
.iter()
|
.iter()
|
||||||
.cloned()
|
.cloned()
|
||||||
.filter(|entry| !entry.is_tick())
|
.filter(|entry| !entry.is_tick())
|
||||||
@ -4829,7 +4988,7 @@ pub mod tests {
|
|||||||
ledger
|
ledger
|
||||||
.transaction_status_cf
|
.transaction_status_cf
|
||||||
.put(
|
.put(
|
||||||
(slot, signature),
|
(0, signature, slot),
|
||||||
&TransactionStatusMeta {
|
&TransactionStatusMeta {
|
||||||
status: Ok(()),
|
status: Ok(()),
|
||||||
fee: 42,
|
fee: 42,
|
||||||
@ -4841,7 +5000,7 @@ pub mod tests {
|
|||||||
ledger
|
ledger
|
||||||
.transaction_status_cf
|
.transaction_status_cf
|
||||||
.put(
|
.put(
|
||||||
(slot + 1, signature),
|
(0, signature, slot + 1),
|
||||||
&TransactionStatusMeta {
|
&TransactionStatusMeta {
|
||||||
status: Ok(()),
|
status: Ok(()),
|
||||||
fee: 42,
|
fee: 42,
|
||||||
@ -4852,12 +5011,15 @@ pub mod tests {
|
|||||||
.unwrap();
|
.unwrap();
|
||||||
(
|
(
|
||||||
transaction,
|
transaction,
|
||||||
Some(TransactionStatusMeta {
|
Some(
|
||||||
|
TransactionStatusMeta {
|
||||||
status: Ok(()),
|
status: Ok(()),
|
||||||
fee: 42,
|
fee: 42,
|
||||||
pre_balances,
|
pre_balances,
|
||||||
post_balances,
|
post_balances,
|
||||||
}),
|
}
|
||||||
|
.into(),
|
||||||
|
),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
@ -5107,14 +5269,14 @@ pub mod tests {
|
|||||||
|
|
||||||
// result not found
|
// result not found
|
||||||
assert!(transaction_status_cf
|
assert!(transaction_status_cf
|
||||||
.get((0, Signature::default()))
|
.get((0, Signature::default(), 0))
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.is_none());
|
.is_none());
|
||||||
|
|
||||||
// insert value
|
// insert value
|
||||||
assert!(transaction_status_cf
|
assert!(transaction_status_cf
|
||||||
.put(
|
.put(
|
||||||
(0, Signature::default()),
|
(0, Signature::default(), 0),
|
||||||
&TransactionStatusMeta {
|
&TransactionStatusMeta {
|
||||||
status: solana_sdk::transaction::Result::<()>::Err(
|
status: solana_sdk::transaction::Result::<()>::Err(
|
||||||
TransactionError::AccountNotFound
|
TransactionError::AccountNotFound
|
||||||
@ -5133,7 +5295,7 @@ pub mod tests {
|
|||||||
pre_balances,
|
pre_balances,
|
||||||
post_balances,
|
post_balances,
|
||||||
} = transaction_status_cf
|
} = transaction_status_cf
|
||||||
.get((0, Signature::default()))
|
.get((0, Signature::default(), 0))
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(status, Err(TransactionError::AccountNotFound));
|
assert_eq!(status, Err(TransactionError::AccountNotFound));
|
||||||
@ -5144,7 +5306,7 @@ pub mod tests {
|
|||||||
// insert value
|
// insert value
|
||||||
assert!(transaction_status_cf
|
assert!(transaction_status_cf
|
||||||
.put(
|
.put(
|
||||||
(9, Signature::default()),
|
(0, Signature::new(&[2u8; 64]), 9),
|
||||||
&TransactionStatusMeta {
|
&TransactionStatusMeta {
|
||||||
status: solana_sdk::transaction::Result::<()>::Ok(()),
|
status: solana_sdk::transaction::Result::<()>::Ok(()),
|
||||||
fee: 9u64,
|
fee: 9u64,
|
||||||
@ -5161,7 +5323,7 @@ pub mod tests {
|
|||||||
pre_balances,
|
pre_balances,
|
||||||
post_balances,
|
post_balances,
|
||||||
} = transaction_status_cf
|
} = transaction_status_cf
|
||||||
.get((9, Signature::default()))
|
.get((0, Signature::new(&[2u8; 64]), 9))
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
@ -5174,6 +5336,388 @@ pub mod tests {
|
|||||||
Blockstore::destroy(&blockstore_path).expect("Expected successful database destruction");
|
Blockstore::destroy(&blockstore_path).expect("Expected successful database destruction");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_transaction_status_index() {
|
||||||
|
let blockstore_path = get_tmp_ledger_path!();
|
||||||
|
{
|
||||||
|
let blockstore = Blockstore::open(&blockstore_path).unwrap();
|
||||||
|
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());
|
||||||
|
|
||||||
|
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),
|
||||||
|
&TransactionStatusMeta::default(),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
// New statuses bump index 0 max_slot
|
||||||
|
assert_eq!(
|
||||||
|
transaction_status_index_cf.get(0).unwrap().unwrap(),
|
||||||
|
TransactionStatusIndexMeta {
|
||||||
|
max_slot: slot0,
|
||||||
|
frozen: false,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
transaction_status_index_cf.get(1).unwrap().unwrap(),
|
||||||
|
TransactionStatusIndexMeta::default()
|
||||||
|
);
|
||||||
|
|
||||||
|
let first_status_entry = blockstore
|
||||||
|
.db
|
||||||
|
.iter::<cf::TransactionStatus>(IteratorMode::From(
|
||||||
|
(0, Signature::default(), 0),
|
||||||
|
IteratorDirection::Forward,
|
||||||
|
))
|
||||||
|
.unwrap()
|
||||||
|
.next()
|
||||||
|
.unwrap()
|
||||||
|
.0;
|
||||||
|
assert_eq!(first_status_entry.0, 0);
|
||||||
|
assert_eq!(first_status_entry.2, slot0);
|
||||||
|
|
||||||
|
blockstore.run_purge(0, 8).unwrap();
|
||||||
|
// First successful prune freezes index 0
|
||||||
|
assert_eq!(
|
||||||
|
transaction_status_index_cf.get(0).unwrap().unwrap(),
|
||||||
|
TransactionStatusIndexMeta {
|
||||||
|
max_slot: slot0,
|
||||||
|
frozen: true,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
transaction_status_index_cf.get(1).unwrap().unwrap(),
|
||||||
|
TransactionStatusIndexMeta::default()
|
||||||
|
);
|
||||||
|
|
||||||
|
let slot1 = 20;
|
||||||
|
for _ in 0..5 {
|
||||||
|
let random_bytes: Vec<u8> = (0..64).map(|_| rand::random::<u8>()).collect();
|
||||||
|
blockstore
|
||||||
|
.write_transaction_status(
|
||||||
|
(Signature::new(&random_bytes), slot1),
|
||||||
|
&TransactionStatusMeta::default(),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
transaction_status_index_cf.get(0).unwrap().unwrap(),
|
||||||
|
TransactionStatusIndexMeta {
|
||||||
|
max_slot: slot0,
|
||||||
|
frozen: true,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
// Index 0 is frozen, so new statuses bump index 1 max_slot
|
||||||
|
assert_eq!(
|
||||||
|
transaction_status_index_cf.get(1).unwrap().unwrap(),
|
||||||
|
TransactionStatusIndexMeta {
|
||||||
|
max_slot: slot1,
|
||||||
|
frozen: false,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// Index 0 statuses still exist
|
||||||
|
let first_status_entry = blockstore
|
||||||
|
.db
|
||||||
|
.iter::<cf::TransactionStatus>(IteratorMode::From(
|
||||||
|
(0, Signature::default(), 0),
|
||||||
|
IteratorDirection::Forward,
|
||||||
|
))
|
||||||
|
.unwrap()
|
||||||
|
.next()
|
||||||
|
.unwrap()
|
||||||
|
.0;
|
||||||
|
assert_eq!(first_status_entry.0, 0);
|
||||||
|
assert_eq!(first_status_entry.2, 10);
|
||||||
|
// New statuses are stored in index 1
|
||||||
|
let index1_first_status_entry = blockstore
|
||||||
|
.db
|
||||||
|
.iter::<cf::TransactionStatus>(IteratorMode::From(
|
||||||
|
(1, Signature::default(), 0),
|
||||||
|
IteratorDirection::Forward,
|
||||||
|
))
|
||||||
|
.unwrap()
|
||||||
|
.next()
|
||||||
|
.unwrap()
|
||||||
|
.0;
|
||||||
|
assert_eq!(index1_first_status_entry.0, 1);
|
||||||
|
assert_eq!(index1_first_status_entry.2, slot1);
|
||||||
|
|
||||||
|
blockstore.run_purge(0, 18).unwrap();
|
||||||
|
// Successful prune toggles TransactionStatusIndex
|
||||||
|
assert_eq!(
|
||||||
|
transaction_status_index_cf.get(0).unwrap().unwrap(),
|
||||||
|
TransactionStatusIndexMeta {
|
||||||
|
max_slot: 0,
|
||||||
|
frozen: false,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
transaction_status_index_cf.get(1).unwrap().unwrap(),
|
||||||
|
TransactionStatusIndexMeta {
|
||||||
|
max_slot: slot1,
|
||||||
|
frozen: true,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// Index 0 has been pruned, so first status entry is now index 1
|
||||||
|
let first_status_entry = blockstore
|
||||||
|
.db
|
||||||
|
.iter::<cf::TransactionStatus>(IteratorMode::From(
|
||||||
|
(0, Signature::default(), 0),
|
||||||
|
IteratorDirection::Forward,
|
||||||
|
))
|
||||||
|
.unwrap()
|
||||||
|
.next()
|
||||||
|
.unwrap()
|
||||||
|
.0;
|
||||||
|
assert_eq!(first_status_entry.0, 1);
|
||||||
|
assert_eq!(first_status_entry.2, slot1);
|
||||||
|
}
|
||||||
|
Blockstore::destroy(&blockstore_path).expect("Expected successful database destruction");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_purge_transaction_status() {
|
||||||
|
let blockstore_path = get_tmp_ledger_path!();
|
||||||
|
{
|
||||||
|
let blockstore = Blockstore::open(&blockstore_path).unwrap();
|
||||||
|
let transaction_status_index_cf = blockstore.db.column::<cf::TransactionStatusIndex>();
|
||||||
|
let slot = 10;
|
||||||
|
for _ in 0..5 {
|
||||||
|
let random_bytes: Vec<u8> = (0..64).map(|_| rand::random::<u8>()).collect();
|
||||||
|
blockstore
|
||||||
|
.write_transaction_status(
|
||||||
|
(Signature::new(&random_bytes), slot),
|
||||||
|
&TransactionStatusMeta::default(),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
// Purge to freeze index 0
|
||||||
|
blockstore.run_purge(0, 1).unwrap();
|
||||||
|
let mut status_entry_iterator = blockstore
|
||||||
|
.db
|
||||||
|
.iter::<cf::TransactionStatus>(IteratorMode::From(
|
||||||
|
(0, Signature::default(), 0),
|
||||||
|
IteratorDirection::Forward,
|
||||||
|
))
|
||||||
|
.unwrap();
|
||||||
|
for _ in 0..5 {
|
||||||
|
let entry = status_entry_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 {
|
||||||
|
max_slot: 10,
|
||||||
|
frozen: true,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// Low purge should not affect state
|
||||||
|
blockstore.run_purge(0, 5).unwrap();
|
||||||
|
let mut status_entry_iterator = blockstore
|
||||||
|
.db
|
||||||
|
.iter::<cf::TransactionStatus>(IteratorMode::From(
|
||||||
|
(0, Signature::default(), 0),
|
||||||
|
IteratorDirection::Forward,
|
||||||
|
))
|
||||||
|
.unwrap();
|
||||||
|
for _ in 0..5 {
|
||||||
|
let entry = status_entry_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 {
|
||||||
|
max_slot: 10,
|
||||||
|
frozen: true,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// Test boundary conditions: < slot should not purge statuses; <= slot should
|
||||||
|
blockstore.run_purge(0, 9).unwrap();
|
||||||
|
let mut status_entry_iterator = blockstore
|
||||||
|
.db
|
||||||
|
.iter::<cf::TransactionStatus>(IteratorMode::From(
|
||||||
|
(0, Signature::default(), 0),
|
||||||
|
IteratorDirection::Forward,
|
||||||
|
))
|
||||||
|
.unwrap();
|
||||||
|
for _ in 0..5 {
|
||||||
|
let entry = status_entry_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 {
|
||||||
|
max_slot: 10,
|
||||||
|
frozen: true,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
blockstore.run_purge(0, 10).unwrap();
|
||||||
|
let mut status_entry_iterator = blockstore
|
||||||
|
.db
|
||||||
|
.iter::<cf::TransactionStatus>(IteratorMode::From(
|
||||||
|
(0, Signature::default(), 0),
|
||||||
|
IteratorDirection::Forward,
|
||||||
|
))
|
||||||
|
.unwrap();
|
||||||
|
let padding_entry = status_entry_iterator.next().unwrap().0;
|
||||||
|
assert_eq!(padding_entry.0, 2);
|
||||||
|
assert_eq!(padding_entry.2, 0);
|
||||||
|
assert!(status_entry_iterator.next().is_none());
|
||||||
|
assert_eq!(
|
||||||
|
transaction_status_index_cf.get(0).unwrap().unwrap(),
|
||||||
|
TransactionStatusIndexMeta {
|
||||||
|
max_slot: 0,
|
||||||
|
frozen: false,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
transaction_status_index_cf.get(1).unwrap().unwrap(),
|
||||||
|
TransactionStatusIndexMeta {
|
||||||
|
max_slot: 0,
|
||||||
|
frozen: true,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Blockstore::destroy(&blockstore_path).expect("Expected successful database destruction");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_get_transaction_status() {
|
||||||
|
let blockstore_path = get_tmp_ledger_path!();
|
||||||
|
{
|
||||||
|
let blockstore = Blockstore::open(&blockstore_path).unwrap();
|
||||||
|
let transaction_status_cf = blockstore.db.column::<cf::TransactionStatus>();
|
||||||
|
|
||||||
|
let pre_balances_vec = vec![1, 2, 3];
|
||||||
|
let post_balances_vec = vec![3, 2, 1];
|
||||||
|
let status = TransactionStatusMeta {
|
||||||
|
status: solana_sdk::transaction::Result::<()>::Ok(()),
|
||||||
|
fee: 42u64,
|
||||||
|
pre_balances: pre_balances_vec.clone(),
|
||||||
|
post_balances: post_balances_vec.clone(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let signature1 = Signature::new(&[1u8; 64]);
|
||||||
|
let signature2 = Signature::new(&[2u8; 64]);
|
||||||
|
let signature3 = Signature::new(&[3u8; 64]);
|
||||||
|
let signature4 = Signature::new(&[4u8; 64]);
|
||||||
|
let signature5 = Signature::new(&[5u8; 64]);
|
||||||
|
let signature6 = Signature::new(&[6u8; 64]);
|
||||||
|
|
||||||
|
// Initialize index 0, including:
|
||||||
|
// signature2 in non-root and root,
|
||||||
|
// signature4 in 2 non-roots,
|
||||||
|
// extra entries
|
||||||
|
transaction_status_cf
|
||||||
|
.put((0, signature2.clone(), 1), &status)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
transaction_status_cf
|
||||||
|
.put((0, signature2.clone(), 2), &status)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
transaction_status_cf
|
||||||
|
.put((0, signature4.clone(), 0), &status)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
transaction_status_cf
|
||||||
|
.put((0, signature4.clone(), 1), &status)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
transaction_status_cf
|
||||||
|
.put((0, signature5.clone(), 0), &status)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
transaction_status_cf
|
||||||
|
.put((0, signature5.clone(), 1), &status)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
// Initialize index 1, including:
|
||||||
|
// signature4 in non-root and root,
|
||||||
|
// extra entries
|
||||||
|
transaction_status_cf
|
||||||
|
.put((1, signature4.clone(), 1), &status)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
transaction_status_cf
|
||||||
|
.put((1, signature4.clone(), 2), &status)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
transaction_status_cf
|
||||||
|
.put((1, signature5.clone(), 0), &status)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
transaction_status_cf
|
||||||
|
.put((1, signature5.clone(), 1), &status)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
blockstore.set_roots(&[2]).unwrap();
|
||||||
|
|
||||||
|
// Signature exists, root found in index 0
|
||||||
|
if let (Some((slot, _status)), counter) = blockstore
|
||||||
|
.get_transaction_status_with_counter(signature2)
|
||||||
|
.unwrap()
|
||||||
|
{
|
||||||
|
assert_eq!(slot, 2);
|
||||||
|
assert_eq!(counter, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Signature exists, root found in index 1
|
||||||
|
if let (Some((slot, _status)), counter) = blockstore
|
||||||
|
.get_transaction_status_with_counter(signature4)
|
||||||
|
.unwrap()
|
||||||
|
{
|
||||||
|
assert_eq!(slot, 2);
|
||||||
|
assert_eq!(counter, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Signature exists, no root found
|
||||||
|
let (status, counter) = blockstore
|
||||||
|
.get_transaction_status_with_counter(signature5)
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(status, None);
|
||||||
|
assert_eq!(counter, 5);
|
||||||
|
|
||||||
|
// Signature does not exist, smaller than existing entries
|
||||||
|
let (status, counter) = blockstore
|
||||||
|
.get_transaction_status_with_counter(signature1)
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(status, None);
|
||||||
|
assert_eq!(counter, 2);
|
||||||
|
|
||||||
|
// Signature does not exist, between existing entries
|
||||||
|
let (status, counter) = blockstore
|
||||||
|
.get_transaction_status_with_counter(signature3)
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(status, None);
|
||||||
|
assert_eq!(counter, 2);
|
||||||
|
|
||||||
|
// Signature does not exist, larger than existing entries
|
||||||
|
let (status, counter) = blockstore
|
||||||
|
.get_transaction_status_with_counter(signature6)
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(status, None);
|
||||||
|
assert_eq!(counter, 1);
|
||||||
|
}
|
||||||
|
Blockstore::destroy(&blockstore_path).expect("Expected successful database destruction");
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_get_last_hash() {
|
fn test_get_last_hash() {
|
||||||
let mut entries: Vec<Entry> = vec![];
|
let mut entries: Vec<Entry> = vec![];
|
||||||
@ -5209,7 +5753,7 @@ pub mod tests {
|
|||||||
);
|
);
|
||||||
transaction_status_cf
|
transaction_status_cf
|
||||||
.put(
|
.put(
|
||||||
(slot, transaction.signatures[0]),
|
(0, transaction.signatures[0], slot),
|
||||||
&TransactionStatusMeta {
|
&TransactionStatusMeta {
|
||||||
status: solana_sdk::transaction::Result::<()>::Err(
|
status: solana_sdk::transaction::Result::<()>::Err(
|
||||||
TransactionError::AccountNotFound,
|
TransactionError::AccountNotFound,
|
||||||
|
@ -38,6 +38,8 @@ const DATA_SHRED_CF: &str = "data_shred";
|
|||||||
const CODE_SHRED_CF: &str = "code_shred";
|
const CODE_SHRED_CF: &str = "code_shred";
|
||||||
/// Column family for Transaction Status
|
/// Column family for Transaction Status
|
||||||
const TRANSACTION_STATUS_CF: &str = "transaction_status";
|
const TRANSACTION_STATUS_CF: &str = "transaction_status";
|
||||||
|
/// Column family for Transaction Status
|
||||||
|
const TRANSACTION_STATUS_INDEX_CF: &str = "transaction_status_index";
|
||||||
/// Column family for Rewards
|
/// Column family for Rewards
|
||||||
const REWARDS_CF: &str = "rewards";
|
const REWARDS_CF: &str = "rewards";
|
||||||
|
|
||||||
@ -108,6 +110,10 @@ pub mod columns {
|
|||||||
/// The transaction status column
|
/// The transaction status column
|
||||||
pub struct TransactionStatus;
|
pub struct TransactionStatus;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
/// The transaction status index column
|
||||||
|
pub struct TransactionStatusIndex;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
/// The rewards column
|
/// The rewards column
|
||||||
pub struct Rewards;
|
pub struct Rewards;
|
||||||
@ -120,7 +126,7 @@ impl Rocks {
|
|||||||
fn open(path: &Path) -> Result<Rocks> {
|
fn open(path: &Path) -> Result<Rocks> {
|
||||||
use columns::{
|
use columns::{
|
||||||
DeadSlots, DuplicateSlots, ErasureMeta, Index, Orphans, Rewards, Root, ShredCode,
|
DeadSlots, DuplicateSlots, ErasureMeta, Index, Orphans, Rewards, Root, ShredCode,
|
||||||
ShredData, SlotMeta, TransactionStatus,
|
ShredData, SlotMeta, TransactionStatus, TransactionStatusIndex,
|
||||||
};
|
};
|
||||||
|
|
||||||
fs::create_dir_all(&path)?;
|
fs::create_dir_all(&path)?;
|
||||||
@ -145,6 +151,8 @@ impl Rocks {
|
|||||||
ColumnFamilyDescriptor::new(ShredCode::NAME, get_cf_options());
|
ColumnFamilyDescriptor::new(ShredCode::NAME, get_cf_options());
|
||||||
let transaction_status_cf_descriptor =
|
let transaction_status_cf_descriptor =
|
||||||
ColumnFamilyDescriptor::new(TransactionStatus::NAME, get_cf_options());
|
ColumnFamilyDescriptor::new(TransactionStatus::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());
|
let rewards_cf_descriptor = ColumnFamilyDescriptor::new(Rewards::NAME, get_cf_options());
|
||||||
|
|
||||||
let cfs = vec![
|
let cfs = vec![
|
||||||
@ -158,6 +166,7 @@ impl Rocks {
|
|||||||
shred_data_cf_descriptor,
|
shred_data_cf_descriptor,
|
||||||
shred_code_cf_descriptor,
|
shred_code_cf_descriptor,
|
||||||
transaction_status_cf_descriptor,
|
transaction_status_cf_descriptor,
|
||||||
|
transaction_status_index_cf_descriptor,
|
||||||
rewards_cf_descriptor,
|
rewards_cf_descriptor,
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -170,7 +179,7 @@ impl Rocks {
|
|||||||
fn columns(&self) -> Vec<&'static str> {
|
fn columns(&self) -> Vec<&'static str> {
|
||||||
use columns::{
|
use columns::{
|
||||||
DeadSlots, DuplicateSlots, ErasureMeta, Index, Orphans, Rewards, Root, ShredCode,
|
DeadSlots, DuplicateSlots, ErasureMeta, Index, Orphans, Rewards, Root, ShredCode,
|
||||||
ShredData, SlotMeta, TransactionStatus,
|
ShredData, SlotMeta, TransactionStatus, TransactionStatusIndex,
|
||||||
};
|
};
|
||||||
|
|
||||||
vec![
|
vec![
|
||||||
@ -184,6 +193,7 @@ impl Rocks {
|
|||||||
ShredData::NAME,
|
ShredData::NAME,
|
||||||
ShredCode::NAME,
|
ShredCode::NAME,
|
||||||
TransactionStatus::NAME,
|
TransactionStatus::NAME,
|
||||||
|
TransactionStatusIndex::NAME,
|
||||||
Rewards::NAME,
|
Rewards::NAME,
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@ -256,7 +266,7 @@ pub trait Column {
|
|||||||
|
|
||||||
fn key(index: Self::Index) -> Vec<u8>;
|
fn key(index: Self::Index) -> Vec<u8>;
|
||||||
fn index(key: &[u8]) -> Self::Index;
|
fn index(key: &[u8]) -> Self::Index;
|
||||||
fn slot(index: Self::Index) -> Slot;
|
fn primary_index(index: Self::Index) -> Slot;
|
||||||
fn as_index(slot: Slot) -> Self::Index;
|
fn as_index(slot: Slot) -> Self::Index;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -272,6 +282,10 @@ impl TypedColumn for columns::TransactionStatus {
|
|||||||
type Type = TransactionStatusMeta;
|
type Type = TransactionStatusMeta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl TypedColumn for columns::TransactionStatusIndex {
|
||||||
|
type Type = blockstore_meta::TransactionStatusIndexMeta;
|
||||||
|
}
|
||||||
|
|
||||||
pub trait SlotColumn<Index = u64> {}
|
pub trait SlotColumn<Index = u64> {}
|
||||||
|
|
||||||
impl<T: SlotColumn> Column for T {
|
impl<T: SlotColumn> Column for T {
|
||||||
@ -287,7 +301,7 @@ impl<T: SlotColumn> Column for T {
|
|||||||
BigEndian::read_u64(&key[..8])
|
BigEndian::read_u64(&key[..8])
|
||||||
}
|
}
|
||||||
|
|
||||||
fn slot(index: u64) -> Slot {
|
fn primary_index(index: u64) -> Slot {
|
||||||
index
|
index
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -297,27 +311,29 @@ impl<T: SlotColumn> Column for T {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Column for columns::TransactionStatus {
|
impl Column for columns::TransactionStatus {
|
||||||
type Index = (Slot, Signature);
|
type Index = (u64, Signature, Slot);
|
||||||
|
|
||||||
fn key((slot, index): (Slot, Signature)) -> Vec<u8> {
|
fn key((index, signature, slot): (u64, Signature, Slot)) -> Vec<u8> {
|
||||||
let mut key = vec![0; 8 + 64];
|
let mut key = vec![0; 8 + 8 + 64];
|
||||||
BigEndian::write_u64(&mut key[..8], slot);
|
BigEndian::write_u64(&mut key[0..8], index);
|
||||||
key[8..72].clone_from_slice(&index.as_ref()[0..64]);
|
key[8..72].clone_from_slice(&signature.as_ref()[0..64]);
|
||||||
|
BigEndian::write_u64(&mut key[72..80], slot);
|
||||||
key
|
key
|
||||||
}
|
}
|
||||||
|
|
||||||
fn index(key: &[u8]) -> (Slot, Signature) {
|
fn index(key: &[u8]) -> (u64, Signature, Slot) {
|
||||||
let slot = BigEndian::read_u64(&key[..8]);
|
let index = BigEndian::read_u64(&key[0..8]);
|
||||||
let index = Signature::new(&key[8..72]);
|
let signature = Signature::new(&key[8..72]);
|
||||||
(slot, index)
|
let slot = BigEndian::read_u64(&key[72..80]);
|
||||||
|
(index, signature, slot)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn slot(index: Self::Index) -> Slot {
|
fn primary_index(index: Self::Index) -> u64 {
|
||||||
index.0
|
index.0
|
||||||
}
|
}
|
||||||
|
|
||||||
fn as_index(slot: Slot) -> Self::Index {
|
fn as_index(index: u64) -> Self::Index {
|
||||||
(slot, Signature::default())
|
(index, Signature::default(), 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -325,6 +341,32 @@ impl ColumnName for columns::TransactionStatus {
|
|||||||
const NAME: &'static str = TRANSACTION_STATUS_CF;
|
const NAME: &'static str = TRANSACTION_STATUS_CF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Column for columns::TransactionStatusIndex {
|
||||||
|
type Index = u64;
|
||||||
|
|
||||||
|
fn key(index: u64) -> Vec<u8> {
|
||||||
|
let mut key = vec![0; 8];
|
||||||
|
BigEndian::write_u64(&mut key[..], index);
|
||||||
|
key
|
||||||
|
}
|
||||||
|
|
||||||
|
fn index(key: &[u8]) -> u64 {
|
||||||
|
BigEndian::read_u64(&key[..8])
|
||||||
|
}
|
||||||
|
|
||||||
|
fn primary_index(index: u64) -> u64 {
|
||||||
|
index
|
||||||
|
}
|
||||||
|
|
||||||
|
fn as_index(slot: u64) -> u64 {
|
||||||
|
slot
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ColumnName for columns::TransactionStatusIndex {
|
||||||
|
const NAME: &'static str = TRANSACTION_STATUS_INDEX_CF;
|
||||||
|
}
|
||||||
|
|
||||||
impl SlotColumn for columns::Rewards {}
|
impl SlotColumn for columns::Rewards {}
|
||||||
impl ColumnName for columns::Rewards {
|
impl ColumnName for columns::Rewards {
|
||||||
const NAME: &'static str = REWARDS_CF;
|
const NAME: &'static str = REWARDS_CF;
|
||||||
@ -344,7 +386,7 @@ impl Column for columns::ShredCode {
|
|||||||
columns::ShredData::index(key)
|
columns::ShredData::index(key)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn slot(index: Self::Index) -> Slot {
|
fn primary_index(index: Self::Index) -> Slot {
|
||||||
index.0
|
index.0
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -373,7 +415,7 @@ impl Column for columns::ShredData {
|
|||||||
(slot, index)
|
(slot, index)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn slot(index: Self::Index) -> Slot {
|
fn primary_index(index: Self::Index) -> Slot {
|
||||||
index.0
|
index.0
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -451,7 +493,7 @@ impl Column for columns::ErasureMeta {
|
|||||||
key
|
key
|
||||||
}
|
}
|
||||||
|
|
||||||
fn slot(index: Self::Index) -> Slot {
|
fn primary_index(index: Self::Index) -> Slot {
|
||||||
index.0
|
index.0
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -583,7 +625,7 @@ impl Database {
|
|||||||
let max_slot = self
|
let max_slot = self
|
||||||
.iter::<C>(IteratorMode::End)?
|
.iter::<C>(IteratorMode::End)?
|
||||||
.next()
|
.next()
|
||||||
.map(|(i, _)| C::slot(i))
|
.map(|(i, _)| C::primary_index(i))
|
||||||
.unwrap_or(0);
|
.unwrap_or(0);
|
||||||
let end = max_slot <= to;
|
let end = max_slot <= to;
|
||||||
result.map(|_| end)
|
result.map(|_| end)
|
||||||
@ -624,7 +666,7 @@ where
|
|||||||
let iter = self.iter(iter_config)?;
|
let iter = self.iter(iter_config)?;
|
||||||
for (index, _) in iter {
|
for (index, _) in iter {
|
||||||
if let Some(to) = to {
|
if let Some(to) = to {
|
||||||
if C::slot(index) > to {
|
if C::primary_index(index) > to {
|
||||||
end = false;
|
end = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -222,6 +222,12 @@ impl DuplicateSlotProof {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Default, Deserialize, Serialize, PartialEq)]
|
||||||
|
pub struct TransactionStatusIndexMeta {
|
||||||
|
pub max_slot: Slot,
|
||||||
|
pub frozen: bool,
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "solana-local-cluster"
|
name = "solana-local-cluster"
|
||||||
description = "Blockchain, Rebuilt for Scale"
|
description = "Blockchain, Rebuilt for Scale"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
@ -12,23 +12,23 @@ homepage = "https://solana.com/"
|
|||||||
itertools = "0.8.1"
|
itertools = "0.8.1"
|
||||||
log = "0.4.8"
|
log = "0.4.8"
|
||||||
rand = "0.6.5"
|
rand = "0.6.5"
|
||||||
solana-archiver-lib = { path = "../archiver-lib", version = "1.0.13" }
|
solana-archiver-lib = { path = "../archiver-lib", version = "1.0.14" }
|
||||||
solana-config-program = { path = "../programs/config", version = "1.0.13" }
|
solana-config-program = { path = "../programs/config", version = "1.0.14" }
|
||||||
solana-core = { path = "../core", version = "1.0.13" }
|
solana-core = { path = "../core", version = "1.0.14" }
|
||||||
solana-client = { path = "../client", version = "1.0.13" }
|
solana-client = { path = "../client", version = "1.0.14" }
|
||||||
solana-faucet = { path = "../faucet", version = "1.0.13" }
|
solana-faucet = { path = "../faucet", version = "1.0.14" }
|
||||||
solana-exchange-program = { path = "../programs/exchange", version = "1.0.13" }
|
solana-exchange-program = { path = "../programs/exchange", version = "1.0.14" }
|
||||||
solana-genesis-programs = { path = "../genesis-programs", version = "1.0.13" }
|
solana-genesis-programs = { path = "../genesis-programs", version = "1.0.14" }
|
||||||
solana-ledger = { path = "../ledger", version = "1.0.13" }
|
solana-ledger = { path = "../ledger", version = "1.0.14" }
|
||||||
solana-logger = { path = "../logger", version = "1.0.13" }
|
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||||
solana-runtime = { path = "../runtime", version = "1.0.13" }
|
solana-runtime = { path = "../runtime", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
solana-stake-program = { path = "../programs/stake", version = "1.0.13" }
|
solana-stake-program = { path = "../programs/stake", version = "1.0.14" }
|
||||||
solana-storage-program = { path = "../programs/storage", version = "1.0.13" }
|
solana-storage-program = { path = "../programs/storage", version = "1.0.14" }
|
||||||
solana-vest-program = { path = "../programs/vest", version = "1.0.13" }
|
solana-vest-program = { path = "../programs/vest", version = "1.0.14" }
|
||||||
solana-vote-program = { path = "../programs/vote", version = "1.0.13" }
|
solana-vote-program = { path = "../programs/vote", version = "1.0.14" }
|
||||||
tempfile = "3.1.0"
|
tempfile = "3.1.0"
|
||||||
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.13" }
|
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.14" }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
assert_matches = "1.3.0"
|
assert_matches = "1.3.0"
|
||||||
|
@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "solana-log-analyzer"
|
name = "solana-log-analyzer"
|
||||||
description = "The solana cluster network analysis tool"
|
description = "The solana cluster network analysis tool"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
@ -14,8 +14,8 @@ byte-unit = "3.0.3"
|
|||||||
clap = "2.33.0"
|
clap = "2.33.0"
|
||||||
serde = "1.0.104"
|
serde = "1.0.104"
|
||||||
serde_json = "1.0.46"
|
serde_json = "1.0.46"
|
||||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.13" }
|
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||||
solana-logger = { path = "../logger", version = "1.0.13" }
|
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
name = "solana-log-analyzer"
|
name = "solana-log-analyzer"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-logger"
|
name = "solana-logger"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana Logger"
|
description = "Solana Logger"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-measure"
|
name = "solana-measure"
|
||||||
description = "Blockchain, Rebuilt for Scale"
|
description = "Blockchain, Rebuilt for Scale"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
documentation = "https://docs.rs/solana"
|
documentation = "https://docs.rs/solana"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
readme = "../README.md"
|
readme = "../README.md"
|
||||||
@ -12,8 +12,8 @@ edition = "2018"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
log = "0.4.8"
|
log = "0.4.8"
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
solana-metrics = { path = "../metrics", version = "1.0.13" }
|
solana-metrics = { path = "../metrics", version = "1.0.14" }
|
||||||
|
|
||||||
[target."cfg(unix)".dependencies]
|
[target."cfg(unix)".dependencies]
|
||||||
jemallocator = "0.3.2"
|
jemallocator = "0.3.2"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-merkle-tree"
|
name = "solana-merkle-tree"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana Merkle Tree"
|
description = "Solana Merkle Tree"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -9,7 +9,7 @@ homepage = "https://solana.com/"
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
hex = "0.4.0"
|
hex = "0.4.0"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-metrics"
|
name = "solana-metrics"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana Metrics"
|
description = "Solana Metrics"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -14,7 +14,7 @@ gethostname = "0.2.1"
|
|||||||
lazy_static = "1.4.0"
|
lazy_static = "1.4.0"
|
||||||
log = "0.4.8"
|
log = "0.4.8"
|
||||||
reqwest = { version = "0.10.1", default-features = false, features = ["blocking", "rustls-tls"] }
|
reqwest = { version = "0.10.1", default-features = false, features = ["blocking", "rustls-tls"] }
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
rand = "0.6.5"
|
rand = "0.6.5"
|
||||||
|
@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "solana-net-shaper"
|
name = "solana-net-shaper"
|
||||||
description = "The solana cluster network shaping tool"
|
description = "The solana cluster network shaping tool"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
@ -13,8 +13,8 @@ publish = false
|
|||||||
clap = "2.33.0"
|
clap = "2.33.0"
|
||||||
serde = "1.0.104"
|
serde = "1.0.104"
|
||||||
serde_json = "1.0.46"
|
serde_json = "1.0.46"
|
||||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.13" }
|
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||||
solana-logger = { path = "../logger", version = "1.0.13" }
|
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||||
rand = "0.6.5"
|
rand = "0.6.5"
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-net-utils"
|
name = "solana-net-utils"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana Network Utilities"
|
description = "Solana Network Utilities"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -18,8 +18,8 @@ rand = "0.6.1"
|
|||||||
serde = "1.0.104"
|
serde = "1.0.104"
|
||||||
serde_derive = "1.0.103"
|
serde_derive = "1.0.103"
|
||||||
socket2 = "0.3.11"
|
socket2 = "0.3.11"
|
||||||
solana-clap-utils = { path = "../clap-utils", version = "1.0.13" }
|
solana-clap-utils = { path = "../clap-utils", version = "1.0.14" }
|
||||||
solana-logger = { path = "../logger", version = "1.0.13" }
|
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||||
tokio = "0.1"
|
tokio = "0.1"
|
||||||
tokio-codec = "0.1"
|
tokio-codec = "0.1"
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-perf"
|
name = "solana-perf"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana Performance APIs"
|
description = "Solana Performance APIs"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -17,11 +17,11 @@ serde = "1.0.104"
|
|||||||
dlopen_derive = "0.1.4"
|
dlopen_derive = "0.1.4"
|
||||||
lazy_static = "1.4.0"
|
lazy_static = "1.4.0"
|
||||||
log = "0.4.8"
|
log = "0.4.8"
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.13" }
|
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.14" }
|
||||||
solana-budget-program = { path = "../programs/budget", version = "1.0.13" }
|
solana-budget-program = { path = "../programs/budget", version = "1.0.14" }
|
||||||
solana-logger = { path = "../logger", version = "1.0.13" }
|
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||||
solana-metrics = { path = "../metrics", version = "1.0.13" }
|
solana-metrics = { path = "../metrics", version = "1.0.14" }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
name = "solana_perf"
|
name = "solana_perf"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-bpf-programs"
|
name = "solana-bpf-programs"
|
||||||
description = "Blockchain, Rebuilt for Scale"
|
description = "Blockchain, Rebuilt for Scale"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
documentation = "https://docs.rs/solana"
|
documentation = "https://docs.rs/solana"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
@ -22,10 +22,10 @@ walkdir = "2"
|
|||||||
bincode = "1.1.4"
|
bincode = "1.1.4"
|
||||||
byteorder = "1.3.2"
|
byteorder = "1.3.2"
|
||||||
elf = "0.0.10"
|
elf = "0.0.10"
|
||||||
solana-bpf-loader-program = { path = "../bpf_loader", version = "1.0.13" }
|
solana-bpf-loader-program = { path = "../bpf_loader", version = "1.0.14" }
|
||||||
solana-logger = { path = "../../logger", version = "1.0.13" }
|
solana-logger = { path = "../../logger", version = "1.0.14" }
|
||||||
solana-runtime = { path = "../../runtime", version = "1.0.13" }
|
solana-runtime = { path = "../../runtime", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||||
solana_rbpf = "=0.1.21"
|
solana_rbpf = "=0.1.21"
|
||||||
|
|
||||||
[[bench]]
|
[[bench]]
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "solana-bpf-rust-128bit"
|
name = "solana-bpf-rust-128bit"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana BPF test program written in Rust"
|
description = "Solana BPF test program written in Rust"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -12,11 +12,11 @@ homepage = "https://solana.com/"
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.13", default-features = false }
|
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||||
solana-bpf-rust-128bit-dep = { path = "../128bit_dep", version = "1.0.13" }
|
solana-bpf-rust-128bit-dep = { path = "../128bit_dep", version = "1.0.14" }
|
||||||
|
|
||||||
[dev_dependencies]
|
[dev_dependencies]
|
||||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.13" }
|
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
program = ["solana-sdk/program"]
|
program = ["solana-sdk/program"]
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "solana-bpf-rust-128bit-dep"
|
name = "solana-bpf-rust-128bit-dep"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana BPF test program written in Rust"
|
description = "Solana BPF test program written in Rust"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.13", default-features = false }
|
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||||
|
|
||||||
[dev_dependencies]
|
[dev_dependencies]
|
||||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.13" }
|
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
program = ["solana-sdk/program"]
|
program = ["solana-sdk/program"]
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "solana-bpf-rust-alloc"
|
name = "solana-bpf-rust-alloc"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana BPF test program written in Rust"
|
description = "Solana BPF test program written in Rust"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.13", default-features = false }
|
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||||
|
|
||||||
[dev_dependencies]
|
[dev_dependencies]
|
||||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.13" }
|
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
program = ["solana-sdk/program"]
|
program = ["solana-sdk/program"]
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "solana-bpf-rust-dep-crate"
|
name = "solana-bpf-rust-dep-crate"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana BPF test program written in Rust"
|
description = "Solana BPF test program written in Rust"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -13,10 +13,10 @@ edition = "2018"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
byteorder = { version = "1", default-features = false }
|
byteorder = { version = "1", default-features = false }
|
||||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.13", default-features = false }
|
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||||
|
|
||||||
[dev_dependencies]
|
[dev_dependencies]
|
||||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.13" }
|
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
program = ["solana-sdk/program"]
|
program = ["solana-sdk/program"]
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "solana-bpf-rust-dup-accounts"
|
name = "solana-bpf-rust-dup-accounts"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana BPF test program written in Rust"
|
description = "Solana BPF test program written in Rust"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.13", default-features = false }
|
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||||
|
|
||||||
[dev_dependencies]
|
[dev_dependencies]
|
||||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.13" }
|
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
program = ["solana-sdk/program"]
|
program = ["solana-sdk/program"]
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "solana-bpf-rust-error-handling"
|
name = "solana-bpf-rust-error-handling"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana BPF test program written in Rust"
|
description = "Solana BPF test program written in Rust"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -14,11 +14,11 @@ edition = "2018"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
num-derive = "0.2"
|
num-derive = "0.2"
|
||||||
num-traits = "0.2"
|
num-traits = "0.2"
|
||||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.13", default-features = false }
|
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
|
|
||||||
[dev_dependencies]
|
[dev_dependencies]
|
||||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.13" }
|
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
program = ["solana-sdk/program"]
|
program = ["solana-sdk/program"]
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "solana-bpf-rust-external-spend"
|
name = "solana-bpf-rust-external-spend"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana BPF test program written in Rust"
|
description = "Solana BPF test program written in Rust"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.13", default-features = false }
|
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||||
|
|
||||||
[dev_dependencies]
|
[dev_dependencies]
|
||||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.13" }
|
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
program = ["solana-sdk/program"]
|
program = ["solana-sdk/program"]
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "solana-bpf-rust-iter"
|
name = "solana-bpf-rust-iter"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana BPF test program written in Rust"
|
description = "Solana BPF test program written in Rust"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.13", default-features = false }
|
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||||
|
|
||||||
[dev_dependencies]
|
[dev_dependencies]
|
||||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.13" }
|
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
program = ["solana-sdk/program"]
|
program = ["solana-sdk/program"]
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "solana-bpf-rust-many-args"
|
name = "solana-bpf-rust-many-args"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana BPF test program written in Rust"
|
description = "Solana BPF test program written in Rust"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -12,11 +12,11 @@ homepage = "https://solana.com/"
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.13", default-features = false }
|
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||||
solana-bpf-rust-many-args-dep = { path = "../many_args_dep", version = "1.0.13" }
|
solana-bpf-rust-many-args-dep = { path = "../many_args_dep", version = "1.0.14" }
|
||||||
|
|
||||||
[dev_dependencies]
|
[dev_dependencies]
|
||||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.13" }
|
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
program = ["solana-sdk/program"]
|
program = ["solana-sdk/program"]
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "solana-bpf-rust-many-args-dep"
|
name = "solana-bpf-rust-many-args-dep"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana BPF test program written in Rust"
|
description = "Solana BPF test program written in Rust"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.13", default-features = false }
|
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||||
|
|
||||||
[dev_dependencies]
|
[dev_dependencies]
|
||||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.13" }
|
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
program = ["solana-sdk/program"]
|
program = ["solana-sdk/program"]
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "solana-bpf-rust-noop"
|
name = "solana-bpf-rust-noop"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana BPF test program written in Rust"
|
description = "Solana BPF test program written in Rust"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.13", default-features = false }
|
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||||
|
|
||||||
[dev_dependencies]
|
[dev_dependencies]
|
||||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.13" }
|
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
program = ["solana-sdk/program"]
|
program = ["solana-sdk/program"]
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "solana-bpf-rust-panic"
|
name = "solana-bpf-rust-panic"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana BPF test program written in Rust"
|
description = "Solana BPF test program written in Rust"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.13", default-features = false }
|
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||||
|
|
||||||
[dev_dependencies]
|
[dev_dependencies]
|
||||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.13" }
|
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
program = ["solana-sdk/program"]
|
program = ["solana-sdk/program"]
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "solana-bpf-rust-param-passing"
|
name = "solana-bpf-rust-param-passing"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana BPF test program written in Rust"
|
description = "Solana BPF test program written in Rust"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -12,11 +12,11 @@ homepage = "https://solana.com/"
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.13", default-features = false }
|
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||||
solana-bpf-rust-param-passing-dep = { path = "../param_passing_dep", version = "1.0.13" }
|
solana-bpf-rust-param-passing-dep = { path = "../param_passing_dep", version = "1.0.14" }
|
||||||
|
|
||||||
[dev_dependencies]
|
[dev_dependencies]
|
||||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.13" }
|
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
program = ["solana-sdk/program"]
|
program = ["solana-sdk/program"]
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "solana-bpf-rust-param-passing-dep"
|
name = "solana-bpf-rust-param-passing-dep"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana BPF program written in Rust"
|
description = "Solana BPF program written in Rust"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.13", default-features = false }
|
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||||
|
|
||||||
[dev_dependencies]
|
[dev_dependencies]
|
||||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.13" }
|
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
program = ["solana-sdk/program"]
|
program = ["solana-sdk/program"]
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "solana-bpf-rust-sysval"
|
name = "solana-bpf-rust-sysval"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana BPF test program written in Rust"
|
description = "Solana BPF test program written in Rust"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
solana-sdk = { path = "../../../../sdk/", version = "1.0.13", default-features = false }
|
solana-sdk = { path = "../../../../sdk/", version = "1.0.14", default-features = false }
|
||||||
|
|
||||||
[dev_dependencies]
|
[dev_dependencies]
|
||||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.13" }
|
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "1.0.14" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
program = ["solana-sdk/program"]
|
program = ["solana-sdk/program"]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-bpf-loader-program"
|
name = "solana-bpf-loader-program"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana BPF loader"
|
description = "Solana BPF loader"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -15,8 +15,8 @@ libc = "0.2.66"
|
|||||||
log = "0.4.8"
|
log = "0.4.8"
|
||||||
num-derive = { version = "0.3" }
|
num-derive = { version = "0.3" }
|
||||||
num-traits = { version = "0.2" }
|
num-traits = { version = "0.2" }
|
||||||
solana-logger = { path = "../../logger", version = "1.0.13" }
|
solana-logger = { path = "../../logger", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||||
solana_rbpf = "=0.1.21"
|
solana_rbpf = "=0.1.21"
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-btc-spv-program"
|
name = "solana-btc-spv-program"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana Bitcoin spv parsing program"
|
description = "Solana Bitcoin spv parsing program"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -15,7 +15,7 @@ num-derive = "0.3"
|
|||||||
num-traits = "0.2"
|
num-traits = "0.2"
|
||||||
serde = "1.0.104"
|
serde = "1.0.104"
|
||||||
serde_derive = "1.0.103"
|
serde_derive = "1.0.103"
|
||||||
solana-sdk = { path = "../../sdk", version = "1.0.13"}
|
solana-sdk = { path = "../../sdk", version = "1.0.14"}
|
||||||
hex = "0.3.2"
|
hex = "0.3.2"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "btc_spv_bin"
|
name = "btc_spv_bin"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana Bitcoin spv parsing program"
|
description = "Solana Bitcoin spv parsing program"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-budget-program"
|
name = "solana-budget-program"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana Budget program"
|
description = "Solana Budget program"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -16,11 +16,11 @@ num-derive = "0.3"
|
|||||||
num-traits = "0.2"
|
num-traits = "0.2"
|
||||||
serde = "1.0.104"
|
serde = "1.0.104"
|
||||||
serde_derive = "1.0.103"
|
serde_derive = "1.0.103"
|
||||||
solana-sdk = { path = "../../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
solana-runtime = { path = "../../runtime", version = "1.0.13" }
|
solana-runtime = { path = "../../runtime", version = "1.0.14" }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
crate-type = ["lib", "cdylib"]
|
crate-type = ["lib", "cdylib"]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-config-program"
|
name = "solana-config-program"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana Config program"
|
description = "Solana Config program"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -14,8 +14,8 @@ chrono = { version = "0.4.10", features = ["serde"] }
|
|||||||
log = "0.4.8"
|
log = "0.4.8"
|
||||||
serde = "1.0.104"
|
serde = "1.0.104"
|
||||||
serde_derive = "1.0.103"
|
serde_derive = "1.0.103"
|
||||||
solana-logger = { path = "../../logger", version = "1.0.13" }
|
solana-logger = { path = "../../logger", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
crate-type = ["lib", "cdylib"]
|
crate-type = ["lib", "cdylib"]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-exchange-program"
|
name = "solana-exchange-program"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana Exchange program"
|
description = "Solana Exchange program"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -15,13 +15,13 @@ num-derive = { version = "0.3" }
|
|||||||
num-traits = { version = "0.2" }
|
num-traits = { version = "0.2" }
|
||||||
serde = "1.0.104"
|
serde = "1.0.104"
|
||||||
serde_derive = "1.0.103"
|
serde_derive = "1.0.103"
|
||||||
solana-logger = { path = "../../logger", version = "1.0.13" }
|
solana-logger = { path = "../../logger", version = "1.0.14" }
|
||||||
solana-metrics = { path = "../../metrics", version = "1.0.13" }
|
solana-metrics = { path = "../../metrics", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
solana-runtime = { path = "../../runtime", version = "1.0.13" }
|
solana-runtime = { path = "../../runtime", version = "1.0.14" }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
crate-type = ["lib", "cdylib"]
|
crate-type = ["lib", "cdylib"]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-failure-program"
|
name = "solana-failure-program"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana failure program"
|
description = "Solana failure program"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -9,10 +9,10 @@ homepage = "https://solana.com/"
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
solana-sdk = { path = "../../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
solana-runtime = { path = "../../runtime", version = "1.0.13" }
|
solana-runtime = { path = "../../runtime", version = "1.0.14" }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
crate-type = ["lib", "cdylib"]
|
crate-type = ["lib", "cdylib"]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-librapay"
|
name = "solana-librapay"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana Libra Payment"
|
description = "Solana Libra Payment"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -11,10 +11,10 @@ edition = "2018"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
bincode = "1.2.0"
|
bincode = "1.2.0"
|
||||||
log = "0.4.8"
|
log = "0.4.8"
|
||||||
solana-logger = { path = "../../logger", version = "1.0.13" }
|
solana-logger = { path = "../../logger", version = "1.0.14" }
|
||||||
solana-move-loader-program = { path = "../move_loader", version = "1.0.13" }
|
solana-move-loader-program = { path = "../move_loader", version = "1.0.14" }
|
||||||
solana-runtime = { path = "../../runtime", version = "1.0.13" }
|
solana-runtime = { path = "../../runtime", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||||
types = { version = "0.0.1-sol4", package = "solana_libra_types" }
|
types = { version = "0.0.1-sol4", package = "solana_libra_types" }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-move-loader-program"
|
name = "solana-move-loader-program"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana Move loader"
|
description = "Solana Move loader"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -16,8 +16,8 @@ serde = "1.0.104"
|
|||||||
serde_bytes = "0.11"
|
serde_bytes = "0.11"
|
||||||
serde_derive = "1.0.103"
|
serde_derive = "1.0.103"
|
||||||
serde_json = "1.0.46"
|
serde_json = "1.0.46"
|
||||||
solana-logger = { path = "../../logger", version = "1.0.13" }
|
solana-logger = { path = "../../logger", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||||
|
|
||||||
bytecode_verifier = { version = "0.0.1-sol4", package = "solana_libra_bytecode_verifier" }
|
bytecode_verifier = { version = "0.0.1-sol4", package = "solana_libra_bytecode_verifier" }
|
||||||
canonical_serialization = { version = "0.0.1-sol4", package = "solana_libra_canonical_serialization" }
|
canonical_serialization = { version = "0.0.1-sol4", package = "solana_libra_canonical_serialization" }
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-noop-program"
|
name = "solana-noop-program"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana Noop program"
|
description = "Solana Noop program"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -10,8 +10,8 @@ edition = "2018"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
log = "0.4.8"
|
log = "0.4.8"
|
||||||
solana-logger = { path = "../../logger", version = "1.0.13" }
|
solana-logger = { path = "../../logger", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
crate-type = ["lib", "cdylib"]
|
crate-type = ["lib", "cdylib"]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-ownable"
|
name = "solana-ownable"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "ownable program"
|
description = "ownable program"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -10,13 +10,13 @@ edition = "2018"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bincode = "1.2.1"
|
bincode = "1.2.1"
|
||||||
solana-sdk = { path = "../../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||||
num-derive = "0.3"
|
num-derive = "0.3"
|
||||||
num-traits = "0.2"
|
num-traits = "0.2"
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
solana-runtime = { path = "../../runtime", version = "1.0.13" }
|
solana-runtime = { path = "../../runtime", version = "1.0.14" }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
crate-type = ["lib", "cdylib"]
|
crate-type = ["lib", "cdylib"]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-stake-program"
|
name = "solana-stake-program"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana Stake program"
|
description = "Solana Stake program"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -15,11 +15,11 @@ num-derive = "0.3"
|
|||||||
num-traits = "0.2"
|
num-traits = "0.2"
|
||||||
serde = "1.0.104"
|
serde = "1.0.104"
|
||||||
serde_derive = "1.0.103"
|
serde_derive = "1.0.103"
|
||||||
solana-logger = { path = "../../logger", version = "1.0.13" }
|
solana-logger = { path = "../../logger", version = "1.0.14" }
|
||||||
solana-metrics = { path = "../../metrics", version = "1.0.13" }
|
solana-metrics = { path = "../../metrics", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||||
solana-vote-program = { path = "../vote", version = "1.0.13" }
|
solana-vote-program = { path = "../vote", version = "1.0.14" }
|
||||||
solana-config-program = { path = "../config", version = "1.0.13" }
|
solana-config-program = { path = "../config", version = "1.0.14" }
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-storage-program"
|
name = "solana-storage-program"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana Storage program"
|
description = "Solana Storage program"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -16,8 +16,8 @@ num-derive = "0.3"
|
|||||||
num-traits = "0.2"
|
num-traits = "0.2"
|
||||||
serde = "1.0.104"
|
serde = "1.0.104"
|
||||||
serde_derive = "1.0.103"
|
serde_derive = "1.0.103"
|
||||||
solana-logger = { path = "../../logger", version = "1.0.13" }
|
solana-logger = { path = "../../logger", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
assert_matches = "1.3.0"
|
assert_matches = "1.3.0"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-vest-program"
|
name = "solana-vest-program"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana Vest program"
|
description = "Solana Vest program"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -15,12 +15,12 @@ num-derive = "0.2"
|
|||||||
num-traits = "0.2"
|
num-traits = "0.2"
|
||||||
serde = "1.0.104"
|
serde = "1.0.104"
|
||||||
serde_derive = "1.0.103"
|
serde_derive = "1.0.103"
|
||||||
solana-sdk = { path = "../../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||||
solana-config-program = { path = "../config", version = "1.0.13" }
|
solana-config-program = { path = "../config", version = "1.0.14" }
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
solana-runtime = { path = "../../runtime", version = "1.0.13" }
|
solana-runtime = { path = "../../runtime", version = "1.0.14" }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
crate-type = ["lib"]
|
crate-type = ["lib"]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-vote-program"
|
name = "solana-vote-program"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana Vote program"
|
description = "Solana Vote program"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -15,9 +15,9 @@ num-derive = "0.3"
|
|||||||
num-traits = "0.2"
|
num-traits = "0.2"
|
||||||
serde = "1.0.104"
|
serde = "1.0.104"
|
||||||
serde_derive = "1.0.103"
|
serde_derive = "1.0.103"
|
||||||
solana-logger = { path = "../../logger", version = "1.0.13" }
|
solana-logger = { path = "../../logger", version = "1.0.14" }
|
||||||
solana-metrics = { path = "../../metrics", version = "1.0.13" }
|
solana-metrics = { path = "../../metrics", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../../sdk", version = "1.0.14" }
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-rayon-threadlimit"
|
name = "solana-rayon-threadlimit"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "solana-rayon-threadlimit"
|
description = "solana-rayon-threadlimit"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
readme = "../README.md"
|
readme = "../README.md"
|
||||||
|
@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "solana-remote-wallet"
|
name = "solana-remote-wallet"
|
||||||
description = "Blockchain, Rebuilt for Scale"
|
description = "Blockchain, Rebuilt for Scale"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
@ -16,7 +16,7 @@ hidapi = { version = "1.1.1", default-features = false }
|
|||||||
log = "0.4.8"
|
log = "0.4.8"
|
||||||
parking_lot = "0.10"
|
parking_lot = "0.10"
|
||||||
semver = "0.9"
|
semver = "0.9"
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
url = "2.1.1"
|
url = "2.1.1"
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-runtime"
|
name = "solana-runtime"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana runtime"
|
description = "Solana runtime"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -26,15 +26,15 @@ rand = "0.6.5"
|
|||||||
rayon = "1.2.0"
|
rayon = "1.2.0"
|
||||||
serde = { version = "1.0.104", features = ["rc"] }
|
serde = { version = "1.0.104", features = ["rc"] }
|
||||||
serde_derive = "1.0.103"
|
serde_derive = "1.0.103"
|
||||||
solana-bpf-loader-program = { path = "../programs/bpf_loader", version = "1.0.13" }
|
solana-bpf-loader-program = { path = "../programs/bpf_loader", version = "1.0.14" }
|
||||||
solana-logger = { path = "../logger", version = "1.0.13" }
|
solana-logger = { path = "../logger", version = "1.0.14" }
|
||||||
solana-measure = { path = "../measure", version = "1.0.13" }
|
solana-measure = { path = "../measure", version = "1.0.14" }
|
||||||
solana-metrics = { path = "../metrics", version = "1.0.13" }
|
solana-metrics = { path = "../metrics", version = "1.0.14" }
|
||||||
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.13" }
|
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "1.0.14" }
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
solana-stake-program = { path = "../programs/stake", version = "1.0.13" }
|
solana-stake-program = { path = "../programs/stake", version = "1.0.14" }
|
||||||
solana-storage-program = { path = "../programs/storage", version = "1.0.13" }
|
solana-storage-program = { path = "../programs/storage", version = "1.0.14" }
|
||||||
solana-vote-program = { path = "../programs/vote", version = "1.0.13" }
|
solana-vote-program = { path = "../programs/vote", version = "1.0.14" }
|
||||||
tempfile = "3.1.0"
|
tempfile = "3.1.0"
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
|
|
||||||
@ -45,4 +45,4 @@ name = "solana_runtime"
|
|||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
assert_matches = "1.3.0"
|
assert_matches = "1.3.0"
|
||||||
solana-noop-program = { path = "../programs/noop", version = "1.0.13" }
|
solana-noop-program = { path = "../programs/noop", version = "1.0.14" }
|
||||||
|
@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "solana-scripts"
|
name = "solana-scripts"
|
||||||
description = "Blockchain, Rebuilt for Scale"
|
description = "Blockchain, Rebuilt for Scale"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
|
@ -95,6 +95,7 @@ else
|
|||||||
solana-ledger-tool
|
solana-ledger-tool
|
||||||
solana-log-analyzer
|
solana-log-analyzer
|
||||||
solana-net-shaper
|
solana-net-shaper
|
||||||
|
solana-stake-monitor
|
||||||
solana-sys-tuner
|
solana-sys-tuner
|
||||||
solana-validator
|
solana-validator
|
||||||
solana-watchtower
|
solana-watchtower
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-sdk-c"
|
name = "solana-sdk-c"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana SDK C"
|
description = "Solana SDK C"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -18,7 +18,7 @@ bs58 = "0.3.0"
|
|||||||
libc = "0.2.66"
|
libc = "0.2.66"
|
||||||
rand_chacha = "0.1.1"
|
rand_chacha = "0.1.1"
|
||||||
rand_core = { version = ">=0.2, <0.4", default-features = false }
|
rand_core = { version = ">=0.2, <0.4", default-features = false }
|
||||||
solana-sdk = { path = "../sdk", version = "1.0.13" }
|
solana-sdk = { path = "../sdk", version = "1.0.14" }
|
||||||
ed25519-dalek = "1.0.0-pre.1"
|
ed25519-dalek = "1.0.0-pre.1"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-sdk"
|
name = "solana-sdk"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana SDK"
|
description = "Solana SDK"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
@ -50,9 +50,9 @@ serde_json = { version = "1.0.46", optional = true }
|
|||||||
sha2 = "0.8.1"
|
sha2 = "0.8.1"
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
ed25519-dalek = { version = "=1.0.0-pre.1", optional = true }
|
ed25519-dalek = { version = "=1.0.0-pre.1", optional = true }
|
||||||
solana-crate-features = { path = "../crate-features", version = "1.0.13", optional = true }
|
solana-crate-features = { path = "../crate-features", version = "1.0.14", optional = true }
|
||||||
solana-logger = { path = "../logger", version = "1.0.13", optional = true }
|
solana-logger = { path = "../logger", version = "1.0.14", optional = true }
|
||||||
solana-sdk-macro = { path = "macro", version = "1.0.13" }
|
solana-sdk-macro = { path = "macro", version = "1.0.14" }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
tiny-bip39 = "0.7.0"
|
tiny-bip39 = "0.7.0"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-sdk-bpf-test"
|
name = "solana-sdk-bpf-test"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana BPF SDK test utilities"
|
description = "Solana BPF SDK test utilities"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "solana-sdk-macro"
|
name = "solana-sdk-macro"
|
||||||
version = "1.0.13"
|
version = "1.0.14"
|
||||||
description = "Solana SDK Macro"
|
description = "Solana SDK Macro"
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
|
2
stake-monitor/.gitignore
vendored
Normal file
2
stake-monitor/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
/target/
|
||||||
|
/farf/
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user