Compare commits

..

12 Commits

Author SHA1 Message Date
mergify[bot]
0e3dc27c8d Move move tests into its own job (#6847) (#6848)
automerge
2019-11-08 20:16:51 -08:00
mergify[bot]
d0d8ac7eba Fix freeze and register_tick race (#6799) (#6846)
automerge
2019-11-08 18:24:59 -08:00
mergify[bot]
b414d151b8 Replay should respect order of register_ticks with respect to blockhashes (bp #6805) (#6824)
* Replay should respect order of register_ticks with respect to blockhashes (#6805)

(cherry picked from commit 66a0f54097)

* Remove merge conflict
2019-11-08 18:35:50 -07:00
Pankaj Garg
5766359cde [V0.20] Cherry pick from master branch (#6842)
automerge
2019-11-08 16:19:48 -08:00
mergify[bot]
b8ec5de36d run.sh logs validators to stderr (#6817) (#6826)
automerge
2019-11-08 13:13:34 -08:00
mergify[bot]
28ba9e2fa8 Add new fork log message for when the node is leader for consistency (#6808) (#6825)
(cherry picked from commit b800642fa4)
2019-11-08 13:59:10 -07:00
mergify[bot]
80d780d666 Upgrade Repair be more intelligent and agressive (bp #6789) (#6793)
automerge
2019-11-07 21:36:53 -08:00
mergify[bot]
e599a90333 Increase FEC ratio to 32:32 (#6800) (#6804)
automerge
2019-11-07 17:20:22 -08:00
mergify[bot]
efb8b6bf2f Avoid : in default log filename (#6796) (#6798)
automerge
2019-11-07 15:17:47 -08:00
Michael Vines
ea3eddfec4 Cargo.lock 2019-11-07 09:12:00 -07:00
Michael Vines
3a6857c749 Fix units on dead slots graph 2019-11-07 08:26:41 -07:00
Michael Vines
0efb12bb6b Update version to 0.20.4 2019-11-06 23:18:35 -07:00
101 changed files with 1137 additions and 874 deletions

628
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -2,7 +2,7 @@
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-archiver" name = "solana-archiver"
version = "0.20.3" version = "0.20.4"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@@ -10,9 +10,9 @@ homepage = "https://solana.com/"
[dependencies] [dependencies]
clap = "2.33.0" clap = "2.33.0"
console = "0.9.0" console = "0.9.0"
solana-core = { path = "../core", version = "0.20.3" } solana-core = { path = "../core", version = "0.20.4" }
solana-logger = { path = "../logger", version = "0.20.3" } solana-logger = { path = "../logger", version = "0.20.4" }
solana-metrics = { path = "../metrics", version = "0.20.3" } solana-metrics = { path = "../metrics", version = "0.20.4" }
solana-netutil = { path = "../netutil", version = "0.20.3" } solana-netutil = { path = "../netutil", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.3" } solana-sdk = { path = "../sdk", version = "0.20.4" }

View File

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

View File

@@ -2,7 +2,7 @@
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-bench-exchange" name = "solana-bench-exchange"
version = "0.20.3" version = "0.20.4"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@@ -24,16 +24,16 @@ serde_derive = "1.0.101"
serde_json = "1.0.41" serde_json = "1.0.41"
serde_yaml = "0.8.11" serde_yaml = "0.8.11"
# solana-runtime = { path = "../solana/runtime"} # solana-runtime = { path = "../solana/runtime"}
solana-core = { path = "../core", version = "0.20.3" } solana-core = { path = "../core", version = "0.20.4" }
solana-genesis = { path = "../genesis", version = "0.20.3" } solana-genesis = { path = "../genesis", version = "0.20.4" }
solana-client = { path = "../client", version = "0.20.3" } solana-client = { path = "../client", version = "0.20.4" }
solana-drone = { path = "../drone", version = "0.20.3" } solana-drone = { path = "../drone", version = "0.20.4" }
solana-exchange-api = { path = "../programs/exchange_api", version = "0.20.3" } solana-exchange-api = { path = "../programs/exchange_api", version = "0.20.4" }
solana-exchange-program = { path = "../programs/exchange_program", version = "0.20.3" } solana-exchange-program = { path = "../programs/exchange_program", version = "0.20.4" }
solana-logger = { path = "../logger", version = "0.20.3" } solana-logger = { path = "../logger", version = "0.20.4" }
solana-metrics = { path = "../metrics", version = "0.20.3" } solana-metrics = { path = "../metrics", version = "0.20.4" }
solana-netutil = { path = "../netutil", version = "0.20.3" } solana-netutil = { path = "../netutil", version = "0.20.4" }
solana-runtime = { path = "../runtime", version = "0.20.3" } solana-runtime = { path = "../runtime", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.3" } solana-sdk = { path = "../sdk", version = "0.20.4" }
untrusted = "0.7.0" untrusted = "0.7.0"
ws = "0.9.1" ws = "0.9.1"

View File

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

View File

@@ -2,7 +2,7 @@
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-bench-tps" name = "solana-bench-tps"
version = "0.20.3" version = "0.20.4"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@@ -16,19 +16,19 @@ serde = "1.0.101"
serde_derive = "1.0.101" serde_derive = "1.0.101"
serde_json = "1.0.41" serde_json = "1.0.41"
serde_yaml = "0.8.11" serde_yaml = "0.8.11"
solana-core = { path = "../core", version = "0.20.3" } solana-core = { path = "../core", version = "0.20.4" }
solana-genesis = { path = "../genesis", version = "0.20.3" } solana-genesis = { path = "../genesis", version = "0.20.4" }
solana-client = { path = "../client", version = "0.20.3" } solana-client = { path = "../client", version = "0.20.4" }
solana-drone = { path = "../drone", version = "0.20.3" } solana-drone = { path = "../drone", version = "0.20.4" }
solana-librapay-api = { path = "../programs/librapay_api", version = "0.20.3", optional = true } solana-librapay-api = { path = "../programs/librapay_api", version = "0.20.4", optional = true }
solana-logger = { path = "../logger", version = "0.20.3" } solana-logger = { path = "../logger", version = "0.20.4" }
solana-metrics = { path = "../metrics", version = "0.20.3" } solana-metrics = { path = "../metrics", version = "0.20.4" }
solana-measure = { path = "../measure", version = "0.20.3" } solana-measure = { path = "../measure", version = "0.20.4" }
solana-netutil = { path = "../netutil", version = "0.20.3" } solana-netutil = { path = "../netutil", version = "0.20.4" }
solana-runtime = { path = "../runtime", version = "0.20.3" } solana-runtime = { path = "../runtime", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.3" } solana-sdk = { path = "../sdk", version = "0.20.4" }
solana-move-loader-program = { path = "../programs/move_loader_program", version = "0.20.3", optional = true } 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.3", optional = true } solana-move-loader-api = { path = "../programs/move_loader_api", version = "0.20.4", optional = true }
[dev-dependencies] [dev-dependencies]
serial_test = "0.2.0" serial_test = "0.2.0"

View File

@@ -177,7 +177,7 @@ $ solana send-timestamp <PUBKEY> <PROCESS_ID> --date 2018-12-24T23:59:00
## Usage ## Usage
### solana-cli ### solana-cli
```text ```text
solana-cli 0.20.3 solana-cli 0.20.4
Blockchain, Rebuilt for Scale Blockchain, Rebuilt for Scale
USAGE: USAGE:

View File

@@ -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 curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0", "id":1, "method":"getAccountInfo", "params":["2gVkYWexTHR5Hb2aLeQN3tnngvWzisFKXDUPrgMHpdST"]}' http://localhost:8899
// Result // 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 ### getBalance
@@ -729,7 +729,7 @@ Subscribe to an account to receive notifications when the lamports or data for a
#### Notification Format: #### Notification Format:
```bash ```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 ### 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\) * `object` - account info JSON object \(see [getAccountInfo](jsonrpc-api.md#getaccountinfo) for field details\)
```bash ```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 ### programUnsubscribe

View File

@@ -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: The easiest install method for supported platforms:
```bash ```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. 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 ```bash
$ init_args=.... # arguments for `solana-install-init ...` $ 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 ### 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: With a well-known release URL, a pre-built binary can be obtained for supported platforms:
```bash ```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 $ chmod +x ./solana-install-init
$ ./solana-install-init --help $ ./solana-install-init --help
``` ```

View File

@@ -47,7 +47,7 @@ The `solana-install` tool can be used to easily install and upgrade the cluster
#### Linux and mac OS #### Linux and mac OS
```bash ```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: Alternatively build the `solana-install` program from source and run the following command to obtain the same result:

View File

@@ -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. The `solana-install` tool can be used to easily install and upgrade the validator software on Linux x86\_64 and mac OS systems.
```bash ```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: Alternatively build the `solana-install` program from source and run the following command to obtain the same result:

View File

@@ -16,7 +16,7 @@ You can submit a JSON-RPC request to see the specific version of the cluster.
```bash ```bash
curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1, "method":"getVersion"}' edge.testnet.solana.com:8899 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 ## 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. If you are bootstrapping with `solana-install`, you can specify the release tag or named channel to install to match your desired testnet.
```bash ```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 ```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: Similarly, you can add this argument to the `solana-install` command if you've built the program from source:
```bash ```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. If you are downloading pre-compiled binaries or building from source, simply choose the release matching your desired testnet.

View File

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

View File

@@ -7,7 +7,7 @@ steps:
timeout_in_minutes: 5 timeout_in_minutes: 5
- command: ". ci/rust-version.sh; ci/docker-run.sh $$rust_nightly_docker_image ci/test-checks.sh" - command: ". ci/rust-version.sh; ci/docker-run.sh $$rust_nightly_docker_image ci/test-checks.sh"
name: "checks" name: "checks"
timeout_in_minutes: 35 timeout_in_minutes: 20
- wait - wait
- command: "ci/test-stable-perf.sh" - command: "ci/test-stable-perf.sh"
name: "stable-perf" name: "stable-perf"
@@ -17,18 +17,21 @@ steps:
- "queue=cuda" - "queue=cuda"
- command: "ci/test-bench.sh" - command: "ci/test-bench.sh"
name: "bench" 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" - command: ". ci/rust-version.sh; ci/docker-run.sh $$rust_stable_docker_image ci/test-stable.sh"
name: "stable" name: "stable"
timeout_in_minutes: 40 timeout_in_minutes: 40
artifact_paths: "log-*.txt" 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" - command: ". ci/rust-version.sh; ci/docker-run.sh $$rust_stable_docker_image ci/test-local-cluster.sh"
name: "local-cluster" name: "local-cluster"
timeout_in_minutes: 40 timeout_in_minutes: 30
artifact_paths: "log-*.txt" artifact_paths: "log-*.txt"
- command: ". ci/rust-version.sh; ci/docker-run.sh $$rust_nightly_docker_image ci/test-coverage.sh" - command: ". ci/rust-version.sh; ci/docker-run.sh $$rust_nightly_docker_image ci/test-coverage.sh"
name: "coverage" name: "coverage"
timeout_in_minutes: 40 timeout_in_minutes: 30
- wait - wait
- trigger: "solana-secondary" - trigger: "solana-secondary"
branches: "!pull/*" branches: "!pull/*"

1
ci/test-move.sh Symbolic link
View File

@@ -0,0 +1 @@
test-stable.sh

View File

@@ -28,18 +28,13 @@ rm -rf target/xargo # Issue #3105
# Run the appropriate test based on entrypoint # Run the appropriate test based on entrypoint
testName=$(basename "$0" .sh) testName=$(basename "$0" .sh)
echo "Executing $testName"
case $testName in case $testName in
test-stable) test-stable)
echo "Executing $testName"
_ cargo +"$rust_stable" test --all --exclude solana-local-cluster ${V:+--verbose} -- --nocapture _ 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 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) test-stable-perf)
echo "Executing $testName"
ci/affects-files.sh \ ci/affects-files.sh \
.rs$ \ .rs$ \
Cargo.lock$ \ Cargo.lock$ \
@@ -54,7 +49,7 @@ test-stable-perf)
^sdk/ \ ^sdk/ \
|| { || {
annotate --style info \ annotate --style info \
"Skipped test-stable-perf as no relevant files were modified" "Skipped $testName as no relevant files were modified"
exit 0 exit 0
} }
@@ -83,8 +78,30 @@ test-stable-perf)
_ cargo +"$rust_stable" build --bins ${V:+--verbose} _ cargo +"$rust_stable" build --bins ${V:+--verbose}
_ cargo +"$rust_stable" test --package solana-ledger --package solana-core --lib ${V:+--verbose} -- --nocapture _ 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) test-local-cluster)
echo "Executing $testName"
_ cargo +"$rust_stable" build --release --bins ${V:+--verbose} _ cargo +"$rust_stable" build --release --bins ${V:+--verbose}
_ cargo +"$rust_stable" test --release --package solana-local-cluster ${V:+--verbose} -- --nocapture _ cargo +"$rust_stable" test --release --package solana-local-cluster ${V:+--verbose} -- --nocapture
exit 0 exit 0

View File

@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-cli" name = "solana-cli"
description = "Blockchain, Rebuilt for Scale" description = "Blockchain, Rebuilt for Scale"
version = "0.20.3" version = "0.20.4"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@@ -26,23 +26,23 @@ serde = "1.0.101"
serde_derive = "1.0.101" serde_derive = "1.0.101"
serde_json = "1.0.41" serde_json = "1.0.41"
serde_yaml = "0.8.11" serde_yaml = "0.8.11"
solana-budget-api = { path = "../programs/budget_api", version = "0.20.3" } solana-budget-api = { path = "../programs/budget_api", version = "0.20.4" }
solana-client = { path = "../client", version = "0.20.3" } solana-client = { path = "../client", version = "0.20.4" }
solana-config-api = { path = "../programs/config_api", version = "0.20.3" } solana-config-api = { path = "../programs/config_api", version = "0.20.4" }
solana-drone = { path = "../drone", version = "0.20.3" } solana-drone = { path = "../drone", version = "0.20.4" }
solana-logger = { path = "../logger", version = "0.20.3" } solana-logger = { path = "../logger", version = "0.20.4" }
solana-netutil = { path = "../netutil", version = "0.20.3" } solana-netutil = { path = "../netutil", version = "0.20.4" }
solana-runtime = { path = "../runtime", version = "0.20.3" } solana-runtime = { path = "../runtime", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.3" } solana-sdk = { path = "../sdk", version = "0.20.4" }
solana-stake-api = { path = "../programs/stake_api", version = "0.20.3" } solana-stake-api = { path = "../programs/stake_api", version = "0.20.4" }
solana-storage-api = { path = "../programs/storage_api", version = "0.20.3" } solana-storage-api = { path = "../programs/storage_api", version = "0.20.4" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.3" } solana-vote-api = { path = "../programs/vote_api", version = "0.20.4" }
solana-vote-signer = { path = "../vote-signer", version = "0.20.3" } solana-vote-signer = { path = "../vote-signer", version = "0.20.4" }
url = "2.1.0" url = "2.1.0"
[dev-dependencies] [dev-dependencies]
solana-core = { path = "../core", version = "0.20.3" } solana-core = { path = "../core", version = "0.20.4" }
solana-budget-program = { path = "../programs/budget_program", version = "0.20.3" } solana-budget-program = { path = "../programs/budget_program", version = "0.20.4" }
[[bin]] [[bin]]
name = "solana" name = "solana"

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-client" name = "solana-client"
version = "0.20.3" version = "0.20.4"
description = "Solana Client" description = "Solana Client"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -19,10 +19,10 @@ reqwest = { version = "0.9.22", default-features = false, features = ["rustls-tl
serde = "1.0.101" serde = "1.0.101"
serde_derive = "1.0.101" serde_derive = "1.0.101"
serde_json = "1.0.41" serde_json = "1.0.41"
solana-netutil = { path = "../netutil", version = "0.20.3" } solana-netutil = { path = "../netutil", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.3" } solana-sdk = { path = "../sdk", version = "0.20.4" }
[dev-dependencies] [dev-dependencies]
jsonrpc-core = "14.0.3" jsonrpc-core = "14.0.3"
jsonrpc-http-server = "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" }

View File

@@ -1,7 +1,7 @@
[package] [package]
name = "solana-core" name = "solana-core"
description = "Blockchain, Rebuilt for Scale" description = "Blockchain, Rebuilt for Scale"
version = "0.20.3" version = "0.20.4"
documentation = "https://docs.rs/solana" documentation = "https://docs.rs/solana"
homepage = "https://solana.com/" homepage = "https://solana.com/"
readme = "../README.md" readme = "../README.md"
@@ -44,25 +44,25 @@ rayon = "1.2.0"
serde = "1.0.101" serde = "1.0.101"
serde_derive = "1.0.101" serde_derive = "1.0.101"
serde_json = "1.0.41" serde_json = "1.0.41"
solana-budget-api = { path = "../programs/budget_api", 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.3" } solana-budget-program = { path = "../programs/budget_program", version = "0.20.4" }
solana-chacha-sys = { path = "../chacha-sys", version = "0.20.3" } solana-chacha-sys = { path = "../chacha-sys", version = "0.20.4" }
solana-client = { path = "../client", version = "0.20.3" } solana-client = { path = "../client", version = "0.20.4" }
solana-drone = { path = "../drone", version = "0.20.3" } solana-drone = { path = "../drone", version = "0.20.4" }
solana-ed25519-dalek = "0.2.0" solana-ed25519-dalek = "0.2.0"
solana-ledger = { path = "../ledger", version = "0.20.3" } solana-ledger = { path = "../ledger", version = "0.20.4" }
solana-logger = { path = "../logger", version = "0.20.3" } solana-logger = { path = "../logger", version = "0.20.4" }
solana-merkle-tree = { path = "../merkle-tree", version = "0.20.3" } solana-merkle-tree = { path = "../merkle-tree", version = "0.20.4" }
solana-metrics = { path = "../metrics", version = "0.20.3" } solana-metrics = { path = "../metrics", version = "0.20.4" }
solana-measure = { path = "../measure", version = "0.20.3" } solana-measure = { path = "../measure", version = "0.20.4" }
solana-netutil = { path = "../netutil", version = "0.20.3" } solana-netutil = { path = "../netutil", version = "0.20.4" }
solana-runtime = { path = "../runtime", version = "0.20.3" } solana-runtime = { path = "../runtime", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.3" } solana-sdk = { path = "../sdk", version = "0.20.4" }
solana-stake-api = { path = "../programs/stake_api", version = "0.20.3" } solana-stake-api = { path = "../programs/stake_api", version = "0.20.4" }
solana-storage-api = { path = "../programs/storage_api", version = "0.20.3" } solana-storage-api = { path = "../programs/storage_api", version = "0.20.4" }
solana-storage-program = { path = "../programs/storage_program", version = "0.20.3" } solana-storage-program = { path = "../programs/storage_program", version = "0.20.4" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.3" } solana-vote-api = { path = "../programs/vote_api", version = "0.20.4" }
solana-vote-signer = { path = "../vote-signer", version = "0.20.3" } solana-vote-signer = { path = "../vote-signer", version = "0.20.4" }
symlink = "0.1.0" symlink = "0.1.0"
sys-info = "0.5.8" sys-info = "0.5.8"
tempfile = "3.1.0" tempfile = "3.1.0"
@@ -71,7 +71,7 @@ tokio-codec = "0.1"
tokio-fs = "0.1" tokio-fs = "0.1"
tokio-io = "0.1" tokio-io = "0.1"
untrusted = "0.7.0" 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"] } reed-solomon-erasure = { package = "solana-reed-solomon-erasure", version = "4.0.1-3", features = ["simd-accel"] }
[dev-dependencies] [dev-dependencies]

View File

@@ -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 num_ticks = max_ticks_per_n_shreds(1) * num_shreds as u64;
let entries = create_ticks(num_ticks, Hash::default()); let entries = create_ticks(num_ticks, Hash::default());
bencher.iter(|| { 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); 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); let entries = make_large_unchained_entries(txs_per_entry, num_entries);
// 1Mb // 1Mb
bencher.iter(|| { 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); 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_shreds = ((10000 * 1000) + (shred_size - 1)) / shred_size;
let num_ticks = max_ticks_per_n_shreds(1) * num_shreds as u64; let num_ticks = max_ticks_per_n_shreds(1) * num_shreds as u64;
let entries = create_ticks(num_ticks, Hash::default()); 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; let data_shreds = shredder.entries_to_shreds(&entries, true, 0).0;
bencher.iter(|| { bencher.iter(|| {
let raw = &mut Shredder::deshred(&data_shreds).unwrap(); 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) { fn bench_deserialize_hdr(bencher: &mut Bencher) {
let data = vec![0; SIZE_OF_DATA_SHRED_PAYLOAD]; 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(|| { bencher.iter(|| {
let payload = shred.payload.clone(); let payload = shred.payload.clone();

View File

@@ -44,6 +44,7 @@ impl BroadcastRun for BroadcastFakeBlobsRun {
bank.parent().unwrap().slot(), bank.parent().unwrap().slot(),
RECOMMENDED_FEC_RATE, RECOMMENDED_FEC_RATE,
keypair.clone(), keypair.clone(),
(bank.tick_height() % bank.ticks_per_slot()) as u8,
) )
.expect("Expected to create a new shredder"); .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(data_shreds.clone(), None)?;
blocktree.insert_shreds(coding_shreds.clone(), None)?;
// 3) Start broadcast step // 3) Start broadcast step
let peers = cluster_info.read().unwrap().tvu_peers(); let peers = cluster_info.read().unwrap().tvu_peers();

View File

@@ -42,6 +42,7 @@ impl BroadcastRun for FailEntryVerificationBroadcastRun {
bank.parent().unwrap().slot(), bank.parent().unwrap().slot(),
RECOMMENDED_FEC_RATE, RECOMMENDED_FEC_RATE,
keypair.clone(), keypair.clone(),
(bank.tick_height() % bank.ticks_per_slot()) as u8,
) )
.expect("Expected to create a new shredder"); .expect("Expected to create a new shredder");

View File

@@ -2,9 +2,11 @@ use super::broadcast_utils::{self, ReceiveResults};
use super::*; use super::*;
use crate::broadcast_stage::broadcast_utils::UnfinishedSlotInfo; use crate::broadcast_stage::broadcast_utils::UnfinishedSlotInfo;
use solana_ledger::entry::Entry; 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::signature::Keypair;
use solana_sdk::timing::duration_as_us; use solana_sdk::timing::duration_as_us;
use std::collections::HashMap;
use std::time::Duration; use std::time::Duration;
#[derive(Default)] #[derive(Default)]
@@ -14,7 +16,7 @@ struct BroadcastStats {
insert_shreds_elapsed: u64, insert_shreds_elapsed: u64,
broadcast_elapsed: u64, broadcast_elapsed: u64,
receive_elapsed: u64, receive_elapsed: u64,
clone_and_seed_elapsed: u64, seed_elapsed: u64,
} }
impl BroadcastStats { impl BroadcastStats {
@@ -23,7 +25,7 @@ impl BroadcastStats {
self.shredding_elapsed = 0; self.shredding_elapsed = 0;
self.broadcast_elapsed = 0; self.broadcast_elapsed = 0;
self.receive_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 (slot, _) = self.current_slot_and_parent.unwrap();
let mut last_unfinished_slot_shred = self let mut last_unfinished_slot_shred = self
.unfinished_slot .unfinished_slot
@@ -60,6 +62,7 @@ impl StandardBroadcastRun {
None, None,
true, true,
true, true,
max_ticks_in_slot & SHRED_TICK_REFERENCE_MASK,
)) ))
} else { } else {
None None
@@ -76,32 +79,12 @@ impl StandardBroadcastRun {
last_unfinished_slot_shred 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( fn entries_to_shreds(
&mut self, &mut self,
blocktree: &Blocktree, blocktree: &Blocktree,
entries: &[Entry], entries: &[Entry],
is_slot_end: bool, is_slot_end: bool,
reference_tick: u8,
) -> (Vec<Shred>, Vec<Shred>) { ) -> (Vec<Shred>, Vec<Shred>) {
let (slot, parent_slot) = self.current_slot_and_parent.unwrap(); let (slot, parent_slot) = self.current_slot_and_parent.unwrap();
let shredder = Shredder::new( let shredder = Shredder::new(
@@ -109,6 +92,7 @@ impl StandardBroadcastRun {
parent_slot, parent_slot,
RECOMMENDED_FEC_RATE, RECOMMENDED_FEC_RATE,
self.keypair.clone(), self.keypair.clone(),
reference_tick,
) )
.expect("Expected to create a new shredder"); .expect("Expected to create a new shredder");
@@ -168,82 +152,104 @@ impl StandardBroadcastRun {
let to_shreds_start = Instant::now(); let to_shreds_start = Instant::now();
// 1) Check if slot was interrupted // 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 // 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, blocktree,
&receive_results.entries, &receive_results.entries,
last_tick_height == bank.max_tick_height(), 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 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 bank_epoch = bank.get_leader_schedule_epoch(bank.slot());
let stakes = staking_utils::staked_nodes_at_epoch(&bank, bank_epoch); 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(); self.maybe_insert_and_broadcast(
trace!("Broadcasting {:?} shreds", all_shred_bufs.len()); data_shreds,
true,
cluster_info.read().unwrap().broadcast_shreds( blocktree,
sock, cluster_info,
all_shred_bufs,
&all_seeds,
stakes.as_ref(), 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(BroadcastStats {
shredding_elapsed: duration_as_us(&to_shreds_elapsed),
self.update_broadcast_stats( receive_elapsed: duration_as_us(&receive_elapsed),
duration_as_us(&receive_elapsed), ..BroadcastStats::default()
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(),
);
if last_tick_height == bank.max_tick_height() { if last_tick_height == bank.max_tick_height() {
self.report_and_reset_stats();
self.unfinished_slot = None; self.unfinished_slot = None;
} }
Ok(()) Ok(())
} }
#[allow(clippy::too_many_arguments)] fn maybe_insert_and_broadcast(
fn update_broadcast_stats(
&mut self, &mut self,
receive_entries_elapsed: u64, shreds: Vec<Shred>,
shredding_elapsed: u64, insert: bool,
insert_shreds_elapsed: u64, blocktree: &Arc<Blocktree>,
broadcast_elapsed: u64, cluster_info: &Arc<RwLock<ClusterInfo>>,
clone_and_seed_elapsed: u64, stakes: Option<&HashMap<Pubkey, u64>>,
slot_ended: bool, sock: &UdpSocket,
) { ) -> Result<()> {
self.stats.receive_elapsed += receive_entries_elapsed; let seed_start = Instant::now();
self.stats.shredding_elapsed += shredding_elapsed; let seeds: Vec<[u8; 32]> = shreds.iter().map(|s| s.seed()).collect();
self.stats.insert_shreds_elapsed += insert_shreds_elapsed; let seed_elapsed = seed_start.elapsed();
self.stats.broadcast_elapsed += broadcast_elapsed;
self.stats.clone_and_seed_elapsed += clone_and_seed_elapsed;
if slot_ended { // Insert shreds into blocktree
self.report_and_reset_stats() 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) { fn report_and_reset_stats(&mut self) {
@@ -259,11 +265,7 @@ impl StandardBroadcastRun {
), ),
("broadcast_time", self.stats.broadcast_elapsed as i64, i64), ("broadcast_time", self.stats.broadcast_elapsed as i64, i64),
("receive_time", self.stats.receive_elapsed as i64, i64), ("receive_time", self.stats.receive_elapsed as i64, i64),
( ("seed", self.stats.seed_elapsed as i64, i64),
"clone_and_seed",
self.stats.clone_and_seed_elapsed as i64,
i64
),
( (
"num_shreds", "num_shreds",
i64::from(self.unfinished_slot.unwrap().next_shred_index), i64::from(self.unfinished_slot.unwrap().next_shred_index),
@@ -362,7 +364,7 @@ mod test {
// Slot 2 interrupted slot 1 // Slot 2 interrupted slot 1
let shred = run let shred = run
.check_for_interrupted_slot() .check_for_interrupted_slot(0)
.expect("Expected a shred that signals an interrupt"); .expect("Expected a shred that signals an interrupt");
// Validate the shred // Validate the shred

View File

@@ -165,7 +165,7 @@ mod tests {
hasher.hash(&buf[..size]); hasher.hash(&buf[..size]);
// golden needs to be updated if blob stuff changes.... // golden needs to be updated if blob stuff changes....
let golden: Hash = "BdmY3efqu7zbnFuGRAeFANwa35HkDdQ7hwhYez3xGXiM" let golden: Hash = "HLzH7Nrh4q2K5WTh3e9vPNFZ1QVYhVDRMN9u5v51GqpJ"
.parse() .parse()
.unwrap(); .unwrap();

View File

@@ -820,7 +820,7 @@ impl ClusterInfo {
} }
pub fn map_repair_request(&self, repair_request: &RepairType) -> Result<Vec<u8>> { pub fn map_repair_request(&self, repair_request: &RepairType) -> Result<Vec<u8>> {
match repair_request { match repair_request {
RepairType::Blob(slot, blob_index) => { RepairType::Shred(slot, blob_index) => {
datapoint_debug!( datapoint_debug!(
"cluster_info-repair", "cluster_info-repair",
("repair-slot", *slot, i64), ("repair-slot", *slot, i64),
@@ -1882,7 +1882,7 @@ mod tests {
fn window_index_request() { fn window_index_request() {
let me = ContactInfo::new_localhost(&Pubkey::new_rand(), timestamp()); let me = ContactInfo::new_localhost(&Pubkey::new_rand(), timestamp());
let mut cluster_info = ClusterInfo::new_with_invalid_keypair(me); 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))); assert_matches!(rv, Err(Error::ClusterInfoError(ClusterInfoError::NoPeers)));
let gossip_addr = socketaddr!([127, 0, 0, 1], 1234); let gossip_addr = socketaddr!([127, 0, 0, 1], 1234);
@@ -1901,7 +1901,7 @@ mod tests {
); );
cluster_info.insert_info(nxt.clone()); cluster_info.insert_info(nxt.clone());
let rv = cluster_info let rv = cluster_info
.repair_request(&RepairType::Blob(0, 0)) .repair_request(&RepairType::Shred(0, 0))
.unwrap(); .unwrap();
assert_eq!(nxt.gossip, gossip_addr); assert_eq!(nxt.gossip, gossip_addr);
assert_eq!(rv.0, nxt.gossip); assert_eq!(rv.0, nxt.gossip);
@@ -1926,7 +1926,7 @@ mod tests {
while !one || !two { while !one || !two {
//this randomly picks an option, so eventually it should pick both //this randomly picks an option, so eventually it should pick both
let rv = cluster_info let rv = cluster_info
.repair_request(&RepairType::Blob(0, 0)) .repair_request(&RepairType::Shred(0, 0))
.unwrap(); .unwrap();
if rv.0 == gossip_addr { if rv.0 == gossip_addr {
one = true; one = true;

View File

@@ -18,8 +18,8 @@ use std::{
time::Duration, time::Duration,
}; };
pub const MAX_REPAIR_LENGTH: usize = 16; pub const MAX_REPAIR_LENGTH: usize = 1024;
pub const REPAIR_MS: u64 = 100; pub const REPAIR_MS: u64 = 50;
pub const MAX_ORPHANS: usize = 5; pub const MAX_ORPHANS: usize = 5;
pub enum RepairStrategy { pub enum RepairStrategy {
@@ -35,7 +35,7 @@ pub enum RepairStrategy {
pub enum RepairType { pub enum RepairType {
Orphan(u64), Orphan(u64),
HighestBlob(u64, u64), HighestBlob(u64, u64),
Blob(u64, u64), Shred(u64, u64),
} }
pub struct RepairSlotRange { pub struct RepairSlotRange {
@@ -252,13 +252,13 @@ impl RepairService {
} else { } else {
let reqs = blocktree.find_missing_data_indexes( let reqs = blocktree.find_missing_data_indexes(
slot, slot,
slot_meta.first_shred_timestamp,
slot_meta.consumed, slot_meta.consumed,
slot_meta.received, slot_meta.received,
max_repairs, max_repairs,
); );
reqs.into_iter() reqs.into_iter()
.map(|i| RepairType::Blob(slot, i)) .map(|i| RepairType::Shred(slot, i))
.collect() .collect()
} }
} }
@@ -478,12 +478,13 @@ mod test {
} }
} }
blocktree.insert_shreds(shreds_to_write, None).unwrap(); 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) let expected: Vec<RepairType> = (0..num_slots)
.flat_map(|slot| { .flat_map(|slot| {
missing_indexes_per_slot missing_indexes_per_slot
.iter() .iter()
.map(move |blob_index| RepairType::Blob(slot as u64, *blob_index)) .map(move |blob_index| RepairType::Shred(slot as u64, *blob_index))
}) })
.collect(); .collect();
@@ -543,7 +544,8 @@ mod test {
slot_shreds.remove(0); slot_shreds.remove(0);
blocktree.insert_shreds(slot_shreds, None).unwrap(); 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 // Iterate through all possible combinations of start..end (inclusive on both
// sides of the range) // sides of the range)
for start in 0..slots.len() { for start in 0..slots.len() {
@@ -555,7 +557,7 @@ mod test {
..=repair_slot_range.end) ..=repair_slot_range.end)
.map(|slot_index| { .map(|slot_index| {
if slots.contains(&(slot_index as u64)) { if slots.contains(&(slot_index as u64)) {
RepairType::Blob(slot_index as u64, 0) RepairType::Shred(slot_index as u64, 0)
} else { } else {
RepairType::HighestBlob(slot_index as u64, 0) RepairType::HighestBlob(slot_index as u64, 0)
} }

View File

@@ -379,6 +379,7 @@ impl ReplayStage {
("leader", next_leader.to_string(), String), ("leader", next_leader.to_string(), String),
); );
info!("new fork:{} parent:{} (leader)", poh_slot, parent_slot);
let tpu_bank = bank_forks let tpu_bank = bank_forks
.write() .write()
.unwrap() .unwrap()
@@ -842,21 +843,21 @@ impl ReplayStage {
next_slots.sort(); next_slots.sort();
next_slots next_slots
}); });
for (parent_id, children) in next_slots { for (parent_slot, children) in next_slots {
let parent_bank = frozen_banks let parent_bank = frozen_banks
.get(&parent_id) .get(&parent_slot)
.expect("missing parent in bank forks") .expect("missing parent in bank forks")
.clone(); .clone();
for child_id in children { for child_slot in children {
if forks.get(child_id).is_some() { if forks.get(child_slot).is_some() {
trace!("child already active or frozen {}", child_id); trace!("child already active or frozen {}", child_slot);
continue; continue;
} }
let leader = leader_schedule_cache let leader = leader_schedule_cache
.slot_leader_at(child_id, Some(&parent_bank)) .slot_leader_at(child_slot, Some(&parent_bank))
.unwrap(); .unwrap();
info!("new fork:{} parent:{}", child_id, parent_id); info!("new fork:{} parent:{}", child_slot, parent_slot);
forks.insert(Bank::new_from_parent(&parent_bank, &leader, child_id)); 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 payload_len = SIZE_OF_DATA_SHRED_PAYLOAD;
let gibberish = [0xa5u8; PACKET_DATA_SIZE]; let gibberish = [0xa5u8; PACKET_DATA_SIZE];
let mut data_header = DataShredHeader::default(); 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( let mut shred = Shred::new_empty_from_header(
ShredCommonHeader::default(), ShredCommonHeader::default(),
data_header, data_header,

View File

@@ -308,7 +308,7 @@ mod test {
parent: u64, parent: u64,
keypair: &Arc<Keypair>, keypair: &Arc<Keypair>,
) -> Vec<Shred> { ) -> 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"); .expect("Failed to create entry shredder");
shredder.entries_to_shreds(&entries, true, 0).0 shredder.entries_to_shreds(&entries, true, 0).0
} }

View File

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

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-drone" name = "solana-drone"
version = "0.20.3" version = "0.20.4"
description = "Solana Drone" description = "Solana Drone"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -19,9 +19,9 @@ clap = "2.33"
log = "0.4.8" log = "0.4.8"
serde = "1.0.101" serde = "1.0.101"
serde_derive = "1.0.101" serde_derive = "1.0.101"
solana-logger = { path = "../logger", version = "0.20.3" } solana-logger = { path = "../logger", version = "0.20.4" }
solana-metrics = { path = "../metrics", version = "0.20.3" } solana-metrics = { path = "../metrics", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.3" } solana-sdk = { path = "../sdk", version = "0.20.4" }
tokio = "0.1" tokio = "0.1"
tokio-codec = "0.1" tokio-codec = "0.1"

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-fixed-buf" name = "solana-fixed-buf"
version = "0.20.3" version = "0.20.4"
description = "A fixed-size byte array that supports bincode serde" description = "A fixed-size byte array that supports bincode serde"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"

View File

@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-genesis" name = "solana-genesis"
description = "Blockchain, Rebuilt for Scale" description = "Blockchain, Rebuilt for Scale"
version = "0.20.3" version = "0.20.4"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@@ -15,10 +15,10 @@ serde = "1.0.101"
serde_derive = "1.0.101" serde_derive = "1.0.101"
serde_json = "1.0.41" serde_json = "1.0.41"
serde_yaml = "0.8.11" serde_yaml = "0.8.11"
solana-genesis-programs = { path = "../genesis_programs", version = "0.20.3" } solana-genesis-programs = { path = "../genesis_programs", version = "0.20.4" }
solana-ledger = { path = "../ledger", version = "0.20.3" } solana-ledger = { path = "../ledger", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.3" } solana-sdk = { path = "../sdk", version = "0.20.4" }
solana-stake-api = { path = "../programs/stake_api", version = "0.20.3" } solana-stake-api = { path = "../programs/stake_api", version = "0.20.4" }
solana-storage-api = { path = "../programs/storage_api", version = "0.20.3" } solana-storage-api = { path = "../programs/storage_api", version = "0.20.4" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.3" } solana-vote-api = { path = "../programs/vote_api", version = "0.20.4" }
tempfile = "3.1.0" tempfile = "3.1.0"

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-genesis-programs" name = "solana-genesis-programs"
version = "0.20.3" version = "0.20.4"
description = "Solana genesis programs" description = "Solana genesis programs"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -10,24 +10,24 @@ edition = "2018"
[dependencies] [dependencies]
log = { version = "0.4.8" } log = { version = "0.4.8" }
solana-bpf-loader-api = { path = "../programs/bpf_loader_api", 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.3" } solana-bpf-loader-program = { path = "../programs/bpf_loader_program", version = "0.20.4" }
solana-budget-api = { path = "../programs/budget_api", 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.3" } solana-budget-program = { path = "../programs/budget_program", version = "0.20.4" }
solana-config-api = { path = "../programs/config_api", version = "0.20.3" } solana-config-api = { path = "../programs/config_api", version = "0.20.4" }
solana-config-program = { path = "../programs/config_program", version = "0.20.3" } solana-config-program = { path = "../programs/config_program", version = "0.20.4" }
solana-exchange-api = { path = "../programs/exchange_api", version = "0.20.3" } solana-exchange-api = { path = "../programs/exchange_api", version = "0.20.4" }
solana-exchange-program = { path = "../programs/exchange_program", version = "0.20.3" } solana-exchange-program = { path = "../programs/exchange_program", version = "0.20.4" }
solana-runtime = { path = "../runtime", version = "0.20.3" } solana-runtime = { path = "../runtime", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.3" } solana-sdk = { path = "../sdk", version = "0.20.4" }
solana-stake-api = { path = "../programs/stake_api", version = "0.20.3" } solana-stake-api = { path = "../programs/stake_api", version = "0.20.4" }
solana-stake-program = { path = "../programs/stake_program", version = "0.20.3" } solana-stake-program = { path = "../programs/stake_program", version = "0.20.4" }
solana-storage-api = { path = "../programs/storage_api", version = "0.20.3" } solana-storage-api = { path = "../programs/storage_api", version = "0.20.4" }
solana-storage-program = { path = "../programs/storage_program", version = "0.20.3" } solana-storage-program = { path = "../programs/storage_program", version = "0.20.4" }
solana-vest-api = { path = "../programs/vest_api", version = "0.20.3" } solana-vest-api = { path = "../programs/vest_api", version = "0.20.4" }
solana-vest-program = { path = "../programs/vest_program", version = "0.20.3" } solana-vest-program = { path = "../programs/vest_program", version = "0.20.4" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.3" } solana-vote-api = { path = "../programs/vote_api", version = "0.20.4" }
solana-vote-program = { path = "../programs/vote_program", version = "0.20.3" } solana-vote-program = { path = "../programs/vote_program", version = "0.20.4" }
[lib] [lib]
crate-type = ["lib"] crate-type = ["lib"]

View File

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

View File

@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-install" name = "solana-install"
description = "The solana cluster software installer" description = "The solana cluster software installer"
version = "0.20.3" version = "0.20.4"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@@ -28,10 +28,10 @@ serde = "1.0.101"
serde_derive = "1.0.101" serde_derive = "1.0.101"
serde_yaml = "0.8.11" serde_yaml = "0.8.11"
sha2 = "0.8.0" sha2 = "0.8.0"
solana-client = { path = "../client", version = "0.20.3" } solana-client = { path = "../client", version = "0.20.4" }
solana-config-api = { path = "../programs/config_api", version = "0.20.3" } solana-config-api = { path = "../programs/config_api", version = "0.20.4" }
solana-logger = { path = "../logger", version = "0.20.3" } solana-logger = { path = "../logger", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.3" } solana-sdk = { path = "../sdk", version = "0.20.4" }
tar = "0.4.26" tar = "0.4.26"
tempdir = "0.3.7" tempdir = "0.3.7"
url = "2.1.0" url = "2.1.0"

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-keygen" name = "solana-keygen"
version = "0.20.3" version = "0.20.4"
description = "Solana key generation utility" description = "Solana key generation utility"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -15,7 +15,7 @@ edition = "2018"
clap = "2.33" clap = "2.33"
dirs = "2.0.2" dirs = "2.0.2"
rpassword = "4.0" rpassword = "4.0"
solana-sdk = { path = "../sdk", version = "0.20.3" } solana-sdk = { path = "../sdk", version = "0.20.4" }
tiny-bip39 = "0.6.2" tiny-bip39 = "0.6.2"
[[bin]] [[bin]]

View File

@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-ledger-tool" name = "solana-ledger-tool"
description = "Blockchain, Rebuilt for Scale" description = "Blockchain, Rebuilt for Scale"
version = "0.20.3" version = "0.20.4"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@@ -15,11 +15,11 @@ serde = "1.0.101"
serde_derive = "1.0.101" serde_derive = "1.0.101"
serde_json = "1.0.41" serde_json = "1.0.41"
serde_yaml = "0.8.11" serde_yaml = "0.8.11"
solana-ledger = { path = "../ledger", version = "0.20.3" } solana-ledger = { path = "../ledger", version = "0.20.4" }
solana-logger = { path = "../logger", version = "0.20.3" } solana-logger = { path = "../logger", version = "0.20.4" }
solana-runtime = { path = "../runtime", version = "0.20.3" } solana-runtime = { path = "../runtime", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.3" } solana-sdk = { path = "../sdk", version = "0.20.4" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.3" } solana-vote-api = { path = "../programs/vote_api", version = "0.20.4" }
[dev-dependencies] [dev-dependencies]
assert_cmd = "0.11" assert_cmd = "0.11"

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-ledger" name = "solana-ledger"
version = "0.20.3" version = "0.20.4"
description = "Solana ledger" description = "Solana ledger"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -27,16 +27,16 @@ rayon = "1.2.0"
reed-solomon-erasure = { package = "solana-reed-solomon-erasure", version = "4.0.1-3", features = ["simd-accel"] } reed-solomon-erasure = { package = "solana-reed-solomon-erasure", version = "4.0.1-3", features = ["simd-accel"] }
serde = "1.0.101" serde = "1.0.101"
serde_derive = "1.0.101" serde_derive = "1.0.101"
solana-genesis-programs = { path = "../genesis_programs", version = "0.20.3" } solana-genesis-programs = { path = "../genesis_programs", version = "0.20.4" }
solana-logger = { path = "../logger", version = "0.20.3" } solana-logger = { path = "../logger", version = "0.20.4" }
solana-measure = { path = "../measure", version = "0.20.3" } solana-measure = { path = "../measure", version = "0.20.4" }
solana-merkle-tree = { path = "../merkle-tree", version = "0.20.3" } solana-merkle-tree = { path = "../merkle-tree", version = "0.20.4" }
solana-metrics = { path = "../metrics", version = "0.20.3" } solana-metrics = { path = "../metrics", version = "0.20.4" }
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "0.20.3" } solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "0.20.4" }
solana-runtime = { path = "../runtime", version = "0.20.3" } solana-runtime = { path = "../runtime", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.3" } solana-sdk = { path = "../sdk", version = "0.20.4" }
solana-stake-api = { path = "../programs/stake_api", version = "0.20.3" } solana-stake-api = { path = "../programs/stake_api", version = "0.20.4" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.3" } solana-vote-api = { path = "../programs/vote_api", version = "0.20.4" }
sys-info = "0.5.8" sys-info = "0.5.8"
tar = "0.4.26" tar = "0.4.26"
tempfile = "3.1.0" tempfile = "3.1.0"
@@ -50,7 +50,7 @@ features = ["lz4"]
[dev-dependencies] [dev-dependencies]
matches = "0.1.6" 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] [lib]
crate-type = ["lib"] crate-type = ["lib"]

View File

@@ -20,10 +20,11 @@ use rocksdb::DBRawIterator;
use solana_measure::measure::Measure; use solana_measure::measure::Measure;
use solana_metrics::{datapoint_debug, datapoint_error}; use solana_metrics::{datapoint_debug, datapoint_error};
use solana_rayon_threadlimit::get_thread_count; 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::genesis_block::GenesisBlock;
use solana_sdk::hash::Hash; use solana_sdk::hash::Hash;
use solana_sdk::signature::{Keypair, KeypairUtil}; use solana_sdk::signature::{Keypair, KeypairUtil};
use solana_sdk::timing::timestamp;
use std::cell::RefCell; use std::cell::RefCell;
use std::cmp; use std::cmp;
use std::collections::HashMap; use std::collections::HashMap;
@@ -41,6 +42,7 @@ thread_local!(static PAR_THREAD_POOL: RefCell<ThreadPool> = RefCell::new(rayon::
.unwrap())); .unwrap()));
pub const MAX_COMPLETED_SLOTS_IN_CHANNEL: usize = 100_000; 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>>; pub type CompletedSlotsReceiver = Receiver<Vec<u64>>;
@@ -833,6 +835,7 @@ impl Blocktree {
slot_meta, slot_meta,
index as u32, index as u32,
new_consumed, new_consumed,
shred.reference_tick(),
); );
data_index.set_present(index, true); data_index.set_present(index, true);
trace!("inserted shred into slot {:?} and index {:?}", slot, index); trace!("inserted shred into slot {:?} and index {:?}", slot, index);
@@ -909,7 +912,7 @@ impl Blocktree {
}, },
|v| v, |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"); .expect("Failed to create entry shredder");
let mut all_shreds = vec![]; let mut all_shreds = vec![];
let mut slot_entries = vec![]; let mut slot_entries = vec![];
@@ -932,8 +935,14 @@ impl Blocktree {
shredder.entries_to_shreds(&current_entries, true, start_index); shredder.entries_to_shreds(&current_entries, true, start_index);
all_shreds.append(&mut data_shreds); all_shreds.append(&mut data_shreds);
all_shreds.append(&mut coding_shreds); all_shreds.append(&mut coding_shreds);
shredder = Shredder::new(current_slot, parent_slot, 0.0, keypair.clone()) shredder = Shredder::new(
.expect("Failed to create entry shredder"); 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() { if entry.is_tick() {
@@ -970,7 +979,8 @@ impl Blocktree {
// for the slot with the specified slot // for the slot with the specified slot
fn find_missing_indexes<C>( fn find_missing_indexes<C>(
db_iterator: &mut DBRawIterator, db_iterator: &mut DBRawIterator,
slot: u64, slot: Slot,
first_timestamp: u64,
start_index: u64, start_index: u64,
end_index: u64, end_index: u64,
max_missing: usize, max_missing: usize,
@@ -983,6 +993,8 @@ impl Blocktree {
} }
let mut missing_indexes = vec![]; 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 // Seek to the first shred with index >= start_index
db_iterator.seek(&C::key((slot, 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); 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 { for i in prev_index..upper_index {
missing_indexes.push(i); missing_indexes.push(i);
if missing_indexes.len() == max_missing { if missing_indexes.len() == max_missing {
@@ -1035,7 +1055,8 @@ impl Blocktree {
pub fn find_missing_data_indexes( pub fn find_missing_data_indexes(
&self, &self,
slot: u64, slot: Slot,
first_timestamp: u64,
start_index: u64, start_index: u64,
end_index: u64, end_index: u64,
max_missing: usize, max_missing: usize,
@@ -1047,6 +1068,7 @@ impl Blocktree {
Self::find_missing_indexes::<cf::ShredData>( Self::find_missing_indexes::<cf::ShredData>(
&mut db_iterator, &mut db_iterator,
slot, slot,
first_timestamp,
start_index, start_index,
end_index, end_index,
max_missing, max_missing,
@@ -1311,10 +1333,17 @@ fn update_slot_meta(
slot_meta: &mut SlotMeta, slot_meta: &mut SlotMeta,
index: u32, index: u32,
new_consumed: u64, 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, // Index is zero-indexed, while the "received" height starts from 1,
// so received = index + 1 for the same shred. // so received = index + 1 for the same shred.
slot_meta.received = cmp::max((u64::from(index) + 1) as u64, slot_meta.received); 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.consumed = new_consumed;
slot_meta.last_index = { slot_meta.last_index = {
// If the last index in the slot hasn't been set before, then // 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 entries = create_ticks(ticks_per_slot, genesis_block.hash());
let last_hash = entries.last().unwrap().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"); .expect("Failed to create entry shredder");
let shreds = shredder.entries_to_shreds(&entries, true, 0).0; let shreds = shredder.entries_to_shreds(&entries, true, 0).0;
assert!(shreds.last().unwrap().last_in_slot()); assert!(shreds.last().unwrap().last_in_slot());
@@ -1792,7 +1821,7 @@ pub fn entries_to_test_shreds(
parent_slot: u64, parent_slot: u64,
is_full_slot: bool, is_full_slot: bool,
) -> Vec<Shred> { ) -> 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"); .expect("Failed to create entry shredder");
shredder.entries_to_shreds(&entries, is_full_slot, 0).0 shredder.entries_to_shreds(&entries, is_full_slot, 0).0
@@ -3163,27 +3192,27 @@ pub mod tests {
// range of [0, gap) // range of [0, gap)
let expected: Vec<u64> = (1..gap).collect(); let expected: Vec<u64> = (1..gap).collect();
assert_eq!( 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 expected
); );
assert_eq!( 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, expected,
); );
assert_eq!( 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], &expected[..expected.len() - 1],
); );
assert_eq!( 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], vec![gap - 2, gap - 1],
); );
assert_eq!( 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], vec![gap - 2],
); );
assert_eq!( assert_eq!(
blocktree.find_missing_data_indexes(slot, 0, gap, 1), blocktree.find_missing_data_indexes(slot, 0, 0, gap, 1),
vec![1], vec![1],
); );
@@ -3192,11 +3221,11 @@ pub mod tests {
let mut expected: Vec<u64> = (1..gap).collect(); let mut expected: Vec<u64> = (1..gap).collect();
expected.push(gap + 1); expected.push(gap + 1);
assert_eq!( 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, expected,
); );
assert_eq!( 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], &expected[..expected.len() - 1],
); );
@@ -3212,6 +3241,7 @@ pub mod tests {
assert_eq!( assert_eq!(
blocktree.find_missing_data_indexes( blocktree.find_missing_data_indexes(
slot, slot,
0,
j * gap, j * gap,
i * gap, i * gap,
((i - j) * gap) as usize ((i - j) * gap) as usize
@@ -3225,6 +3255,34 @@ pub mod tests {
Blocktree::destroy(&blocktree_path).expect("Expected successful database destruction"); 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] #[test]
fn test_find_missing_data_indexes_sanity() { fn test_find_missing_data_indexes_sanity() {
let slot = 0; let slot = 0;
@@ -3234,10 +3292,10 @@ pub mod tests {
// Early exit conditions // Early exit conditions
let empty: Vec<u64> = vec![]; 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, 0, 0, 0, 1), empty);
assert_eq!(blocktree.find_missing_data_indexes(slot, 5, 5, 1), empty); assert_eq!(blocktree.find_missing_data_indexes(slot, 0, 5, 5, 1), empty);
assert_eq!(blocktree.find_missing_data_indexes(slot, 4, 3, 1), empty); assert_eq!(blocktree.find_missing_data_indexes(slot, 0, 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, 1, 2, 0), empty);
let entries = create_ticks(100, Hash::default()); let entries = create_ticks(100, Hash::default());
let mut shreds = entries_to_test_shreds(entries, slot, 0, true); let mut shreds = entries_to_test_shreds(entries, slot, 0, true);
@@ -3261,7 +3319,7 @@ pub mod tests {
// [i, first_index - 1] // [i, first_index - 1]
for start in 0..STARTS { for start in 0..STARTS {
let result = blocktree.find_missing_data_indexes( let result = blocktree.find_missing_data_indexes(
slot, start, // start slot, 0, start, // start
END, //end END, //end
MAX, //max MAX, //max
); );
@@ -3291,7 +3349,7 @@ pub mod tests {
for i in 0..num_shreds as u64 { for i in 0..num_shreds as u64 {
for j in 0..i { for j in 0..i {
assert_eq!( 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 empty
); );
} }
@@ -3816,6 +3874,7 @@ pub mod tests {
Some(&[1, 1, 1]), Some(&[1, 1, 1]),
true, true,
true, true,
0,
)]; )];
// With the corruption, nothing should be returned, even though an // With the corruption, nothing should be returned, even though an

View File

@@ -12,11 +12,13 @@ pub struct SlotMeta {
// The total number of consecutive blobs starting from index 0 // The total number of consecutive blobs starting from index 0
// we have received for this slot. // we have received for this slot.
pub consumed: u64, pub consumed: u64,
// The index *plus one* of the highest blob received for this slot. Useful // The index *plus one* of the highest shred received for this slot. Useful
// for checking if the slot has received any blobs yet, and to calculate the // for checking if the slot has received any shreds yet, and to calculate the
// range where there is one or more holes: `(consumed..received)`. // range where there is one or more holes: `(consumed..received)`.
pub received: u64, 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, pub last_index: u64,
// The slot height of the block this one derives from. // The slot height of the block this one derives from.
pub parent_slot: u64, pub parent_slot: u64,
@@ -31,7 +33,7 @@ pub struct SlotMeta {
} }
#[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq)] #[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq)]
/// Index recording presence/absence of blobs /// Index recording presence/absence of shreds
pub struct Index { pub struct Index {
pub slot: u64, pub slot: u64,
data: DataIndex, data: DataIndex,
@@ -40,14 +42,14 @@ pub struct Index {
#[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq)] #[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq)]
pub struct DataIndex { pub struct DataIndex {
/// Map representing presence/absence of data blobs /// Map representing presence/absence of data shreds
index: BTreeSet<u64>, index: BTreeSet<u64>,
} }
#[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq)] #[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq)]
/// Erasure coding information /// Erasure coding information
pub struct CodingIndex { 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>, index: BTreeSet<u64>,
} }
@@ -145,8 +147,8 @@ impl DataIndex {
impl SlotMeta { impl SlotMeta {
pub fn is_full(&self) -> bool { pub fn is_full(&self) -> bool {
// last_index is std::u64::MAX when it has no information about how // last_index is std::u64::MAX when it has no information about how
// many blobs will fill this slot. // many shreds will fill this slot.
// Note: A full slot with zero blobs is not possible. // Note: A full slot with zero shreds is not possible.
if self.last_index == std::u64::MAX { if self.last_index == std::u64::MAX {
return false; return false;
} }
@@ -179,6 +181,7 @@ impl SlotMeta {
slot, slot,
consumed: 0, consumed: 0,
received: 0, received: 0,
first_shred_timestamp: 0,
parent_slot, parent_slot,
next_slots: vec![], next_slots: vec![],
is_connected: slot == 0, is_connected: slot == 0,

View File

@@ -114,8 +114,18 @@ fn process_entries_with_callback(
let mut tick_hashes = vec![]; let mut tick_hashes = vec![];
for entry in entries { for entry in entries {
if entry.is_tick() { 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); 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; continue;
} }
// else loop on processing the entry // 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( fn get_epoch_schedule(
genesis_block: &GenesisBlock, genesis_block: &GenesisBlock,
account_paths: Option<String>, account_paths: Option<String>,

View File

@@ -8,12 +8,15 @@ use rayon::ThreadPool;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use solana_metrics::datapoint_debug; use solana_metrics::datapoint_debug;
use solana_rayon_threadlimit::get_thread_count; use solana_rayon_threadlimit::get_thread_count;
use solana_sdk::hash::Hash; use solana_sdk::{
use solana_sdk::packet::PACKET_DATA_SIZE; clock::Slot,
use solana_sdk::pubkey::Pubkey; hash::Hash,
use solana_sdk::signature::{Keypair, KeypairUtil, Signature}; packet::PACKET_DATA_SIZE,
use std::sync::Arc; pubkey::Pubkey,
use std::time::Instant; signature::{Keypair, KeypairUtil, Signature},
};
use std::mem::size_of;
use std::{sync::Arc, time::Instant};
/// The following constants are computed by hand, and hardcoded. /// The following constants are computed by hand, and hardcoded.
/// `test_shred_constants` ensures that the values are correct. /// `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 DATA_SHRED: u8 = 0b1010_0101;
pub const CODING_SHRED: u8 = 0b0101_1010; pub const CODING_SHRED: u8 = 0b0101_1010;
/// This limit comes from reed solomon library, but unfortunately they don't have pub const MAX_DATA_SHREDS_PER_FEC_BLOCK: u32 = 32;
/// a public constant defined for it. pub const RECOMMENDED_FEC_RATE: f32 = 1.0;
pub const MAX_DATA_SHREDS_PER_FEC_BLOCK: u32 = 16;
/// Based on rse benchmarks, the optimal erasure config uses 16 data shreds and 4 coding shreds pub const SHRED_TICK_REFERENCE_MASK: u8 = 0b0011_1111;
pub const RECOMMENDED_FEC_RATE: f32 = 0.25; const LAST_SHRED_IN_SLOT: u8 = 0b1000_0000;
pub const DATA_COMPLETE_SHRED: u8 = 0b0100_0000;
const LAST_SHRED_IN_SLOT: u8 = 0b0000_0001;
pub const DATA_COMPLETE_SHRED: u8 = 0b0000_0010;
#[derive(Debug)] #[derive(Debug)]
pub enum ShredError { pub enum ShredError {
@@ -135,6 +135,7 @@ impl Shred {
data: Option<&[u8]>, data: Option<&[u8]>,
is_last_data: bool, is_last_data: bool,
is_last_in_slot: bool, is_last_in_slot: bool,
reference_tick: u8,
) -> Self { ) -> Self {
let mut payload = vec![0; PACKET_DATA_SIZE]; let mut payload = vec![0; PACKET_DATA_SIZE];
let mut common_header = ShredCommonHeader::default(); let mut common_header = ShredCommonHeader::default();
@@ -143,6 +144,7 @@ impl Shred {
let mut data_header = DataShredHeader::default(); let mut data_header = DataShredHeader::default();
data_header.parent_offset = parent_offset; data_header.parent_offset = parent_offset;
data_header.flags = reference_tick.min(SHRED_TICK_REFERENCE_MASK);
if is_last_data { if is_last_data {
data_header.flags |= DATA_COMPLETE_SHRED 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 { pub fn verify(&self, pubkey: &Pubkey) -> bool {
self.signature() self.signature()
.verify(pubkey.as_ref(), &self.payload[SIZE_OF_SIGNATURE..]) .verify(pubkey.as_ref(), &self.payload[SIZE_OF_SIGNATURE..])
@@ -341,10 +356,17 @@ pub struct Shredder {
fec_rate: f32, fec_rate: f32,
keypair: Arc<Keypair>, keypair: Arc<Keypair>,
pub signing_coding_time: u128, pub signing_coding_time: u128,
reference_tick: u8,
} }
impl Shredder { 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 { if fec_rate > 1.0 || fec_rate < 0.0 {
Err(ShredError::InvalidFecRate(fec_rate)) Err(ShredError::InvalidFecRate(fec_rate))
} else if slot < parent_slot || slot - parent_slot > u64::from(std::u16::MAX) { } else if slot < parent_slot || slot - parent_slot > u64::from(std::u16::MAX) {
@@ -356,6 +378,7 @@ impl Shredder {
fec_rate, fec_rate,
keypair, keypair,
signing_coding_time: 0, signing_coding_time: 0,
reference_tick,
}) })
} }
} }
@@ -399,6 +422,7 @@ impl Shredder {
Some(shred_data), Some(shred_data),
is_last_data, is_last_data,
is_last_in_slot, is_last_in_slot,
self.reference_tick,
); );
Shredder::sign_shred(&self.keypair, &mut shred); Shredder::sign_shred(&self.keypair, &mut shred);
@@ -801,7 +825,7 @@ pub mod tests {
// Test that parent cannot be > current slot // Test that parent cannot be > current slot
assert_matches!( assert_matches!(
Shredder::new(slot, slot + 1, 1.00, keypair.clone()), Shredder::new(slot, slot + 1, 1.00, keypair.clone(), 0),
Err(ShredError::SlotTooLow { Err(ShredError::SlotTooLow {
slot: _, slot: _,
parent_slot: _, parent_slot: _,
@@ -809,7 +833,7 @@ pub mod tests {
); );
// Test that slot - parent cannot be > u16 MAX // Test that slot - parent cannot be > u16 MAX
assert_matches!( 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 { Err(ShredError::SlotTooLow {
slot: _, slot: _,
parent_slot: _, parent_slot: _,
@@ -818,7 +842,7 @@ pub mod tests {
let fec_rate = 0.25; let fec_rate = 0.25;
let parent_slot = slot - 5; 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"); .expect("Failed in creating shredder");
let entries: Vec<_> = (0..5) let entries: Vec<_> = (0..5)
@@ -893,7 +917,7 @@ pub mod tests {
let slot = 1; let slot = 1;
let parent_slot = 0; 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"); .expect("Failed in creating shredder");
let entries: Vec<_> = (0..5) let entries: Vec<_> = (0..5)
@@ -913,6 +937,72 @@ pub mod tests {
assert_eq!(deserialized_shred, *data_shreds.last().unwrap()); 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] #[test]
fn test_data_and_code_shredder() { fn test_data_and_code_shredder() {
let keypair = Arc::new(Keypair::new()); let keypair = Arc::new(Keypair::new());
@@ -920,11 +1010,11 @@ pub mod tests {
let slot = 0x123456789abcdef0; let slot = 0x123456789abcdef0;
// Test that FEC rate cannot be > 1.0 // Test that FEC rate cannot be > 1.0
assert_matches!( assert_matches!(
Shredder::new(slot, slot - 5, 1.001, keypair.clone()), Shredder::new(slot, slot - 5, 1.001, keypair.clone(), 0),
Err(ShredError::InvalidFecRate(_)) 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"); .expect("Failed in creating shredder");
// Create enough entries to make > 1 shred // Create enough entries to make > 1 shred
@@ -966,7 +1056,7 @@ pub mod tests {
fn test_recovery_and_reassembly() { fn test_recovery_and_reassembly() {
let keypair = Arc::new(Keypair::new()); let keypair = Arc::new(Keypair::new());
let slot = 0x123456789abcdef0; 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"); .expect("Failed in creating shredder");
let keypair0 = Keypair::new(); let keypair0 = Keypair::new();
@@ -1212,7 +1302,7 @@ pub mod tests {
fn test_multi_fec_block_coding() { fn test_multi_fec_block_coding() {
let keypair = Arc::new(Keypair::new()); let keypair = Arc::new(Keypair::new());
let slot = 0x123456789abcdef0; 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"); .expect("Failed in creating shredder");
let num_fec_sets = 100; let num_fec_sets = 100;

View File

@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-local-cluster" name = "solana-local-cluster"
description = "Blockchain, Rebuilt for Scale" description = "Blockchain, Rebuilt for Scale"
version = "0.20.3" version = "0.20.4"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@@ -11,29 +11,29 @@ homepage = "https://solana.com/"
[dependencies] [dependencies]
log = "0.4.8" log = "0.4.8"
rand = "0.6.5" rand = "0.6.5"
solana-bench-exchange = { path = "../bench-exchange", version = "0.20.3" } solana-bench-exchange = { path = "../bench-exchange", version = "0.20.4" }
solana-bench-tps = { path = "../bench-tps", version = "0.20.3" } solana-bench-tps = { path = "../bench-tps", version = "0.20.4" }
solana-config-api = { path = "../programs/config_api", version = "0.20.3" } solana-config-api = { path = "../programs/config_api", version = "0.20.4" }
solana-core = { path = "../core", version = "0.20.3" } solana-core = { path = "../core", version = "0.20.4" }
solana-client = { path = "../client", version = "0.20.3" } solana-client = { path = "../client", version = "0.20.4" }
solana-drone = { path = "../drone", version = "0.20.3" } solana-drone = { path = "../drone", version = "0.20.4" }
solana-exchange-api = { path = "../programs/exchange_api", version = "0.20.3" } solana-exchange-api = { path = "../programs/exchange_api", version = "0.20.4" }
solana-exchange-program = { path = "../programs/exchange_program", version = "0.20.3" } solana-exchange-program = { path = "../programs/exchange_program", version = "0.20.4" }
solana-genesis-programs = { path = "../genesis_programs", version = "0.20.3" } solana-genesis-programs = { path = "../genesis_programs", version = "0.20.4" }
solana-ledger = { path = "../ledger", version = "0.20.3" } solana-ledger = { path = "../ledger", version = "0.20.4" }
solana-logger = { path = "../logger", version = "0.20.3" } solana-logger = { path = "../logger", version = "0.20.4" }
solana-move-loader-api = { path = "../programs/move_loader_api", version = "0.20.3", optional = true } 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.3", optional = true } solana-move-loader-program = { path = "../programs/move_loader_program", version = "0.20.4", optional = true }
solana-runtime = { path = "../runtime", version = "0.20.3" } solana-runtime = { path = "../runtime", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.3" } solana-sdk = { path = "../sdk", version = "0.20.4" }
solana-stake-api = { path = "../programs/stake_api", version = "0.20.3" } solana-stake-api = { path = "../programs/stake_api", version = "0.20.4" }
solana-storage-api = { path = "../programs/storage_api", version = "0.20.3" } solana-storage-api = { path = "../programs/storage_api", version = "0.20.4" }
solana-storage-program = { path = "../programs/storage_program", version = "0.20.3" } solana-storage-program = { path = "../programs/storage_program", version = "0.20.4" }
solana-vest-api = { path = "../programs/vest_api", version = "0.20.3" } solana-vest-api = { path = "../programs/vest_api", version = "0.20.4" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.3" } solana-vote-api = { path = "../programs/vote_api", version = "0.20.4" }
symlink = "0.1.0" symlink = "0.1.0"
tempfile = "3.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] [dev-dependencies]
serial_test = "0.2.0" serial_test = "0.2.0"

View File

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

View File

@@ -1,7 +1,7 @@
[package] [package]
name = "solana-measure" name = "solana-measure"
description = "Blockchain, Rebuilt for Scale" description = "Blockchain, Rebuilt for Scale"
version = "0.20.3" version = "0.20.4"
documentation = "https://docs.rs/solana" documentation = "https://docs.rs/solana"
homepage = "https://solana.com/" homepage = "https://solana.com/"
readme = "../README.md" readme = "../README.md"
@@ -11,4 +11,4 @@ license = "Apache-2.0"
edition = "2018" edition = "2018"
[dependencies] [dependencies]
solana-sdk = { path = "../sdk", version = "0.20.3" } solana-sdk = { path = "../sdk", version = "0.20.4" }

View File

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

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-metrics" name = "solana-metrics"
version = "0.20.3" version = "0.20.4"
description = "Solana Metrics" description = "Solana Metrics"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -13,7 +13,7 @@ env_logger = "0.7.1"
lazy_static = "1.4.0" lazy_static = "1.4.0"
log = "0.4.8" log = "0.4.8"
reqwest = { version = "0.9.22", default-features = false, features = ["rustls-tls"] } 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" sys-info = "0.5.8"
[dev-dependencies] [dev-dependencies]

View File

@@ -4083,11 +4083,11 @@
"rgba(237, 129, 40, 0.89)", "rgba(237, 129, 40, 0.89)",
"rgba(50, 172, 45, 0.97)" "rgba(50, 172, 45, 0.97)"
], ],
"decimals": 2, "decimals": 0,
"pattern": "/.*/", "pattern": "/.*/",
"thresholds": [], "thresholds": [],
"type": "number", "type": "number",
"unit": "short" "unit": "none"
} }
], ],
"targets": [ "targets": [

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-netutil" name = "solana-netutil"
version = "0.20.3" version = "0.20.4"
description = "Solana Network Utilities" description = "Solana Network Utilities"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -18,7 +18,7 @@ rand = "0.6.1"
serde = "1.0.101" serde = "1.0.101"
serde_derive = "1.0.101" serde_derive = "1.0.101"
socket2 = "0.3.11" socket2 = "0.3.11"
solana-logger = { path = "../logger", version = "0.20.3" } solana-logger = { path = "../logger", version = "0.20.4" }
tokio = "0.1" tokio = "0.1"
tokio-codec = "0.1" tokio-codec = "0.1"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-bpf-loader-api" name = "solana-bpf-loader-api"
version = "0.20.3" version = "0.20.4"
description = "Solana BPF Loader" description = "Solana BPF Loader"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -14,8 +14,8 @@ byteorder = "1.3.2"
libc = "0.2.65" libc = "0.2.65"
log = "0.4.8" log = "0.4.8"
serde = "1.0.101" serde = "1.0.101"
solana-logger = { path = "../../logger", version = "0.20.3" } solana-logger = { path = "../../logger", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.3" } solana-sdk = { path = "../../sdk", version = "0.20.4" }
solana_rbpf = "=0.1.19" solana_rbpf = "=0.1.19"
[lib] [lib]

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-bpf-loader-program" name = "solana-bpf-loader-program"
version = "0.20.3" version = "0.20.4"
description = "Solana BPF Loader" description = "Solana BPF Loader"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -10,9 +10,9 @@ edition = "2018"
[dependencies] [dependencies]
log = "0.4.8" log = "0.4.8"
solana-logger = { path = "../../logger", version = "0.20.3" } solana-logger = { path = "../../logger", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.3" } solana-sdk = { path = "../../sdk", version = "0.20.4" }
solana-bpf-loader-api = { path = "../bpf_loader_api", version = "0.20.3" } solana-bpf-loader-api = { path = "../bpf_loader_api", version = "0.20.4" }
[lib] [lib]
crate-type = ["lib", "cdylib"] crate-type = ["lib", "cdylib"]

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-btc-spv-api" name = "solana-btc-spv-api"
version = "0.20.3" version = "0.20.4"
description = "Solana Bitcoin spv parsing program api" description = "Solana Bitcoin spv parsing program api"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -16,7 +16,7 @@ num-derive = "0.3"
num-traits = "0.2" num-traits = "0.2"
serde = "1.0.101" serde = "1.0.101"
serde_derive = "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" hex = "0.3.2"
[lib] [lib]

View File

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

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-bitcoin-spv-program" name = "solana-bitcoin-spv-program"
version = "0.20.3" version = "0.20.4"
description = "Solana Bitcoin spv parsing program" description = "Solana Bitcoin spv parsing program"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -16,8 +16,8 @@ num-derive = "0.3"
num-traits = "0.2" num-traits = "0.2"
serde = "1.0.101" serde = "1.0.101"
serde_derive = "1.0.101" serde_derive = "1.0.101"
solana-sdk = { path = "../../sdk", version = "0.20.3"} solana-sdk = { path = "../../sdk", version = "0.20.4"}
solana-btc-spv-api = { path = "../btc_spv_api", version = "0.20.3"} solana-btc-spv-api = { path = "../btc_spv_api", version = "0.20.4"}
[lib] [lib]

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-budget-api" name = "solana-budget-api"
version = "0.20.3" version = "0.20.4"
description = "Solana Budget program API" description = "Solana Budget program API"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -16,10 +16,10 @@ num-derive = "0.3"
num-traits = "0.2" num-traits = "0.2"
serde = "1.0.101" serde = "1.0.101"
serde_derive = "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] [dev-dependencies]
solana-runtime = { path = "../../runtime", version = "0.20.3" } solana-runtime = { path = "../../runtime", version = "0.20.4" }
[lib] [lib]
crate-type = ["lib"] crate-type = ["lib"]

View File

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

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-config-api" name = "solana-config-api"
version = "0.20.3" version = "0.20.4"
description = "config program API" description = "config program API"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -13,7 +13,7 @@ bincode = "1.2.0"
log = "0.4.8" log = "0.4.8"
serde = "1.0.101" serde = "1.0.101"
serde_derive = "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] [lib]

View File

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

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-config-tests" name = "solana-config-tests"
version = "0.20.3" version = "0.20.4"
description = "Solana config api tests" description = "Solana config api tests"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -13,12 +13,12 @@ bincode = "1.2.0"
log = "0.4.8" log = "0.4.8"
serde = "1.0.101" serde = "1.0.101"
serde_derive = "1.0.101" serde_derive = "1.0.101"
solana-logger = { path = "../../logger", version = "0.20.3" } solana-logger = { path = "../../logger", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.3" } solana-sdk = { path = "../../sdk", version = "0.20.4" }
solana-config-api = { path = "../config_api", version = "0.20.3" } solana-config-api = { path = "../config_api", version = "0.20.4" }
solana-config-program = { path = "../config_program", version = "0.20.3" } solana-config-program = { path = "../config_program", version = "0.20.4" }
[dev-dependencies] [dev-dependencies]
solana-runtime = { path = "../../runtime", version = "0.20.3" } solana-runtime = { path = "../../runtime", version = "0.20.4" }
assert_matches = "1.3.0" assert_matches = "1.3.0"

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-exchange-api" name = "solana-exchange-api"
version = "0.20.3" version = "0.20.4"
description = "Solana Exchange program API" description = "Solana Exchange program API"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -13,12 +13,12 @@ bincode = "1.2.0"
log = "0.4.8" log = "0.4.8"
serde = "1.0.101" serde = "1.0.101"
serde_derive = "1.0.101" serde_derive = "1.0.101"
solana-logger = { path = "../../logger", version = "0.20.3" } solana-logger = { path = "../../logger", version = "0.20.4" }
solana-metrics = { path = "../../metrics", version = "0.20.3" } solana-metrics = { path = "../../metrics", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.3" } solana-sdk = { path = "../../sdk", version = "0.20.4" }
[dev-dependencies] [dev-dependencies]
solana-runtime = { path = "../../runtime", version = "0.20.3" } solana-runtime = { path = "../../runtime", version = "0.20.4" }
[lib] [lib]
crate-type = ["lib"] crate-type = ["lib"]

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-librapay-api" name = "solana-librapay-api"
version = "0.20.3" version = "0.20.4"
description = "Solana Libra Payment" description = "Solana Libra Payment"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -11,12 +11,12 @@ edition = "2018"
[dependencies] [dependencies]
bincode = "1.2.0" bincode = "1.2.0"
log = "0.4.8" log = "0.4.8"
solana-logger = { path = "../../logger", version = "0.20.3" } solana-logger = { path = "../../logger", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.3" } solana-sdk = { path = "../../sdk", version = "0.20.4" }
solana-runtime = { path = "../../runtime", version = "0.20.3" } solana-runtime = { path = "../../runtime", version = "0.20.4" }
types = { version = "0.0.1-sol4", package = "solana_libra_types" } types = { version = "0.0.1-sol4", package = "solana_libra_types" }
language_e2e_tests = { version = "0.0.1-sol4", package = "solana_libra_language_e2e_tests" } 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] [lib]
crate-type = ["lib"] crate-type = ["lib"]

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-move-loader-api" name = "solana-move-loader-api"
version = "0.20.3" version = "0.20.4"
description = "Solana Move Loader" description = "Solana Move Loader"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -18,8 +18,8 @@ serde = "1.0.101"
serde_bytes = "0.11" serde_bytes = "0.11"
serde_derive = "1.0.101" serde_derive = "1.0.101"
serde_json = "1.0.41" serde_json = "1.0.41"
solana-logger = { path = "../../logger", version = "0.20.3" } solana-logger = { path = "../../logger", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.3" } solana-sdk = { path = "../../sdk", version = "0.20.4" }
bytecode_verifier = { version = "0.0.1-sol4", package = "solana_libra_bytecode_verifier" } bytecode_verifier = { version = "0.0.1-sol4", package = "solana_libra_bytecode_verifier" }
canonical_serialization = { version = "0.0.1-sol4", package = "solana_libra_canonical_serialization" } canonical_serialization = { version = "0.0.1-sol4", package = "solana_libra_canonical_serialization" }

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-move-loader-program" name = "solana-move-loader-program"
version = "0.20.3" version = "0.20.4"
description = "Solana Move Loader" description = "Solana Move Loader"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -10,9 +10,9 @@ edition = "2018"
[dependencies] [dependencies]
log = "0.4.8" log = "0.4.8"
solana-logger = { path = "../../logger", version = "0.20.3" } solana-logger = { path = "../../logger", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.3" } solana-sdk = { path = "../../sdk", version = "0.20.4" }
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] [lib]
crate-type = ["lib", "cdylib"] crate-type = ["lib", "cdylib"]

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-noop-program" name = "solana-noop-program"
version = "0.20.3" version = "0.20.4"
description = "Solana noop program" description = "Solana noop program"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -10,8 +10,8 @@ edition = "2018"
[dependencies] [dependencies]
log = "0.4.8" log = "0.4.8"
solana-logger = { path = "../../logger", version = "0.20.3" } solana-logger = { path = "../../logger", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.3" } solana-sdk = { path = "../../sdk", version = "0.20.4" }
[lib] [lib]
crate-type = ["cdylib"] crate-type = ["cdylib"]

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-stake-api" name = "solana-stake-api"
version = "0.20.3" version = "0.20.4"
description = "Solana Stake program API" description = "Solana Stake program API"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -16,11 +16,11 @@ num-traits = "0.2"
rand = "0.6.5" rand = "0.6.5"
serde = "1.0.101" serde = "1.0.101"
serde_derive = "1.0.101" serde_derive = "1.0.101"
solana-logger = { path = "../../logger", version = "0.20.3" } solana-logger = { path = "../../logger", version = "0.20.4" }
solana-metrics = { path = "../../metrics", version = "0.20.3" } solana-metrics = { path = "../../metrics", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.3" } solana-sdk = { path = "../../sdk", version = "0.20.4" }
solana-vote-api = { path = "../vote_api", version = "0.20.3" } solana-vote-api = { path = "../vote_api", version = "0.20.4" }
solana-config-api = { path = "../config_api", version = "0.20.3" } solana-config-api = { path = "../config_api", version = "0.20.4" }
[lib] [lib]
crate-type = ["lib"] crate-type = ["lib"]

View File

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

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-stake-tests" name = "solana-stake-tests"
version = "0.20.3" version = "0.20.4"
description = "Solana stake api tests" description = "Solana stake api tests"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -10,12 +10,12 @@ edition = "2018"
[dependencies] [dependencies]
log = "0.4.8" log = "0.4.8"
solana-logger = { path = "../../logger", version = "0.20.3" } solana-logger = { path = "../../logger", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.3" } solana-sdk = { path = "../../sdk", version = "0.20.4" }
solana-stake-api = { path = "../stake_api", version = "0.20.3" } solana-stake-api = { path = "../stake_api", version = "0.20.4" }
solana-stake-program = { path = "../stake_program", version = "0.20.3" } solana-stake-program = { path = "../stake_program", version = "0.20.4" }
solana-vote-api = { path = "../vote_api", version = "0.20.3" } solana-vote-api = { path = "../vote_api", version = "0.20.4" }
[dev-dependencies] [dev-dependencies]
solana-runtime = { path = "../../runtime", version = "0.20.3" } solana-runtime = { path = "../../runtime", version = "0.20.4" }
assert_matches = "1.3.0" assert_matches = "1.3.0"

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-storage-api" name = "solana-storage-api"
version = "0.20.3" version = "0.20.4"
description = "Solana Storage program API" description = "Solana Storage program API"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -17,8 +17,8 @@ num-derive = "0.3"
num-traits = "0.2" num-traits = "0.2"
serde = "1.0.101" serde = "1.0.101"
serde_derive = "1.0.101" serde_derive = "1.0.101"
solana-logger = { path = "../../logger", version = "0.20.3" } solana-logger = { path = "../../logger", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.3" } solana-sdk = { path = "../../sdk", version = "0.20.4" }
[lib] [lib]
crate-type = ["lib"] crate-type = ["lib"]

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-storage-program" name = "solana-storage-program"
version = "0.20.3" version = "0.20.4"
description = "Solana storage program" description = "Solana storage program"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -10,12 +10,12 @@ edition = "2018"
[dependencies] [dependencies]
log = "0.4.8" log = "0.4.8"
solana-logger = { path = "../../logger", version = "0.20.3" } solana-logger = { path = "../../logger", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.3" } solana-sdk = { path = "../../sdk", version = "0.20.4" }
solana-storage-api = { path = "../storage_api", version = "0.20.3" } solana-storage-api = { path = "../storage_api", version = "0.20.4" }
[dev-dependencies] [dev-dependencies]
solana-runtime = { path = "../../runtime", version = "0.20.3" } solana-runtime = { path = "../../runtime", version = "0.20.4" }
assert_matches = "1.3.0" assert_matches = "1.3.0"
bincode = "1.2.0" bincode = "1.2.0"

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-vest-api" name = "solana-vest-api"
version = "0.20.3" version = "0.20.4"
description = "Solana Vest program API" description = "Solana Vest program API"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -16,11 +16,11 @@ num-derive = "0.2"
num-traits = "0.2" num-traits = "0.2"
serde = "1.0.100" serde = "1.0.100"
serde_derive = "1.0.100" serde_derive = "1.0.100"
solana-sdk = { path = "../../sdk", version = "0.20.3" } solana-sdk = { path = "../../sdk", version = "0.20.4" }
solana-config-api = { path = "../config_api", version = "0.20.3" } solana-config-api = { path = "../config_api", version = "0.20.4" }
[dev-dependencies] [dev-dependencies]
solana-runtime = { path = "../../runtime", version = "0.20.3" } solana-runtime = { path = "../../runtime", version = "0.20.4" }
[lib] [lib]
crate-type = ["lib"] crate-type = ["lib"]

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-vest-program" name = "solana-vest-program"
version = "0.20.3" version = "0.20.4"
description = "Solana Vest program" description = "Solana Vest program"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -10,9 +10,9 @@ edition = "2018"
[dependencies] [dependencies]
log = "0.4.8" log = "0.4.8"
solana-logger = { path = "../../logger", version = "0.20.3" } solana-logger = { path = "../../logger", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.3" } solana-sdk = { path = "../../sdk", version = "0.20.4" }
solana-vest-api = { path = "../vest_api", version = "0.20.3" } solana-vest-api = { path = "../vest_api", version = "0.20.4" }
[lib] [lib]
crate-type = ["lib", "cdylib"] crate-type = ["lib", "cdylib"]

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-vote-api" name = "solana-vote-api"
version = "0.20.3" version = "0.20.4"
description = "Solana Vote program API" description = "Solana Vote program API"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -15,9 +15,9 @@ num-derive = "0.3"
num-traits = "0.2" num-traits = "0.2"
serde = "1.0.101" serde = "1.0.101"
serde_derive = "1.0.101" serde_derive = "1.0.101"
solana-logger = { path = "../../logger", version = "0.20.3" } solana-logger = { path = "../../logger", version = "0.20.4" }
solana-metrics = { path = "../../metrics", version = "0.20.3" } solana-metrics = { path = "../../metrics", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.3" } solana-sdk = { path = "../../sdk", version = "0.20.4" }
[lib] [lib]
crate-type = ["lib"] crate-type = ["lib"]

View File

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

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-rayon-threadlimit" name = "solana-rayon-threadlimit"
version = "0.20.3" version = "0.20.4"
description = "solana-rayon-threadlimit" description = "solana-rayon-threadlimit"
homepage = "https://solana.com/" homepage = "https://solana.com/"
readme = "../README.md" readme = "../README.md"

1
run.sh
View File

@@ -90,6 +90,7 @@ args=(
--rpc-port 8899 --rpc-port 8899
--rpc-drone-address 127.0.0.1:9900 --rpc-drone-address 127.0.0.1:9900
--accounts "$dataDir"/accounts --accounts "$dataDir"/accounts
--log -
) )
if [[ -n $blockstreamSocket ]]; then if [[ -n $blockstreamSocket ]]; then
args+=(--blockstream "$blockstreamSocket") args+=(--blockstream "$blockstreamSocket")

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-runtime" name = "solana-runtime"
version = "0.20.3" version = "0.20.4"
description = "Solana runtime" description = "Solana runtime"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -24,20 +24,20 @@ rayon = "1.2.0"
serde = { version = "1.0.101", features = ["rc"] } serde = { version = "1.0.101", features = ["rc"] }
serde_derive = "1.0.101" serde_derive = "1.0.101"
serde_json = "1.0.41" serde_json = "1.0.41"
solana-logger = { path = "../logger", version = "0.20.3" } solana-logger = { path = "../logger", version = "0.20.4" }
solana-measure = { path = "../measure", version = "0.20.3" } solana-measure = { path = "../measure", version = "0.20.4" }
solana-metrics = { path = "../metrics", version = "0.20.3" } solana-metrics = { path = "../metrics", version = "0.20.4" }
solana-bpf-loader-api = { path = "../programs/bpf_loader_api", 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.3" } solana-bpf-loader-program = { path = "../programs/bpf_loader_program", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.3" } solana-sdk = { path = "../sdk", version = "0.20.4" }
solana-stake-api = { path = "../programs/stake_api", version = "0.20.3" } solana-stake-api = { path = "../programs/stake_api", version = "0.20.4" }
solana-stake-program = { path = "../programs/stake_program", version = "0.20.3" } solana-stake-program = { path = "../programs/stake_program", version = "0.20.4" }
solana-storage-api = { path = "../programs/storage_api", version = "0.20.3" } solana-storage-api = { path = "../programs/storage_api", version = "0.20.4" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.3" } solana-vote-api = { path = "../programs/vote_api", version = "0.20.4" }
solana-vote-program = { path = "../programs/vote_program", version = "0.20.3" } solana-vote-program = { path = "../programs/vote_program", version = "0.20.4" }
sys-info = "0.5.8" sys-info = "0.5.8"
tempfile = "3.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" }
itertools = "0.8.0" itertools = "0.8.0"
[lib] [lib]
@@ -45,4 +45,4 @@ crate-type = ["lib"]
name = "solana_runtime" name = "solana_runtime"
[dev-dependencies] [dev-dependencies]
solana-noop-program = { path = "../programs/noop_program", version = "0.20.3" } solana-noop-program = { path = "../programs/noop_program", version = "0.20.4" }

View File

@@ -810,15 +810,20 @@ impl Bank {
// TODO: put this assert back in // TODO: put this assert back in
// assert!(!self.is_frozen()); // assert!(!self.is_frozen());
inc_new_counter_debug!("bank-register_tick-registered", 1); 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; 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 { if self.is_block_boundary(current_tick_height + 1) {
self.blockhash_queue w_blockhash_queue.register_hash(hash, &self.fee_calculator);
.write()
.unwrap()
.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 /// Process a Transaction. This is used for unit tests and simply calls the vector
/// Bank::process_transactions method, and commits credit-only credits. /// Bank::process_transactions method, and commits credit-only credits.
pub fn process_transaction(&self, tx: &Transaction) -> Result<()> { pub fn process_transaction(&self, tx: &Transaction) -> Result<()> {

41
runtime/tests/bank.rs Normal file
View 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();
}
}

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-sdk-c" name = "solana-sdk-c"
version = "0.20.3" version = "0.20.4"
description = "Solana SDK C" description = "Solana SDK C"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -18,7 +18,7 @@ bs58 = "0.3.0"
libc = "0.2.65" libc = "0.2.65"
rand_chacha = "0.1.1" rand_chacha = "0.1.1"
rand_core = { version = ">=0.2, <0.4", default-features = false } rand_core = { version = ">=0.2, <0.4", default-features = false }
solana-sdk = { path = "../sdk", version = "0.20.3" } solana-sdk = { path = "../sdk", version = "0.20.4" }
solana-ed25519-dalek = "0.2.0" solana-ed25519-dalek = "0.2.0"
[build-dependencies] [build-dependencies]

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-sdk" name = "solana-sdk"
version = "0.20.3" version = "0.20.4"
description = "Solana SDK" description = "Solana SDK"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -49,6 +49,6 @@ serde_derive = "1.0.101"
serde_json = { version = "1.0.41", optional = true } serde_json = { version = "1.0.41", optional = true }
sha2 = "0.8.0" sha2 = "0.8.0"
solana-ed25519-dalek = { version = "0.2.0", optional = true } 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 } 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 }

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-sdk-bpf-test" name = "solana-sdk-bpf-test"
version = "0.20.3" version = "0.20.4"
description = "Solana BPF SDK test utilities" description = "Solana BPF SDK test utilities"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "solana-upload-perf" name = "solana-upload-perf"
version = "0.20.3" version = "0.20.4"
description = "Metrics Upload Utility" description = "Metrics Upload Utility"
authors = ["Solana Maintainers <maintainers@solana.com>"] authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
@@ -12,7 +12,7 @@ publish = false
[dependencies] [dependencies]
log = "0.4.8" log = "0.4.8"
serde_json = "1.0.41" serde_json = "1.0.41"
solana-metrics = { path = "../metrics", version = "0.20.3" } solana-metrics = { path = "../metrics", version = "0.20.4" }
[[bin]] [[bin]]
name = "solana-upload-perf" name = "solana-upload-perf"

View File

@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018" edition = "2018"
name = "solana-validator" name = "solana-validator"
description = "Blockchain, Rebuilt for Scale" description = "Blockchain, Rebuilt for Scale"
version = "0.20.3" version = "0.20.4"
repository = "https://github.com/solana-labs/solana" repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0" license = "Apache-2.0"
homepage = "https://solana.com/" homepage = "https://solana.com/"
@@ -17,17 +17,17 @@ log = "0.4.8"
indicatif = "0.12.0" indicatif = "0.12.0"
reqwest = { version = "0.9.22", default-features = false } reqwest = { version = "0.9.22", default-features = false }
serde_json = "1.0.41" serde_json = "1.0.41"
solana-client = { path = "../client", version = "0.20.3" } solana-client = { path = "../client", version = "0.20.4" }
solana-core = { path = "../core", version = "0.20.3" } solana-core = { path = "../core", version = "0.20.4" }
solana-drone = { path = "../drone", version = "0.20.3" } solana-drone = { path = "../drone", version = "0.20.4" }
solana-ledger = { path = "../ledger", version = "0.20.3" } solana-ledger = { path = "../ledger", version = "0.20.4" }
solana-logger = { path = "../logger", version = "0.20.3" } solana-logger = { path = "../logger", version = "0.20.4" }
solana-metrics = { path = "../metrics", version = "0.20.3" } solana-metrics = { path = "../metrics", version = "0.20.4" }
solana-netutil = { path = "../netutil", version = "0.20.3" } solana-netutil = { path = "../netutil", version = "0.20.4" }
solana-runtime = { path = "../runtime", version = "0.20.3" } solana-runtime = { path = "../runtime", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.3" } solana-sdk = { path = "../sdk", version = "0.20.4" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.3" } solana-vote-api = { path = "../programs/vote_api", version = "0.20.4" }
solana-vote-signer = { path = "../vote-signer", version = "0.20.3" } solana-vote-signer = { path = "../vote-signer", version = "0.20.4" }
tempfile = "3.1.0" tempfile = "3.1.0"
tar = "0.4.26" tar = "0.4.26"

View File

@@ -539,7 +539,7 @@ pub fn main() {
let default_logfile = format!( let default_logfile = format!(
"solana-validator-{}-{}.log", "solana-validator-{}-{}.log",
identity_keypair.pubkey(), 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); 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