From ff22b32bc410e19fd8026bbad0c175c154278f3d Mon Sep 17 00:00:00 2001 From: Kasper Ziemianek Date: Mon, 22 Jan 2024 13:57:39 +0100 Subject: [PATCH] hardcode data provider config into prod enclave (#2291) * hardcode dataprovider configuration for prod build * docker enclave config * fix evm build * add missing config * read config from env for new properties * config for multiworker setup * remove running mode arg * use shielding key repo instead of shielding key * fix local env files --- tee-worker/.env.dev | 25 ++- tee-worker/Cargo.lock | 16 +- tee-worker/app-libs/stf/Cargo.toml | 3 - .../core-primitives/enclave-api/Cargo.toml | 1 - .../enclave-api/ffi/src/lib.rs | 13 -- .../core-primitives/enclave-api/src/lib.rs | 5 - .../enclave-api/src/stf_task_handler.rs | 49 ------ .../enclave-api/src/vc_issuance.rs | 49 ------ .../test/src/mock/shielding_crypto_mock.rs | 4 - tee-worker/docker/docker-compose.yml | 2 +- .../docker/multiworker-docker-compose.yml | 43 ++++- tee-worker/enclave-runtime/Cargo.lock | 11 +- tee-worker/enclave-runtime/Enclave.edl | 8 - .../src/initialization/global_components.rs | 4 + .../enclave-runtime/src/initialization/mod.rs | 91 ++++++++++- tee-worker/enclave-runtime/src/lib.rs | 1 - .../enclave-runtime/src/stf_task_handler.rs | 121 -------------- .../enclave-runtime/src/vc_issuance_task.rs | 130 ---------------- .../litentry/core/assertion-build/src/a14.rs | 15 +- .../litentry/core/assertion-build/src/a2.rs | 22 +-- .../litentry/core/assertion-build/src/a3.rs | 17 +- .../litentry/core/assertion-build/src/a6.rs | 12 +- .../litentry/core/assertion-build/src/a8.rs | 11 +- .../assertion-build/src/achainable/amount.rs | 29 ++-- .../src/achainable/amount_holding.rs | 20 +-- .../src/achainable/amount_token.rs | 26 ++-- .../assertion-build/src/achainable/amounts.rs | 9 +- .../assertion-build/src/achainable/basic.rs | 14 +- .../src/achainable/between_percents.rs | 4 +- .../src/achainable/class_of_year.rs | 5 +- .../assertion-build/src/achainable/date.rs | 9 +- .../src/achainable/date_interval.rs | 4 +- .../src/achainable/date_percent.rs | 4 +- .../assertion-build/src/achainable/mirror.rs | 10 +- .../assertion-build/src/achainable/mod.rs | 71 +++++---- .../assertion-build/src/achainable/token.rs | 9 +- .../src/brc20/amount_holder.rs | 9 +- .../src/generic_discord_role.rs | 71 +++++---- .../core/assertion-build/src/holding_time.rs | 39 +++-- .../amount_holding/evm_amount_holding.rs | 58 +++---- .../bnb_digit_domain_club_amount.rs | 8 +- .../bnb_domain/bnb_domain_holding_amount.rs | 8 +- .../src/nodereal/bnb_domain/mod.rs | 29 ++-- .../src/nodereal/crypto_summary/mod.rs | 8 +- .../nft_holder/weirdo_ghost_gang_holder.rs | 29 ++-- .../assertion-build/src/oneblock/course.rs | 9 +- .../core/assertion-build/src/oneblock/mod.rs | 16 +- .../core/assertion-build/src/vip3/card.rs | 9 +- .../core/assertion-build/src/vip3/mod.rs | 9 +- .../src/nodereal/crypto_summary/mod.rs | 13 +- .../litentry/core/data-providers/Cargo.toml | 3 +- .../core/data-providers/src/achainable.rs | 6 +- .../data-providers/src/discord_litentry.rs | 36 ++--- .../data-providers/src/discord_official.rs | 10 +- .../core/data-providers/src/geniidata.rs | 11 +- .../litentry/core/data-providers/src/lib.rs | 147 ++++++++++++------ .../data-providers/src/nodereal_jsonrpc.rs | 43 +++-- .../data-providers/src/twitter_official.rs | 53 +++---- .../core/identity-verification/src/lib.rs | 5 +- .../identity-verification/src/web2/mod.rs | 13 +- .../receiver/src/handler/assertion.rs | 146 +++++++++++------ .../src/handler/identity_verification.rs | 19 ++- .../core/stf-task/receiver/src/lib.rs | 44 ++++-- .../core/stf-task/receiver/src/test.rs | 6 +- .../lc-vc-task-receiver/Cargo.toml | 11 -- .../lc-vc-task-receiver/src/lib.rs | 26 ++-- .../lc-vc-task-receiver/src/vc_handling.rs | 147 ++++++++++++------ .../vc-issuance/lc-vc-task-sender/Cargo.toml | 9 -- .../vc-issuance/lc-vc-task-sender/src/lib.rs | 2 - tee-worker/local-setup/config/one-worker.json | 2 - .../local-setup/config/three-workers.json | 6 - .../local-setup/config/two-workers.json | 4 - .../local-setup/development-worker.json | 2 - tee-worker/scripts/launch_local_worker.sh | 3 - tee-worker/scripts/litentry/release/ReadMe.md | 5 +- tee-worker/service/Cargo.toml | 1 + tee-worker/service/src/cli.yml | 5 - tee-worker/service/src/config.rs | 13 -- tee-worker/service/src/main_impl.rs | 122 --------------- .../service/src/running-mode-config.json | 106 ------------- tee-worker/service/src/tests/commons.rs | 1 - .../ts-tests/worker/resuming_worker.test.ts | 1 - 82 files changed, 965 insertions(+), 1225 deletions(-) delete mode 100644 tee-worker/core-primitives/enclave-api/src/stf_task_handler.rs delete mode 100644 tee-worker/core-primitives/enclave-api/src/vc_issuance.rs delete mode 100644 tee-worker/service/src/running-mode-config.json diff --git a/tee-worker/.env.dev b/tee-worker/.env.dev index 6ffad948b4..65aa47f85d 100644 --- a/tee-worker/.env.dev +++ b/tee-worker/.env.dev @@ -11,4 +11,27 @@ TrustedWorkerPort=2000 UntrustedWorkerPort=2001 MuRaPort=3443 UntrustedHttpPort=4545 -NODE_ENV=local \ No newline at end of file +NODE_ENV=local +# tee-worker dataproviders config +TWITTER_OFFICIAL_URL=http://localhost:19527 +TWITTER_LITENTRY_URL=http://localhost:19527 +TWITTER_AUTH_TOKEN_V2= +DISCORD_OFFICIAL_URL=http://localhost:19527 +DISCORD_LITENTRY_URL=http://localhost:19527 +DISCORD_AUTH_TOKEN= +ACHAINABLE_URL=http://localhost:19527 +ACHAINABLE_AUTH_KEY= +CREDENTIAL_ENDPOINT=http://localhost:9933 +ONEBLOCK_NOTION_KEY=ABCDEFGHIJKLMNOPQRSTUVWXYZ +ONEBLOCK_NOTION_URL=https://abc.com +SORA_QUIZ_MASTER_ID=SORA_QUIZ_MASTER_ID +SORA_QUIZ_ATTENDEE_ID=SORA_QUIZ_ATTENDEE_ID +NODEREAL_API_KEY=NODEREAL_API_KEY +NODEREAL_API_URL=https://open-platform.nodereal.io/ +NODEREAL_API_CHAIN_NETWORK_URL= +CONTEST_LEGEND_DISCORD_ROLE_ID=CONTEST_LEGEND_DISCORD_ROLE_ID +CONTEST_POPULARITY_DISCORD_ROLE_ID=CONTEST_POPULARITY_DISCORD_ROLE_ID +CONTEST_PARTICIPANT_DISCORD_ROLE_ID=CONTEST_PARTICIPANT_DISCORD_ROLE_ID +VIP3_URL=https://dappapi.vip3.io/ +GENIIDATA_URL=https://api.geniidata.com/api/1/brc20/balance? +GENIIDATA_API_KEY=142cf1b0-1ca7-11ee-bb5e-9d74c2e854ac \ No newline at end of file diff --git a/tee-worker/Cargo.lock b/tee-worker/Cargo.lock index 604b0ee31b..01b2f96fd0 100644 --- a/tee-worker/Cargo.lock +++ b/tee-worker/Cargo.lock @@ -4577,7 +4577,6 @@ dependencies = [ "itp-types", "itp-utils", "lc-stf-task-sender", - "lc-vc-task-sender", "litentry-primitives", "log 0.4.20", "pallet-balances", @@ -4995,7 +4994,6 @@ dependencies = [ "itp-settings", "itp-storage", "itp-types", - "lc-data-providers", "log 0.4.20", "parity-scale-codec", "serde_json 1.0.103", @@ -6201,7 +6199,7 @@ dependencies = [ "itc-rest-client", "itp-rpc", "itp-stf-primitives", - "lazy_static", + "itp-utils", "lc-mock-server", "litentry-primitives", "log 0.4.20", @@ -6340,7 +6338,6 @@ dependencies = [ "hex 0.4.0", "ita-sgx-runtime", "ita-stf", - "itp-enclave-metrics", "itp-extrinsics-factory", "itp-node-api", "itp-ocall-api", @@ -6351,11 +6348,9 @@ dependencies = [ "itp-storage", "itp-top-pool-author", "itp-types", - "lazy_static", "lc-assertion-build", "lc-credentials", "lc-data-providers", - "lc-identity-verification", "lc-stf-task-receiver", "lc-stf-task-sender", "lc-vc-task-sender", @@ -6365,11 +6360,8 @@ dependencies = [ "parity-scale-codec", "sgx_tstd", "sp-core", - "thiserror 1.0.44", - "thiserror 1.0.9", "threadpool 1.8.0", "threadpool 1.8.1", - "url 2.1.1", ] [[package]] @@ -6378,7 +6370,6 @@ version = "0.1.0" dependencies = [ "futures 0.3.28", "futures 0.3.8", - "itp-stf-primitives", "itp-types", "lazy_static", "lc-stf-task-sender", @@ -6388,10 +6379,6 @@ dependencies = [ "sgx_tstd", "sp-runtime", "sp-std 5.0.0", - "thiserror 1.0.44", - "thiserror 1.0.9", - "url 2.1.1", - "url 2.4.0", ] [[package]] @@ -7120,6 +7107,7 @@ dependencies = [ "futures 0.3.28", "hex 0.4.3", "ipfs-api", + "ita-stf", "itc-parentchain", "itc-parentchain-test", "itc-rest-client", diff --git a/tee-worker/app-libs/stf/Cargo.toml b/tee-worker/app-libs/stf/Cargo.toml index 22a3c17e3a..9c6dd0aad8 100644 --- a/tee-worker/app-libs/stf/Cargo.toml +++ b/tee-worker/app-libs/stf/Cargo.toml @@ -41,7 +41,6 @@ sp-std = { default-features = false, git = "https://github.com/paritytech/substr # litentry itp-node-api-metadata-provider = { path = "../../core-primitives/node-api/metadata-provider", default-features = false } lc-stf-task-sender = { path = "../../litentry/core/stf-task/sender", default-features = false } -lc-vc-task-sender = { path = "../../litentry/core/vc-issuance/lc-vc-task-sender", default-features = false } litentry-primitives = { path = "../../litentry/primitives", default-features = false } pallet-parentchain = { path = "../../../pallets/parentchain", default-features = false } @@ -60,7 +59,6 @@ sgx = [ # litentry "litentry-primitives/sgx", "lc-stf-task-sender/sgx", - "lc-vc-task-sender/sgx", "itp-node-api-metadata-provider/sgx", ] std = [ @@ -89,7 +87,6 @@ std = [ # litentry "litentry-primitives/std", "lc-stf-task-sender/std", - "lc-vc-task-sender/std", "itp-node-api-metadata-provider/std", ] test = [] diff --git a/tee-worker/core-primitives/enclave-api/Cargo.toml b/tee-worker/core-primitives/enclave-api/Cargo.toml index 6908046ec9..c9dfaa9dff 100644 --- a/tee-worker/core-primitives/enclave-api/Cargo.toml +++ b/tee-worker/core-primitives/enclave-api/Cargo.toml @@ -26,7 +26,6 @@ itp-storage = { path = "../storage" } itp-types = { path = "../types" } # litentry -lc-data-providers = { path = "../../litentry/core/data-providers" } teerex-primitives = { path = "../../../primitives/teerex", default-features = false } [features] diff --git a/tee-worker/core-primitives/enclave-api/ffi/src/lib.rs b/tee-worker/core-primitives/enclave-api/ffi/src/lib.rs index 48336e9268..2dbb8fb016 100644 --- a/tee-worker/core-primitives/enclave-api/ffi/src/lib.rs +++ b/tee-worker/core-primitives/enclave-api/ffi/src/lib.rs @@ -276,17 +276,4 @@ extern "C" { until: *const u32, ) -> sgx_status_t; - pub fn run_stf_task_handler( - eid: sgx_enclave_id_t, - retval: *mut sgx_status_t, - data_provider_config: *const u8, - data_provider_config_size: usize, - ) -> sgx_status_t; - - pub fn run_vc_issuance( - eid: sgx_enclave_id_t, - retval: *mut sgx_status_t, - data_provider_config: *const u8, - data_provider_config_size: usize, - ) -> sgx_status_t; } diff --git a/tee-worker/core-primitives/enclave-api/src/lib.rs b/tee-worker/core-primitives/enclave-api/src/lib.rs index 767e311b46..38c810624f 100644 --- a/tee-worker/core-primitives/enclave-api/src/lib.rs +++ b/tee-worker/core-primitives/enclave-api/src/lib.rs @@ -22,11 +22,6 @@ pub mod sidechain; pub mod teeracle_api; pub mod utils; -#[cfg(feature = "implement-ffi")] -pub mod stf_task_handler; -#[cfg(feature = "implement-ffi")] -pub mod vc_issuance; - #[cfg(feature = "implement-ffi")] pub use sgx_urts::SgxEnclave; diff --git a/tee-worker/core-primitives/enclave-api/src/stf_task_handler.rs b/tee-worker/core-primitives/enclave-api/src/stf_task_handler.rs deleted file mode 100644 index a039b6461f..0000000000 --- a/tee-worker/core-primitives/enclave-api/src/stf_task_handler.rs +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2020-2023 Trust Computing GmbH. -// This file is part of Litentry. -// -// Litentry is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Litentry is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Litentry. If not, see . - -use crate::{error::Error, Enclave, EnclaveResult}; -use codec::Encode; -use frame_support::ensure; -use itp_enclave_api_ffi as ffi; -use lc_data_providers::DataProviderConfig; -use sgx_types::*; - -/// Trait to run a stf task handling thread inside the enclave. -pub trait StfTaskHandler { - fn run_stf_task_handler(&self, data_provider_config: DataProviderConfig) -> EnclaveResult<()>; -} - -impl StfTaskHandler for Enclave { - fn run_stf_task_handler(&self, data_provider_config: DataProviderConfig) -> EnclaveResult<()> { - let mut retval = sgx_status_t::SGX_SUCCESS; - - let data_provider_config_enc = data_provider_config.encode(); - - let result = unsafe { - ffi::run_stf_task_handler( - self.eid, - &mut retval, - data_provider_config_enc.as_ptr(), - data_provider_config_enc.len(), - ) - }; - - ensure!(result == sgx_status_t::SGX_SUCCESS, Error::Sgx(result)); - ensure!(retval == sgx_status_t::SGX_SUCCESS, Error::Sgx(retval)); - - Ok(()) - } -} diff --git a/tee-worker/core-primitives/enclave-api/src/vc_issuance.rs b/tee-worker/core-primitives/enclave-api/src/vc_issuance.rs deleted file mode 100644 index 7fc4598c9a..0000000000 --- a/tee-worker/core-primitives/enclave-api/src/vc_issuance.rs +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2020-2023 Trust Computing GmbH. -// This file is part of Litentry. -// -// Litentry is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Litentry is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Litentry. If not, see . - -use crate::{error::Error, Enclave, EnclaveResult}; -use codec::Encode; -use frame_support::ensure; -use itp_enclave_api_ffi as ffi; -use lc_data_providers::DataProviderConfig; -use sgx_types::*; - -/// Trait to run a stf task handling thread inside the enclave. -pub trait VcIssuance { - fn run_vc_issuance(&self, data_provider_config: DataProviderConfig) -> EnclaveResult<()>; -} - -impl VcIssuance for Enclave { - fn run_vc_issuance(&self, data_provider_config: DataProviderConfig) -> EnclaveResult<()> { - let mut retval = sgx_status_t::SGX_SUCCESS; - - let data_provider_config_enc = data_provider_config.encode(); - - let result = unsafe { - ffi::run_vc_issuance( - self.eid, - &mut retval, - data_provider_config_enc.as_ptr(), - data_provider_config_enc.len(), - ) - }; - - ensure!(result == sgx_status_t::SGX_SUCCESS, Error::Sgx(result)); - ensure!(retval == sgx_status_t::SGX_SUCCESS, Error::Sgx(retval)); - - Ok(()) - } -} diff --git a/tee-worker/core-primitives/test/src/mock/shielding_crypto_mock.rs b/tee-worker/core-primitives/test/src/mock/shielding_crypto_mock.rs index 441c770833..0006ba1245 100644 --- a/tee-worker/core-primitives/test/src/mock/shielding_crypto_mock.rs +++ b/tee-worker/core-primitives/test/src/mock/shielding_crypto_mock.rs @@ -22,10 +22,6 @@ use sgx_crypto_helper::{rsa3072::Rsa3072KeyPair, RsaKeyPair}; use sp_core::ed25519::Pair as Ed25519Pair; use std::vec::Vec; -/// Crypto key mock -/// -/// mock implementation that does not encrypt -/// encrypt/decrypt return the input as is #[derive(Clone)] pub struct ShieldingCryptoMock { key: Rsa3072KeyPair, diff --git a/tee-worker/docker/docker-compose.yml b/tee-worker/docker/docker-compose.yml index ae89562fcc..707588493d 100644 --- a/tee-worker/docker/docker-compose.yml +++ b/tee-worker/docker/docker-compose.yml @@ -144,7 +144,7 @@ services: retries: 20 entrypoint: "/usr/local/bin/litentry-worker --clean-reset --ws-external -M litentry-worker-1 -T wss://litentry-worker-1 - -u ws://litentry-node -U ws://litentry-worker-1 -P 2011 -w 2101 -p 9912 -h 4645 --enable-mock-server --running-mode mock + -u ws://litentry-node -U ws://litentry-worker-1 -P 2011 -w 2101 -p 9912 -h 4645 --enable-mock-server run --dev --skip-ra" restart: "no" volumes: diff --git a/tee-worker/docker/multiworker-docker-compose.yml b/tee-worker/docker/multiworker-docker-compose.yml index fa594742a4..70225a3d47 100644 --- a/tee-worker/docker/multiworker-docker-compose.yml +++ b/tee-worker/docker/multiworker-docker-compose.yml @@ -98,6 +98,7 @@ services: - --execution=wasm environment: RUST_LOG: sc_basic_authorship=trace,cumulus-consensus=trace,cumulus-collator=trace,collator_protocol=trace,collation_generation=trace,aura=debug + ulimits: *a1 litentry-worker-1: image: litentry/litentry-worker:latest @@ -144,7 +145,7 @@ services: retries: 20 entrypoint: "/usr/local/bin/litentry-worker --clean-reset --ws-external -M litentry-worker-1 -T wss://litentry-worker-1 - -u ws://litentry-node -U ws://litentry-worker-1 -P 2011 -w 2101 -p 9912 -h 4645 --enable-mock-server --running-mode mock + -u ws://litentry-node -U ws://litentry-worker-1 -P 2011 -w 2101 -p 9912 -h 4645 --enable-mock-server run --dev --skip-ra" restart: "no" litentry-worker-2: @@ -167,6 +168,24 @@ services: - "${SGX_QCNL:-/dev/null}:/etc/sgx_default_qcnl.conf" environment: - RUST_LOG=info,litentry_worker=debug,ws=warn,sp_io=error,substrate_api_client=warn,itc_parentchain_light_client=info,jsonrpsee_ws_client=warn,jsonrpsee_ws_server=warn,enclave_runtime=debug,ita_stf=debug,its_rpc_handler=warn,itc_rpc_client=warn,its_consensus_common=debug,its_state=warn,its_consensus_aura=warn,aura*=warn,its_consensus_slots=warn,itp_attestation_handler=debug,http_req=debug,lc_mock_server=warn,itc_rest_client=debug,lc_credentials=debug,lc_identity_verification=debug,lc_stf_task_receiver=debug,lc_stf_task_sender=debug,lc_data_providers=debug,itp_top_pool=debug,itc_parentchain_indirect_calls_executor=debug, + - TWITTER_OFFICIAL_URL=http://localhost:19527 + - TWITTER_LITENTRY_URL=http://localhost:19527 + - TWITTER_AUTH_TOKEN_V2= + - DISCORD_OFFICIAL_URL=http://localhost:19527 + - DISCORD_LITENTRY_URL=http://localhost:19527 + - DISCORD_AUTH_TOKEN= + - ACHAINABLE_URL=http://localhost:19527 + - ACHAINABLE_AUTH_KEY= + - CREDENTIAL_ENDPOINT=http://localhost:9933 + - ONEBLOCK_NOTION_KEY=ABCDEFGHIJKLMNOPQRSTUVWXYZ + - ONEBLOCK_NOTION_URL=https://abc.com + - SORA_QUIZ_MASTER_ID=SORA_QUIZ_MASTER_ID + - SORA_QUIZ_ATTENDEE_ID=SORA_QUIZ_ATTENDEE_ID + - NODEREAL_API_KEY=NODEREAL_API_KEY + - NODEREAL_API_URL=https://open-platform.nodereal.io/ + - CONTEST_LEGEND_DISCORD_ROLE_ID=CONTEST_LEGEND_DISCORD_ROLE_ID + - CONTEST_POPULARITY_DISCORD_ROLE_ID=CONTEST_POPULARITY_DISCORD_ROLE_ID + - CONTEST_PARTICIPANT_DISCORD_ROLE_ID=CONTEST_PARTICIPANT_DISCORD_ROLE_ID networks: - litentry-test-network healthcheck: @@ -176,7 +195,7 @@ services: retries: 20 entrypoint: "/usr/local/bin/litentry-worker --clean-reset --ws-external -M litentry-worker-2 -T wss://litentry-worker-2 - -u ws://litentry-node -U ws://litentry-worker-2 -P 2011 -w 2101 -p 9912 -h 4645 --enable-mock-server --running-mode mock + -u ws://litentry-node -U ws://litentry-worker-2 -P 2011 -w 2101 -p 9912 -h 4645 --enable-mock-server run --dev --skip-ra --request-state" restart: "no" litentry-worker-3: @@ -199,6 +218,24 @@ services: - "${SGX_QCNL:-/dev/null}:/etc/sgx_default_qcnl.conf" environment: - RUST_LOG=info,litentry_worker=debug,ws=warn,sp_io=error,substrate_api_client=warn,itc_parentchain_light_client=info,jsonrpsee_ws_client=warn,jsonrpsee_ws_server=warn,enclave_runtime=debug,ita_stf=debug,its_rpc_handler=warn,itc_rpc_client=warn,its_consensus_common=debug,its_state=warn,its_consensus_aura=warn,aura*=warn,its_consensus_slots=warn,itp_attestation_handler=debug,http_req=debug,lc_mock_server=warn,itc_rest_client=debug,lc_credentials=debug,lc_identity_verification=debug,lc_stf_task_receiver=debug,lc_stf_task_sender=debug,lc_data_providers=debug,itp_top_pool=debug,itc_parentchain_indirect_calls_executor=debug, + - TWITTER_OFFICIAL_URL=http://localhost:19527 + - TWITTER_LITENTRY_URL=http://localhost:19527 + - TWITTER_AUTH_TOKEN_V2= + - DISCORD_OFFICIAL_URL=http://localhost:19527 + - DISCORD_LITENTRY_URL=http://localhost:19527 + - DISCORD_AUTH_TOKEN= + - ACHAINABLE_URL=http://localhost:19527 + - ACHAINABLE_AUTH_KEY= + - CREDENTIAL_ENDPOINT=http://localhost:9933 + - ONEBLOCK_NOTION_KEY=ABCDEFGHIJKLMNOPQRSTUVWXYZ + - ONEBLOCK_NOTION_URL=https://abc.com + - SORA_QUIZ_MASTER_ID=SORA_QUIZ_MASTER_ID + - SORA_QUIZ_ATTENDEE_ID=SORA_QUIZ_ATTENDEE_ID + - NODEREAL_API_KEY=NODEREAL_API_KEY + - NODEREAL_API_URL=https://open-platform.nodereal.io/ + - CONTEST_LEGEND_DISCORD_ROLE_ID=CONTEST_LEGEND_DISCORD_ROLE_ID + - CONTEST_POPULARITY_DISCORD_ROLE_ID=CONTEST_POPULARITY_DISCORD_ROLE_ID + - CONTEST_PARTICIPANT_DISCORD_ROLE_ID=CONTEST_PARTICIPANT_DISCORD_ROLE_ID networks: - litentry-test-network healthcheck: @@ -208,7 +245,7 @@ services: retries: 20 entrypoint: "/usr/local/bin/litentry-worker --clean-reset --ws-external -M litentry-worker-3 -T wss://litentry-worker-3 - -u ws://litentry-node -U ws://litentry-worker-3 -P 2011 -w 2101 -p 9912 -h 4645 --enable-mock-server --running-mode mock + -u ws://litentry-node -U ws://litentry-worker-3 -P 2011 -w 2101 -p 9912 -h 4645 --enable-mock-server run --dev --skip-ra --request-state" restart: "no" volumes: diff --git a/tee-worker/enclave-runtime/Cargo.lock b/tee-worker/enclave-runtime/Cargo.lock index 277b721f63..0fabae9a7d 100644 --- a/tee-worker/enclave-runtime/Cargo.lock +++ b/tee-worker/enclave-runtime/Cargo.lock @@ -1922,7 +1922,6 @@ dependencies = [ "itp-types", "itp-utils", "lc-stf-task-sender", - "lc-vc-task-sender", "litentry-primitives", "log", "pallet-balances", @@ -2954,7 +2953,7 @@ dependencies = [ "http_req", "itc-rest-client", "itp-rpc", - "lazy_static", + "itp-utils", "litentry-primitives", "log", "parity-scale-codec", @@ -3059,7 +3058,6 @@ dependencies = [ "hex 0.4.0", "ita-sgx-runtime", "ita-stf", - "itp-enclave-metrics", "itp-extrinsics-factory", "itp-node-api", "itp-ocall-api", @@ -3070,11 +3068,9 @@ dependencies = [ "itp-storage", "itp-top-pool-author", "itp-types", - "lazy_static", "lc-assertion-build", "lc-credentials", "lc-data-providers", - "lc-identity-verification", "lc-stf-task-receiver", "lc-stf-task-sender", "lc-vc-task-sender", @@ -3084,9 +3080,7 @@ dependencies = [ "parity-scale-codec", "sgx_tstd", "sp-core", - "thiserror", "threadpool", - "url", ] [[package]] @@ -3094,7 +3088,6 @@ name = "lc-vc-task-sender" version = "0.1.0" dependencies = [ "futures 0.3.8", - "itp-stf-primitives", "itp-types", "lazy_static", "lc-stf-task-sender", @@ -3104,8 +3097,6 @@ dependencies = [ "sgx_tstd", "sp-runtime", "sp-std", - "thiserror", - "url", ] [[package]] diff --git a/tee-worker/enclave-runtime/Enclave.edl b/tee-worker/enclave-runtime/Enclave.edl index 53dfca0220..04c02fea61 100644 --- a/tee-worker/enclave-runtime/Enclave.edl +++ b/tee-worker/enclave-runtime/Enclave.edl @@ -192,14 +192,6 @@ enclave { public sgx_status_t ignore_parentchain_block_import_validation_until( [in] uint32_t* until ); - - public size_t run_stf_task_handler( - [in, size=data_providers_static_len] uint8_t* data_providers_static, uint32_t data_providers_static_len - ); - - public size_t run_vc_issuance( - [in, size=data_providers_static_len] uint8_t* data_providers_static, uint32_t data_providers_static_len - ); }; untrusted { diff --git a/tee-worker/enclave-runtime/src/initialization/global_components.rs b/tee-worker/enclave-runtime/src/initialization/global_components.rs index 8f45ddcc7f..8460670bc5 100644 --- a/tee-worker/enclave-runtime/src/initialization/global_components.rs +++ b/tee-worker/enclave-runtime/src/initialization/global_components.rs @@ -91,6 +91,7 @@ use its_sidechain::{ slots::FailSlotOnDemand, }; use lazy_static::lazy_static; +use lc_data_providers::DataProviderConfig; use litentry_primitives::BroadcastedRequest; use sgx_crypto_helper::rsa3072::Rsa3072KeyPair; use sgx_tstd::vec::Vec; @@ -499,3 +500,6 @@ pub static GLOBAL_SIDECHAIN_BLOCK_SYNCER_COMPONENT: ComponentContainer< pub static GLOBAL_SIDECHAIN_FAIL_SLOT_ON_DEMAND_COMPONENT: ComponentContainer< Option, > = ComponentContainer::new("sidechain_fail_slot_on_demand"); + +pub static GLOBAL_DATA_PROVIDER_CONFIG: ComponentContainer = + ComponentContainer::new("data_provider_config"); diff --git a/tee-worker/enclave-runtime/src/initialization/mod.rs b/tee-worker/enclave-runtime/src/initialization/mod.rs index 7faee9d686..55845d2eac 100644 --- a/tee-worker/enclave-runtime/src/initialization/mod.rs +++ b/tee-worker/enclave-runtime/src/initialization/mod.rs @@ -27,14 +27,15 @@ use crate::{ EnclaveStateHandler, EnclaveStateInitializer, EnclaveStateObserver, EnclaveStateSnapshotRepository, EnclaveStfEnclaveSigner, EnclaveTopPool, EnclaveTopPoolAuthor, DIRECT_RPC_REQUEST_SINK_COMPONENT, - GLOBAL_ATTESTATION_HANDLER_COMPONENT, GLOBAL_DIRECT_RPC_BROADCASTER_COMPONENT, - GLOBAL_INTEGRITEE_PARENTCHAIN_LIGHT_CLIENT_SEAL, GLOBAL_OCALL_API_COMPONENT, - GLOBAL_RPC_WS_HANDLER_COMPONENT, GLOBAL_SHIELDING_KEY_REPOSITORY_COMPONENT, - GLOBAL_SIDECHAIN_BLOCK_COMPOSER_COMPONENT, GLOBAL_SIDECHAIN_BLOCK_SYNCER_COMPONENT, - GLOBAL_SIDECHAIN_FAIL_SLOT_ON_DEMAND_COMPONENT, GLOBAL_SIDECHAIN_IMPORT_QUEUE_COMPONENT, - GLOBAL_SIDECHAIN_IMPORT_QUEUE_WORKER_COMPONENT, GLOBAL_SIGNING_KEY_REPOSITORY_COMPONENT, - GLOBAL_STATE_HANDLER_COMPONENT, GLOBAL_STATE_KEY_REPOSITORY_COMPONENT, - GLOBAL_STATE_OBSERVER_COMPONENT, GLOBAL_TARGET_A_PARENTCHAIN_LIGHT_CLIENT_SEAL, + GLOBAL_ATTESTATION_HANDLER_COMPONENT, GLOBAL_DATA_PROVIDER_CONFIG, + GLOBAL_DIRECT_RPC_BROADCASTER_COMPONENT, GLOBAL_INTEGRITEE_PARENTCHAIN_LIGHT_CLIENT_SEAL, + GLOBAL_OCALL_API_COMPONENT, GLOBAL_RPC_WS_HANDLER_COMPONENT, + GLOBAL_SHIELDING_KEY_REPOSITORY_COMPONENT, GLOBAL_SIDECHAIN_BLOCK_COMPOSER_COMPONENT, + GLOBAL_SIDECHAIN_BLOCK_SYNCER_COMPONENT, GLOBAL_SIDECHAIN_FAIL_SLOT_ON_DEMAND_COMPONENT, + GLOBAL_SIDECHAIN_IMPORT_QUEUE_COMPONENT, GLOBAL_SIDECHAIN_IMPORT_QUEUE_WORKER_COMPONENT, + GLOBAL_SIGNING_KEY_REPOSITORY_COMPONENT, GLOBAL_STATE_HANDLER_COMPONENT, + GLOBAL_STATE_KEY_REPOSITORY_COMPONENT, GLOBAL_STATE_OBSERVER_COMPONENT, + GLOBAL_TARGET_A_PARENTCHAIN_LIGHT_CLIENT_SEAL, GLOBAL_TARGET_B_PARENTCHAIN_LIGHT_CLIENT_SEAL, GLOBAL_TOP_POOL_AUTHOR_COMPONENT, GLOBAL_WEB_SOCKET_SERVER_COMPONENT, }, @@ -83,7 +84,10 @@ use its_sidechain::{ block_composer::BlockComposer, slots::{FailSlotMode, FailSlotOnDemand}, }; +use lc_data_providers::DataProviderConfig; use lc_scheduled_enclave::{ScheduledEnclaveUpdater, GLOBAL_SCHEDULED_ENCLAVE}; +use lc_stf_task_receiver::{run_stf_task_receiver, StfTaskContext}; +use lc_vc_task_receiver::run_vc_handler_runner; use litentry_primitives::BroadcastedRequest; use log::*; use sgx_types::sgx_status_t; @@ -212,6 +216,19 @@ pub(crate) fn init_enclave( Arc::new(IntelAttestationHandler::new(ocall_api, signing_key_repository)); GLOBAL_ATTESTATION_HANDLER_COMPONENT.initialize(attestation_handler); + let data_provider_config = DataProviderConfig::new(); + GLOBAL_DATA_PROVIDER_CONFIG.initialize(data_provider_config.into()); + + std::thread::spawn(move || { + #[allow(clippy::unwrap_used)] + run_stf_task_handler().unwrap(); + }); + + std::thread::spawn(move || { + #[allow(clippy::unwrap_used)] + run_vc_issuance().unwrap(); + }); + Ok(()) } @@ -230,6 +247,64 @@ fn initialize_state_observer( Ok(Arc::new(EnclaveStateObserver::from_map(states_map))) } +fn run_stf_task_handler() -> Result<(), Error> { + let author_api = GLOBAL_TOP_POOL_AUTHOR_COMPONENT.get()?; + let state_handler = GLOBAL_STATE_HANDLER_COMPONENT.get()?; + let state_observer = GLOBAL_STATE_OBSERVER_COMPONENT.get()?; + let data_provider_config = GLOBAL_DATA_PROVIDER_CONFIG.get()?; + + let shielding_key_repository = GLOBAL_SHIELDING_KEY_REPOSITORY_COMPONENT.get()?; + + let ocall_api = GLOBAL_OCALL_API_COMPONENT.get()?; + let stf_enclave_signer = Arc::new(EnclaveStfEnclaveSigner::new( + state_observer, + ocall_api.clone(), + shielding_key_repository.clone(), + author_api.clone(), + )); + + let stf_task_context = StfTaskContext::new( + shielding_key_repository, + author_api, + stf_enclave_signer, + state_handler, + ocall_api, + data_provider_config, + ); + + run_stf_task_receiver(Arc::new(stf_task_context)).map_err(Error::StfTaskReceiver) +} + +fn run_vc_issuance() -> Result<(), Error> { + let author_api = GLOBAL_TOP_POOL_AUTHOR_COMPONENT.get()?; + let state_handler = GLOBAL_STATE_HANDLER_COMPONENT.get()?; + let state_observer = GLOBAL_STATE_OBSERVER_COMPONENT.get()?; + let data_provider_config = GLOBAL_DATA_PROVIDER_CONFIG.get()?; + + let shielding_key_repository = GLOBAL_SHIELDING_KEY_REPOSITORY_COMPONENT.get()?; + #[allow(clippy::unwrap_used)] + let ocall_api = GLOBAL_OCALL_API_COMPONENT.get()?; + let stf_enclave_signer = Arc::new(EnclaveStfEnclaveSigner::new( + state_observer, + ocall_api.clone(), + shielding_key_repository.clone(), + author_api.clone(), + )); + + let stf_task_context = StfTaskContext::new( + shielding_key_repository, + author_api, + stf_enclave_signer, + state_handler, + ocall_api, + data_provider_config, + ); + let extrinsic_factory = get_extrinsic_factory_from_integritee_solo_or_parachain()?; + let node_metadata_repo = get_node_metadata_repository_from_integritee_solo_or_parachain()?; + run_vc_handler_runner(Arc::new(stf_task_context), extrinsic_factory, node_metadata_repo); + Ok(()) +} + pub(crate) fn init_enclave_sidechain_components( fail_mode: Option, fail_at: u64, diff --git a/tee-worker/enclave-runtime/src/lib.rs b/tee-worker/enclave-runtime/src/lib.rs index b0f3d8b98b..9c3b078558 100644 --- a/tee-worker/enclave-runtime/src/lib.rs +++ b/tee-worker/enclave-runtime/src/lib.rs @@ -94,7 +94,6 @@ mod ocall; mod shard_vault; mod stf_task_handler; mod utils; -mod vc_issuance_task; pub mod error; pub mod rpc; diff --git a/tee-worker/enclave-runtime/src/stf_task_handler.rs b/tee-worker/enclave-runtime/src/stf_task_handler.rs index 11876a4418..8b13789179 100644 --- a/tee-worker/enclave-runtime/src/stf_task_handler.rs +++ b/tee-worker/enclave-runtime/src/stf_task_handler.rs @@ -1,122 +1 @@ -// Copyright 2020-2023 Trust Computing GmbH. -// This file is part of Litentry. -// -// Litentry is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Litentry is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Litentry. If not, see . -use crate::utils::DecodeRaw; -use itp_component_container::ComponentGetter; -use itp_sgx_crypto::key_repository::AccessKey; -use lc_data_providers::{DataProviderConfig, GLOBAL_DATA_PROVIDER_CONFIG}; -use lc_stf_task_receiver::{run_stf_task_receiver, StfTaskContext}; -use log::*; -use sgx_types::sgx_status_t; -use std::sync::Arc; - -use crate::{ - error::{Error, Result}, - initialization::global_components::{ - EnclaveStfEnclaveSigner, GLOBAL_OCALL_API_COMPONENT, - GLOBAL_SHIELDING_KEY_REPOSITORY_COMPONENT, GLOBAL_STATE_OBSERVER_COMPONENT, - GLOBAL_TOP_POOL_AUTHOR_COMPONENT, - }, - GLOBAL_STATE_HANDLER_COMPONENT, -}; - -#[no_mangle] -pub unsafe extern "C" fn run_stf_task_handler(dpc: *const u8, dpc_size: usize) -> sgx_status_t { - let data_provider_config = match DataProviderConfig::decode_raw(dpc, dpc_size) { - Ok(data_provider_config) => data_provider_config, - Err(e) => return Error::Codec(e).into(), - }; - - match GLOBAL_DATA_PROVIDER_CONFIG.write() { - Ok(mut dpc) => { - dpc.set_twitter_official_url(data_provider_config.twitter_official_url); - dpc.set_twitter_litentry_url(data_provider_config.twitter_litentry_url); - dpc.set_twitter_auth_token_v2(data_provider_config.twitter_auth_token_v2); - dpc.set_discord_official_url(data_provider_config.discord_official_url); - dpc.set_discord_litentry_url(data_provider_config.discord_litentry_url); - dpc.set_discord_auth_token(data_provider_config.discord_auth_token); - dpc.set_achainable_url(data_provider_config.achainable_url); - dpc.set_achainable_auth_key(data_provider_config.achainable_auth_key); - dpc.set_credential_endpoint(data_provider_config.credential_endpoint); - dpc.set_oneblock_notion_key(data_provider_config.oneblock_notion_key); - dpc.set_oneblock_notion_url(data_provider_config.oneblock_notion_url); - dpc.set_sora_quiz_master_id(data_provider_config.sora_quiz_master_id); - dpc.set_sora_quiz_attendee_id(data_provider_config.sora_quiz_attendee_id); - dpc.set_nodereal_api_key(data_provider_config.nodereal_api_key); - dpc.set_nodereal_api_retry_delay(data_provider_config.nodereal_api_retry_delay); - dpc.set_nodereal_api_retry_times(data_provider_config.nodereal_api_retry_times); - dpc.set_nodereal_api_url(data_provider_config.nodereal_api_url); - dpc.set_nodereal_api_chain_network_url( - data_provider_config.nodereal_api_chain_network_url, - ); - dpc.set_contest_legend_discord_role_id( - data_provider_config.contest_legend_discord_role_id, - ); - dpc.set_contest_popularity_discord_role_id( - data_provider_config.contest_popularity_discord_role_id, - ); - dpc.set_contest_participant_discord_role_id( - data_provider_config.contest_participant_discord_role_id, - ); - dpc.set_vip3_url(data_provider_config.vip3_url); - dpc.set_geniidata_url(data_provider_config.geniidata_url); - dpc.set_geniidata_api_key(data_provider_config.geniidata_api_key); - }, - Err(e) => { - error!("Error while setting data provider config: {:?}", e); - return Error::MutexAccess.into() - }, - } - - if let Err(e) = run_stf_task_handler_internal() { - error!("Error while running stf task handler thread: {:?}", e); - return e.into() - } - - sgx_status_t::SGX_SUCCESS -} - -/// Internal [`run_stf_task_handler`] function to be able to use the `?` operator. -/// -/// Runs an extrinsic request inside the enclave, opening a channel and waiting for -/// senders to send requests. -fn run_stf_task_handler_internal() -> Result<()> { - let author_api = GLOBAL_TOP_POOL_AUTHOR_COMPONENT.get()?; - let state_handler = GLOBAL_STATE_HANDLER_COMPONENT.get()?; - let state_observer = GLOBAL_STATE_OBSERVER_COMPONENT.get()?; - - let shielding_key_repository = GLOBAL_SHIELDING_KEY_REPOSITORY_COMPONENT.get()?; - #[allow(clippy::unwrap_used)] - let shielding_key = shielding_key_repository.retrieve_key().unwrap(); - - let ocall_api = GLOBAL_OCALL_API_COMPONENT.get()?; - let stf_enclave_signer = Arc::new(EnclaveStfEnclaveSigner::new( - state_observer, - ocall_api.clone(), - shielding_key_repository, - author_api.clone(), - )); - - let stf_task_context = StfTaskContext::new( - shielding_key, - author_api, - stf_enclave_signer, - state_handler, - ocall_api, - ); - - run_stf_task_receiver(Arc::new(stf_task_context)).map_err(Error::StfTaskReceiver) -} diff --git a/tee-worker/enclave-runtime/src/vc_issuance_task.rs b/tee-worker/enclave-runtime/src/vc_issuance_task.rs index bdbce0ecc7..e69de29bb2 100644 --- a/tee-worker/enclave-runtime/src/vc_issuance_task.rs +++ b/tee-worker/enclave-runtime/src/vc_issuance_task.rs @@ -1,130 +0,0 @@ -// Copyright 2020-2023 Trust Computing GmbH. -// This file is part of Litentry. -// -// Litentry is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Litentry is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Litentry. If not, see . - -use crate::utils::DecodeRaw; -use itp_component_container::ComponentGetter; -use itp_sgx_crypto::key_repository::AccessKey; -use lc_data_providers::{DataProviderConfig, GLOBAL_DATA_PROVIDER_CONFIG}; -use lc_stf_task_receiver::StfTaskContext; -use lc_vc_task_receiver::run_vc_handler_runner; -use log::*; -use sgx_types::sgx_status_t; -use std::sync::Arc; - -use crate::{ - error::{Error, Result}, - initialization::global_components::{ - EnclaveStfEnclaveSigner, GLOBAL_OCALL_API_COMPONENT, - GLOBAL_SHIELDING_KEY_REPOSITORY_COMPONENT, GLOBAL_STATE_OBSERVER_COMPONENT, - GLOBAL_TOP_POOL_AUTHOR_COMPONENT, - }, - utils::{ - get_extrinsic_factory_from_integritee_solo_or_parachain, - get_node_metadata_repository_from_integritee_solo_or_parachain, - }, - GLOBAL_STATE_HANDLER_COMPONENT, -}; - -#[no_mangle] -pub unsafe extern "C" fn run_vc_issuance(dpc: *const u8, dpc_size: usize) -> sgx_status_t { - let data_provider_config = match DataProviderConfig::decode_raw(dpc, dpc_size) { - Ok(data_provider_config) => data_provider_config, - Err(e) => return Error::Codec(e).into(), - }; - - match GLOBAL_DATA_PROVIDER_CONFIG.write() { - Ok(mut dpc) => { - dpc.set_twitter_official_url(data_provider_config.twitter_official_url); - dpc.set_twitter_litentry_url(data_provider_config.twitter_litentry_url); - dpc.set_twitter_auth_token_v2(data_provider_config.twitter_auth_token_v2); - dpc.set_discord_official_url(data_provider_config.discord_official_url); - dpc.set_discord_litentry_url(data_provider_config.discord_litentry_url); - dpc.set_discord_auth_token(data_provider_config.discord_auth_token); - dpc.set_achainable_url(data_provider_config.achainable_url); - dpc.set_achainable_auth_key(data_provider_config.achainable_auth_key); - dpc.set_credential_endpoint(data_provider_config.credential_endpoint); - dpc.set_oneblock_notion_key(data_provider_config.oneblock_notion_key); - dpc.set_oneblock_notion_url(data_provider_config.oneblock_notion_url); - dpc.set_sora_quiz_master_id(data_provider_config.sora_quiz_master_id); - dpc.set_sora_quiz_attendee_id(data_provider_config.sora_quiz_attendee_id); - dpc.set_nodereal_api_key(data_provider_config.nodereal_api_key); - dpc.set_nodereal_api_retry_delay(data_provider_config.nodereal_api_retry_delay); - dpc.set_nodereal_api_retry_times(data_provider_config.nodereal_api_retry_times); - dpc.set_nodereal_api_url(data_provider_config.nodereal_api_url); - dpc.set_nodereal_api_chain_network_url( - data_provider_config.nodereal_api_chain_network_url, - ); - dpc.set_contest_legend_discord_role_id( - data_provider_config.contest_legend_discord_role_id, - ); - dpc.set_contest_popularity_discord_role_id( - data_provider_config.contest_popularity_discord_role_id, - ); - dpc.set_contest_participant_discord_role_id( - data_provider_config.contest_participant_discord_role_id, - ); - dpc.set_vip3_url(data_provider_config.vip3_url); - dpc.set_geniidata_url(data_provider_config.geniidata_url); - dpc.set_geniidata_api_key(data_provider_config.geniidata_api_key); - }, - Err(e) => { - error!("Error while setting data provider config: {:?}", e); - return Error::MutexAccess.into() - }, - } - - println!("[+] Starting to Run VC Issuance Internal"); - if let Err(e) = run_vc_issuance_internal() { - error!("Error while running stf task handler thread: {:?}", e); - return e.into() - } - - sgx_status_t::SGX_SUCCESS -} - -/// Internal [`run_stf_task_handler`] function to be able to use the `?` operator. -/// -/// Runs an extrinsic request inside the enclave, opening a channel and waiting for -/// senders to send requests. -fn run_vc_issuance_internal() -> Result<()> { - let author_api = GLOBAL_TOP_POOL_AUTHOR_COMPONENT.get()?; - let state_handler = GLOBAL_STATE_HANDLER_COMPONENT.get()?; - let state_observer = GLOBAL_STATE_OBSERVER_COMPONENT.get()?; - - let shielding_key_repository = GLOBAL_SHIELDING_KEY_REPOSITORY_COMPONENT.get()?; - #[allow(clippy::unwrap_used)] - let shielding_key = shielding_key_repository.retrieve_key().unwrap(); - - let ocall_api = GLOBAL_OCALL_API_COMPONENT.get()?; - let stf_enclave_signer = Arc::new(EnclaveStfEnclaveSigner::new( - state_observer, - ocall_api.clone(), - shielding_key_repository, - author_api.clone(), - )); - - let stf_task_context = StfTaskContext::new( - shielding_key, - author_api, - stf_enclave_signer, - state_handler, - ocall_api, - ); - let extrinsic_factory = get_extrinsic_factory_from_integritee_solo_or_parachain()?; - let node_metadata_repo = get_node_metadata_repository_from_integritee_solo_or_parachain()?; - run_vc_handler_runner(Arc::new(stf_task_context), extrinsic_factory, node_metadata_repo); - Ok(()) -} diff --git a/tee-worker/litentry/core/assertion-build/src/a14.rs b/tee-worker/litentry/core/assertion-build/src/a14.rs index 1c05d3d0df..72ebef5c58 100644 --- a/tee-worker/litentry/core/assertion-build/src/a14.rs +++ b/tee-worker/litentry/core/assertion-build/src/a14.rs @@ -32,9 +32,7 @@ use itc_rest_client::{ rest_client::RestClient, RestPath, RestPost, }; -use lc_data_providers::{ - build_client, DataProviderConfig, DataProviderConfigReader, ReadDataProviderConfig, -}; +use lc_data_providers::{build_client, DataProviderConfig}; use serde::{Deserialize, Serialize}; const VC_A14_SUBJECT_DESCRIPTION: &str = @@ -99,7 +97,10 @@ impl A14Client { } } -pub fn build(req: &AssertionBuildRequest) -> Result { +pub fn build( + req: &AssertionBuildRequest, + data_provider_config: &DataProviderConfig, +) -> Result { debug!("Assertion A14 build, who: {:?}", account_id_to_string(&req.who)); // achainable expects polkadot addresses (those start with 1...) @@ -111,12 +112,8 @@ pub fn build(req: &AssertionBuildRequest) -> Result { polkadot_addresses.push(address); } } - - let data_provider_config = - DataProviderConfigReader::read().map_err(|e| Error::RequestVCFailed(Assertion::A14, e))?; - let mut value = false; - let mut client = A14Client::new(&data_provider_config); + let mut client = A14Client::new(data_provider_config); for address in polkadot_addresses { let data = A14Data { diff --git a/tee-worker/litentry/core/assertion-build/src/a2.rs b/tee-worker/litentry/core/assertion-build/src/a2.rs index 60f9420934..d6063b45f6 100644 --- a/tee-worker/litentry/core/assertion-build/src/a2.rs +++ b/tee-worker/litentry/core/assertion-build/src/a2.rs @@ -21,14 +21,20 @@ compile_error!("feature \"std\" and feature \"sgx\" cannot be enabled at the sam extern crate sgx_tstd as std; use crate::*; -use lc_data_providers::{discord_litentry::DiscordLitentryClient, vec_to_string}; +use lc_data_providers::{ + discord_litentry::DiscordLitentryClient, vec_to_string, DataProviderConfig, +}; const VC_A2_SUBJECT_DESCRIPTION: &str = "The user is a member of Litentry Discord. Server link: https://discord.gg/phBSa3eMX9 Guild ID: 807161594245152800."; const VC_A2_SUBJECT_TYPE: &str = "Litentry Discord Member"; -pub fn build(req: &AssertionBuildRequest, guild_id: ParameterString) -> Result { +pub fn build( + req: &AssertionBuildRequest, + guild_id: ParameterString, + data_provider_config: &DataProviderConfig, +) -> Result { debug!("Assertion A2 build, who: {:?}", account_id_to_string(&req.who)); let mut discord_cnt: i32 = 0; @@ -38,7 +44,7 @@ pub fn build(req: &AssertionBuildRequest, guild_id: ParameterString) -> Result = format!("{}", guild_id_u).as_bytes().to_vec(); @@ -113,7 +117,7 @@ mod tests { req_ext_hash: Default::default(), }; - let _ = build(&req, guild_id); + let _ = build(&req, guild_id, &data_provider_config); log::info!("build A2 done"); } } diff --git a/tee-worker/litentry/core/assertion-build/src/a3.rs b/tee-worker/litentry/core/assertion-build/src/a3.rs index b0209afdab..4790256730 100644 --- a/tee-worker/litentry/core/assertion-build/src/a3.rs +++ b/tee-worker/litentry/core/assertion-build/src/a3.rs @@ -21,7 +21,9 @@ compile_error!("feature \"std\" and feature \"sgx\" cannot be enabled at the sam extern crate sgx_tstd as std; use crate::*; -use lc_data_providers::{discord_litentry::DiscordLitentryClient, vec_to_string}; +use lc_data_providers::{ + discord_litentry::DiscordLitentryClient, vec_to_string, DataProviderConfig, +}; const VC_A3_SUBJECT_DESCRIPTION: &str = "You have commented in Litentry Discord #🪂id-hubber channel. Channel link: https://discord.com/channels/807161594245152800/1093886939746291882"; @@ -32,6 +34,7 @@ pub fn build( guild_id: ParameterString, channel_id: ParameterString, role_id: ParameterString, + data_provider_config: &DataProviderConfig, ) -> Result { debug!("Assertion A3 build, who: {:?}", account_id_to_string(&req.who),); @@ -56,7 +59,7 @@ pub fn build( ) })?; - let mut client = DiscordLitentryClient::new(); + let mut client = DiscordLitentryClient::new(&data_provider_config.discord_litentry_url); for identity in &req.identities { if let Identity::Discord(address) = &identity.0 { let resp = client @@ -106,17 +109,15 @@ mod tests { use crate::{a3::build, AccountId, AssertionBuildRequest}; use frame_support::BoundedVec; use itp_stf_primitives::types::ShardIdentifier; - use lc_data_providers::GLOBAL_DATA_PROVIDER_CONFIG; + use lc_data_providers::DataProviderConfig; use litentry_primitives::{Assertion, Identity, IdentityNetworkTuple, IdentityString}; use log; use std::{format, vec, vec::Vec}; #[test] fn build_a3_works() { - GLOBAL_DATA_PROVIDER_CONFIG - .write() - .unwrap() - .set_discord_litentry_url("http://localhost:19527".to_string()); + let mut data_provider_config = DataProviderConfig::new(); + data_provider_config.set_discord_litentry_url("http://localhost:19527".to_string()); let guild_id_u: u64 = 919848390156767232; let channel_id_u: u64 = 919848392035794945; let role_id_u: u64 = 1034083718425493544; @@ -146,7 +147,7 @@ mod tests { req_ext_hash: Default::default(), }; - let _ = build(&req, guild_id, channel_id, role_id); + let _ = build(&req, guild_id, channel_id, role_id, &data_provider_config); log::info!("build A3 done"); } } diff --git a/tee-worker/litentry/core/assertion-build/src/a6.rs b/tee-worker/litentry/core/assertion-build/src/a6.rs index cbb4f4bd27..0b1d82a8b4 100644 --- a/tee-worker/litentry/core/assertion-build/src/a6.rs +++ b/tee-worker/litentry/core/assertion-build/src/a6.rs @@ -21,7 +21,7 @@ compile_error!("feature \"std\" and feature \"sgx\" cannot be enabled at the sam extern crate sgx_tstd as std; use crate::*; -use lc_data_providers::twitter_official::TwitterOfficialClient; +use lc_data_providers::{twitter_official::TwitterOfficialClient, DataProviderConfig}; const VC_A6_SUBJECT_DESCRIPTION: &str = "The range of the user's Twitter follower count"; const VC_A6_SUBJECT_TYPE: &str = "Twitter Follower Amount"; @@ -33,10 +33,16 @@ const VC_A6_SUBJECT_TYPE: &str = "Twitter Follower Amount"; /// * 1,000+ followers /// * 10,000+ followers /// * 100,000+ followers -pub fn build(req: &AssertionBuildRequest) -> Result { +pub fn build( + req: &AssertionBuildRequest, + data_provider_config: &DataProviderConfig, +) -> Result { debug!("Assertion A6 build, who: {:?}", account_id_to_string(&req.who),); - let mut client = TwitterOfficialClient::v2(); + let mut client = TwitterOfficialClient::v2( + &data_provider_config.twitter_official_url, + &data_provider_config.twitter_auth_token_v2, + ); let mut sum: u32 = 0; for identity in &req.identities { diff --git a/tee-worker/litentry/core/assertion-build/src/a8.rs b/tee-worker/litentry/core/assertion-build/src/a8.rs index 9633f1c3a1..a5ab09169e 100644 --- a/tee-worker/litentry/core/assertion-build/src/a8.rs +++ b/tee-worker/litentry/core/assertion-build/src/a8.rs @@ -23,22 +23,23 @@ extern crate sgx_tstd as std; use crate::*; use lc_data_providers::{ achainable::{AchainableAccountTotalTransactions, AchainableClient}, - DataProviderConfigReader, ReadDataProviderConfig, + DataProviderConfig, }; use litentry_primitives::BoundedWeb3Network; const VC_A8_SUBJECT_DESCRIPTION: &str = "Gets the range of number of transactions a user has made for a specific token on all supported networks (invalid transactions are also counted)"; const VC_A8_SUBJECT_TYPE: &str = "EVM/Substrate Transaction Count"; -pub fn build(req: &AssertionBuildRequest) -> Result { +pub fn build( + req: &AssertionBuildRequest, + data_provider_config: &DataProviderConfig, +) -> Result { debug!("Assertion A8 build, who: {:?}", account_id_to_string(&req.who),); // It should never fail because `req.assertion.get_supported_web3networks()` // returns the vector which is converted from a BoundedVec let bounded_web3networks: BoundedWeb3Network = req.assertion.get_supported_web3networks().try_into().unwrap(); - let data_provider_config = DataProviderConfigReader::read() - .map_err(|e| Error::RequestVCFailed(Assertion::A8(bounded_web3networks.clone()), e))?; - let mut client = AchainableClient::new(&data_provider_config); + let mut client = AchainableClient::new(data_provider_config); let mut total_txs: u64 = 0; let identities: Vec<(Web3Network, Vec)> = transpose_identity(&req.identities); diff --git a/tee-worker/litentry/core/assertion-build/src/achainable/amount.rs b/tee-worker/litentry/core/assertion-build/src/achainable/amount.rs index a3dd24bf74..0cf9777f7d 100644 --- a/tee-worker/litentry/core/assertion-build/src/achainable/amount.rs +++ b/tee-worker/litentry/core/assertion-build/src/achainable/amount.rs @@ -25,7 +25,9 @@ use crate::{ *, }; use lc_credentials::litentry_profile::holding_amount::LitentryProfileHoldingAmount; -use lc_data_providers::{achainable_names::AchainableNameAmount, ConvertParameterString}; +use lc_data_providers::{ + achainable_names::AchainableNameAmount, ConvertParameterString, DataProviderConfig, +}; const CREATED_OVER_AMOUNT_CONTRACTS: &str = "Created over {amount} contracts"; const BALANCE_OVER_AMOUNT: &str = "Balance over {amount}"; @@ -98,7 +100,11 @@ const BALANCE_OVER_AMOUNT: &str = "Balance over {amount}"; /// ] /// } /// -pub fn build_amount(req: &AssertionBuildRequest, param: AchainableAmount) -> Result { +pub fn build_amount( + req: &AssertionBuildRequest, + param: AchainableAmount, + data_provider_config: &DataProviderConfig, +) -> Result { debug!("Assertion Achainable build_amount, who: {:?}", account_id_to_string(&req.who)); let identities = transpose_identity(&req.identities); let addresses = identities @@ -116,16 +122,17 @@ pub fn build_amount(req: &AssertionBuildRequest, param: AchainableAmount) -> Res let mut balance = 0.0; let mut flag = false; if bname == AchainableNameAmount::BalanceUnderAmount { - balance = request_achainable_balance(addresses, achainable_param.clone())? - .parse::() - .map_err(|_| { - Error::RequestVCFailed( - Assertion::Achainable(achainable_param.clone()), - ErrorDetail::ParseError, - ) - })?; + balance = + request_achainable_balance(addresses, achainable_param.clone(), data_provider_config)? + .parse::() + .map_err(|_| { + Error::RequestVCFailed( + Assertion::Achainable(achainable_param.clone()), + ErrorDetail::ParseError, + ) + })?; } else { - flag = request_achainable(addresses, achainable_param.clone())?; + flag = request_achainable(addresses, achainable_param.clone(), data_provider_config)?; } match Credential::new(&req.who, &req.shard) { diff --git a/tee-worker/litentry/core/assertion-build/src/achainable/amount_holding.rs b/tee-worker/litentry/core/assertion-build/src/achainable/amount_holding.rs index f51033e6db..9b2f151acb 100644 --- a/tee-worker/litentry/core/assertion-build/src/achainable/amount_holding.rs +++ b/tee-worker/litentry/core/assertion-build/src/achainable/amount_holding.rs @@ -22,11 +22,12 @@ extern crate sgx_tstd as std; use crate::{achainable::request_achainable_balance, *}; use lc_credentials::litentry_profile::token_balance::TokenBalanceInfo; -use lc_data_providers::{ETokenAddress, TokenFromString}; +use lc_data_providers::{DataProviderConfig, ETokenAddress, TokenFromString}; pub fn build_amount_holding( req: &AssertionBuildRequest, param: AchainableAmountHolding, + data_provider_config: &DataProviderConfig, ) -> Result { let identities = transpose_identity(&req.identities); let addresses = identities @@ -36,14 +37,15 @@ pub fn build_amount_holding( let token = ETokenAddress::from_vec(param.clone().token.unwrap_or_default()); let achainable_param = AchainableParams::AmountHolding(param); - let balance = request_achainable_balance(addresses, achainable_param.clone())? - .parse::() - .map_err(|_| { - Error::RequestVCFailed( - Assertion::Achainable(achainable_param.clone()), - ErrorDetail::ParseError, - ) - })?; + let balance = + request_achainable_balance(addresses, achainable_param.clone(), data_provider_config)? + .parse::() + .map_err(|_| { + Error::RequestVCFailed( + Assertion::Achainable(achainable_param.clone()), + ErrorDetail::ParseError, + ) + })?; match Credential::new(&req.who, &req.shard) { Ok(mut credential_unsigned) => { diff --git a/tee-worker/litentry/core/assertion-build/src/achainable/amount_token.rs b/tee-worker/litentry/core/assertion-build/src/achainable/amount_token.rs index 77c2615edd..3c4ee1df34 100644 --- a/tee-worker/litentry/core/assertion-build/src/achainable/amount_token.rs +++ b/tee-worker/litentry/core/assertion-build/src/achainable/amount_token.rs @@ -29,7 +29,7 @@ use lc_credentials::{ litentry_profile::token_balance::TokenBalanceInfo, }; use lc_data_providers::{ - achainable_names::AchainableNameAmountToken, ETokenAddress, TokenFromString, + achainable_names::AchainableNameAmountToken, DataProviderConfig, ETokenAddress, TokenFromString, }; /// ERC20 Holder: USDC and others @@ -53,6 +53,7 @@ use lc_data_providers::{ pub fn build_amount_token( req: &AssertionBuildRequest, param: AchainableAmountToken, + data_provider_config: &DataProviderConfig, ) -> Result { debug!("Assertion Building AchainableAmountToken"); @@ -75,7 +76,8 @@ pub fn build_amount_token( })?; match amount_token_name { AchainableNameAmountToken::LITHoldingAmount => { - let lit_holding_amount = query_lit_holding_amount(&achainable_param, &identities)?; + let lit_holding_amount = + query_lit_holding_amount(&achainable_param, &identities, data_provider_config)?; credential.update_lit_holding_amount(lit_holding_amount); }, _ => { @@ -85,14 +87,18 @@ pub fn build_amount_token( .flat_map(|(_, addresses)| addresses) .collect::>(); let token = ETokenAddress::from_vec(param.token.unwrap_or_default()); - let balance = request_achainable_balance(addresses, achainable_param.clone())? - .parse::() - .map_err(|_| { - Error::RequestVCFailed( - Assertion::Achainable(achainable_param.clone()), - ErrorDetail::ParseError, - ) - })?; + let balance = request_achainable_balance( + addresses, + achainable_param.clone(), + data_provider_config, + )? + .parse::() + .map_err(|_| { + Error::RequestVCFailed( + Assertion::Achainable(achainable_param.clone()), + ErrorDetail::ParseError, + ) + })?; credential.update_token_balance(token, balance); }, diff --git a/tee-worker/litentry/core/assertion-build/src/achainable/amounts.rs b/tee-worker/litentry/core/assertion-build/src/achainable/amounts.rs index 7d6bb4c74a..826f423b40 100644 --- a/tee-worker/litentry/core/assertion-build/src/achainable/amounts.rs +++ b/tee-worker/litentry/core/assertion-build/src/achainable/amounts.rs @@ -21,8 +21,13 @@ compile_error!("feature \"std\" and feature \"sgx\" cannot be enabled at the sam extern crate sgx_tstd as std; use crate::{achainable::request_achainable, *}; +use lc_data_providers::DataProviderConfig; -pub fn build_amounts(req: &AssertionBuildRequest, param: AchainableAmounts) -> Result { +pub fn build_amounts( + req: &AssertionBuildRequest, + param: AchainableAmounts, + data_provider_config: &DataProviderConfig, +) -> Result { debug!("Assertion Achainable build_amounts, who: {:?}", account_id_to_string(&req.who)); let identities = transpose_identity(&req.identities); @@ -32,7 +37,7 @@ pub fn build_amounts(req: &AssertionBuildRequest, param: AchainableAmounts) -> R .collect::>(); let achainable_param = AchainableParams::Amounts(param); - let _flag = request_achainable(addresses, achainable_param.clone())?; + let _flag = request_achainable(addresses, achainable_param.clone(), data_provider_config)?; match Credential::new(&req.who, &req.shard) { Ok(mut _credential_unsigned) => Ok(_credential_unsigned), Err(e) => { diff --git a/tee-worker/litentry/core/assertion-build/src/achainable/basic.rs b/tee-worker/litentry/core/assertion-build/src/achainable/basic.rs index cc305089e1..e8310b5c4f 100644 --- a/tee-worker/litentry/core/assertion-build/src/achainable/basic.rs +++ b/tee-worker/litentry/core/assertion-build/src/achainable/basic.rs @@ -25,9 +25,13 @@ use crate::{ *, }; use lc_credentials::achainable::{bab_holder::UpdateBABHolder, uniswap_user::UpdateUniswapUser}; -use lc_data_providers::achainable_names::AchainableNameBasic; +use lc_data_providers::{achainable_names::AchainableNameBasic, DataProviderConfig}; -pub fn build_basic(req: &AssertionBuildRequest, param: AchainableBasic) -> Result { +pub fn build_basic( + req: &AssertionBuildRequest, + param: AchainableBasic, + data_provider_config: &DataProviderConfig, +) -> Result { debug!("Assertion Achainable building Basic"); let identities = transpose_identity(&req.identities); @@ -52,11 +56,13 @@ pub fn build_basic(req: &AssertionBuildRequest, param: AchainableBasic) -> Resul })?; match basic_name { AchainableNameBasic::UniswapV23User => { - let (v2_user, v3_user) = request_uniswap_v2_or_v3_user(addresses, achainable_param)?; + let (v2_user, v3_user) = + request_uniswap_v2_or_v3_user(addresses, achainable_param, data_provider_config)?; credential.update_uniswap_user(v2_user, v3_user); }, AchainableNameBasic::BABHolder => { - let is_bab_holder = request_achainable(addresses, achainable_param)?; + let is_bab_holder = + request_achainable(addresses, achainable_param, data_provider_config)?; credential.update_bab_holder(is_bab_holder); }, } diff --git a/tee-worker/litentry/core/assertion-build/src/achainable/between_percents.rs b/tee-worker/litentry/core/assertion-build/src/achainable/between_percents.rs index aeeec91e67..33334f063a 100644 --- a/tee-worker/litentry/core/assertion-build/src/achainable/between_percents.rs +++ b/tee-worker/litentry/core/assertion-build/src/achainable/between_percents.rs @@ -21,10 +21,12 @@ compile_error!("feature \"std\" and feature \"sgx\" cannot be enabled at the sam extern crate sgx_tstd as std; use crate::{achainable::request_achainable, *}; +use lc_data_providers::DataProviderConfig; pub fn build_between_percents( req: &AssertionBuildRequest, param: AchainableBetweenPercents, + data_provider_config: &DataProviderConfig, ) -> Result { debug!( "Assertion Achainable build_between_percents, who: {:?}", @@ -38,7 +40,7 @@ pub fn build_between_percents( .collect::>(); let achainable_param = AchainableParams::BetweenPercents(param.clone()); - let _flag = request_achainable(addresses, achainable_param)?; + let _flag = request_achainable(addresses, achainable_param, data_provider_config)?; match Credential::new(&req.who, &req.shard) { Ok(mut _credential_unsigned) => Ok(_credential_unsigned), Err(e) => { diff --git a/tee-worker/litentry/core/assertion-build/src/achainable/class_of_year.rs b/tee-worker/litentry/core/assertion-build/src/achainable/class_of_year.rs index 40e85cf65b..ae46cd4ae0 100644 --- a/tee-worker/litentry/core/assertion-build/src/achainable/class_of_year.rs +++ b/tee-worker/litentry/core/assertion-build/src/achainable/class_of_year.rs @@ -22,6 +22,7 @@ extern crate sgx_tstd as std; use crate::{achainable::request_achainable_classofyear, *}; use lc_credentials::Credential; +use lc_data_providers::DataProviderConfig; use lc_stf_task_sender::AssertionBuildRequest; use litentry_primitives::{AchainableClassOfYear, AchainableParams}; use log::debug; @@ -59,6 +60,7 @@ const VC_SUBJECT_TYPE: &str = "Account Class Of Year"; pub fn build_class_of_year( req: &AssertionBuildRequest, param: AchainableClassOfYear, + data_provider_config: &DataProviderConfig, ) -> Result { debug!("Assertion Achainable build_class_of_year, who: {:?}", account_id_to_string(&req.who)); let identities = transpose_identity(&req.identities); @@ -68,7 +70,8 @@ pub fn build_class_of_year( .collect::>(); let achainable_param = AchainableParams::ClassOfYear(param); - let (ret, created_date) = request_achainable_classofyear(addresses, achainable_param.clone())?; + let (ret, created_date) = + request_achainable_classofyear(addresses, achainable_param.clone(), data_provider_config)?; match Credential::new(&req.who, &req.shard) { Ok(mut credential_unsigned) => { credential_unsigned.add_subject_info(VC_SUBJECT_DESCRIPTION, VC_SUBJECT_TYPE); diff --git a/tee-worker/litentry/core/assertion-build/src/achainable/date.rs b/tee-worker/litentry/core/assertion-build/src/achainable/date.rs index 1ab7a298a0..485280a149 100644 --- a/tee-worker/litentry/core/assertion-build/src/achainable/date.rs +++ b/tee-worker/litentry/core/assertion-build/src/achainable/date.rs @@ -21,8 +21,13 @@ compile_error!("feature \"std\" and feature \"sgx\" cannot be enabled at the sam extern crate sgx_tstd as std; use crate::{achainable::request_achainable, *}; +use lc_data_providers::DataProviderConfig; -pub fn build_date(req: &AssertionBuildRequest, param: AchainableDate) -> Result { +pub fn build_date( + req: &AssertionBuildRequest, + param: AchainableDate, + data_provider_config: &DataProviderConfig, +) -> Result { debug!("Assertion Achainable build_date, who: {:?}", account_id_to_string(&req.who)); let identities = transpose_identity(&req.identities); @@ -32,7 +37,7 @@ pub fn build_date(req: &AssertionBuildRequest, param: AchainableDate) -> Result< .collect::>(); let achainable_param = AchainableParams::Date(param.clone()); - let _flag = request_achainable(addresses, achainable_param)?; + let _flag = request_achainable(addresses, achainable_param, data_provider_config)?; match Credential::new(&req.who, &req.shard) { Ok(mut _credential_unsigned) => Ok(_credential_unsigned), Err(e) => { diff --git a/tee-worker/litentry/core/assertion-build/src/achainable/date_interval.rs b/tee-worker/litentry/core/assertion-build/src/achainable/date_interval.rs index 9248aa13dc..411e808d76 100644 --- a/tee-worker/litentry/core/assertion-build/src/achainable/date_interval.rs +++ b/tee-worker/litentry/core/assertion-build/src/achainable/date_interval.rs @@ -22,10 +22,12 @@ extern crate sgx_tstd as std; use crate::{achainable::request_achainable, *}; use lc_credentials::Credential; +use lc_data_providers::DataProviderConfig; pub fn build_date_interval( req: &AssertionBuildRequest, param: AchainableDateInterval, + data_provider_config: &DataProviderConfig, ) -> Result { debug!("Assertion Achainable build_date_interval, who: {:?}", account_id_to_string(&req.who)); @@ -36,7 +38,7 @@ pub fn build_date_interval( .collect::>(); let achainable_param = AchainableParams::DateInterval(param.clone()); - let _flag = request_achainable(addresses, achainable_param)?; + let _flag = request_achainable(addresses, achainable_param, data_provider_config)?; match Credential::new(&req.who, &req.shard) { Ok(mut _credential_unsigned) => Ok(_credential_unsigned), Err(e) => { diff --git a/tee-worker/litentry/core/assertion-build/src/achainable/date_percent.rs b/tee-worker/litentry/core/assertion-build/src/achainable/date_percent.rs index 145610a30e..7c10a93e93 100644 --- a/tee-worker/litentry/core/assertion-build/src/achainable/date_percent.rs +++ b/tee-worker/litentry/core/assertion-build/src/achainable/date_percent.rs @@ -21,10 +21,12 @@ compile_error!("feature \"std\" and feature \"sgx\" cannot be enabled at the sam extern crate sgx_tstd as std; use crate::{achainable::request_achainable, *}; +use lc_data_providers::DataProviderConfig; pub fn build_date_percent( req: &AssertionBuildRequest, param: AchainableDatePercent, + data_provider_config: &DataProviderConfig, ) -> Result { debug!("Assertion Achainable build_date_percent, who: {:?}", account_id_to_string(&req.who)); @@ -35,7 +37,7 @@ pub fn build_date_percent( .collect::>(); let achainable_param = AchainableParams::DatePercent(param.clone()); - let _flag = request_achainable(addresses, achainable_param)?; + let _flag = request_achainable(addresses, achainable_param, data_provider_config)?; match Credential::new(&req.who, &req.shard) { Ok(mut _credential_unsigned) => Ok(_credential_unsigned), Err(e) => { diff --git a/tee-worker/litentry/core/assertion-build/src/achainable/mirror.rs b/tee-worker/litentry/core/assertion-build/src/achainable/mirror.rs index b9761e9e30..8623c759ad 100644 --- a/tee-worker/litentry/core/assertion-build/src/achainable/mirror.rs +++ b/tee-worker/litentry/core/assertion-build/src/achainable/mirror.rs @@ -23,7 +23,7 @@ extern crate sgx_tstd as std; use super::request_achainable; use crate::*; use lc_credentials::{litentry_profile::mirror::MirrorInfo, Credential}; -use lc_data_providers::achainable_names::AchainableNameMirror; +use lc_data_providers::{achainable_names::AchainableNameMirror, DataProviderConfig}; use litentry_primitives::AchainableMirror; // Request Inputs @@ -46,7 +46,11 @@ use litentry_primitives::AchainableMirror; // "includeMetadata": true // } -pub fn build_on_mirror(req: &AssertionBuildRequest, param: AchainableMirror) -> Result { +pub fn build_on_mirror( + req: &AssertionBuildRequest, + param: AchainableMirror, + data_provider_config: &DataProviderConfig, +) -> Result { let identities = transpose_identity(&req.identities); let addresses = identities .into_iter() @@ -60,7 +64,7 @@ pub fn build_on_mirror(req: &AssertionBuildRequest, param: AchainableMirror) -> e.into_error_detail(), ) })?; - let value = request_achainable(addresses, achainable_param.clone())?; + let value = request_achainable(addresses, achainable_param.clone(), data_provider_config)?; match Credential::new(&req.who, &req.shard) { Ok(mut credential_unsigned) => { credential_unsigned.update_mirror(mtype, value); diff --git a/tee-worker/litentry/core/assertion-build/src/achainable/mod.rs b/tee-worker/litentry/core/assertion-build/src/achainable/mod.rs index 4d765c556a..ca1c07fced 100644 --- a/tee-worker/litentry/core/assertion-build/src/achainable/mod.rs +++ b/tee-worker/litentry/core/assertion-build/src/achainable/mod.rs @@ -32,7 +32,7 @@ use lc_data_providers::{ AchainableClient, AchainableTagDeFi, HoldingAmount, Params, ParamsBasicTypeWithAmountToken, }, achainable_names::{AchainableNameAmountToken, GetAchainableName}, - DataProviderConfigReader, ReadDataProviderConfig, LIT_TOKEN_ADDRESS, + DataProviderConfig, LIT_TOKEN_ADDRESS, }; use lc_stf_task_sender::AssertionBuildRequest; use litentry_primitives::AchainableParams; @@ -51,29 +51,41 @@ pub mod date_percent; pub mod mirror; pub mod token; -pub fn build(req: &AssertionBuildRequest, param: AchainableParams) -> Result { +pub fn build( + req: &AssertionBuildRequest, + param: AchainableParams, + data_provider_config: &DataProviderConfig, +) -> Result { match param { - AchainableParams::AmountHolding(param) => build_amount_holding(req, param), - AchainableParams::AmountToken(param) => build_amount_token(req, param), - AchainableParams::Amount(param) => build_amount(req, param), - AchainableParams::Amounts(param) => build_amounts(req, param), - AchainableParams::Basic(param) => build_basic(req, param), - AchainableParams::BetweenPercents(param) => build_between_percents(req, param), - AchainableParams::ClassOfYear(param) => build_class_of_year(req, param), - AchainableParams::DateInterval(param) => build_date_interval(req, param), - AchainableParams::DatePercent(param) => build_date_percent(req, param), - AchainableParams::Date(param) => build_date(req, param), - AchainableParams::Token(param) => build_token(req, param), - AchainableParams::Mirror(param) => build_on_mirror(req, param), + AchainableParams::AmountHolding(param) => + build_amount_holding(req, param, data_provider_config), + AchainableParams::AmountToken(param) => + build_amount_token(req, param, data_provider_config), + AchainableParams::Amount(param) => build_amount(req, param, data_provider_config), + AchainableParams::Amounts(param) => build_amounts(req, param, data_provider_config), + AchainableParams::Basic(param) => build_basic(req, param, data_provider_config), + AchainableParams::BetweenPercents(param) => + build_between_percents(req, param, data_provider_config), + AchainableParams::ClassOfYear(param) => + build_class_of_year(req, param, data_provider_config), + AchainableParams::DateInterval(param) => + build_date_interval(req, param, data_provider_config), + AchainableParams::DatePercent(param) => + build_date_percent(req, param, data_provider_config), + AchainableParams::Date(param) => build_date(req, param, data_provider_config), + AchainableParams::Token(param) => build_token(req, param, data_provider_config), + AchainableParams::Mirror(param) => build_on_mirror(req, param, data_provider_config), } } -pub fn request_achainable(addresses: Vec, param: AchainableParams) -> Result { +pub fn request_achainable( + addresses: Vec, + param: AchainableParams, + data_provider_config: &DataProviderConfig, +) -> Result { let request_param = Params::try_from(param.clone())?; - let data_provider_config = DataProviderConfigReader::read() - .map_err(|e| Error::RequestVCFailed(Assertion::Achainable(param.clone()), e))?; - let mut client: AchainableClient = AchainableClient::new(&data_provider_config); + let mut client: AchainableClient = AchainableClient::new(data_provider_config); for address in &addresses { let ret = client.query_system_label(address, request_param.clone()).map_err(|e| { @@ -93,12 +105,11 @@ pub fn request_achainable(addresses: Vec, param: AchainableParams) -> Re pub fn request_uniswap_v2_or_v3_user( addresses: Vec, param: AchainableParams, + data_provider_config: &DataProviderConfig, ) -> Result<(bool, bool)> { let _request_param = Params::try_from(param.clone())?; - let data_provider_config = DataProviderConfigReader::read() - .map_err(|e| Error::RequestVCFailed(Assertion::Achainable(param.clone()), e))?; - let mut client: AchainableClient = AchainableClient::new(&data_provider_config); + let mut client: AchainableClient = AchainableClient::new(data_provider_config); let mut v2_user = false; let mut v3_user = false; @@ -119,12 +130,10 @@ const INVALID_CLASS_OF_YEAR: &str = "Invalid"; pub fn request_achainable_classofyear( addresses: Vec, param: AchainableParams, + data_provider_config: &DataProviderConfig, ) -> Result<(bool, String)> { let request_param = Params::try_from(param.clone())?; - - let data_provider_config = DataProviderConfigReader::read() - .map_err(|e| Error::RequestVCFailed(Assertion::Achainable(param.clone()), e))?; - let mut client: AchainableClient = AchainableClient::new(&data_provider_config); + let mut client: AchainableClient = AchainableClient::new(data_provider_config); let mut longest_created_year = INVALID_CLASS_OF_YEAR.into(); for address in &addresses { @@ -148,12 +157,10 @@ pub fn request_achainable_classofyear( pub fn request_achainable_balance( addresses: Vec, param: AchainableParams, + data_provider_config: &DataProviderConfig, ) -> Result { let request_param = Params::try_from(param.clone())?; - - let data_provider_config = DataProviderConfigReader::read() - .map_err(|e| Error::RequestVCFailed(Assertion::Achainable(param.clone()), e))?; - let mut client: AchainableClient = AchainableClient::new(&data_provider_config); + let mut client: AchainableClient = AchainableClient::new(data_provider_config); let balance = client.holding_amount(addresses, request_param).map_err(|e| { Error::RequestVCFailed(Assertion::Achainable(param.clone()), e.into_error_detail()) })?; @@ -164,12 +171,10 @@ pub fn request_achainable_balance( pub fn query_lit_holding_amount( aparam: &AchainableParams, identities: &Vec<(Web3Network, Vec)>, + data_provider_config: &DataProviderConfig, ) -> Result { let mut total_lit_balance = 0_f64; - - let data_provider_config = DataProviderConfigReader::read() - .map_err(|e| Error::RequestVCFailed(Assertion::Achainable(aparam.clone()), e))?; - let mut client: AchainableClient = AchainableClient::new(&data_provider_config); + let mut client: AchainableClient = AchainableClient::new(data_provider_config); for (network, addresses) in identities { let (q_name, q_network, q_token) = if *network == Web3Network::Ethereum { diff --git a/tee-worker/litentry/core/assertion-build/src/achainable/token.rs b/tee-worker/litentry/core/assertion-build/src/achainable/token.rs index 36e2cca667..6df95c7e6e 100644 --- a/tee-worker/litentry/core/assertion-build/src/achainable/token.rs +++ b/tee-worker/litentry/core/assertion-build/src/achainable/token.rs @@ -21,8 +21,13 @@ compile_error!("feature \"std\" and feature \"sgx\" cannot be enabled at the sam extern crate sgx_tstd as std; use crate::{achainable::request_achainable, *}; +use lc_data_providers::DataProviderConfig; -pub fn build_token(req: &AssertionBuildRequest, param: AchainableToken) -> Result { +pub fn build_token( + req: &AssertionBuildRequest, + param: AchainableToken, + data_provider_config: &DataProviderConfig, +) -> Result { debug!("Assertion Achainable build_token, who: {:?}", account_id_to_string(&req.who)); let identities = transpose_identity(&req.identities); @@ -32,7 +37,7 @@ pub fn build_token(req: &AssertionBuildRequest, param: AchainableToken) -> Resul .collect::>(); let achainable_param = AchainableParams::Token(param.clone()); - let _flag = request_achainable(addresses, achainable_param)?; + let _flag = request_achainable(addresses, achainable_param, data_provider_config)?; match Credential::new(&req.who, &req.shard) { Ok(mut _credential_unsigned) => Ok(_credential_unsigned), Err(e) => { diff --git a/tee-worker/litentry/core/assertion-build/src/brc20/amount_holder.rs b/tee-worker/litentry/core/assertion-build/src/brc20/amount_holder.rs index 09be442d97..93a07ef818 100644 --- a/tee-worker/litentry/core/assertion-build/src/brc20/amount_holder.rs +++ b/tee-worker/litentry/core/assertion-build/src/brc20/amount_holder.rs @@ -22,9 +22,12 @@ extern crate sgx_tstd as std; use crate::*; use lc_credentials::brc20::amount_holder::BRC20AmountHolderCredential; -use lc_data_providers::geniidata::GeniidataClient; +use lc_data_providers::{geniidata::GeniidataClient, DataProviderConfig}; -pub fn build(req: &AssertionBuildRequest) -> Result { +pub fn build( + req: &AssertionBuildRequest, + data_provider_config: &DataProviderConfig, +) -> Result { let identities = transpose_identity(&req.identities); let addresses = identities .into_iter() @@ -35,7 +38,7 @@ pub fn build(req: &AssertionBuildRequest) -> Result { error!("Generate unsigned credential failed {:?}", e); Error::RequestVCFailed(Assertion::BRC20AmountHolder, e.into_error_detail()) })?; - let mut client = GeniidataClient::new() + let mut client = GeniidataClient::new(data_provider_config) .map_err(|e| Error::RequestVCFailed(Assertion::BRC20AmountHolder, e))?; let response = client.create_brc20_amount_holder_sum(addresses).map_err(|e| { Error::RequestVCFailed( diff --git a/tee-worker/litentry/core/assertion-build/src/generic_discord_role.rs b/tee-worker/litentry/core/assertion-build/src/generic_discord_role.rs index 3b16bebcea..002f111cf6 100644 --- a/tee-worker/litentry/core/assertion-build/src/generic_discord_role.rs +++ b/tee-worker/litentry/core/assertion-build/src/generic_discord_role.rs @@ -22,19 +22,23 @@ extern crate sgx_tstd as std; use crate::*; use lc_credentials::{generic_discord_role::GenericDiscordRoleAssertionUpdate, Credential}; -use lc_data_providers::{ - discord_litentry::DiscordLitentryClient, DataProviderConfigReader, ReadDataProviderConfig, -}; +use lc_data_providers::{discord_litentry::DiscordLitentryClient, DataProviderConfig}; use lc_stf_task_sender::AssertionBuildRequest; use litentry_primitives::{ContestType, GenericDiscordRoleType, SoraQuizType}; - -pub fn build(req: &AssertionBuildRequest, rtype: GenericDiscordRoleType) -> Result { - let role_id = get_generic_discord_role_id(&rtype).map_err(|error_detail| { - Error::RequestVCFailed(Assertion::GenericDiscordRole(rtype.clone()), error_detail) - })?; +use std::string::ToString; + +pub fn build( + req: &AssertionBuildRequest, + rtype: GenericDiscordRoleType, + data_provider_config: &DataProviderConfig, +) -> Result { + let role_id = + get_generic_discord_role_id(&rtype, data_provider_config).map_err(|error_detail| { + Error::RequestVCFailed(Assertion::GenericDiscordRole(rtype.clone()), error_detail) + })?; let mut has_role_value = false; - let mut client = DiscordLitentryClient::new(); + let mut client = DiscordLitentryClient::new(&data_provider_config.discord_litentry_url); for identity in &req.identities { if let Identity::Discord(address) = &identity.0 { let resp = @@ -69,18 +73,20 @@ pub fn build(req: &AssertionBuildRequest, rtype: GenericDiscordRoleType) -> Resu fn get_generic_discord_role_id( rtype: &GenericDiscordRoleType, + data_provider_config: &DataProviderConfig, ) -> core::result::Result { - let data_provider_config = DataProviderConfigReader::read()?; match rtype { GenericDiscordRoleType::Contest(ctype) => match ctype { - ContestType::Legend => Ok(data_provider_config.contest_legend_discord_role_id), - ContestType::Popularity => Ok(data_provider_config.contest_popularity_discord_role_id), + ContestType::Legend => + Ok(data_provider_config.contest_legend_discord_role_id.to_string()), + ContestType::Popularity => + Ok(data_provider_config.contest_popularity_discord_role_id.to_string()), ContestType::Participant => - Ok(data_provider_config.contest_participant_discord_role_id), + Ok(data_provider_config.contest_participant_discord_role_id.to_string()), }, GenericDiscordRoleType::SoraQuiz(qtype) => match qtype { - SoraQuizType::Attendee => Ok(data_provider_config.sora_quiz_attendee_id), - SoraQuizType::Master => Ok(data_provider_config.sora_quiz_master_id), + SoraQuizType::Attendee => Ok(data_provider_config.sora_quiz_attendee_id.to_string()), + SoraQuizType::Master => Ok(data_provider_config.sora_quiz_master_id.to_string()), }, } } @@ -90,7 +96,7 @@ mod tests { use crate::{generic_discord_role::build, AccountId, AssertionBuildRequest}; use itp_stf_primitives::types::ShardIdentifier; use lc_credentials::assertion_logic::{AssertionLogic, Op}; - use lc_data_providers::GLOBAL_DATA_PROVIDER_CONFIG; + use lc_data_providers::DataProviderConfig; use lc_mock_server::run; use litentry_primitives::{ Assertion, ContestType, GenericDiscordRoleType, Identity, IdentityNetworkTuple, @@ -99,23 +105,20 @@ mod tests { use log; use std::{vec, vec::Vec}; - fn init() { + fn init() -> DataProviderConfig { let _ = env_logger::builder().is_test(true).try_init(); let url = run(0).unwrap(); - GLOBAL_DATA_PROVIDER_CONFIG.write().unwrap().set_discord_litentry_url(url); - GLOBAL_DATA_PROVIDER_CONFIG - .write() - .unwrap() - .set_contest_legend_discord_role_id("1034083718425493544".to_string()); - GLOBAL_DATA_PROVIDER_CONFIG - .write() - .unwrap() - .set_sora_quiz_attendee_id("1034083718425493544".to_string()); + let mut data_provider_conifg = DataProviderConfig::new(); + + data_provider_conifg.set_discord_litentry_url(url); + data_provider_conifg.set_contest_legend_discord_role_id("1034083718425493544".to_string()); + data_provider_conifg.set_sora_quiz_attendee_id("1034083718425493544".to_string()); + data_provider_conifg } #[test] fn build_contest_role_works() { - init(); + let data_provider_config = init(); let handler_vec: Vec = "againstwar".to_string().as_bytes().to_vec(); @@ -137,7 +140,11 @@ mod tests { req_ext_hash: Default::default(), }; - match build(&req, GenericDiscordRoleType::Contest(ContestType::Legend)) { + match build( + &req, + GenericDiscordRoleType::Contest(ContestType::Legend), + &data_provider_config, + ) { Ok(credential) => { log::info!("build GenericDiscordRole Contest done"); assert_eq!( @@ -158,7 +165,7 @@ mod tests { #[test] fn build_sora_quiz_role_works() { - init(); + let data_provider_config = init(); let handler_vec: Vec = "ericzhang.eth".to_string().as_bytes().to_vec(); @@ -180,7 +187,11 @@ mod tests { req_ext_hash: Default::default(), }; - match build(&req, GenericDiscordRoleType::SoraQuiz(SoraQuizType::Attendee)) { + match build( + &req, + GenericDiscordRoleType::SoraQuiz(SoraQuizType::Attendee), + &data_provider_config, + ) { Ok(credential) => { log::info!("build GenericDiscordRole SoraQuiz done"); assert_eq!(*(credential.credential_subject.values.first().unwrap()), false); diff --git a/tee-worker/litentry/core/assertion-build/src/holding_time.rs b/tee-worker/litentry/core/assertion-build/src/holding_time.rs index 26efeb5eff..5620c2c78c 100644 --- a/tee-worker/litentry/core/assertion-build/src/holding_time.rs +++ b/tee-worker/litentry/core/assertion-build/src/holding_time.rs @@ -24,8 +24,7 @@ use crate::*; use lc_credentials::achainable::amount_holding_time::AchainableAmountHoldingTimeUpdate; use lc_data_providers::{ achainable::{AchainableClient, AchainableHolder, ParamsBasicTypeWithAmountHolding}, - vec_to_string, DataProviderConfigReader, ReadDataProviderConfig, LIT_TOKEN_ADDRESS, - WBTC_TOKEN_ADDRESS, + vec_to_string, DataProviderConfig, LIT_TOKEN_ADDRESS, WBTC_TOKEN_ADDRESS, }; use litentry_primitives::AmountHoldingTimeType; use std::string::ToString; @@ -78,13 +77,15 @@ pub fn build( req: &AssertionBuildRequest, htype: AmountHoldingTimeType, min_balance: ParameterString, + data_provider_config: &DataProviderConfig, ) -> Result { debug!("Assertion A4 build, who: {:?}", account_id_to_string(&req.who)); let q_min_balance = pre_build(&htype, &min_balance)?; let identities = transpose_identity(&req.identities); - let (is_hold, optimal_hold_index) = do_build(identities, &htype, &q_min_balance) - .map_err(|e| emit_error(&htype, &min_balance, e))?; + let (is_hold, optimal_hold_index) = + do_build(identities, &htype, &q_min_balance, data_provider_config) + .map_err(|e| emit_error(&htype, &min_balance, e))?; generate_vc(req, &htype, &q_min_balance, is_hold, optimal_hold_index) .map_err(|e| emit_error(&htype, &min_balance, e)) @@ -107,9 +108,9 @@ fn do_build( identities: Vec<(Web3Network, Vec)>, htype: &AmountHoldingTimeType, q_min_balance: &str, + data_provider_config: &DataProviderConfig, ) -> core::result::Result<(bool, usize), ErrorDetail> { - let data_provider_config = DataProviderConfigReader::read()?; - let mut client = AchainableClient::new(&data_provider_config); + let mut client = AchainableClient::new(data_provider_config); let mut is_hold = false; let mut optimal_hold_index = usize::MAX; @@ -233,19 +234,20 @@ fn match_token_address(htype: &AmountHoldingTimeType, network: &Web3Network) -> #[cfg(test)] mod tests { use super::*; - use lc_data_providers::GLOBAL_DATA_PROVIDER_CONFIG; use lc_mock_server::run; use litentry_primitives::{AmountHoldingTimeType, Web3Network}; - fn init() { + fn init() -> DataProviderConfig { let _ = env_logger::builder().is_test(true).try_init(); let url = run(0).unwrap(); - GLOBAL_DATA_PROVIDER_CONFIG.write().unwrap().set_achainable_url(url); + let mut data_provider_config = DataProviderConfig::new(); + data_provider_config.set_achainable_url(url); + data_provider_config } #[test] fn do_build_lit_works() { - init(); + let data_provider_config = init(); let identities = vec![( Web3Network::Litentry, @@ -255,13 +257,14 @@ mod tests { let htype = AmountHoldingTimeType::LIT; let q_min_balance = "10".to_string(); - let (is_hold, _optimal_hold_index) = do_build(identities, &htype, &q_min_balance).unwrap(); + let (is_hold, _optimal_hold_index) = + do_build(identities, &htype, &q_min_balance, &data_provider_config).unwrap(); assert!(is_hold); } #[test] fn do_build_dot_works() { - init(); + let data_provider_config = init(); let identities = vec![( Web3Network::Polkadot, @@ -271,13 +274,13 @@ mod tests { let q_min_balance = "10".to_string(); let (is_hold, _optimal_hold_index) = - do_build(identities, &dot_type, &q_min_balance).unwrap(); + do_build(identities, &dot_type, &q_min_balance, &data_provider_config).unwrap(); assert!(is_hold); } #[test] fn do_build_wbtc_works() { - init(); + let data_provider_config = init(); let identities = vec![( Web3Network::Ethereum, @@ -289,13 +292,14 @@ mod tests { let htype = AmountHoldingTimeType::WBTC; let q_min_balance = "10".to_string(); - let (is_hold, _optimal_hold_index) = do_build(identities, &htype, &q_min_balance).unwrap(); + let (is_hold, _optimal_hold_index) = + do_build(identities, &htype, &q_min_balance, &data_provider_config).unwrap(); assert!(is_hold); } #[test] fn do_build_non_hold_works() { - init(); + let data_provider_config = init(); let identities = vec![( Web3Network::Ethereum, @@ -304,7 +308,8 @@ mod tests { let htype = AmountHoldingTimeType::LIT; let q_min_balance = "10".to_string(); - let (is_hold, optimal_hold_index) = do_build(identities, &htype, &q_min_balance).unwrap(); + let (is_hold, optimal_hold_index) = + do_build(identities, &htype, &q_min_balance, &data_provider_config).unwrap(); assert!(!is_hold); assert_eq!(optimal_hold_index, 0); } diff --git a/tee-worker/litentry/core/assertion-build/src/nodereal/amount_holding/evm_amount_holding.rs b/tee-worker/litentry/core/assertion-build/src/nodereal/amount_holding/evm_amount_holding.rs index 30759ff7a7..0c05d1d15c 100644 --- a/tee-worker/litentry/core/assertion-build/src/nodereal/amount_holding/evm_amount_holding.rs +++ b/tee-worker/litentry/core/assertion-build/src/nodereal/amount_holding/evm_amount_holding.rs @@ -33,16 +33,17 @@ use lc_data_providers::{ nodereal_jsonrpc::{ FungibleApiList, GetTokenBalance20Param, NoderealChain, NoderealJsonrpcClient, }, - Error as DataProviderError, + DataProviderConfig, Error as DataProviderError, }; use litentry_primitives::EVMTokenType; fn get_holding_balance( token_type: EVMTokenType, addresses: Vec<(Web3Network, String)>, + data_provider_config: &DataProviderConfig, ) -> result::Result { - let mut eth_client = NoderealJsonrpcClient::new(NoderealChain::Eth); - let mut bsc_client = NoderealJsonrpcClient::new(NoderealChain::Bsc); + let mut eth_client = NoderealJsonrpcClient::new(NoderealChain::Eth, data_provider_config); + let mut bsc_client = NoderealJsonrpcClient::new(NoderealChain::Bsc, data_provider_config); let mut total_balance = 0_f64; let decimals = token_type.get_decimals(); @@ -73,7 +74,11 @@ fn get_holding_balance( Ok(total_balance / decimals) } -pub fn build(req: &AssertionBuildRequest, token_type: EVMTokenType) -> Result { +pub fn build( + req: &AssertionBuildRequest, + token_type: EVMTokenType, + data_provider_config: &DataProviderConfig, +) -> Result { debug!("evm amount holding: {:?}", token_type); let identities: Vec<(Web3Network, Vec)> = transpose_identity(&req.identities); @@ -85,14 +90,15 @@ pub fn build(req: &AssertionBuildRequest, token_type: EVMTokenType) -> Result>(); - let result = get_holding_balance(token_type.clone(), addresses).map_err(|e| { - Error::RequestVCFailed( - Assertion::EVMAmountHolding(token_type.clone()), - ErrorDetail::DataProviderError(ErrorString::truncate_from( - format!("{e:?}").as_bytes().to_vec(), - )), - ) - }); + let result = + get_holding_balance(token_type.clone(), addresses, data_provider_config).map_err(|e| { + Error::RequestVCFailed( + Assertion::EVMAmountHolding(token_type.clone()), + ErrorDetail::DataProviderError(ErrorString::truncate_from( + format!("{e:?}").as_bytes().to_vec(), + )), + ) + }); match result { Ok(value) => match Credential::new(&req.who, &req.shard) { @@ -118,7 +124,6 @@ mod tests { use itp_stf_primitives::types::ShardIdentifier; use itp_utils::hex::decode_hex; use lc_credentials::assertion_logic::{AssertionLogic, Op}; - use lc_data_providers::GLOBAL_DATA_PROVIDER_CONFIG; use lc_mock_server::run; fn create_ton_token_assertion_logic() -> Box { @@ -160,22 +165,19 @@ mod tests { }) } - fn init() { + fn init() -> DataProviderConfig { let _ = env_logger::builder().is_test(true).try_init(); let url = run(0).unwrap() + "/nodereal_jsonrpc/"; - GLOBAL_DATA_PROVIDER_CONFIG - .write() - .unwrap() - .set_nodereal_api_key("d416f55179dbd0e45b1a8ed030e3".into()); - GLOBAL_DATA_PROVIDER_CONFIG - .write() - .unwrap() - .set_nodereal_api_chain_network_url(url); + let mut data_provider_config = DataProviderConfig::default(); + + data_provider_config.set_nodereal_api_key("d416f55179dbd0e45b1a8ed030e3".into()); + data_provider_config.set_nodereal_api_chain_network_url(url); + data_provider_config } #[test] fn build_evm_amount_holding_works() { - init(); + let data_provider_config = init(); let identities: Vec = vec![ (Identity::Evm([0; 20].into()), vec![Web3Network::Ethereum]), (Identity::Evm([0; 20].into()), vec![Web3Network::Ethereum, Web3Network::Bsc]), @@ -194,7 +196,7 @@ mod tests { req_ext_hash: Default::default(), }; - match build(&req, EVMTokenType::Ton) { + match build(&req, EVMTokenType::Ton, &data_provider_config) { Ok(credential) => { log::info!("build EVMAmount holding done"); assert_eq!( @@ -226,7 +228,7 @@ mod tests { #[test] fn build_evm_amount_holding_lt_min_works() { - init(); + let data_provider_config = init(); let address = decode_hex("0x85be4e2ccc9c85be8783798b6e8a101bdac6467f".as_bytes().to_vec()) .unwrap() .as_slice() @@ -248,7 +250,7 @@ mod tests { req_ext_hash: Default::default(), }; - match build(&req, EVMTokenType::Ton) { + match build(&req, EVMTokenType::Ton, &data_provider_config) { Ok(credential) => { log::info!("build EVMAmount holding done"); assert_eq!( @@ -280,7 +282,7 @@ mod tests { #[test] fn build_evm_amount_holding_gte_max_works() { - init(); + let data_provider_config = init(); let address = decode_hex("0x90d53026a47ac20609accc3f2ddc9fb9b29bb310".as_bytes().to_vec()) .unwrap() .as_slice() @@ -302,7 +304,7 @@ mod tests { req_ext_hash: Default::default(), }; - match build(&req, EVMTokenType::Ton) { + match build(&req, EVMTokenType::Ton, &data_provider_config) { Ok(credential) => { log::info!("build EVMAmount holding done"); assert_eq!( diff --git a/tee-worker/litentry/core/assertion-build/src/nodereal/bnb_domain/bnb_digit_domain_club_amount.rs b/tee-worker/litentry/core/assertion-build/src/nodereal/bnb_domain/bnb_digit_domain_club_amount.rs index bf3b296029..a0d7854d32 100644 --- a/tee-worker/litentry/core/assertion-build/src/nodereal/bnb_domain/bnb_digit_domain_club_amount.rs +++ b/tee-worker/litentry/core/assertion-build/src/nodereal/bnb_domain/bnb_digit_domain_club_amount.rs @@ -23,11 +23,13 @@ extern crate sgx_tstd as std; use super::{BnbDomainInfo, BnbDomainInfoInterface}; use crate::*; use lc_credentials::nodereal::bnb_domain::bnb_digit_domain_club_amount::UpdateDigitDomainClubAmountCredential; +use lc_data_providers::DataProviderConfig; use litentry_primitives::BnbDigitDomainType; pub fn build( req: &AssertionBuildRequest, digit_domain_type: BnbDigitDomainType, + data_provider_config: &DataProviderConfig, ) -> Result { debug!("building digit_domain credential: {:?}", digit_domain_type); @@ -37,7 +39,11 @@ pub fn build( .flat_map(|(_, addresses)| addresses) .collect::>(); - let amount = BnbDomainInfo.get_bnb_digit_domain_club_amount(&addresses, &digit_domain_type)?; + let amount = BnbDomainInfo.get_bnb_digit_domain_club_amount( + &addresses, + &digit_domain_type, + data_provider_config, + )?; match Credential::new(&req.who, &req.shard) { Ok(mut credential_unsigned) => { credential_unsigned.update_digit_domain_club_amount(&digit_domain_type, amount); diff --git a/tee-worker/litentry/core/assertion-build/src/nodereal/bnb_domain/bnb_domain_holding_amount.rs b/tee-worker/litentry/core/assertion-build/src/nodereal/bnb_domain/bnb_domain_holding_amount.rs index a347770ddb..d765634f0c 100644 --- a/tee-worker/litentry/core/assertion-build/src/nodereal/bnb_domain/bnb_domain_holding_amount.rs +++ b/tee-worker/litentry/core/assertion-build/src/nodereal/bnb_domain/bnb_domain_holding_amount.rs @@ -21,11 +21,15 @@ compile_error!("feature \"std\" and feature \"sgx\" cannot be enabled at the sam extern crate sgx_tstd as std; use lc_credentials::nodereal::bnb_domain::bnb_domain_holding_amount::UpdateBnbDomainHoldingAmountCredential; +use lc_data_providers::DataProviderConfig; use super::{BnbDomainInfo, BnbDomainInfoInterface}; use crate::*; -pub fn build(req: &AssertionBuildRequest) -> Result { +pub fn build( + req: &AssertionBuildRequest, + data_provider_config: &DataProviderConfig, +) -> Result { debug!("bnb domain holding amount"); let identities = transpose_identity(&req.identities); @@ -34,7 +38,7 @@ pub fn build(req: &AssertionBuildRequest) -> Result { .flat_map(|(_, addresses)| addresses) .collect::>(); - let amount = BnbDomainInfo.get_bnb_domain_holding_amount(&addresses)?; + let amount = BnbDomainInfo.get_bnb_domain_holding_amount(&addresses, data_provider_config)?; match Credential::new(&req.who, &req.shard) { Ok(mut credential_unsigned) => { credential_unsigned.update_bnb_holding_amount(amount); diff --git a/tee-worker/litentry/core/assertion-build/src/nodereal/bnb_domain/mod.rs b/tee-worker/litentry/core/assertion-build/src/nodereal/bnb_domain/mod.rs index fe3f3d4f07..ec47649d60 100644 --- a/tee-worker/litentry/core/assertion-build/src/nodereal/bnb_domain/mod.rs +++ b/tee-worker/litentry/core/assertion-build/src/nodereal/bnb_domain/mod.rs @@ -26,7 +26,7 @@ pub mod bnb_domain_holding_amount; use crate::*; use lc_data_providers::{ nodereal::{BnbDomainApiList, DomainInfo, NoderealClient}, - DataProviderConfigReader, ReadDataProviderConfig, + DataProviderConfig, }; use litentry_primitives::BnbDigitDomainType; use serde::{Deserialize, Serialize}; @@ -37,26 +37,35 @@ impl BnbDomainInfo { fn get_bnb_domain_data_by_owners( &self, owners: &[String], + config: &DataProviderConfig, ) -> core::result::Result { - let config = DataProviderConfigReader::read()?; - let mut client = NoderealClient::new(&config); + let mut client = NoderealClient::new(config); client.by_owners(owners).map_err(|e| e.into_error_detail()) } } pub trait BnbDomainInfoInterface { - fn get_bnb_domain_holding_amount(&self, addresses: &[String]) -> Result; + fn get_bnb_domain_holding_amount( + &self, + addresses: &[String], + config: &DataProviderConfig, + ) -> Result; fn get_bnb_digit_domain_club_amount( &self, owners: &[String], digit_domain_type: &BnbDigitDomainType, + data_provider_config: &DataProviderConfig, ) -> Result; } impl BnbDomainInfoInterface for BnbDomainInfo { - fn get_bnb_domain_holding_amount(&self, owners: &[String]) -> Result { + fn get_bnb_domain_holding_amount( + &self, + owners: &[String], + data_provider_config: &DataProviderConfig, + ) -> Result { let response = self - .get_bnb_domain_data_by_owners(owners) + .get_bnb_domain_data_by_owners(owners, data_provider_config) .map_err(|e| Error::RequestVCFailed(Assertion::BnbDomainHolding, e))?; let owned_domains: Domains = Domains::from_value(&response) @@ -69,10 +78,12 @@ impl BnbDomainInfoInterface for BnbDomainInfo { &self, owners: &[String], digit_domain_type: &BnbDigitDomainType, + data_provider_config: &DataProviderConfig, ) -> Result { - let response = self.get_bnb_domain_data_by_owners(owners).map_err(|e| { - Error::RequestVCFailed(Assertion::BnbDigitDomainClub(digit_domain_type.clone()), e) - })?; + let response = + self.get_bnb_domain_data_by_owners(owners, data_provider_config).map_err(|e| { + Error::RequestVCFailed(Assertion::BnbDigitDomainClub(digit_domain_type.clone()), e) + })?; let owned_domains: Domains = Domains::from_value(&response).map_err(|e| { Error::RequestVCFailed(Assertion::BnbDigitDomainClub(digit_domain_type.clone()), e) diff --git a/tee-worker/litentry/core/assertion-build/src/nodereal/crypto_summary/mod.rs b/tee-worker/litentry/core/assertion-build/src/nodereal/crypto_summary/mod.rs index 240374d32d..c80f4736ea 100644 --- a/tee-worker/litentry/core/assertion-build/src/nodereal/crypto_summary/mod.rs +++ b/tee-worker/litentry/core/assertion-build/src/nodereal/crypto_summary/mod.rs @@ -23,12 +23,16 @@ extern crate sgx_tstd as std; use lc_credentials::nodereal::crypto_summary::{ summary::CryptoSummaryCredentialUpdate, CryptoSummaryClient, }; +use lc_data_providers::DataProviderConfig; use crate::*; -pub fn build(req: &AssertionBuildRequest) -> Result { +pub fn build( + req: &AssertionBuildRequest, + data_provider_config: &DataProviderConfig, +) -> Result { let identities = transpose_identity(&req.identities); - let (txs, summary) = CryptoSummaryClient::new() + let (txs, summary) = CryptoSummaryClient::new(data_provider_config) .logic(&identities) .map_err(|e| Error::RequestVCFailed(Assertion::CryptoSummary, e))?; diff --git a/tee-worker/litentry/core/assertion-build/src/nodereal/nft_holder/weirdo_ghost_gang_holder.rs b/tee-worker/litentry/core/assertion-build/src/nodereal/nft_holder/weirdo_ghost_gang_holder.rs index f4d3b13eb6..a7640315dd 100644 --- a/tee-worker/litentry/core/assertion-build/src/nodereal/nft_holder/weirdo_ghost_gang_holder.rs +++ b/tee-worker/litentry/core/assertion-build/src/nodereal/nft_holder/weirdo_ghost_gang_holder.rs @@ -28,7 +28,7 @@ use lc_data_providers::nodereal_jsonrpc::{ }; use crate::*; -use lc_data_providers::Error as DataProviderError; +use lc_data_providers::{DataProviderConfig, Error as DataProviderError}; const NFT_TOKEN_ADDRESS: &str = "0x9401518f4EBBA857BAA879D9f76E1Cc8b31ed197"; @@ -54,11 +54,14 @@ fn check_has_nft( } } -pub fn build(req: &AssertionBuildRequest) -> Result { +pub fn build( + req: &AssertionBuildRequest, + data_provider_config: &DataProviderConfig, +) -> Result { debug!("WeirdoGhostGang holder"); let mut has_nft = false; - let mut client = NoderealJsonrpcClient::new(NoderealChain::Eth); + let mut client = NoderealJsonrpcClient::new(NoderealChain::Eth, data_provider_config); let identities: Vec<(Web3Network, Vec)> = transpose_identity(&req.identities); let addresses = identities @@ -112,25 +115,21 @@ mod tests { use super::*; use itp_stf_primitives::types::ShardIdentifier; use lc_credentials::assertion_logic::{AssertionLogic, Op}; - use lc_data_providers::GLOBAL_DATA_PROVIDER_CONFIG; use lc_mock_server::run; - fn init() { + fn init() -> DataProviderConfig { let _ = env_logger::builder().is_test(true).try_init(); let url = run(0).unwrap() + "/nodereal_jsonrpc/"; - GLOBAL_DATA_PROVIDER_CONFIG - .write() - .unwrap() - .set_nodereal_api_key("d416f55179dbd0e45b1a8ed030e3".into()); - GLOBAL_DATA_PROVIDER_CONFIG - .write() - .unwrap() - .set_nodereal_api_chain_network_url(url); + let mut config = DataProviderConfig::new(); + + config.set_nodereal_api_key("d416f55179dbd0e45b1a8ed030e3".to_string()); + config.set_nodereal_api_chain_network_url(url); + config } #[test] fn build_weirdo_ghost_gang_holder_works() { - init(); + let config = init(); let identities: Vec = vec![(Identity::Evm([0; 20].into()), vec![Web3Network::Ethereum])]; @@ -147,7 +146,7 @@ mod tests { req_ext_hash: Default::default(), }; - match build(&req) { + match build(&req, &config) { Ok(credential) => { log::info!("build WeirdoGhostGang holder done"); assert_eq!( diff --git a/tee-worker/litentry/core/assertion-build/src/oneblock/course.rs b/tee-worker/litentry/core/assertion-build/src/oneblock/course.rs index ec2210db4a..93e18a7605 100644 --- a/tee-worker/litentry/core/assertion-build/src/oneblock/course.rs +++ b/tee-worker/litentry/core/assertion-build/src/oneblock/course.rs @@ -22,15 +22,20 @@ extern crate sgx_tstd as std; use crate::{oneblock::query_oneblock_status, *}; use lc_credentials::oneblock::OneBlockAssertionUpdate; +use lc_data_providers::DataProviderConfig; -pub fn build(req: &AssertionBuildRequest, course_type: OneBlockCourseType) -> Result { +pub fn build( + req: &AssertionBuildRequest, + course_type: OneBlockCourseType, + data_provider_config: &DataProviderConfig, +) -> Result { let identities = transpose_identity(&req.identities); let addresses = identities .into_iter() .flat_map(|(_, addresses)| addresses) .collect::>(); - let value = query_oneblock_status(&course_type, addresses)?; + let value = query_oneblock_status(&course_type, addresses, data_provider_config)?; match Credential::new(&req.who, &req.shard) { Ok(mut credential_unsigned) => { credential_unsigned.update_notion_assertion(&course_type, value); diff --git a/tee-worker/litentry/core/assertion-build/src/oneblock/mod.rs b/tee-worker/litentry/core/assertion-build/src/oneblock/mod.rs index 06219b5351..7dc640138a 100644 --- a/tee-worker/litentry/core/assertion-build/src/oneblock/mod.rs +++ b/tee-worker/litentry/core/assertion-build/src/oneblock/mod.rs @@ -26,7 +26,7 @@ use crate::*; use http::header::{AUTHORIZATION, CONNECTION}; use http_req::response::Headers; use itc_rest_client::{error::Error as RestClientError, RestGet, RestPath}; -use lc_data_providers::{build_client, DataProviderConfigReader, ReadDataProviderConfig}; +use lc_data_providers::{build_client, DataProviderConfig}; use serde::{Deserialize, Serialize}; use std::string::ToString; @@ -43,11 +43,12 @@ impl RestPath for OneBlockResponse { } } -fn fetch_data_from_notion(course_type: &OneBlockCourseType) -> Result { - let data_provider_config = DataProviderConfigReader::read() - .map_err(|e| Error::RequestVCFailed(Assertion::Oneblock(course_type.clone()), e))?; - let oneblock_notion_key = data_provider_config.oneblock_notion_key; - let oneblock_notion_url = data_provider_config.oneblock_notion_url; +fn fetch_data_from_notion( + course_type: &OneBlockCourseType, + data_provider_config: &DataProviderConfig, +) -> Result { + let oneblock_notion_key = data_provider_config.oneblock_notion_key.to_string(); + let oneblock_notion_url = data_provider_config.oneblock_notion_url.to_string(); let mut headers = Headers::new(); headers.insert(CONNECTION.as_str(), "close"); @@ -174,8 +175,9 @@ impl OneBlockAssertionQualify for OneBlockData { pub fn query_oneblock_status( course_type: &OneBlockCourseType, addresses: Vec, + data_provider_config: &DataProviderConfig, ) -> Result { - let oneblock_response = fetch_data_from_notion(course_type)?; + let oneblock_response = fetch_data_from_notion(course_type, data_provider_config)?; debug!("OneBlock Assertion Response: {oneblock_response:?}"); Ok(check_oneblock_data(&oneblock_response, course_type, addresses)) diff --git a/tee-worker/litentry/core/assertion-build/src/vip3/card.rs b/tee-worker/litentry/core/assertion-build/src/vip3/card.rs index 90bac56961..bd12ec59f0 100644 --- a/tee-worker/litentry/core/assertion-build/src/vip3/card.rs +++ b/tee-worker/litentry/core/assertion-build/src/vip3/card.rs @@ -19,9 +19,14 @@ use crate::{ *, }; use lc_credentials::vip3::UpdateVIP3MembershipCardCredential; +use lc_data_providers::DataProviderConfig; use litentry_primitives::VIP3MembershipCardLevel; -pub fn build(req: &AssertionBuildRequest, level: VIP3MembershipCardLevel) -> Result { +pub fn build( + req: &AssertionBuildRequest, + level: VIP3MembershipCardLevel, + data_provider_config: &DataProviderConfig, +) -> Result { debug!("Building VIP3 membership card level: {:?}", level); let identities = transpose_identity(&req.identities); @@ -30,7 +35,7 @@ pub fn build(req: &AssertionBuildRequest, level: VIP3MembershipCardLevel) -> Res .flat_map(|(_, addresses)| addresses) .collect::>(); - let mut sbt = VIP3SBTInfo::new() + let mut sbt = VIP3SBTInfo::new(data_provider_config) .map_err(|e| Error::RequestVCFailed(Assertion::VIP3MembershipCard(level.clone()), e))?; let value = sbt .has_card_level(addresses, &level) diff --git a/tee-worker/litentry/core/assertion-build/src/vip3/mod.rs b/tee-worker/litentry/core/assertion-build/src/vip3/mod.rs index af72685f44..05e045e985 100644 --- a/tee-worker/litentry/core/assertion-build/src/vip3/mod.rs +++ b/tee-worker/litentry/core/assertion-build/src/vip3/mod.rs @@ -25,7 +25,7 @@ pub mod card; use crate::*; use lc_data_providers::{ vip3::{VIP3Client, VIP3QuerySet}, - DataProviderConfigReader, ReadDataProviderConfig, + DataProviderConfig, }; use litentry_primitives::VIP3MembershipCardLevel; @@ -34,9 +34,10 @@ pub struct VIP3SBTInfo { } impl VIP3SBTInfo { - pub fn new() -> core::result::Result { - let data_provider_config = DataProviderConfigReader::read()?; - let client = VIP3Client::new(&data_provider_config); + pub fn new( + data_provider_config: &DataProviderConfig, + ) -> core::result::Result { + let client = VIP3Client::new(data_provider_config); Ok(VIP3SBTInfo { client }) } diff --git a/tee-worker/litentry/core/credentials/src/nodereal/crypto_summary/mod.rs b/tee-worker/litentry/core/credentials/src/nodereal/crypto_summary/mod.rs index fc6ecf3d9e..42527c2ebd 100644 --- a/tee-worker/litentry/core/credentials/src/nodereal/crypto_summary/mod.rs +++ b/tee-worker/litentry/core/credentials/src/nodereal/crypto_summary/mod.rs @@ -25,6 +25,7 @@ use lc_data_providers::{ FungibleApiList, GetNFTHoldingsParam, NftApiList, NoderealChain, NoderealJsonrpcClient, TransactionCount, }, + DataProviderConfig, }; use litentry_primitives::{ErrorDetail, IntoErrorDetail}; use serde::{Deserialize, Serialize}; @@ -213,16 +214,10 @@ pub struct CryptoSummaryClient { pub bsc_client: NoderealJsonrpcClient, } -impl Default for CryptoSummaryClient { - fn default() -> Self { - Self::new() - } -} - impl CryptoSummaryClient { - pub fn new() -> Self { - let eth_client = NoderealJsonrpcClient::new(NoderealChain::Eth); - let bsc_client = NoderealJsonrpcClient::new(NoderealChain::Bsc); + pub fn new(data_provider_config: &DataProviderConfig) -> Self { + let eth_client = NoderealJsonrpcClient::new(NoderealChain::Eth, data_provider_config); + let bsc_client = NoderealJsonrpcClient::new(NoderealChain::Bsc, data_provider_config); Self { eth_client, bsc_client } } diff --git a/tee-worker/litentry/core/data-providers/Cargo.toml b/tee-worker/litentry/core/data-providers/Cargo.toml index e22440f17e..6eca7cb2b3 100644 --- a/tee-worker/litentry/core/data-providers/Cargo.toml +++ b/tee-worker/litentry/core/data-providers/Cargo.toml @@ -15,7 +15,6 @@ thiserror = { version = "1.0.26", optional = true } url = { version = "2.0.0", optional = true } # no_std dependencies -lazy_static = { version = "1.4.0", features = ["spin_no_std"] } log = { version = "0.4", default-features = false } serde = { version = "1.0", default-features = false, features = ["derive", "alloc"] } serde_json = { version = "1.0", default-features = false, features = ["alloc"] } @@ -23,6 +22,7 @@ serde_json = { version = "1.0", default-features = false, features = ["alloc"] } # internal dependencies itc-rest-client = { path = "../../../core/rest-client", default-features = false } itp-rpc = { path = "../../../core-primitives/rpc", default-features = false } +itp-utils = { path = "../../../core-primitives/utils", default-features = false } # sgx dependencies chrono_sgx = { package = "chrono", git = "https://github.com/mesalock-linux/chrono-sgx", optional = true } @@ -61,6 +61,7 @@ std = [ "url", "itc-rest-client/std", "itp-rpc/std", + "itp-utils/std", "log/std", "serde/std", "serde_json/std", diff --git a/tee-worker/litentry/core/data-providers/src/achainable.rs b/tee-worker/litentry/core/data-providers/src/achainable.rs index db97dbc371..d60be8c4dc 100644 --- a/tee-worker/litentry/core/data-providers/src/achainable.rs +++ b/tee-worker/litentry/core/data-providers/src/achainable.rs @@ -1425,7 +1425,7 @@ mod tests { AchainableAccountTotalTransactions, AchainableClient, AchainableTagAccount, AchainableTagBalance, AchainableTagDeFi, AchainableTagDotsama, AchainableUtils, }, - DataProviderConfigReader, ReadDataProviderConfig, GLOBAL_DATA_PROVIDER_CONFIG, + DataProviderConfig, }; use lc_mock_server::run; use litentry_primitives::Web3Network; @@ -1434,9 +1434,9 @@ mod tests { fn new_achainable_client() -> AchainableClient { let _ = env_logger::builder().is_test(true).try_init(); let url = run(0).unwrap(); - GLOBAL_DATA_PROVIDER_CONFIG.write().unwrap().set_achainable_url(url); - let data_provider_config = DataProviderConfigReader::read().unwrap(); + let mut data_provider_config = DataProviderConfig::new(); + data_provider_config.set_achainable_url(url); AchainableClient::new(&data_provider_config) } diff --git a/tee-worker/litentry/core/data-providers/src/discord_litentry.rs b/tee-worker/litentry/core/data-providers/src/discord_litentry.rs index 7d5bcdeb3d..99ce9d60d6 100644 --- a/tee-worker/litentry/core/data-providers/src/discord_litentry.rs +++ b/tee-worker/litentry/core/data-providers/src/discord_litentry.rs @@ -17,7 +17,7 @@ #[cfg(all(not(feature = "std"), feature = "sgx"))] use crate::sgx_reexport_prelude::*; -use crate::{build_client, vec_to_string, Error, HttpError, GLOBAL_DATA_PROVIDER_CONFIG}; +use crate::{build_client, vec_to_string, Error, HttpError}; use http::header::CONNECTION; use http_req::response::Headers; use itc_rest_client::{ @@ -28,7 +28,6 @@ use itc_rest_client::{ use log::*; use serde::{Deserialize, Serialize}; use std::{ - default::Default, format, string::{String, ToString}, vec, @@ -54,25 +53,11 @@ pub struct DiscordLitentryClient { client: RestClient>, } -impl Default for DiscordLitentryClient { - fn default() -> Self { - Self::new() - } -} - impl DiscordLitentryClient { - pub fn new() -> Self { + pub fn new(url: &str) -> Self { let mut headers = Headers::new(); headers.insert(CONNECTION.as_str(), "close"); - let client = build_client( - GLOBAL_DATA_PROVIDER_CONFIG - .write() - .unwrap() - .discord_litentry_url - .clone() - .as_str(), - headers, - ); + let client = build_client(url, headers); DiscordLitentryClient { client } } @@ -170,32 +155,35 @@ impl DiscordLitentryClient { #[cfg(test)] mod tests { use super::*; + use crate::DataProviderConfig; use lc_mock_server::run; - fn init() { + fn init() -> DataProviderConfig { let _ = env_logger::builder().is_test(true).try_init(); let url = run(0).unwrap(); - GLOBAL_DATA_PROVIDER_CONFIG.write().unwrap().set_discord_litentry_url(url); + let mut data_provider_config = DataProviderConfig::new(); + data_provider_config.set_discord_litentry_url(url); + data_provider_config } #[test] fn check_join_work() { - init(); + let data_provider_config = init(); let guild_id = "919848390156767232".as_bytes().to_vec(); let handler = "againstwar".as_bytes().to_vec(); - let mut client = DiscordLitentryClient::new(); + let mut client = DiscordLitentryClient::new(&data_provider_config.discord_litentry_url); let response = client.check_join(guild_id, handler); assert!(response.is_ok(), "check join discord error: {:?}", response); } #[test] fn check_id_hubber_work() { - init(); + let data_provider_config = init(); let guild_id = "919848390156767232".as_bytes().to_vec(); let channel_id = "919848392035794945".as_bytes().to_vec(); let role_id = "1034083718425493544".as_bytes().to_vec(); let handler = "ericzhang.eth".as_bytes().to_vec(); - let mut client = DiscordLitentryClient::new(); + let mut client = DiscordLitentryClient::new(&data_provider_config.discord_litentry_url); let response = client.check_id_hubber(guild_id, channel_id, role_id, handler); assert!(response.is_ok(), "check discord id hubber error: {:?}", response); } diff --git a/tee-worker/litentry/core/data-providers/src/discord_official.rs b/tee-worker/litentry/core/data-providers/src/discord_official.rs index ffcaba4f03..5ab8a73293 100644 --- a/tee-worker/litentry/core/data-providers/src/discord_official.rs +++ b/tee-worker/litentry/core/data-providers/src/discord_official.rs @@ -118,25 +118,25 @@ impl DiscordOfficialClient { #[cfg(test)] mod tests { - use crate::{DataProviderConfigReader, ReadDataProviderConfig, GLOBAL_DATA_PROVIDER_CONFIG}; use super::*; use lc_mock_server::run; - fn init() { + fn init() -> DataProviderConfig { let _ = env_logger::builder().is_test(true).try_init(); let url = run(0).unwrap(); - GLOBAL_DATA_PROVIDER_CONFIG.write().unwrap().set_discord_official_url(url); + let mut data_provider_config = DataProviderConfig::new(); + data_provider_config.set_discord_official_url(url); + data_provider_config } #[test] fn query_message_work() { - init(); + let data_provider_config = init(); let channel_id = "919848392035794945"; let message_id = "1"; - let data_provider_config = DataProviderConfigReader::read().unwrap(); let mut client = DiscordOfficialClient::new(&data_provider_config); let result = client.query_message(channel_id.as_bytes().to_vec(), message_id.as_bytes().to_vec()); diff --git a/tee-worker/litentry/core/data-providers/src/geniidata.rs b/tee-worker/litentry/core/data-providers/src/geniidata.rs index 8857fb8d0d..a7e7861c9c 100644 --- a/tee-worker/litentry/core/data-providers/src/geniidata.rs +++ b/tee-worker/litentry/core/data-providers/src/geniidata.rs @@ -20,10 +20,7 @@ use crate::sgx_reexport_prelude::*; #[cfg(all(not(feature = "std"), feature = "sgx"))] extern crate sgx_tstd as std; -use crate::{ - build_client_with_cert, DataProviderConfigReader, Error as DataProviderError, - ReadDataProviderConfig, -}; +use crate::{build_client_with_cert, DataProviderConfig, Error as DataProviderError}; use http::header::{ACCEPT, CONNECTION}; use http_req::response::Headers; use itc_rest_client::{ @@ -79,9 +76,9 @@ pub struct GeniidataClient { } impl GeniidataClient { - pub fn new() -> core::result::Result { - let data_provider_config = DataProviderConfigReader::read()?; - + pub fn new( + data_provider_config: &DataProviderConfig, + ) -> core::result::Result { let mut headers = Headers::new(); headers.insert(CONNECTION.as_str(), "close"); headers.insert(ACCEPT.as_str(), "application/json"); diff --git a/tee-worker/litentry/core/data-providers/src/lib.rs b/tee-worker/litentry/core/data-providers/src/lib.rs index 30216ff696..030f4c66df 100644 --- a/tee-worker/litentry/core/data-providers/src/lib.rs +++ b/tee-worker/litentry/core/data-providers/src/lib.rs @@ -44,23 +44,18 @@ use itc_rest_client::{ http_client::{DefaultSend, HttpClient}, rest_client::RestClient, }; -use lazy_static::lazy_static; +use itp_utils::if_not_production; use log::debug; use serde::{Deserialize, Serialize}; use std::vec; -#[cfg(feature = "std")] -use std::sync::RwLock; -#[cfg(feature = "sgx")] -use std::sync::SgxRwLock as RwLock; - use itc_rest_client::http_client::SendWithCertificateVerification; use litentry_primitives::{ AchainableParams, Assertion, ErrorDetail, ErrorString, IntoErrorDetail, ParameterString, VCMPError, }; use std::{ - format, + env, format, string::{String, ToString}, vec::Vec, }; @@ -168,7 +163,7 @@ impl TokenFromString for ETokenAddress { } } -#[derive(PartialEq, Eq, Clone, Encode, Decode, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Encode, Decode, Serialize, Deserialize, Debug)] pub struct DataProviderConfig { pub twitter_official_url: String, pub twitter_litentry_url: String, @@ -204,32 +199,115 @@ impl Default for DataProviderConfig { impl DataProviderConfig { pub fn new() -> Self { - DataProviderConfig { + std::println!("Initializing data providers config"); + + // default prod config + let mut config = DataProviderConfig { twitter_official_url: "https://api.twitter.com".to_string(), - twitter_litentry_url: "".to_string(), - twitter_auth_token_v2: "Bearer ".to_string(), + twitter_litentry_url: "http://127.0.0.1:9527”".to_string(), + twitter_auth_token_v2: "".to_string(), discord_official_url: "https://discordapp.com".to_string(), - discord_litentry_url: "".to_string(), + discord_litentry_url: "http://127.0.0.1:9527”".to_string(), discord_auth_token: "".to_string(), - achainable_url: "https://graph.tdf-labs.io/".to_string(), + achainable_url: "https://label-production.graph.tdf-labs.io/".to_string(), achainable_auth_key: "".to_string(), - credential_endpoint: "".to_string(), + credential_endpoint: "wss://tee-staging.litentry.io".to_string(), oneblock_notion_key: "".to_string(), - oneblock_notion_url: "".to_string(), - sora_quiz_master_id: "".to_string(), - sora_quiz_attendee_id: "".to_string(), - nodereal_api_key: "".to_string(), + oneblock_notion_url: + "https://api.notion.com/v1/blocks/e4068e6a326243468f35dcdc0c43f686/children" + .to_string(), + sora_quiz_master_id: "1164463721989554218".to_string(), + sora_quiz_attendee_id: "1166941149219532800".to_string(), + nodereal_api_key: "https://{chain}-{network}.nodereal.io/".to_string(), nodereal_api_retry_delay: 5000, nodereal_api_retry_times: 2, - nodereal_api_url: "".to_string(), + nodereal_api_url: "https://open-platform.nodereal.io/".to_string(), nodereal_api_chain_network_url: "".to_string(), - contest_legend_discord_role_id: "".to_string(), - contest_popularity_discord_role_id: "".to_string(), - contest_participant_discord_role_id: "".to_string(), - vip3_url: "".to_string(), - geniidata_url: "".to_string(), + contest_legend_discord_role_id: "1172576273063739462".to_string(), + contest_popularity_discord_role_id: "1172576681119195208".to_string(), + contest_participant_discord_role_id: "1172576734135210104".to_string(), + vip3_url: "https://dappapi.vip3.io/".to_string(), + geniidata_url: "https://api.geniidata.com/api/1/brc20/balance?".to_string(), geniidata_api_key: "".to_string(), + }; + + // we allow to override following config properties for non prod dev + if_not_production!({ + if let Ok(v) = env::var("TWITTER_OFFICIAL_URL") { + config.set_twitter_official_url(v); + } + if let Ok(v) = env::var("TWITTER_LITENTRY_URL") { + config.set_twitter_litentry_url(v); + } + if let Ok(v) = env::var("DISCORD_OFFICIAL_URL") { + config.set_discord_official_url(v); + } + if let Ok(v) = env::var("DISCORD_LITENTRY_URL") { + config.set_discord_litentry_url(v); + } + if let Ok(v) = env::var("ACHAINABLE_URL") { + config.set_achainable_url(v); + } + if let Ok(v) = env::var("CREDENTIAL_ENDPOINT") { + config.set_credential_endpoint(v); + } + if let Ok(v) = env::var("ONEBLOCK_NOTION_URL") { + config.set_oneblock_notion_url(v); + } + if let Ok(v) = env::var("SORA_QUIZ_MASTER_ID") { + config.set_sora_quiz_master_id(v); + } + if let Ok(v) = env::var("SORA_QUIZ_ATTENDEE_ID") { + config.set_sora_quiz_attendee_id(v); + } + if let Ok(v) = env::var("NODEREAL_API_URL") { + config.set_nodereal_api_url(v); + } + if let Ok(v) = env::var("NODEREAL_API_RETRY_DELAY") { + config.set_nodereal_api_retry_delay(v.parse::().unwrap()); + } + if let Ok(v) = env::var("NODEREAL_API_RETRY_TIME") { + config.set_nodereal_api_retry_times(v.parse::().unwrap()); + } + if let Ok(v) = env::var("NODEREAL_API_CHAIN_NETWORK_URL") { + config.set_nodereal_api_chain_network_url(v); + } + if let Ok(v) = env::var("CONTEST_LEGEND_DISCORD_ROLE_ID") { + config.set_contest_legend_discord_role_id(v); + } + if let Ok(v) = env::var("CONTEST_POPULARITY_DISCORD_ROLE_ID") { + config.set_contest_popularity_discord_role_id(v); + } + if let Ok(v) = env::var("CONTEST_PARTICIPANT_DISCORD_ROLE_ID") { + config.set_contest_participant_discord_role_id(v); + } + if let Ok(v) = env::var("VIP3_URL") { + config.set_vip3_url(v); + } + if let Ok(v) = env::var("GENIIDATA_URL") { + config.set_geniidata_url(v); + } + }); + // set secrets from env variables + if let Ok(v) = env::var("TWITTER_AUTH_TOKEN_V2") { + config.set_twitter_auth_token_v2(v); + } + if let Ok(v) = env::var("DISCORD_AUTH_TOKEN") { + config.set_discord_auth_token(v); + } + if let Ok(v) = env::var("ACHAINABLE_AUTH_KEY") { + config.set_achainable_auth_key(v); } + if let Ok(v) = env::var("ONEBLOCK_NOTION_KEY") { + config.set_oneblock_notion_key(v); + } + if let Ok(v) = env::var("NODEREAL_API_KEY") { + config.set_nodereal_api_key(v); + } + if let Ok(v) = env::var("GENIIDATA_API_KEY") { + config.set_geniidata_api_key(v); + } + config } pub fn set_twitter_official_url(&mut self, v: String) { debug!("set_twitter_official_url: {:?}", v); @@ -329,27 +407,6 @@ impl DataProviderConfig { } } -lazy_static! { - pub static ref GLOBAL_DATA_PROVIDER_CONFIG: RwLock = - RwLock::new(DataProviderConfig::new()); -} - -pub struct DataProviderConfigReader; -pub trait ReadDataProviderConfig { - fn read() -> Result; -} - -impl ReadDataProviderConfig for DataProviderConfigReader { - fn read() -> Result { - match GLOBAL_DATA_PROVIDER_CONFIG.read() { - Ok(c) => Ok(c.clone()), - Err(e) => Err(ErrorDetail::DataProviderError(ErrorString::truncate_from( - format!("{e:?}").as_bytes().to_vec(), - ))), - } - } -} - #[derive(Debug, thiserror::Error, Clone)] pub enum Error { #[error("Request error: {0}")] diff --git a/tee-worker/litentry/core/data-providers/src/nodereal_jsonrpc.rs b/tee-worker/litentry/core/data-providers/src/nodereal_jsonrpc.rs index a028429bc5..7dd24cbc36 100644 --- a/tee-worker/litentry/core/data-providers/src/nodereal_jsonrpc.rs +++ b/tee-worker/litentry/core/data-providers/src/nodereal_jsonrpc.rs @@ -17,7 +17,7 @@ #[cfg(all(not(feature = "std"), feature = "sgx"))] use crate::sgx_reexport_prelude::*; -use crate::{build_client, hex_to_decimal, Error, HttpError, GLOBAL_DATA_PROVIDER_CONFIG}; +use crate::{build_client, hex_to_decimal, DataProviderConfig, Error, HttpError}; use http::header::CONNECTION; use http_req::response::Headers; use itc_rest_client::{ @@ -100,15 +100,11 @@ pub struct NoderealJsonrpcClient { } impl NoderealJsonrpcClient { - pub fn new(chain: NoderealChain) -> Self { - let api_key = GLOBAL_DATA_PROVIDER_CONFIG.write().unwrap().nodereal_api_key.clone(); - let api_retry_delay = GLOBAL_DATA_PROVIDER_CONFIG.write().unwrap().nodereal_api_retry_delay; - let api_retry_times = GLOBAL_DATA_PROVIDER_CONFIG.write().unwrap().nodereal_api_retry_times; - let api_url = GLOBAL_DATA_PROVIDER_CONFIG - .write() - .unwrap() - .nodereal_api_chain_network_url - .clone(); + pub fn new(chain: NoderealChain, data_provider_config: &DataProviderConfig) -> Self { + let api_key = data_provider_config.nodereal_api_key.clone(); + let api_retry_delay = data_provider_config.nodereal_api_retry_delay; + let api_retry_times = data_provider_config.nodereal_api_retry_times; + let api_url = data_provider_config.nodereal_api_chain_network_url.clone(); let base_url = api_url.replace("{chain}", chain.to_string()); let mut headers = Headers::new(); @@ -415,23 +411,20 @@ mod tests { use super::*; use lc_mock_server::run; - fn init() { + fn init() -> DataProviderConfig { let _ = env_logger::builder().is_test(true).try_init(); let url = run(0).unwrap() + "/nodereal_jsonrpc/"; - GLOBAL_DATA_PROVIDER_CONFIG - .write() - .unwrap() - .set_nodereal_api_key("d416f55179dbd0e45b1a8ed030e3".into()); - GLOBAL_DATA_PROVIDER_CONFIG - .write() - .unwrap() - .set_nodereal_api_chain_network_url(url); + + let mut config = DataProviderConfig::new(); + config.set_nodereal_api_key("d416f55179dbd0e45b1a8ed030e3".to_string()); + config.set_nodereal_api_chain_network_url(url); + config } #[test] fn does_get_nft_holdings_works() { - init(); - let mut client = NoderealJsonrpcClient::new(NoderealChain::Eth); + let config = init(); + let mut client = NoderealJsonrpcClient::new(NoderealChain::Eth, &config); let param = GetNFTHoldingsParam { account_address: "0x49AD262C49C7aA708Cc2DF262eD53B64A17Dd5EE".into(), token_type: "ERC721".into(), @@ -449,8 +442,8 @@ mod tests { #[test] fn does_get_token_balance_721_works() { - init(); - let mut client = NoderealJsonrpcClient::new(NoderealChain::Eth); + let config = init(); + let mut client = NoderealJsonrpcClient::new(NoderealChain::Eth, &config); let param = GetTokenBalance721Param { token_address: "0x07D971C03553011a48E951a53F48632D37652Ba1".into(), account_address: "0x49AD262C49C7aA708Cc2DF262eD53B64A17Dd5EE".into(), @@ -462,8 +455,8 @@ mod tests { #[test] fn does_get_token_balance_20_works() { - init(); - let mut client = NoderealJsonrpcClient::new(NoderealChain::Eth); + let config = init(); + let mut client = NoderealJsonrpcClient::new(NoderealChain::Eth, &config); let param = GetTokenBalance20Param { contract_address: "0x76A797A59Ba2C17726896976B7B3747BfD1d220f".into(), address: "0x85Be4e2ccc9c85BE8783798B6e8A101BDaC6467F".into(), diff --git a/tee-worker/litentry/core/data-providers/src/twitter_official.rs b/tee-worker/litentry/core/data-providers/src/twitter_official.rs index 5936e1316b..5039b2194b 100644 --- a/tee-worker/litentry/core/data-providers/src/twitter_official.rs +++ b/tee-worker/litentry/core/data-providers/src/twitter_official.rs @@ -17,9 +17,7 @@ #[cfg(all(not(feature = "std"), feature = "sgx"))] use crate::sgx_reexport_prelude::*; -use crate::{ - build_client_with_cert, vec_to_string, Error, HttpError, UserInfo, GLOBAL_DATA_PROVIDER_CONFIG, -}; +use crate::{build_client_with_cert, vec_to_string, Error, HttpError, UserInfo}; use http::header::{AUTHORIZATION, CONNECTION}; use http_req::response::Headers; use itc_rest_client::{ @@ -157,27 +155,11 @@ impl TargetUser { /// rate limit: https://developer.twitter.com/en/docs/twitter-api/rate-limits impl TwitterOfficialClient { - pub fn v2() -> Self { + pub fn v2(url: &str, token: &str) -> Self { let mut headers = Headers::new(); headers.insert(CONNECTION.as_str(), "close"); - headers.insert( - AUTHORIZATION.as_str(), - GLOBAL_DATA_PROVIDER_CONFIG - .read() - .unwrap() - .twitter_auth_token_v2 - .clone() - .as_str(), - ); - let client = build_client_with_cert( - GLOBAL_DATA_PROVIDER_CONFIG - .read() - .unwrap() - .twitter_official_url - .clone() - .as_str(), - headers.clone(), - ); + headers.insert(AUTHORIZATION.as_str(), token); + let client = build_client_with_cert(url, headers.clone()); TwitterOfficialClient { client } } @@ -267,20 +249,24 @@ impl TwitterOfficialClient { #[cfg(test)] mod tests { use super::*; + use crate::DataProviderConfig; use lc_mock_server::run; - fn init() { + fn init() -> DataProviderConfig { let _ = env_logger::builder().is_test(true).try_init(); let url = run(0).unwrap(); - GLOBAL_DATA_PROVIDER_CONFIG.write().unwrap().set_twitter_official_url(url); + let mut data_provider_config = DataProviderConfig::new(); + data_provider_config.set_twitter_official_url(url); + data_provider_config } #[test] fn query_tweet_work() { - init(); + let data_provider_config = init(); let tweet_id = "100"; - let mut client = TwitterOfficialClient::v2(); + let mut client = + TwitterOfficialClient::v2(&data_provider_config.twitter_official_url, "token"); let result = client.query_tweet(tweet_id.as_bytes().to_vec()); assert!(result.is_ok(), "error: {:?}", result); let tweet = result.unwrap(); @@ -292,9 +278,10 @@ mod tests { #[test] fn query_retweeted_work() { - init(); + let data_provider_config = init(); - let mut client = TwitterOfficialClient::v2(); + let mut client = + TwitterOfficialClient::v2(&data_provider_config.twitter_official_url, "token"); let original_tweet_id = "100".as_bytes().to_vec(); let response = client.query_retweeted_by(original_tweet_id); @@ -303,20 +290,22 @@ mod tests { #[test] fn query_user_by_name_work() { - init(); + let data_provider_config = init(); let user = "twitterdev"; - let mut client = TwitterOfficialClient::v2(); + let mut client = + TwitterOfficialClient::v2(&data_provider_config.twitter_official_url, "token"); let result = client.query_user_by_name(user.as_bytes().to_vec()); assert!(result.is_ok(), "error: {:?}", result); } #[test] fn query_user_by_id_work() { - init(); + let data_provider_config = init(); let user_id = "2244994945"; - let mut client = TwitterOfficialClient::v2(); + let mut client = + TwitterOfficialClient::v2(&data_provider_config.twitter_official_url, "token"); let result = client.query_user_by_id(user_id.as_bytes().to_vec()); assert!(result.is_ok(), "error: {:?}", result); } diff --git a/tee-worker/litentry/core/identity-verification/src/lib.rs b/tee-worker/litentry/core/identity-verification/src/lib.rs index d8749a6ed5..03692ebb67 100644 --- a/tee-worker/litentry/core/identity-verification/src/lib.rs +++ b/tee-worker/litentry/core/identity-verification/src/lib.rs @@ -40,7 +40,8 @@ mod web2; mod error; use error::{Error, Result}; +use lc_data_providers::DataProviderConfig; -pub fn verify(r: &Web2IdentityVerificationRequest) -> Result<()> { - web2::verify(&r.who, &r.identity, &r.raw_msg, &r.validation_data) +pub fn verify(r: &Web2IdentityVerificationRequest, config: &DataProviderConfig) -> Result<()> { + web2::verify(&r.who, &r.identity, &r.raw_msg, &r.validation_data, config) } diff --git a/tee-worker/litentry/core/identity-verification/src/web2/mod.rs b/tee-worker/litentry/core/identity-verification/src/web2/mod.rs index 540e6c5d1c..fa0faf933b 100644 --- a/tee-worker/litentry/core/identity-verification/src/web2/mod.rs +++ b/tee-worker/litentry/core/identity-verification/src/web2/mod.rs @@ -28,7 +28,7 @@ use itp_sgx_crypto::ShieldingCryptoDecrypt; use lc_data_providers::{ discord_official::{DiscordMessage, DiscordOfficialClient}, twitter_official::{Tweet, TwitterOfficialClient}, - DataProviderConfigReader, ReadDataProviderConfig, UserInfo, + DataProviderConfig, UserInfo, }; use litentry_primitives::{ DiscordValidationData, ErrorDetail, Identity, IntoErrorDetail, TwitterValidationData, @@ -57,12 +57,16 @@ pub fn verify( identity: &Identity, raw_msg: &[u8], data: &Web2ValidationData, + config: &DataProviderConfig, ) -> Result<()> { debug!("verify web2 identity, who: {:?}", who); let (user_name, payload) = match data { Web2ValidationData::Twitter(TwitterValidationData { ref tweet_id }) => { - let mut client = TwitterOfficialClient::v2(); + let mut client = TwitterOfficialClient::v2( + config.twitter_official_url.as_str(), + config.twitter_auth_token_v2.as_str(), + ); let tweet: Tweet = client .query_tweet(tweet_id.to_vec()) .map_err(|e| Error::LinkIdentityFailed(e.into_error_detail()))?; @@ -84,10 +88,7 @@ pub fn verify( ref message_id, .. }) => { - let data_provider_config = - DataProviderConfigReader::read().map_err(Error::UnclassifiedError)?; - - let mut client = DiscordOfficialClient::new(&data_provider_config); + let mut client = DiscordOfficialClient::new(config); let message: DiscordMessage = client .query_message(channel_id.to_vec(), message_id.to_vec()) .map_err(|e| Error::LinkIdentityFailed(e.into_error_detail()))?; diff --git a/tee-worker/litentry/core/stf-task/receiver/src/handler/assertion.rs b/tee-worker/litentry/core/stf-task/receiver/src/handler/assertion.rs index 58a69f5697..a41eae52e0 100644 --- a/tee-worker/litentry/core/stf-task/receiver/src/handler/assertion.rs +++ b/tee-worker/litentry/core/stf-task/receiver/src/handler/assertion.rs @@ -19,35 +19,40 @@ use crate::{handler::TaskHandler, EnclaveOnChainOCallApi, StfTaskContext, TrustedCall, H256}; use ita_sgx_runtime::Hash; use ita_stf::{Getter, TrustedCallSigned}; -use itp_sgx_crypto::{ShieldingCryptoDecrypt, ShieldingCryptoEncrypt}; +use itp_sgx_crypto::{key_repository::AccessKey, ShieldingCryptoEncrypt}; use itp_sgx_externalities::SgxExternalitiesTrait; use itp_stf_executor::traits::StfEnclaveSigning; use itp_stf_state_handler::handle_state::HandleState; use itp_top_pool_author::traits::AuthorApi; use itp_types::ShardIdentifier; -use lc_data_providers::{DataProviderConfigReader, ReadDataProviderConfig}; +use lc_data_providers::DataProviderConfig; use lc_stf_task_sender::AssertionBuildRequest; use litentry_primitives::{ AmountHoldingTimeType, Assertion, ErrorDetail, ErrorString, Identity, ParameterString, VCMPError, }; use log::*; -use std::{format, sync::Arc, vec::Vec}; +use std::{format, string::ToString, sync::Arc, vec::Vec}; pub(crate) struct AssertionHandler< - K: ShieldingCryptoDecrypt + ShieldingCryptoEncrypt + Clone, + ShieldingKeyRepository, A: AuthorApi, S: StfEnclaveSigning, H: HandleState, O: EnclaveOnChainOCallApi, -> { +> where + ShieldingKeyRepository: AccessKey, + ::KeyType: ShieldingCryptoEncrypt + 'static, +{ pub(crate) req: AssertionBuildRequest, - pub(crate) context: Arc>, + pub(crate) context: Arc>, } -impl TaskHandler for AssertionHandler +impl TaskHandler + for AssertionHandler where - K: ShieldingCryptoDecrypt + ShieldingCryptoEncrypt + Clone, + ShieldingKeyRepository: AccessKey, + ::KeyType: ShieldingCryptoEncrypt + 'static, A: AuthorApi, S: StfEnclaveSigning, H: HandleState, @@ -68,72 +73,125 @@ where } lc_assertion_build::a1::build(&self.req) }, - Assertion::A2(guild_id) => lc_assertion_build::a2::build(&self.req, guild_id), - - Assertion::A3(guild_id, channel_id, role_id) => - lc_assertion_build::a3::build(&self.req, guild_id, channel_id, role_id), - - Assertion::A4(min_balance) => - build_holding_time(&self.req, AmountHoldingTimeType::LIT, min_balance), - - Assertion::A6 => lc_assertion_build::a6::build(&self.req), - - Assertion::A7(min_balance) => - build_holding_time(&self.req, AmountHoldingTimeType::DOT, min_balance), + Assertion::A2(guild_id) => lc_assertion_build::a2::build( + &self.req, + guild_id, + &self.context.data_provider_config, + ), + + Assertion::A3(guild_id, channel_id, role_id) => lc_assertion_build::a3::build( + &self.req, + guild_id, + channel_id, + role_id, + &self.context.data_provider_config, + ), + + Assertion::A4(min_balance) => build_holding_time( + &self.req, + AmountHoldingTimeType::LIT, + min_balance, + &self.context.data_provider_config, + ), + + Assertion::A6 => + lc_assertion_build::a6::build(&self.req, &self.context.data_provider_config), + + Assertion::A7(min_balance) => build_holding_time( + &self.req, + AmountHoldingTimeType::DOT, + min_balance, + &self.context.data_provider_config, + ), // no need to pass `networks` again because it's the same as the `get_supported_web3networks` - Assertion::A8(_networks) => lc_assertion_build::a8::build(&self.req), - - Assertion::A10(min_balance) => - build_holding_time(&self.req, AmountHoldingTimeType::WBTC, min_balance), - - Assertion::A11(min_balance) => - build_holding_time(&self.req, AmountHoldingTimeType::ETH, min_balance), + Assertion::A8(_networks) => + lc_assertion_build::a8::build(&self.req, &self.context.data_provider_config), + + Assertion::A10(min_balance) => build_holding_time( + &self.req, + AmountHoldingTimeType::WBTC, + min_balance, + &self.context.data_provider_config, + ), + + Assertion::A11(min_balance) => build_holding_time( + &self.req, + AmountHoldingTimeType::ETH, + min_balance, + &self.context.data_provider_config, + ), Assertion::A13(owner) => lc_assertion_build::a13::build(&self.req, self.context.ocall_api.clone(), &owner), - Assertion::A14 => lc_assertion_build::a14::build(&self.req), + Assertion::A14 => + lc_assertion_build::a14::build(&self.req, &self.context.data_provider_config), - Assertion::Achainable(param) => lc_assertion_build::achainable::build(&self.req, param), + Assertion::Achainable(param) => lc_assertion_build::achainable::build( + &self.req, + param, + &self.context.data_provider_config, + ), Assertion::A20 => lc_assertion_build::a20::build(&self.req), - Assertion::Oneblock(course_type) => - lc_assertion_build::oneblock::course::build(&self.req, course_type), + Assertion::Oneblock(course_type) => lc_assertion_build::oneblock::course::build( + &self.req, + course_type, + &self.context.data_provider_config, + ), Assertion::GenericDiscordRole(role_type) => - lc_assertion_build::generic_discord_role::build(&self.req, role_type), + lc_assertion_build::generic_discord_role::build( + &self.req, + role_type, + &self.context.data_provider_config, + ), Assertion::BnbDomainHolding => lc_assertion_build::nodereal::bnb_domain::bnb_domain_holding_amount::build( &self.req, + &self.context.data_provider_config, ), Assertion::BnbDigitDomainClub(digit_domain_type) => lc_assertion_build::nodereal::bnb_domain::bnb_digit_domain_club_amount::build( &self.req, digit_domain_type, + &self.context.data_provider_config, ), - Assertion::VIP3MembershipCard(level) => - lc_assertion_build::vip3::card::build(&self.req, level), + Assertion::VIP3MembershipCard(level) => lc_assertion_build::vip3::card::build( + &self.req, + level, + &self.context.data_provider_config, + ), Assertion::WeirdoGhostGangHolder => - lc_assertion_build::nodereal::nft_holder::weirdo_ghost_gang_holder::build(&self.req), + lc_assertion_build::nodereal::nft_holder::weirdo_ghost_gang_holder::build( + &self.req, + &self.context.data_provider_config, + ), Assertion::LITStaking => lc_assertion_build::lit_staking::build(&self.req), Assertion::EVMAmountHolding(token_type) => lc_assertion_build::nodereal::amount_holding::evm_amount_holding::build( - &self.req, token_type, + &self.req, + token_type, + &self.context.data_provider_config, ), - Assertion::BRC20AmountHolder => - lc_assertion_build::brc20::amount_holder::build(&self.req), + Assertion::BRC20AmountHolder => lc_assertion_build::brc20::amount_holder::build( + &self.req, + &self.context.data_provider_config, + ), - Assertion::CryptoSummary => - lc_assertion_build::nodereal::crypto_summary::build(&self.req), + Assertion::CryptoSummary => lc_assertion_build::nodereal::crypto_summary::build( + &self.req, + &self.context.data_provider_config, + ), }?; // post-process the credential @@ -148,9 +206,8 @@ where credential.parachain_block_number = self.req.parachain_block_number; credential.sidechain_block_number = self.req.sidechain_block_number; - let data_provider_config = DataProviderConfigReader::read() - .map_err(|e| VCMPError::RequestVCFailed(self.req.assertion.clone(), e))?; - credential.credential_subject.endpoint = data_provider_config.credential_endpoint; + credential.credential_subject.endpoint = + self.context.data_provider_config.credential_endpoint.to_string(); credential.credential_subject.assertion_text = format!("{:?}", self.req.assertion); @@ -241,6 +298,7 @@ fn build_holding_time( req: &AssertionBuildRequest, htype: AmountHoldingTimeType, min_balance: ParameterString, + data_provider_config: &DataProviderConfig, ) -> Result { - lc_assertion_build::holding_time::build(req, htype, min_balance) + lc_assertion_build::holding_time::build(req, htype, min_balance, data_provider_config) } diff --git a/tee-worker/litentry/core/stf-task/receiver/src/handler/identity_verification.rs b/tee-worker/litentry/core/stf-task/receiver/src/handler/identity_verification.rs index 033cf30b09..ecfd9fe3e8 100644 --- a/tee-worker/litentry/core/stf-task/receiver/src/handler/identity_verification.rs +++ b/tee-worker/litentry/core/stf-task/receiver/src/handler/identity_verification.rs @@ -20,7 +20,7 @@ use crate::{ }; use ita_sgx_runtime::Hash; use ita_stf::H256; -use itp_sgx_crypto::{ShieldingCryptoDecrypt, ShieldingCryptoEncrypt}; +use itp_sgx_crypto::{key_repository::AccessKey, ShieldingCryptoEncrypt}; use itp_sgx_externalities::SgxExternalitiesTrait; use itp_stf_executor::traits::StfEnclaveSigning; use itp_stf_state_handler::handle_state::HandleState; @@ -32,19 +32,24 @@ use log::*; use std::sync::Arc; pub(crate) struct IdentityVerificationHandler< - K: ShieldingCryptoDecrypt + ShieldingCryptoEncrypt + Clone, + ShieldingKeyRepository, A: AuthorApi, S: StfEnclaveSigning, H: HandleState, O: EnclaveOnChainOCallApi, -> { +> where + ShieldingKeyRepository: AccessKey, + ::KeyType: ShieldingCryptoEncrypt + 'static, +{ pub(crate) req: Web2IdentityVerificationRequest, - pub(crate) context: Arc>, + pub(crate) context: Arc>, } -impl TaskHandler for IdentityVerificationHandler +impl TaskHandler + for IdentityVerificationHandler where - K: ShieldingCryptoDecrypt + ShieldingCryptoEncrypt + Clone, + ShieldingKeyRepository: AccessKey, + ::KeyType: ShieldingCryptoEncrypt + 'static, A: AuthorApi, S: StfEnclaveSigning, H: HandleState, @@ -55,7 +60,7 @@ where type Result = (); fn on_process(&self) -> Result { - lc_identity_verification::verify(&self.req) + lc_identity_verification::verify(&self.req, &self.context.data_provider_config) } fn on_success( diff --git a/tee-worker/litentry/core/stf-task/receiver/src/lib.rs b/tee-worker/litentry/core/stf-task/receiver/src/lib.rs index 44e0f77de2..b83033ea38 100644 --- a/tee-worker/litentry/core/stf-task/receiver/src/lib.rs +++ b/tee-worker/litentry/core/stf-task/receiver/src/lib.rs @@ -47,12 +47,13 @@ use ita_sgx_runtime::Hash; use ita_stf::{Getter, TrustedCall, TrustedCallSigned, TrustedOperation}; use itp_enclave_metrics::EnclaveMetric; use itp_ocall_api::{EnclaveMetricsOCallApi, EnclaveOnChainOCallApi}; -use itp_sgx_crypto::{ShieldingCryptoDecrypt, ShieldingCryptoEncrypt}; +use itp_sgx_crypto::{key_repository::AccessKey, ShieldingCryptoEncrypt}; use itp_sgx_externalities::SgxExternalitiesTrait; use itp_stf_executor::traits::StfEnclaveSigning; use itp_stf_state_handler::handle_state::HandleState; use itp_top_pool_author::traits::AuthorApi; use itp_types::{RsaRequest, ShardIdentifier, H256}; +use lc_data_providers::DataProviderConfig; use lc_stf_task_sender::{stf_task_sender, RequestType}; use log::{debug, error, info}; use std::{ @@ -83,37 +84,51 @@ pub enum Error { #[allow(dead_code)] pub struct StfTaskContext< - K: ShieldingCryptoDecrypt + ShieldingCryptoEncrypt + Clone, + ShieldingKeyRepository, A: AuthorApi, S: StfEnclaveSigning, H: HandleState, O: EnclaveOnChainOCallApi, -> { - pub shielding_key: K, +> where + ShieldingKeyRepository: AccessKey, + ::KeyType: ShieldingCryptoEncrypt + 'static, +{ + pub shielding_key: Arc, author_api: Arc, pub enclave_signer: Arc, pub state_handler: Arc, pub ocall_api: Arc, + pub data_provider_config: Arc, } impl< - K: ShieldingCryptoDecrypt + ShieldingCryptoEncrypt + Clone, + ShieldingKeyRepository, A: AuthorApi, S: StfEnclaveSigning, H: HandleState, O: EnclaveOnChainOCallApi, - > StfTaskContext + > StfTaskContext where + ShieldingKeyRepository: AccessKey, + ::KeyType: ShieldingCryptoEncrypt + 'static, H::StateT: SgxExternalitiesTrait, { pub fn new( - shielding_key: K, + shielding_key: Arc, author_api: Arc, enclave_signer: Arc, state_handler: Arc, ocall_api: Arc, + data_provider_config: Arc, ) -> Self { - Self { shielding_key, author_api, enclave_signer, state_handler, ocall_api } + Self { + shielding_key, + author_api, + enclave_signer, + state_handler, + ocall_api, + data_provider_config, + } } fn submit_trusted_call( @@ -156,8 +171,12 @@ where // the right channel self.author_api.swap_rpc_connection_hash(*old_top_hash, top.hash()); - let encrypted_trusted_call = self + let shielding_key = self .shielding_key + .retrieve_key() + .map_err(|e| Error::OtherError(format!("{:?}", e)))?; + + let encrypted_trusted_call = shielding_key .encrypt(&top.encode()) .map_err(|e| Error::OtherError(format!("{:?}", e)))?; @@ -179,11 +198,12 @@ where } // lifetime elision: StfTaskContext is guaranteed to outlive the fn -pub fn run_stf_task_receiver( - context: Arc>, +pub fn run_stf_task_receiver( + context: Arc>, ) -> Result<(), Error> where - K: ShieldingCryptoDecrypt + ShieldingCryptoEncrypt + Clone + Send + Sync + 'static, + ShieldingKeyRepository: AccessKey + Sync + Send + 'static, + ::KeyType: ShieldingCryptoEncrypt, A: AuthorApi + Send + Sync + 'static, S: StfEnclaveSigning + Send + Sync + 'static, H: HandleState + Send + Sync + 'static, diff --git a/tee-worker/litentry/core/stf-task/receiver/src/test.rs b/tee-worker/litentry/core/stf-task/receiver/src/test.rs index 87e7a1c115..61a9048590 100644 --- a/tee-worker/litentry/core/stf-task/receiver/src/test.rs +++ b/tee-worker/litentry/core/stf-task/receiver/src/test.rs @@ -3,6 +3,7 @@ use mock::*; use codec::Decode; use ita_stf::{TrustedCall, TrustedCallSigned}; +use itp_sgx_crypto::{mocks::KeyRepositoryMock, ShieldingCryptoDecrypt}; use itp_stf_executor::mocks::StfEnclaveSignerMock; use itp_test::mock::{ handle_state_mock::HandleStateMock, onchain_mock::OnchainMock, @@ -15,16 +16,19 @@ use litentry_primitives::Assertion; #[test] fn test_threadpool_behaviour() { let shielding_key = ShieldingCryptoMock::default(); + let shielding_key_repository_mock = KeyRepositoryMock::new(shielding_key.clone()); let author_mock = AuthorApiMock::default(); let stf_enclave_signer_mock = StfEnclaveSignerMock::default(); let handle_state_mock = HandleStateMock::default(); let onchain_mock = OnchainMock::default(); + let data_provider_conifg = DataProviderConfig::new(); let context = StfTaskContext::new( - shielding_key.clone(), + Arc::new(shielding_key_repository_mock), author_mock.into(), stf_enclave_signer_mock.into(), handle_state_mock.into(), onchain_mock.into(), + data_provider_conifg.into(), ); let _handle = std::thread::spawn(move || { run_stf_task_receiver(Arc::new(context)).unwrap(); diff --git a/tee-worker/litentry/core/vc-issuance/lc-vc-task-receiver/Cargo.toml b/tee-worker/litentry/core/vc-issuance/lc-vc-task-receiver/Cargo.toml index de66eb7b43..39a5a0c0cc 100644 --- a/tee-worker/litentry/core/vc-issuance/lc-vc-task-receiver/Cargo.toml +++ b/tee-worker/litentry/core/vc-issuance/lc-vc-task-receiver/Cargo.toml @@ -8,20 +8,16 @@ edition = "2021" [dependencies] # std dependencies futures = { version = "0.3.8", optional = true } -thiserror = { version = "1.0.26", optional = true } threadpool = { version = "1.8.0", optional = true } # sgx dependencies futures_sgx = { package = "futures", git = "https://github.com/mesalock-linux/futures-rs-sgx", optional = true } hex-sgx = { package = "hex", git = "https://github.com/mesalock-linux/rust-hex-sgx", tag = "sgx_1.1.3", features = ["sgx_tstd"], optional = true } sgx_tstd = { git = "https://github.com/apache/teaclave-sgx-sdk.git", branch = "master", features = ["net", "thread"], optional = true } -thiserror_sgx = { package = "thiserror", git = "https://github.com/mesalock-linux/thiserror-sgx", tag = "sgx_1.1.3", optional = true } threadpool_sgx = { git = "https://github.com/mesalock-linux/rust-threadpool-sgx", package = "threadpool", tag = "sgx_1.1.3", optional = true } -url_sgx = { package = "url", git = "https://github.com/mesalock-linux/rust-url-sgx", tag = "sgx_1.1.3", optional = true } # no_std dependencies codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -lazy_static = { version = "1.1.0", features = ["spin_no_std"] } log = { version = "0.4", default-features = false } sp-core = { default-features = false, features = ["full_crypto"], git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.42" } @@ -31,7 +27,6 @@ ita-stf = { path = "../../../../app-libs/stf", default-features = false } itp-extrinsics-factory = { path = "../../../../core-primitives/extrinsics-factory", default-features = false } itp-types = { path = "../../../../core-primitives/types", default-features = false } -itp-enclave-metrics = { path = "../../../../core-primitives/enclave-metrics", default-features = false } itp-node-api = { path = "../../../../core-primitives/node-api", default-features = false } itp-ocall-api = { path = "../../../../core-primitives/ocall-api", default-features = false } itp-sgx-crypto = { path = "../../../../core-primitives/sgx/crypto", default-features = false } @@ -46,7 +41,6 @@ frame-support = { default-features = false, git = "https://github.com/paritytech lc-assertion-build = { path = "../../assertion-build", default-features = false } lc-credentials = { path = "../../credentials", default-features = false } lc-data-providers = { path = "../../data-providers", default-features = false } -lc-identity-verification = { path = "../../identity-verification", default-features = false } lc-stf-task-receiver = { path = "../../stf-task/receiver", default-features = false } lc-stf-task-sender = { path = "../../stf-task/sender", default-features = false } lc-vc-task-sender = { path = "../lc-vc-task-sender", default-features = false } @@ -60,8 +54,6 @@ sgx = [ "futures_sgx", "hex-sgx", "sgx_tstd", - "thiserror_sgx", - "url_sgx", "ita-stf/sgx", "itp-sgx-externalities/sgx", "itp-stf-executor/sgx", @@ -69,7 +61,6 @@ sgx = [ "itp-top-pool-author/sgx", "sp-core/full_crypto", "litentry-primitives/sgx", - "lc-identity-verification/sgx", "lc-assertion-build/sgx", "lc-credentials/sgx", "lc-data-providers/sgx", @@ -84,14 +75,12 @@ std = [ "threadpool", "futures", "log/std", - "thiserror", "itp-types/std", "itp-top-pool-author/std", "itp-stf-executor/std", "itp-stf-state-handler/std", "sp-core/std", "litentry-primitives/std", - "lc-identity-verification/std", "lc-assertion-build/std", "ita-sgx-runtime/std", "frame-support/std", diff --git a/tee-worker/litentry/core/vc-issuance/lc-vc-task-receiver/src/lib.rs b/tee-worker/litentry/core/vc-issuance/lc-vc-task-receiver/src/lib.rs index bda9c702eb..653ca79a8d 100644 --- a/tee-worker/litentry/core/vc-issuance/lc-vc-task-receiver/src/lib.rs +++ b/tee-worker/litentry/core/vc-issuance/lc-vc-task-receiver/src/lib.rs @@ -8,9 +8,7 @@ extern crate sgx_tstd as std; pub mod sgx_reexport_prelude { pub use futures_sgx as futures; pub use hex_sgx as hex; - pub use thiserror_sgx as thiserror; pub use threadpool_sgx as threadpool; - pub use url_sgx as url; } #[cfg(all(feature = "std", feature = "sgx"))] @@ -33,7 +31,7 @@ use itp_node_api::metadata::{ pallet_vcmp::VCMPCallIndexes, provider::AccessNodeMetadata, NodeMetadataTrait, }; use itp_ocall_api::{EnclaveMetricsOCallApi, EnclaveOnChainOCallApi}; -use itp_sgx_crypto::{ShieldingCryptoDecrypt, ShieldingCryptoEncrypt}; +use itp_sgx_crypto::{key_repository::AccessKey, ShieldingCryptoDecrypt, ShieldingCryptoEncrypt}; use itp_sgx_externalities::SgxExternalitiesTrait; use itp_stf_executor::traits::StfEnclaveSigning; use itp_stf_state_handler::handle_state::HandleState; @@ -58,12 +56,14 @@ use threadpool::ThreadPool; mod vc_handling; -pub fn run_vc_handler_runner( - context: Arc>, +pub fn run_vc_handler_runner( + context: Arc>, extrinsic_factory: Arc, node_metadata_repo: Arc, ) where - K: ShieldingCryptoDecrypt + ShieldingCryptoEncrypt + Clone + Send + Sync + 'static, + ShieldingKeyRepository: AccessKey + Send + Sync + 'static, + ::KeyType: + ShieldingCryptoEncrypt + ShieldingCryptoDecrypt + 'static, A: AuthorApi + Send + Sync + 'static, S: StfEnclaveSigning + Send + Sync + 'static, H: HandleState + Send + Sync + 'static, @@ -96,16 +96,18 @@ pub fn run_vc_handler_runner( } } -pub fn handle_request( +pub fn handle_request( key: Vec, mut encrypted_trusted_call: AesOutput, shard: ShardIdentifier, - context: Arc>, + context: Arc>, extrinsic_factory: Arc, node_metadata_repo: Arc, ) -> Result, String> where - K: ShieldingCryptoDecrypt + ShieldingCryptoEncrypt + Clone + Send + Sync + 'static, + ShieldingKeyRepository: AccessKey, + ::KeyType: + ShieldingCryptoEncrypt + ShieldingCryptoDecrypt + 'static, A: AuthorApi + Send + Sync + 'static, S: StfEnclaveSigning + Send + Sync + 'static, H: HandleState + Send + Sync + 'static, @@ -115,8 +117,12 @@ where N: AccessNodeMetadata + Send + Sync + 'static, N::MetadataType: NodeMetadataTrait, { - let aes_key: RequestAesKey = context + let shielding_key = context .shielding_key + .retrieve_key() + .map_err(|e| format!("Failed to retrieve shielding key: {:?}", e))?; + + let aes_key: RequestAesKey = shielding_key .decrypt(&key) .map_err(|e| format!("Failed to decrypted AES Key: {:?}", e))? .try_into() diff --git a/tee-worker/litentry/core/vc-issuance/lc-vc-task-receiver/src/vc_handling.rs b/tee-worker/litentry/core/vc-issuance/lc-vc-task-receiver/src/vc_handling.rs index ed16501cb0..33d6cc1ab6 100644 --- a/tee-worker/litentry/core/vc-issuance/lc-vc-task-receiver/src/vc_handling.rs +++ b/tee-worker/litentry/core/vc-issuance/lc-vc-task-receiver/src/vc_handling.rs @@ -4,12 +4,12 @@ use crate::{Getter, TrustedCallSigned}; use ita_sgx_runtime::Hash; pub use ita_stf::aes_encrypt_default; use itp_ocall_api::EnclaveOnChainOCallApi; -use itp_sgx_crypto::{ShieldingCryptoDecrypt, ShieldingCryptoEncrypt}; +use itp_sgx_crypto::{key_repository::AccessKey, ShieldingCryptoDecrypt, ShieldingCryptoEncrypt}; use itp_sgx_externalities::SgxExternalitiesTrait; use itp_stf_executor::traits::StfEnclaveSigning; use itp_stf_state_handler::handle_state::HandleState; use itp_top_pool_author::traits::AuthorApi; -use lc_data_providers::{DataProviderConfigReader, ReadDataProviderConfig}; +use lc_data_providers::DataProviderConfig; use lc_stf_task_receiver::StfTaskContext; use lc_stf_task_sender::AssertionBuildRequest; use lc_vc_task_sender::VCResponse; @@ -17,22 +17,28 @@ use litentry_primitives::{ AmountHoldingTimeType, Assertion, ErrorDetail, ErrorString, Identity, ParameterString, VCMPError, }; -use std::{format, sync::Arc}; +use std::{format, string::ToString, sync::Arc}; pub(crate) struct VCRequestHandler< - K: ShieldingCryptoDecrypt + ShieldingCryptoEncrypt + Clone, + ShieldingKeyRepository, A: AuthorApi, S: StfEnclaveSigning, H: HandleState, O: EnclaveOnChainOCallApi, -> { +> where + ShieldingKeyRepository: AccessKey, + ::KeyType: + ShieldingCryptoDecrypt + ShieldingCryptoEncrypt + 'static, +{ pub(crate) req: AssertionBuildRequest, - pub(crate) context: Arc>, + pub(crate) context: Arc>, } -impl VCRequestHandler +impl VCRequestHandler where - K: ShieldingCryptoDecrypt + ShieldingCryptoEncrypt + Clone, + ShieldingKeyRepository: AccessKey, + ::KeyType: + ShieldingCryptoDecrypt + ShieldingCryptoEncrypt + 'static, A: AuthorApi, S: StfEnclaveSigning, H: HandleState, @@ -43,72 +49,125 @@ where let mut credential = match self.req.assertion.clone() { Assertion::A1 => lc_assertion_build::a1::build(&self.req), - Assertion::A2(guild_id) => lc_assertion_build::a2::build(&self.req, guild_id), - - Assertion::A3(guild_id, channel_id, role_id) => - lc_assertion_build::a3::build(&self.req, guild_id, channel_id, role_id), - - Assertion::A4(min_balance) => - build_holding_time(&self.req, AmountHoldingTimeType::LIT, min_balance), - - Assertion::A6 => lc_assertion_build::a6::build(&self.req), - - Assertion::A7(min_balance) => - build_holding_time(&self.req, AmountHoldingTimeType::DOT, min_balance), + Assertion::A2(guild_id) => lc_assertion_build::a2::build( + &self.req, + guild_id, + &self.context.data_provider_config, + ), + + Assertion::A3(guild_id, channel_id, role_id) => lc_assertion_build::a3::build( + &self.req, + guild_id, + channel_id, + role_id, + &self.context.data_provider_config, + ), + + Assertion::A4(min_balance) => build_holding_time( + &self.req, + AmountHoldingTimeType::LIT, + min_balance, + &self.context.data_provider_config, + ), + + Assertion::A6 => + lc_assertion_build::a6::build(&self.req, &self.context.data_provider_config), + + Assertion::A7(min_balance) => build_holding_time( + &self.req, + AmountHoldingTimeType::DOT, + min_balance, + &self.context.data_provider_config, + ), // no need to pass `networks` again because it's the same as the `get_supported_web3networks` - Assertion::A8(_networks) => lc_assertion_build::a8::build(&self.req), - - Assertion::A10(min_balance) => - build_holding_time(&self.req, AmountHoldingTimeType::WBTC, min_balance), - - Assertion::A11(min_balance) => - build_holding_time(&self.req, AmountHoldingTimeType::ETH, min_balance), + Assertion::A8(_networks) => + lc_assertion_build::a8::build(&self.req, &self.context.data_provider_config), + + Assertion::A10(min_balance) => build_holding_time( + &self.req, + AmountHoldingTimeType::WBTC, + min_balance, + &self.context.data_provider_config, + ), + + Assertion::A11(min_balance) => build_holding_time( + &self.req, + AmountHoldingTimeType::ETH, + min_balance, + &self.context.data_provider_config, + ), Assertion::A13(owner) => lc_assertion_build::a13::build(&self.req, self.context.ocall_api.clone(), &owner), - Assertion::A14 => lc_assertion_build::a14::build(&self.req), + Assertion::A14 => + lc_assertion_build::a14::build(&self.req, &self.context.data_provider_config), - Assertion::Achainable(param) => lc_assertion_build::achainable::build(&self.req, param), + Assertion::Achainable(param) => lc_assertion_build::achainable::build( + &self.req, + param, + &self.context.data_provider_config, + ), Assertion::A20 => lc_assertion_build::a20::build(&self.req), - Assertion::Oneblock(course_type) => - lc_assertion_build::oneblock::course::build(&self.req, course_type), + Assertion::Oneblock(course_type) => lc_assertion_build::oneblock::course::build( + &self.req, + course_type, + &self.context.data_provider_config, + ), Assertion::GenericDiscordRole(role_type) => - lc_assertion_build::generic_discord_role::build(&self.req, role_type), + lc_assertion_build::generic_discord_role::build( + &self.req, + role_type, + &self.context.data_provider_config, + ), Assertion::BnbDomainHolding => lc_assertion_build::nodereal::bnb_domain::bnb_domain_holding_amount::build( &self.req, + &self.context.data_provider_config, ), Assertion::BnbDigitDomainClub(digit_domain_type) => lc_assertion_build::nodereal::bnb_domain::bnb_digit_domain_club_amount::build( &self.req, digit_domain_type, + &self.context.data_provider_config, ), - Assertion::VIP3MembershipCard(level) => - lc_assertion_build::vip3::card::build(&self.req, level), + Assertion::VIP3MembershipCard(level) => lc_assertion_build::vip3::card::build( + &self.req, + level, + &self.context.data_provider_config, + ), Assertion::WeirdoGhostGangHolder => - lc_assertion_build::nodereal::nft_holder::weirdo_ghost_gang_holder::build(&self.req), + lc_assertion_build::nodereal::nft_holder::weirdo_ghost_gang_holder::build( + &self.req, + &self.context.data_provider_config, + ), Assertion::LITStaking => lc_assertion_build::lit_staking::build(&self.req), Assertion::EVMAmountHolding(token_type) => lc_assertion_build::nodereal::amount_holding::evm_amount_holding::build( - &self.req, token_type, + &self.req, + token_type, + &self.context.data_provider_config, ), - Assertion::BRC20AmountHolder => - lc_assertion_build::brc20::amount_holder::build(&self.req), + Assertion::BRC20AmountHolder => lc_assertion_build::brc20::amount_holder::build( + &self.req, + &self.context.data_provider_config, + ), - Assertion::CryptoSummary => - lc_assertion_build::nodereal::crypto_summary::build(&self.req), + Assertion::CryptoSummary => lc_assertion_build::nodereal::crypto_summary::build( + &self.req, + &self.context.data_provider_config, + ), }?; // post-process the credential @@ -120,9 +179,8 @@ where ) })?; - let data_provider_config = DataProviderConfigReader::read() - .map_err(|e| VCMPError::RequestVCFailed(self.req.assertion.clone(), e))?; - credential.credential_subject.endpoint = data_provider_config.credential_endpoint; + credential.credential_subject.endpoint = + self.context.data_provider_config.credential_endpoint.to_string(); credential.issuer.id = Identity::Substrate(enclave_account.into()).to_did().map_err(|e| { @@ -167,6 +225,7 @@ fn build_holding_time( req: &AssertionBuildRequest, htype: AmountHoldingTimeType, min_balance: ParameterString, + data_provider_config: &DataProviderConfig, ) -> Result { - lc_assertion_build::holding_time::build(req, htype, min_balance) + lc_assertion_build::holding_time::build(req, htype, min_balance, data_provider_config) } diff --git a/tee-worker/litentry/core/vc-issuance/lc-vc-task-sender/Cargo.toml b/tee-worker/litentry/core/vc-issuance/lc-vc-task-sender/Cargo.toml index 53c08394c1..69e6fe4e21 100644 --- a/tee-worker/litentry/core/vc-issuance/lc-vc-task-sender/Cargo.toml +++ b/tee-worker/litentry/core/vc-issuance/lc-vc-task-sender/Cargo.toml @@ -8,14 +8,10 @@ edition = "2021" [dependencies] # std dependencies futures = { version = "0.3.8", optional = true } -thiserror = { version = "1.0.26", optional = true } -url = { version = "2.0.0", optional = true } # sgx dependencies futures_sgx = { package = "futures", git = "https://github.com/mesalock-linux/futures-rs-sgx", optional = true } sgx_tstd = { branch = "master", git = "https://github.com/apache/teaclave-sgx-sdk.git", features = ["net", "thread"], optional = true } -thiserror_sgx = { package = "thiserror", git = "https://github.com/mesalock-linux/thiserror-sgx", tag = "sgx_1.1.3", optional = true } -url_sgx = { package = "url", git = "https://github.com/mesalock-linux/rust-url-sgx", tag = "sgx_1.1.3", optional = true } # no_std dependencies codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } @@ -30,7 +26,6 @@ sp-std = { git = "https://github.com/paritytech/substrate.git", branch = "polkad itp-types = { path = "../../../../core-primitives/types", default-features = false } # litentry -itp-stf-primitives = { default-features = false, path = "../../../../core-primitives/stf-primitives" } lc-stf-task-sender = { path = "../../stf-task/sender", default-features = false } litentry-primitives = { path = "../../../primitives", default-features = false } @@ -38,8 +33,6 @@ litentry-primitives = { path = "../../../primitives", default-features = false } default = ["std"] sgx = [ "sgx_tstd", - "thiserror_sgx", - "url_sgx", "lc-stf-task-sender/sgx", "futures_sgx", ] @@ -47,8 +40,6 @@ std = [ "log/std", "sp-runtime/std", "sp-std/std", - "thiserror", - "url", "itp-types/std", "lc-stf-task-sender/std", "futures", diff --git a/tee-worker/litentry/core/vc-issuance/lc-vc-task-sender/src/lib.rs b/tee-worker/litentry/core/vc-issuance/lc-vc-task-sender/src/lib.rs index 7721ecde09..a6d642b65f 100644 --- a/tee-worker/litentry/core/vc-issuance/lc-vc-task-sender/src/lib.rs +++ b/tee-worker/litentry/core/vc-issuance/lc-vc-task-sender/src/lib.rs @@ -11,8 +11,6 @@ extern crate sgx_tstd as std; #[cfg(all(not(feature = "std"), feature = "sgx"))] pub mod sgx_reexport_prelude { pub use futures_sgx as futures; - pub use thiserror_sgx as thiserror; - pub use url_sgx as url; } #[cfg(all(not(feature = "std"), feature = "sgx"))] diff --git a/tee-worker/local-setup/config/one-worker.json b/tee-worker/local-setup/config/one-worker.json index 92bd62c04e..8e208e1849 100644 --- a/tee-worker/local-setup/config/one-worker.json +++ b/tee-worker/local-setup/config/one-worker.json @@ -34,8 +34,6 @@ "-h", "4545", "--ws-external", - "--running-mode", - "mock", "--enable-mock-server", "--parentchain-start-block", "0", diff --git a/tee-worker/local-setup/config/three-workers.json b/tee-worker/local-setup/config/three-workers.json index 8f1949ef44..d31faa7cd9 100644 --- a/tee-worker/local-setup/config/three-workers.json +++ b/tee-worker/local-setup/config/three-workers.json @@ -15,8 +15,6 @@ "3443", "-h", "4545", - "--running-mode", - "mock", "--enable-mock-server", "--parentchain-start-block", "0", @@ -42,8 +40,6 @@ "3453", "-h", "4555", - "--running-mode", - "mock", "--enable-mock-server", "--parentchain-start-block", "0" @@ -69,8 +65,6 @@ "3463", "-h", "4565", - "--running-mode", - "mock", "--enable-mock-server", "--parentchain-start-block", "0" diff --git a/tee-worker/local-setup/config/two-workers.json b/tee-worker/local-setup/config/two-workers.json index 212b5e3ddc..2ed4f08d17 100644 --- a/tee-worker/local-setup/config/two-workers.json +++ b/tee-worker/local-setup/config/two-workers.json @@ -34,8 +34,6 @@ "-h", "4545", "--ws-external", - "--running-mode", - "mock", "--enable-mock-server", "--parentchain-start-block", "0", @@ -63,8 +61,6 @@ "-h", "4546", "--ws-external", - "--running-mode", - "mock", "--enable-mock-server", "--parentchain-start-block", "0", diff --git a/tee-worker/local-setup/development-worker.json b/tee-worker/local-setup/development-worker.json index e27ae0da34..3aff16fc7a 100644 --- a/tee-worker/local-setup/development-worker.json +++ b/tee-worker/local-setup/development-worker.json @@ -15,8 +15,6 @@ "$UntrustedHttpPort", "-p", "$CollatorWSPort", - "--running-mode", - "mock", "--enable-mock-server", "--parentchain-start-block", "0", diff --git a/tee-worker/scripts/launch_local_worker.sh b/tee-worker/scripts/launch_local_worker.sh index 4fd4d40bbe..31e9c61873 100755 --- a/tee-worker/scripts/launch_local_worker.sh +++ b/tee-worker/scripts/launch_local_worker.sh @@ -27,8 +27,6 @@ WORKER_NUM=${worker_num:-1} NODE_URL=${node_url:-"ws://127.0.0.1"} # "ws://host.docker.internal" NODE_PORT=${node_port:-"9944"} # "9946" -RUNNING_MODE=${mode:-"mock"} - # Fixed values: WORKER_ENDPOINT="localhost" MU_RA_PORT="3443" @@ -130,7 +128,6 @@ for ((i = 0; i < ${WORKER_NUM}; i++)); do --untrusted-external-address ws://${WORKER_ENDPOINT} \ --untrusted-http-port ${untrusted_http_port} \ --untrusted-worker-port ${untrusted_worker_port} \ ---running-mode ${RUNNING_MODE} ${MOCK_SERVER} \ run --skip-ra ${FSUBCMD_DEV} ${FSUBCMD_REQ_STATE}" echo "${worker_name} command: ${launch_command}" diff --git a/tee-worker/scripts/litentry/release/ReadMe.md b/tee-worker/scripts/litentry/release/ReadMe.md index 7a4cbfa22a..59f516c258 100644 --- a/tee-worker/scripts/litentry/release/ReadMe.md +++ b/tee-worker/scripts/litentry/release/ReadMe.md @@ -45,7 +45,7 @@ Before starting the workers, please make sure the target parachain is already up The service will start up like this example: ``` - RUST_LOG=info,litentry_worker=debug,ws=warn,sp_io=error,substrate_api_client=warn,itc_parentchain_light_client=info,jsonrpsee_ws_client=warn,jsonrpsee_ws_server=warn,enclave_runtime=debug,ita_stf=debug,its_rpc_handler=warn,itc_rpc_client=warn,its_consensus_common=debug,its_state=warn,its_consensus_aura=warn,aura*=warn,its_consensus_slots=warn,itp_attestation_handler=debug,http_req=debug,lc_mock_server=warn,itc_rest_client=debug,lc_credentials=debug,lc_identity_verification=debug,lc_stf_task_receiver=debug,lc_stf_task_sender=debug,lc_data_providers=debug,itp_top_pool=debug,itc_parentchain_indirect_calls_executor=debug ./litentry-worker --clean-reset --ws-external --mu-ra-external-address localhost --mu-ra-port 3443 --node-port 9944 --node-url ws://127.0.0.1 --trusted-external-address wss://localhost --trusted-worker-port 2000 --untrusted-external-address ws://localhost --untrusted-http-port 4545 --untrusted-worker-port 3000 --running-mode dev --enable-mock-server run --skip-ra --dev + RUST_LOG=info,litentry_worker=debug,ws=warn,sp_io=error,substrate_api_client=warn,itc_parentchain_light_client=info,jsonrpsee_ws_client=warn,jsonrpsee_ws_server=warn,enclave_runtime=debug,ita_stf=debug,its_rpc_handler=warn,itc_rpc_client=warn,its_consensus_common=debug,its_state=warn,its_consensus_aura=warn,aura*=warn,its_consensus_slots=warn,itp_attestation_handler=debug,http_req=debug,lc_mock_server=warn,itc_rest_client=debug,lc_credentials=debug,lc_identity_verification=debug,lc_stf_task_receiver=debug,lc_stf_task_sender=debug,lc_data_providers=debug,itp_top_pool=debug,itc_parentchain_indirect_calls_executor=debug ./litentry-worker --clean-reset --ws-external --mu-ra-external-address localhost --mu-ra-port 3443 --node-port 9944 --node-url ws://127.0.0.1 --trusted-external-address wss://localhost --trusted-worker-port 2000 --untrusted-external-address ws://localhost --untrusted-http-port 4545 --untrusted-worker-port 3000 --enable-mock-server run --skip-ra --dev ``` The first part is RUST_LOG info. In production env, most of them will be disabled. Or `RUST_LOG=info` is enough. @@ -81,9 +81,6 @@ Before starting the workers, please make sure the target parachain is already up -u, --node-url Set the node server protocol and IP address [default: ws://127.0.0.1] - --running-mode - Litentry TEE service running mode [default: dev] - -T, --trusted-external-address Set the trusted worker address to be advertised on the parentchain. If no port is given, the same as in `trusted-worker-port` will be used. diff --git a/tee-worker/service/Cargo.toml b/tee-worker/service/Cargo.toml index f7f0e2e353..c751b43e50 100644 --- a/tee-worker/service/Cargo.toml +++ b/tee-worker/service/Cargo.toml @@ -70,6 +70,7 @@ sp-runtime = { git = "https://github.com/paritytech/substrate.git", branch = "po # litentry config = "0.13.3" +ita-stf = { path = "../app-libs/stf", default-features = false } lc-data-providers = { path = "../litentry/core/data-providers" } lc-mock-server = { path = "../litentry/core/mock-server" } lc-stf-task-sender = { path = "../litentry/core/stf-task/sender", default-features = false } diff --git a/tee-worker/service/src/cli.yml b/tee-worker/service/src/cli.yml index a26232c5ba..db53ab0174 100644 --- a/tee-worker/service/src/cli.yml +++ b/tee-worker/service/src/cli.yml @@ -108,11 +108,6 @@ args: long: clean-reset short: c help: Cleans and purges any previous state and key files and generates them anew before starting. - - running-mode: - long: running-mode - help: Litentry TEE service running mode - takes_value: true - default_value: "dev" - enable-mock-server: long: enable-mock-server takes_value: false diff --git a/tee-worker/service/src/config.rs b/tee-worker/service/src/config.rs index 68fb269657..5c7b569d21 100644 --- a/tee-worker/service/src/config.rs +++ b/tee-worker/service/src/config.rs @@ -33,7 +33,6 @@ static DEFAULT_UNTRUSTED_PORT: &str = "2001"; static DEFAULT_MU_RA_PORT: &str = "3443"; static DEFAULT_METRICS_PORT: &str = "8787"; static DEFAULT_UNTRUSTED_HTTP_PORT: &str = "4545"; -static DEFAULT_RUNNING_MODE: &str = "dev"; static DEFAULT_MOCK_SERVER_PORT: &str = "19527"; static DEFAULT_PARENTCHAIN_START_BLOCK: &str = "0"; static DEFAULT_FAIL_AT: &str = "0"; @@ -70,9 +69,6 @@ pub struct Config { /// Config of the 'run' subcommand pub run_config: Option, - /// Litentry - /// running mode that determins the config: dev/staging/prod/mock - pub running_mode: String, /// whether to enable the HTTP mock server for testing pub enable_mock_server: bool, /// the mock server port @@ -106,7 +102,6 @@ impl Config { untrusted_http_port: String, data_dir: PathBuf, run_config: Option, - running_mode: String, enable_mock_server: bool, mock_server_port: String, parentchain_start_block: String, @@ -132,7 +127,6 @@ impl Config { untrusted_http_port, data_dir, run_config, - running_mode, enable_mock_server, mock_server_port, parentchain_start_block, @@ -299,7 +293,6 @@ impl From<&ArgMatches<'_>> for Config { untrusted_http_port.to_string(), data_dir, run_config, - m.value_of("running-mode").unwrap_or(DEFAULT_RUNNING_MODE).to_string(), is_mock_server_enabled, mock_server_port.to_string(), parentchain_start_block.to_string(), @@ -446,7 +439,6 @@ mod test { assert_eq!(config.untrusted_http_port, DEFAULT_UNTRUSTED_HTTP_PORT); assert_eq!(config.data_dir, pwd()); assert!(config.run_config.is_none()); - assert_eq!(config.running_mode, DEFAULT_RUNNING_MODE); assert_eq!(config.mock_server_port, DEFAULT_MOCK_SERVER_PORT); assert_eq!(config.parentchain_start_block, DEFAULT_PARENTCHAIN_START_BLOCK); assert_matches!(config.fail_slot_mode, Option::None); @@ -476,8 +468,6 @@ mod test { let mu_ra_port = "99"; let untrusted_http_port = "4321"; - // running mode for litentry: dev / staging / prod - let running_mode = "dev"; let mock_server_port = "19527"; let parentchain_start_block = "30"; @@ -493,7 +483,6 @@ mod test { ("untrusted-worker-port", Default::default()), ("trusted-worker-port", Default::default()), ("untrusted-http-port", Default::default()), - ("running-mode", Default::default()), ("mock-server-port", Default::default()), ("parentchain-start-block", Default::default()), ]); @@ -508,7 +497,6 @@ mod test { args.args.get_mut("untrusted-worker-port").unwrap().vals = vec![untrusted_port.into()]; args.args.get_mut("trusted-worker-port").unwrap().vals = vec![trusted_port.into()]; args.args.get_mut("untrusted-http-port").unwrap().vals = vec![untrusted_http_port.into()]; - args.args.get_mut("running-mode").unwrap().vals = vec![running_mode.into()]; args.args.get_mut("mock-server-port").unwrap().vals = vec![mock_server_port.into()]; args.args.get_mut("parentchain-start-block").unwrap().vals = vec![parentchain_start_block.into()]; @@ -524,7 +512,6 @@ mod test { assert_eq!(config.untrusted_external_worker_address, Some(untrusted_ext_addr.to_string())); assert_eq!(config.mu_ra_external_address, Some(mu_ra_ext_addr.to_string())); assert_eq!(config.untrusted_http_port, untrusted_http_port.to_string()); - assert_eq!(config.running_mode, running_mode.to_string()); assert_eq!(config.mock_server_port, mock_server_port.to_string()); assert_eq!(config.parentchain_start_block, parentchain_start_block.to_string()); } diff --git a/tee-worker/service/src/main_impl.rs b/tee-worker/service/src/main_impl.rs index 184b0b9921..a211d214f5 100644 --- a/tee-worker/service/src/main_impl.rs +++ b/tee-worker/service/src/main_impl.rs @@ -36,9 +36,7 @@ use itp_enclave_api::{ enclave_base::EnclaveBase, remote_attestation::{RemoteAttestation, TlsRemoteAttestation}, sidechain::Sidechain, - stf_task_handler::StfTaskHandler, teeracle_api::TeeracleApi, - vc_issuance::VcIssuance, }; use itp_node_api::{ api_client::{AccountApi, PalletTeerexApi, ParentchainApi}, @@ -182,8 +180,6 @@ pub(crate) fn main() { #[cfg(not(feature = "dcap"))] let quote_size = None; - let data_provider_config = get_data_provider_config(&config); - if let Some(run_config) = config.run_config() { let shard = extract_shard(run_config.shard(), enclave.as_ref()); @@ -231,7 +227,6 @@ pub(crate) fn main() { initialization_handler, quoting_enclave_target_info, quote_size, - &data_provider_config, ); } else if let Some(smatches) = matches.subcommand_matches("request-state") { println!("*** Requesting state from a registered worker \n"); @@ -337,7 +332,6 @@ fn start_worker( initialization_handler: Arc, quoting_enclave_target_info: Option, quote_size: Option, - data_provider_config: &DataProviderConfig, ) where T: GetTokioHandle, E: EnclaveBase @@ -346,8 +340,6 @@ fn start_worker( + RemoteAttestation + TlsRemoteAttestation + TeeracleApi - + StfTaskHandler - + VcIssuance + Clone, D: BlockPruner + FetchBlocks + Sync + Send + 'static, InitializationHandler: TrackInitialization + IsInitialized + Sync + Send + 'static, @@ -611,24 +603,6 @@ fn start_worker( initialization_handler.registered_on_parentchain(); - println!("[+] Starting stf task handler thread"); - // ------------------------------------------------------------------------ - // Start stf task handler thread - let enclave_api_stf_task_handler = enclave.clone(); - let data_provider = data_provider_config.clone(); - thread::spawn(move || { - enclave_api_stf_task_handler.run_stf_task_handler(data_provider).unwrap(); - }); - - println!("[+] Starting VC issuance handler thread"); - // ------------------------------------------------------------------------ - // Start vc issuance handler thread - let enclave_api_vc_task_handler = enclave.clone(); - let data_provider = data_provider_config.clone(); - thread::spawn(move || { - enclave_api_vc_task_handler.run_vc_issuance(data_provider).unwrap(); - }); - match WorkerModeProvider::worker_mode() { WorkerMode::Teeracle => { // ------------------------------------------------------------------------ @@ -1087,99 +1061,3 @@ fn we_are_primary_worker( node_api.enclave_count(Some(*register_enclave_xt_header.parent_hash()))?; Ok(enclave_count_of_previous_block == 0) } - -fn get_data_provider_config(config: &Config) -> DataProviderConfig { - let built_in_modes = vec!["dev", "staging", "prod", "mock"]; - let built_in_config: Value = - serde_json::from_slice(include_bytes!("running-mode-config.json")).unwrap(); - - let mut data_provider_config = if built_in_modes.contains(&config.running_mode.as_str()) { - let config = built_in_config.get(config.running_mode.as_str()).unwrap(); - serde_json::from_value::(config.clone()).unwrap() - } else { - let file_path = config.running_mode.as_str(); - let mut file = File::open(file_path) - .map_err(|e| format!("{:?}, file:{}", e, file_path)) - .unwrap(); - let mut data = String::new(); - file.read_to_string(&mut data).unwrap(); - serde_json::from_str::(data.as_str()).unwrap() - }; - if let Ok(v) = env::var("TWITTER_OFFICIAL_URL") { - data_provider_config.set_twitter_official_url(v); - } - if let Ok(v) = env::var("TWITTER_LITENTRY_URL") { - data_provider_config.set_twitter_litentry_url(v); - } - // Bearer Token is as same as App only Access Token on Twitter (https://developer.twitter.com/en/docs/authentication/oauth-2-0/application-only), - // that is for developers that just need read-only access to public information. - if let Ok(v) = env::var("TWITTER_AUTH_TOKEN_V2") { - data_provider_config.set_twitter_auth_token_v2(v); - } - if let Ok(v) = env::var("DISCORD_OFFICIAL_URL") { - data_provider_config.set_discord_official_url(v); - } - if let Ok(v) = env::var("DISCORD_LITENTRY_URL") { - data_provider_config.set_discord_litentry_url(v); - } - if let Ok(v) = env::var("DISCORD_AUTH_TOKEN") { - data_provider_config.set_discord_auth_token(v); - } - if let Ok(v) = env::var("ACHAINABLE_URL") { - data_provider_config.set_achainable_url(v); - } - if let Ok(v) = env::var("ACHAINABLE_AUTH_KEY") { - data_provider_config.set_achainable_auth_key(v); - } - if let Ok(v) = env::var("CREDENTIAL_ENDPOINT") { - data_provider_config.set_credential_endpoint(v); - } - if let Ok(v) = env::var("ONEBLOCK_NOTION_KEY") { - data_provider_config.set_oneblock_notion_key(v); - } - if let Ok(v) = env::var("ONEBLOCK_NOTION_URL") { - data_provider_config.set_oneblock_notion_url(v); - } - if let Ok(v) = env::var("SORA_QUIZ_MASTER_ID") { - data_provider_config.set_sora_quiz_master_id(v); - } - if let Ok(v) = env::var("SORA_QUIZ_ATTENDEE_ID") { - data_provider_config.set_sora_quiz_attendee_id(v); - } - if let Ok(v) = env::var("NODEREAL_API_KEY") { - data_provider_config.set_nodereal_api_key(v); - } - if let Ok(v) = env::var("NODEREAL_API_RETRY_DELAY") { - let value: u64 = v.parse().unwrap(); - data_provider_config.set_nodereal_api_retry_delay(value); - } - if let Ok(v) = env::var("NODEREAL_API_RETRY_TIMES") { - let value: u16 = v.parse().unwrap(); - data_provider_config.set_nodereal_api_retry_times(value); - } - if let Ok(v) = env::var("NODEREAL_API_URL") { - data_provider_config.set_nodereal_api_url(v); - } - if let Ok(v) = env::var("NODEREAL_API_CHAIN_NETWORK_URL") { - data_provider_config.set_nodereal_api_chain_network_url(v); - } - if let Ok(v) = env::var("CONTEST_LEGEND_DISCORD_ROLE_ID") { - data_provider_config.set_contest_legend_discord_role_id(v); - } - if let Ok(v) = env::var("CONTEST_POPULARITY_DISCORD_ROLE_ID") { - data_provider_config.set_contest_popularity_discord_role_id(v); - } - if let Ok(v) = env::var("CONTEST_PARTICIPANT_DISCORD_ROLE_ID") { - data_provider_config.set_contest_participant_discord_role_id(v); - } - if let Ok(v) = env::var("VIP3_URL") { - data_provider_config.set_vip3_url(v); - } - if let Ok(v) = env::var("GENIIDATA_URL") { - data_provider_config.set_geniidata_url(v); - } - if let Ok(v) = env::var("GENIIDATA_API_KEY") { - data_provider_config.set_geniidata_api_key(v); - } - data_provider_config -} diff --git a/tee-worker/service/src/running-mode-config.json b/tee-worker/service/src/running-mode-config.json deleted file mode 100644 index 117cd7e55c..0000000000 --- a/tee-worker/service/src/running-mode-config.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "dev": { - "twitter_official_url": "https://api.twitter.com", - "twitter_litentry_url": "http://54.255.182.249:9527", - "twitter_auth_token_v2": "abcdefghijklmnopqrstuvwxyz", - "discord_official_url": "https://discordapp.com", - "discord_litentry_url": "http://54.255.182.249:9527", - "discord_auth_token": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", - "achainable_url": "https://label-production.graph.tdf-labs.io", - "achainable_auth_key": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", - "credential_endpoint": "http://localhost:9933", - "oneblock_notion_key": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", - "oneblock_notion_url": "https://abc.com", - "sora_quiz_master_id": "SORA_QUIZ_MASTER_ID", - "sora_quiz_attendee_id": "SORA_QUIZ_ATTENDEE_ID", - "nodereal_api_key": "NODEREAL_API_KEY", - "nodereal_api_retry_delay": 5000, - "nodereal_api_retry_times": 2, - "nodereal_api_url": "https://open-platform.nodereal.io/", - "nodereal_api_chain_network_url": "https://{chain}-mainnet.nodereal.io/", - "contest_legend_discord_role_id": "CONTEST_LEGEND_DISCORD_ROLE_ID", - "contest_popularity_discord_role_id": "CONTEST_POPULARITY_DISCORD_ROLE_ID", - "contest_participant_discord_role_id": "CONTEST_PARTICIPANT_DISCORD_ROLE_ID", - "vip3_url": "https://dappapi.vip3.io/", - "geniidata_url": "https://api.geniidata.com/api/1/brc20/balance?", - "geniidata_api_key": "142cf1b0-1ca7-11ee-bb5e-9d74c2e854ac" - }, - "mock": { - "twitter_official_url": "http://localhost:19527", - "twitter_litentry_url": "http://localhost:19527", - "twitter_auth_token_v2": "", - "discord_official_url": "http://localhost:19527", - "discord_litentry_url": "http://localhost:19527", - "discord_auth_token": "", - "achainable_url": "http://localhost:19527", - "achainable_auth_key": "", - "credential_endpoint": "http://localhost:9933", - "oneblock_notion_key": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", - "oneblock_notion_url": "https://abc.com", - "sora_quiz_master_id": "SORA_QUIZ_MASTER_ID", - "sora_quiz_attendee_id": "SORA_QUIZ_ATTENDEE_ID", - "nodereal_api_key": "NODEREAL_API_KEY", - "nodereal_api_retry_delay": 5000, - "nodereal_api_retry_times": 2, - "nodereal_api_url": "https://open-platform.nodereal.io/", - "nodereal_api_chain_network_url": "https://{chain}-mainnet.nodereal.io/", - "contest_legend_discord_role_id": "CONTEST_LEGEND_DISCORD_ROLE_ID", - "contest_popularity_discord_role_id": "CONTEST_POPULARITY_DISCORD_ROLE_ID", - "contest_participant_discord_role_id": "CONTEST_PARTICIPANT_DISCORD_ROLE_ID", - "vip3_url": "https://dappapi.vip3.io/", - "geniidata_url": "https://api.geniidata.com/api/1/brc20/balance?", - "geniidata_api_key": "142cf1b0-1ca7-11ee-bb5e-9d74c2e854ac" - }, - "prod": { - "twitter_official_url": "https://api.twitter.com", - "twitter_litentry_url": "", - "twitter_auth_token_v2": "abcdefghijklmnopqrstuvwxyz", - "discord_official_url": "https://discordapp.com", - "discord_litentry_url": "", - "discord_auth_token": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", - "achainable_url": "https://label-production.graph.tdf-labs.io", - "achainable_auth_key": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", - "credential_endpoint": "", - "oneblock_notion_key": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", - "oneblock_notion_url": "https://abc.com", - "sora_quiz_master_id": "SORA_QUIZ_MASTER_ID", - "sora_quiz_attendee_id": "SORA_QUIZ_ATTENDEE_ID", - "nodereal_api_key": "NODEREAL_API_KEY", - "nodereal_api_retry_delay": 5000, - "nodereal_api_retry_times": 2, - "nodereal_api_url": "https://open-platform.nodereal.io/", - "nodereal_api_chain_network_url": "https://{chain}-mainnet.nodereal.io/", - "contest_legend_discord_role_id": "CONTEST_LEGEND_DISCORD_ROLE_ID", - "contest_popularity_discord_role_id": "CONTEST_POPULARITY_DISCORD_ROLE_ID", - "contest_participant_discord_role_id": "CONTEST_PARTICIPANT_DISCORD_ROLE_ID", - "vip3_url": "https://dappapi.vip3.io/", - "geniidata_url": "https://api.geniidata.com/api/1/brc20/balance?", - "geniidata_api_key": "142cf1b0-1ca7-11ee-bb5e-9d74c2e854ac" - }, - "staging": { - "twitter_official_url": "https://api.twitter.com", - "twitter_litentry_url": "http://54.255.182.249:9527", - "twitter_auth_token_v2": "abcdefghijklmnopqrstuvwxyz", - "discord_official_url": "https://discordapp.com", - "discord_litentry_url": "http://54.255.182.249:9527", - "discord_auth_token": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", - "achainable_url": "https://label-production.graph.tdf-labs.io", - "achainable_auth_key": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", - "credential_endpoint": "wss://tee-staging.litentry.io", - "oneblock_notion_key": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", - "oneblock_notion_url": "https://abc.com", - "sora_quiz_master_id": "SORA_QUIZ_MASTER_ID", - "sora_quiz_attendee_id": "SORA_QUIZ_ATTENDEE_ID", - "nodereal_api_key": "NODEREAL_API_KEY", - "nodereal_api_retry_delay": 5000, - "nodereal_api_retry_times": 2, - "nodereal_api_url": "https://open-platform.nodereal.io/", - "nodereal_api_chain_network_url": "https://{chain}-mainnet.nodereal.io/", - "contest_legend_discord_role_id": "CONTEST_LEGEND_DISCORD_ROLE_ID", - "contest_popularity_discord_role_id": "CONTEST_POPULARITY_DISCORD_ROLE_ID", - "contest_participant_discord_role_id": "CONTEST_PARTICIPANT_DISCORD_ROLE_ID", - "vip3_url": "https://dappapi.vip3.io/", - "geniidata_url": "https://api.geniidata.com/api/1/brc20/balance?", - "geniidata_api_key": "142cf1b0-1ca7-11ee-bb5e-9d74c2e854ac" - } -} \ No newline at end of file diff --git a/tee-worker/service/src/tests/commons.rs b/tee-worker/service/src/tests/commons.rs index 0060c2d825..05bb81810a 100644 --- a/tee-worker/service/src/tests/commons.rs +++ b/tee-worker/service/src/tests/commons.rs @@ -56,7 +56,6 @@ pub fn local_worker_config( "4545".to_string(), crate::config::pwd(), None, - Default::default(), false, "19527".to_string(), "0".to_string(), diff --git a/tee-worker/ts-tests/worker/resuming_worker.test.ts b/tee-worker/ts-tests/worker/resuming_worker.test.ts index 62a12a7c9d..f5a7f49c1d 100644 --- a/tee-worker/ts-tests/worker/resuming_worker.test.ts +++ b/tee-worker/ts-tests/worker/resuming_worker.test.ts @@ -63,7 +63,6 @@ function generateWorkerCommandArguments( const isLaunch = command === 'launch'; return [ - '--running-mode mock', ...(workerParams.enableMockServer ? ['--enable-mock-server'] : []), ...(isLaunch ? ['--clean-reset'] : []), '--mu-ra-external-address localhost',