From e3bd9e53002bf5452d14616ee6d11d843c47971a Mon Sep 17 00:00:00 2001 From: Jack May Date: Tue, 19 Jan 2021 16:24:44 -0800 Subject: [PATCH] Prevent the invoke and upgrade of programs in the same tx batch (#14653) * Prevent the invoke and upgrade of programs in the same tx batch * Pass program address as writable in the upgrade instruction --- programs/bpf/Cargo.lock | 1242 +++++++++++++++-- programs/bpf/Cargo.toml | 6 +- programs/bpf/tests/programs.rs | 325 ++++- programs/bpf_loader/src/lib.rs | 63 +- runtime/src/loader_utils.rs | 18 +- sdk/program/src/bpf_loader_upgradeable.rs | 43 +- .../src/loader_upgradeable_instruction.rs | 2 +- sdk/src/feature_set.rs | 5 + transaction-status/src/lib.rs | 2 +- 9 files changed, 1544 insertions(+), 162 deletions(-) diff --git a/programs/bpf/Cargo.lock b/programs/bpf/Cargo.lock index 6440d61aa0..c9d949f4d1 100644 --- a/programs/bpf/Cargo.lock +++ b/programs/bpf/Cargo.lock @@ -43,6 +43,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "ansi_term" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +dependencies = [ + "winapi 0.3.8", +] + [[package]] name = "arrayref" version = "0.3.6" @@ -98,12 +107,30 @@ dependencies = [ "serde", ] +[[package]] +name = "base32" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23ce669cd6c8588f79e15cf450314f9638f967fc5770ff1c7c1deb0925ea7cfa" + +[[package]] +name = "base64" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" + [[package]] name = "base64" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + [[package]] name = "bincode" version = "1.3.1" @@ -229,6 +256,12 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "130aac562c0dd69c56b3b1cc8ffd2e17be31d0b6c25b61c96b76231aa23e39e1" +[[package]] +name = "bytes" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0dcbc35f504eb6fc275a6d20e4ebcda18cf50d40ba6fabff8c711fa16cb3b16" + [[package]] name = "bzip2" version = "0.3.3" @@ -286,6 +319,21 @@ dependencies = [ "winapi 0.3.8", ] +[[package]] +name = "clap" +version = "2.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" +dependencies = [ + "ansi_term", + "atty", + "bitflags", + "strsim", + "textwrap", + "unicode-width", + "vec_map", +] + [[package]] name = "cloudabi" version = "0.0.3" @@ -308,6 +356,39 @@ dependencies = [ "unreachable", ] +[[package]] +name = "console" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c0994e656bba7b922d8dd1245db90672ffb701e684e45be58f20719d69abc5a" +dependencies = [ + "encode_unicode", + "lazy_static", + "libc", + "regex", + "terminal_size", + "termios", + "unicode-width", + "winapi 0.3.8", + "winapi-util", +] + +[[package]] +name = "console" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a50aab2529019abfabfa93f1e6c41ef392f91fbf179b347a7e96abb524884a08" +dependencies = [ + "encode_unicode", + "lazy_static", + "libc", + "regex", + "terminal_size", + "unicode-width", + "winapi 0.3.8", + "winapi-util", +] + [[package]] name = "const-random" version = "0.1.8" @@ -324,7 +405,7 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25e4c606eb459dd29f7c57b2e0879f2b6f14ee130918c2b78ccb58a9624e6c7a" dependencies = [ - "getrandom", + "getrandom 0.1.14", "proc-macro-hack", ] @@ -340,6 +421,22 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +[[package]] +name = "core-foundation" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a89e2ae426ea83155dccf10c0fa6b1463ef6d5fcb44cee0b224a408fa640a62" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b" + [[package]] name = "crc32fast" version = "1.2.0" @@ -487,7 +584,7 @@ checksum = "5d85653f070353a16313d0046f173f70d1aadd5b42600a14de626f0dfb3473a5" dependencies = [ "byteorder 1.3.4", "digest 0.8.1", - "rand_core", + "rand_core 0.5.1", "subtle 2.2.2", "zeroize", ] @@ -500,7 +597,7 @@ checksum = "c8492de420e9e60bc9a1d66e2dbb91825390b738a388606600663fc529b4b307" dependencies = [ "byteorder 1.3.4", "digest 0.9.0", - "rand_core", + "rand_core 0.5.1", "subtle 2.2.2", "zeroize", ] @@ -516,6 +613,28 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "derivative" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaed5874effa6cde088c644ddcdcb4ffd1511391c5be4fdd7a5ccd02c7e4a183" +dependencies = [ + "proc-macro2 1.0.24", + "quote 1.0.6", + "syn 1.0.48", +] + +[[package]] +name = "dialoguer" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4aa86af7b19b40ef9cbef761ed411a49f0afa06b7b6dcd3dfe2f96a3c546138" +dependencies = [ + "console 0.11.3", + "lazy_static", + "tempfile", +] + [[package]] name = "digest" version = "0.8.1" @@ -567,7 +686,7 @@ checksum = "21a8a37f4e8b35af971e6db5e3897e7a6344caa3f92f6544f88125a1f5f0035a" dependencies = [ "curve25519-dalek 2.1.0", "ed25519", - "rand", + "rand 0.7.3", "serde", "sha2", "zeroize", @@ -588,6 +707,12 @@ dependencies = [ "byteorder 0.5.3", ] +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + [[package]] name = "encoding_rs" version = "0.8.23" @@ -610,6 +735,28 @@ dependencies = [ "termcolor", ] +[[package]] +name = "failure" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" +dependencies = [ + "backtrace", + "failure_derive", +] + +[[package]] +name = "failure_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" +dependencies = [ + "proc-macro2 1.0.24", + "quote 1.0.6", + "syn 1.0.48", + "synstructure", +] + [[package]] name = "fake-simd" version = "0.1.2" @@ -630,7 +777,7 @@ checksum = "affc17579b132fc2461adf7c575cc6e8b134ebca52c51f5411388965227dc695" dependencies = [ "cfg-if 0.1.10", "libc", - "redox_syscall", + "redox_syscall 0.1.56", "winapi 0.3.8", ] @@ -652,6 +799,21 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "fs_extra" version = "1.1.0" @@ -784,7 +946,18 @@ checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" dependencies = [ "cfg-if 0.1.10", "libc", - "wasi", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4060f4657be78b8e766215b02b18a2e862d83745545de804638e2b545e81aee6" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "wasi 0.10.1+wasi-snapshot-preview1", ] [[package]] @@ -853,6 +1026,17 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" +[[package]] +name = "hidapi" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76c352a18370f7e7e47bcbfcbdc5432b8c80c705b5d751a25232c659fcf5c775" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + [[package]] name = "hmac" version = "0.7.1" @@ -973,6 +1157,36 @@ dependencies = [ "autocfg", ] +[[package]] +name = "indicatif" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7baab56125e25686df467fe470785512329883aab42696d661247aca2a2896e4" +dependencies = [ + "console 0.13.0", + "lazy_static", + "number_prefix", + "regex", +] + +[[package]] +name = "input_buffer" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19a8a95243d5a0398cae618ec29477c6e3cb631152be5c19481f80bc71559754" +dependencies = [ + "bytes 0.5.4", +] + +[[package]] +name = "instant" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" +dependencies = [ + "cfg-if 1.0.0", +] + [[package]] name = "iovec" version = "0.1.4" @@ -997,6 +1211,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37d572918e350e82412fe766d24b15e6682fb2ed2bbe018280caa810397cb319" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.5" @@ -1053,6 +1276,19 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "jsonrpc-core" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0745a6379e3edc893c84ec203589790774e4247420033e71a76d3ab4687991fa" +dependencies = [ + "futures", + "log", + "serde", + "serde_derive", + "serde_json", +] + [[package]] name = "keccak" version = "0.1.0" @@ -1103,7 +1339,7 @@ dependencies = [ "crunchy", "digest 0.8.1", "hmac-drbg", - "rand", + "rand 0.7.3", "sha2", "subtle 2.2.2", "typenum", @@ -1118,6 +1354,15 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "lock_api" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd96ffd135b2fd7b973ac026d28085defbe8983df057ced3eb4f2130b0831312" +dependencies = [ + "scopeguard", +] + [[package]] name = "log" version = "0.4.11" @@ -1210,12 +1455,25 @@ dependencies = [ "kernel32-sys", "libc", "log", - "miow", + "miow 0.2.2", "net2", "slab", "winapi 0.2.8", ] +[[package]] +name = "mio" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e50ae3f04d169fcc9bde0b547d1c205219b7157e07ded9c5aff03e0637cb3ed7" +dependencies = [ + "libc", + "log", + "miow 0.3.6", + "ntapi", + "winapi 0.3.8", +] + [[package]] name = "mio-uds" version = "0.6.8" @@ -1224,7 +1482,7 @@ checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" dependencies = [ "iovec", "libc", - "mio", + "mio 0.6.22", ] [[package]] @@ -1239,6 +1497,34 @@ dependencies = [ "ws2_32-sys", ] +[[package]] +name = "miow" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a33c1b55807fbed163481b5ba66db4b2fa6cde694a5027be10fb724206c5897" +dependencies = [ + "socket2", + "winapi 0.3.8", +] + +[[package]] +name = "native-tls" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8d96b2e1c8da3957d58100b09f102c6d9cfdfced01b7ec5a8974044bb09dbd4" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "net2" version = "0.2.37" @@ -1250,6 +1536,27 @@ dependencies = [ "winapi 0.3.8", ] +[[package]] +name = "nix" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ccba0cfe4fdf15982d1674c69b1fd80bad427d293849982668dfe454bd61f2" +dependencies = [ + "bitflags", + "cc", + "cfg-if 1.0.0", + "libc", +] + +[[package]] +name = "ntapi" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a31937dea023539c72ddae0e3571deadc1414b300483fa7aaec176168cfa9d2" +dependencies = [ + "winapi 0.3.8", +] + [[package]] name = "num-derive" version = "0.2.5" @@ -1301,6 +1608,34 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "226b45a5c2ac4dd696ed30fa6b94b057ad909c7b7fc2e0d0808192bced894066" +dependencies = [ + "derivative", + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c0fd9eba1d5db0994a239e09c1be402d35622277e35468ba891aa5e3188ce7e" +dependencies = [ + "proc-macro-crate", + "proc-macro2 1.0.24", + "quote 1.0.6", + "syn 1.0.48", +] + +[[package]] +name = "number_prefix" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b02fc0ff9a9e4b35b3342880f48e896ebf69f2967921fe8646bf5b7125956a" + [[package]] name = "object" version = "0.19.0" @@ -1309,9 +1644,12 @@ checksum = "9cbca9424c482ee628fa549d9c812e2cd22f1180b9222c9200fdfa6eb31aecb2" [[package]] name = "once_cell" -version = "1.4.0" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d" +checksum = "13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0" +dependencies = [ + "parking_lot 0.11.1", +] [[package]] name = "opaque-debug" @@ -1325,6 +1663,39 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "openssl" +version = "0.10.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "038d43985d1ddca7a9900630d8cd031b56e4794eecc2e9ea39dd17aa04399a70" +dependencies = [ + "bitflags", + "cfg-if 1.0.0", + "foreign-types", + "lazy_static", + "libc", + "openssl-sys", +] + +[[package]] +name = "openssl-probe" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" + +[[package]] +name = "openssl-sys" +version = "0.9.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "921fc71883267538946025deffb622905ecad223c28efbfdef9bb59a0175f3e6" +dependencies = [ + "autocfg", + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "ouroboros" version = "0.5.1" @@ -1353,11 +1724,32 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" dependencies = [ - "lock_api", - "parking_lot_core", + "lock_api 0.3.4", + "parking_lot_core 0.6.2", "rustc_version", ] +[[package]] +name = "parking_lot" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e" +dependencies = [ + "lock_api 0.3.4", + "parking_lot_core 0.7.2", +] + +[[package]] +name = "parking_lot" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" +dependencies = [ + "instant", + "lock_api 0.4.2", + "parking_lot_core 0.8.2", +] + [[package]] name = "parking_lot_core" version = "0.6.2" @@ -1367,12 +1759,40 @@ dependencies = [ "cfg-if 0.1.10", "cloudabi", "libc", - "redox_syscall", + "redox_syscall 0.1.56", "rustc_version", "smallvec 0.6.14", "winapi 0.3.8", ] +[[package]] +name = "parking_lot_core" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d58c7c768d4ba344e3e8d72518ac13e259d7c7ade24167003b8488e10b6740a3" +dependencies = [ + "cfg-if 0.1.10", + "cloudabi", + "libc", + "redox_syscall 0.1.56", + "smallvec 1.6.1", + "winapi 0.3.8", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ccb628cad4f84851442432c60ad8e1f607e29752d0bf072cbd0baf28aa34272" +dependencies = [ + "cfg-if 1.0.0", + "instant", + "libc", + "redox_syscall 0.1.56", + "smallvec 1.6.1", + "winapi 0.3.8", +] + [[package]] name = "paste" version = "0.1.18" @@ -1408,6 +1828,15 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +[[package]] +name = "pest" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" +dependencies = [ + "ucd-trie", +] + [[package]] name = "pin-project" version = "0.4.26" @@ -1454,6 +1883,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7505eeebd78492e0f6108f7171c4948dbb120ee8119d9d77d0afa5469bef67f" +[[package]] +name = "pin-project-lite" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439697af366c49a6d0a010c56a0d97685bc140ce0d377b13a2ea2aa42d64a827" + [[package]] name = "pin-utils" version = "0.1.0" @@ -1478,6 +1913,15 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "237a5ed80e274dbc66f86bd59c1e25edc039660be53194b5fe0a482e0f2612ea" +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml", +] + [[package]] name = "proc-macro-hack" version = "0.5.16" @@ -1532,14 +1976,26 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom", + "getrandom 0.1.14", "libc", - "rand_chacha", - "rand_core", - "rand_hc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc 0.2.0", "rand_pcg", ] +[[package]] +name = "rand" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18519b42a40024d661e1714153e9ad0c3de27cd495760ceb09710920f1098b1e" +dependencies = [ + "libc", + "rand_chacha 0.3.0", + "rand_core 0.6.1", + "rand_hc 0.3.0", +] + [[package]] name = "rand_chacha" version = "0.2.2" @@ -1547,7 +2003,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.1", ] [[package]] @@ -1556,7 +2022,16 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom", + "getrandom 0.1.14", +] + +[[package]] +name = "rand_core" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c026d7df8b298d90ccbbc5190bd04d85e159eaf5576caeacf8741da93ccbd2e5" +dependencies = [ + "getrandom 0.2.1", ] [[package]] @@ -1565,7 +2040,16 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_hc" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +dependencies = [ + "rand_core 0.6.1", ] [[package]] @@ -1574,7 +2058,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" dependencies = [ - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -1608,6 +2092,15 @@ version = "0.1.56" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" +[[package]] +name = "redox_syscall" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ec8ca9416c5ea37062b502703cd7fcb207736bc294f6e0cf367ac6fc234570" +dependencies = [ + "bitflags", +] + [[package]] name = "regex" version = "1.3.9" @@ -1641,7 +2134,7 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9eaa17ac5d7b838b7503d118fa16ad88f440498bf9ffe5424e621f93190d61e" dependencies = [ - "base64", + "base64 0.12.3", "bytes 0.5.4", "encoding_rs", "futures-core", @@ -1657,7 +2150,7 @@ dependencies = [ "mime", "mime_guess", "percent-encoding", - "pin-project-lite", + "pin-project-lite 0.1.5", "rustls", "serde", "serde_json", @@ -1687,19 +2180,35 @@ dependencies = [ "winapi 0.3.8", ] +[[package]] +name = "rpassword" +version = "4.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99371657d3c8e4d816fb6221db98fa408242b0b53bac08f8676a41f8554fe99f" +dependencies = [ + "libc", + "winapi 0.3.8", +] + [[package]] name = "rustc-demangle" version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustc_version" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" dependencies = [ - "semver", + "semver 0.9.0", ] [[package]] @@ -1708,7 +2217,7 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d1126dcf58e93cee7d098dbda643b5f92ed724f1f6a63007c1116eed6700c81" dependencies = [ - "base64", + "base64 0.12.3", "log", "ring", "sct", @@ -1736,6 +2245,16 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" +dependencies = [ + "lazy_static", + "winapi 0.3.8", +] + [[package]] name = "scopeguard" version = "1.1.0" @@ -1772,13 +2291,45 @@ dependencies = [ "untrusted", ] +[[package]] +name = "security-framework" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1759c2e3c8580017a484a7ac56d3abc5a6c1feadf88db2f3633f12ae4268c69" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f99b9d5e26d2a71633cc4f2ebae7cc9f874044e0c351a27e17892d76dce5678b" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "semver" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" dependencies = [ - "semver-parser", + "semver-parser 0.7.0", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser 0.10.2", ] [[package]] @@ -1787,6 +2338,15 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +[[package]] +name = "semver-parser" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +dependencies = [ + "pest", +] + [[package]] name = "serde" version = "1.0.112" @@ -1839,6 +2399,18 @@ dependencies = [ "url", ] +[[package]] +name = "sha-1" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" +dependencies = [ + "block-buffer 0.7.3", + "digest 0.8.1", + "fake-simd", + "opaque-debug 0.2.3", +] + [[package]] name = "sha2" version = "0.8.2" @@ -1863,6 +2435,15 @@ dependencies = [ "opaque-debug 0.3.0", ] +[[package]] +name = "signal-hook-registry" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16f1d0fef1604ba8f7a073c7e701f213e056707210e9020af4528e0101ce11a6" +dependencies = [ + "libc", +] + [[package]] name = "signature" version = "1.1.0" @@ -1898,10 +2479,32 @@ checksum = "2c29947abdee2a218277abeca306f25789c938e500ea5a9d4b12a5a504466902" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall", + "redox_syscall 0.1.56", "winapi 0.3.8", ] +[[package]] +name = "solana-account-decoder" +version = "1.6.0" +dependencies = [ + "Inflector", + "base64 0.12.3", + "bincode", + "bs58", + "bv", + "lazy_static", + "serde", + "serde_derive", + "serde_json", + "solana-config-program", + "solana-sdk", + "solana-stake-program", + "solana-vote-program", + "spl-token", + "thiserror", + "zstd", +] + [[package]] name = "solana-bpf-loader-program" version = "1.6.0" @@ -1924,13 +2527,16 @@ dependencies = [ "bincode", "byteorder 1.3.4", "elf", - "miow", + "itertools 0.10.0", + "miow 0.2.2", "net2", "solana-bpf-loader-program", - "solana-logger", + "solana-cli-output", + "solana-logger 1.6.0", "solana-measure", "solana-runtime", "solana-sdk", + "solana-transaction-status", "solana_rbpf", "walkdir", ] @@ -1940,42 +2546,42 @@ name = "solana-bpf-rust-128bit" version = "1.6.0" dependencies = [ "solana-bpf-rust-128bit-dep", - "solana-program", + "solana-program 1.6.0", ] [[package]] name = "solana-bpf-rust-128bit-dep" version = "1.6.0" dependencies = [ - "solana-program", + "solana-program 1.6.0", ] [[package]] name = "solana-bpf-rust-alloc" version = "1.6.0" dependencies = [ - "solana-program", + "solana-program 1.6.0", ] [[package]] name = "solana-bpf-rust-call-depth" version = "1.6.0" dependencies = [ - "solana-program", + "solana-program 1.6.0", ] [[package]] name = "solana-bpf-rust-caller-access" version = "1.6.0" dependencies = [ - "solana-program", + "solana-program 1.6.0", ] [[package]] name = "solana-bpf-rust-custom-heap" version = "1.6.0" dependencies = [ - "solana-program", + "solana-program 1.6.0", ] [[package]] @@ -1983,21 +2589,21 @@ name = "solana-bpf-rust-dep-crate" version = "1.6.0" dependencies = [ "byteorder 1.3.4", - "solana-program", + "solana-program 1.6.0", ] [[package]] name = "solana-bpf-rust-deprecated-loader" version = "1.6.0" dependencies = [ - "solana-program", + "solana-program 1.6.0", ] [[package]] name = "solana-bpf-rust-dup-accounts" version = "1.6.0" dependencies = [ - "solana-program", + "solana-program 1.6.0", ] [[package]] @@ -2006,7 +2612,7 @@ version = "1.6.0" dependencies = [ "num-derive 0.2.5", "num-traits", - "solana-program", + "solana-program 1.6.0", "thiserror", ] @@ -2014,14 +2620,14 @@ dependencies = [ name = "solana-bpf-rust-external-spend" version = "1.6.0" dependencies = [ - "solana-program", + "solana-program 1.6.0", ] [[package]] name = "solana-bpf-rust-instruction-introspection" version = "1.6.0" dependencies = [ - "solana-program", + "solana-program 1.6.0", ] [[package]] @@ -2029,42 +2635,42 @@ name = "solana-bpf-rust-invoke" version = "1.6.0" dependencies = [ "solana-bpf-rust-invoked", - "solana-program", + "solana-program 1.6.0", ] [[package]] name = "solana-bpf-rust-invoke-and-error" version = "1.6.0" dependencies = [ - "solana-program", + "solana-program 1.6.0", ] [[package]] name = "solana-bpf-rust-invoke-and-ok" version = "1.6.0" dependencies = [ - "solana-program", + "solana-program 1.6.0", ] [[package]] name = "solana-bpf-rust-invoke-and-return" version = "1.6.0" dependencies = [ - "solana-program", + "solana-program 1.6.0", ] [[package]] name = "solana-bpf-rust-invoked" version = "1.6.0" dependencies = [ - "solana-program", + "solana-program 1.6.0", ] [[package]] name = "solana-bpf-rust-iter" version = "1.6.0" dependencies = [ - "solana-program", + "solana-program 1.6.0", ] [[package]] @@ -2072,35 +2678,35 @@ name = "solana-bpf-rust-many-args" version = "1.6.0" dependencies = [ "solana-bpf-rust-many-args-dep", - "solana-program", + "solana-program 1.6.0", ] [[package]] name = "solana-bpf-rust-many-args-dep" version = "1.6.0" dependencies = [ - "solana-program", + "solana-program 1.6.0", ] [[package]] name = "solana-bpf-rust-mem" version = "1.6.0" dependencies = [ - "solana-program", + "solana-program 1.6.0", ] [[package]] name = "solana-bpf-rust-noop" version = "1.6.0" dependencies = [ - "solana-program", + "solana-program 1.6.0", ] [[package]] name = "solana-bpf-rust-panic" version = "1.6.0" dependencies = [ - "solana-program", + "solana-program 1.6.0", ] [[package]] @@ -2108,23 +2714,23 @@ name = "solana-bpf-rust-param-passing" version = "1.6.0" dependencies = [ "solana-bpf-rust-param-passing-dep", - "solana-program", + "solana-program 1.6.0", ] [[package]] name = "solana-bpf-rust-param-passing-dep" version = "1.6.0" dependencies = [ - "solana-program", + "solana-program 1.6.0", ] [[package]] name = "solana-bpf-rust-rand" version = "1.6.0" dependencies = [ - "getrandom", - "rand", - "solana-program", + "getrandom 0.1.14", + "rand 0.7.3", + "solana-program 1.6.0", ] [[package]] @@ -2132,64 +2738,129 @@ name = "solana-bpf-rust-ristretto" version = "1.6.0" dependencies = [ "curve25519-dalek 3.0.0", - "getrandom", - "solana-program", + "getrandom 0.1.14", + "solana-program 1.6.0", ] [[package]] name = "solana-bpf-rust-ro-modify" version = "1.6.0" dependencies = [ - "solana-program", + "solana-program 1.6.0", ] [[package]] name = "solana-bpf-rust-sanity" version = "1.6.0" dependencies = [ - "solana-program", + "solana-program 1.6.0", ] [[package]] name = "solana-bpf-rust-sha256" version = "1.6.0" dependencies = [ - "solana-program", + "solana-program 1.6.0", ] [[package]] name = "solana-bpf-rust-spoof1" version = "1.6.0" dependencies = [ - "solana-program", + "solana-program 1.6.0", ] [[package]] name = "solana-bpf-rust-spoof1-system" version = "1.6.0" dependencies = [ - "solana-program", + "solana-program 1.6.0", ] [[package]] name = "solana-bpf-rust-sysval" version = "1.6.0" dependencies = [ - "solana-program", + "solana-program 1.6.0", ] [[package]] name = "solana-bpf-rust-upgradeable" version = "1.6.0" dependencies = [ - "solana-program", + "solana-program 1.6.0", ] [[package]] name = "solana-bpf-rust-upgraded" version = "1.6.0" dependencies = [ - "solana-program", + "solana-program 1.6.0", +] + +[[package]] +name = "solana-clap-utils" +version = "1.6.0" +dependencies = [ + "chrono", + "clap", + "rpassword", + "solana-remote-wallet", + "solana-sdk", + "thiserror", + "tiny-bip39", + "url", +] + +[[package]] +name = "solana-cli-output" +version = "1.6.0" +dependencies = [ + "Inflector", + "chrono", + "console 0.11.3", + "humantime", + "indicatif", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-clap-utils", + "solana-client", + "solana-sdk", + "solana-stake-program", + "solana-transaction-status", + "solana-vote-program", +] + +[[package]] +name = "solana-client" +version = "1.6.0" +dependencies = [ + "base64 0.13.0", + "bincode", + "bs58", + "clap", + "indicatif", + "jsonrpc-core", + "log", + "net2", + "rayon", + "reqwest", + "semver 0.11.0", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-clap-utils", + "solana-net-utils", + "solana-sdk", + "solana-transaction-status", + "solana-version", + "solana-vote-program", + "thiserror", + "tungstenite", + "url", ] [[package]] @@ -2216,7 +2887,7 @@ dependencies = [ "either", "lazy_static", "libc", - "rand_chacha", + "rand_chacha 0.2.2", "regex-syntax", "reqwest", "serde", @@ -2226,6 +2897,26 @@ dependencies = [ "winapi 0.3.8", ] +[[package]] +name = "solana-frozen-abi" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ac2e6c6c399b2db73f9aaf63b9a5d35fda67d792ced4ebfb06d538be32a9d24" +dependencies = [ + "bs58", + "bv", + "generic-array 0.14.3", + "log", + "memmap2", + "rustc_version", + "serde", + "serde_derive", + "sha2", + "solana-frozen-abi-macro 1.5.3", + "solana-logger 1.5.3", + "thiserror", +] + [[package]] name = "solana-frozen-abi" version = "1.6.0" @@ -2239,11 +2930,24 @@ dependencies = [ "serde", "serde_derive", "sha2", - "solana-frozen-abi-macro", - "solana-logger", + "solana-frozen-abi-macro 1.6.0", + "solana-logger 1.6.0", "thiserror", ] +[[package]] +name = "solana-frozen-abi-macro" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b8af04aaedb1de2d6fc6ec237291bfb9b648c38692bf3d53d844f3cc76aa152" +dependencies = [ + "lazy_static", + "proc-macro2 1.0.24", + "quote 1.0.6", + "rustc_version", + "syn 1.0.48", +] + [[package]] name = "solana-frozen-abi-macro" version = "1.6.0" @@ -2255,6 +2959,17 @@ dependencies = [ "syn 1.0.48", ] +[[package]] +name = "solana-logger" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3ce848f35b88e36ce5e13ed7a60102c3339acd5c4443fee55a7ff173a2d31d" +dependencies = [ + "env_logger", + "lazy_static", + "log", +] + [[package]] name = "solana-logger" version = "1.6.0" @@ -2287,6 +3002,55 @@ dependencies = [ "solana-sdk", ] +[[package]] +name = "solana-net-utils" +version = "1.6.0" +dependencies = [ + "bincode", + "clap", + "log", + "nix", + "rand 0.7.3", + "serde", + "serde_derive", + "socket2", + "solana-clap-utils", + "solana-logger 1.6.0", + "solana-version", + "tokio 0.3.6", + "url", +] + +[[package]] +name = "solana-program" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d7f0767921018572bbb33bbf1c912897c5712e50a839d09d7faacea547e89b5" +dependencies = [ + "bincode", + "bs58", + "bv", + "curve25519-dalek 2.1.0", + "hex", + "itertools 0.9.0", + "lazy_static", + "log", + "num-derive 0.3.0", + "num-traits", + "rand 0.7.3", + "rustc_version", + "rustversion", + "serde", + "serde_bytes", + "serde_derive", + "sha2", + "solana-frozen-abi 1.5.3", + "solana-frozen-abi-macro 1.5.3", + "solana-logger 1.5.3", + "solana-sdk-macro 1.5.3", + "thiserror", +] + [[package]] name = "solana-program" version = "1.6.0" @@ -2296,22 +3060,22 @@ dependencies = [ "bv", "curve25519-dalek 2.1.0", "hex", - "itertools", + "itertools 0.9.0", "lazy_static", "log", "num-derive 0.3.0", "num-traits", - "rand", + "rand 0.7.3", "rustc_version", "rustversion", "serde", "serde_bytes", "serde_derive", "sha2", - "solana-frozen-abi", - "solana-frozen-abi-macro", - "solana-logger", - "solana-sdk-macro", + "solana-frozen-abi 1.6.0", + "solana-frozen-abi-macro 1.6.0", + "solana-logger 1.6.0", + "solana-sdk-macro 1.6.0", "thiserror", ] @@ -2323,6 +3087,24 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "solana-remote-wallet" +version = "1.6.0" +dependencies = [ + "base32", + "console 0.11.3", + "dialoguer", + "hidapi", + "log", + "num-derive 0.3.0", + "num-traits", + "parking_lot 0.10.2", + "semver 0.9.0", + "solana-sdk", + "thiserror", + "url", +] + [[package]] name = "solana-runtime" version = "1.6.0" @@ -2338,7 +3120,7 @@ dependencies = [ "flate2", "fnv", "fs_extra", - "itertools", + "itertools 0.9.0", "lazy_static", "libc", "libloading", @@ -2348,16 +3130,16 @@ dependencies = [ "num-traits", "num_cpus", "ouroboros", - "rand", + "rand 0.7.3", "rayon", "regex", "rustc_version", "serde", "serde_derive", "solana-config-program", - "solana-frozen-abi", - "solana-frozen-abi-macro", - "solana-logger", + "solana-frozen-abi 1.6.0", + "solana-frozen-abi-macro 1.6.0", + "solana-logger 1.6.0", "solana-measure", "solana-metrics", "solana-rayon-threadlimit", @@ -2387,7 +3169,7 @@ dependencies = [ "generic-array 0.14.3", "hex", "hmac", - "itertools", + "itertools 0.9.0", "lazy_static", "libsecp256k1", "log", @@ -2395,8 +3177,8 @@ dependencies = [ "num-derive 0.3.0", "num-traits", "pbkdf2", - "rand", - "rand_chacha", + "rand 0.7.3", + "rand_chacha 0.2.2", "rustc_version", "rustversion", "serde", @@ -2406,14 +3188,27 @@ dependencies = [ "sha2", "sha3", "solana-crate-features", - "solana-frozen-abi", - "solana-frozen-abi-macro", - "solana-logger", - "solana-program", - "solana-sdk-macro", + "solana-frozen-abi 1.6.0", + "solana-frozen-abi-macro 1.6.0", + "solana-logger 1.6.0", + "solana-program 1.6.0", + "solana-sdk-macro 1.6.0", "thiserror", ] +[[package]] +name = "solana-sdk-macro" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13933248cf64f880813fc8606328400fa204a4bc1180f1567ffc019cdd8bae97" +dependencies = [ + "bs58", + "proc-macro2 1.0.24", + "quote 1.0.6", + "rustversion", + "syn 1.0.48", +] + [[package]] name = "solana-sdk-macro" version = "1.6.0" @@ -2432,9 +3227,9 @@ dependencies = [ "bincode", "digest 0.9.0", "libsecp256k1", - "rand", + "rand 0.7.3", "sha3", - "solana-logger", + "solana-logger 1.6.0", "solana-sdk", ] @@ -2450,14 +3245,50 @@ dependencies = [ "serde", "serde_derive", "solana-config-program", - "solana-frozen-abi", - "solana-frozen-abi-macro", + "solana-frozen-abi 1.6.0", + "solana-frozen-abi-macro 1.6.0", "solana-metrics", "solana-sdk", "solana-vote-program", "thiserror", ] +[[package]] +name = "solana-transaction-status" +version = "1.6.0" +dependencies = [ + "Inflector", + "base64 0.12.3", + "bincode", + "bs58", + "lazy_static", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-runtime", + "solana-sdk", + "solana-stake-program", + "solana-vote-program", + "spl-memo", + "spl-token", + "thiserror", +] + +[[package]] +name = "solana-version" +version = "1.6.0" +dependencies = [ + "log", + "rustc_version", + "serde", + "serde_derive", + "solana-frozen-abi 1.6.0", + "solana-frozen-abi-macro 1.6.0", + "solana-logger 1.6.0", + "solana-sdk", +] + [[package]] name = "solana-vote-program" version = "1.6.0" @@ -2469,9 +3300,9 @@ dependencies = [ "rustc_version", "serde", "serde_derive", - "solana-frozen-abi", - "solana-frozen-abi-macro", - "solana-logger", + "solana-frozen-abi 1.6.0", + "solana-frozen-abi-macro 1.6.0", + "solana-logger 1.6.0", "solana-metrics", "solana-sdk", "thiserror", @@ -2489,7 +3320,7 @@ dependencies = [ "hash32", "libc", "log", - "rand", + "rand 0.7.3", "scroll", "thiserror", "time", @@ -2501,12 +3332,41 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "spl-memo" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb2b771f6146dec14ef5fbf498f9374652c54badc3befc8c40c1d426dd45d720" +dependencies = [ + "solana-program 1.5.3", +] + +[[package]] +name = "spl-token" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9774eebb62ff1ff2f5eca112413e476143925a2f5a43cee98fc5d3a6c0eec5c" +dependencies = [ + "arrayref", + "num-derive 0.3.0", + "num-traits", + "num_enum", + "solana-program 1.5.3", + "thiserror", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + [[package]] name = "subtle" version = "1.0.0" @@ -2567,20 +3427,20 @@ checksum = "c8a4c1d0bee3230179544336c15eefb563cf0302955d962e456542323e8c2e8a" dependencies = [ "filetime", "libc", - "redox_syscall", + "redox_syscall 0.1.56", "xattr", ] [[package]] name = "tempfile" -version = "3.1.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" +checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", "libc", - "rand", - "redox_syscall", + "rand 0.8.2", + "redox_syscall 0.2.4", "remove_dir_all", "winapi 0.3.8", ] @@ -2595,19 +3455,47 @@ dependencies = [ ] [[package]] -name = "thiserror" -version = "1.0.19" +name = "terminal_size" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b13f926965ad00595dd129fa12823b04bbf866e9085ab0a5f2b05b850fbfc344" +checksum = "4bd2d183bd3fac5f5fe38ddbeb4dc9aec4a39a9d7d59e7491d900302da01cbe1" +dependencies = [ + "libc", + "winapi 0.3.8", +] + +[[package]] +name = "termios" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "411c5bf740737c7918b8b1fe232dca4dc9f8e754b8ad5e20966814001ed0ac6b" +dependencies = [ + "libc", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "thiserror" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cc616c6abf8c8928e2fdcc0dbfab37175edd8fb49a4641066ad1364fdab146" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.19" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "893582086c2f98cde18f906265a65b5030a074b1046c674ae898be6519a7f479" +checksum = "9be73a2caec27583d0046ef3796c3794f868a5bc813db689eed00c7631275cd1" dependencies = [ "proc-macro2 1.0.24", "quote 1.0.6", @@ -2633,6 +3521,22 @@ dependencies = [ "winapi 0.3.8", ] +[[package]] +name = "tiny-bip39" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0165e045cc2ae1660270ca65e1676dbaab60feb0f91b10f7d0665e9b47e31f2" +dependencies = [ + "failure", + "hmac", + "once_cell", + "pbkdf2", + "rand 0.7.3", + "rustc-hash", + "sha2", + "unicode-normalization", +] + [[package]] name = "tokio" version = "0.1.22" @@ -2641,7 +3545,7 @@ checksum = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" dependencies = [ "bytes 0.4.12", "futures", - "mio", + "mio 0.6.22", "num_cpus", "tokio-codec", "tokio-current-thread", @@ -2669,12 +3573,34 @@ dependencies = [ "iovec", "lazy_static", "memchr", - "mio", + "mio 0.6.22", "num_cpus", - "pin-project-lite", + "pin-project-lite 0.1.5", "slab", ] +[[package]] +name = "tokio" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "720ba21c25078711bf456d607987d95bce90f7c3bea5abe1db587862e7a1e87c" +dependencies = [ + "autocfg", + "bytes 0.6.0", + "futures-core", + "libc", + "memchr", + "mio 0.7.7", + "num_cpus", + "once_cell", + "parking_lot 0.11.1", + "pin-project-lite 0.2.4", + "signal-hook-registry", + "slab", + "tokio-macros", + "winapi 0.3.8", +] + [[package]] name = "tokio-codec" version = "0.1.2" @@ -2728,6 +3654,17 @@ dependencies = [ "log", ] +[[package]] +name = "tokio-macros" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46dfffa59fc3c8aad216ed61bdc2c263d2b9d87a9c8ac9de0c11a813e51b6db7" +dependencies = [ + "proc-macro2 1.0.24", + "quote 1.0.6", + "syn 1.0.48", +] + [[package]] name = "tokio-reactor" version = "0.1.12" @@ -2738,9 +3675,9 @@ dependencies = [ "futures", "lazy_static", "log", - "mio", + "mio 0.6.22", "num_cpus", - "parking_lot", + "parking_lot 0.9.0", "slab", "tokio-executor", "tokio-io", @@ -2778,7 +3715,7 @@ dependencies = [ "bytes 0.4.12", "futures", "iovec", - "mio", + "mio 0.6.22", "tokio-io", "tokio-reactor", ] @@ -2821,7 +3758,7 @@ dependencies = [ "bytes 0.4.12", "futures", "log", - "mio", + "mio 0.6.22", "tokio-codec", "tokio-io", "tokio-reactor", @@ -2838,7 +3775,7 @@ dependencies = [ "iovec", "libc", "log", - "mio", + "mio 0.6.22", "mio-uds", "tokio-codec", "tokio-io", @@ -2855,10 +3792,19 @@ dependencies = [ "futures-core", "futures-sink", "log", - "pin-project-lite", + "pin-project-lite 0.1.5", "tokio 0.2.21", ] +[[package]] +name = "toml" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +dependencies = [ + "serde", +] + [[package]] name = "tower-service" version = "0.3.0" @@ -2873,7 +3819,7 @@ checksum = "b0987850db3733619253fe60e17cb59b82d37c7e6c0236bb81e4d6b87c879f27" dependencies = [ "cfg-if 0.1.10", "log", - "pin-project-lite", + "pin-project-lite 0.1.5", "tracing-core", ] @@ -2892,12 +3838,38 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" +[[package]] +name = "tungstenite" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfea31758bf674f990918962e8e5f07071a3161bd7c4138ed23e416e1ac4264e" +dependencies = [ + "base64 0.11.0", + "byteorder 1.3.4", + "bytes 0.5.4", + "http", + "httparse", + "input_buffer", + "log", + "native-tls", + "rand 0.7.3", + "sha-1", + "url", + "utf-8", +] + [[package]] name = "typenum" version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" +[[package]] +name = "ucd-trie" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" + [[package]] name = "unicase" version = "2.6.0" @@ -2925,6 +3897,12 @@ dependencies = [ "smallvec 1.6.1", ] +[[package]] +name = "unicode-width" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" + [[package]] name = "unicode-xid" version = "0.1.0" @@ -2963,6 +3941,24 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "utf-8" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05e42f7c18b8f902290b009cde6d651262f956c98bc51bca4cd1d511c9cd85c7" + +[[package]] +name = "vcpkg" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00bca6106a5e23f3eee943593759b7fcddb00554332e856d990c893966879fb" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + [[package]] name = "version_check" version = "0.9.2" @@ -3002,6 +3998,12 @@ version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" +[[package]] +name = "wasi" +version = "0.10.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93c6c3420963c5c64bca373b25e77acb562081b9bb4dd5bb864187742186cea9" + [[package]] name = "wasm-bindgen" version = "0.2.63" @@ -3218,6 +4220,6 @@ checksum = "b89249644df056b522696b1bb9e7c18c87e8ffa3e2f0dc3b0155875d6498f01b" dependencies = [ "cc", "glob", - "itertools", + "itertools 0.9.0", "libc", ] diff --git a/programs/bpf/Cargo.toml b/programs/bpf/Cargo.toml index c81d485254..63b73e16b7 100644 --- a/programs/bpf/Cargo.toml +++ b/programs/bpf/Cargo.toml @@ -22,14 +22,18 @@ walkdir = "2" bincode = "1.1.4" byteorder = "1.3.2" elf = "0.0.10" +itertools = "0.10.0" miow = "0.2.2" net2 = "0.2.37" solana-bpf-loader-program = { path = "../bpf_loader", version = "1.6.0" } +solana-cli-output = { path = "../../cli-output", version = "1.6.0" } solana-logger = { path = "../../logger", version = "1.6.0" } solana-measure = { path = "../../measure", version = "1.6.0" } +solana_rbpf = "=0.2.3" solana-runtime = { path = "../../runtime", version = "1.6.0" } solana-sdk = { path = "../../sdk", version = "1.6.0" } -solana_rbpf = "=0.2.3" +solana-transaction-status = { path = "../../transaction-status", version = "1.6.0" } + [[bench]] name = "bpf_loader" diff --git a/programs/bpf/tests/programs.rs b/programs/bpf/tests/programs.rs index 2905901453..3c9784c4b4 100644 --- a/programs/bpf/tests/programs.rs +++ b/programs/bpf/tests/programs.rs @@ -3,15 +3,17 @@ #[macro_use] extern crate solana_bpf_loader_program; +use itertools::izip; use solana_bpf_loader_program::{ create_vm, serialization::{deserialize_parameters, serialize_parameters}, syscalls::register_syscalls, ThisInstructionMeter, }; +use solana_cli_output::display::println_transaction; use solana_rbpf::vm::{Config, Executable, Tracer}; use solana_runtime::{ - bank::{Bank, ExecuteTimings}, + bank::{Bank, ExecuteTimings, NonceRollbackInfo, TransactionBalancesSet, TransactionResults}, bank_client::BankClient, genesis_utils::{create_genesis_config, GenesisConfigInfo}, loader_utils::{ @@ -30,11 +32,16 @@ use solana_sdk::{ message::Message, process_instruction::{InvokeContext, MockInvokeContext}, pubkey::Pubkey, - signature::{Keypair, Signer}, + signature::{keypair_from_seed, Keypair, Signer}, + system_instruction, sysvar::{clock, fees, rent, slot_hashes, stake_history}, transaction::{Transaction, TransactionError}, }; -use std::{cell::RefCell, env, fs::File, io::Read, path::PathBuf, sync::Arc}; +use solana_transaction_status::{ + token_balances::collect_token_balances, ConfirmedTransaction, InnerInstructions, + TransactionStatusMeta, TransactionWithStatusMeta, UiTransactionEncoding, +}; +use std::{cell::RefCell, collections::HashMap, env, fs::File, io::Read, path::PathBuf, sync::Arc}; /// BPF program file extension const PLATFORM_FILE_EXTENSION_BPF: &str = "so"; @@ -100,20 +107,31 @@ fn write_bpf_program( fn load_upgradeable_bpf_program( bank_client: &BankClient, payer_keypair: &Keypair, + buffer_keypair: &Keypair, + executable_keypair: &Keypair, + authority_keypair: &Keypair, name: &str, -) -> (Pubkey, Keypair) { +) { let path = create_bpf_path(name); let mut file = File::open(&path).unwrap_or_else(|err| { panic!("Failed to open {}: {}", path.display(), err); }); let mut elf = Vec::new(); file.read_to_end(&mut elf).unwrap(); - load_upgradeable_program(bank_client, payer_keypair, elf) + load_upgradeable_program( + bank_client, + payer_keypair, + buffer_keypair, + executable_keypair, + authority_keypair, + elf, + ); } fn upgrade_bpf_program( bank_client: &BankClient, payer_keypair: &Keypair, + buffer_keypair: &Keypair, executable_pubkey: &Pubkey, authority_keypair: &Keypair, name: &str, @@ -124,15 +142,15 @@ fn upgrade_bpf_program( }); let mut elf = Vec::new(); file.read_to_end(&mut elf).unwrap(); - let buffer_pubkey = load_buffer_account(bank_client, payer_keypair, &elf); + load_buffer_account(bank_client, payer_keypair, &buffer_keypair, &elf); upgrade_program( bank_client, payer_keypair, executable_pubkey, - &buffer_pubkey, + &buffer_keypair.pubkey(), &authority_keypair, &payer_keypair.pubkey(), - ) + ); } fn run_program( @@ -242,6 +260,108 @@ fn process_transaction_and_record_inner( ) } +fn execute_transactions(bank: &Bank, txs: &[Transaction]) -> Vec { + let batch = bank.prepare_batch(txs, None); + let mut timings = ExecuteTimings::default(); + let mut mint_decimals = HashMap::new(); + let tx_pre_token_balances = collect_token_balances(&bank, &batch, &mut mint_decimals); + let ( + TransactionResults { + execution_results, .. + }, + TransactionBalancesSet { + pre_balances, + post_balances, + .. + }, + mut inner_instructions, + mut transaction_logs, + ) = bank.load_execute_and_commit_transactions( + &batch, + std::usize::MAX, + true, + true, + true, + &mut timings, + ); + let tx_post_token_balances = collect_token_balances(&bank, &batch, &mut mint_decimals); + + for _ in 0..(txs.len() - transaction_logs.len()) { + transaction_logs.push(vec![]); + } + for _ in 0..(txs.len() - inner_instructions.len()) { + inner_instructions.push(None); + } + + izip!( + txs.iter(), + execution_results.into_iter(), + inner_instructions.into_iter(), + pre_balances.into_iter(), + post_balances.into_iter(), + tx_pre_token_balances.into_iter(), + tx_post_token_balances.into_iter(), + transaction_logs.into_iter(), + ) + .map( + |( + tx, + (execute_result, nonce_rollback), + inner_instructions, + pre_balances, + post_balances, + pre_token_balances, + post_token_balances, + log_messages, + )| { + let fee_calculator = nonce_rollback + .map(|nonce_rollback| nonce_rollback.fee_calculator()) + .unwrap_or_else(|| bank.get_fee_calculator(&tx.message().recent_blockhash)) + .expect("FeeCalculator must exist"); + let fee = fee_calculator.calculate_fee(tx.message()); + + let inner_instructions = inner_instructions.map(|inner_instructions| { + inner_instructions + .into_iter() + .enumerate() + .map(|(index, instructions)| InnerInstructions { + index: index as u8, + instructions, + }) + .filter(|i| !i.instructions.is_empty()) + .collect() + }); + + let tx_status_meta = TransactionStatusMeta { + status: execute_result, + fee, + pre_balances, + post_balances, + pre_token_balances: Some(pre_token_balances), + post_token_balances: Some(post_token_balances), + inner_instructions, + log_messages: Some(log_messages), + }; + + ConfirmedTransaction { + slot: bank.slot(), + transaction: TransactionWithStatusMeta { + transaction: tx.clone(), + meta: Some(tx_status_meta), + }, + } + }, + ) + .collect() +} + +fn print_confirmed_tx(name: &str, confirmed_tx: ConfirmedTransaction) { + let tx = confirmed_tx.transaction.transaction.clone(); + let encoded = confirmed_tx.encode(UiTransactionEncoding::JsonParsed); + println!("EXECUTE {} (slot {})", name, encoded.slot); + println_transaction(&tx, &encoded.transaction.meta, " "); +} + #[test] #[cfg(any(feature = "bpf_c", feature = "bpf_rust"))] fn test_program_bpf_sanity() { @@ -1572,8 +1692,18 @@ fn test_program_bpf_upgrade() { let bank_client = BankClient::new(bank); // Deploy upgrade program - let (program_id, authority_keypair) = - load_upgradeable_bpf_program(&bank_client, &mint_keypair, "solana_bpf_rust_upgradeable"); + let buffer_keypair = Keypair::new(); + let program_keypair = Keypair::new(); + let program_id = program_keypair.pubkey(); + let authority_keypair = Keypair::new(); + load_upgradeable_bpf_program( + &bank_client, + &mint_keypair, + &buffer_keypair, + &program_keypair, + &authority_keypair, + "solana_bpf_rust_upgradeable", + ); let mut instruction = Instruction::new( program_id, @@ -1593,9 +1723,11 @@ fn test_program_bpf_upgrade() { ); // Upgrade program + let buffer_keypair = Keypair::new(); upgrade_bpf_program( &bank_client, &mint_keypair, + &buffer_keypair, &program_id, &authority_keypair, "solana_bpf_rust_upgraded", @@ -1620,9 +1752,11 @@ fn test_program_bpf_upgrade() { ); // Upgrade back to the original program + let buffer_keypair = Keypair::new(); upgrade_bpf_program( &bank_client, &mint_keypair, + &buffer_keypair, &program_id, &new_authority_keypair, "solana_bpf_rust_upgradeable", @@ -1661,8 +1795,18 @@ fn test_program_bpf_invoke_upgradeable_via_cpi() { ); // Deploy upgradeable program - let (program_id, authority_keypair) = - load_upgradeable_bpf_program(&bank_client, &mint_keypair, "solana_bpf_rust_upgradeable"); + let buffer_keypair = Keypair::new(); + let program_keypair = Keypair::new(); + let program_id = program_keypair.pubkey(); + let authority_keypair = Keypair::new(); + load_upgradeable_bpf_program( + &bank_client, + &mint_keypair, + &buffer_keypair, + &program_keypair, + &authority_keypair, + "solana_bpf_rust_upgradeable", + ); let mut instruction = Instruction::new( invoke_and_return, @@ -1684,9 +1828,11 @@ fn test_program_bpf_invoke_upgradeable_via_cpi() { ); // Upgrade program + let buffer_keypair = Keypair::new(); upgrade_bpf_program( &bank_client, &mint_keypair, + &buffer_keypair, &program_id, &authority_keypair, "solana_bpf_rust_upgraded", @@ -1711,9 +1857,11 @@ fn test_program_bpf_invoke_upgradeable_via_cpi() { ); // Upgrade back to the original program + let buffer_keypair = Keypair::new(); upgrade_bpf_program( &bank_client, &mint_keypair, + &buffer_keypair, &program_id, &new_authority_keypair, "solana_bpf_rust_upgradeable", @@ -1794,8 +1942,18 @@ fn test_program_bpf_upgrade_via_cpi() { ); // Deploy upgradeable program - let (program_id, authority_keypair) = - load_upgradeable_bpf_program(&bank_client, &mint_keypair, "solana_bpf_rust_upgradeable"); + let buffer_keypair = Keypair::new(); + let program_keypair = Keypair::new(); + let program_id = program_keypair.pubkey(); + let authority_keypair = Keypair::new(); + load_upgradeable_bpf_program( + &bank_client, + &mint_keypair, + &buffer_keypair, + &program_keypair, + &authority_keypair, + "solana_bpf_rust_upgradeable", + ); let mut instruction = Instruction::new( invoke_and_return, @@ -1823,12 +1981,13 @@ fn test_program_bpf_upgrade_via_cpi() { }); let mut elf = Vec::new(); file.read_to_end(&mut elf).unwrap(); - let buffer_pubkey = load_buffer_account(&bank_client, &mint_keypair, &elf); + let buffer_keypair = Keypair::new(); + load_buffer_account(&bank_client, &mint_keypair, &buffer_keypair, &elf); // Upgrade program via CPI let mut upgrade_instruction = bpf_loader_upgradeable::upgrade( &program_id, - &buffer_pubkey, + &buffer_keypair.pubkey(), &authority_keypair.pubkey(), &mint_keypair.pubkey(), ); @@ -1849,3 +2008,137 @@ fn test_program_bpf_upgrade_via_cpi() { TransactionError::InstructionError(0, InstructionError::Custom(43)) ); } + +#[cfg(feature = "bpf_rust")] +#[test] +fn test_program_upgradeable_locks() { + fn setup_program_upgradeable_locks( + payer_keypair: &Keypair, + buffer_keypair: &Keypair, + program_keypair: &Keypair, + ) -> (Arc, Transaction, Transaction) { + solana_logger::setup(); + + let GenesisConfigInfo { + genesis_config, + mint_keypair, + .. + } = create_genesis_config(2_000_000_000); + let mut bank = Bank::new(&genesis_config); + let (name, id, entrypoint) = solana_bpf_loader_upgradeable_program!(); + bank.add_builtin(&name, id, entrypoint); + let bank = Arc::new(bank); + let bank_client = BankClient::new_shared(&bank); + + load_upgradeable_bpf_program( + &bank_client, + &mint_keypair, + buffer_keypair, + program_keypair, + payer_keypair, + "solana_bpf_rust_panic", + ); + + // Load the buffer account + let path = create_bpf_path("solana_bpf_rust_noop"); + let mut file = File::open(&path).unwrap_or_else(|err| { + panic!("Failed to open {}: {}", path.display(), err); + }); + let mut elf = Vec::new(); + file.read_to_end(&mut elf).unwrap(); + load_buffer_account(&bank_client, &mint_keypair, buffer_keypair, &elf); + + bank_client + .send_and_confirm_instruction( + &mint_keypair, + system_instruction::transfer( + &mint_keypair.pubkey(), + &payer_keypair.pubkey(), + 1_000_000_000, + ), + ) + .unwrap(); + + let invoke_tx = Transaction::new( + &[payer_keypair], + Message::new( + &[Instruction::new( + program_keypair.pubkey(), + &[0u8; 0], + vec![], + )], + Some(&payer_keypair.pubkey()), + ), + bank.last_blockhash(), + ); + let upgrade_tx = Transaction::new( + &[payer_keypair], + Message::new( + &[bpf_loader_upgradeable::upgrade( + &program_keypair.pubkey(), + &buffer_keypair.pubkey(), + &payer_keypair.pubkey(), + &payer_keypair.pubkey(), + )], + Some(&payer_keypair.pubkey()), + ), + bank.last_blockhash(), + ); + + (bank, invoke_tx, upgrade_tx) + } + + let payer_keypair = keypair_from_seed(&[56u8; 32]).unwrap(); + let buffer_keypair = keypair_from_seed(&[11; 32]).unwrap(); + let program_keypair = keypair_from_seed(&[77u8; 32]).unwrap(); + + let results1 = { + let (bank, invoke_tx, upgrade_tx) = + setup_program_upgradeable_locks(&payer_keypair, &buffer_keypair, &program_keypair); + execute_transactions(&bank, &[upgrade_tx, invoke_tx]) + }; + + let results2 = { + let (bank, invoke_tx, upgrade_tx) = + setup_program_upgradeable_locks(&payer_keypair, &buffer_keypair, &program_keypair); + execute_transactions(&bank, &[invoke_tx, upgrade_tx]) + }; + + if false { + println!("upgrade and invoke"); + for result in &results1 { + print_confirmed_tx("result", result.clone()); + } + println!("invoke and upgrade"); + for result in &results2 { + print_confirmed_tx("result", result.clone()); + } + } + + if let Some(ref meta) = results1[0].transaction.meta { + assert_eq!(meta.status, Ok(())); + } else { + panic!("no meta"); + } + if let Some(ref meta) = results1[1].transaction.meta { + assert_eq!(meta.status, Err(TransactionError::AccountInUse)); + } else { + panic!("no meta"); + } + if let Some(ref meta) = results2[0].transaction.meta { + assert_eq!( + meta.status, + Err(TransactionError::InstructionError( + 0, + InstructionError::ProgramFailedToComplete + )) + ); + } else { + panic!("no meta"); + } + if let Some(ref meta) = results2[1].transaction.meta { + assert_eq!(meta.status, Err(TransactionError::AccountInUse)); + } else { + panic!("no meta"); + } +} diff --git a/programs/bpf_loader/src/lib.rs b/programs/bpf_loader/src/lib.rs index 3bd8604f34..dd8608a268 100644 --- a/programs/bpf_loader/src/lib.rs +++ b/programs/bpf_loader/src/lib.rs @@ -26,7 +26,7 @@ use solana_sdk::{ bpf_loader_upgradeable::{self, UpgradeableLoaderState}, clock::Clock, entrypoint::SUCCESS, - feature_set::bpf_compute_budget_balancing, + feature_set::{bpf_compute_budget_balancing, prevent_upgrade_and_invoke}, instruction::InstructionError, keyed_account::{from_keyed_account, next_keyed_account, KeyedAccount}, loader_instruction::LoaderInstruction, @@ -470,6 +470,12 @@ fn process_loader_upgradeable_instruction( log!(logger, "Program account not executable"); return Err(InstructionError::AccountNotExecutable); } + if !program.is_writable() + && invoke_context.is_feature_active(&prevent_upgrade_and_invoke::id()) + { + log!(logger, "Program account not writeable"); + return Err(InstructionError::InvalidArgument); + } if &program.owner()? != program_id { log!(logger, "Program account not owned by loader"); return Err(InstructionError::IncorrectProgramId); @@ -2000,7 +2006,7 @@ mod tests { &bpf_loader_upgradeable::id(), &[ KeyedAccount::new(&programdata_address, false, &programdata_account), - KeyedAccount::new_readonly(&program_address, false, &program_account), + KeyedAccount::new(&program_address, false, &program_account), KeyedAccount::new(&buffer_address, false, &buffer_account), KeyedAccount::new(&spill_address, false, &spill_account), KeyedAccount::new_readonly(&sysvar::rent::id(), false, &rent_account), @@ -2062,7 +2068,7 @@ mod tests { &bpf_loader_upgradeable::id(), &[ KeyedAccount::new(&programdata_address, false, &programdata_account), - KeyedAccount::new_readonly(&program_address, false, &program_account), + KeyedAccount::new(&program_address, false, &program_account), KeyedAccount::new(&buffer_address, false, &buffer_account), KeyedAccount::new(&spill_address, false, &spill_account), KeyedAccount::new_readonly(&sysvar::rent::id(), false, &rent_account), @@ -2095,7 +2101,7 @@ mod tests { &bpf_loader_upgradeable::id(), &[ KeyedAccount::new(&programdata_address, false, &programdata_account), - KeyedAccount::new_readonly(&program_address, false, &program_account), + KeyedAccount::new(&program_address, false, &program_account), KeyedAccount::new(&buffer_address, false, &buffer_account), KeyedAccount::new(&spill_address, false, &spill_account), KeyedAccount::new_readonly(&sysvar::rent::id(), false, &rent_account), @@ -2128,7 +2134,7 @@ mod tests { &bpf_loader_upgradeable::id(), &[ KeyedAccount::new(&programdata_address, false, &programdata_account), - KeyedAccount::new_readonly(&program_address, false, &program_account), + KeyedAccount::new(&program_address, false, &program_account), KeyedAccount::new(&buffer_address, false, &buffer_account), KeyedAccount::new(&spill_address, false, &spill_account), KeyedAccount::new_readonly(&sysvar::rent::id(), false, &rent_account), @@ -2162,7 +2168,7 @@ mod tests { &bpf_loader_upgradeable::id(), &[ KeyedAccount::new(&programdata_address, false, &programdata_account), - KeyedAccount::new_readonly(&program_address, false, &program_account), + KeyedAccount::new(&program_address, false, &program_account), KeyedAccount::new(&buffer_address, false, &buffer_account), KeyedAccount::new(&spill_address, false, &spill_account), KeyedAccount::new_readonly(&sysvar::rent::id(), false, &rent_account), @@ -2192,6 +2198,39 @@ mod tests { program_account.borrow_mut().owner = Pubkey::new_unique(); assert_eq!( Err(InstructionError::IncorrectProgramId), + process_instruction( + &bpf_loader_upgradeable::id(), + &[ + KeyedAccount::new(&programdata_address, false, &programdata_account), + KeyedAccount::new(&program_address, false, &program_account), + KeyedAccount::new(&buffer_address, false, &buffer_account), + KeyedAccount::new(&spill_address, false, &spill_account), + KeyedAccount::new_readonly(&sysvar::rent::id(), false, &rent_account), + KeyedAccount::new_readonly(&sysvar::clock::id(), false, &clock_account), + KeyedAccount::new_readonly( + &upgrade_authority_address, + true, + &upgrade_authority_account + ) + ], + &instruction, + &mut MockInvokeContext::default() + ) + ); + + // Case: Program account not writable + let (buffer_account, program_account, programdata_account, spill_account) = get_accounts( + &buffer_address, + &programdata_address, + &upgrade_authority_address, + slot, + &elf_orig, + &elf_new, + min_program_balance, + min_programdata_balance, + ); + assert_eq!( + Err(InstructionError::InvalidArgument), process_instruction( &bpf_loader_upgradeable::id(), &[ @@ -2233,7 +2272,7 @@ mod tests { &bpf_loader_upgradeable::id(), &[ KeyedAccount::new(&programdata_address, false, &programdata_account), - KeyedAccount::new_readonly(&program_address, false, &program_account), + KeyedAccount::new(&program_address, false, &program_account), KeyedAccount::new(&buffer_address, false, &buffer_account), KeyedAccount::new(&spill_address, false, &spill_account), KeyedAccount::new_readonly(&sysvar::rent::id(), false, &rent_account), @@ -2270,7 +2309,7 @@ mod tests { &bpf_loader_upgradeable::id(), &[ KeyedAccount::new(&programdata_address, false, &programdata_account), - KeyedAccount::new_readonly(&program_address, false, &program_account), + KeyedAccount::new(&program_address, false, &program_account), KeyedAccount::new(&buffer_address, false, &buffer_account), KeyedAccount::new(&spill_address, false, &spill_account), KeyedAccount::new_readonly(&sysvar::rent::id(), false, &rent_account), @@ -2303,7 +2342,7 @@ mod tests { &bpf_loader_upgradeable::id(), &[ KeyedAccount::new(&Pubkey::new_unique(), false, &programdata_account), - KeyedAccount::new_readonly(&program_address, false, &program_account), + KeyedAccount::new(&program_address, false, &program_account), KeyedAccount::new(&buffer_address, false, &buffer_account), KeyedAccount::new(&spill_address, false, &spill_account), KeyedAccount::new_readonly(&sysvar::rent::id(), false, &rent_account), @@ -2340,7 +2379,7 @@ mod tests { &bpf_loader_upgradeable::id(), &[ KeyedAccount::new(&programdata_address, false, &programdata_account), - KeyedAccount::new_readonly(&program_address, false, &program_account), + KeyedAccount::new(&program_address, false, &program_account), KeyedAccount::new(&buffer_address, false, &buffer_account), KeyedAccount::new(&spill_address, false, &spill_account), KeyedAccount::new_readonly(&sysvar::rent::id(), false, &rent_account), @@ -2384,7 +2423,7 @@ mod tests { &bpf_loader_upgradeable::id(), &[ KeyedAccount::new(&programdata_address, false, &programdata_account), - KeyedAccount::new_readonly(&program_address, false, &program_account), + KeyedAccount::new(&program_address, false, &program_account), KeyedAccount::new(&buffer_address, false, &buffer_account), KeyedAccount::new(&spill_address, false, &spill_account), KeyedAccount::new_readonly(&sysvar::rent::id(), false, &rent_account), @@ -2419,7 +2458,7 @@ mod tests { &bpf_loader_upgradeable::id(), &[ KeyedAccount::new(&programdata_address, false, &programdata_account), - KeyedAccount::new_readonly(&program_address, false, &program_account), + KeyedAccount::new(&program_address, false, &program_account), KeyedAccount::new(&buffer_address, false, &buffer_account), KeyedAccount::new(&spill_address, false, &spill_account), KeyedAccount::new_readonly(&sysvar::rent::id(), false, &rent_account), diff --git a/runtime/src/loader_utils.rs b/runtime/src/loader_utils.rs index 3df206ca96..3f8305d00e 100644 --- a/runtime/src/loader_utils.rs +++ b/runtime/src/loader_utils.rs @@ -57,9 +57,9 @@ pub fn load_program( pub fn load_buffer_account( bank_client: &T, from_keypair: &Keypair, + buffer_keypair: &Keypair, program: &[u8], -) -> Pubkey { - let buffer_keypair = Keypair::new(); +) { let buffer_pubkey = buffer_keypair.pubkey(); bank_client @@ -100,26 +100,26 @@ pub fn load_buffer_account( .unwrap(); offset += chunk_size as u32; } - buffer_keypair.pubkey() } pub fn load_upgradeable_program( bank_client: &T, from_keypair: &Keypair, + buffer_keypair: &Keypair, + executable_keypair: &Keypair, + authority_keypair: &Keypair, program: Vec, -) -> (Pubkey, Keypair) { - let executable_keypair = Keypair::new(); +) { let program_pubkey = executable_keypair.pubkey(); - let authority_keypair = Keypair::new(); let authority_pubkey = authority_keypair.pubkey(); - let buffer_pubkey = load_buffer_account(bank_client, &from_keypair, &program); + load_buffer_account(bank_client, &from_keypair, buffer_keypair, &program); let message = Message::new( &bpf_loader_upgradeable::deploy_with_max_program_len( &from_keypair.pubkey(), &program_pubkey, - &buffer_pubkey, + &buffer_keypair.pubkey(), Some(&authority_pubkey), 1.max( bank_client @@ -136,8 +136,6 @@ pub fn load_upgradeable_program( bank_client .send_and_confirm_message(&[from_keypair, &executable_keypair], message) .unwrap(); - - (executable_keypair.pubkey(), authority_keypair) } pub fn upgrade_program( diff --git a/sdk/program/src/bpf_loader_upgradeable.rs b/sdk/program/src/bpf_loader_upgradeable.rs index a30c74f0a6..3453946bb1 100644 --- a/sdk/program/src/bpf_loader_upgradeable.rs +++ b/sdk/program/src/bpf_loader_upgradeable.rs @@ -182,7 +182,7 @@ pub fn upgrade( &UpgradeableLoaderInstruction::Upgrade, vec![ AccountMeta::new(programdata_address, false), - AccountMeta::new_readonly(*program_address, false), + AccountMeta::new(*program_address, false), AccountMeta::new(*buffer_address, false), AccountMeta::new(*spill_address, false), AccountMeta::new_readonly(sysvar::rent::id(), false), @@ -250,4 +250,45 @@ mod tests { UpgradeableLoaderState::programdata_len(42).unwrap() ); } + + #[test] + fn test_is_upgrade_instruction() { + assert_eq!( + false, + is_upgrade_instruction( + &bincode::serialize(&UpgradeableLoaderInstruction::InitializeBuffer).unwrap() + ) + ); + assert_eq!( + false, + is_upgrade_instruction( + &bincode::serialize(&UpgradeableLoaderInstruction::Write { + offset: 0, + bytes: vec![], + }) + .unwrap() + ) + ); + assert_eq!( + false, + is_upgrade_instruction( + &bincode::serialize(&UpgradeableLoaderInstruction::DeployWithMaxDataLen { + max_data_len: 0, + }) + .unwrap() + ) + ); + assert_eq!( + true, + is_upgrade_instruction( + &bincode::serialize(&UpgradeableLoaderInstruction::Upgrade).unwrap() + ) + ); + assert_eq!( + false, + is_upgrade_instruction( + &bincode::serialize(&UpgradeableLoaderInstruction::SetAuthority).unwrap() + ) + ); + } } diff --git a/sdk/program/src/loader_upgradeable_instruction.rs b/sdk/program/src/loader_upgradeable_instruction.rs index 17d4442d3e..1ed39a0eb4 100644 --- a/sdk/program/src/loader_upgradeable_instruction.rs +++ b/sdk/program/src/loader_upgradeable_instruction.rs @@ -86,7 +86,7 @@ pub enum UpgradeableLoaderInstruction { /// /// # Account references /// 0. [writable] The ProgramData account. - /// 1. [] The Program account. + /// 1. [writable] The Program account. /// 2. [Writable] The Buffer account where the program data has been /// written. /// 3. [writable] The spill account. diff --git a/sdk/src/feature_set.rs b/sdk/src/feature_set.rs index 05f5d6fc9d..8514c1beb7 100644 --- a/sdk/src/feature_set.rs +++ b/sdk/src/feature_set.rs @@ -142,6 +142,10 @@ pub mod turbine_retransmit_peers_patch { solana_sdk::declare_id!("5Lu3JnWSFwRYpXzwDMkanWSk6XqSuF2i5fpnVhzB5CTc"); } +pub mod prevent_upgrade_and_invoke { + solana_sdk::declare_id!("BiNjYd8jCYDgAwMqP91uwZs6skWpuHtKrZbckuKESs8N"); +} + lazy_static! { /// Map of feature identifiers to user-visible description pub static ref FEATURE_NAMES: HashMap = [ @@ -179,6 +183,7 @@ lazy_static! { (abort_on_all_cpi_failures::id(), "Abort on all CPI failures"), (use_loaded_executables::id(), "Use loaded executable accounts"), (turbine_retransmit_peers_patch::id(), "turbine retransmit peers patch #14631"), + (prevent_upgrade_and_invoke::id(), "Prevent upgrade and invoke in same tx batch"), /*************** ADD NEW FEATURES HERE ***************/ ] .iter() diff --git a/transaction-status/src/lib.rs b/transaction-status/src/lib.rs index ef15a2af99..0f7acbd3ba 100644 --- a/transaction-status/src/lib.rs +++ b/transaction-status/src/lib.rs @@ -359,7 +359,7 @@ pub struct EncodedConfirmedBlock { pub block_time: Option, } -#[derive(Debug, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ConfirmedTransaction { pub slot: Slot,