diff --git a/Dockerfile b/Dockerfile index 20e657d..e7daeea 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,7 @@ COPY . /usr/src/app/ WORKDIR /usr/src/app RUN apt-get -qq update \ && apt-get -y upgrade \ - && apt-get install -y jq \ + && apt-get install -y jq vim zsh build-essential cmake\ && pip install . \ && apt-get autoremove \ && apt-get clean diff --git a/Dockerfile-all-in-one b/Dockerfile-all-in-one index d8ff513..5e3c224 100644 --- a/Dockerfile-all-in-one +++ b/Dockerfile-all-in-one @@ -9,7 +9,7 @@ WORKDIR /usr/src/app RUN apk --update add sudo bash \ && apk --update add python3 openssl ca-certificates git \ - && apk --update add --virtual build-dependencies python3-dev \ + && apk --update add --virtual build-dependencies python3-dev vim zsh build-essential cmake\ libffi-dev openssl-dev build-base jq zsh \ && apk add --no-cache libstdc++ dpkg gnupg \ && pip3 install --upgrade pip cffi \ diff --git a/Dockerfile-alpine b/Dockerfile-alpine index 0efa4cd..5eadd49 100644 --- a/Dockerfile-alpine +++ b/Dockerfile-alpine @@ -5,7 +5,7 @@ COPY . /usr/src/app/ WORKDIR /usr/src/app RUN apk --update add sudo \ && apk --update add python3 py-pip openssl ca-certificates git\ - && apk --update add --virtual build-dependencies python3-dev zsh \ + && apk --update add --virtual build-dependencies python3-dev zsh vim zsh build-essential cmake\ libffi-dev openssl-dev build-base \ && apk add --no-cache libstdc++ \ && pip3 install --upgrade pip cffi \ diff --git a/Dockerfile-dev b/Dockerfile-dev index faaead9..08c7642 100644 --- a/Dockerfile-dev +++ b/Dockerfile-dev @@ -3,7 +3,7 @@ FROM python:${python_version} LABEL maintainer "contact@ipdb.global" RUN apt-get update \ - && apt-get install -y git zsh-common\ + && apt-get install -y git zsh vim build-essential cmake\ && pip install -U pip \ && apt-get autoremove \ && apt-get clean diff --git a/acceptance/python/Dockerfile b/acceptance/python/Dockerfile index a106dcf..14defda 100644 --- a/acceptance/python/Dockerfile +++ b/acceptance/python/Dockerfile @@ -1,10 +1,61 @@ FROM python:3.9 -RUN apt-get update && apt-get install -y vim zsh +RUN apt-get update \ + && pip install -U pip \ + && apt-get autoremove \ + && apt-get clean +RUN apt-get install -y vim zsh build-essential cmake + RUN mkdir -p /src RUN pip install --upgrade \ pycco \ websocket-client~=0.47.0 \ pytest~=3.0 \ - planetmint-driver>=0.9.0 \ + git+https://github.com/planetmint/cryptoconditions.git@gitzenroom \ + git+https://github.com/planetmint/planetmint-driver.git@gitzenroom \ + #planetmint-cryptoconditions>=0.9.0\ + #planetmint-driver>=0.9.0 \ blns + + + + +#FROM python:3.9 +# +#RUN apt-get update && apt-get install -y vim zsh +#RUN apt-get update \ +# && apt-get install -y git zsh\ +# && pip install -U pip \ +# && apt-get autoremove \ +# && apt-get clean +#RUN apt install sudo +#RUN apt-get install -y python3 openssl ca-certificates git python3-dev +#RUN apt-get install zsh gcc +#RUN apt-get install libffi-dev +#RUN apt-get install build-essential cmake -y +# +# +#RUN mkdir -p /src +#RUN pip install --upgrade \ +# pycco \ +# websocket-client~=0.47.0 \ +# pytest~=3.0 \ +# planetmint-driver>=0.9.0 \ +# blns \ +# git+https://github.com/planetmint/cryptoconditions.git@gitzenroom >=0.9.0 \ +# chardet==3.0.4 \ +# aiohttp==3.7.4 \ +# abci==0.8.3 \ +# #planetmint-cryptoconditions>=0.9.0\ +# flask-cors==3.0.10 \ +# flask-restful==0.3.9 \ +# flask==2.0.1 \ +# gunicorn==20.1.0 \ +# jsonschema==3.2.0 \ +# logstats==0.3.0 \ +# packaging>=20.9 \ +# pymongo==3.11.4 \ +# pyyaml==5.4.1 \ +# requests==2.25.1 \ +# setproctitle==1.2.2 +# \ No newline at end of file diff --git a/acceptance/python/src/conftest.py b/acceptance/python/src/conftest.py new file mode 100644 index 0000000..34e8a3f --- /dev/null +++ b/acceptance/python/src/conftest.py @@ -0,0 +1,89 @@ +# Copyright © 2020 Interplanetary Database Association e.V., +# Planetmint and IPDB software contributors. +# SPDX-License-Identifier: (Apache-2.0 AND CC-BY-4.0) +# Code is Apache-2.0 and docs are CC-BY-4.0 + +import pytest + +GENERATE_KEYPAIR = \ + """Rule input encoding base58 + Rule output encoding base58 + Scenario 'ecdh': Create the keypair + Given that I am known as 'Pippo' + When I create the ecdh key + When I create the testnet key + Then print data""" + +# secret key to public key +SK_TO_PK = \ + """Rule input encoding base58 + Rule output encoding base58 + Scenario 'ecdh': Create the keypair + Given that I am known as '{}' + Given I have the 'keys' + When I create the ecdh public key + When I create the testnet address + Then print my 'ecdh public key' + Then print my 'testnet address'""" + +FULFILL_SCRIPT = \ + """Rule input encoding base58 + Rule output encoding base58 + Scenario 'ecdh': Bob verifies the signature from Alice + Given I have a 'ecdh public key' from 'Alice' + Given that I have a 'string dictionary' named 'houses' inside 'asset' + Given I have a 'signature' named 'data.signature' inside 'result' + When I verify the 'houses' has a signature in 'data.signature' by 'Alice' + Then print the string 'ok'""" + +HOUSE_ASSETS = { + "data": { + "houses": [ + { + "name": "Harry", + "team": "Gryffindor", + }, + { + "name": "Draco", + "team": "Slytherin", + } + ], + } +} + +ZENROOM_DATA = { + 'also': 'more data' +} + +CONDITION_SCRIPT = """Rule input encoding base58 + Rule output encoding base58 + Scenario 'ecdh': create the signature of an object + Given I have the 'keys' + Given that I have a 'string dictionary' named 'houses' inside 'asset' + When I create the signature of 'houses' + When I rename the 'signature' to 'data.signature' + Then print the 'data.signature'""" + +@pytest.fixture +def gen_key_zencode(): + return GENERATE_KEYPAIR + +@pytest.fixture +def secret_key_to_private_key_zencode(): + return SK_TO_PK + +@pytest.fixture +def fulfill_script_zencode(): + return FULFILL_SCRIPT + +@pytest.fixture +def condition_script_zencode(): + return CONDITION_SCRIPT + +@pytest.fixture +def zenroom_house_assets(): + return HOUSE_ASSETS + +@pytest.fixture +def zenroom_data(): + return ZENROOM_DATA \ No newline at end of file diff --git a/acceptance/python/src/test_zenroom.py b/acceptance/python/src/test_zenroom.py new file mode 100644 index 0000000..2829fab --- /dev/null +++ b/acceptance/python/src/test_zenroom.py @@ -0,0 +1,85 @@ +# GOAL: +# In this script I tried to implement the ECDSA signature using zenroom + +# However, the scripts are customizable and so with the same procedure +# we can implement more complex smart contracts + +# PUBLIC IDENTITY +# The public identity of the users in this script (Bob and Alice) +# is the pair (ECDH public key, Testnet address) + +import json + +import hashlib +from cryptoconditions import ZenroomSha256 +from json.decoder import JSONDecodeError + +def test_zenroom(gen_key_zencode, secret_key_to_private_key_zencode, fulfill_script_zencode, +condition_script_zencode, zenroom_data, zenroom_house_assets): + alice = json.loads(ZenroomSha256.run_zenroom(gen_key_zencode).output)['keys'] + bob = json.loads(ZenroomSha256.run_zenroom(gen_key_zencode).output)['keys'] + + zen_public_keys = json.loads(ZenroomSha256.run_zenroom(secret_key_to_private_key_zencode.format('Alice'), + keys={'keys': alice}).output) + zen_public_keys.update(json.loads(ZenroomSha256.run_zenroom(secret_key_to_private_key_zencode.format('Bob'), + keys={'keys': bob}).output)) + + # CRYPTO-CONDITIONS: instantiate an Ed25519 crypto-condition for buyer + zenSha = ZenroomSha256(script=fulfill_script_zencode, keys=zen_public_keys, data=zenroom_data) + + # CRYPTO-CONDITIONS: generate the condition uri + condition_uri = zenSha.condition.serialize_uri() + + # CRYPTO-CONDITIONS: construct an unsigned fulfillment dictionary + unsigned_fulfillment_dict = { + 'type': zenSha.TYPE_NAME, + 'script': fulfill_script_zencode, + 'keys': zen_public_keys, + } + + output = { + 'amount': '1000', + 'condition': { + 'details': unsigned_fulfillment_dict, + 'uri': condition_uri, + }, + 'data': zenroom_data, + 'script': fulfill_script_zencode, + 'conf': '', + 'public_keys': (zen_public_keys['Alice']['ecdh_public_key'], ), + } + + + input_ = { + 'fulfillment': None, + 'fulfills': None, + 'owners_before': (zen_public_keys['Alice']['ecdh_public_key'], ), + } + + token_creation_tx = { + 'operation': 'CREATE', + 'asset': zenroom_house_assets, + 'metadata': None, + 'outputs': (output,), + 'inputs': (input_,), + 'version': '2.0', + 'id': None, + } + + # JSON: serialize the transaction-without-id to a json formatted string + message = json.dumps( + token_creation_tx, + sort_keys=True, + separators=(',', ':'), + ensure_ascii=False, + ) + + try: + assert(not zenSha.validate(message=message)) + except JSONDecodeError: + pass + except ValueError: + pass + + message = zenSha.sign(message, condition_script_zencode, alice) + assert(zenSha.validate(message=message)) diff --git a/docs/root/source/contributing/index.rst b/docs/root/source/contributing/index.rst index cf0b606..a109838 100644 --- a/docs/root/source/contributing/index.rst +++ b/docs/root/source/contributing/index.rst @@ -11,7 +11,7 @@ There are many ways you can contribute to Planetmint. It includes several sub-projects. - `Planetmint Server `_ -- `Planetmint Python Driver `_ +- `Planetmint Python Driver `_ - `Planetmint JavaScript Driver `_ - `Planetmint Java Driver `_ - `cryptoconditions `_ (a Python package by us) diff --git a/docs/root/source/contributing/ways-to-contribute/write-docs.md b/docs/root/source/contributing/ways-to-contribute/write-docs.md index d223243..23bf7ea 100644 --- a/docs/root/source/contributing/ways-to-contribute/write-docs.md +++ b/docs/root/source/contributing/ways-to-contribute/write-docs.md @@ -19,7 +19,7 @@ If you're writing code, you should also update any related docs. However, you mi You can certainly do that! - The docs for Planetmint Server live under ``planetmint/docs/`` in the ``planetmint/planetmint`` repo. -- There are docs for the Python driver under ``planetmint-driver/docs/`` in the ``planetmint/planetmint-driver`` repo. +- There are docs for the Python driver under ``planetmint-driver/docs/`` in the ``planetmint/planetmint-driver-python`` repo. - There are docs for the JavaScript driver under ``planetmint/js-bigchaindb-driver`` in the ``planetmint/js-bigchaindb-driver`` repo. - The source code for the Planetmint website is in a private repo, but we can give you access if you ask. diff --git a/setup.py b/setup.py index f837710..7aa0901 100644 --- a/setup.py +++ b/setup.py @@ -76,7 +76,8 @@ install_requires = [ 'chardet==3.0.4', 'aiohttp==3.7.4', 'abci==0.8.3', - 'planetmint-cryptoconditions>=0.9.0', + #'planetmint-cryptoconditions>=0.9.0', + 'planetmint-cryptoconditions @ git+https://github.com/planetmint/cryptoconditions.git@gitzenroom', 'flask-cors==3.0.10', 'flask-restful==0.3.9', 'flask==2.0.1',