Compare commits
12 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
0e3dc27c8d | ||
|
d0d8ac7eba | ||
|
b414d151b8 | ||
|
5766359cde | ||
|
b8ec5de36d | ||
|
28ba9e2fa8 | ||
|
80d780d666 | ||
|
e599a90333 | ||
|
efb8b6bf2f | ||
|
ea3eddfec4 | ||
|
3a6857c749 | ||
|
0efb12bb6b |
628
Cargo.lock
generated
628
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -2,7 +2,7 @@
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-archiver"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@@ -10,9 +10,9 @@ homepage = "https://solana.com/"
|
||||
[dependencies]
|
||||
clap = "2.33.0"
|
||||
console = "0.9.0"
|
||||
solana-core = { path = "../core", version = "0.20.3" }
|
||||
solana-logger = { path = "../logger", version = "0.20.3" }
|
||||
solana-metrics = { path = "../metrics", version = "0.20.3" }
|
||||
solana-netutil = { path = "../netutil", version = "0.20.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.3" }
|
||||
solana-core = { path = "../core", version = "0.20.4" }
|
||||
solana-logger = { path = "../logger", version = "0.20.4" }
|
||||
solana-metrics = { path = "../metrics", version = "0.20.4" }
|
||||
solana-netutil = { path = "../netutil", version = "0.20.4" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.4" }
|
||||
|
||||
|
@@ -2,7 +2,7 @@
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-banking-bench"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@@ -10,11 +10,11 @@ homepage = "https://solana.com/"
|
||||
[dependencies]
|
||||
log = "0.4.6"
|
||||
rayon = "1.2.0"
|
||||
solana-core = { path = "../core", version = "0.20.3" }
|
||||
solana-ledger = { path = "../ledger", version = "0.20.3" }
|
||||
solana-logger = { path = "../logger", version = "0.20.3" }
|
||||
solana-runtime = { path = "../runtime", version = "0.20.3" }
|
||||
solana-measure = { path = "../measure", version = "0.20.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.3" }
|
||||
solana-core = { path = "../core", version = "0.20.4" }
|
||||
solana-ledger = { path = "../ledger", version = "0.20.4" }
|
||||
solana-logger = { path = "../logger", version = "0.20.4" }
|
||||
solana-runtime = { path = "../runtime", version = "0.20.4" }
|
||||
solana-measure = { path = "../measure", version = "0.20.4" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.4" }
|
||||
rand = "0.6.5"
|
||||
crossbeam-channel = "0.3"
|
||||
|
@@ -2,7 +2,7 @@
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-bench-exchange"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@@ -24,16 +24,16 @@ serde_derive = "1.0.101"
|
||||
serde_json = "1.0.41"
|
||||
serde_yaml = "0.8.11"
|
||||
# solana-runtime = { path = "../solana/runtime"}
|
||||
solana-core = { path = "../core", version = "0.20.3" }
|
||||
solana-genesis = { path = "../genesis", version = "0.20.3" }
|
||||
solana-client = { path = "../client", version = "0.20.3" }
|
||||
solana-drone = { path = "../drone", version = "0.20.3" }
|
||||
solana-exchange-api = { path = "../programs/exchange_api", version = "0.20.3" }
|
||||
solana-exchange-program = { path = "../programs/exchange_program", version = "0.20.3" }
|
||||
solana-logger = { path = "../logger", version = "0.20.3" }
|
||||
solana-metrics = { path = "../metrics", version = "0.20.3" }
|
||||
solana-netutil = { path = "../netutil", version = "0.20.3" }
|
||||
solana-runtime = { path = "../runtime", version = "0.20.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.3" }
|
||||
solana-core = { path = "../core", version = "0.20.4" }
|
||||
solana-genesis = { path = "../genesis", version = "0.20.4" }
|
||||
solana-client = { path = "../client", version = "0.20.4" }
|
||||
solana-drone = { path = "../drone", version = "0.20.4" }
|
||||
solana-exchange-api = { path = "../programs/exchange_api", version = "0.20.4" }
|
||||
solana-exchange-program = { path = "../programs/exchange_program", version = "0.20.4" }
|
||||
solana-logger = { path = "../logger", version = "0.20.4" }
|
||||
solana-metrics = { path = "../metrics", version = "0.20.4" }
|
||||
solana-netutil = { path = "../netutil", version = "0.20.4" }
|
||||
solana-runtime = { path = "../runtime", version = "0.20.4" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.4" }
|
||||
untrusted = "0.7.0"
|
||||
ws = "0.9.1"
|
||||
|
@@ -2,13 +2,13 @@
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-bench-streamer"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
|
||||
[dependencies]
|
||||
clap = "2.33.0"
|
||||
solana-core = { path = "../core", version = "0.20.3" }
|
||||
solana-logger = { path = "../logger", version = "0.20.3" }
|
||||
solana-netutil = { path = "../netutil", version = "0.20.3" }
|
||||
solana-core = { path = "../core", version = "0.20.4" }
|
||||
solana-logger = { path = "../logger", version = "0.20.4" }
|
||||
solana-netutil = { path = "../netutil", version = "0.20.4" }
|
||||
|
@@ -2,7 +2,7 @@
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-bench-tps"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@@ -16,19 +16,19 @@ serde = "1.0.101"
|
||||
serde_derive = "1.0.101"
|
||||
serde_json = "1.0.41"
|
||||
serde_yaml = "0.8.11"
|
||||
solana-core = { path = "../core", version = "0.20.3" }
|
||||
solana-genesis = { path = "../genesis", version = "0.20.3" }
|
||||
solana-client = { path = "../client", version = "0.20.3" }
|
||||
solana-drone = { path = "../drone", version = "0.20.3" }
|
||||
solana-librapay-api = { path = "../programs/librapay_api", version = "0.20.3", optional = true }
|
||||
solana-logger = { path = "../logger", version = "0.20.3" }
|
||||
solana-metrics = { path = "../metrics", version = "0.20.3" }
|
||||
solana-measure = { path = "../measure", version = "0.20.3" }
|
||||
solana-netutil = { path = "../netutil", version = "0.20.3" }
|
||||
solana-runtime = { path = "../runtime", version = "0.20.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.3" }
|
||||
solana-move-loader-program = { path = "../programs/move_loader_program", version = "0.20.3", optional = true }
|
||||
solana-move-loader-api = { path = "../programs/move_loader_api", version = "0.20.3", optional = true }
|
||||
solana-core = { path = "../core", version = "0.20.4" }
|
||||
solana-genesis = { path = "../genesis", version = "0.20.4" }
|
||||
solana-client = { path = "../client", version = "0.20.4" }
|
||||
solana-drone = { path = "../drone", version = "0.20.4" }
|
||||
solana-librapay-api = { path = "../programs/librapay_api", version = "0.20.4", optional = true }
|
||||
solana-logger = { path = "../logger", version = "0.20.4" }
|
||||
solana-metrics = { path = "../metrics", version = "0.20.4" }
|
||||
solana-measure = { path = "../measure", version = "0.20.4" }
|
||||
solana-netutil = { path = "../netutil", version = "0.20.4" }
|
||||
solana-runtime = { path = "../runtime", version = "0.20.4" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.4" }
|
||||
solana-move-loader-program = { path = "../programs/move_loader_program", version = "0.20.4", optional = true }
|
||||
solana-move-loader-api = { path = "../programs/move_loader_api", version = "0.20.4", optional = true }
|
||||
|
||||
[dev-dependencies]
|
||||
serial_test = "0.2.0"
|
||||
|
@@ -177,7 +177,7 @@ $ solana send-timestamp <PUBKEY> <PROCESS_ID> --date 2018-12-24T23:59:00
|
||||
## Usage
|
||||
### solana-cli
|
||||
```text
|
||||
solana-cli 0.20.3
|
||||
solana-cli 0.20.4
|
||||
Blockchain, Rebuilt for Scale
|
||||
|
||||
USAGE:
|
||||
|
@@ -126,7 +126,7 @@ The result field will be a JSON object with the following sub fields:
|
||||
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0", "id":1, "method":"getAccountInfo", "params":["2gVkYWexTHR5Hb2aLeQN3tnngvWzisFKXDUPrgMHpdST"]}' http://localhost:8899
|
||||
|
||||
// Result
|
||||
{"jsonrpc":"2.0","result":{"executable":false,"owner":[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lamports":1,"data":[3,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0.20.3,0,0,0,0,0,0,50,48,53,48,45,48,49,45,48,49,84,48,48,58,48,48,58,48,48,90,252,10,7,28,246,140,88,177,98,82,10,227,89,81,18,30,194,101,199,16,11,73,133,20,246,62,114,39,20,113,189,32,50,0,0,0,0,0,0,0,247,15,36,102,167,83,225,42,133,127,82,34,36,224,207,130,109,230,224,188,163,33,213,13,5,117,211,251,65,159,197,51,0,0,0,0,0,0]},"id":1}
|
||||
{"jsonrpc":"2.0","result":{"executable":false,"owner":[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lamports":1,"data":[3,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0.20.4,0,0,0,0,0,0,50,48,53,48,45,48,49,45,48,49,84,48,48,58,48,48,58,48,48,90,252,10,7,28,246,140,88,177,98,82,10,227,89,81,18,30,194,101,199,16,11,73,133,20,246,62,114,39,20,113,189,32,50,0,0,0,0,0,0,0,247,15,36,102,167,83,225,42,133,127,82,34,36,224,207,130,109,230,224,188,163,33,213,13,5,117,211,251,65,159,197,51,0,0,0,0,0,0]},"id":1}
|
||||
```
|
||||
|
||||
### getBalance
|
||||
@@ -729,7 +729,7 @@ Subscribe to an account to receive notifications when the lamports or data for a
|
||||
#### Notification Format:
|
||||
|
||||
```bash
|
||||
{"jsonrpc": "2.0","method": "accountNotification", "params": {"result": {"executable":false,"owner":[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lamports":1,"data":[3,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0.20.3,0,0,0,0,0,0,50,48,53,48,45,48,49,45,48,49,84,48,48,58,48,48,58,48,48,90,252,10,7,28,246,140,88,177,98,82,10,227,89,81,18,30,194,101,199,16,11,73,133,20,246,62,114,39,20,113,189,32,50,0,0,0,0,0,0,0,247,15,36,102,167,83,225,42,133,127,82,34,36,224,207,130,109,230,224,188,163,33,213,13,5,117,211,251,65,159,197,51,0,0,0,0,0,0]},"subscription":0}}
|
||||
{"jsonrpc": "2.0","method": "accountNotification", "params": {"result": {"executable":false,"owner":[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lamports":1,"data":[3,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0.20.4,0,0,0,0,0,0,50,48,53,48,45,48,49,45,48,49,84,48,48,58,48,48,58,48,48,90,252,10,7,28,246,140,88,177,98,82,10,227,89,81,18,30,194,101,199,16,11,73,133,20,246,62,114,39,20,113,189,32,50,0,0,0,0,0,0,0,247,15,36,102,167,83,225,42,133,127,82,34,36,224,207,130,109,230,224,188,163,33,213,13,5,117,211,251,65,159,197,51,0,0,0,0,0,0]},"subscription":0}}
|
||||
```
|
||||
|
||||
### accountUnsubscribe
|
||||
@@ -787,7 +787,7 @@ Subscribe to a program to receive notifications when the lamports or data for a
|
||||
* `object` - account info JSON object \(see [getAccountInfo](jsonrpc-api.md#getaccountinfo) for field details\)
|
||||
|
||||
```bash
|
||||
{"jsonrpc":"2.0","method":"programNotification","params":{{"result":["8Rshv2oMkPu5E4opXTRyuyBeZBqQ4S477VG26wUTFxUM",{"executable":false,"lamports":1,"owner":[129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"data":[1,1,1,0,0,0,0,0,0,0.20.3,0,0,0,0,0,0,50,48,49,56,45,49,50,45,50,52,84,50,51,58,53,57,58,48,48,90,235,233,39,152,15,44,117,176,41,89,100,86,45,61,2,44,251,46,212,37,35,118,163,189,247,84,27,235,178,62,55,89,0,0,0,0,50,0,0,0,0,0,0,0,235,233,39,152,15,44,117,176,41,89,100,86,45,61,2,44,251,46,212,37,35,118,163,189,247,84,27,235,178,62,45,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}],"subscription":0}}
|
||||
{"jsonrpc":"2.0","method":"programNotification","params":{{"result":["8Rshv2oMkPu5E4opXTRyuyBeZBqQ4S477VG26wUTFxUM",{"executable":false,"lamports":1,"owner":[129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"data":[1,1,1,0,0,0,0,0,0,0.20.4,0,0,0,0,0,0,50,48,49,56,45,49,50,45,50,52,84,50,51,58,53,57,58,48,48,90,235,233,39,152,15,44,117,176,41,89,100,86,45,61,2,44,251,46,212,37,35,118,163,189,247,84,27,235,178,62,55,89,0,0,0,0,50,0,0,0,0,0,0,0,235,233,39,152,15,44,117,176,41,89,100,86,45,61,2,44,251,46,212,37,35,118,163,189,247,84,27,235,178,62,45,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}],"subscription":0}}
|
||||
```
|
||||
|
||||
### programUnsubscribe
|
||||
|
@@ -11,7 +11,7 @@ This document proposes an easy to use software install and updater that can be u
|
||||
The easiest install method for supported platforms:
|
||||
|
||||
```bash
|
||||
$ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.20.3/install/solana-install-init.sh | sh
|
||||
$ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.20.4/install/solana-install-init.sh | sh
|
||||
```
|
||||
|
||||
This script will check github for the latest tagged release and download and run the `solana-install-init` binary from there.
|
||||
@@ -20,7 +20,7 @@ If additional arguments need to be specified during the installation, the follow
|
||||
|
||||
```bash
|
||||
$ init_args=.... # arguments for `solana-install-init ...`
|
||||
$ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.20.3/install/solana-install-init.sh | sh -s - ${init_args}
|
||||
$ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.20.4/install/solana-install-init.sh | sh -s - ${init_args}
|
||||
```
|
||||
|
||||
### Fetch and run a pre-built installer from a Github release
|
||||
@@ -28,7 +28,7 @@ $ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.20.3/install
|
||||
With a well-known release URL, a pre-built binary can be obtained for supported platforms:
|
||||
|
||||
```bash
|
||||
$ curl -o solana-install-init https://github.com/solana-labs/solana/releases/download/v0.20.3/solana-install-init-x86_64-apple-darwin
|
||||
$ curl -o solana-install-init https://github.com/solana-labs/solana/releases/download/v0.20.4/solana-install-init-x86_64-apple-darwin
|
||||
$ chmod +x ./solana-install-init
|
||||
$ ./solana-install-init --help
|
||||
```
|
||||
|
@@ -47,7 +47,7 @@ The `solana-install` tool can be used to easily install and upgrade the cluster
|
||||
#### Linux and mac OS
|
||||
|
||||
```bash
|
||||
curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.20.3/install/solana-install-init.sh | sh -s
|
||||
curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.20.4/install/solana-install-init.sh | sh -s
|
||||
```
|
||||
|
||||
Alternatively build the `solana-install` program from source and run the following command to obtain the same result:
|
||||
|
@@ -5,7 +5,7 @@
|
||||
The `solana-install` tool can be used to easily install and upgrade the validator software on Linux x86\_64 and mac OS systems.
|
||||
|
||||
```bash
|
||||
curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.20.3/install/solana-install-init.sh | sh -s
|
||||
curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.20.4/install/solana-install-init.sh | sh -s
|
||||
```
|
||||
|
||||
Alternatively build the `solana-install` program from source and run the following command to obtain the same result:
|
||||
|
@@ -16,7 +16,7 @@ You can submit a JSON-RPC request to see the specific version of the cluster.
|
||||
|
||||
```bash
|
||||
curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1, "method":"getVersion"}' edge.testnet.solana.com:8899
|
||||
{"jsonrpc":"2.0","result":{"solana-core":"0.20.3"},"id":1}
|
||||
{"jsonrpc":"2.0","result":{"solana-core":"0.20.4"},"id":1}
|
||||
```
|
||||
|
||||
## Using a Different Testnet
|
||||
@@ -28,17 +28,17 @@ This guide is written in the context of testnet.solana.com, our most stable clus
|
||||
If you are bootstrapping with `solana-install`, you can specify the release tag or named channel to install to match your desired testnet.
|
||||
|
||||
```bash
|
||||
curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.20.3/install/solana-install-init.sh | sh -s - 0.20.3
|
||||
curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.20.4/install/solana-install-init.sh | sh -s - 0.20.4
|
||||
```
|
||||
|
||||
```bash
|
||||
curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.20.3/install/solana-install-init.sh | sh -s - beta
|
||||
curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.20.4/install/solana-install-init.sh | sh -s - beta
|
||||
```
|
||||
|
||||
Similarly, you can add this argument to the `solana-install` command if you've built the program from source:
|
||||
|
||||
```bash
|
||||
solana-install init 0.20.3
|
||||
solana-install init 0.20.4
|
||||
```
|
||||
|
||||
If you are downloading pre-compiled binaries or building from source, simply choose the release matching your desired testnet.
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-chacha-sys"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana chacha-sys"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
|
@@ -7,7 +7,7 @@ steps:
|
||||
timeout_in_minutes: 5
|
||||
- command: ". ci/rust-version.sh; ci/docker-run.sh $$rust_nightly_docker_image ci/test-checks.sh"
|
||||
name: "checks"
|
||||
timeout_in_minutes: 35
|
||||
timeout_in_minutes: 20
|
||||
- wait
|
||||
- command: "ci/test-stable-perf.sh"
|
||||
name: "stable-perf"
|
||||
@@ -17,18 +17,21 @@ steps:
|
||||
- "queue=cuda"
|
||||
- command: "ci/test-bench.sh"
|
||||
name: "bench"
|
||||
timeout_in_minutes: 60
|
||||
timeout_in_minutes: 30
|
||||
- command: ". ci/rust-version.sh; ci/docker-run.sh $$rust_stable_docker_image ci/test-stable.sh"
|
||||
name: "stable"
|
||||
timeout_in_minutes: 40
|
||||
artifact_paths: "log-*.txt"
|
||||
- command: ". ci/rust-version.sh; ci/docker-run.sh $$rust_stable_docker_image ci/test-move.sh"
|
||||
name: "move"
|
||||
timeout_in_minutes: 20
|
||||
- command: ". ci/rust-version.sh; ci/docker-run.sh $$rust_stable_docker_image ci/test-local-cluster.sh"
|
||||
name: "local-cluster"
|
||||
timeout_in_minutes: 40
|
||||
timeout_in_minutes: 30
|
||||
artifact_paths: "log-*.txt"
|
||||
- command: ". ci/rust-version.sh; ci/docker-run.sh $$rust_nightly_docker_image ci/test-coverage.sh"
|
||||
name: "coverage"
|
||||
timeout_in_minutes: 40
|
||||
timeout_in_minutes: 30
|
||||
- wait
|
||||
- trigger: "solana-secondary"
|
||||
branches: "!pull/*"
|
||||
|
1
ci/test-move.sh
Symbolic link
1
ci/test-move.sh
Symbolic link
@@ -0,0 +1 @@
|
||||
test-stable.sh
|
@@ -28,18 +28,13 @@ rm -rf target/xargo # Issue #3105
|
||||
|
||||
# Run the appropriate test based on entrypoint
|
||||
testName=$(basename "$0" .sh)
|
||||
echo "Executing $testName"
|
||||
case $testName in
|
||||
test-stable)
|
||||
echo "Executing $testName"
|
||||
_ cargo +"$rust_stable" test --all --exclude solana-local-cluster ${V:+--verbose} -- --nocapture
|
||||
_ cargo +"$rust_stable" test --manifest-path local_cluster/Cargo.toml --features=move ${V:+--verbose} test_bench_tps_local_cluster_move -- --nocapture
|
||||
_ cargo +"$rust_stable" test --manifest-path programs/move_loader_api/Cargo.toml ${V:+--verbose} -- --nocapture
|
||||
_ cargo +"$rust_stable" test --manifest-path programs/move_loader_program/Cargo.toml ${V:+--verbose} -- --nocapture
|
||||
_ cargo +"$rust_stable" test --manifest-path programs/librapay_api/Cargo.toml ${V:+--verbose} -- --nocapture
|
||||
;;
|
||||
test-stable-perf)
|
||||
echo "Executing $testName"
|
||||
|
||||
ci/affects-files.sh \
|
||||
.rs$ \
|
||||
Cargo.lock$ \
|
||||
@@ -54,7 +49,7 @@ test-stable-perf)
|
||||
^sdk/ \
|
||||
|| {
|
||||
annotate --style info \
|
||||
"Skipped test-stable-perf as no relevant files were modified"
|
||||
"Skipped $testName as no relevant files were modified"
|
||||
exit 0
|
||||
}
|
||||
|
||||
@@ -83,8 +78,30 @@ test-stable-perf)
|
||||
_ cargo +"$rust_stable" build --bins ${V:+--verbose}
|
||||
_ cargo +"$rust_stable" test --package solana-ledger --package solana-core --lib ${V:+--verbose} -- --nocapture
|
||||
;;
|
||||
test-move)
|
||||
ci/affects-files.sh \
|
||||
Cargo.lock$ \
|
||||
Cargo.toml$ \
|
||||
^ci/rust-version.sh \
|
||||
^ci/test-stable.sh \
|
||||
^ci/test-move.sh \
|
||||
^programs/move_loader_api \
|
||||
^programs/move_loader_program \
|
||||
^programs/librapay_api \
|
||||
^logger/ \
|
||||
^runtime/ \
|
||||
^sdk/ \
|
||||
|| {
|
||||
annotate --style info \
|
||||
"Skipped $testName as no relevant files were modified"
|
||||
exit 0
|
||||
}
|
||||
_ cargo +"$rust_stable" test --manifest-path programs/move_loader_api/Cargo.toml ${V:+--verbose} -- --nocapture
|
||||
_ cargo +"$rust_stable" test --manifest-path programs/move_loader_program/Cargo.toml ${V:+--verbose} -- --nocapture
|
||||
_ cargo +"$rust_stable" test --manifest-path programs/librapay_api/Cargo.toml ${V:+--verbose} -- --nocapture
|
||||
exit 0
|
||||
;;
|
||||
test-local-cluster)
|
||||
echo "Executing $testName"
|
||||
_ cargo +"$rust_stable" build --release --bins ${V:+--verbose}
|
||||
_ cargo +"$rust_stable" test --release --package solana-local-cluster ${V:+--verbose} -- --nocapture
|
||||
exit 0
|
||||
|
@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-cli"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@@ -26,23 +26,23 @@ serde = "1.0.101"
|
||||
serde_derive = "1.0.101"
|
||||
serde_json = "1.0.41"
|
||||
serde_yaml = "0.8.11"
|
||||
solana-budget-api = { path = "../programs/budget_api", version = "0.20.3" }
|
||||
solana-client = { path = "../client", version = "0.20.3" }
|
||||
solana-config-api = { path = "../programs/config_api", version = "0.20.3" }
|
||||
solana-drone = { path = "../drone", version = "0.20.3" }
|
||||
solana-logger = { path = "../logger", version = "0.20.3" }
|
||||
solana-netutil = { path = "../netutil", version = "0.20.3" }
|
||||
solana-runtime = { path = "../runtime", version = "0.20.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.3" }
|
||||
solana-stake-api = { path = "../programs/stake_api", version = "0.20.3" }
|
||||
solana-storage-api = { path = "../programs/storage_api", version = "0.20.3" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.20.3" }
|
||||
solana-vote-signer = { path = "../vote-signer", version = "0.20.3" }
|
||||
solana-budget-api = { path = "../programs/budget_api", version = "0.20.4" }
|
||||
solana-client = { path = "../client", version = "0.20.4" }
|
||||
solana-config-api = { path = "../programs/config_api", version = "0.20.4" }
|
||||
solana-drone = { path = "../drone", version = "0.20.4" }
|
||||
solana-logger = { path = "../logger", version = "0.20.4" }
|
||||
solana-netutil = { path = "../netutil", version = "0.20.4" }
|
||||
solana-runtime = { path = "../runtime", version = "0.20.4" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.4" }
|
||||
solana-stake-api = { path = "../programs/stake_api", version = "0.20.4" }
|
||||
solana-storage-api = { path = "../programs/storage_api", version = "0.20.4" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.20.4" }
|
||||
solana-vote-signer = { path = "../vote-signer", version = "0.20.4" }
|
||||
url = "2.1.0"
|
||||
|
||||
[dev-dependencies]
|
||||
solana-core = { path = "../core", version = "0.20.3" }
|
||||
solana-budget-program = { path = "../programs/budget_program", version = "0.20.3" }
|
||||
solana-core = { path = "../core", version = "0.20.4" }
|
||||
solana-budget-program = { path = "../programs/budget_program", version = "0.20.4" }
|
||||
|
||||
[[bin]]
|
||||
name = "solana"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-client"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana Client"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -19,10 +19,10 @@ reqwest = { version = "0.9.22", default-features = false, features = ["rustls-tl
|
||||
serde = "1.0.101"
|
||||
serde_derive = "1.0.101"
|
||||
serde_json = "1.0.41"
|
||||
solana-netutil = { path = "../netutil", version = "0.20.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.3" }
|
||||
solana-netutil = { path = "../netutil", version = "0.20.4" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.4" }
|
||||
|
||||
[dev-dependencies]
|
||||
jsonrpc-core = "14.0.3"
|
||||
jsonrpc-http-server = "14.0.3"
|
||||
solana-logger = { path = "../logger", version = "0.20.3" }
|
||||
solana-logger = { path = "../logger", version = "0.20.4" }
|
||||
|
@@ -1,7 +1,7 @@
|
||||
[package]
|
||||
name = "solana-core"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
documentation = "https://docs.rs/solana"
|
||||
homepage = "https://solana.com/"
|
||||
readme = "../README.md"
|
||||
@@ -44,25 +44,25 @@ rayon = "1.2.0"
|
||||
serde = "1.0.101"
|
||||
serde_derive = "1.0.101"
|
||||
serde_json = "1.0.41"
|
||||
solana-budget-api = { path = "../programs/budget_api", version = "0.20.3" }
|
||||
solana-budget-program = { path = "../programs/budget_program", version = "0.20.3" }
|
||||
solana-chacha-sys = { path = "../chacha-sys", version = "0.20.3" }
|
||||
solana-client = { path = "../client", version = "0.20.3" }
|
||||
solana-drone = { path = "../drone", version = "0.20.3" }
|
||||
solana-budget-api = { path = "../programs/budget_api", version = "0.20.4" }
|
||||
solana-budget-program = { path = "../programs/budget_program", version = "0.20.4" }
|
||||
solana-chacha-sys = { path = "../chacha-sys", version = "0.20.4" }
|
||||
solana-client = { path = "../client", version = "0.20.4" }
|
||||
solana-drone = { path = "../drone", version = "0.20.4" }
|
||||
solana-ed25519-dalek = "0.2.0"
|
||||
solana-ledger = { path = "../ledger", version = "0.20.3" }
|
||||
solana-logger = { path = "../logger", version = "0.20.3" }
|
||||
solana-merkle-tree = { path = "../merkle-tree", version = "0.20.3" }
|
||||
solana-metrics = { path = "../metrics", version = "0.20.3" }
|
||||
solana-measure = { path = "../measure", version = "0.20.3" }
|
||||
solana-netutil = { path = "../netutil", version = "0.20.3" }
|
||||
solana-runtime = { path = "../runtime", version = "0.20.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.3" }
|
||||
solana-stake-api = { path = "../programs/stake_api", version = "0.20.3" }
|
||||
solana-storage-api = { path = "../programs/storage_api", version = "0.20.3" }
|
||||
solana-storage-program = { path = "../programs/storage_program", version = "0.20.3" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.20.3" }
|
||||
solana-vote-signer = { path = "../vote-signer", version = "0.20.3" }
|
||||
solana-ledger = { path = "../ledger", version = "0.20.4" }
|
||||
solana-logger = { path = "../logger", version = "0.20.4" }
|
||||
solana-merkle-tree = { path = "../merkle-tree", version = "0.20.4" }
|
||||
solana-metrics = { path = "../metrics", version = "0.20.4" }
|
||||
solana-measure = { path = "../measure", version = "0.20.4" }
|
||||
solana-netutil = { path = "../netutil", version = "0.20.4" }
|
||||
solana-runtime = { path = "../runtime", version = "0.20.4" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.4" }
|
||||
solana-stake-api = { path = "../programs/stake_api", version = "0.20.4" }
|
||||
solana-storage-api = { path = "../programs/storage_api", version = "0.20.4" }
|
||||
solana-storage-program = { path = "../programs/storage_program", version = "0.20.4" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.20.4" }
|
||||
solana-vote-signer = { path = "../vote-signer", version = "0.20.4" }
|
||||
symlink = "0.1.0"
|
||||
sys-info = "0.5.8"
|
||||
tempfile = "3.1.0"
|
||||
@@ -71,7 +71,7 @@ tokio-codec = "0.1"
|
||||
tokio-fs = "0.1"
|
||||
tokio-io = "0.1"
|
||||
untrusted = "0.7.0"
|
||||
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "0.20.3" }
|
||||
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "0.20.4" }
|
||||
reed-solomon-erasure = { package = "solana-reed-solomon-erasure", version = "4.0.1-3", features = ["simd-accel"] }
|
||||
|
||||
[dev-dependencies]
|
||||
|
@@ -35,7 +35,7 @@ fn bench_shredder_ticks(bencher: &mut Bencher) {
|
||||
let num_ticks = max_ticks_per_n_shreds(1) * num_shreds as u64;
|
||||
let entries = create_ticks(num_ticks, Hash::default());
|
||||
bencher.iter(|| {
|
||||
let shredder = Shredder::new(1, 0, RECOMMENDED_FEC_RATE, kp.clone()).unwrap();
|
||||
let shredder = Shredder::new(1, 0, RECOMMENDED_FEC_RATE, kp.clone(), 0).unwrap();
|
||||
shredder.entries_to_shreds(&entries, true, 0);
|
||||
})
|
||||
}
|
||||
@@ -50,7 +50,7 @@ fn bench_shredder_large_entries(bencher: &mut Bencher) {
|
||||
let entries = make_large_unchained_entries(txs_per_entry, num_entries);
|
||||
// 1Mb
|
||||
bencher.iter(|| {
|
||||
let shredder = Shredder::new(1, 0, RECOMMENDED_FEC_RATE, kp.clone()).unwrap();
|
||||
let shredder = Shredder::new(1, 0, RECOMMENDED_FEC_RATE, kp.clone(), 0).unwrap();
|
||||
shredder.entries_to_shreds(&entries, true, 0);
|
||||
})
|
||||
}
|
||||
@@ -63,7 +63,7 @@ fn bench_deshredder(bencher: &mut Bencher) {
|
||||
let num_shreds = ((10000 * 1000) + (shred_size - 1)) / shred_size;
|
||||
let num_ticks = max_ticks_per_n_shreds(1) * num_shreds as u64;
|
||||
let entries = create_ticks(num_ticks, Hash::default());
|
||||
let shredder = Shredder::new(1, 0, RECOMMENDED_FEC_RATE, kp).unwrap();
|
||||
let shredder = Shredder::new(1, 0, RECOMMENDED_FEC_RATE, kp, 0).unwrap();
|
||||
let data_shreds = shredder.entries_to_shreds(&entries, true, 0).0;
|
||||
bencher.iter(|| {
|
||||
let raw = &mut Shredder::deshred(&data_shreds).unwrap();
|
||||
@@ -75,7 +75,7 @@ fn bench_deshredder(bencher: &mut Bencher) {
|
||||
fn bench_deserialize_hdr(bencher: &mut Bencher) {
|
||||
let data = vec![0; SIZE_OF_DATA_SHRED_PAYLOAD];
|
||||
|
||||
let shred = Shred::new_from_data(2, 1, 1, Some(&data), true, true);
|
||||
let shred = Shred::new_from_data(2, 1, 1, Some(&data), true, true, 0);
|
||||
|
||||
bencher.iter(|| {
|
||||
let payload = shred.payload.clone();
|
||||
|
@@ -44,6 +44,7 @@ impl BroadcastRun for BroadcastFakeBlobsRun {
|
||||
bank.parent().unwrap().slot(),
|
||||
RECOMMENDED_FEC_RATE,
|
||||
keypair.clone(),
|
||||
(bank.tick_height() % bank.ticks_per_slot()) as u8,
|
||||
)
|
||||
.expect("Expected to create a new shredder");
|
||||
|
||||
@@ -76,7 +77,6 @@ impl BroadcastRun for BroadcastFakeBlobsRun {
|
||||
}
|
||||
|
||||
blocktree.insert_shreds(data_shreds.clone(), None)?;
|
||||
blocktree.insert_shreds(coding_shreds.clone(), None)?;
|
||||
|
||||
// 3) Start broadcast step
|
||||
let peers = cluster_info.read().unwrap().tvu_peers();
|
||||
|
@@ -42,6 +42,7 @@ impl BroadcastRun for FailEntryVerificationBroadcastRun {
|
||||
bank.parent().unwrap().slot(),
|
||||
RECOMMENDED_FEC_RATE,
|
||||
keypair.clone(),
|
||||
(bank.tick_height() % bank.ticks_per_slot()) as u8,
|
||||
)
|
||||
.expect("Expected to create a new shredder");
|
||||
|
||||
|
@@ -2,9 +2,11 @@ use super::broadcast_utils::{self, ReceiveResults};
|
||||
use super::*;
|
||||
use crate::broadcast_stage::broadcast_utils::UnfinishedSlotInfo;
|
||||
use solana_ledger::entry::Entry;
|
||||
use solana_ledger::shred::{Shred, Shredder, RECOMMENDED_FEC_RATE};
|
||||
use solana_ledger::shred::{Shred, Shredder, RECOMMENDED_FEC_RATE, SHRED_TICK_REFERENCE_MASK};
|
||||
use solana_sdk::pubkey::Pubkey;
|
||||
use solana_sdk::signature::Keypair;
|
||||
use solana_sdk::timing::duration_as_us;
|
||||
use std::collections::HashMap;
|
||||
use std::time::Duration;
|
||||
|
||||
#[derive(Default)]
|
||||
@@ -14,7 +16,7 @@ struct BroadcastStats {
|
||||
insert_shreds_elapsed: u64,
|
||||
broadcast_elapsed: u64,
|
||||
receive_elapsed: u64,
|
||||
clone_and_seed_elapsed: u64,
|
||||
seed_elapsed: u64,
|
||||
}
|
||||
|
||||
impl BroadcastStats {
|
||||
@@ -23,7 +25,7 @@ impl BroadcastStats {
|
||||
self.shredding_elapsed = 0;
|
||||
self.broadcast_elapsed = 0;
|
||||
self.receive_elapsed = 0;
|
||||
self.clone_and_seed_elapsed = 0;
|
||||
self.seed_elapsed = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,7 +48,7 @@ impl StandardBroadcastRun {
|
||||
}
|
||||
}
|
||||
|
||||
fn check_for_interrupted_slot(&mut self) -> Option<Shred> {
|
||||
fn check_for_interrupted_slot(&mut self, max_ticks_in_slot: u8) -> Option<Shred> {
|
||||
let (slot, _) = self.current_slot_and_parent.unwrap();
|
||||
let mut last_unfinished_slot_shred = self
|
||||
.unfinished_slot
|
||||
@@ -60,6 +62,7 @@ impl StandardBroadcastRun {
|
||||
None,
|
||||
true,
|
||||
true,
|
||||
max_ticks_in_slot & SHRED_TICK_REFERENCE_MASK,
|
||||
))
|
||||
} else {
|
||||
None
|
||||
@@ -76,32 +79,12 @@ impl StandardBroadcastRun {
|
||||
last_unfinished_slot_shred
|
||||
}
|
||||
|
||||
fn coalesce_shreds(
|
||||
data_shreds: Vec<Shred>,
|
||||
coding_shreds: Vec<Shred>,
|
||||
last_unfinished_slot_shred: Option<Shred>,
|
||||
) -> Vec<Shred> {
|
||||
if let Some(shred) = last_unfinished_slot_shred {
|
||||
data_shreds
|
||||
.iter()
|
||||
.chain(coding_shreds.iter())
|
||||
.cloned()
|
||||
.chain(std::iter::once(shred))
|
||||
.collect::<Vec<_>>()
|
||||
} else {
|
||||
data_shreds
|
||||
.iter()
|
||||
.chain(coding_shreds.iter())
|
||||
.cloned()
|
||||
.collect::<Vec<_>>()
|
||||
}
|
||||
}
|
||||
|
||||
fn entries_to_shreds(
|
||||
&mut self,
|
||||
blocktree: &Blocktree,
|
||||
entries: &[Entry],
|
||||
is_slot_end: bool,
|
||||
reference_tick: u8,
|
||||
) -> (Vec<Shred>, Vec<Shred>) {
|
||||
let (slot, parent_slot) = self.current_slot_and_parent.unwrap();
|
||||
let shredder = Shredder::new(
|
||||
@@ -109,6 +92,7 @@ impl StandardBroadcastRun {
|
||||
parent_slot,
|
||||
RECOMMENDED_FEC_RATE,
|
||||
self.keypair.clone(),
|
||||
reference_tick,
|
||||
)
|
||||
.expect("Expected to create a new shredder");
|
||||
|
||||
@@ -168,82 +152,104 @@ impl StandardBroadcastRun {
|
||||
let to_shreds_start = Instant::now();
|
||||
|
||||
// 1) Check if slot was interrupted
|
||||
let last_unfinished_slot_shred = self.check_for_interrupted_slot();
|
||||
let last_unfinished_slot_shred =
|
||||
self.check_for_interrupted_slot(bank.ticks_per_slot() as u8);
|
||||
|
||||
// 2) Convert entries to shreds and coding shreds
|
||||
let (data_shreds, coding_shreds) = self.entries_to_shreds(
|
||||
let (mut data_shreds, coding_shreds) = self.entries_to_shreds(
|
||||
blocktree,
|
||||
&receive_results.entries,
|
||||
last_tick_height == bank.max_tick_height(),
|
||||
(bank.tick_height() % bank.ticks_per_slot()) as u8,
|
||||
);
|
||||
if let Some(last_shred) = last_unfinished_slot_shred {
|
||||
data_shreds.push(last_shred);
|
||||
}
|
||||
let to_shreds_elapsed = to_shreds_start.elapsed();
|
||||
|
||||
let clone_and_seed_start = Instant::now();
|
||||
let all_shreds =
|
||||
Self::coalesce_shreds(data_shreds, coding_shreds, last_unfinished_slot_shred);
|
||||
let all_shreds_ = all_shreds.clone();
|
||||
let all_seeds: Vec<[u8; 32]> = all_shreds.iter().map(|s| s.seed()).collect();
|
||||
let clone_and_seed_elapsed = clone_and_seed_start.elapsed();
|
||||
|
||||
// 3) Insert shreds into blocktree
|
||||
let insert_shreds_start = Instant::now();
|
||||
blocktree
|
||||
.insert_shreds(all_shreds_, None)
|
||||
.expect("Failed to insert shreds in blocktree");
|
||||
let insert_shreds_elapsed = insert_shreds_start.elapsed();
|
||||
|
||||
// 4) Broadcast the shreds
|
||||
let broadcast_start = Instant::now();
|
||||
let bank_epoch = bank.get_leader_schedule_epoch(bank.slot());
|
||||
let stakes = staking_utils::staked_nodes_at_epoch(&bank, bank_epoch);
|
||||
|
||||
let all_shred_bufs: Vec<Vec<u8>> = all_shreds.into_iter().map(|s| s.payload).collect();
|
||||
trace!("Broadcasting {:?} shreds", all_shred_bufs.len());
|
||||
|
||||
cluster_info.read().unwrap().broadcast_shreds(
|
||||
sock,
|
||||
all_shred_bufs,
|
||||
&all_seeds,
|
||||
self.maybe_insert_and_broadcast(
|
||||
data_shreds,
|
||||
true,
|
||||
blocktree,
|
||||
cluster_info,
|
||||
stakes.as_ref(),
|
||||
sock,
|
||||
)?;
|
||||
self.maybe_insert_and_broadcast(
|
||||
coding_shreds,
|
||||
false,
|
||||
blocktree,
|
||||
cluster_info,
|
||||
stakes.as_ref(),
|
||||
sock,
|
||||
)?;
|
||||
|
||||
let broadcast_elapsed = broadcast_start.elapsed();
|
||||
|
||||
self.update_broadcast_stats(
|
||||
duration_as_us(&receive_elapsed),
|
||||
duration_as_us(&to_shreds_elapsed),
|
||||
duration_as_us(&insert_shreds_elapsed),
|
||||
duration_as_us(&broadcast_elapsed),
|
||||
duration_as_us(&clone_and_seed_elapsed),
|
||||
last_tick_height == bank.max_tick_height(),
|
||||
);
|
||||
self.update_broadcast_stats(BroadcastStats {
|
||||
shredding_elapsed: duration_as_us(&to_shreds_elapsed),
|
||||
receive_elapsed: duration_as_us(&receive_elapsed),
|
||||
..BroadcastStats::default()
|
||||
});
|
||||
|
||||
if last_tick_height == bank.max_tick_height() {
|
||||
self.report_and_reset_stats();
|
||||
self.unfinished_slot = None;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
fn update_broadcast_stats(
|
||||
fn maybe_insert_and_broadcast(
|
||||
&mut self,
|
||||
receive_entries_elapsed: u64,
|
||||
shredding_elapsed: u64,
|
||||
insert_shreds_elapsed: u64,
|
||||
broadcast_elapsed: u64,
|
||||
clone_and_seed_elapsed: u64,
|
||||
slot_ended: bool,
|
||||
) {
|
||||
self.stats.receive_elapsed += receive_entries_elapsed;
|
||||
self.stats.shredding_elapsed += shredding_elapsed;
|
||||
self.stats.insert_shreds_elapsed += insert_shreds_elapsed;
|
||||
self.stats.broadcast_elapsed += broadcast_elapsed;
|
||||
self.stats.clone_and_seed_elapsed += clone_and_seed_elapsed;
|
||||
shreds: Vec<Shred>,
|
||||
insert: bool,
|
||||
blocktree: &Arc<Blocktree>,
|
||||
cluster_info: &Arc<RwLock<ClusterInfo>>,
|
||||
stakes: Option<&HashMap<Pubkey, u64>>,
|
||||
sock: &UdpSocket,
|
||||
) -> Result<()> {
|
||||
let seed_start = Instant::now();
|
||||
let seeds: Vec<[u8; 32]> = shreds.iter().map(|s| s.seed()).collect();
|
||||
let seed_elapsed = seed_start.elapsed();
|
||||
|
||||
if slot_ended {
|
||||
self.report_and_reset_stats()
|
||||
// Insert shreds into blocktree
|
||||
let insert_shreds_start = Instant::now();
|
||||
if insert {
|
||||
blocktree
|
||||
.insert_shreds(shreds.clone(), None)
|
||||
.expect("Failed to insert shreds in blocktree");
|
||||
}
|
||||
let insert_shreds_elapsed = insert_shreds_start.elapsed();
|
||||
|
||||
// Broadcast the shreds
|
||||
let broadcast_start = Instant::now();
|
||||
let shred_bufs: Vec<Vec<u8>> = shreds.into_iter().map(|s| s.payload).collect();
|
||||
trace!("Broadcasting {:?} shreds", shred_bufs.len());
|
||||
|
||||
cluster_info
|
||||
.read()
|
||||
.unwrap()
|
||||
.broadcast_shreds(sock, shred_bufs, &seeds, stakes)?;
|
||||
|
||||
let broadcast_elapsed = broadcast_start.elapsed();
|
||||
|
||||
self.update_broadcast_stats(BroadcastStats {
|
||||
insert_shreds_elapsed: duration_as_us(&insert_shreds_elapsed),
|
||||
broadcast_elapsed: duration_as_us(&broadcast_elapsed),
|
||||
seed_elapsed: duration_as_us(&seed_elapsed),
|
||||
..BroadcastStats::default()
|
||||
});
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn update_broadcast_stats(&mut self, stats: BroadcastStats) {
|
||||
self.stats.receive_elapsed += stats.receive_elapsed;
|
||||
self.stats.shredding_elapsed += stats.shredding_elapsed;
|
||||
self.stats.insert_shreds_elapsed += stats.insert_shreds_elapsed;
|
||||
self.stats.broadcast_elapsed += stats.broadcast_elapsed;
|
||||
self.stats.seed_elapsed += stats.seed_elapsed;
|
||||
}
|
||||
|
||||
fn report_and_reset_stats(&mut self) {
|
||||
@@ -259,11 +265,7 @@ impl StandardBroadcastRun {
|
||||
),
|
||||
("broadcast_time", self.stats.broadcast_elapsed as i64, i64),
|
||||
("receive_time", self.stats.receive_elapsed as i64, i64),
|
||||
(
|
||||
"clone_and_seed",
|
||||
self.stats.clone_and_seed_elapsed as i64,
|
||||
i64
|
||||
),
|
||||
("seed", self.stats.seed_elapsed as i64, i64),
|
||||
(
|
||||
"num_shreds",
|
||||
i64::from(self.unfinished_slot.unwrap().next_shred_index),
|
||||
@@ -362,7 +364,7 @@ mod test {
|
||||
|
||||
// Slot 2 interrupted slot 1
|
||||
let shred = run
|
||||
.check_for_interrupted_slot()
|
||||
.check_for_interrupted_slot(0)
|
||||
.expect("Expected a shred that signals an interrupt");
|
||||
|
||||
// Validate the shred
|
||||
|
@@ -165,7 +165,7 @@ mod tests {
|
||||
hasher.hash(&buf[..size]);
|
||||
|
||||
// golden needs to be updated if blob stuff changes....
|
||||
let golden: Hash = "BdmY3efqu7zbnFuGRAeFANwa35HkDdQ7hwhYez3xGXiM"
|
||||
let golden: Hash = "HLzH7Nrh4q2K5WTh3e9vPNFZ1QVYhVDRMN9u5v51GqpJ"
|
||||
.parse()
|
||||
.unwrap();
|
||||
|
||||
|
@@ -820,7 +820,7 @@ impl ClusterInfo {
|
||||
}
|
||||
pub fn map_repair_request(&self, repair_request: &RepairType) -> Result<Vec<u8>> {
|
||||
match repair_request {
|
||||
RepairType::Blob(slot, blob_index) => {
|
||||
RepairType::Shred(slot, blob_index) => {
|
||||
datapoint_debug!(
|
||||
"cluster_info-repair",
|
||||
("repair-slot", *slot, i64),
|
||||
@@ -1882,7 +1882,7 @@ mod tests {
|
||||
fn window_index_request() {
|
||||
let me = ContactInfo::new_localhost(&Pubkey::new_rand(), timestamp());
|
||||
let mut cluster_info = ClusterInfo::new_with_invalid_keypair(me);
|
||||
let rv = cluster_info.repair_request(&RepairType::Blob(0, 0));
|
||||
let rv = cluster_info.repair_request(&RepairType::Shred(0, 0));
|
||||
assert_matches!(rv, Err(Error::ClusterInfoError(ClusterInfoError::NoPeers)));
|
||||
|
||||
let gossip_addr = socketaddr!([127, 0, 0, 1], 1234);
|
||||
@@ -1901,7 +1901,7 @@ mod tests {
|
||||
);
|
||||
cluster_info.insert_info(nxt.clone());
|
||||
let rv = cluster_info
|
||||
.repair_request(&RepairType::Blob(0, 0))
|
||||
.repair_request(&RepairType::Shred(0, 0))
|
||||
.unwrap();
|
||||
assert_eq!(nxt.gossip, gossip_addr);
|
||||
assert_eq!(rv.0, nxt.gossip);
|
||||
@@ -1926,7 +1926,7 @@ mod tests {
|
||||
while !one || !two {
|
||||
//this randomly picks an option, so eventually it should pick both
|
||||
let rv = cluster_info
|
||||
.repair_request(&RepairType::Blob(0, 0))
|
||||
.repair_request(&RepairType::Shred(0, 0))
|
||||
.unwrap();
|
||||
if rv.0 == gossip_addr {
|
||||
one = true;
|
||||
|
@@ -18,8 +18,8 @@ use std::{
|
||||
time::Duration,
|
||||
};
|
||||
|
||||
pub const MAX_REPAIR_LENGTH: usize = 16;
|
||||
pub const REPAIR_MS: u64 = 100;
|
||||
pub const MAX_REPAIR_LENGTH: usize = 1024;
|
||||
pub const REPAIR_MS: u64 = 50;
|
||||
pub const MAX_ORPHANS: usize = 5;
|
||||
|
||||
pub enum RepairStrategy {
|
||||
@@ -35,7 +35,7 @@ pub enum RepairStrategy {
|
||||
pub enum RepairType {
|
||||
Orphan(u64),
|
||||
HighestBlob(u64, u64),
|
||||
Blob(u64, u64),
|
||||
Shred(u64, u64),
|
||||
}
|
||||
|
||||
pub struct RepairSlotRange {
|
||||
@@ -252,13 +252,13 @@ impl RepairService {
|
||||
} else {
|
||||
let reqs = blocktree.find_missing_data_indexes(
|
||||
slot,
|
||||
slot_meta.first_shred_timestamp,
|
||||
slot_meta.consumed,
|
||||
slot_meta.received,
|
||||
max_repairs,
|
||||
);
|
||||
|
||||
reqs.into_iter()
|
||||
.map(|i| RepairType::Blob(slot, i))
|
||||
.map(|i| RepairType::Shred(slot, i))
|
||||
.collect()
|
||||
}
|
||||
}
|
||||
@@ -478,12 +478,13 @@ mod test {
|
||||
}
|
||||
}
|
||||
blocktree.insert_shreds(shreds_to_write, None).unwrap();
|
||||
|
||||
// sleep so that the holes are ready for repair
|
||||
sleep(Duration::from_secs(1));
|
||||
let expected: Vec<RepairType> = (0..num_slots)
|
||||
.flat_map(|slot| {
|
||||
missing_indexes_per_slot
|
||||
.iter()
|
||||
.map(move |blob_index| RepairType::Blob(slot as u64, *blob_index))
|
||||
.map(move |blob_index| RepairType::Shred(slot as u64, *blob_index))
|
||||
})
|
||||
.collect();
|
||||
|
||||
@@ -543,7 +544,8 @@ mod test {
|
||||
slot_shreds.remove(0);
|
||||
blocktree.insert_shreds(slot_shreds, None).unwrap();
|
||||
}
|
||||
|
||||
// sleep to make slot eligible for repair
|
||||
sleep(Duration::from_secs(1));
|
||||
// Iterate through all possible combinations of start..end (inclusive on both
|
||||
// sides of the range)
|
||||
for start in 0..slots.len() {
|
||||
@@ -555,7 +557,7 @@ mod test {
|
||||
..=repair_slot_range.end)
|
||||
.map(|slot_index| {
|
||||
if slots.contains(&(slot_index as u64)) {
|
||||
RepairType::Blob(slot_index as u64, 0)
|
||||
RepairType::Shred(slot_index as u64, 0)
|
||||
} else {
|
||||
RepairType::HighestBlob(slot_index as u64, 0)
|
||||
}
|
||||
|
@@ -379,6 +379,7 @@ impl ReplayStage {
|
||||
("leader", next_leader.to_string(), String),
|
||||
);
|
||||
|
||||
info!("new fork:{} parent:{} (leader)", poh_slot, parent_slot);
|
||||
let tpu_bank = bank_forks
|
||||
.write()
|
||||
.unwrap()
|
||||
@@ -842,21 +843,21 @@ impl ReplayStage {
|
||||
next_slots.sort();
|
||||
next_slots
|
||||
});
|
||||
for (parent_id, children) in next_slots {
|
||||
for (parent_slot, children) in next_slots {
|
||||
let parent_bank = frozen_banks
|
||||
.get(&parent_id)
|
||||
.get(&parent_slot)
|
||||
.expect("missing parent in bank forks")
|
||||
.clone();
|
||||
for child_id in children {
|
||||
if forks.get(child_id).is_some() {
|
||||
trace!("child already active or frozen {}", child_id);
|
||||
for child_slot in children {
|
||||
if forks.get(child_slot).is_some() {
|
||||
trace!("child already active or frozen {}", child_slot);
|
||||
continue;
|
||||
}
|
||||
let leader = leader_schedule_cache
|
||||
.slot_leader_at(child_id, Some(&parent_bank))
|
||||
.slot_leader_at(child_slot, Some(&parent_bank))
|
||||
.unwrap();
|
||||
info!("new fork:{} parent:{}", child_id, parent_id);
|
||||
forks.insert(Bank::new_from_parent(&parent_bank, &leader, child_id));
|
||||
info!("new fork:{} parent:{}", child_slot, parent_slot);
|
||||
forks.insert(Bank::new_from_parent(&parent_bank, &leader, child_slot));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1005,7 +1006,7 @@ mod test {
|
||||
let payload_len = SIZE_OF_DATA_SHRED_PAYLOAD;
|
||||
let gibberish = [0xa5u8; PACKET_DATA_SIZE];
|
||||
let mut data_header = DataShredHeader::default();
|
||||
data_header.flags = DATA_COMPLETE_SHRED;
|
||||
data_header.flags |= DATA_COMPLETE_SHRED;
|
||||
let mut shred = Shred::new_empty_from_header(
|
||||
ShredCommonHeader::default(),
|
||||
data_header,
|
||||
|
@@ -308,7 +308,7 @@ mod test {
|
||||
parent: u64,
|
||||
keypair: &Arc<Keypair>,
|
||||
) -> Vec<Shred> {
|
||||
let shredder = Shredder::new(slot, parent, 0.0, keypair.clone())
|
||||
let shredder = Shredder::new(slot, parent, 0.0, keypair.clone(), 0)
|
||||
.expect("Failed to create entry shredder");
|
||||
shredder.entries_to_shreds(&entries, true, 0).0
|
||||
}
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-crate-features"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana Crate Features"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-drone"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana Drone"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -19,9 +19,9 @@ clap = "2.33"
|
||||
log = "0.4.8"
|
||||
serde = "1.0.101"
|
||||
serde_derive = "1.0.101"
|
||||
solana-logger = { path = "../logger", version = "0.20.3" }
|
||||
solana-metrics = { path = "../metrics", version = "0.20.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.3" }
|
||||
solana-logger = { path = "../logger", version = "0.20.4" }
|
||||
solana-metrics = { path = "../metrics", version = "0.20.4" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.4" }
|
||||
tokio = "0.1"
|
||||
tokio-codec = "0.1"
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-fixed-buf"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "A fixed-size byte array that supports bincode serde"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
|
@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-genesis"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@@ -15,10 +15,10 @@ serde = "1.0.101"
|
||||
serde_derive = "1.0.101"
|
||||
serde_json = "1.0.41"
|
||||
serde_yaml = "0.8.11"
|
||||
solana-genesis-programs = { path = "../genesis_programs", version = "0.20.3" }
|
||||
solana-ledger = { path = "../ledger", version = "0.20.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.3" }
|
||||
solana-stake-api = { path = "../programs/stake_api", version = "0.20.3" }
|
||||
solana-storage-api = { path = "../programs/storage_api", version = "0.20.3" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.20.3" }
|
||||
solana-genesis-programs = { path = "../genesis_programs", version = "0.20.4" }
|
||||
solana-ledger = { path = "../ledger", version = "0.20.4" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.4" }
|
||||
solana-stake-api = { path = "../programs/stake_api", version = "0.20.4" }
|
||||
solana-storage-api = { path = "../programs/storage_api", version = "0.20.4" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.20.4" }
|
||||
tempfile = "3.1.0"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-genesis-programs"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana genesis programs"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -10,24 +10,24 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
log = { version = "0.4.8" }
|
||||
solana-bpf-loader-api = { path = "../programs/bpf_loader_api", version = "0.20.3" }
|
||||
solana-bpf-loader-program = { path = "../programs/bpf_loader_program", version = "0.20.3" }
|
||||
solana-budget-api = { path = "../programs/budget_api", version = "0.20.3" }
|
||||
solana-budget-program = { path = "../programs/budget_program", version = "0.20.3" }
|
||||
solana-config-api = { path = "../programs/config_api", version = "0.20.3" }
|
||||
solana-config-program = { path = "../programs/config_program", version = "0.20.3" }
|
||||
solana-exchange-api = { path = "../programs/exchange_api", version = "0.20.3" }
|
||||
solana-exchange-program = { path = "../programs/exchange_program", version = "0.20.3" }
|
||||
solana-runtime = { path = "../runtime", version = "0.20.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.3" }
|
||||
solana-stake-api = { path = "../programs/stake_api", version = "0.20.3" }
|
||||
solana-stake-program = { path = "../programs/stake_program", version = "0.20.3" }
|
||||
solana-storage-api = { path = "../programs/storage_api", version = "0.20.3" }
|
||||
solana-storage-program = { path = "../programs/storage_program", version = "0.20.3" }
|
||||
solana-vest-api = { path = "../programs/vest_api", version = "0.20.3" }
|
||||
solana-vest-program = { path = "../programs/vest_program", version = "0.20.3" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.20.3" }
|
||||
solana-vote-program = { path = "../programs/vote_program", version = "0.20.3" }
|
||||
solana-bpf-loader-api = { path = "../programs/bpf_loader_api", version = "0.20.4" }
|
||||
solana-bpf-loader-program = { path = "../programs/bpf_loader_program", version = "0.20.4" }
|
||||
solana-budget-api = { path = "../programs/budget_api", version = "0.20.4" }
|
||||
solana-budget-program = { path = "../programs/budget_program", version = "0.20.4" }
|
||||
solana-config-api = { path = "../programs/config_api", version = "0.20.4" }
|
||||
solana-config-program = { path = "../programs/config_program", version = "0.20.4" }
|
||||
solana-exchange-api = { path = "../programs/exchange_api", version = "0.20.4" }
|
||||
solana-exchange-program = { path = "../programs/exchange_program", version = "0.20.4" }
|
||||
solana-runtime = { path = "../runtime", version = "0.20.4" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.4" }
|
||||
solana-stake-api = { path = "../programs/stake_api", version = "0.20.4" }
|
||||
solana-stake-program = { path = "../programs/stake_program", version = "0.20.4" }
|
||||
solana-storage-api = { path = "../programs/storage_api", version = "0.20.4" }
|
||||
solana-storage-program = { path = "../programs/storage_program", version = "0.20.4" }
|
||||
solana-vest-api = { path = "../programs/vest_api", version = "0.20.4" }
|
||||
solana-vest-program = { path = "../programs/vest_program", version = "0.20.4" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.20.4" }
|
||||
solana-vote-program = { path = "../programs/vote_program", version = "0.20.4" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib"]
|
||||
|
@@ -3,18 +3,18 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-gossip"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
|
||||
[dependencies]
|
||||
clap = "2.33.0"
|
||||
solana-core = { path = "../core", version = "0.20.3" }
|
||||
solana-client = { path = "../client", version = "0.20.3" }
|
||||
solana-logger = { path = "../logger", version = "0.20.3" }
|
||||
solana-netutil = { path = "../netutil", version = "0.20.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.3" }
|
||||
solana-core = { path = "../core", version = "0.20.4" }
|
||||
solana-client = { path = "../client", version = "0.20.4" }
|
||||
solana-logger = { path = "../logger", version = "0.20.4" }
|
||||
solana-netutil = { path = "../netutil", version = "0.20.4" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.4" }
|
||||
|
||||
|
||||
|
||||
|
@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-install"
|
||||
description = "The solana cluster software installer"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@@ -28,10 +28,10 @@ serde = "1.0.101"
|
||||
serde_derive = "1.0.101"
|
||||
serde_yaml = "0.8.11"
|
||||
sha2 = "0.8.0"
|
||||
solana-client = { path = "../client", version = "0.20.3" }
|
||||
solana-config-api = { path = "../programs/config_api", version = "0.20.3" }
|
||||
solana-logger = { path = "../logger", version = "0.20.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.3" }
|
||||
solana-client = { path = "../client", version = "0.20.4" }
|
||||
solana-config-api = { path = "../programs/config_api", version = "0.20.4" }
|
||||
solana-logger = { path = "../logger", version = "0.20.4" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.4" }
|
||||
tar = "0.4.26"
|
||||
tempdir = "0.3.7"
|
||||
url = "2.1.0"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-keygen"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana key generation utility"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -15,7 +15,7 @@ edition = "2018"
|
||||
clap = "2.33"
|
||||
dirs = "2.0.2"
|
||||
rpassword = "4.0"
|
||||
solana-sdk = { path = "../sdk", version = "0.20.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.4" }
|
||||
tiny-bip39 = "0.6.2"
|
||||
|
||||
[[bin]]
|
||||
|
@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-ledger-tool"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@@ -15,11 +15,11 @@ serde = "1.0.101"
|
||||
serde_derive = "1.0.101"
|
||||
serde_json = "1.0.41"
|
||||
serde_yaml = "0.8.11"
|
||||
solana-ledger = { path = "../ledger", version = "0.20.3" }
|
||||
solana-logger = { path = "../logger", version = "0.20.3" }
|
||||
solana-runtime = { path = "../runtime", version = "0.20.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.3" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.20.3" }
|
||||
solana-ledger = { path = "../ledger", version = "0.20.4" }
|
||||
solana-logger = { path = "../logger", version = "0.20.4" }
|
||||
solana-runtime = { path = "../runtime", version = "0.20.4" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.4" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.20.4" }
|
||||
|
||||
[dev-dependencies]
|
||||
assert_cmd = "0.11"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-ledger"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana ledger"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -27,16 +27,16 @@ rayon = "1.2.0"
|
||||
reed-solomon-erasure = { package = "solana-reed-solomon-erasure", version = "4.0.1-3", features = ["simd-accel"] }
|
||||
serde = "1.0.101"
|
||||
serde_derive = "1.0.101"
|
||||
solana-genesis-programs = { path = "../genesis_programs", version = "0.20.3" }
|
||||
solana-logger = { path = "../logger", version = "0.20.3" }
|
||||
solana-measure = { path = "../measure", version = "0.20.3" }
|
||||
solana-merkle-tree = { path = "../merkle-tree", version = "0.20.3" }
|
||||
solana-metrics = { path = "../metrics", version = "0.20.3" }
|
||||
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "0.20.3" }
|
||||
solana-runtime = { path = "../runtime", version = "0.20.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.3" }
|
||||
solana-stake-api = { path = "../programs/stake_api", version = "0.20.3" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.20.3" }
|
||||
solana-genesis-programs = { path = "../genesis_programs", version = "0.20.4" }
|
||||
solana-logger = { path = "../logger", version = "0.20.4" }
|
||||
solana-measure = { path = "../measure", version = "0.20.4" }
|
||||
solana-merkle-tree = { path = "../merkle-tree", version = "0.20.4" }
|
||||
solana-metrics = { path = "../metrics", version = "0.20.4" }
|
||||
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "0.20.4" }
|
||||
solana-runtime = { path = "../runtime", version = "0.20.4" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.4" }
|
||||
solana-stake-api = { path = "../programs/stake_api", version = "0.20.4" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.20.4" }
|
||||
sys-info = "0.5.8"
|
||||
tar = "0.4.26"
|
||||
tempfile = "3.1.0"
|
||||
@@ -50,7 +50,7 @@ features = ["lz4"]
|
||||
|
||||
[dev-dependencies]
|
||||
matches = "0.1.6"
|
||||
solana-budget-api = { path = "../programs/budget_api", version = "0.20.3" }
|
||||
solana-budget-api = { path = "../programs/budget_api", version = "0.20.4" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib"]
|
||||
|
@@ -20,10 +20,11 @@ use rocksdb::DBRawIterator;
|
||||
use solana_measure::measure::Measure;
|
||||
use solana_metrics::{datapoint_debug, datapoint_error};
|
||||
use solana_rayon_threadlimit::get_thread_count;
|
||||
use solana_sdk::clock::Slot;
|
||||
use solana_sdk::clock::{Slot, DEFAULT_TICKS_PER_SECOND};
|
||||
use solana_sdk::genesis_block::GenesisBlock;
|
||||
use solana_sdk::hash::Hash;
|
||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||
use solana_sdk::timing::timestamp;
|
||||
use std::cell::RefCell;
|
||||
use std::cmp;
|
||||
use std::collections::HashMap;
|
||||
@@ -41,6 +42,7 @@ thread_local!(static PAR_THREAD_POOL: RefCell<ThreadPool> = RefCell::new(rayon::
|
||||
.unwrap()));
|
||||
|
||||
pub const MAX_COMPLETED_SLOTS_IN_CHANNEL: usize = 100_000;
|
||||
pub const MAX_TURBINE_PROPAGATION_DELAY_TICKS: u64 = 16;
|
||||
|
||||
pub type CompletedSlotsReceiver = Receiver<Vec<u64>>;
|
||||
|
||||
@@ -833,6 +835,7 @@ impl Blocktree {
|
||||
slot_meta,
|
||||
index as u32,
|
||||
new_consumed,
|
||||
shred.reference_tick(),
|
||||
);
|
||||
data_index.set_present(index, true);
|
||||
trace!("inserted shred into slot {:?} and index {:?}", slot, index);
|
||||
@@ -909,7 +912,7 @@ impl Blocktree {
|
||||
},
|
||||
|v| v,
|
||||
);
|
||||
let mut shredder = Shredder::new(current_slot, parent_slot, 0.0, keypair.clone())
|
||||
let mut shredder = Shredder::new(current_slot, parent_slot, 0.0, keypair.clone(), 0)
|
||||
.expect("Failed to create entry shredder");
|
||||
let mut all_shreds = vec![];
|
||||
let mut slot_entries = vec![];
|
||||
@@ -932,8 +935,14 @@ impl Blocktree {
|
||||
shredder.entries_to_shreds(¤t_entries, true, start_index);
|
||||
all_shreds.append(&mut data_shreds);
|
||||
all_shreds.append(&mut coding_shreds);
|
||||
shredder = Shredder::new(current_slot, parent_slot, 0.0, keypair.clone())
|
||||
.expect("Failed to create entry shredder");
|
||||
shredder = Shredder::new(
|
||||
current_slot,
|
||||
parent_slot,
|
||||
0.0,
|
||||
keypair.clone(),
|
||||
(ticks_per_slot - remaining_ticks_in_slot) as u8,
|
||||
)
|
||||
.expect("Failed to create entry shredder");
|
||||
}
|
||||
|
||||
if entry.is_tick() {
|
||||
@@ -970,7 +979,8 @@ impl Blocktree {
|
||||
// for the slot with the specified slot
|
||||
fn find_missing_indexes<C>(
|
||||
db_iterator: &mut DBRawIterator,
|
||||
slot: u64,
|
||||
slot: Slot,
|
||||
first_timestamp: u64,
|
||||
start_index: u64,
|
||||
end_index: u64,
|
||||
max_missing: usize,
|
||||
@@ -983,6 +993,8 @@ impl Blocktree {
|
||||
}
|
||||
|
||||
let mut missing_indexes = vec![];
|
||||
let ticks_since_first_insert =
|
||||
DEFAULT_TICKS_PER_SECOND * (timestamp() - first_timestamp) / 1000;
|
||||
|
||||
// Seek to the first shred with index >= start_index
|
||||
db_iterator.seek(&C::key((slot, start_index)));
|
||||
@@ -1010,7 +1022,15 @@ impl Blocktree {
|
||||
};
|
||||
|
||||
let upper_index = cmp::min(current_index, end_index);
|
||||
// the tick that will be used to figure out the timeout for this hole
|
||||
let reference_tick = u64::from(Shred::reference_tick_from_data(
|
||||
&db_iterator.value().expect("couldn't read value"),
|
||||
));
|
||||
|
||||
if ticks_since_first_insert < reference_tick + MAX_TURBINE_PROPAGATION_DELAY_TICKS {
|
||||
// The higher index holes have not timed out yet
|
||||
break 'outer;
|
||||
}
|
||||
for i in prev_index..upper_index {
|
||||
missing_indexes.push(i);
|
||||
if missing_indexes.len() == max_missing {
|
||||
@@ -1035,7 +1055,8 @@ impl Blocktree {
|
||||
|
||||
pub fn find_missing_data_indexes(
|
||||
&self,
|
||||
slot: u64,
|
||||
slot: Slot,
|
||||
first_timestamp: u64,
|
||||
start_index: u64,
|
||||
end_index: u64,
|
||||
max_missing: usize,
|
||||
@@ -1047,6 +1068,7 @@ impl Blocktree {
|
||||
Self::find_missing_indexes::<cf::ShredData>(
|
||||
&mut db_iterator,
|
||||
slot,
|
||||
first_timestamp,
|
||||
start_index,
|
||||
end_index,
|
||||
max_missing,
|
||||
@@ -1311,10 +1333,17 @@ fn update_slot_meta(
|
||||
slot_meta: &mut SlotMeta,
|
||||
index: u32,
|
||||
new_consumed: u64,
|
||||
reference_tick: u8,
|
||||
) {
|
||||
let maybe_first_insert = slot_meta.received == 0;
|
||||
// Index is zero-indexed, while the "received" height starts from 1,
|
||||
// so received = index + 1 for the same shred.
|
||||
slot_meta.received = cmp::max((u64::from(index) + 1) as u64, slot_meta.received);
|
||||
if maybe_first_insert && slot_meta.received > 0 {
|
||||
// predict the timestamp of what would have been the first shred in this slot
|
||||
let slot_time_elapsed = u64::from(reference_tick) * 1000 / DEFAULT_TICKS_PER_SECOND;
|
||||
slot_meta.first_shred_timestamp = timestamp() - slot_time_elapsed;
|
||||
}
|
||||
slot_meta.consumed = new_consumed;
|
||||
slot_meta.last_index = {
|
||||
// If the last index in the slot hasn't been set before, then
|
||||
@@ -1707,7 +1736,7 @@ pub fn create_new_ledger(ledger_path: &Path, genesis_block: &GenesisBlock) -> Re
|
||||
let entries = create_ticks(ticks_per_slot, genesis_block.hash());
|
||||
let last_hash = entries.last().unwrap().hash;
|
||||
|
||||
let shredder = Shredder::new(0, 0, 0.0, Arc::new(Keypair::new()))
|
||||
let shredder = Shredder::new(0, 0, 0.0, Arc::new(Keypair::new()), 0)
|
||||
.expect("Failed to create entry shredder");
|
||||
let shreds = shredder.entries_to_shreds(&entries, true, 0).0;
|
||||
assert!(shreds.last().unwrap().last_in_slot());
|
||||
@@ -1792,7 +1821,7 @@ pub fn entries_to_test_shreds(
|
||||
parent_slot: u64,
|
||||
is_full_slot: bool,
|
||||
) -> Vec<Shred> {
|
||||
let shredder = Shredder::new(slot, parent_slot, 0.0, Arc::new(Keypair::new()))
|
||||
let shredder = Shredder::new(slot, parent_slot, 0.0, Arc::new(Keypair::new()), 0)
|
||||
.expect("Failed to create entry shredder");
|
||||
|
||||
shredder.entries_to_shreds(&entries, is_full_slot, 0).0
|
||||
@@ -3163,27 +3192,27 @@ pub mod tests {
|
||||
// range of [0, gap)
|
||||
let expected: Vec<u64> = (1..gap).collect();
|
||||
assert_eq!(
|
||||
blocktree.find_missing_data_indexes(slot, 0, gap, gap as usize),
|
||||
blocktree.find_missing_data_indexes(slot, 0, 0, gap, gap as usize),
|
||||
expected
|
||||
);
|
||||
assert_eq!(
|
||||
blocktree.find_missing_data_indexes(slot, 1, gap, (gap - 1) as usize),
|
||||
blocktree.find_missing_data_indexes(slot, 0, 1, gap, (gap - 1) as usize),
|
||||
expected,
|
||||
);
|
||||
assert_eq!(
|
||||
blocktree.find_missing_data_indexes(slot, 0, gap - 1, (gap - 1) as usize),
|
||||
blocktree.find_missing_data_indexes(slot, 0, 0, gap - 1, (gap - 1) as usize),
|
||||
&expected[..expected.len() - 1],
|
||||
);
|
||||
assert_eq!(
|
||||
blocktree.find_missing_data_indexes(slot, gap - 2, gap, gap as usize),
|
||||
blocktree.find_missing_data_indexes(slot, 0, gap - 2, gap, gap as usize),
|
||||
vec![gap - 2, gap - 1],
|
||||
);
|
||||
assert_eq!(
|
||||
blocktree.find_missing_data_indexes(slot, gap - 2, gap, 1),
|
||||
blocktree.find_missing_data_indexes(slot, 0, gap - 2, gap, 1),
|
||||
vec![gap - 2],
|
||||
);
|
||||
assert_eq!(
|
||||
blocktree.find_missing_data_indexes(slot, 0, gap, 1),
|
||||
blocktree.find_missing_data_indexes(slot, 0, 0, gap, 1),
|
||||
vec![1],
|
||||
);
|
||||
|
||||
@@ -3192,11 +3221,11 @@ pub mod tests {
|
||||
let mut expected: Vec<u64> = (1..gap).collect();
|
||||
expected.push(gap + 1);
|
||||
assert_eq!(
|
||||
blocktree.find_missing_data_indexes(slot, 0, gap + 2, (gap + 2) as usize),
|
||||
blocktree.find_missing_data_indexes(slot, 0, 0, gap + 2, (gap + 2) as usize),
|
||||
expected,
|
||||
);
|
||||
assert_eq!(
|
||||
blocktree.find_missing_data_indexes(slot, 0, gap + 2, (gap - 1) as usize),
|
||||
blocktree.find_missing_data_indexes(slot, 0, 0, gap + 2, (gap - 1) as usize),
|
||||
&expected[..expected.len() - 1],
|
||||
);
|
||||
|
||||
@@ -3212,6 +3241,7 @@ pub mod tests {
|
||||
assert_eq!(
|
||||
blocktree.find_missing_data_indexes(
|
||||
slot,
|
||||
0,
|
||||
j * gap,
|
||||
i * gap,
|
||||
((i - j) * gap) as usize
|
||||
@@ -3225,6 +3255,34 @@ pub mod tests {
|
||||
Blocktree::destroy(&blocktree_path).expect("Expected successful database destruction");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_find_missing_data_indexes_timeout() {
|
||||
let slot = 0;
|
||||
let blocktree_path = get_tmp_ledger_path!();
|
||||
let blocktree = Blocktree::open(&blocktree_path).unwrap();
|
||||
|
||||
// Write entries
|
||||
let gap: u64 = 10;
|
||||
let shreds: Vec<_> = (0..64)
|
||||
.map(|i| Shred::new_from_data(slot, (i * gap) as u32, 0, None, false, false, i as u8))
|
||||
.collect();
|
||||
blocktree.insert_shreds(shreds, None).unwrap();
|
||||
|
||||
let empty: Vec<u64> = vec![];
|
||||
assert_eq!(
|
||||
blocktree.find_missing_data_indexes(slot, timestamp(), 0, 50, 1),
|
||||
empty
|
||||
);
|
||||
let expected: Vec<_> = (1..=9).collect();
|
||||
assert_eq!(
|
||||
blocktree.find_missing_data_indexes(slot, timestamp() - 400, 0, 50, 9),
|
||||
expected
|
||||
);
|
||||
|
||||
drop(blocktree);
|
||||
Blocktree::destroy(&blocktree_path).expect("Expected successful database destruction");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_find_missing_data_indexes_sanity() {
|
||||
let slot = 0;
|
||||
@@ -3234,10 +3292,10 @@ pub mod tests {
|
||||
|
||||
// Early exit conditions
|
||||
let empty: Vec<u64> = vec![];
|
||||
assert_eq!(blocktree.find_missing_data_indexes(slot, 0, 0, 1), empty);
|
||||
assert_eq!(blocktree.find_missing_data_indexes(slot, 5, 5, 1), empty);
|
||||
assert_eq!(blocktree.find_missing_data_indexes(slot, 4, 3, 1), empty);
|
||||
assert_eq!(blocktree.find_missing_data_indexes(slot, 1, 2, 0), empty);
|
||||
assert_eq!(blocktree.find_missing_data_indexes(slot, 0, 0, 0, 1), empty);
|
||||
assert_eq!(blocktree.find_missing_data_indexes(slot, 0, 5, 5, 1), empty);
|
||||
assert_eq!(blocktree.find_missing_data_indexes(slot, 0, 4, 3, 1), empty);
|
||||
assert_eq!(blocktree.find_missing_data_indexes(slot, 0, 1, 2, 0), empty);
|
||||
|
||||
let entries = create_ticks(100, Hash::default());
|
||||
let mut shreds = entries_to_test_shreds(entries, slot, 0, true);
|
||||
@@ -3261,7 +3319,7 @@ pub mod tests {
|
||||
// [i, first_index - 1]
|
||||
for start in 0..STARTS {
|
||||
let result = blocktree.find_missing_data_indexes(
|
||||
slot, start, // start
|
||||
slot, 0, start, // start
|
||||
END, //end
|
||||
MAX, //max
|
||||
);
|
||||
@@ -3291,7 +3349,7 @@ pub mod tests {
|
||||
for i in 0..num_shreds as u64 {
|
||||
for j in 0..i {
|
||||
assert_eq!(
|
||||
blocktree.find_missing_data_indexes(slot, j, i, (i - j) as usize),
|
||||
blocktree.find_missing_data_indexes(slot, 0, j, i, (i - j) as usize),
|
||||
empty
|
||||
);
|
||||
}
|
||||
@@ -3816,6 +3874,7 @@ pub mod tests {
|
||||
Some(&[1, 1, 1]),
|
||||
true,
|
||||
true,
|
||||
0,
|
||||
)];
|
||||
|
||||
// With the corruption, nothing should be returned, even though an
|
||||
|
@@ -12,11 +12,13 @@ pub struct SlotMeta {
|
||||
// The total number of consecutive blobs starting from index 0
|
||||
// we have received for this slot.
|
||||
pub consumed: u64,
|
||||
// The index *plus one* of the highest blob received for this slot. Useful
|
||||
// for checking if the slot has received any blobs yet, and to calculate the
|
||||
// The index *plus one* of the highest shred received for this slot. Useful
|
||||
// for checking if the slot has received any shreds yet, and to calculate the
|
||||
// range where there is one or more holes: `(consumed..received)`.
|
||||
pub received: u64,
|
||||
// The index of the blob that is flagged as the last blob for this slot.
|
||||
// The timestamp of the first time a shred was added for this slot
|
||||
pub first_shred_timestamp: u64,
|
||||
// The index of the shred that is flagged as the last shred for this slot.
|
||||
pub last_index: u64,
|
||||
// The slot height of the block this one derives from.
|
||||
pub parent_slot: u64,
|
||||
@@ -31,7 +33,7 @@ pub struct SlotMeta {
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq)]
|
||||
/// Index recording presence/absence of blobs
|
||||
/// Index recording presence/absence of shreds
|
||||
pub struct Index {
|
||||
pub slot: u64,
|
||||
data: DataIndex,
|
||||
@@ -40,14 +42,14 @@ pub struct Index {
|
||||
|
||||
#[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq)]
|
||||
pub struct DataIndex {
|
||||
/// Map representing presence/absence of data blobs
|
||||
/// Map representing presence/absence of data shreds
|
||||
index: BTreeSet<u64>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq)]
|
||||
/// Erasure coding information
|
||||
pub struct CodingIndex {
|
||||
/// Map from set index, to hashmap from blob index to presence bool
|
||||
/// Map from set index, to hashmap from shred index to presence bool
|
||||
index: BTreeSet<u64>,
|
||||
}
|
||||
|
||||
@@ -145,8 +147,8 @@ impl DataIndex {
|
||||
impl SlotMeta {
|
||||
pub fn is_full(&self) -> bool {
|
||||
// last_index is std::u64::MAX when it has no information about how
|
||||
// many blobs will fill this slot.
|
||||
// Note: A full slot with zero blobs is not possible.
|
||||
// many shreds will fill this slot.
|
||||
// Note: A full slot with zero shreds is not possible.
|
||||
if self.last_index == std::u64::MAX {
|
||||
return false;
|
||||
}
|
||||
@@ -179,6 +181,7 @@ impl SlotMeta {
|
||||
slot,
|
||||
consumed: 0,
|
||||
received: 0,
|
||||
first_shred_timestamp: 0,
|
||||
parent_slot,
|
||||
next_slots: vec![],
|
||||
is_connected: slot == 0,
|
||||
|
@@ -114,8 +114,18 @@ fn process_entries_with_callback(
|
||||
let mut tick_hashes = vec![];
|
||||
for entry in entries {
|
||||
if entry.is_tick() {
|
||||
// if its a tick, save it for later
|
||||
// If it's a tick, save it for later
|
||||
tick_hashes.push(entry.hash);
|
||||
if bank.is_block_boundary(bank.tick_height() + tick_hashes.len() as u64) {
|
||||
// If it's a tick that will cause a new blockhash to be created,
|
||||
// execute the group and register the tick
|
||||
execute_batches(bank, &batches, entry_callback)?;
|
||||
batches.clear();
|
||||
for hash in &tick_hashes {
|
||||
bank.register_tick(hash);
|
||||
}
|
||||
tick_hashes.clear();
|
||||
}
|
||||
continue;
|
||||
}
|
||||
// else loop on processing the entry
|
||||
@@ -1825,6 +1835,33 @@ pub mod tests {
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_process_ledger_ticks_ordering() {
|
||||
let GenesisBlockInfo {
|
||||
genesis_block,
|
||||
mint_keypair,
|
||||
..
|
||||
} = create_genesis_block(100);
|
||||
let bank0 = Arc::new(Bank::new(&genesis_block));
|
||||
let genesis_hash = genesis_block.hash();
|
||||
let keypair = Keypair::new();
|
||||
|
||||
// Simulate a slot of virtual ticks, creates a new blockhash
|
||||
let mut entries = create_ticks(genesis_block.ticks_per_slot, genesis_hash);
|
||||
|
||||
// The new blockhash is going to be the hash of the last tick in the block
|
||||
let new_blockhash = entries.last().unwrap().hash;
|
||||
// Create an transaction that references the new blockhash, should still
|
||||
// be able to find the blockhash if we process transactions all in the same
|
||||
// batch
|
||||
let tx = system_transaction::transfer(&mint_keypair, &keypair.pubkey(), 1, new_blockhash);
|
||||
let entry = next_entry(&new_blockhash, 1, vec![tx]);
|
||||
entries.push(entry);
|
||||
|
||||
process_entries_with_callback(&bank0, &entries, true, None).unwrap();
|
||||
assert_eq!(bank0.get_balance(&keypair.pubkey()), 1)
|
||||
}
|
||||
|
||||
fn get_epoch_schedule(
|
||||
genesis_block: &GenesisBlock,
|
||||
account_paths: Option<String>,
|
||||
|
@@ -8,12 +8,15 @@ use rayon::ThreadPool;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use solana_metrics::datapoint_debug;
|
||||
use solana_rayon_threadlimit::get_thread_count;
|
||||
use solana_sdk::hash::Hash;
|
||||
use solana_sdk::packet::PACKET_DATA_SIZE;
|
||||
use solana_sdk::pubkey::Pubkey;
|
||||
use solana_sdk::signature::{Keypair, KeypairUtil, Signature};
|
||||
use std::sync::Arc;
|
||||
use std::time::Instant;
|
||||
use solana_sdk::{
|
||||
clock::Slot,
|
||||
hash::Hash,
|
||||
packet::PACKET_DATA_SIZE,
|
||||
pubkey::Pubkey,
|
||||
signature::{Keypair, KeypairUtil, Signature},
|
||||
};
|
||||
use std::mem::size_of;
|
||||
use std::{sync::Arc, time::Instant};
|
||||
|
||||
/// The following constants are computed by hand, and hardcoded.
|
||||
/// `test_shred_constants` ensures that the values are correct.
|
||||
@@ -38,15 +41,12 @@ thread_local!(static PAR_THREAD_POOL: RefCell<ThreadPool> = RefCell::new(rayon::
|
||||
pub const DATA_SHRED: u8 = 0b1010_0101;
|
||||
pub const CODING_SHRED: u8 = 0b0101_1010;
|
||||
|
||||
/// This limit comes from reed solomon library, but unfortunately they don't have
|
||||
/// a public constant defined for it.
|
||||
pub const MAX_DATA_SHREDS_PER_FEC_BLOCK: u32 = 16;
|
||||
pub const MAX_DATA_SHREDS_PER_FEC_BLOCK: u32 = 32;
|
||||
pub const RECOMMENDED_FEC_RATE: f32 = 1.0;
|
||||
|
||||
/// Based on rse benchmarks, the optimal erasure config uses 16 data shreds and 4 coding shreds
|
||||
pub const RECOMMENDED_FEC_RATE: f32 = 0.25;
|
||||
|
||||
const LAST_SHRED_IN_SLOT: u8 = 0b0000_0001;
|
||||
pub const DATA_COMPLETE_SHRED: u8 = 0b0000_0010;
|
||||
pub const SHRED_TICK_REFERENCE_MASK: u8 = 0b0011_1111;
|
||||
const LAST_SHRED_IN_SLOT: u8 = 0b1000_0000;
|
||||
pub const DATA_COMPLETE_SHRED: u8 = 0b0100_0000;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum ShredError {
|
||||
@@ -135,6 +135,7 @@ impl Shred {
|
||||
data: Option<&[u8]>,
|
||||
is_last_data: bool,
|
||||
is_last_in_slot: bool,
|
||||
reference_tick: u8,
|
||||
) -> Self {
|
||||
let mut payload = vec![0; PACKET_DATA_SIZE];
|
||||
let mut common_header = ShredCommonHeader::default();
|
||||
@@ -143,6 +144,7 @@ impl Shred {
|
||||
|
||||
let mut data_header = DataShredHeader::default();
|
||||
data_header.parent_offset = parent_offset;
|
||||
data_header.flags = reference_tick.min(SHRED_TICK_REFERENCE_MASK);
|
||||
|
||||
if is_last_data {
|
||||
data_header.flags |= DATA_COMPLETE_SHRED
|
||||
@@ -328,6 +330,19 @@ impl Shred {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn reference_tick(&self) -> u8 {
|
||||
if self.is_data() {
|
||||
self.data_header.flags & SHRED_TICK_REFERENCE_MASK
|
||||
} else {
|
||||
SHRED_TICK_REFERENCE_MASK
|
||||
}
|
||||
}
|
||||
|
||||
pub fn reference_tick_from_data(data: &[u8]) -> u8 {
|
||||
let flags = data[SIZE_OF_COMMON_SHRED_HEADER + SIZE_OF_DATA_SHRED_HEADER - size_of::<u8>()];
|
||||
flags & SHRED_TICK_REFERENCE_MASK
|
||||
}
|
||||
|
||||
pub fn verify(&self, pubkey: &Pubkey) -> bool {
|
||||
self.signature()
|
||||
.verify(pubkey.as_ref(), &self.payload[SIZE_OF_SIGNATURE..])
|
||||
@@ -341,10 +356,17 @@ pub struct Shredder {
|
||||
fec_rate: f32,
|
||||
keypair: Arc<Keypair>,
|
||||
pub signing_coding_time: u128,
|
||||
reference_tick: u8,
|
||||
}
|
||||
|
||||
impl Shredder {
|
||||
pub fn new(slot: u64, parent_slot: u64, fec_rate: f32, keypair: Arc<Keypair>) -> Result<Self> {
|
||||
pub fn new(
|
||||
slot: Slot,
|
||||
parent_slot: Slot,
|
||||
fec_rate: f32,
|
||||
keypair: Arc<Keypair>,
|
||||
reference_tick: u8,
|
||||
) -> Result<Self> {
|
||||
if fec_rate > 1.0 || fec_rate < 0.0 {
|
||||
Err(ShredError::InvalidFecRate(fec_rate))
|
||||
} else if slot < parent_slot || slot - parent_slot > u64::from(std::u16::MAX) {
|
||||
@@ -356,6 +378,7 @@ impl Shredder {
|
||||
fec_rate,
|
||||
keypair,
|
||||
signing_coding_time: 0,
|
||||
reference_tick,
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -399,6 +422,7 @@ impl Shredder {
|
||||
Some(shred_data),
|
||||
is_last_data,
|
||||
is_last_in_slot,
|
||||
self.reference_tick,
|
||||
);
|
||||
|
||||
Shredder::sign_shred(&self.keypair, &mut shred);
|
||||
@@ -801,7 +825,7 @@ pub mod tests {
|
||||
|
||||
// Test that parent cannot be > current slot
|
||||
assert_matches!(
|
||||
Shredder::new(slot, slot + 1, 1.00, keypair.clone()),
|
||||
Shredder::new(slot, slot + 1, 1.00, keypair.clone(), 0),
|
||||
Err(ShredError::SlotTooLow {
|
||||
slot: _,
|
||||
parent_slot: _,
|
||||
@@ -809,7 +833,7 @@ pub mod tests {
|
||||
);
|
||||
// Test that slot - parent cannot be > u16 MAX
|
||||
assert_matches!(
|
||||
Shredder::new(slot, slot - 1 - 0xffff, 1.00, keypair.clone()),
|
||||
Shredder::new(slot, slot - 1 - 0xffff, 1.00, keypair.clone(), 0),
|
||||
Err(ShredError::SlotTooLow {
|
||||
slot: _,
|
||||
parent_slot: _,
|
||||
@@ -818,7 +842,7 @@ pub mod tests {
|
||||
|
||||
let fec_rate = 0.25;
|
||||
let parent_slot = slot - 5;
|
||||
let shredder = Shredder::new(slot, parent_slot, fec_rate, keypair.clone())
|
||||
let shredder = Shredder::new(slot, parent_slot, fec_rate, keypair.clone(), 0)
|
||||
.expect("Failed in creating shredder");
|
||||
|
||||
let entries: Vec<_> = (0..5)
|
||||
@@ -893,7 +917,7 @@ pub mod tests {
|
||||
let slot = 1;
|
||||
|
||||
let parent_slot = 0;
|
||||
let shredder = Shredder::new(slot, parent_slot, 0.0, keypair.clone())
|
||||
let shredder = Shredder::new(slot, parent_slot, 0.0, keypair.clone(), 0)
|
||||
.expect("Failed in creating shredder");
|
||||
|
||||
let entries: Vec<_> = (0..5)
|
||||
@@ -913,6 +937,72 @@ pub mod tests {
|
||||
assert_eq!(deserialized_shred, *data_shreds.last().unwrap());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_shred_reference_tick() {
|
||||
let keypair = Arc::new(Keypair::new());
|
||||
let slot = 1;
|
||||
|
||||
let parent_slot = 0;
|
||||
let shredder = Shredder::new(slot, parent_slot, 0.0, keypair.clone(), 5)
|
||||
.expect("Failed in creating shredder");
|
||||
|
||||
let entries: Vec<_> = (0..5)
|
||||
.map(|_| {
|
||||
let keypair0 = Keypair::new();
|
||||
let keypair1 = Keypair::new();
|
||||
let tx0 =
|
||||
system_transaction::transfer(&keypair0, &keypair1.pubkey(), 1, Hash::default());
|
||||
Entry::new(&Hash::default(), 1, vec![tx0])
|
||||
})
|
||||
.collect();
|
||||
|
||||
let data_shreds = shredder.entries_to_shreds(&entries, true, 0).0;
|
||||
data_shreds.iter().for_each(|s| {
|
||||
assert_eq!(s.reference_tick(), 5);
|
||||
assert_eq!(Shred::reference_tick_from_data(&s.payload), 5);
|
||||
});
|
||||
|
||||
let deserialized_shred =
|
||||
Shred::new_from_serialized_shred(data_shreds.last().unwrap().payload.clone()).unwrap();
|
||||
assert_eq!(deserialized_shred.reference_tick(), 5);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_shred_reference_tick_overflow() {
|
||||
let keypair = Arc::new(Keypair::new());
|
||||
let slot = 1;
|
||||
|
||||
let parent_slot = 0;
|
||||
let shredder = Shredder::new(slot, parent_slot, 0.0, keypair.clone(), u8::max_value())
|
||||
.expect("Failed in creating shredder");
|
||||
|
||||
let entries: Vec<_> = (0..5)
|
||||
.map(|_| {
|
||||
let keypair0 = Keypair::new();
|
||||
let keypair1 = Keypair::new();
|
||||
let tx0 =
|
||||
system_transaction::transfer(&keypair0, &keypair1.pubkey(), 1, Hash::default());
|
||||
Entry::new(&Hash::default(), 1, vec![tx0])
|
||||
})
|
||||
.collect();
|
||||
|
||||
let data_shreds = shredder.entries_to_shreds(&entries, true, 0).0;
|
||||
data_shreds.iter().for_each(|s| {
|
||||
assert_eq!(s.reference_tick(), SHRED_TICK_REFERENCE_MASK);
|
||||
assert_eq!(
|
||||
Shred::reference_tick_from_data(&s.payload),
|
||||
SHRED_TICK_REFERENCE_MASK
|
||||
);
|
||||
});
|
||||
|
||||
let deserialized_shred =
|
||||
Shred::new_from_serialized_shred(data_shreds.last().unwrap().payload.clone()).unwrap();
|
||||
assert_eq!(
|
||||
deserialized_shred.reference_tick(),
|
||||
SHRED_TICK_REFERENCE_MASK
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_data_and_code_shredder() {
|
||||
let keypair = Arc::new(Keypair::new());
|
||||
@@ -920,11 +1010,11 @@ pub mod tests {
|
||||
let slot = 0x123456789abcdef0;
|
||||
// Test that FEC rate cannot be > 1.0
|
||||
assert_matches!(
|
||||
Shredder::new(slot, slot - 5, 1.001, keypair.clone()),
|
||||
Shredder::new(slot, slot - 5, 1.001, keypair.clone(), 0),
|
||||
Err(ShredError::InvalidFecRate(_))
|
||||
);
|
||||
|
||||
let shredder = Shredder::new(0x123456789abcdef0, slot - 5, 1.0, keypair.clone())
|
||||
let shredder = Shredder::new(0x123456789abcdef0, slot - 5, 1.0, keypair.clone(), 0)
|
||||
.expect("Failed in creating shredder");
|
||||
|
||||
// Create enough entries to make > 1 shred
|
||||
@@ -966,7 +1056,7 @@ pub mod tests {
|
||||
fn test_recovery_and_reassembly() {
|
||||
let keypair = Arc::new(Keypair::new());
|
||||
let slot = 0x123456789abcdef0;
|
||||
let shredder = Shredder::new(slot, slot - 5, 1.0, keypair.clone())
|
||||
let shredder = Shredder::new(slot, slot - 5, 1.0, keypair.clone(), 0)
|
||||
.expect("Failed in creating shredder");
|
||||
|
||||
let keypair0 = Keypair::new();
|
||||
@@ -1212,7 +1302,7 @@ pub mod tests {
|
||||
fn test_multi_fec_block_coding() {
|
||||
let keypair = Arc::new(Keypair::new());
|
||||
let slot = 0x123456789abcdef0;
|
||||
let shredder = Shredder::new(slot, slot - 5, 1.0, keypair.clone())
|
||||
let shredder = Shredder::new(slot, slot - 5, 1.0, keypair.clone(), 0)
|
||||
.expect("Failed in creating shredder");
|
||||
|
||||
let num_fec_sets = 100;
|
||||
|
@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-local-cluster"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@@ -11,29 +11,29 @@ homepage = "https://solana.com/"
|
||||
[dependencies]
|
||||
log = "0.4.8"
|
||||
rand = "0.6.5"
|
||||
solana-bench-exchange = { path = "../bench-exchange", version = "0.20.3" }
|
||||
solana-bench-tps = { path = "../bench-tps", version = "0.20.3" }
|
||||
solana-config-api = { path = "../programs/config_api", version = "0.20.3" }
|
||||
solana-core = { path = "../core", version = "0.20.3" }
|
||||
solana-client = { path = "../client", version = "0.20.3" }
|
||||
solana-drone = { path = "../drone", version = "0.20.3" }
|
||||
solana-exchange-api = { path = "../programs/exchange_api", version = "0.20.3" }
|
||||
solana-exchange-program = { path = "../programs/exchange_program", version = "0.20.3" }
|
||||
solana-genesis-programs = { path = "../genesis_programs", version = "0.20.3" }
|
||||
solana-ledger = { path = "../ledger", version = "0.20.3" }
|
||||
solana-logger = { path = "../logger", version = "0.20.3" }
|
||||
solana-move-loader-api = { path = "../programs/move_loader_api", version = "0.20.3", optional = true }
|
||||
solana-move-loader-program = { path = "../programs/move_loader_program", version = "0.20.3", optional = true }
|
||||
solana-runtime = { path = "../runtime", version = "0.20.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.3" }
|
||||
solana-stake-api = { path = "../programs/stake_api", version = "0.20.3" }
|
||||
solana-storage-api = { path = "../programs/storage_api", version = "0.20.3" }
|
||||
solana-storage-program = { path = "../programs/storage_program", version = "0.20.3" }
|
||||
solana-vest-api = { path = "../programs/vest_api", version = "0.20.3" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.20.3" }
|
||||
solana-bench-exchange = { path = "../bench-exchange", version = "0.20.4" }
|
||||
solana-bench-tps = { path = "../bench-tps", version = "0.20.4" }
|
||||
solana-config-api = { path = "../programs/config_api", version = "0.20.4" }
|
||||
solana-core = { path = "../core", version = "0.20.4" }
|
||||
solana-client = { path = "../client", version = "0.20.4" }
|
||||
solana-drone = { path = "../drone", version = "0.20.4" }
|
||||
solana-exchange-api = { path = "../programs/exchange_api", version = "0.20.4" }
|
||||
solana-exchange-program = { path = "../programs/exchange_program", version = "0.20.4" }
|
||||
solana-genesis-programs = { path = "../genesis_programs", version = "0.20.4" }
|
||||
solana-ledger = { path = "../ledger", version = "0.20.4" }
|
||||
solana-logger = { path = "../logger", version = "0.20.4" }
|
||||
solana-move-loader-api = { path = "../programs/move_loader_api", version = "0.20.4", optional = true }
|
||||
solana-move-loader-program = { path = "../programs/move_loader_program", version = "0.20.4", optional = true }
|
||||
solana-runtime = { path = "../runtime", version = "0.20.4" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.4" }
|
||||
solana-stake-api = { path = "../programs/stake_api", version = "0.20.4" }
|
||||
solana-storage-api = { path = "../programs/storage_api", version = "0.20.4" }
|
||||
solana-storage-program = { path = "../programs/storage_program", version = "0.20.4" }
|
||||
solana-vest-api = { path = "../programs/vest_api", version = "0.20.4" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.20.4" }
|
||||
symlink = "0.1.0"
|
||||
tempfile = "3.1.0"
|
||||
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "0.20.3" }
|
||||
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "0.20.4" }
|
||||
|
||||
[dev-dependencies]
|
||||
serial_test = "0.2.0"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-logger"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana Logger"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
|
@@ -1,7 +1,7 @@
|
||||
[package]
|
||||
name = "solana-measure"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
documentation = "https://docs.rs/solana"
|
||||
homepage = "https://solana.com/"
|
||||
readme = "../README.md"
|
||||
@@ -11,4 +11,4 @@ license = "Apache-2.0"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../sdk", version = "0.20.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.4" }
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-merkle-tree"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana Merkle Tree"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -9,7 +9,7 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../sdk", version = "0.20.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.4" }
|
||||
|
||||
[dev-dependencies]
|
||||
hex = "0.4.0"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-metrics"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana Metrics"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -13,7 +13,7 @@ env_logger = "0.7.1"
|
||||
lazy_static = "1.4.0"
|
||||
log = "0.4.8"
|
||||
reqwest = { version = "0.9.22", default-features = false, features = ["rustls-tls"] }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.4" }
|
||||
sys-info = "0.5.8"
|
||||
|
||||
[dev-dependencies]
|
||||
|
@@ -4083,11 +4083,11 @@
|
||||
"rgba(237, 129, 40, 0.89)",
|
||||
"rgba(50, 172, 45, 0.97)"
|
||||
],
|
||||
"decimals": 2,
|
||||
"decimals": 0,
|
||||
"pattern": "/.*/",
|
||||
"thresholds": [],
|
||||
"type": "number",
|
||||
"unit": "short"
|
||||
"unit": "none"
|
||||
}
|
||||
],
|
||||
"targets": [
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-netutil"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana Network Utilities"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -18,7 +18,7 @@ rand = "0.6.1"
|
||||
serde = "1.0.101"
|
||||
serde_derive = "1.0.101"
|
||||
socket2 = "0.3.11"
|
||||
solana-logger = { path = "../logger", version = "0.20.3" }
|
||||
solana-logger = { path = "../logger", version = "0.20.4" }
|
||||
tokio = "0.1"
|
||||
tokio-codec = "0.1"
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
[package]
|
||||
name = "solana-bpf-programs"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
documentation = "https://docs.rs/solana"
|
||||
homepage = "https://solana.com/"
|
||||
readme = "README.md"
|
||||
@@ -22,10 +22,10 @@ walkdir = "2"
|
||||
bincode = "1.1.4"
|
||||
byteorder = "1.3.2"
|
||||
elf = "0.0.10"
|
||||
solana-bpf-loader-api = { path = "../bpf_loader_api", version = "0.20.3" }
|
||||
solana-logger = { path = "../../logger", version = "0.20.3" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.20.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.3" }
|
||||
solana-bpf-loader-api = { path = "../bpf_loader_api", version = "0.20.4" }
|
||||
solana-logger = { path = "../../logger", version = "0.20.4" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.20.4" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.4" }
|
||||
solana_rbpf = "=0.1.19"
|
||||
|
||||
[[bench]]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-128bit"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana BPF test program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -12,11 +12,11 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../../../sdk/", version = "0.20.3", default-features = false }
|
||||
solana-bpf-rust-128bit-dep = { path = "../128bit_dep", version = "0.20.3" }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "0.20.4", default-features = false }
|
||||
solana-bpf-rust-128bit-dep = { path = "../128bit_dep", version = "0.20.4" }
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.3" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.4" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-128bit-dep"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana BPF test program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../../../sdk/", version = "0.20.3", default-features = false }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "0.20.4", default-features = false }
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.3" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.4" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-alloc"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana BPF test program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../../../sdk/", version = "0.20.3", default-features = false }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "0.20.4", default-features = false }
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.3" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.4" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-dep-crate"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana BPF test program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -13,10 +13,10 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
byteorder = { version = "1", default-features = false }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "0.20.3", default-features = false }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "0.20.4", default-features = false }
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.3" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.4" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-external-spend"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana BPF test program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../../../sdk/", version = "0.20.3", default-features = false }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "0.20.4", default-features = false }
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.3" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.4" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-iter"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana BPF test program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../../../sdk/", version = "0.20.3", default-features = false }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "0.20.4", default-features = false }
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.3" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.4" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-many-args"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana BPF test program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -12,11 +12,11 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../../../sdk/", version = "0.20.3", default-features = false }
|
||||
solana-bpf-rust-many-args-dep = { path = "../many_args_dep", version = "0.20.3" }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "0.20.4", default-features = false }
|
||||
solana-bpf-rust-many-args-dep = { path = "../many_args_dep", version = "0.20.4" }
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.3" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.4" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-many-args-dep"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana BPF test program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../../../sdk/", version = "0.20.3", default-features = false }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "0.20.4", default-features = false }
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.3" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.4" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-noop"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana BPF test program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../../../sdk/", version = "0.20.3", default-features = false }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "0.20.4", default-features = false }
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.3" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.4" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-panic"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana BPF test program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../../../sdk/", version = "0.20.3", default-features = false }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "0.20.4", default-features = false }
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.3" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.4" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-param-passing"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana BPF test program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -12,11 +12,11 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../../../sdk/", version = "0.20.3", default-features = false }
|
||||
solana-bpf-rust-param-passing-dep = { path = "../param_passing_dep", version = "0.20.3" }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "0.20.4", default-features = false }
|
||||
solana-bpf-rust-param-passing-dep = { path = "../param_passing_dep", version = "0.20.4" }
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.3" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.4" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-param-passing-dep"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana BPF program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../../../sdk/", version = "0.20.3", default-features = false }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "0.20.4", default-features = false }
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.3" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.4" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
[package]
|
||||
name = "solana-bpf-rust-sysval"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana BPF test program written in Rust"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../../../../sdk/", version = "0.20.3", default-features = false }
|
||||
solana-sdk = { path = "../../../../sdk/", version = "0.20.4", default-features = false }
|
||||
|
||||
[dev_dependencies]
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.3" }
|
||||
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.4" }
|
||||
|
||||
[features]
|
||||
program = ["solana-sdk/program"]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-bpf-loader-api"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana BPF Loader"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -14,8 +14,8 @@ byteorder = "1.3.2"
|
||||
libc = "0.2.65"
|
||||
log = "0.4.8"
|
||||
serde = "1.0.101"
|
||||
solana-logger = { path = "../../logger", version = "0.20.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.3" }
|
||||
solana-logger = { path = "../../logger", version = "0.20.4" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.4" }
|
||||
solana_rbpf = "=0.1.19"
|
||||
|
||||
[lib]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-bpf-loader-program"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana BPF Loader"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -10,9 +10,9 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
log = "0.4.8"
|
||||
solana-logger = { path = "../../logger", version = "0.20.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.3" }
|
||||
solana-bpf-loader-api = { path = "../bpf_loader_api", version = "0.20.3" }
|
||||
solana-logger = { path = "../../logger", version = "0.20.4" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.4" }
|
||||
solana-bpf-loader-api = { path = "../bpf_loader_api", version = "0.20.4" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib", "cdylib"]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-btc-spv-api"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana Bitcoin spv parsing program api"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -16,7 +16,7 @@ num-derive = "0.3"
|
||||
num-traits = "0.2"
|
||||
serde = "1.0.101"
|
||||
serde_derive = "1.0.101"
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.3"}
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.4"}
|
||||
hex = "0.3.2"
|
||||
|
||||
[lib]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "btc_spv_bin"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana Bitcoin spv parsing program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-bitcoin-spv-program"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana Bitcoin spv parsing program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -16,8 +16,8 @@ num-derive = "0.3"
|
||||
num-traits = "0.2"
|
||||
serde = "1.0.101"
|
||||
serde_derive = "1.0.101"
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.3"}
|
||||
solana-btc-spv-api = { path = "../btc_spv_api", version = "0.20.3"}
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.4"}
|
||||
solana-btc-spv-api = { path = "../btc_spv_api", version = "0.20.4"}
|
||||
|
||||
|
||||
[lib]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-budget-api"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana Budget program API"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -16,10 +16,10 @@ num-derive = "0.3"
|
||||
num-traits = "0.2"
|
||||
serde = "1.0.101"
|
||||
serde_derive = "1.0.101"
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.4" }
|
||||
|
||||
[dev-dependencies]
|
||||
solana-runtime = { path = "../../runtime", version = "0.20.3" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.20.4" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib"]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-budget-program"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana budget program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -10,9 +10,9 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
log = "0.4.8"
|
||||
solana-budget-api = { path = "../budget_api", version = "0.20.3" }
|
||||
solana-logger = { path = "../../logger", version = "0.20.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.3" }
|
||||
solana-budget-api = { path = "../budget_api", version = "0.20.4" }
|
||||
solana-logger = { path = "../../logger", version = "0.20.4" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.4" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib", "cdylib"]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-config-api"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "config program API"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -13,7 +13,7 @@ bincode = "1.2.0"
|
||||
log = "0.4.8"
|
||||
serde = "1.0.101"
|
||||
serde_derive = "1.0.101"
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.4" }
|
||||
|
||||
|
||||
[lib]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-config-program"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "config program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -10,9 +10,9 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
log = "0.4.8"
|
||||
solana-config-api = { path = "../config_api", version = "0.20.3" }
|
||||
solana-logger = { path = "../../logger", version = "0.20.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.3" }
|
||||
solana-config-api = { path = "../config_api", version = "0.20.4" }
|
||||
solana-logger = { path = "../../logger", version = "0.20.4" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.4" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib", "cdylib"]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-config-tests"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana config api tests"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -13,12 +13,12 @@ bincode = "1.2.0"
|
||||
log = "0.4.8"
|
||||
serde = "1.0.101"
|
||||
serde_derive = "1.0.101"
|
||||
solana-logger = { path = "../../logger", version = "0.20.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.3" }
|
||||
solana-config-api = { path = "../config_api", version = "0.20.3" }
|
||||
solana-config-program = { path = "../config_program", version = "0.20.3" }
|
||||
solana-logger = { path = "../../logger", version = "0.20.4" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.4" }
|
||||
solana-config-api = { path = "../config_api", version = "0.20.4" }
|
||||
solana-config-program = { path = "../config_program", version = "0.20.4" }
|
||||
|
||||
|
||||
[dev-dependencies]
|
||||
solana-runtime = { path = "../../runtime", version = "0.20.3" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.20.4" }
|
||||
assert_matches = "1.3.0"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-exchange-api"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana Exchange program API"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -13,12 +13,12 @@ bincode = "1.2.0"
|
||||
log = "0.4.8"
|
||||
serde = "1.0.101"
|
||||
serde_derive = "1.0.101"
|
||||
solana-logger = { path = "../../logger", version = "0.20.3" }
|
||||
solana-metrics = { path = "../../metrics", version = "0.20.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.3" }
|
||||
solana-logger = { path = "../../logger", version = "0.20.4" }
|
||||
solana-metrics = { path = "../../metrics", version = "0.20.4" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.4" }
|
||||
|
||||
[dev-dependencies]
|
||||
solana-runtime = { path = "../../runtime", version = "0.20.3" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.20.4" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib"]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-exchange-program"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana exchange program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -10,9 +10,9 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
log = "0.4.8"
|
||||
solana-exchange-api = { path = "../exchange_api", version = "0.20.3" }
|
||||
solana-logger = { path = "../../logger", version = "0.20.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.3" }
|
||||
solana-exchange-api = { path = "../exchange_api", version = "0.20.4" }
|
||||
solana-logger = { path = "../../logger", version = "0.20.4" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.4" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib", "cdylib"]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-failure-program"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana failure program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -10,10 +10,10 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
log = "0.4.8"
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.4" }
|
||||
|
||||
[dev-dependencies]
|
||||
solana-runtime = { path = "../../runtime", version = "0.20.3" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.20.4" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["cdylib"]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-librapay-api"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana Libra Payment"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -11,12 +11,12 @@ edition = "2018"
|
||||
[dependencies]
|
||||
bincode = "1.2.0"
|
||||
log = "0.4.8"
|
||||
solana-logger = { path = "../../logger", version = "0.20.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.3" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.20.3" }
|
||||
solana-logger = { path = "../../logger", version = "0.20.4" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.4" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.20.4" }
|
||||
types = { version = "0.0.1-sol4", package = "solana_libra_types" }
|
||||
language_e2e_tests = { version = "0.0.1-sol4", package = "solana_libra_language_e2e_tests" }
|
||||
solana-move-loader-api = { path = "../move_loader_api", version = "0.20.3" }
|
||||
solana-move-loader-api = { path = "../move_loader_api", version = "0.20.4" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib"]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-move-loader-api"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana Move Loader"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -18,8 +18,8 @@ serde = "1.0.101"
|
||||
serde_bytes = "0.11"
|
||||
serde_derive = "1.0.101"
|
||||
serde_json = "1.0.41"
|
||||
solana-logger = { path = "../../logger", version = "0.20.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.3" }
|
||||
solana-logger = { path = "../../logger", version = "0.20.4" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.4" }
|
||||
|
||||
bytecode_verifier = { version = "0.0.1-sol4", package = "solana_libra_bytecode_verifier" }
|
||||
canonical_serialization = { version = "0.0.1-sol4", package = "solana_libra_canonical_serialization" }
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-move-loader-program"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana Move Loader"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -10,9 +10,9 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
log = "0.4.8"
|
||||
solana-logger = { path = "../../logger", version = "0.20.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.3" }
|
||||
solana-move-loader-api = { path = "../move_loader_api", version = "0.20.3" }
|
||||
solana-logger = { path = "../../logger", version = "0.20.4" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.4" }
|
||||
solana-move-loader-api = { path = "../move_loader_api", version = "0.20.4" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib", "cdylib"]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-noop-program"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana noop program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -10,8 +10,8 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
log = "0.4.8"
|
||||
solana-logger = { path = "../../logger", version = "0.20.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.3" }
|
||||
solana-logger = { path = "../../logger", version = "0.20.4" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.4" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["cdylib"]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-stake-api"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana Stake program API"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -16,11 +16,11 @@ num-traits = "0.2"
|
||||
rand = "0.6.5"
|
||||
serde = "1.0.101"
|
||||
serde_derive = "1.0.101"
|
||||
solana-logger = { path = "../../logger", version = "0.20.3" }
|
||||
solana-metrics = { path = "../../metrics", version = "0.20.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.3" }
|
||||
solana-vote-api = { path = "../vote_api", version = "0.20.3" }
|
||||
solana-config-api = { path = "../config_api", version = "0.20.3" }
|
||||
solana-logger = { path = "../../logger", version = "0.20.4" }
|
||||
solana-metrics = { path = "../../metrics", version = "0.20.4" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.4" }
|
||||
solana-vote-api = { path = "../vote_api", version = "0.20.4" }
|
||||
solana-config-api = { path = "../config_api", version = "0.20.4" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib"]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-stake-program"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana stake program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -10,9 +10,9 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
log = "0.4.8"
|
||||
solana-logger = { path = "../../logger", version = "0.20.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.3" }
|
||||
solana-stake-api = { path = "../stake_api", version = "0.20.3" }
|
||||
solana-logger = { path = "../../logger", version = "0.20.4" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.4" }
|
||||
solana-stake-api = { path = "../stake_api", version = "0.20.4" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib", "cdylib"]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-stake-tests"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana stake api tests"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -10,12 +10,12 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
log = "0.4.8"
|
||||
solana-logger = { path = "../../logger", version = "0.20.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.3" }
|
||||
solana-stake-api = { path = "../stake_api", version = "0.20.3" }
|
||||
solana-stake-program = { path = "../stake_program", version = "0.20.3" }
|
||||
solana-vote-api = { path = "../vote_api", version = "0.20.3" }
|
||||
solana-logger = { path = "../../logger", version = "0.20.4" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.4" }
|
||||
solana-stake-api = { path = "../stake_api", version = "0.20.4" }
|
||||
solana-stake-program = { path = "../stake_program", version = "0.20.4" }
|
||||
solana-vote-api = { path = "../vote_api", version = "0.20.4" }
|
||||
|
||||
[dev-dependencies]
|
||||
solana-runtime = { path = "../../runtime", version = "0.20.3" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.20.4" }
|
||||
assert_matches = "1.3.0"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-storage-api"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana Storage program API"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -17,8 +17,8 @@ num-derive = "0.3"
|
||||
num-traits = "0.2"
|
||||
serde = "1.0.101"
|
||||
serde_derive = "1.0.101"
|
||||
solana-logger = { path = "../../logger", version = "0.20.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.3" }
|
||||
solana-logger = { path = "../../logger", version = "0.20.4" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.4" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib"]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-storage-program"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana storage program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -10,12 +10,12 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
log = "0.4.8"
|
||||
solana-logger = { path = "../../logger", version = "0.20.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.3" }
|
||||
solana-storage-api = { path = "../storage_api", version = "0.20.3" }
|
||||
solana-logger = { path = "../../logger", version = "0.20.4" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.4" }
|
||||
solana-storage-api = { path = "../storage_api", version = "0.20.4" }
|
||||
|
||||
[dev-dependencies]
|
||||
solana-runtime = { path = "../../runtime", version = "0.20.3" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.20.4" }
|
||||
assert_matches = "1.3.0"
|
||||
bincode = "1.2.0"
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-vest-api"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana Vest program API"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -16,11 +16,11 @@ num-derive = "0.2"
|
||||
num-traits = "0.2"
|
||||
serde = "1.0.100"
|
||||
serde_derive = "1.0.100"
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.3" }
|
||||
solana-config-api = { path = "../config_api", version = "0.20.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.4" }
|
||||
solana-config-api = { path = "../config_api", version = "0.20.4" }
|
||||
|
||||
[dev-dependencies]
|
||||
solana-runtime = { path = "../../runtime", version = "0.20.3" }
|
||||
solana-runtime = { path = "../../runtime", version = "0.20.4" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib"]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-vest-program"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana Vest program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -10,9 +10,9 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
log = "0.4.8"
|
||||
solana-logger = { path = "../../logger", version = "0.20.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.3" }
|
||||
solana-vest-api = { path = "../vest_api", version = "0.20.3" }
|
||||
solana-logger = { path = "../../logger", version = "0.20.4" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.4" }
|
||||
solana-vest-api = { path = "../vest_api", version = "0.20.4" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib", "cdylib"]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-vote-api"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana Vote program API"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -15,9 +15,9 @@ num-derive = "0.3"
|
||||
num-traits = "0.2"
|
||||
serde = "1.0.101"
|
||||
serde_derive = "1.0.101"
|
||||
solana-logger = { path = "../../logger", version = "0.20.3" }
|
||||
solana-metrics = { path = "../../metrics", version = "0.20.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.3" }
|
||||
solana-logger = { path = "../../logger", version = "0.20.4" }
|
||||
solana-metrics = { path = "../../metrics", version = "0.20.4" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.4" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib"]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-vote-program"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana Vote program"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -10,9 +10,9 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
log = "0.4.8"
|
||||
solana-logger = { path = "../../logger", version = "0.20.3" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.3" }
|
||||
solana-vote-api = { path = "../vote_api", version = "0.20.3" }
|
||||
solana-logger = { path = "../../logger", version = "0.20.4" }
|
||||
solana-sdk = { path = "../../sdk", version = "0.20.4" }
|
||||
solana-vote-api = { path = "../vote_api", version = "0.20.4" }
|
||||
|
||||
[lib]
|
||||
crate-type = ["lib", "cdylib"]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-rayon-threadlimit"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "solana-rayon-threadlimit"
|
||||
homepage = "https://solana.com/"
|
||||
readme = "../README.md"
|
||||
|
1
run.sh
1
run.sh
@@ -90,6 +90,7 @@ args=(
|
||||
--rpc-port 8899
|
||||
--rpc-drone-address 127.0.0.1:9900
|
||||
--accounts "$dataDir"/accounts
|
||||
--log -
|
||||
)
|
||||
if [[ -n $blockstreamSocket ]]; then
|
||||
args+=(--blockstream "$blockstreamSocket")
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-runtime"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana runtime"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -24,20 +24,20 @@ rayon = "1.2.0"
|
||||
serde = { version = "1.0.101", features = ["rc"] }
|
||||
serde_derive = "1.0.101"
|
||||
serde_json = "1.0.41"
|
||||
solana-logger = { path = "../logger", version = "0.20.3" }
|
||||
solana-measure = { path = "../measure", version = "0.20.3" }
|
||||
solana-metrics = { path = "../metrics", version = "0.20.3" }
|
||||
solana-bpf-loader-api = { path = "../programs/bpf_loader_api", version = "0.20.3" }
|
||||
solana-bpf-loader-program = { path = "../programs/bpf_loader_program", version = "0.20.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.3" }
|
||||
solana-stake-api = { path = "../programs/stake_api", version = "0.20.3" }
|
||||
solana-stake-program = { path = "../programs/stake_program", version = "0.20.3" }
|
||||
solana-storage-api = { path = "../programs/storage_api", version = "0.20.3" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.20.3" }
|
||||
solana-vote-program = { path = "../programs/vote_program", version = "0.20.3" }
|
||||
solana-logger = { path = "../logger", version = "0.20.4" }
|
||||
solana-measure = { path = "../measure", version = "0.20.4" }
|
||||
solana-metrics = { path = "../metrics", version = "0.20.4" }
|
||||
solana-bpf-loader-api = { path = "../programs/bpf_loader_api", version = "0.20.4" }
|
||||
solana-bpf-loader-program = { path = "../programs/bpf_loader_program", version = "0.20.4" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.4" }
|
||||
solana-stake-api = { path = "../programs/stake_api", version = "0.20.4" }
|
||||
solana-stake-program = { path = "../programs/stake_program", version = "0.20.4" }
|
||||
solana-storage-api = { path = "../programs/storage_api", version = "0.20.4" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.20.4" }
|
||||
solana-vote-program = { path = "../programs/vote_program", version = "0.20.4" }
|
||||
sys-info = "0.5.8"
|
||||
tempfile = "3.1.0"
|
||||
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "0.20.3" }
|
||||
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "0.20.4" }
|
||||
itertools = "0.8.0"
|
||||
|
||||
[lib]
|
||||
@@ -45,4 +45,4 @@ crate-type = ["lib"]
|
||||
name = "solana_runtime"
|
||||
|
||||
[dev-dependencies]
|
||||
solana-noop-program = { path = "../programs/noop_program", version = "0.20.3" }
|
||||
solana-noop-program = { path = "../programs/noop_program", version = "0.20.4" }
|
||||
|
@@ -810,15 +810,20 @@ impl Bank {
|
||||
// TODO: put this assert back in
|
||||
// assert!(!self.is_frozen());
|
||||
inc_new_counter_debug!("bank-register_tick-registered", 1);
|
||||
// Grab blockhash lock before incrementing tick height so that replay stage does
|
||||
// not attempt to freeze after observing the last tick and before blockhash is
|
||||
// updated
|
||||
let mut w_blockhash_queue = self.blockhash_queue.write().unwrap();
|
||||
let current_tick_height = self.tick_height.fetch_add(1, Ordering::Relaxed) as u64;
|
||||
if current_tick_height % self.ticks_per_slot == self.ticks_per_slot - 1 {
|
||||
self.blockhash_queue
|
||||
.write()
|
||||
.unwrap()
|
||||
.register_hash(hash, &self.fee_calculator);
|
||||
if self.is_block_boundary(current_tick_height + 1) {
|
||||
w_blockhash_queue.register_hash(hash, &self.fee_calculator);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_block_boundary(&self, tick_height: u64) -> bool {
|
||||
tick_height % self.ticks_per_slot == 0
|
||||
}
|
||||
|
||||
/// Process a Transaction. This is used for unit tests and simply calls the vector
|
||||
/// Bank::process_transactions method, and commits credit-only credits.
|
||||
pub fn process_transaction(&self, tx: &Transaction) -> Result<()> {
|
||||
|
41
runtime/tests/bank.rs
Normal file
41
runtime/tests/bank.rs
Normal file
@@ -0,0 +1,41 @@
|
||||
use solana_runtime::bank::Bank;
|
||||
use solana_sdk::genesis_block::create_genesis_block;
|
||||
use solana_sdk::hash::hash;
|
||||
use solana_sdk::pubkey::Pubkey;
|
||||
use std::sync::Arc;
|
||||
use std::thread::Builder;
|
||||
|
||||
#[test]
|
||||
fn test_race_register_tick_freeze() {
|
||||
solana_logger::setup();
|
||||
|
||||
let (mut genesis_block, _) = create_genesis_block(50);
|
||||
genesis_block.ticks_per_slot = 1;
|
||||
let p = Pubkey::new_rand();
|
||||
let hash = hash(p.as_ref());
|
||||
|
||||
for _ in 0..1000 {
|
||||
let bank0 = Arc::new(Bank::new(&genesis_block));
|
||||
let bank0_ = bank0.clone();
|
||||
let freeze_thread = Builder::new()
|
||||
.name("freeze".to_string())
|
||||
.spawn(move || loop {
|
||||
if bank0_.tick_height() == bank0_.max_tick_height() {
|
||||
assert_eq!(bank0_.last_blockhash(), hash);
|
||||
break;
|
||||
}
|
||||
})
|
||||
.unwrap();
|
||||
|
||||
let bank0_ = bank0.clone();
|
||||
let register_tick_thread = Builder::new()
|
||||
.name("register_tick".to_string())
|
||||
.spawn(move || {
|
||||
bank0_.register_tick(&hash);
|
||||
})
|
||||
.unwrap();
|
||||
|
||||
register_tick_thread.join().unwrap();
|
||||
freeze_thread.join().unwrap();
|
||||
}
|
||||
}
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-sdk-c"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana SDK C"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -18,7 +18,7 @@ bs58 = "0.3.0"
|
||||
libc = "0.2.65"
|
||||
rand_chacha = "0.1.1"
|
||||
rand_core = { version = ">=0.2, <0.4", default-features = false }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.4" }
|
||||
solana-ed25519-dalek = "0.2.0"
|
||||
|
||||
[build-dependencies]
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-sdk"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana SDK"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -49,6 +49,6 @@ serde_derive = "1.0.101"
|
||||
serde_json = { version = "1.0.41", optional = true }
|
||||
sha2 = "0.8.0"
|
||||
solana-ed25519-dalek = { version = "0.2.0", optional = true }
|
||||
solana-logger = { path = "../logger", version = "0.20.3", optional = true }
|
||||
solana-logger = { path = "../logger", version = "0.20.4", optional = true }
|
||||
untrusted = { version = "0.7.0", optional = true }
|
||||
solana-crate-features = { path = "../crate-features", version = "0.20.3", optional = true }
|
||||
solana-crate-features = { path = "../crate-features", version = "0.20.4", optional = true }
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-sdk-bpf-test"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Solana BPF SDK test utilities"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "solana-upload-perf"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
description = "Metrics Upload Utility"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
@@ -12,7 +12,7 @@ publish = false
|
||||
[dependencies]
|
||||
log = "0.4.8"
|
||||
serde_json = "1.0.41"
|
||||
solana-metrics = { path = "../metrics", version = "0.20.3" }
|
||||
solana-metrics = { path = "../metrics", version = "0.20.4" }
|
||||
|
||||
[[bin]]
|
||||
name = "solana-upload-perf"
|
||||
|
@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
edition = "2018"
|
||||
name = "solana-validator"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "0.20.3"
|
||||
version = "0.20.4"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
license = "Apache-2.0"
|
||||
homepage = "https://solana.com/"
|
||||
@@ -17,17 +17,17 @@ log = "0.4.8"
|
||||
indicatif = "0.12.0"
|
||||
reqwest = { version = "0.9.22", default-features = false }
|
||||
serde_json = "1.0.41"
|
||||
solana-client = { path = "../client", version = "0.20.3" }
|
||||
solana-core = { path = "../core", version = "0.20.3" }
|
||||
solana-drone = { path = "../drone", version = "0.20.3" }
|
||||
solana-ledger = { path = "../ledger", version = "0.20.3" }
|
||||
solana-logger = { path = "../logger", version = "0.20.3" }
|
||||
solana-metrics = { path = "../metrics", version = "0.20.3" }
|
||||
solana-netutil = { path = "../netutil", version = "0.20.3" }
|
||||
solana-runtime = { path = "../runtime", version = "0.20.3" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.3" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.20.3" }
|
||||
solana-vote-signer = { path = "../vote-signer", version = "0.20.3" }
|
||||
solana-client = { path = "../client", version = "0.20.4" }
|
||||
solana-core = { path = "../core", version = "0.20.4" }
|
||||
solana-drone = { path = "../drone", version = "0.20.4" }
|
||||
solana-ledger = { path = "../ledger", version = "0.20.4" }
|
||||
solana-logger = { path = "../logger", version = "0.20.4" }
|
||||
solana-metrics = { path = "../metrics", version = "0.20.4" }
|
||||
solana-netutil = { path = "../netutil", version = "0.20.4" }
|
||||
solana-runtime = { path = "../runtime", version = "0.20.4" }
|
||||
solana-sdk = { path = "../sdk", version = "0.20.4" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.20.4" }
|
||||
solana-vote-signer = { path = "../vote-signer", version = "0.20.4" }
|
||||
tempfile = "3.1.0"
|
||||
tar = "0.4.26"
|
||||
|
||||
|
@@ -539,7 +539,7 @@ pub fn main() {
|
||||
let default_logfile = format!(
|
||||
"solana-validator-{}-{}.log",
|
||||
identity_keypair.pubkey(),
|
||||
chrono::Local::now().to_rfc3339()
|
||||
chrono::Utc::now().format("%Y%m%d-%H%M%S")
|
||||
);
|
||||
let logfile = matches.value_of("logfile").unwrap_or(&default_logfile);
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user