From 96b4f861036fadd13bbfc9d7a14216e9d79f64a2 Mon Sep 17 00:00:00 2001 From: Kun Li Date: Fri, 3 Nov 2023 20:48:22 +0100 Subject: [PATCH] Run LUCE with docker --- Dockerfile | 1 + README.md | 5 +- docs/build/doctrees/environment.pickle | Bin 220371 -> 204371 bytes luce_vm/js/Dockerfile | 20 ++- luce_vm/js/package.json | 2 +- luce_vm/js/src/koa/koa.js | 4 +- .../luce/accounts/tests/test_Registration.py | 2 +- luce_vm/luce_django/luce/blockchain/models.py | 15 +-- .../healthcare/tests/test_UploadDataView.py | 6 +- luce_vm/luce_django/luce/healthcare/views.py | 28 ++--- luce_vm/luce_django/luce/lucehome/settings.py | 2 + luce_vm/luce_django/luce/requirements.txt | 117 ++---------------- 12 files changed, 58 insertions(+), 144 deletions(-) diff --git a/Dockerfile b/Dockerfile index 05688af..029ddc0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -38,6 +38,7 @@ RUN brownie networks add LUCE luce host=http://ganache_db:8545 chainid=72 COPY . . +# RUN cd luce_vm/brownie && brownie compile # RUN pip install -e . diff --git a/README.md b/README.md index 2370822..ce7af7e 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,15 @@ ## How to launch LUCE (Debug purpose) -### install docker +### 1. Install docker - [for linux](https://docs.docker.com/desktop/install/linux-install/) - [for mac](https://docs.docker.com/desktop/install/mac-install/) - [for windows](https://docs.docker.com/desktop/install/windows-install/) +### 2. Launch LUCE +To launch LUCE, run: `docker compose up`. + ### database LUCE use PostgresQL to keep user information, just run: diff --git a/docs/build/doctrees/environment.pickle b/docs/build/doctrees/environment.pickle index 3cbc503137661f193be3b1c8a81a9aae9b75c257..9a0c94dced8463b25f52f61ae072cab3eb196c21 100644 GIT binary patch literal 204371 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 OiU)8Ym_cLOD}MpU#T#1y literal 220371 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 diff --git a/luce_vm/js/Dockerfile b/luce_vm/js/Dockerfile index 427fe97..2d0b78a 100644 --- a/luce_vm/js/Dockerfile +++ b/luce_vm/js/Dockerfile @@ -1,14 +1,24 @@ -FROM node:16 - +FROM node:20 WORKDIR /usr/src/js -COPY package*.json ./ +# Install Rust +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y -RUN npm install +# # Add Rust to PATH +ENV PATH="/root/.cargo/bin:${PATH}" + +RUN git clone https://github.com/iden3/circom.git +RUN cd circom && git checkout tags/v2.1.6 && cargo build --release +RUN cd circom && cargo install --path circom + +# COPY package*.json ./ + +# RUN npm install COPY . . +RUN npm install + EXPOSE 8888 CMD ["node", "src/koa/koa.js"] -# RUN node ./src/koa.js \ No newline at end of file diff --git a/luce_vm/js/package.json b/luce_vm/js/package.json index 8473916..bdae323 100644 --- a/luce_vm/js/package.json +++ b/luce_vm/js/package.json @@ -26,7 +26,7 @@ "koa": "^2.13.0", "koa-router": "12.0.0", "koa-bodyparser": "4.4.0", - "circom_tester": "^0.0.13", + "circom_tester": "^0.0.20", "mocha": "^9.1.3", "chai": "^4.3.4" } diff --git a/luce_vm/js/src/koa/koa.js b/luce_vm/js/src/koa/koa.js index 34c56ac..ce047c8 100644 --- a/luce_vm/js/src/koa/koa.js +++ b/luce_vm/js/src/koa/koa.js @@ -34,8 +34,8 @@ const compute_commitment = async ctx => { const { proof, publicSignals } = await snarkjs.plonk.fullProve(input, wasm, zkey) - // console.log(publicSignals) - // console.log(proof) + console.log(publicSignals) + console.log(proof) const r = { proof: proof, diff --git a/luce_vm/luce_django/luce/accounts/tests/test_Registration.py b/luce_vm/luce_django/luce/accounts/tests/test_Registration.py index fc5e844..11c821c 100644 --- a/luce_vm/luce_django/luce/accounts/tests/test_Registration.py +++ b/luce_vm/luce_django/luce/accounts/tests/test_Registration.py @@ -11,7 +11,7 @@ def test_valid_registration(self): 'email': 'test@email.com', 'password': 'testpassword', } - response = self.client.post(reverse('register'), data) + response = self.client.post(reverse('user_registration'), data) # print("here") # print(response.data) self.assertEqual(response.status_code, 200) # expecting a redirect diff --git a/luce_vm/luce_django/luce/blockchain/models.py b/luce_vm/luce_django/luce/blockchain/models.py index 32cdbe8..1cb7bf7 100644 --- a/luce_vm/luce_django/luce/blockchain/models.py +++ b/luce_vm/luce_django/luce/blockchain/models.py @@ -247,9 +247,11 @@ def retrieve_contract_owner(self): def deploy(self): from brownie.project.BrownieProject import ConsentCode - # private_key = self.user.ethereum_private_key - # new_account = accounts.add(private_key=private_key) - new_account = self.get_a_new_account() + new_account = self.get_a_new_account(amount=1e17) + + print("new_account: " + str(new_account)) + print("new_account: " + str(new_account)) + print("balance: " + str(new_account.balance())) contract = ConsentCode.deploy({'from': new_account}) self.contract_address = contract.address @@ -348,7 +350,7 @@ def get_a_new_account(self): disposable_address_service = DisposableAddressService() user_account = accounts.at(self.user.ethereum_public_key) new_account = disposable_address_service.get_a_new_address_with_balance( - sender=user_account, amount=1e15) + sender=user_account, amount=1e17) # new_account = accounts.add() # accounts[0].transfer(new_account, 1e18) @@ -391,9 +393,8 @@ def deploy(self): # print("proof\n" + str(proof)) print("proof\n" + str(proof['public_signals'])) commitment = { - "public_signals": [ - '16279978653553831575017442062517458639822344791369834134794885970235221444339' - ] + "public_signals": proof['public_signals'] + } contract = LuceMain.deploy(verifier_address, diff --git a/luce_vm/luce_django/luce/healthcare/tests/test_UploadDataView.py b/luce_vm/luce_django/luce/healthcare/tests/test_UploadDataView.py index 14695fc..b6c7c7e 100644 --- a/luce_vm/luce_django/luce/healthcare/tests/test_UploadDataView.py +++ b/luce_vm/luce_django/luce/healthcare/tests/test_UploadDataView.py @@ -58,15 +58,15 @@ def login_user(self, data_login): def test_upload_data_view(self): registration_response = self.register_user(self.data_registration) - print("registration_response", registration_response.data) + # print("registration_response", registration_response.data) user = User.objects.get(email=self.data_registration['email']) self.client.force_authenticate(user=user) deployed_registry = self.deploy_registry() - print("deployed_registry", deployed_registry) + # print("deployed_registry", deployed_registry) response = self.client.post(self.upload_data_url, self.data, format='json') - print("response", response.data) \ No newline at end of file + # print("response", response.data) \ No newline at end of file diff --git a/luce_vm/luce_django/luce/healthcare/views.py b/luce_vm/luce_django/luce/healthcare/views.py index cd18c9b..3596c6f 100644 --- a/luce_vm/luce_django/luce/healthcare/views.py +++ b/luce_vm/luce_django/luce/healthcare/views.py @@ -50,15 +50,16 @@ def is_luce_registry_deployed(self): def get_luce_registry(self): return LuceRegistry.objects.get(pk=1) + def get_disposable_address(self, user_account, amount): + disposable_address_service = DisposableAddressService() + return disposable_address_service.get_a_new_address_with_balance( + user_account, amount) + def post(self, request, format=None): user = request.user estimate = request.data.get("estimate", False) link = request.data.get("link", False) - print("###########") - # print(request.data) - print("request.data:\n", request.data) - logger.info("Upload data from: " + link) if not link: @@ -70,21 +71,18 @@ def post(self, request, format=None): # new_account = self.get_a_new_account() user_account = accounts.at(user.ethereum_public_key) - print("user_account:\n", user_account) + print("User account:\n", user_account) user_balance = user_account.balance() - print("user_balance:\n", user_balance) + print("User balance:\n", user_balance) - disposable_address_service = DisposableAddressService() - new_account = disposable_address_service.get_a_new_address_with_balance( - user_account, 1e15) - # print("new_account:\n", new_account) + new_account = self.get_disposable_address(user_account, 1e15) balance_of_new_account = new_account.balance() - print(f"balance_of_new_account: {balance_of_new_account}") + # print(f"balance_of_new_account: {balance_of_new_account}") user_balance = user_account.balance() - print("user_balance after deposit:\n", user_balance) + # print("user_balance after deposit:\n", user_balance) - user.ethereum_private_key = new_account.private_key + # user.ethereum_private_key = new_account.private_key tx_receipts = [] @@ -107,7 +105,7 @@ def post(self, request, format=None): }, partial=True) - print("serializer:\n", serializer) + # print("serializer:\n", serializer) restriction_serializer = RestrictionsSerializer(data=request.data) # check that user is registered in LuceRegistry, if not register him @@ -133,7 +131,7 @@ def post(self, request, format=None): datacontract = serializer.save() - print("datacontract licence:\n", datacontract.licence) + # print("datacontract licence:\n", datacontract.licence) # print("###########") logger.info("Start to deploy ConsentCode smart contract") tx_receipt = datacontract.consent_contract.deploy() diff --git a/luce_vm/luce_django/luce/lucehome/settings.py b/luce_vm/luce_django/luce/lucehome/settings.py index b09daef..9c920f1 100644 --- a/luce_vm/luce_django/luce/lucehome/settings.py +++ b/luce_vm/luce_django/luce/lucehome/settings.py @@ -19,6 +19,8 @@ brownie_folder = Path(__file__).parent.parent.parent.parent brownie_path = brownie_folder / 'brownie' p = project.load(brownie_path, name="BrownieProject") + +# It seems that we can load config and connect to network at other places. If so, we can remove these two lines p.load_config() network.connect('luce') diff --git a/luce_vm/luce_django/luce/requirements.txt b/luce_vm/luce_django/luce/requirements.txt index 13eb77c..8c3995a 100644 --- a/luce_vm/luce_django/luce/requirements.txt +++ b/luce_vm/luce_django/luce/requirements.txt @@ -1,112 +1,11 @@ -aiohttp==3.8.1 -aiosignal==1.2.0 -async-timeout==4.0.2 -asynctest==0.13.0 -attrdict==2.0.1 -attrs==19.1.0 -backcall==0.1.0 -base58==2.1.1 -bitarray==1.2.2 -bleach==3.1.0 -certifi==2019.6.16 -cffi==1.15.0 -chardet==3.0.4 -charset-normalizer==2.0.11 -cryptography==36.0.1 -cycler==0.11.0 -cytoolz==0.11.2 -decorator==4.4.0 -defusedxml==0.6.0 -Django==2.2 -django-cors-headers==3.11.0 -django-extensions==2.2.1 -django-filter==21.1 -djangorestframework==3.12.4 -entrypoints==0.3 -eth-abi==1.3.0 -eth-account==0.3.0 -# eth-hash==0.2.0 -eth-keyfile==0.5.1 -eth-keys==0.2.4 -eth-rlp==0.1.2 -eth-typing==2.3.0 -eth-utils==1.10.0 -fonttools==4.29.1 -frozenlist==1.3.0 +Brownie==0.5.1 +Django==4.1.12 +djangorestframework==3.14.0 +hexbytes==0.2.3 hexbytes==0.2.0 -idna==2.8 -importlib-metadata==4.10.1 -ipfshttpclient==0.8.0a2 -ipykernel==5.1.1 -ipython==7.6.1 -ipython-genutils==0.2.0 -ipywidgets==7.5.0 -jedi==0.13.3 -Jinja2==2.10.1 -jsonschema==3.2.0 -jupyter==1.0.0 -jupyter-client==5.3.1 -jupyter-console==6.0.0 -jupyter-contrib-core==0.3.3 -jupyter-contrib-nbextensions==0.5.1 -jupyter-core==4.5.0 -jupyter-highlight-selected-word==0.2.0 -jupyter-latex-envs==1.4.4 -jupyter-nbextensions-configurator==0.4.1 -kiwisolver==1.3.2 -lru-dict==1.1.6 -lxml==4.4.0 -MarkupSafe==1.1.1 matplotlib==3.5.1 -mistune==0.8.4 -multiaddr==0.0.9 -multidict==6.0.2 -nbconvert==5.5.0 -nbformat==4.4.0 -netaddr==0.8.0 -notebook==5.7.8 -numpy==1.21.5 -packaging==21.3 -pandocfilters==1.4.2 -parsimonious==0.8.1 -parso==0.5.0 -pexpect==4.7.0 -pickleshare==0.7.5 -Pillow==9.0.1 -prometheus-client==0.7.1 -prompt-toolkit==2.0.9 -protobuf==3.19.4 -psycopg2 -ptyprocess==0.6.0 -py-solc-x==1.1.1 -pycparser==2.21 -pycryptodome==3.8.2 -Pygments==2.4.2 -pyparsing==3.0.7 -pyrsistent==0.14.11 -python-dateutil==2.8.0 -pytz==2019.1 -PyYAML==5.1.1 -pyzmq -qtconsole==4.5.2 -requests==2.22.0 -rlp==1.1.0 -semantic-version==2.8.5 -Send2Trash==1.5.0 -six==1.12.0 -sqlparse==0.3.0 -terminado==0.8.2 -testpath==0.4.2 -toolz==0.10.0 -tornado==6.0.3 -traitlets==4.3.2 -typing-extensions==4.0.1 +py_solc_x==1.1.1 +Requests==2.31.0 +urllib3==1.26.12 +urllib3==1.26.14 urllib3==1.25.3 -varint==1.0.2 -wcwidth==0.1.7 -web3==4.9.2 -webencodings==0.5.1 -websockets==6.0 -widgetsnbextension==3.5.0 -yarl==1.7.2 -zipp==3.7.0