Aptos improvements (#1079)

* More documentation on the upgrade procedure and mainnet init

* Add profiling utility for aptos

* Reuse contract manager logic to sync guardian sets

* Add documentation for sui gas profiling
This commit is contained in:
Amin Moghaddam 2023-10-10 13:03:01 +03:00 committed by GitHub
parent 0c25fccce5
commit f224486ae2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 103 additions and 42 deletions

View File

@ -46,6 +46,22 @@ npm run cli init-pyth -- <seed> -n testnet \
--data-source-emitter-addresses e101faedac5851e32b9b23b5f9411a8c2bac4aae3ed4dd7b811dd1a72ea4aa71 --data-source-emitter-addresses e101faedac5851e32b9b23b5f9411a8c2bac4aae3ed4dd7b811dd1a72ea4aa71
``` ```
The following is a sample mainnet config:
```bash
npm run cli init-pyth -- <seed> -n mainnet \
--stale-price-threshold 60 \
--update-fee 1 \
--governance-emitter-chain-id 1 \
--governance-emitter-address 5635979a221c34931e32620b9293a463065555ea71fe97cd6237ade875b12e9e \
--data-source-chain-ids 1 \
--data-source-chain-ids 26 \
--data-source-chain-ids 26 \
--data-source-emitter-addresses 6bb14509a612f01fbbc4cffeebd4bbfb492a86df717ebe92eb6df432a3f00a25 \
--data-source-emitter-addresses f8cd23c2ab91237730770bbea08d61005cdda0984348f3f6eecb559638c0bba0 \
--data-source-emitter-addresses e101faedac5851e32b9b23b5f9411a8c2bac4aae3ed4dd7b811dd1a72ea4aa71
```
Note that the `data-source-chain-ids` are paired with `data-source-emitter-addresses` and their order matters. Note that the `data-source-chain-ids` are paired with `data-source-emitter-addresses` and their order matters.
# Upgrade process: # Upgrade process:
@ -55,6 +71,7 @@ The following steps are needed to upgrade our aptos contracts:
- Generate the hash for the new contract build - Generate the hash for the new contract build
- Create a governance proposal, proposing the aptos package to be upgraded to this specific hash - Create a governance proposal, proposing the aptos package to be upgraded to this specific hash
- Approve and execute the governance proposal - Approve and execute the governance proposal
- Submit the created wormhole VAA to the contract to allow an upgrade with the specified hash.
- Run the upgrade transaction and publish the new package - Run the upgrade transaction and publish the new package
## Generating the new contract hash: ## Generating the new contract hash:
@ -65,6 +82,42 @@ Run the following command to generate the new hash, this will assume the default
npm run cli hash-contracts -- ../contracts npm run cli hash-contracts -- ../contracts
``` ```
## Creating a proposal
Here are sample steps you can take to create a proposal via the contract manager shell (`npm run shell` in contract manager package):
```js
let wallet = await loadHotWallet("/path/to/solana/wallet.json");
let vault =
DefaultStore.vaults.devnet_6baWtW1zTUVMSJHJQVxDUXWzqrQeYBr6mu31j3bTKwY3;
await vault.connect(wallet);
let payload =
DefaultStore.chains.aptos_testnet.generateGovernanceUpgradePayload(
"CONTRACT_HASH_TO_USE"
);
await vault.proposeWormholeMessage([payload]);
```
## VAA submission
After the approval process, you can fetch the VAA for the transaction and execute it by running:
```js
import { SubmittedWormholeMessage } from "./src/governance";
let msg = await SubmittedWormholeMessage.fromTransactionSignature(
"tx_signature",
"devnet or mainnet-beta"
);
let vaa = await msg.fetchVaa();
let contract =
DefaultStore.contracts
.aptos_testnet_0x7e783b349d3e89cf5931af376ebeadbfab855b3fa239b7ada8f5a92fbea6b387;
await contract.executeGovernanceInstruction(
"private-key-of-account-inaptos",
vaa
);
```
## Upgrading the contract ## Upgrading the contract
To upgrade the contract after the governance vaa was executed run: To upgrade the contract after the governance vaa was executed run:

View File

@ -0,0 +1,12 @@
[package]
name = "Profiler"
version = "0.0.1"
upgrade_policy = "compatible"
[dependencies]
Pyth = { git = "https://github.com/pyth-network/pyth-crosschain.git", addr_subst = { "pyth" = "0x7e783b349d3e89cf5931af376ebeadbfab855b3fa239b7ada8f5a92fbea6b387" }, subdir = "target_chains/aptos/contracts", rev = "main" }
[addresses]
pyth = "0x7e783b349d3e89cf5931af376ebeadbfab855b3fa239b7ada8f5a92fbea6b387"
deployer = "0xb31e712b26fd295357355f6845e77c888298636609e93bc9b05f0f604049f434"
wormhole = "0x5bc11445584a763c1fa7ed39081f1b920954da14e04b32440cba863d03e19625"

View File

@ -0,0 +1,11 @@
# Gas Profiling Utilities
You can compile and run a simple script in this package to profile gas consumption on a deployed pyth contract.
Here are the steps:
1. Run `aptos move compile` to compile the script
2. Run the following to simulate the transaction and create a gas profile:
```
aptos move run-script --compiled-script-path build/Profiler/bytecode_scripts/main.mv --args hex:<update_data_payload_in_hex> --profile-gas
```
3. Open the created svg files in the `gas-profiling` folder to inspect gas consumption by each module and function

View File

@ -0,0 +1,9 @@
script {
use pyth::pyth;
fun main(src: &signer, payload:vector<u8>) {
let payload:vector<vector<u8>> = vector[payload];
pyth::update_price_feeds_with_funder(src,payload);
}
}

View File

@ -1,52 +1,17 @@
// run this script with truffle exec // run this script with truffle exec
const jsonfile = require("jsonfile");
const WormholeReceiver = artifacts.require("WormholeReceiver"); const WormholeReceiver = artifacts.require("WormholeReceiver");
const WormholeReceiverImplementationFullABI = jsonfile.readFileSync(
"../build/contracts/ReceiverImplementation.json"
).abi;
const GUARDIAN_SET_UPGRADE_1_VAA =
"010000000001007ac31b282c2aeeeb37f3385ee0de5f8e421d30b9e5ae8ba3d4375c1c77a86e77159bb697d9c456d6f8c02d22a94b1279b65b0d6a9957e7d3857423845ac758e300610ac1d2000000030001000000000000000000000000000000000000000000000000000000000000000400000000000005390000000000000000000000000000000000000000000000000000000000436f7265020000000000011358cc3ae5c097b213ce3c81979e1b9f9570746aa5ff6cb952589bde862c25ef4392132fb9d4a42157114de8460193bdf3a2fcf81f86a09765f4762fd1107a0086b32d7a0977926a205131d8731d39cbeb8c82b2fd82faed2711d59af0f2499d16e726f6b211b39756c042441be6d8650b69b54ebe715e234354ce5b4d348fb74b958e8966e2ec3dbd4958a7cdeb5f7389fa26941519f0863349c223b73a6ddee774a3bf913953d695260d88bc1aa25a4eee363ef0000ac0076727b35fbea2dac28fee5ccb0fea768eaf45ced136b9d9e24903464ae889f5c8a723fc14f93124b7c738843cbb89e864c862c38cddcccf95d2cc37a4dc036a8d232b48f62cdd4731412f4890da798f6896a3331f64b48c12d1d57fd9cbe7081171aa1be1d36cafe3867910f99c09e347899c19c38192b6e7387ccd768277c17dab1b7a5027c0b3cf178e21ad2e77ae06711549cfbb1f9c7a9d8096e85e1487f35515d02a92753504a8d75471b9f49edb6fbebc898f403e4773e95feb15e80c9a99c8348d";
const GUARDIAN_SET_UPGRADE_2_VAA =
"01000000010d0012e6b39c6da90c5dfd3c228edbb78c7a4c97c488ff8a346d161a91db067e51d638c17216f368aa9bdf4836b8645a98018ca67d2fec87d769cabfdf2406bf790a0002ef42b288091a670ef3556596f4f47323717882881eaf38e03345078d07a156f312b785b64dae6e9a87e3d32872f59cb1931f728cecf511762981baf48303668f0103cef2616b84c4e511ff03329e0853f1bd7ee9ac5ba71d70a4d76108bddf94f69c2a8a84e4ee94065e8003c334e899184943634e12043d0dda78d93996da073d190104e76d166b9dac98f602107cc4b44ac82868faf00b63df7d24f177aa391e050902413b71046434e67c770b19aecdf7fce1d1435ea0be7262e3e4c18f50ddc8175c0105d9450e8216d741e0206a50f93b750a47e0a258b80eb8fed1314cc300b3d905092de25cd36d366097b7103ae2d184121329ba3aa2d7c6cc53273f11af14798110010687477c8deec89d36a23e7948feb074df95362fc8dcbd8ae910ac556a1dee1e755c56b9db5d710c940938ed79bc1895a3646523a58bc55f475a23435a373ecfdd0107fb06734864f79def4e192497362513171530daea81f07fbb9f698afe7e66c6d44db21323144f2657d4a5386a954bb94eef9f64148c33aef6e477eafa2c5c984c01088769e82216310d1827d9bd48645ec23e90de4ef8a8de99e2d351d1df318608566248d80cdc83bdcac382b3c30c670352be87f9069aab5037d0b747208eae9c650109e9796497ff9106d0d1c62e184d83716282870cef61a1ee13d6fc485b521adcce255c96f7d1bca8d8e7e7d454b65783a830bddc9d94092091a268d311ecd84c26010c468c9fb6d41026841ff9f8d7368fa309d4dbea3ea4bbd2feccf94a92cc8a20a226338a8e2126cd16f70eaf15b4fc9be2c3fa19def14e071956a605e9d1ac4162010e23fcb6bd445b7c25afb722250c1acbc061ed964ba9de1326609ae012acdfb96942b2a102a2de99ab96327859a34a2b49a767dbdb62e0a1fb26af60fe44fd496a00106bb0bac77ac68b347645f2fb1ad789ea9bd76fb9b2324f25ae06f97e65246f142df717f662e73948317182c62ce87d79c73def0dba12e5242dfc038382812cfe00126da03c5e56cb15aeeceadc1e17a45753ab4dc0ec7bf6a75ca03143ed4a294f6f61bc3f478a457833e43084ecd7c985bf2f55a55f168aac0e030fc49e845e497101626e9d9a5d9e343f00010000000000000000000000000000000000000000000000000000000000000004c1759167c43f501c2000000000000000000000000000000000000000000000000000000000436f7265020000000000021358cc3ae5c097b213ce3c81979e1b9f9570746aa5ff6cb952589bde862c25ef4392132fb9d4a42157114de8460193bdf3a2fcf81f86a09765f4762fd1107a0086b32d7a0977926a205131d8731d39cbeb8c82b2fd82faed2711d59af0f2499d16e726f6b211b39756c042441be6d8650b69b54ebe715e234354ce5b4d348fb74b958e8966e2ec3dbd4958a7cd66b9590e1c41e0b226937bf9217d1d67fd4e91f574a3bf913953d695260d88bc1aa25a4eee363ef0000ac0076727b35fbea2dac28fee5ccb0fea768eaf45ced136b9d9e24903464ae889f5c8a723fc14f93124b7c738843cbb89e864c862c38cddcccf95d2cc37a4dc036a8d232b48f62cdd4731412f4890da798f6896a3331f64b48c12d1d57fd9cbe7081171aa1be1d36cafe3867910f99c09e347899c19c38192b6e7387ccd768277c17dab1b7a5027c0b3cf178e21ad2e77ae06711549cfbb1f9c7a9d8096e85e1487f35515d02a92753504a8d75471b9f49edb6fbebc898f403e4773e95feb15e80c9a99c8348d";
const GUARDIAN_SET_UPGRADE_3_VAA =
"01000000020d00ce45474d9e1b1e7790a2d210871e195db53a70ffd6f237cfe70e2686a32859ac43c84a332267a8ef66f59719cf91cc8df0101fd7c36aa1878d5139241660edc0010375cc906156ae530786661c0cd9aef444747bc3d8d5aa84cac6a6d2933d4e1a031cffa30383d4af8131e929d9f203f460b07309a647d6cd32ab1cc7724089392c000452305156cfc90343128f97e499311b5cae174f488ff22fbc09591991a0a73d8e6af3afb8a5968441d3ab8437836407481739e9850ad5c95e6acfcc871e951bc30105a7956eefc23e7c945a1966d5ddbe9e4be376c2f54e45e3d5da88c2f8692510c7429b1ea860ae94d929bd97e84923a18187e777aa3db419813a80deb84cc8d22b00061b2a4f3d2666608e0aa96737689e3ba5793810ff3a52ff28ad57d8efb20967735dc5537a2e43ef10f583d144c12a1606542c207f5b79af08c38656d3ac40713301086b62c8e130af3411b3c0d91b5b50dcb01ed5f293963f901fc36e7b0e50114dce203373b32eb45971cef8288e5d928d0ed51cd86e2a3006b0af6a65c396c009080009e93ab4d2c8228901a5f4525934000b2c26d1dc679a05e47fdf0ff3231d98fbc207103159ff4116df2832eea69b38275283434e6cd4a4af04d25fa7a82990b707010aa643f4cf615dfff06ffd65830f7f6cf6512dabc3690d5d9e210fdc712842dc2708b8b2c22e224c99280cd25e5e8bfb40e3d1c55b8c41774e287c1e2c352aecfc010b89c1e85faa20a30601964ccc6a79c0ae53cfd26fb10863db37783428cd91390a163346558239db3cd9d420cfe423a0df84c84399790e2e308011b4b63e6b8015010ca31dcb564ac81a053a268d8090e72097f94f366711d0c5d13815af1ec7d47e662e2d1bde22678113d15963da100b668ba26c0c325970d07114b83c5698f46097010dc9fda39c0d592d9ed92cd22b5425cc6b37430e236f02d0d1f8a2ef45a00bde26223c0a6eb363c8b25fd3bf57234a1d9364976cefb8360e755a267cbbb674b39501108db01e444ab1003dd8b6c96f8eb77958b40ba7a85fefecf32ad00b7a47c0ae7524216262495977e09c0989dd50f280c21453d3756843608eacd17f4fdfe47600001261025228ef5af837cb060bcd986fcfa84ccef75b3fa100468cfd24e7fadf99163938f3b841a33496c2706d0208faab088bd155b2e20fd74c625bb1cc8c43677a0163c53c409e0c5dfa000100000000000000000000000000000000000000000000000000000000000000046c5a054d7833d1e42000000000000000000000000000000000000000000000000000000000436f7265020000000000031358cc3ae5c097b213ce3c81979e1b9f9570746aa5ff6cb952589bde862c25ef4392132fb9d4a42157114de8460193bdf3a2fcf81f86a09765f4762fd1107a0086b32d7a0977926a205131d8731d39cbeb8c82b2fd82faed2711d59af0f2499d16e726f6b211b39756c042441be6d8650b69b54ebe715e234354ce5b4d348fb74b958e8966e2ec3dbd4958a7cd15e7caf07c4e3dc8e7c469f92c8cd88fb8005a2074a3bf913953d695260d88bc1aa25a4eee363ef0000ac0076727b35fbea2dac28fee5ccb0fea768eaf45ced136b9d9e24903464ae889f5c8a723fc14f93124b7c738843cbb89e864c862c38cddcccf95d2cc37a4dc036a8d232b48f62cdd4731412f4890da798f6896a3331f64b48c12d1d57fd9cbe7081171aa1be1d36cafe3867910f99c09e347899c19c38192b6e7387ccd768277c17dab1b7a5027c0b3cf178e21ad2e77ae06711549cfbb1f9c7a9d8096e85e1487f35515d02a92753504a8d75471b9f49edb6fbebc898f403e4773e95feb15e80c9a99c8348d";
const { WormholeEvmContract, DefaultStore } = require("contract_manager");
const { Wallet } = require("ethers");
module.exports = async function (callback) { module.exports = async function (callback) {
try { try {
const accounts = await web3.eth.getAccounts(); const contract = new WormholeEvmContract(
const initialized = new web3.eth.Contract( DefaultStore.chains[process.env.MIGRATIONS_NETWORK],
WormholeReceiverImplementationFullABI,
WormholeReceiver.address WormholeReceiver.address
); );
// Upgrade set 0 to set 1 const wallet = Wallet.fromMnemonic(process.env.MNEMONIC);
console.log("Upgrading to guardian set 1."); const privateKey = wallet.privateKey.replace("0x", "");
await initialized.methods await contract.syncMainnetGuardianSets(privateKey);
.submitNewGuardianSet("0x" + GUARDIAN_SET_UPGRADE_1_VAA)
.send({
value: 0,
from: accounts[0],
gasLimit: 2000000,
});
// Upgrade set 1 to set 2
console.log("Upgrading to guardian set 2.");
await initialized.methods
.submitNewGuardianSet("0x" + GUARDIAN_SET_UPGRADE_2_VAA)
.send({
value: 0,
from: accounts[0],
gasLimit: 2000000,
});
// Upgrade set 2 to set 3
console.log("Upgrading to guardian set 3.");
await initialized.methods
.submitNewGuardianSet("0x" + GUARDIAN_SET_UPGRADE_3_VAA)
.send({
value: 0,
from: accounts[0],
gasLimit: 2000000,
});
console.log("Updated the guardian set successfully."); console.log("Updated the guardian set successfully.");
callback(); callback();
} catch (e) { } catch (e) {

View File

@ -5,3 +5,14 @@ Contracts are compiled with sui cli version `sui 1.0.0-09b208149` that can be in
```commandline ```commandline
cargo install --locked --git https://github.com/MystenLabs/sui.git --rev 09b2081498366df936abae26eea4b2d5cafb2788 sui sui-faucet cargo install --locked --git https://github.com/MystenLabs/sui.git --rev 09b2081498366df936abae26eea4b2d5cafb2788 sui sui-faucet
``` ```
## Gas Profiling
Using the [`sui-tool` binary](https://github.com/MystenLabs/sui/pull/12680), you can profile gas usage of transactions by running:
```bash
env MOVE_VM_PROFILE=1 ./sui-tool replay --rpc https://fullnode.mainnet.sui.io:443 tx -t <tx-signature>
```
`sui-tool` gas profiling works only when built with debug profile and should be compiled by your own (you can't use the precompiled binary).
We suggest benchmarking on mainnet or where the number of wormhole signature checks is the same as on mainnet.