diff --git a/Cargo.lock b/Cargo.lock index 6dcd5c74fd..3175a88fc4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,8 +14,8 @@ dependencies = [ [[package]] name = "ac-compose-macros" -version = "0.2.0" -source = "git+https://github.com/scs/substrate-api-client.git?branch=polkadot-v0.9.39-tag-v0.7.0#84af198434ea210eb0cd90cb8239748c376a079a" +version = "0.2.2" +source = "git+https://github.com/scs/substrate-api-client.git?branch=polkadot-v0.9.39-tag-v0.9.0#c4d3f110b94e25d5ce52d5bb64d0c778c4c7f2da" dependencies = [ "ac-primitives", "log 0.4.17", @@ -23,21 +23,18 @@ dependencies = [ "sp-application-crypto", "sp-core", "sp-runtime", - "sp-std", ] [[package]] name = "ac-node-api" -version = "0.2.0" -source = "git+https://github.com/scs/substrate-api-client.git?branch=polkadot-v0.9.39-tag-v0.7.0#84af198434ea210eb0cd90cb8239748c376a079a" +version = "0.2.2" +source = "git+https://github.com/scs/substrate-api-client.git?branch=polkadot-v0.9.39-tag-v0.9.0#c4d3f110b94e25d5ce52d5bb64d0c778c4c7f2da" dependencies = [ "ac-primitives", "bitvec", "derive_more", "either", - "frame-metadata 15.0.0 (git+https://github.com/integritee-network/frame-metadata)", - "frame-support", - "frame-system", + "frame-metadata 15.0.0 (git+https://github.com/paritytech/frame-metadata)", "hex", "log 0.4.17", "parity-scale-codec", @@ -48,19 +45,29 @@ dependencies = [ "sp-core", "sp-runtime", "sp-runtime-interface", - "sp-std", ] [[package]] name = "ac-primitives" -version = "0.2.0" -source = "git+https://github.com/scs/substrate-api-client.git?branch=polkadot-v0.9.39-tag-v0.7.0#84af198434ea210eb0cd90cb8239748c376a079a" +version = "0.4.0" +source = "git+https://github.com/scs/substrate-api-client.git?branch=polkadot-v0.9.39-tag-v0.9.0#c4d3f110b94e25d5ce52d5bb64d0c778c4c7f2da" dependencies = [ + "frame-system", "hex", + "impl-serde", + "pallet-assets", + "pallet-balances", + "pallet-contracts", + "pallet-staking", "parity-scale-codec", + "primitive-types", + "scale-info", + "serde 1.0.158", + "serde_json 1.0.94", "sp-core", "sp-runtime", - "sp-std", + "sp-staking", + "sp-version", ] [[package]] @@ -216,6 +223,15 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +[[package]] +name = "async-lock" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa24f727524730b077666307f2734b4a1a1c57acb79193127dcc8914d5242dd7" +dependencies = [ + "event-listener", +] + [[package]] name = "async-trait" version = "0.1.68" @@ -322,6 +338,12 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +[[package]] +name = "base64" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" + [[package]] name = "base64ct" version = "1.6.0" @@ -1378,6 +1400,12 @@ dependencies = [ "uint", ] +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + [[package]] name = "evm" version = "0.37.0" @@ -1663,6 +1691,34 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "frame-election-provider-solution-type" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.39#1837f423b494254e1d27834b1c9da34b2c0c2375" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "frame-election-provider-support" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.39#1837f423b494254e1d27834b1c9da34b2c0c2375" +dependencies = [ + "frame-election-provider-solution-type", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-npos-elections", + "sp-runtime", + "sp-std", +] + [[package]] name = "frame-executive" version = "4.0.0-dev" @@ -1694,7 +1750,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "15.0.0" -source = "git+https://github.com/integritee-network/frame-metadata#3b43da9821238681f9431276d55b92a079142083" +source = "git+https://github.com/paritytech/frame-metadata#040a53c63af277e280282028b73b992eac9c35a2" dependencies = [ "cfg-if 1.0.0", "parity-scale-codec", @@ -2457,9 +2513,9 @@ dependencies = [ "hyper", "log 0.4.17", "rustls 0.19.1", - "rustls-native-certs", + "rustls-native-certs 0.5.0", "tokio", - "tokio-rustls", + "tokio-rustls 0.22.0", "webpki 0.21.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2580,6 +2636,12 @@ dependencies = [ "serde 1.0.158", ] +[[package]] +name = "indexmap-nostd" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e04e2fd2b8188ea827b32ef11de88377086d690286ab35747ef7f9bf3ccb590" + [[package]] name = "instant" version = "0.1.12" @@ -2719,7 +2781,7 @@ dependencies = [ "its-rpc-handler", "its-storage", "its-test", - "jsonrpsee", + "jsonrpsee 0.2.0", "lazy_static", "log 0.4.17", "mockall", @@ -3102,6 +3164,7 @@ name = "itc-rpc-client" version = "0.9.0" dependencies = [ "env_logger 0.9.3", + "frame-metadata 15.0.0 (git+https://github.com/paritytech/frame-metadata)", "itc-tls-websocket-server", "itp-networking-utils", "itp-rpc", @@ -3135,7 +3198,7 @@ dependencies = [ "its-rpc-handler", "its-storage", "its-test", - "jsonrpsee", + "jsonrpsee 0.2.0", "log 0.4.17", "parity-scale-codec", "serde_json 1.0.94", @@ -3199,6 +3262,7 @@ checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" name = "itp-api-client-extensions" version = "0.9.0" dependencies = [ + "itp-api-client-types", "itp-types", "parity-scale-codec", "sp-core", @@ -3212,6 +3276,8 @@ dependencies = [ name = "itp-api-client-types" version = "0.9.0" dependencies = [ + "integritee-node-runtime", + "itp-types", "sp-core", "sp-runtime", "substrate-api-client", @@ -3701,6 +3767,7 @@ version = "0.9.0" dependencies = [ "chrono 0.4.24", "frame-system", + "integritee-node-runtime", "itp-sgx-runtime-primitives", "pallet-balances", "parity-scale-codec", @@ -3880,7 +3947,7 @@ dependencies = [ "its-rpc-handler", "its-storage", "its-test", - "jsonrpsee", + "jsonrpsee 0.2.0", "log 0.4.17", "serde 1.0.158", "serde_json 1.0.94", @@ -4058,12 +4125,66 @@ dependencies = [ "jsonrpsee-http-client", "jsonrpsee-http-server", "jsonrpsee-proc-macros", - "jsonrpsee-types", + "jsonrpsee-types 0.2.0", "jsonrpsee-utils", "jsonrpsee-ws-client", "jsonrpsee-ws-server", ] +[[package]] +name = "jsonrpsee" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d291e3a5818a2384645fd9756362e6d89cf0541b0b916fa7702ea4a9833608e" +dependencies = [ + "jsonrpsee-client-transport", + "jsonrpsee-core", + "jsonrpsee-types 0.16.2", +] + +[[package]] +name = "jsonrpsee-client-transport" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "965de52763f2004bc91ac5bcec504192440f0b568a5d621c59d9dbd6f886c3fb" +dependencies = [ + "futures-util 0.3.27", + "http 0.2.9", + "jsonrpsee-core", + "jsonrpsee-types 0.16.2", + "pin-project", + "rustls-native-certs 0.6.2", + "soketto 0.7.1", + "thiserror 1.0.40", + "tokio", + "tokio-rustls 0.23.4", + "tokio-util 0.7.7", + "tracing", + "webpki-roots 0.22.6", +] + +[[package]] +name = "jsonrpsee-core" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e70b4439a751a5de7dd5ed55eacff78ebf4ffe0fc009cb1ebb11417f5b536b" +dependencies = [ + "anyhow", + "async-lock", + "async-trait", + "beef", + "futures-channel 0.3.27", + "futures-timer", + "futures-util 0.3.27", + "jsonrpsee-types 0.16.2", + "rustc-hash", + "serde 1.0.158", + "serde_json 1.0.94", + "thiserror 1.0.40", + "tokio", + "tracing", +] + [[package]] name = "jsonrpsee-http-client" version = "0.2.0" @@ -4074,7 +4195,7 @@ dependencies = [ "fnv 1.0.7", "hyper", "hyper-rustls", - "jsonrpsee-types", + "jsonrpsee-types 0.2.0", "jsonrpsee-utils", "log 0.4.17", "serde 1.0.158", @@ -4093,7 +4214,7 @@ dependencies = [ "futures-util 0.3.27", "globset", "hyper", - "jsonrpsee-types", + "jsonrpsee-types 0.2.0", "jsonrpsee-utils", "lazy_static", "log 0.4.17", @@ -4132,8 +4253,22 @@ dependencies = [ "log 0.4.17", "serde 1.0.158", "serde_json 1.0.94", - "soketto", + "soketto 0.5.0", + "thiserror 1.0.40", +] + +[[package]] +name = "jsonrpsee-types" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bd522fe1ce3702fd94812965d7bb7a3364b1c9aba743944c5a00529aae80f8c" +dependencies = [ + "anyhow", + "beef", + "serde 1.0.158", + "serde_json 1.0.94", "thiserror 1.0.40", + "tracing", ] [[package]] @@ -4145,7 +4280,7 @@ dependencies = [ "futures-channel 0.3.27", "futures-util 0.3.27", "hyper", - "jsonrpsee-types", + "jsonrpsee-types 0.2.0", "log 0.4.17", "parking_lot 0.11.2", "rand 0.8.5", @@ -4164,17 +4299,17 @@ dependencies = [ "async-trait", "fnv 1.0.7", "futures 0.3.27", - "jsonrpsee-types", + "jsonrpsee-types 0.2.0", "log 0.4.17", "pin-project", "rustls 0.19.1", - "rustls-native-certs", + "rustls-native-certs 0.5.0", "serde 1.0.158", "serde_json 1.0.94", - "soketto", + "soketto 0.5.0", "thiserror 1.0.40", "tokio", - "tokio-rustls", + "tokio-rustls 0.22.0", "tokio-util 0.6.10", "url 2.3.1", ] @@ -4187,13 +4322,13 @@ checksum = "b512c3c679a89d20f97802f69188a2d01f6234491b7513076e21e8424efccafe" dependencies = [ "futures-channel 0.3.27", "futures-util 0.3.27", - "jsonrpsee-types", + "jsonrpsee-types 0.2.0", "jsonrpsee-utils", "log 0.4.17", "rustc-hash", "serde 1.0.158", "serde_json 1.0.94", - "soketto", + "soketto 0.5.0", "thiserror 1.0.40", "tokio", "tokio-stream", @@ -4237,7 +4372,7 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" dependencies = [ - "spin", + "spin 0.5.2", ] [[package]] @@ -5120,6 +5255,21 @@ version = "6.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" +[[package]] +name = "pallet-assets" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.39#1837f423b494254e1d27834b1c9da34b2c0c2375" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", + "sp-std", +] + [[package]] name = "pallet-aura" version = "4.0.0-dev" @@ -5183,6 +5333,57 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-contracts" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.39#1837f423b494254e1d27834b1c9da34b2c0c2375" +dependencies = [ + "bitflags", + "frame-benchmarking", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "log 0.4.17", + "pallet-contracts-primitives", + "pallet-contracts-proc-macro", + "parity-scale-codec", + "rand 0.8.5", + "scale-info", + "serde 1.0.158", + "smallvec 1.10.0", + "sp-api", + "sp-core", + "sp-io 7.0.0 (git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.39)", + "sp-runtime", + "sp-std", + "wasm-instrument", + "wasmi 0.20.0", + "wasmparser-nostd", +] + +[[package]] +name = "pallet-contracts-primitives" +version = "7.0.0" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.39#1837f423b494254e1d27834b1c9da34b2c0c2375" +dependencies = [ + "bitflags", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std", + "sp-weights", +] + +[[package]] +name = "pallet-contracts-proc-macro" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.39#1837f423b494254e1d27834b1c9da34b2c0c2375" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "pallet-evm" version = "6.0.0-dev" @@ -5367,6 +5568,28 @@ dependencies = [ "teerex-primitives", ] +[[package]] +name = "pallet-staking" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.39#1837f423b494254e1d27834b1c9da34b2c0c2375" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "log 0.4.17", + "pallet-authorship", + "pallet-session", + "parity-scale-codec", + "scale-info", + "serde 1.0.158", + "sp-application-crypto", + "sp-io 7.0.0 (git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.39)", + "sp-runtime", + "sp-staking", + "sp-std", +] + [[package]] name = "pallet-sudo" version = "4.0.0-dev" @@ -6239,7 +6462,7 @@ source = "git+https://github.com/mesalock-linux/ring-sgx?tag=v0.16.5#844efe271ed dependencies = [ "cc", "sgx_tstd", - "spin", + "spin 0.5.2", "untrusted", ] @@ -6252,7 +6475,7 @@ dependencies = [ "cc", "libc", "once_cell 1.17.1", - "spin", + "spin 0.5.2", "untrusted", "web-sys", "winapi 0.3.9", @@ -6268,7 +6491,7 @@ dependencies = [ "log 0.4.17", "once_cell 1.17.1", "rkyv", - "spin", + "spin 0.5.2", "untrusted", "winapi 0.3.9", "xous", @@ -6450,6 +6673,18 @@ dependencies = [ "webpki 0.21.4 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rustls" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" +dependencies = [ + "log 0.4.17", + "ring 0.16.20 (registry+https://github.com/rust-lang/crates.io-index)", + "sct 0.7.0", + "webpki 0.22.0", +] + [[package]] name = "rustls-native-certs" version = "0.5.0" @@ -6462,6 +6697,18 @@ dependencies = [ "security-framework", ] +[[package]] +name = "rustls-native-certs" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50" +dependencies = [ + "openssl-probe", + "rustls-pemfile 1.0.2", + "schannel", + "security-framework", +] + [[package]] name = "rustls-pemfile" version = "0.2.1" @@ -6471,6 +6718,15 @@ dependencies = [ "base64 0.13.1", ] +[[package]] +name = "rustls-pemfile" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" +dependencies = [ + "base64 0.21.0", +] + [[package]] name = "rustversion" version = "1.0.12" @@ -6633,6 +6889,16 @@ dependencies = [ "untrusted", ] +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring 0.16.20 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted", +] + [[package]] name = "sec1" version = "0.3.0" @@ -7241,6 +7507,21 @@ dependencies = [ "sha-1 0.9.8", ] +[[package]] +name = "soketto" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" +dependencies = [ + "base64 0.13.1", + "bytes 1.4.0", + "futures 0.3.27", + "httparse 1.8.0", + "log 0.4.17", + "rand 0.8.5", + "sha-1 0.9.8", +] + [[package]] name = "sp-api" version = "4.0.0-dev" @@ -7565,6 +7846,20 @@ dependencies = [ "zstd", ] +[[package]] +name = "sp-npos-elections" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.39#1837f423b494254e1d27834b1c9da34b2c0c2375" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde 1.0.158", + "sp-arithmetic", + "sp-core", + "sp-runtime", + "sp-std", +] + [[package]] name = "sp-offchain" version = "4.0.0-dev" @@ -7585,16 +7880,6 @@ dependencies = [ "regex 1.7.3", ] -[[package]] -name = "sp-rpc" -version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.39#1837f423b494254e1d27834b1c9da34b2c0c2375" -dependencies = [ - "rustc-hash", - "serde 1.0.158", - "sp-core", -] - [[package]] name = "sp-runtime" version = "7.0.0" @@ -7808,7 +8093,7 @@ dependencies = [ "log 0.4.17", "parity-scale-codec", "sp-std", - "wasmi", + "wasmi 0.13.2", "wasmtime", ] @@ -7833,6 +8118,12 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "spin" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0959fd6f767df20b231736396e4f602171e00d95205676286e79d4a4eb67bef" + [[package]] name = "spki" version = "0.6.0" @@ -7906,30 +8197,26 @@ dependencies = [ [[package]] name = "substrate-api-client" -version = "0.7.0" -source = "git+https://github.com/scs/substrate-api-client.git?branch=polkadot-v0.9.39-tag-v0.7.0#84af198434ea210eb0cd90cb8239748c376a079a" +version = "0.9.0" +source = "git+https://github.com/scs/substrate-api-client.git?branch=polkadot-v0.9.39-tag-v0.9.0#c4d3f110b94e25d5ce52d5bb64d0c778c4c7f2da" dependencies = [ "ac-compose-macros", "ac-node-api", "ac-primitives", - "frame-metadata 15.0.0 (git+https://github.com/integritee-network/frame-metadata)", + "frame-metadata 15.0.0 (git+https://github.com/paritytech/frame-metadata)", "frame-support", - "frame-system", + "futures 0.3.27", "hex", + "jsonrpsee 0.16.2", "log 0.4.17", - "pallet-balances", - "pallet-transaction-payment", "parity-scale-codec", - "primitive-types", "serde 1.0.158", "serde_json 1.0.94", "sp-core", - "sp-rpc", "sp-runtime", "sp-runtime-interface", - "sp-std", - "sp-version", - "thiserror 1.0.40", + "thiserror-core", + "url 2.3.1", "ws", ] @@ -7949,7 +8236,7 @@ dependencies = [ [[package]] name = "substrate-client-keystore" version = "0.7.0" -source = "git+https://github.com/scs/substrate-api-client.git?branch=polkadot-v0.9.39-tag-v0.7.0#84af198434ea210eb0cd90cb8239748c376a079a" +source = "git+https://github.com/scs/substrate-api-client.git?branch=polkadot-v0.9.39-tag-v0.9.0#c4d3f110b94e25d5ce52d5bb64d0c778c4c7f2da" dependencies = [ "async-trait", "hex", @@ -8133,6 +8420,26 @@ dependencies = [ "thiserror-impl 1.0.40", ] +[[package]] +name = "thiserror-core" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d97345f6437bb2004cd58819d8a9ef8e36cdd7661c2abc4bbde0a7c40d9f497" +dependencies = [ + "thiserror-core-impl", +] + +[[package]] +name = "thiserror-core-impl" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10ac1c5050e43014d16b2f94d0d2ce79e65ffdd8b38d8048f9c8f6a8a6da62ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "thiserror-impl" version = "1.0.9" @@ -8270,6 +8577,17 @@ dependencies = [ "webpki 0.21.4 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tokio-rustls" +version = "0.23.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" +dependencies = [ + "rustls 0.20.8", + "tokio", + "webpki 0.22.0", +] + [[package]] name = "tokio-stream" version = "0.1.12" @@ -8316,6 +8634,7 @@ checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" dependencies = [ "bytes 1.4.0", "futures-core 0.3.27", + "futures-io 0.3.27", "futures-sink 0.3.27", "pin-project-lite", "tokio", @@ -8781,7 +9100,7 @@ dependencies = [ "multipart", "percent-encoding 2.2.0", "pin-project", - "rustls-pemfile", + "rustls-pemfile 0.2.1", "scoped-tls", "serde 1.0.158", "serde_json 1.0.94", @@ -8866,6 +9185,15 @@ version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" +[[package]] +name = "wasm-instrument" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a47ecb37b9734d1085eaa5ae1a81e60801fd8c28d4cabdd8aedb982021918bc" +dependencies = [ + "parity-wasm", +] + [[package]] name = "wasm-opt" version = "0.111.0" @@ -8915,7 +9243,19 @@ checksum = "06c326c93fbf86419608361a2c925a31754cf109da1b8b55737070b4d6669422" dependencies = [ "parity-wasm", "wasmi-validation", - "wasmi_core", + "wasmi_core 0.2.1", +] + +[[package]] +name = "wasmi" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01bf50edb2ea9d922aa75a7bf3c15e26a6c9e2d18c56e862b49737a582901729" +dependencies = [ + "spin 0.9.7", + "wasmi_arena", + "wasmi_core 0.5.0", + "wasmparser-nostd", ] [[package]] @@ -8927,6 +9267,12 @@ dependencies = [ "parity-wasm", ] +[[package]] +name = "wasmi_arena" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ea379cbb0b41f3a9f0bf7b47036d036aae7f43383d8cc487d4deccf40dee0a" + [[package]] name = "wasmi_core" version = "0.2.1" @@ -8940,6 +9286,17 @@ dependencies = [ "num-traits 0.2.15", ] +[[package]] +name = "wasmi_core" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5bf998ab792be85e20e771fe14182b4295571ad1d4f89d3da521c1bef5f597a" +dependencies = [ + "downcast-rs", + "libm", + "num-traits 0.2.15", +] + [[package]] name = "wasmparser" version = "0.100.0" @@ -8950,6 +9307,15 @@ dependencies = [ "url 2.3.1", ] +[[package]] +name = "wasmparser-nostd" +version = "0.91.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c37f310b5a62bfd5ae7c0f1d8e6f98af16a5d6d84ba764e9c36439ec14e318b" +dependencies = [ + "indexmap-nostd", +] + [[package]] name = "wasmtime" version = "6.0.1" @@ -9122,6 +9488,16 @@ dependencies = [ "untrusted", ] +[[package]] +name = "webpki" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +dependencies = [ + "ring 0.16.20 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted", +] + [[package]] name = "webpki-roots" version = "0.21.0" @@ -9149,6 +9525,15 @@ dependencies = [ "webpki 0.21.4 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "webpki-roots" +version = "0.22.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" +dependencies = [ + "webpki 0.22.0", +] + [[package]] name = "wide" version = "0.7.8" diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 4191fd3056..3aa4d5667b 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -25,8 +25,8 @@ ws = { version = "0.9.1", features = ["ssl"] } # scs / integritee my-node-runtime = { package = "integritee-node-runtime", git = "https://github.com/integritee-network/integritee-node.git", branch = "polkadot-v0.9.39" } pallet-evm = { optional = true, git = "https://github.com/integritee-network/frontier.git", branch = "polkadot-v0.9.39" } -substrate-api-client = { features = ["ws-client"], git = "https://github.com/scs/substrate-api-client.git", branch = "polkadot-v0.9.39-tag-v0.7.0" } -substrate-client-keystore = { git = "https://github.com/scs/substrate-api-client.git", branch = "polkadot-v0.9.39-tag-v0.7.0" } +substrate-api-client = { features = ["ws-client"], git = "https://github.com/scs/substrate-api-client.git", branch = "polkadot-v0.9.39-tag-v0.9.0" } +substrate-client-keystore = { git = "https://github.com/scs/substrate-api-client.git", branch = "polkadot-v0.9.39-tag-v0.9.0" } teerex-primitives = { git = "https://github.com/integritee-network/pallets.git", branch = "polkadot-v0.9.39" } # substrate dependencies diff --git a/cli/src/base_cli/commands/balance.rs b/cli/src/base_cli/commands/balance.rs index 74ad9264cd..752190d425 100644 --- a/cli/src/base_cli/commands/balance.rs +++ b/cli/src/base_cli/commands/balance.rs @@ -19,6 +19,7 @@ use crate::{ command_utils::{get_accountid_from_str, get_chain_api}, Cli, }; +use substrate_api_client::GetAccountInformation; #[derive(Parser)] pub struct BalanceCommand { diff --git a/cli/src/base_cli/commands/faucet.rs b/cli/src/base_cli/commands/faucet.rs index 18dd16f0ae..592bea4a62 100644 --- a/cli/src/base_cli/commands/faucet.rs +++ b/cli/src/base_cli/commands/faucet.rs @@ -19,11 +19,12 @@ use crate::{ command_utils::{get_accountid_from_str, get_chain_api}, Cli, }; +use codec::Encode; use my_node_runtime::{BalancesCall, RuntimeCall}; use sp_keyring::AccountKeyring; use sp_runtime::MultiAddress; use std::vec::Vec; -use substrate_api_client::{compose_extrinsic_offline, UncheckedExtrinsicV4, XtStatus}; +use substrate_api_client::{compose_extrinsic_offline, SubmitExtrinsic, UncheckedExtrinsicV4}; const PREFUNDING_AMOUNT: u128 = 1_000_000_000; @@ -36,13 +37,14 @@ pub struct FaucetCommand { impl FaucetCommand { pub(crate) fn run(&self, cli: &Cli) { - let api = get_chain_api(cli).set_signer(AccountKeyring::Alice.pair()); + let mut api = get_chain_api(cli); + api.set_signer(AccountKeyring::Alice.pair()); let mut nonce = api.get_nonce().unwrap(); for account in &self.accounts { let to = get_accountid_from_str(account); #[allow(clippy::redundant_clone)] let xt: UncheckedExtrinsicV4<_, _> = compose_extrinsic_offline!( - api.clone().signer.unwrap(), + api.signer().unwrap(), RuntimeCall::Balances(BalancesCall::transfer { dest: MultiAddress::Id(to.clone()), value: PREFUNDING_AMOUNT @@ -51,7 +53,7 @@ impl FaucetCommand { ); // send and watch extrinsic until finalized println!("Faucet drips to {} (Alice's nonce={})", to, nonce); - let _blockh = api.send_extrinsic(xt.hex_encode(), XtStatus::Ready).unwrap(); + let _blockh = api.submit_extrinsic(xt.encode()).unwrap(); nonce += 1; } } diff --git a/cli/src/base_cli/commands/listen.rs b/cli/src/base_cli/commands/listen.rs index 6ec657ddfd..28ea89e8a9 100644 --- a/cli/src/base_cli/commands/listen.rs +++ b/cli/src/base_cli/commands/listen.rs @@ -20,8 +20,8 @@ use base58::ToBase58; use codec::{Decode, Encode}; use log::*; use my_node_runtime::{Hash, RuntimeEvent}; -use std::{sync::mpsc::channel, vec::Vec}; -use substrate_api_client::utils::FromHexString; +use std::vec::Vec; +use substrate_api_client::{rpc::HandleSubscription, SubscribeFrameSystem}; #[derive(Parser)] pub struct ListenCommand { @@ -39,10 +39,9 @@ impl ListenCommand { println!("{:?} {:?}", self.events, self.blocks); let api = get_chain_api(cli); info!("Subscribing to events"); - let (events_in, events_out) = channel(); let mut count = 0u32; let mut blocks = 0u32; - api.subscribe_events(events_in).unwrap(); + let mut subscription = api.subscribe_system_events().unwrap(); loop { if let Some(e) = self.events { if count >= e { @@ -54,13 +53,13 @@ impl ListenCommand { return } }; - let event_str = events_out.recv().unwrap(); - let _unhex = Vec::from_hex(event_str).unwrap(); - let mut _er_enc = _unhex.as_slice(); - let _events = - Vec::>::decode(&mut _er_enc); + + let event_bytes = subscription.next().unwrap().unwrap().changes[0].1.clone().unwrap().0; + let events_result = Vec::>::decode( + &mut event_bytes.as_slice(), + ); blocks += 1; - match _events { + match events_result { Ok(evts) => for evr in &evts { println!("decoded: phase {:?} event {:?}", evr.phase, evr.event); diff --git a/cli/src/base_cli/commands/shield_funds.rs b/cli/src/base_cli/commands/shield_funds.rs index e80a43c0b9..5773d8108c 100644 --- a/cli/src/base_cli/commands/shield_funds.rs +++ b/cli/src/base_cli/commands/shield_funds.rs @@ -27,7 +27,7 @@ use itp_stf_primitives::types::ShardIdentifier; use log::*; use my_node_runtime::Balance; use sp_core::sr25519 as sr25519_core; -use substrate_api_client::{compose_extrinsic, UncheckedExtrinsicV4, XtStatus}; +use substrate_api_client::{compose_extrinsic, SubmitAndWatch, UncheckedExtrinsicV4, XtStatus}; #[derive(Parser)] pub struct ShieldFundsCommand { @@ -46,7 +46,7 @@ pub struct ShieldFundsCommand { impl ShieldFundsCommand { pub(crate) fn run(&self, cli: &Cli) { - let chain_api = get_chain_api(cli); + let mut chain_api = get_chain_api(cli); let shard_opt = match self.shard.from_base58() { Ok(s) => ShardIdentifier::decode(&mut &s[..]), @@ -60,7 +60,7 @@ impl ShieldFundsCommand { // get the sender let from = get_pair_from_str(&self.from); - let chain_api = chain_api.set_signer(sr25519_core::Pair::from(from)); + chain_api.set_signer(sr25519_core::Pair::from(from)); // get the recipient let to = get_accountid_from_str(&self.to); @@ -78,7 +78,9 @@ impl ShieldFundsCommand { shard ); - let tx_hash = chain_api.send_extrinsic(xt.hex_encode(), XtStatus::Finalized).unwrap(); + let tx_hash = chain_api + .submit_and_watch_extrinsic_until(xt.encode(), XtStatus::Finalized) + .unwrap(); println!("[+] TrustedOperation got finalized. Hash: {:?}\n", tx_hash); } } diff --git a/cli/src/base_cli/commands/transfer.rs b/cli/src/base_cli/commands/transfer.rs index 781d9407e8..35520a6128 100644 --- a/cli/src/base_cli/commands/transfer.rs +++ b/cli/src/base_cli/commands/transfer.rs @@ -19,10 +19,11 @@ use crate::{ command_utils::{get_accountid_from_str, get_chain_api, *}, Cli, }; +use codec::Encode; use log::*; use my_node_runtime::Balance; use sp_core::{crypto::Ss58Codec, sr25519 as sr25519_core, Pair}; -use substrate_api_client::{GenericAddress, XtStatus}; +use substrate_api_client::{GenericAddress, GetAccountInformation, SubmitAndWatch, XtStatus}; #[derive(Parser)] pub struct TransferCommand { @@ -42,9 +43,10 @@ impl TransferCommand { let to_account = get_accountid_from_str(&self.to); info!("from ss58 is {}", from_account.public().to_ss58check()); info!("to ss58 is {}", to_account.to_ss58check()); - let api = get_chain_api(cli).set_signer(sr25519_core::Pair::from(from_account)); + let mut api = get_chain_api(cli); + api.set_signer(sr25519_core::Pair::from(from_account)); let xt = api.balance_transfer(GenericAddress::Id(to_account.clone()), self.amount); - let tx_hash = api.send_extrinsic(xt.hex_encode(), XtStatus::InBlock).unwrap(); + let tx_hash = api.submit_and_watch_extrinsic_until(xt.encode(), XtStatus::InBlock).unwrap(); println!("[+] TrustedOperation got finalized. Hash: {:?}\n", tx_hash); let result = api.get_account_data(&to_account).unwrap().unwrap(); println!("balance for {} is now {}", to_account, result.free); diff --git a/cli/src/base_cli/mod.rs b/cli/src/base_cli/mod.rs index 03b370ac99..525ee32eed 100644 --- a/cli/src/base_cli/mod.rs +++ b/cli/src/base_cli/mod.rs @@ -110,14 +110,15 @@ fn list_accounts() { } fn print_metadata(cli: &Cli) { - let meta = get_chain_api(cli).get_metadata().unwrap(); - println!("Metadata:\n {}", Metadata::pretty_format(&meta).unwrap()); + let api = get_chain_api(cli); + let meta = api.metadata(); + println!("Metadata:\n {}", Metadata::pretty_format(&meta.runtime_metadata()).unwrap()); } fn print_sgx_metadata(cli: &Cli) { let worker_api_direct = get_worker_api_direct(cli); let metadata = worker_api_direct.get_state_metadata().unwrap(); - println!("Metadata:\n {}", Metadata::pretty_format(&metadata).unwrap()); + println!("Metadata:\n {}", Metadata::pretty_format(metadata.runtime_metadata()).unwrap()); } fn list_workers(cli: &Cli) { diff --git a/cli/src/command_utils.rs b/cli/src/command_utils.rs index 8b8b43c99d..6989542959 100644 --- a/cli/src/command_utils.rs +++ b/cli/src/command_utils.rs @@ -40,7 +40,7 @@ pub(crate) fn get_shielding_key(cli: &Cli) -> Result { pub(crate) fn get_chain_api(cli: &Cli) -> ParentchainApi { let url = format!("{}:{}", cli.node_url, cli.node_port); info!("connecting to {}", url); - ParentchainApi::new(WsRpcClient::new(&url)).unwrap() + ParentchainApi::new(WsRpcClient::new(&url).unwrap()).unwrap() } pub(crate) fn get_accountid_from_str(account: &str) -> AccountId { diff --git a/cli/src/oracle/commands/add_to_whitelist.rs b/cli/src/oracle/commands/add_to_whitelist.rs index 38eaf05eb4..1f43543d6e 100644 --- a/cli/src/oracle/commands/add_to_whitelist.rs +++ b/cli/src/oracle/commands/add_to_whitelist.rs @@ -19,8 +19,11 @@ use crate::{ command_utils::{get_chain_api, get_pair_from_str, mrenclave_from_base58}, Cli, }; +use codec::Encode; use itp_node_api::api_client::{ADD_TO_WHITELIST, TEERACLE}; -use substrate_api_client::{compose_call, compose_extrinsic, UncheckedExtrinsicV4, XtStatus}; +use substrate_api_client::{ + compose_call, compose_extrinsic, SubmitAndWatch, UncheckedExtrinsicV4, XtStatus, +}; /// Add a trusted market data source to the on-chain whitelist. #[derive(Debug, Clone, Parser)] @@ -39,21 +42,27 @@ pub struct AddToWhitelistCmd { impl AddToWhitelistCmd { pub fn run(&self, cli: &Cli) { - let api = get_chain_api(cli); + let mut api = get_chain_api(cli); let mrenclave = mrenclave_from_base58(&self.mrenclave); let from = get_pair_from_str(&self.from); let market_data_source = self.source.clone(); - let api = api.set_signer(from.into()); + api.set_signer(from.into()); - let call = - compose_call!(api.metadata, TEERACLE, ADD_TO_WHITELIST, market_data_source, mrenclave); + let call = compose_call!( + api.metadata(), + TEERACLE, + ADD_TO_WHITELIST, + market_data_source, + mrenclave + ); // compose the extrinsic let xt: UncheckedExtrinsicV4<_, _> = compose_extrinsic!(api, "Sudo", "sudo", call); - let tx_hash = api.send_extrinsic(xt.hex_encode(), XtStatus::Finalized).unwrap(); - println!("[+] Add to whitelist got finalized. Hash: {:?}\n", tx_hash); + let report = + api.submit_and_watch_extrinsic_until(xt.encode(), XtStatus::Finalized).unwrap(); + println!("[+] Add to whitelist got finalized. Hash: {:?}\n", report.extrinsic_hash); } } diff --git a/cli/src/oracle/commands/listen_to_exchange.rs b/cli/src/oracle/commands/listen_to_exchange.rs index aaeb653e16..e2e803acf4 100644 --- a/cli/src/oracle/commands/listen_to_exchange.rs +++ b/cli/src/oracle/commands/listen_to_exchange.rs @@ -21,8 +21,8 @@ use itp_node_api::api_client::ParentchainApi; use itp_time_utils::{duration_now, remaining_time}; use log::{debug, info, trace}; use my_node_runtime::{Hash, RuntimeEvent}; -use std::{sync::mpsc::channel, time::Duration}; -use substrate_api_client::FromHexString; +use std::time::Duration; +use substrate_api_client::{rpc::HandleSubscription, SubscribeFrameSystem}; /// Listen to exchange rate events. #[derive(Debug, Clone, Parser)] @@ -47,16 +47,13 @@ pub fn count_exchange_rate_update_events(api: &ParentchainApi, duration: Duratio let stop = duration_now() + duration; //subscribe to events - let (events_in, events_out) = channel(); - api.subscribe_events(events_in).unwrap(); + let mut subscription = api.subscribe_system_events().unwrap(); let mut count = 0; while remaining_time(stop).unwrap_or_default() > Duration::ZERO { - let event_str = events_out.recv().unwrap(); - let unhex = Vec::from_hex(event_str).unwrap(); - let mut event_records_encoded = unhex.as_slice(); + let event_bytes = subscription.next().unwrap().unwrap().changes[0].1.clone().unwrap().0; let events_result = Vec::>::decode( - &mut event_records_encoded, + &mut event_bytes.as_slice(), ); if let Ok(events) = events_result { for event_record in &events { diff --git a/cli/src/oracle/commands/listen_to_oracle.rs b/cli/src/oracle/commands/listen_to_oracle.rs index 8a53a80556..f1d19bde67 100644 --- a/cli/src/oracle/commands/listen_to_oracle.rs +++ b/cli/src/oracle/commands/listen_to_oracle.rs @@ -21,8 +21,8 @@ use itp_node_api::api_client::ParentchainApi; use itp_time_utils::{duration_now, remaining_time}; use log::{debug, info}; use my_node_runtime::{Hash, RuntimeEvent}; -use std::{sync::mpsc::channel, time::Duration}; -use substrate_api_client::FromHexString; +use std::time::Duration; +use substrate_api_client::{rpc::HandleSubscription, SubscribeFrameSystem}; /// Listen to exchange rate events. #[derive(Debug, Clone, Parser)] @@ -47,14 +47,12 @@ fn count_oracle_update_events(api: &ParentchainApi, duration: Duration) -> Event let stop = duration_now() + duration; //subscribe to events - let (events_in, events_out) = channel(); - api.subscribe_events(events_in).unwrap(); + let mut subscription = api.subscribe_system_events().unwrap(); let mut count = 0; while remaining_time(stop).unwrap_or_default() > Duration::ZERO { - let events_str = events_out.recv().unwrap(); - let events_vec_bytes = Vec::from_hex(events_str).unwrap(); - count += report_event_count(&events_vec_bytes); + let event_bytes = subscription.next().unwrap().unwrap().changes[0].1.clone().unwrap().0; + count += report_event_count(&event_bytes); } debug!("Received {} ExchangeRateUpdated event(s) in total", count); count diff --git a/cli/src/trusted_operation.rs b/cli/src/trusted_operation.rs index a042c6efa0..5b4293e39f 100644 --- a/cli/src/trusted_operation.rs +++ b/cli/src/trusted_operation.rs @@ -28,7 +28,7 @@ use itp_node_api::api_client::TEEREX; use itp_rpc::{RpcRequest, RpcResponse, RpcReturnValue}; use itp_sgx_crypto::ShieldingCryptoEncrypt; use itp_stf_primitives::types::ShardIdentifier; -use itp_types::{BlockNumber, DirectRequestStatus, Header, TrustedOperationStatus}; +use itp_types::{BlockNumber, DirectRequestStatus, TrustedOperationStatus}; use itp_utils::{FromHexPrefixed, ToHexPrefixed}; use log::*; use my_node_runtime::{AccountId, Hash}; @@ -38,7 +38,10 @@ use std::{ sync::mpsc::{channel, Receiver}, time::Instant, }; -use substrate_api_client::{compose_extrinsic, StaticEvent, XtStatus}; +use substrate_api_client::{ + compose_extrinsic, GetHeader, StaticEvent, SubmitAndWatch, SubscribeEvents, + SubscribeFrameSystem, XtStatus, +}; use teerex_primitives::Request; pub(crate) fn perform_trusted_operation( @@ -107,7 +110,7 @@ fn send_request( trusted_args: &TrustedCli, trusted_operation: &TrustedOperation, ) -> Option> { - let chain_api = get_chain_api(cli); + let mut chain_api = get_chain_api(cli); let encryption_key = get_shielding_key(cli).unwrap(); let call_encrypted = encryption_key.encrypt(&trusted_operation.encode()).unwrap(); @@ -115,30 +118,32 @@ fn send_request( let arg_signer = &trusted_args.xt_signer; let signer = get_pair_from_str(arg_signer); - let _chain_api = chain_api.set_signer(sr25519_core::Pair::from(signer)); + chain_api.set_signer(sr25519_core::Pair::from(signer)); let request = Request { shard, cyphertext: call_encrypted }; - let xt = compose_extrinsic!(_chain_api, TEEREX, "call_worker", request); + let xt = compose_extrinsic!(&chain_api, TEEREX, "call_worker", request); // send and watch extrinsic until block is executed - let block_hash = - _chain_api.send_extrinsic(xt.hex_encode(), XtStatus::InBlock).unwrap().unwrap(); + let block_hash = chain_api + .submit_and_watch_extrinsic_until(xt.encode(), XtStatus::InBlock) + .unwrap() + .block_hash + .unwrap(); info!( "Trusted call extrinsic sent and successfully included in parentchain block with hash {:?}.", block_hash ); info!("Waiting for execution confirmation from enclave..."); - let (events_in, events_out) = channel(); - _chain_api.subscribe_events(events_in).unwrap(); + let mut subscription = chain_api.subscribe_system_events().unwrap(); loop { let ret: ProcessedParentchainBlockArgs = - _chain_api.wait_for_event::(&events_out).unwrap(); + chain_api.wait_for_event(&mut subscription).unwrap(); info!("Confirmation of ProcessedParentchainBlock received"); debug!("Expected block Hash: {:?}", block_hash); debug!("Confirmed stf block Hash: {:?}", ret.block_hash); - match _chain_api.get_header::
(Some(block_hash)) { + match chain_api.get_header(Some(block_hash)) { Ok(option) => { match option { None => { diff --git a/core-primitives/extrinsics-factory/Cargo.toml b/core-primitives/extrinsics-factory/Cargo.toml index 07e2b72fec..b6d97e3175 100644 --- a/core-primitives/extrinsics-factory/Cargo.toml +++ b/core-primitives/extrinsics-factory/Cargo.toml @@ -8,7 +8,7 @@ edition = "2021" # sgx dependencies sgx_tstd = { branch = "master", git = "https://github.com/apache/teaclave-sgx-sdk.git", optional = true } sgx_types = { branch = "master", git = "https://github.com/apache/teaclave-sgx-sdk.git" } -substrate-api-client = { default-features = false, git = "https://github.com/scs/substrate-api-client.git", branch = "polkadot-v0.9.39-tag-v0.7.0" } +substrate-api-client = { default-features = false, git = "https://github.com/scs/substrate-api-client.git", branch = "polkadot-v0.9.39-tag-v0.9.0" } # local dependencies itp-node-api = { path = "../node-api", default-features = false } diff --git a/core-primitives/node-api/api-client-extensions/Cargo.toml b/core-primitives/node-api/api-client-extensions/Cargo.toml index 497506ac52..c5d98cab9a 100644 --- a/core-primitives/node-api/api-client-extensions/Cargo.toml +++ b/core-primitives/node-api/api-client-extensions/Cargo.toml @@ -15,9 +15,10 @@ sp-finality-grandpa = { git = "https://github.com/paritytech/substrate.git", bra sp-runtime = { git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.39" } # scs -substrate-api-client = { git = "https://github.com/scs/substrate-api-client.git", branch = "polkadot-v0.9.39-tag-v0.7.0" } +substrate-api-client = { git = "https://github.com/scs/substrate-api-client.git", branch = "polkadot-v0.9.39-tag-v0.9.0" } # local deps +itp-api-client-types = { path = "../api-client-types" } itp-types = { path = "../../types" } [features] diff --git a/core-primitives/node-api/api-client-extensions/src/account.rs b/core-primitives/node-api/api-client-extensions/src/account.rs index 4703223328..7e2a656048 100644 --- a/core-primitives/node-api/api-client-extensions/src/account.rs +++ b/core-primitives/node-api/api-client-extensions/src/account.rs @@ -16,26 +16,32 @@ */ use crate::ApiResult; -use itp_types::AccountId; -use sp_core::crypto::Pair; +use itp_types::parentchain::{AccountData, AccountId, Balance, Index}; +use sp_core::Pair; use sp_runtime::MultiSignature; -use substrate_api_client::{Api, ExtrinsicParams, RpcClient}; +use substrate_api_client::{ + rpc::Request, Api, ExtrinsicParams, FrameSystemConfig, GetAccountInformation, +}; /// ApiClient extension that contains some convenience methods around accounts. pub trait AccountApi { - fn get_nonce_of(&self, who: &AccountId) -> ApiResult; - fn get_free_balance(&self, who: &AccountId) -> ApiResult; + fn get_nonce_of(&self, who: &AccountId) -> ApiResult; + fn get_free_balance(&self, who: &AccountId) -> ApiResult; } -impl AccountApi for Api +impl AccountApi for Api where - MultiSignature: From, + Signer: Pair, + MultiSignature: From, + Client: Request, + Runtime: FrameSystemConfig, + Params: ExtrinsicParams, { - fn get_nonce_of(&self, who: &AccountId) -> ApiResult { + fn get_nonce_of(&self, who: &AccountId) -> ApiResult { Ok(self.get_account_info(who)?.map_or_else(|| 0, |info| info.nonce)) } - fn get_free_balance(&self, who: &AccountId) -> ApiResult { + fn get_free_balance(&self, who: &AccountId) -> ApiResult { Ok(self.get_account_data(who)?.map_or_else(|| 0, |data| data.free)) } } diff --git a/core-primitives/node-api/api-client-extensions/src/chain.rs b/core-primitives/node-api/api-client-extensions/src/chain.rs index 39b9b785e6..410f6332a3 100644 --- a/core-primitives/node-api/api-client-extensions/src/chain.rs +++ b/core-primitives/node-api/api-client-extensions/src/chain.rs @@ -15,60 +15,61 @@ */ -use crate::ApiResult; -use itp_types::{Header, SignedBlock}; -use sp_core::{storage::StorageKey, Pair, H256}; +use crate::{ApiClientError, ApiResult}; +use itp_api_client_types::{Block, SignedBlock}; +use itp_types::parentchain::{BlockNumber, Hash, Header, StorageProof}; use sp_finality_grandpa::{AuthorityList, VersionedAuthorityList, GRANDPA_AUTHORITIES_KEY}; -use sp_runtime::MultiSignature; -use substrate_api_client::{Api, ExtrinsicParams, RpcClient}; - -pub type StorageProof = Vec>; +use sp_runtime::traits::GetRuntimeBlockType; +use substrate_api_client::{ + primitives::StorageKey, rpc::Request, Api, ExtrinsicParams, FrameSystemConfig, GetBlock, + GetHeader, GetStorage, +}; /// ApiClient extension that simplifies chain data access. pub trait ChainApi { fn last_finalized_block(&self) -> ApiResult>; - fn signed_block(&self, hash: Option) -> ApiResult>; - fn get_genesis_hash(&self) -> ApiResult; - fn get_header(&self, header_hash: Option) -> ApiResult>; + fn signed_block(&self, hash: Option) -> ApiResult>; + fn get_genesis_hash(&self) -> ApiResult; + fn header(&self, header_hash: Option) -> ApiResult>; /// Fetch blocks from parentchain with blocknumber from until to, including both boundaries. /// Returns a vector with one element if from equals to. /// Returns an empty vector if from is greater than to. - fn get_blocks(&self, from: u32, to: u32) -> ApiResult>; + fn get_blocks(&self, from: BlockNumber, to: BlockNumber) -> ApiResult>; fn is_grandpa_available(&self) -> ApiResult; - fn grandpa_authorities(&self, hash: Option) -> ApiResult; - fn grandpa_authorities_proof(&self, hash: Option) -> ApiResult; + fn grandpa_authorities(&self, hash: Option) -> ApiResult; + fn grandpa_authorities_proof(&self, hash: Option) -> ApiResult; } -impl ChainApi for Api +impl ChainApi for Api where - MultiSignature: From, + Client: Request, + Runtime: FrameSystemConfig + + GetRuntimeBlockType, + Params: ExtrinsicParams, { fn last_finalized_block(&self) -> ApiResult> { self.get_finalized_head()? .map_or_else(|| Ok(None), |hash| self.signed_block(Some(hash))) } - fn signed_block(&self, hash: Option) -> ApiResult> { - // Even though this is only a wrapper here, we want to have this in the trait - // to be able to be generic over the trait and mock the `signed_block` method - // in tests. - self.get_signed_block(hash) + fn signed_block(&self, hash: Option) -> ApiResult> { + Ok(self.get_signed_block(hash)?.map(|block| block.into())) } - fn get_genesis_hash(&self) -> ApiResult { - self.get_genesis_hash() + fn get_genesis_hash(&self) -> ApiResult { + self.get_block_hash(Some(0u32))?.ok_or(ApiClientError::NoBlockHash) } - fn get_header(&self, header_hash: Option) -> ApiResult> { + fn header(&self, header_hash: Option) -> ApiResult> { self.get_header(header_hash) } - fn get_blocks(&self, from: u32, to: u32) -> ApiResult> { + fn get_blocks(&self, from: BlockNumber, to: BlockNumber) -> ApiResult> { let mut blocks = Vec::::new(); for n in from..=to { if let Some(block) = self.get_signed_block_by_num(Some(n))? { - blocks.push(block); + blocks.push(block.into()); } } Ok(blocks) @@ -83,14 +84,14 @@ where .unwrap_or(false)) } - fn grandpa_authorities(&self, at_block: Option) -> ApiResult { + fn grandpa_authorities(&self, at_block: Option) -> ApiResult { Ok(self .get_storage_by_key_hash(StorageKey(GRANDPA_AUTHORITIES_KEY.to_vec()), at_block)? .map(|g: VersionedAuthorityList| g.into()) .unwrap_or_default()) } - fn grandpa_authorities_proof(&self, at_block: Option) -> ApiResult { + fn grandpa_authorities_proof(&self, at_block: Option) -> ApiResult { Ok(self .get_storage_proof_by_keys( vec![StorageKey(GRANDPA_AUTHORITIES_KEY.to_vec())], diff --git a/core-primitives/node-api/api-client-extensions/src/lib.rs b/core-primitives/node-api/api-client-extensions/src/lib.rs index 08004fa99f..4265e33393 100644 --- a/core-primitives/node-api/api-client-extensions/src/lib.rs +++ b/core-primitives/node-api/api-client-extensions/src/lib.rs @@ -17,7 +17,7 @@ //! Some substrate-api-client extension traits. -pub use substrate_api_client::{rpc::WsRpcClient, Api, ApiClientError}; +pub use substrate_api_client::{api::Error as ApiClientError, rpc::WsRpcClient, Api}; pub mod account; pub mod chain; diff --git a/core-primitives/node-api/api-client-extensions/src/pallet_teerex.rs b/core-primitives/node-api/api-client-extensions/src/pallet_teerex.rs index 4405f8169f..5f75f16fde 100644 --- a/core-primitives/node-api/api-client-extensions/src/pallet_teerex.rs +++ b/core-primitives/node-api/api-client-extensions/src/pallet_teerex.rs @@ -16,10 +16,8 @@ */ use crate::ApiResult; -use itp_types::{Enclave, IpfsHash, ShardIdentifier}; -use sp_core::{Pair, H256 as Hash}; -use sp_runtime::MultiSignature; -use substrate_api_client::{Api, ExtrinsicParams, RpcClient}; +use itp_types::{parentchain::Hash, Enclave, IpfsHash, ShardIdentifier}; +use substrate_api_client::{rpc::Request, Api, ExtrinsicParams, FrameSystemConfig, GetStorage}; pub const TEEREX: &str = "Teerex"; pub const SIDECHAIN: &str = "Sidechain"; @@ -41,9 +39,11 @@ pub trait PalletTeerexApi { ) -> ApiResult>; } -impl PalletTeerexApi for Api +impl PalletTeerexApi for Api where - MultiSignature: From, + Client: Request, + Runtime: FrameSystemConfig, + Params: ExtrinsicParams, { fn enclave(&self, index: u64, at_block: Option) -> ApiResult> { self.get_storage_map(TEEREX, "EnclaveRegistry", index, at_block) diff --git a/core-primitives/node-api/api-client-extensions/src/pallet_teerex_api_mock.rs b/core-primitives/node-api/api-client-extensions/src/pallet_teerex_api_mock.rs index 867b7ee5ff..06da958b9d 100644 --- a/core-primitives/node-api/api-client-extensions/src/pallet_teerex_api_mock.rs +++ b/core-primitives/node-api/api-client-extensions/src/pallet_teerex_api_mock.rs @@ -16,7 +16,7 @@ */ use crate::{pallet_teerex::PalletTeerexApi, ApiResult}; -use itp_types::{Enclave, IpfsHash, ShardIdentifier, H256 as Hash}; +use itp_types::{parentchain::Hash, Enclave, IpfsHash, ShardIdentifier}; #[derive(Default)] pub struct PalletTeerexApiMock { diff --git a/core-primitives/node-api/api-client-types/Cargo.toml b/core-primitives/node-api/api-client-types/Cargo.toml index 974556b34c..205ce327c4 100644 --- a/core-primitives/node-api/api-client-types/Cargo.toml +++ b/core-primitives/node-api/api-client-types/Cargo.toml @@ -5,19 +5,27 @@ authors = ["Integritee AG "] edition = "2021" [dependencies] +# integritee-node +my-node-runtime = { package = "integritee-node-runtime", optional = true, git = "https://github.com/integritee-network/integritee-node.git", branch = "polkadot-v0.9.39" } # scs -substrate-api-client = { default-features = false, git = "https://github.com/scs/substrate-api-client.git", branch = "polkadot-v0.9.39-tag-v0.7.0" } +substrate-api-client = { default-features = false, git = "https://github.com/scs/substrate-api-client.git", branch = "polkadot-v0.9.39-tag-v0.9.0" } # substrate sp-core = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.39" } sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.39" } +# local +itp-types = { default-features = false, path = "../../types" } + + [features] default = ["std"] std = [ + "itp-types/std", "substrate-api-client/std", "substrate-api-client/ws-client", "sp-core/std", "sp-runtime/std", + "my-node-runtime", ] diff --git a/core-primitives/node-api/api-client-types/src/lib.rs b/core-primitives/node-api/api-client-types/src/lib.rs index 67dbf17360..dd35c54ad3 100644 --- a/core-primitives/node-api/api-client-types/src/lib.rs +++ b/core-primitives/node-api/api-client-types/src/lib.rs @@ -22,26 +22,30 @@ #![cfg_attr(not(feature = "std"), no_std)] +pub use itp_types::parentchain::{Balance, Hash, Index}; pub use sp_runtime::MultiSignature; pub use substrate_api_client::{ - CallIndex, GenericAddress, PlainTip, PlainTipExtrinsicParams, PlainTipExtrinsicParamsBuilder, + AssetTip, BaseExtrinsicParams, BaseExtrinsicParamsBuilder, CallIndex, GenericAddress, PlainTip, SubstrateDefaultSignedExtra, UncheckedExtrinsicV4, }; +pub type ParentchainPlainTip = PlainTip; +pub type ParentchainAssetTip = AssetTip; + /// Configuration for the ExtrinsicParams. /// /// Valid for the default integritee node -pub type ParentchainExtrinsicParams = PlainTipExtrinsicParams; -pub type ParentchainExtrinsicParamsBuilder = PlainTipExtrinsicParamsBuilder; +pub type ParentchainExtrinsicParams = BaseExtrinsicParams; +pub type ParentchainExtrinsicParamsBuilder = BaseExtrinsicParamsBuilder; // Pay in asset fees. // // This needs to be used if the node uses the `pallet_asset_tx_payment`. -//pub type ParentchainExtrinsicParams = AssetTipExtrinsicParams; -//pub type ParentchainExtrinsicParamsBuilder = AssetTipExtrinsicParamsBuilder; +//pub type ParentchainExtrinsicParams = BaseExtrinsicParams; +//pub type ParentchainExtrinsicParamsBuilder = BaseExtrinsicParamsBuilder; pub type ParentchainUncheckedExtrinsic = UncheckedExtrinsicV4; -pub type ParentchainSignedExtra = SubstrateDefaultSignedExtra; +pub type ParentchainSignedExtra = SubstrateDefaultSignedExtra; pub type ParentchainSignature = Signature; /// Signature type of the [UncheckedExtrinsicV4]. @@ -53,9 +57,17 @@ pub use api::*; #[cfg(feature = "std")] mod api { use super::ParentchainExtrinsicParams; + use sp_runtime::generic::SignedBlock as GenericSignedBlock; use substrate_api_client::Api; - pub use substrate_api_client::{rpc::WsRpcClient, ApiClientError}; + pub use my_node_runtime::{Block, Runtime, UncheckedExtrinsic}; + + pub use substrate_api_client::{ + api::Error as ApiClientError, + rpc::{Error as RpcClientError, WsRpcClient}, + }; - pub type ParentchainApi = Api; + pub type SignedBlock = GenericSignedBlock; + pub type ParentchainApi = + Api; } diff --git a/core-primitives/node-api/factory/src/lib.rs b/core-primitives/node-api/factory/src/lib.rs index 3c15d66aec..fb37dc6ec2 100644 --- a/core-primitives/node-api/factory/src/lib.rs +++ b/core-primitives/node-api/factory/src/lib.rs @@ -27,6 +27,8 @@ pub trait CreateNodeApi { /// Node API factory error. #[derive(Debug, thiserror::Error)] pub enum NodeApiFactoryError { + #[error("Could not connect to node with rpc client: {0}")] + FailedToCreateRpcClient(#[from] itp_api_client_types::RpcClientError), #[error("Failed to create a node API: {0}")] FailedToCreateNodeApi(#[from] itp_api_client_types::ApiClientError), #[error(transparent)] @@ -49,8 +51,11 @@ impl NodeApiFactory { impl CreateNodeApi for NodeApiFactory { fn create_api(&self) -> Result { - ParentchainApi::new(WsRpcClient::new(self.node_url.as_str())) - .map_err(NodeApiFactoryError::FailedToCreateNodeApi) - .map(|a| a.set_signer(self.signer.clone())) + let rpc_client = WsRpcClient::new(self.node_url.as_str()) + .map_err(NodeApiFactoryError::FailedToCreateRpcClient)?; + let mut api = + ParentchainApi::new(rpc_client).map_err(NodeApiFactoryError::FailedToCreateNodeApi)?; + api.set_signer(self.signer.clone()); + Ok(api) } } diff --git a/core-primitives/node-api/metadata/Cargo.toml b/core-primitives/node-api/metadata/Cargo.toml index a971b03497..3d6dd1874e 100644 --- a/core-primitives/node-api/metadata/Cargo.toml +++ b/core-primitives/node-api/metadata/Cargo.toml @@ -13,7 +13,7 @@ derive_more = { version = "0.99.5" } sp-core = { git = "https://github.com/paritytech/substrate.git", default-features = false, branch = "polkadot-v0.9.39" } # scs -substrate-api-client = { default-features = false, git = "https://github.com/scs/substrate-api-client.git", branch = "polkadot-v0.9.39-tag-v0.7.0" } +substrate-api-client = { default-features = false, git = "https://github.com/scs/substrate-api-client.git", branch = "polkadot-v0.9.39-tag-v0.9.0" } [features] default = ["std"] diff --git a/core-primitives/node-api/metadata/src/lib.rs b/core-primitives/node-api/metadata/src/lib.rs index 396c06a30a..98470e62e3 100644 --- a/core-primitives/node-api/metadata/src/lib.rs +++ b/core-primitives/node-api/metadata/src/lib.rs @@ -98,6 +98,7 @@ impl NodeMetadata { None => Err(Error::MetadataNotSet), Some(m) => m .storage_value_key(storage_prefix, storage_key_name) + .map(|key| key.into()) .map_err(Error::NodeMetadata), } } @@ -112,6 +113,7 @@ impl NodeMetadata { None => Err(Error::MetadataNotSet), Some(m) => m .storage_map_key::(storage_prefix, storage_key_name, map_key) + .map(|key| key.into()) .map_err(Error::NodeMetadata), } } @@ -127,6 +129,7 @@ impl NodeMetadata { None => Err(Error::MetadataNotSet), Some(m) => m .storage_double_map_key(storage_prefix, storage_key_name, first, second) + .map(|key| key.into()) .map_err(Error::NodeMetadata), } } diff --git a/core-primitives/stf-executor/Cargo.toml b/core-primitives/stf-executor/Cargo.toml index 3837369960..0459301d11 100644 --- a/core-primitives/stf-executor/Cargo.toml +++ b/core-primitives/stf-executor/Cargo.toml @@ -26,7 +26,7 @@ itp-top-pool-author = { path = "../top-pool-author", default-features = false } itp-types = { path = "../types", default-features = false } # scs -substrate-api-client = { default-features = false, git = "https://github.com/scs/substrate-api-client.git", branch = "polkadot-v0.9.39-tag-v0.7.0" } +substrate-api-client = { default-features = false, git = "https://github.com/scs/substrate-api-client.git", branch = "polkadot-v0.9.39-tag-v0.9.0" } # sgx enabled external libraries thiserror_sgx = { optional = true, package = "thiserror", git = "https://github.com/mesalock-linux/thiserror-sgx", tag = "sgx_1.1.3" } diff --git a/core-primitives/types/Cargo.toml b/core-primitives/types/Cargo.toml index 0829be85c8..63ff06ea7c 100644 --- a/core-primitives/types/Cargo.toml +++ b/core-primitives/types/Cargo.toml @@ -24,11 +24,15 @@ sp-core = { default-features = false, features = ["full_crypto"], git = "https:/ sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.39" } sp-std = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.39" } +# integritee-node +my-node-runtime = { package = "integritee-node-runtime", optional = true, git = "https://github.com/integritee-network/integritee-node.git", branch = "polkadot-v0.9.39" } + [features] default = ["std"] std = [ "codec/std", "chrono/std", + "my-node-runtime", "serde/std", "serde_json/std", "primitive-types/std", diff --git a/core-primitives/types/src/lib.rs b/core-primitives/types/src/lib.rs index 14b50b726e..fa1d22f5a7 100644 --- a/core-primitives/types/src/lib.rs +++ b/core-primitives/types/src/lib.rs @@ -24,6 +24,7 @@ use codec::{Decode, Encode}; use sgx_tstd as std; use sp_std::vec::Vec; +pub mod parentchain; pub mod storage; /// Substrate runtimes provide no string type. Hence, for arbitrary data of varying length the diff --git a/core-primitives/types/src/parentchain.rs b/core-primitives/types/src/parentchain.rs new file mode 100644 index 0000000000..c8d57df86c --- /dev/null +++ b/core-primitives/types/src/parentchain.rs @@ -0,0 +1,42 @@ +/* + Copyright 2021 Integritee AG and Supercomputing Systems AG + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +*/ + +//! Parentchain specific params. Be sure to change them if your node uses different types. + +use sp_runtime::{generic::Header as HeaderG, traits::BlakeTwo256, MultiAddress, MultiSignature}; +use sp_std::vec::Vec; + +pub type StorageProof = Vec>; + +// Basic Types. +pub type Index = u32; +pub type Balance = u128; +pub type Hash = sp_core::H256; + +// Account Types. +pub type AccountId = sp_core::crypto::AccountId32; +pub type AccountData = pallet_balances::AccountData; +pub type AccountInfo = frame_system::AccountInfo; +pub type Address = MultiAddress; + +// Block Types +pub type BlockNumber = u32; +pub type Header = HeaderG; +pub type BlockHash = sp_core::H256; + +/// Alias to 512-bit hash when used in the context of a transaction signature on the chain. +pub type Signature = MultiSignature; diff --git a/core/parentchain/indirect-calls-executor/Cargo.toml b/core/parentchain/indirect-calls-executor/Cargo.toml index 16f4642f84..e27228660b 100644 --- a/core/parentchain/indirect-calls-executor/Cargo.toml +++ b/core/parentchain/indirect-calls-executor/Cargo.toml @@ -38,7 +38,7 @@ sp-core = { default-features = false, features = ["full_crypto"], git = "https:/ sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.39" } # scs/integritee -substrate-api-client = { git = "https://github.com/scs/substrate-api-client.git", branch = "polkadot-v0.9.39-tag-v0.7.0", default-features = false } +substrate-api-client = { git = "https://github.com/scs/substrate-api-client.git", branch = "polkadot-v0.9.39-tag-v0.9.0", default-features = false } [dev-dependencies] env_logger = "0.9.0" diff --git a/core/parentchain/test/src/parentchain_block_builder.rs b/core/parentchain/test/src/parentchain_block_builder.rs index 9d1c12c49e..bdb0995a92 100644 --- a/core/parentchain/test/src/parentchain_block_builder.rs +++ b/core/parentchain/test/src/parentchain_block_builder.rs @@ -22,15 +22,18 @@ extern crate alloc; use crate::parentchain_header_builder::ParentchainHeaderBuilder; use alloc::vec::Vec; -use itp_types::{Block, Header, SignedBlock}; -use sp_runtime::OpaqueExtrinsic; +use itp_types::parentchain::Header; +use sp_runtime::{ + generic::{Block, SignedBlock}, + traits::MaybeSerialize, +}; -pub struct ParentchainBlockBuilder { +pub struct ParentchainBlockBuilder { header: Header, - extrinsics: Vec, + extrinsics: Vec, } -impl Default for ParentchainBlockBuilder { +impl Default for ParentchainBlockBuilder { fn default() -> Self { ParentchainBlockBuilder { header: ParentchainHeaderBuilder::default().build(), @@ -39,22 +42,22 @@ impl Default for ParentchainBlockBuilder { } } -impl ParentchainBlockBuilder { +impl ParentchainBlockBuilder { pub fn with_header(mut self, header: Header) -> Self { self.header = header; self } - pub fn with_extrinsics(mut self, extrinsics: Vec) -> Self { + pub fn with_extrinsics(mut self, extrinsics: Vec) -> Self { self.extrinsics = extrinsics; self } - pub fn build(self) -> Block { + pub fn build(self) -> Block { Block { header: self.header, extrinsics: self.extrinsics } } - pub fn build_signed(self) -> SignedBlock { + pub fn build_signed(self) -> SignedBlock> { SignedBlock { block: self.build(), justifications: None } } } diff --git a/core/rpc-client/Cargo.toml b/core/rpc-client/Cargo.toml index 27db112f83..4dd93ef238 100644 --- a/core/rpc-client/Cargo.toml +++ b/core/rpc-client/Cargo.toml @@ -13,11 +13,15 @@ parking_lot = "0.12.1" serde_derive = "1.0" serde_json = "1.0" sgx_crypto_helper = { branch = "master", git = "https://github.com/apache/teaclave-sgx-sdk.git" } -substrate-api-client = { git = "https://github.com/scs/substrate-api-client.git", branch = "polkadot-v0.9.39-tag-v0.7.0" } +substrate-api-client = { git = "https://github.com/scs/substrate-api-client.git", branch = "polkadot-v0.9.39-tag-v0.9.0" } thiserror = { version = "1.0" } url = { version = "2.0.0" } ws = { version = "0.9.1", features = ["ssl"] } +# parity +frame-metadata = { git = "https://github.com/paritytech/frame-metadata", features = ["v14"] } + + # local itp-rpc = { path = "../../core-primitives/rpc" } itp-types = { path = "../../core-primitives/types" } diff --git a/core/rpc-client/src/direct_client.rs b/core/rpc-client/src/direct_client.rs index 1a761de286..281e592f5c 100644 --- a/core/rpc-client/src/direct_client.rs +++ b/core/rpc-client/src/direct_client.rs @@ -19,6 +19,7 @@ use crate::ws_client::{WsClient, WsClientControl}; use codec::Decode; +use frame_metadata::RuntimeMetadataPrefixed; use itp_rpc::{RpcRequest, RpcResponse, RpcReturnValue}; use itp_types::DirectRequestStatus; use itp_utils::FromHexPrefixed; @@ -32,7 +33,7 @@ use std::{ thread, thread::JoinHandle, }; -use substrate_api_client::RuntimeMetadataPrefixed; +use substrate_api_client::metadata::Metadata; pub use crate::error::{Error, Result}; @@ -49,7 +50,7 @@ pub trait DirectApi { fn get_rsa_pubkey(&self) -> Result; fn get_mu_ra_url(&self) -> Result; fn get_untrusted_worker_url(&self) -> Result; - fn get_state_metadata(&self) -> Result; + fn get_state_metadata(&self) -> Result; fn send(&self, request: &str) -> Result<()>; /// Close any open websocket connection. @@ -136,7 +137,7 @@ impl DirectApi for DirectClient { Ok(untrusted_url) } - fn get_state_metadata(&self) -> Result { + fn get_state_metadata(&self) -> Result { let jsonrpc_call: String = RpcRequest::compose_jsonrpc_call("state_getMetadata".to_string(), Default::default())?; @@ -150,9 +151,8 @@ impl DirectApi for DirectClient { // Decode Metadata. let metadata = RuntimeMetadataPrefixed::decode(&mut rpc_return_value.value.as_slice())?; - println!("[+] Got metadata of enclave runtime"); - Ok(metadata) + Metadata::try_from(metadata).map_err(|e| e.into()) } fn send(&self, request: &str) -> Result<()> { diff --git a/core/rpc-client/src/error.rs b/core/rpc-client/src/error.rs index 5fc5a298da..5f4d0d5d1d 100644 --- a/core/rpc-client/src/error.rs +++ b/core/rpc-client/src/error.rs @@ -17,6 +17,7 @@ use codec::Error as CodecError; use serde_json::Error as JsonError; use std::{boxed::Box, sync::mpsc::RecvError}; +use substrate_api_client::metadata::InvalidMetadataError; use thiserror; use ws::Error as WsClientError; @@ -34,6 +35,14 @@ pub enum Error { WsClientError(#[from] WsClientError), #[error("Faulty channel: {0}")] MspcReceiver(#[from] RecvError), + #[error("InvalidMetadata: {0:?}")] + InvalidMetadata(InvalidMetadataError), #[error("Custom Error: {0}")] Custom(Box), } + +impl From for Error { + fn from(error: InvalidMetadataError) -> Self { + Error::InvalidMetadata(error) + } +} diff --git a/core/rpc-client/src/mock.rs b/core/rpc-client/src/mock.rs index dde7177f29..12ba0bffeb 100644 --- a/core/rpc-client/src/mock.rs +++ b/core/rpc-client/src/mock.rs @@ -22,9 +22,10 @@ use crate::{ error::Result, }; use codec::Decode; +use frame_metadata::RuntimeMetadataPrefixed; use sgx_crypto_helper::rsa3072::Rsa3072PubKey; use std::{sync::mpsc::Sender as MpscSender, thread::JoinHandle}; -use substrate_api_client::{FromHexString, RuntimeMetadataPrefixed}; +use substrate_api_client::{FromHexString, Metadata}; #[derive(Clone, Default)] pub struct DirectClientMock { @@ -86,13 +87,14 @@ impl DirectApi for DirectClientMock { Ok(self.untrusted_worker_url.clone()) } - fn get_state_metadata(&self) -> Result { - let metadata = match Vec::from_hex(self.metadata.clone()) { + fn get_state_metadata(&self) -> Result { + let metadata_bytes = match Vec::from_hex(self.metadata.clone()) { Ok(m) => m, Err(e) => return Err(Error::Custom(format!("Decode metadata FromHexError: {:?}", e).into())), }; - RuntimeMetadataPrefixed::decode(&mut metadata.as_slice()).map_err(|e| e.into()) + let metadata = RuntimeMetadataPrefixed::decode(&mut metadata_bytes.as_slice())?; + Metadata::try_from(metadata).map_err(|e| e.into()) } fn send(&self, _request: &str) -> Result<()> { diff --git a/enclave-runtime/Cargo.lock b/enclave-runtime/Cargo.lock index 21da067ef1..e19aae974f 100644 --- a/enclave-runtime/Cargo.lock +++ b/enclave-runtime/Cargo.lock @@ -14,8 +14,8 @@ dependencies = [ [[package]] name = "ac-compose-macros" -version = "0.2.0" -source = "git+https://github.com/scs/substrate-api-client.git?branch=polkadot-v0.9.39-tag-v0.7.0#84af198434ea210eb0cd90cb8239748c376a079a" +version = "0.2.2" +source = "git+https://github.com/scs/substrate-api-client.git?branch=polkadot-v0.9.39-tag-v0.9.0#c952d689bfd6469432f92b10ca351876bd5ac51a" dependencies = [ "ac-primitives", "log", @@ -23,21 +23,18 @@ dependencies = [ "sp-application-crypto", "sp-core", "sp-runtime", - "sp-std", ] [[package]] name = "ac-node-api" -version = "0.2.0" -source = "git+https://github.com/scs/substrate-api-client.git?branch=polkadot-v0.9.39-tag-v0.7.0#84af198434ea210eb0cd90cb8239748c376a079a" +version = "0.2.2" +source = "git+https://github.com/scs/substrate-api-client.git?branch=polkadot-v0.9.39-tag-v0.9.0#c952d689bfd6469432f92b10ca351876bd5ac51a" dependencies = [ "ac-primitives", "bitvec", "derive_more", "either", - "frame-metadata 15.0.0 (git+https://github.com/integritee-network/frame-metadata)", - "frame-support", - "frame-system", + "frame-metadata 15.0.0 (git+https://github.com/paritytech/frame-metadata)", "hex", "log", "parity-scale-codec", @@ -48,19 +45,24 @@ dependencies = [ "sp-core", "sp-runtime", "sp-runtime-interface", - "sp-std", ] [[package]] name = "ac-primitives" -version = "0.2.0" -source = "git+https://github.com/scs/substrate-api-client.git?branch=polkadot-v0.9.39-tag-v0.7.0#84af198434ea210eb0cd90cb8239748c376a079a" +version = "0.4.0" +source = "git+https://github.com/scs/substrate-api-client.git?branch=polkadot-v0.9.39-tag-v0.9.0#c952d689bfd6469432f92b10ca351876bd5ac51a" dependencies = [ "hex", + "impl-serde", "parity-scale-codec", + "primitive-types", + "scale-info", + "serde 1.0.158", + "serde_json 1.0.94", "sp-core", "sp-runtime", - "sp-std", + "sp-staking", + "sp-version", ] [[package]] @@ -976,7 +978,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "15.0.0" -source = "git+https://github.com/integritee-network/frame-metadata#3b43da9821238681f9431276d55b92a079142083" +source = "git+https://github.com/paritytech/frame-metadata#040a53c63af277e280282028b73b992eac9c35a2" dependencies = [ "cfg-if 1.0.0", "parity-scale-codec", @@ -1796,6 +1798,7 @@ checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" name = "itp-api-client-types" version = "0.9.0" dependencies = [ + "itp-types", "sp-core", "sp-runtime", "substrate-api-client", @@ -4349,21 +4352,22 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "substrate-api-client" -version = "0.7.0" -source = "git+https://github.com/scs/substrate-api-client.git?branch=polkadot-v0.9.39-tag-v0.7.0#84af198434ea210eb0cd90cb8239748c376a079a" +version = "0.9.0" +source = "git+https://github.com/scs/substrate-api-client.git?branch=polkadot-v0.9.39-tag-v0.9.0#c952d689bfd6469432f92b10ca351876bd5ac51a" dependencies = [ "ac-compose-macros", "ac-node-api", "ac-primitives", - "frame-metadata 15.0.0 (git+https://github.com/integritee-network/frame-metadata)", - "frame-support", + "frame-metadata 15.0.0 (git+https://github.com/paritytech/frame-metadata)", "hex", "log", "parity-scale-codec", + "serde 1.0.158", + "serde_json 1.0.94", "sp-core", "sp-runtime", "sp-runtime-interface", - "sp-std", + "thiserror-core", ] [[package]] @@ -4456,6 +4460,26 @@ dependencies = [ "thiserror-impl 1.0.40", ] +[[package]] +name = "thiserror-core" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d97345f6437bb2004cd58819d8a9ef8e36cdd7661c2abc4bbde0a7c40d9f497" +dependencies = [ + "thiserror-core-impl", +] + +[[package]] +name = "thiserror-core-impl" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10ac1c5050e43014d16b2f94d0d2ce79e65ffdd8b38d8048f9c8f6a8a6da62ac" +dependencies = [ + "proc-macro2", + "quote 1.0.26", + "syn 1.0.109", +] + [[package]] name = "thiserror-impl" version = "1.0.9" diff --git a/enclave-runtime/Cargo.toml b/enclave-runtime/Cargo.toml index c41ca899df..908b6bd7b4 100644 --- a/enclave-runtime/Cargo.toml +++ b/enclave-runtime/Cargo.toml @@ -69,7 +69,7 @@ primitive-types = { version = "0.12.1", default-features = false, features = ["c # scs / integritee jsonrpc-core = { default-features = false, git = "https://github.com/scs/jsonrpc", branch = "no_std_v18" } -substrate-api-client = { default-features = false, git = "https://github.com/scs/substrate-api-client.git", branch = "polkadot-v0.9.39-tag-v0.7.0" } +substrate-api-client = { default-features = false, git = "https://github.com/scs/substrate-api-client.git", branch = "polkadot-v0.9.39-tag-v0.9.0" } # mesalock env_logger = { git = "https://github.com/integritee-network/env_logger-sgx" } diff --git a/service/Cargo.toml b/service/Cargo.toml index 96b1739556..9fea393138 100644 --- a/service/Cargo.toml +++ b/service/Cargo.toml @@ -60,7 +60,7 @@ its-storage = { path = "../sidechain/storage" } my-node-runtime = { package = "integritee-node-runtime", git = "https://github.com/integritee-network/integritee-node.git", branch = "polkadot-v0.9.39" } sgx-verify = { git = "https://github.com/integritee-network/pallets.git", branch = "polkadot-v0.9.39" } -substrate-api-client = { git = "https://github.com/scs/substrate-api-client.git", branch = "polkadot-v0.9.39-tag-v0.7.0" } +substrate-api-client = { git = "https://github.com/scs/substrate-api-client.git", branch = "polkadot-v0.9.39-tag-v0.9.0" } teerex-primitives = { git = "https://github.com/integritee-network/pallets.git", branch = "polkadot-v0.9.39" } # Substrate dependencies diff --git a/service/src/account_funding.rs b/service/src/account_funding.rs index 586c4f1ff1..d1aae3f93a 100644 --- a/service/src/account_funding.rs +++ b/service/src/account_funding.rs @@ -21,13 +21,16 @@ use itp_node_api::api_client::{AccountApi, ParentchainApi}; use itp_settings::worker::{ EXISTENTIAL_DEPOSIT_FACTOR_FOR_INIT_FUNDS, REGISTERING_FEE_FACTOR_FOR_INIT_FUNDS, }; +use itp_types::parentchain::Balance; use log::*; use sp_core::{ crypto::{AccountId32, Ss58Codec}, Pair, }; use sp_keyring::AccountKeyring; -use substrate_api_client::{Balance, GenericAddress, XtStatus}; +use substrate_api_client::{ + GenericAddress, GetBalance, GetTransactionPayment, SubmitAndWatch, XtStatus, +}; /// Information about the enclave on-chain account. pub trait EnclaveAccountInfo { @@ -54,7 +57,7 @@ impl EnclaveAccountInfoProvider { pub fn setup_account_funding( api: &ParentchainApi, accountid: &AccountId32, - extrinsic_prefix: &str, + encoded_extrinsic: Vec, is_development_mode: bool, ) -> ServiceResult<()> { // Account funds @@ -63,7 +66,7 @@ pub fn setup_account_funding( ensure_account_has_funds(api, accountid)?; } else { // Production mode, there is no faucet. - let registration_fees = enclave_registration_fees(api, extrinsic_prefix)?; + let registration_fees = enclave_registration_fees(api, encoded_extrinsic)?; info!("Registration fees = {:?}", registration_fees); let free_balance = api.get_free_balance(accountid)?; info!("TEE's free balance = {:?}", free_balance); @@ -107,8 +110,11 @@ fn ensure_account_has_funds(api: &ParentchainApi, accountid: &AccountId32) -> Re Ok(()) } -fn enclave_registration_fees(api: &ParentchainApi, xthex_prefixed: &str) -> Result { - let reg_fee_details = api.get_fee_details(xthex_prefixed, None)?; +fn enclave_registration_fees( + api: &ParentchainApi, + encoded_extrinsic: Vec, +) -> Result { + let reg_fee_details = api.get_fee_details(encoded_extrinsic, None)?; match reg_fee_details { Some(details) => match details.inclusion_fee { Some(fee) => Ok(fee.inclusion_fee()), @@ -146,13 +152,17 @@ fn bootstrap_funds_from_alice( } let mut alice_signer_api = api.clone(); - alice_signer_api.signer = Some(alice); + alice_signer_api.set_signer(alice); println!("[+] bootstrap funding Enclave from Alice's funds"); let xt = alice_signer_api.balance_transfer(GenericAddress::Id(accountid.clone()), funding_amount); - let xt_hash = alice_signer_api.send_extrinsic(xt.hex_encode(), XtStatus::InBlock)?; - info!("[<] Extrinsic got included in a block. Hash: {:?}\n", xt_hash); + let xt_report = + alice_signer_api.submit_and_watch_extrinsic_until(xt.encode(), XtStatus::InBlock)?; + info!( + "[<] Extrinsic got included in a block. Extrinsic Hash: {:?}\n", + xt_report.extrinsic_hash + ); // Verify funds have arrived. let free_balance = alice_signer_api.get_free_balance(accountid); diff --git a/service/src/error.rs b/service/src/error.rs index 8dea96c1d1..8703b243eb 100644 --- a/service/src/error.rs +++ b/service/src/error.rs @@ -15,8 +15,8 @@ */ use codec::Error as CodecError; +use itp_node_api::api_client::ApiClientError; use itp_types::ShardIdentifier; -use substrate_api_client::ApiClientError; pub type ServiceResult = Result; @@ -25,9 +25,9 @@ pub enum Error { #[error("{0}")] Codec(#[from] CodecError), #[error("{0}")] - ApiClient(#[from] ApiClientError), - #[error("Node API terminated subscription unexpectedly: {0}")] - ApiSubscriptionDisconnected(#[from] std::sync::mpsc::RecvError), + ApiClient(ApiClientError), + #[error("Node API terminated subscription unexpectedly")] + ApiSubscriptionDisconnected, #[error("Enclave API error: {0}")] EnclaveApi(#[from] itp_enclave_api::error::Error), #[error("Trusted Rpc Client error: {0}")] @@ -53,3 +53,9 @@ pub enum Error { #[error("{0}")] Custom(Box), } + +impl From for Error { + fn from(error: ApiClientError) -> Self { + Error::ApiClient(error) + } +} diff --git a/service/src/main.rs b/service/src/main.rs index b767071a3f..70b0104951 100644 --- a/service/src/main.rs +++ b/service/src/main.rs @@ -66,7 +66,6 @@ use itp_settings::{ files::SIDECHAIN_STORAGE_PATH, worker_mode::{ProvideWorkerMode, WorkerMode, WorkerModeProvider}, }; -use itp_utils::hex::hex_encode; use its_peer_fetch::{ block_fetch_client::BlockFetcher, untrusted_peer_fetch::UntrustedPeerFetcher, }; @@ -75,23 +74,18 @@ use its_storage::{interface::FetchBlocks, BlockPruner, SidechainStorageLock}; use log::*; use my_node_runtime::{Hash, Header, RuntimeEvent}; use sgx_types::*; +use substrate_api_client::{ + primitives::StorageChangeSet, rpc::HandleSubscription, GetHeader, SubmitAndWatch, + SubscribeChain, SubscribeFrameSystem, XtStatus, +}; #[cfg(feature = "dcap")] use sgx_verify::extract_tcb_info_from_raw_dcap_quote; use sp_core::crypto::{AccountId32, Ss58Codec}; use sp_keyring::AccountKeyring; -use std::{ - path::PathBuf, - str, - sync::{ - mpsc::{channel, Sender}, - Arc, - }, - thread, - time::Duration, -}; -use substrate_api_client::{utils::FromHexString, Header as HeaderTrait, XtStatus}; +use sp_runtime::traits::Header as HeaderTrait; +use std::{path::PathBuf, str, sync::Arc, thread, time::Duration}; use teerex_primitives::ShardIdentifier; mod account_funding; @@ -421,9 +415,9 @@ fn start_worker( .set_nonce(nonce) .expect("Could not set nonce of enclave. Returning here..."); - let metadata = node_api.metadata.clone(); - let runtime_spec_version = node_api.runtime_version.spec_version; - let runtime_transaction_version = node_api.runtime_version.transaction_version; + let metadata = node_api.metadata().clone(); + let runtime_spec_version = node_api.runtime_version().spec_version; + let runtime_transaction_version = node_api.runtime_version().transaction_version; enclave .set_node_metadata( NodeMetadata::new(metadata, runtime_spec_version, runtime_transaction_version).encode(), @@ -459,14 +453,14 @@ fn start_worker( println!("[!] creating remote attestation report and create enclave register extrinsic."); }; #[cfg(not(feature = "dcap"))] - let uxt = enclave.generate_ias_ra_extrinsic(&trusted_url, skip_ra).unwrap(); + let xt = enclave.generate_ias_ra_extrinsic(&trusted_url, skip_ra).unwrap(); #[cfg(feature = "dcap")] - let uxt = enclave.generate_dcap_ra_extrinsic(&trusted_url, skip_ra).unwrap(); - let register_enclave_xt_hash = - send_extrinsic(&uxt, &node_api, &tee_accountid, is_development_mode); + let xt = enclave.generate_dcap_ra_extrinsic(&trusted_url, skip_ra).unwrap(); + let register_enclave_block_hash = + send_extrinsic(xt, &node_api, &tee_accountid, is_development_mode); let register_enclave_xt_header = - node_api.get_header(register_enclave_xt_hash).unwrap().unwrap(); + node_api.get_header(register_enclave_block_hash).unwrap().unwrap(); let we_are_primary_validateer = we_are_primary_validateer(&node_api, ®ister_enclave_xt_header).unwrap(); @@ -533,23 +527,14 @@ fn start_worker( } // ------------------------------------------------------------------------ - // subscribe to events and react on firing + // Subscribe to events and print them. println!("*** Subscribing to events"); - let (sender, receiver) = channel(); - let sender2 = sender.clone(); - let _eventsubscriber = thread::Builder::new() - .name("eventsubscriber".to_owned()) - .spawn(move || { - node_api.subscribe_events(sender2).unwrap(); - }) - .unwrap(); - + let mut subscription = node_api.subscribe_system_events().unwrap(); println!("[+] Subscribed to events. waiting..."); - let timeout = Duration::from_millis(10); loop { - if let Ok(msg) = receiver.recv_timeout(timeout) { - if let Ok(events) = parse_events(msg.clone()) { - print_events(events, sender.clone()) + if let Some(Ok(storage_change_set)) = subscription.next() { + if let Ok(events) = parse_events(storage_change_set) { + print_events(events) } } } @@ -585,13 +570,16 @@ fn spawn_worker_for_shard_polling( type Events = Vec>; -fn parse_events(event: String) -> Result { - let _unhex = Vec::from_hex(event).map_err(|_| "Decoding Events Failed".to_string())?; - let mut _er_enc = _unhex.as_slice(); - Events::decode(&mut _er_enc).map_err(|_| "Decoding Events Failed".to_string()) +fn parse_events(change_set: StorageChangeSet) -> Result { + let event_bytes = &change_set.changes[0] + .1 + .as_ref() + .ok_or_else(|| "Retrieving Events Failed".to_string())? + .0; + Events::decode(&mut event_bytes.as_slice()).map_err(|_| "Decoding Events Failed".to_string()) } -fn print_events(events: Events, _sender: Sender) { +fn print_events(events: Events) { for evr in &events { debug!("Decoded: phase = {:?}, event = {:?}", evr.phase, evr.event); match &evr.event { @@ -767,8 +755,8 @@ fn register_quotes_from_marblerun( for quote in quotes { match enclave.generate_dcap_ra_extrinsic_from_quote(url.clone(), "e) { - Ok(xts) => { - send_extrinsic(&xts, api, accountid, is_development_mode); + Ok(xt) => { + send_extrinsic(xt, api, accountid, is_development_mode); }, Err(e) => { error!("Extracting information from quote failed: {}", e) @@ -787,31 +775,33 @@ fn register_collateral( let dcap_quote = enclave.generate_dcap_ra_quote(skip_ra).unwrap(); let (fmspc, _tcb_info) = extract_tcb_info_from_raw_dcap_quote(&dcap_quote).unwrap(); - let uxt = enclave.generate_register_quoting_enclave_extrinsic(fmspc).unwrap(); - send_extrinsic(&uxt, api, accountid, is_development_mode); + let xt = enclave.generate_register_quoting_enclave_extrinsic(fmspc).unwrap(); + send_extrinsic(xt, api, accountid, is_development_mode); - let uxt = enclave.generate_register_tcb_info_extrinsic(fmspc).unwrap(); - send_extrinsic(&uxt, api, accountid, is_development_mode); + let xt = enclave.generate_register_tcb_info_extrinsic(fmspc).unwrap(); + send_extrinsic(xt, api, accountid, is_development_mode); } fn send_extrinsic( - extrinsic: &[u8], + extrinsic: Vec, api: &ParentchainApi, accountid: &AccountId32, is_development_mode: bool, ) -> Option { - let xthex = hex_encode(extrinsic); // Account funds - if let Err(x) = setup_account_funding(api, accountid, &xthex, is_development_mode) { + if let Err(x) = setup_account_funding(api, accountid, extrinsic.clone(), is_development_mode) { error!("Starting worker failed: {:?}", x); // Return without registering the enclave. This will fail and the transaction will be banned for 30min. return None } println!("[>] Register the TCB info (send the extrinsic)"); - let register_qe_xt_hash = api.send_extrinsic(xthex, XtStatus::Finalized).unwrap(); - println!("[<] Extrinsic got finalized. Hash: {:?}\n", register_qe_xt_hash); - register_qe_xt_hash + let register_qe_block_hash = api + .submit_and_watch_extrinsic_until(extrinsic, XtStatus::Finalized) + .unwrap() + .block_hash; + println!("[<] Extrinsic got finalized. Block hash: {:?}\n", register_qe_block_hash); + register_qe_block_hash } /// Subscribe to the node API finalized heads stream and trigger a parent chain sync @@ -820,19 +810,18 @@ fn subscribe_to_parentchain_new_headers( parentchain_handler: Arc>, mut last_synced_header: Header, ) -> Result<(), Error> { - let (sender, receiver) = channel(); - //TODO: this should be implemented by parentchain_handler directly, and not via - // exposed parentchain_api. Blocked by https://github.com/scs/substrate-api-client/issues/267. - parentchain_handler + // TODO: this should be implemented by parentchain_handler directly, and not via + // exposed parentchain_api + let mut subscription = parentchain_handler .parentchain_api() - .subscribe_finalized_heads(sender) + .subscribe_finalized_heads() .map_err(Error::ApiClient)?; loop { - let new_header: Header = match receiver.recv() { - Ok(header_str) => serde_json::from_str(&header_str).map_err(Error::Serialization), - Err(e) => Err(Error::ApiSubscriptionDisconnected(e)), - }?; + let new_header = subscription + .next() + .ok_or(Error::ApiSubscriptionDisconnected)? + .map_err(|e| Error::ApiClient(e.into()))?; println!( "[+] Received finalized header update ({}), syncing parent chain...", diff --git a/service/src/ocall_bridge/worker_on_chain_ocall.rs b/service/src/ocall_bridge/worker_on_chain_ocall.rs index 102e91cc38..7ea5c949fa 100644 --- a/service/src/ocall_bridge/worker_on_chain_ocall.rs +++ b/service/src/ocall_bridge/worker_on_chain_ocall.rs @@ -20,12 +20,10 @@ use crate::ocall_bridge::bridge_api::{OCallBridgeError, OCallBridgeResult, Worke use codec::{Decode, Encode}; use itp_node_api::node_api_factory::CreateNodeApi; use itp_types::{WorkerRequest, WorkerResponse}; -use itp_utils::ToHexPrefixed; use log::*; -use sp_core::storage::StorageKey; use sp_runtime::OpaqueExtrinsic; use std::{sync::Arc, vec::Vec}; -use substrate_api_client::XtStatus; +use substrate_api_client::{GetStorage, StorageKey, SubmitExtrinsic}; pub struct WorkerOnChainOCall { node_api_factory: Arc, @@ -89,7 +87,7 @@ where debug!("Enclave wants to send {} extrinsics", extrinsics.len()); let api = self.node_api_factory.create_api()?; for call in extrinsics.into_iter() { - if let Err(e) = api.send_extrinsic(call.to_hex(), XtStatus::Ready) { + if let Err(e) = api.submit_extrinsic(call.encode()) { error!("Could not send extrsinic to node: {:?}", e); } } diff --git a/service/src/parentchain_handler.rs b/service/src/parentchain_handler.rs index 2ddabea56b..3a64aaaf0b 100644 --- a/service/src/parentchain_handler.rs +++ b/service/src/parentchain_handler.rs @@ -23,7 +23,6 @@ use itc_parentchain::{ }; use itp_enclave_api::{enclave_base::EnclaveBase, sidechain::Sidechain}; use itp_node_api::api_client::ChainApi; -use itp_types::SignedBlock; use log::*; use my_node_runtime::Header; use sp_finality_grandpa::VersionedAuthorityList; @@ -79,9 +78,8 @@ where enclave_api: Arc, ) -> ServiceResult { let genesis_hash = parentchain_api.get_genesis_hash()?; - let genesis_header: Header = parentchain_api - .get_header(Some(genesis_hash))? - .ok_or(Error::MissingGenesisHeader)?; + let genesis_header = + parentchain_api.header(Some(genesis_hash))?.ok_or(Error::MissingGenesisHeader)?; let parentchain_init_params: ParentchainInitParams = if parentchain_api .is_grandpa_available()? @@ -125,7 +123,7 @@ where fn sync_parentchain(&self, last_synced_header: Header) -> ServiceResult
{ trace!("Getting current head"); - let curr_block: SignedBlock = self + let curr_block = self .parentchain_api .last_finalized_block()? .ok_or(Error::MissingLastFinalizedBlock)?; diff --git a/service/src/teeracle/mod.rs b/service/src/teeracle/mod.rs index e39a247985..d47019f7c6 100644 --- a/service/src/teeracle/mod.rs +++ b/service/src/teeracle/mod.rs @@ -24,7 +24,7 @@ use itp_utils::hex::hex_encode; use log::*; use sp_runtime::OpaqueExtrinsic; use std::time::Duration; -use substrate_api_client::XtStatus; +use substrate_api_client::{SubmitAndWatch, XtStatus}; use teeracle_metrics::{increment_number_of_request_failures, set_extrinsics_inclusion_success}; use tokio::runtime::Handle; @@ -76,21 +76,22 @@ fn execute_weather_update( extrinsics.into_iter().for_each(|call| { let node_api_clone = node_api.clone(); tokio_handle.spawn(async move { - let hex_encoded_extrinsic = hex_encode(&call.encode()); - debug!("Hex encoded extrinsic to be sent: {}", hex_encoded_extrinsic); + let encoded_extrinsic = call.encode(); + debug!("Hex encoded extrinsic to be sent: {}", hex_encode(&encoded_extrinsic)); println!("[>] Update oracle (send the extrinsic)"); - let extrinsic_hash = - match node_api_clone.send_extrinsic(hex_encoded_extrinsic, XtStatus::InBlock) { - Err(e) => { - error!("Failed to send extrinsic: {:?}", e); - set_extrinsics_inclusion_success(false); - return - }, - Ok(hash) => { - set_extrinsics_inclusion_success(true); - hash - }, - }; + let extrinsic_hash = match node_api_clone + .submit_and_watch_extrinsic_until(encoded_extrinsic, XtStatus::InBlock) + { + Err(e) => { + error!("Failed to send extrinsic: {:?}", e); + set_extrinsics_inclusion_success(false); + return + }, + Ok(report) => { + set_extrinsics_inclusion_success(true); + report.extrinsic_hash + }, + }; println!("[<] Extrinsic got included into a block. Hash: {:?}\n", extrinsic_hash); }); }); @@ -123,22 +124,23 @@ fn execute_update_market( for call in extrinsics.into_iter() { let node_api_clone = node_api.clone(); tokio_handle.spawn(async move { - let hex_encoded_extrinsic = hex_encode(&call.encode()); - debug!("Hex encoded extrinsic to be sent: {}", hex_encoded_extrinsic); + let encoded_extrinsic = call.encode(); + debug!("Hex encoded extrinsic to be sent: {}", hex_encode(&encoded_extrinsic)); println!("[>] Update the exchange rate (send the extrinsic)"); - let extrinsic_hash = - match node_api_clone.send_extrinsic(hex_encoded_extrinsic, XtStatus::InBlock) { - Err(e) => { - error!("Failed to send extrinsic: {:?}", e); - set_extrinsics_inclusion_success(false); - return - }, - Ok(hash) => { - set_extrinsics_inclusion_success(true); - hash - }, - }; + let extrinsic_hash = match node_api_clone + .submit_and_watch_extrinsic_until(encoded_extrinsic, XtStatus::InBlock) + { + Err(e) => { + error!("Failed to send extrinsic: {:?}", e); + set_extrinsics_inclusion_success(false); + return + }, + Ok(report) => { + set_extrinsics_inclusion_success(true); + report.extrinsic_hash + }, + }; println!("[<] Extrinsic got included into a block. Hash: {:?}\n", extrinsic_hash); }); diff --git a/service/src/tests/mocks/parentchain_api_mock.rs b/service/src/tests/mocks/parentchain_api_mock.rs index 5f02df4f04..8971a95ebe 100644 --- a/service/src/tests/mocks/parentchain_api_mock.rs +++ b/service/src/tests/mocks/parentchain_api_mock.rs @@ -19,8 +19,8 @@ use itc_parentchain_test::{ parentchain_block_builder::ParentchainBlockBuilder, parentchain_header_builder::ParentchainHeaderBuilder, }; -use itp_node_api::api_client::{ApiResult, ChainApi, StorageProof}; -use itp_types::{Header, SignedBlock, H256}; +use itp_node_api::api_client::{ApiResult, ChainApi, SignedBlock}; +use itp_types::parentchain::{Hash, Header, StorageProof}; use sp_finality_grandpa::AuthorityList; pub struct ParentchainApiMock { @@ -49,15 +49,15 @@ impl ChainApi for ParentchainApiMock { Ok(self.parentchain.last().cloned()) } - fn signed_block(&self, _hash: Option) -> ApiResult> { + fn signed_block(&self, _hash: Option) -> ApiResult> { todo!() } - fn get_genesis_hash(&self) -> ApiResult { + fn get_genesis_hash(&self) -> ApiResult { todo!() } - fn get_header(&self, _header_hash: Option) -> ApiResult> { + fn header(&self, _header_hash: Option) -> ApiResult> { todo!() } @@ -77,11 +77,11 @@ impl ChainApi for ParentchainApiMock { todo!() } - fn grandpa_authorities(&self, _hash: Option) -> ApiResult { + fn grandpa_authorities(&self, _hash: Option) -> ApiResult { todo!() } - fn grandpa_authorities_proof(&self, _hash: Option) -> ApiResult { + fn grandpa_authorities_proof(&self, _hash: Option) -> ApiResult { todo!() } }