wormhole/solana/UPGRADE.md

3.9 KiB

Solana SDK upgrade

This document describes the process of upgrading the Solana SDK dependency, using the upgrade from 1.9.4 to 1.10.31 as a running example.

rust-toolchain

The first step is to ensure that the rust toolchain version used to compile the wormhole contracts matches the version that the solana SDK was tested against. This is especially important since wormhole uses nightly toolchains, which are particularly sensitive to changes between versions.

For v1.10.31, the version can be found at https://github.com/solana-labs/solana/blob/v1.10.31/ci/rust-version.sh. We update the rust-toolchain file to reflect the version there, in this case "nightly-2022-02-24".

Dependencies

Once the rust toolchain is set, we can proceed with upgrading the solana sdk. The process is somewhat interactive in that it might require upgrading multiple dependencies until the project compiles (due to potential incompatibility with the nightly compiler). Since the solana-sdk version is pinned in the Cargo.toml files, we need to edit those files manually.

Running the following script will change the 1.9.4 version numbers to 1.10.31.

find . -name "Cargo.toml" -exec sed -i 's/=1.9.4/=1.10.31/g' {} \;

As a sanity check, make sure that only the solana-sdk packages were changed in this way.

Now attempt to build the project by running

cargo build --locked

The --locked flag is important, as it will make sure to not change any of the dependencies in the Cargo.lock file outside of the ones we just pinned to newer versions.

In this particular case, the build fails because borsh is pinned to 0.9.1, but the new solana sdk needs 0.9.3. Since we're upgrading a pinned library, we must look at the changelog to ensure there's no inadvertent change we're introducing to the code. borsh is a very popular library, so it is reasonable to expect they follow semantic versioning properly, but it's still good practice to look at the changelog: https://github.com/near/borsh-rs/blob/master/CHANGELOG.md

Once verified, we can upgrade borsh by running

find . -name "Cargo.toml" -exec sed -i 's/borsh = "=0.9.1"/borsh = "=0.9.3"/g' {} \;

running cargo build --locked again now fails with spl-token being out of date, which we can upgrade by running

find . -name "Cargo.toml" -exec sed -i 's/spl-token = { version = "=3.2.0"/spl-token = { version = "=3.3.0"/g' {} \;

Now the dependency versions are all fixed as far as cargo's dependency resolver is concerned, but running cargo build --locked produces compilation errors when building some upstream dependencies. In this case the culprit is that the nightly compiler upgrade changed some feature guards so packages that used to build fine with the old toolchain now fail to compile. Since these are transitive dependencies of the solana sdk, the best way to move forward is to simply upgrade or downgrade them to whatever version they're pinned at in solana: https://github.com/solana-labs/solana/blob/v1.10.31/Cargo.lock

The two packages in question are crossbeam-epoch and lock_api, so we pin them to match solana's version by running

cargo update -p crossbeam-epoch --precise 0.9.5
cargo update -p lock_api --precise 0.4.6

With this, cargo build --locked finished cleanly, and the Cargo.toml files along with Cargo.lock may now be checked in.

cargo audit

As a sanity check, install cargo-audit by running

cargo install cargo-audit --locked

NOTE: you might want to install this outside of the repo using a stable compiler toolchain.

Then run

cargo audit

and investigate any potential vulnerabilities in the dependencies. In this case, cargo audit found two issues, both are potential segfaults. Since these both come from upstream dependencies through solana, it is reasonable to leave them at those versions. This requires case by case assessment in general.