From 19d266df79cd765f6ad6925d4a6d950197756d12 Mon Sep 17 00:00:00 2001 From: diminator Date: Thu, 26 May 2016 10:33:27 +0200 Subject: [PATCH] escrow tutorial --- docs/source/_static/tx_schematics.odg | Bin 12538 -> 17274 bytes docs/source/python-server-api-examples.md | 212 +++++++++++++++++- .../doc/run_doc_python_server_api_examples.py | 4 +- 3 files changed, 211 insertions(+), 5 deletions(-) diff --git a/docs/source/_static/tx_schematics.odg b/docs/source/_static/tx_schematics.odg index b66b138f728d0c0f01893a14eefda38a7681771d..fdb79cac17f40fe97e2f9534d44a587ebf881880 100644 GIT binary patch literal 17274 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

-The small circle on the threshold conditions denotes an inversion of the fulfillment: +The small circle (⚪) at an input of a threshold condition denotes an inversion of the fulfillment: ```python inverted_fulfillment.validate(msg) == not fulfillment.validate(msg) ``` -An inverted input to a threshold condition is simply obtained by using negative weights. +An inverted input to a threshold condition is simply obtained by negative weights. __Note__: negative weights are BigchainDB-specific and not (yet) supported by the ILP standard. -The following code snippet shows how to create an escrow condition + +The following code snippet shows how to create an escrow condition: ```python # Retrieve the last transaction of testuser2_pub @@ -1093,4 +1094,207 @@ assert b.is_valid_transaction(tx_escrow_signed) == tx_escrow_signed b.write_transaction(tx_escrow_signed) tx_escrow_signed +``` + +```python +{ + "id":"1a281da2b9bc3d2beba92479058d440de3353427fd64045a61737bad0d0c809c", + "transaction":{ + "conditions":[ + { + "cid":0, + "condition":{ + "details":{ + "bitmask":41, + "subfulfillments":[ + { + "bitmask":41, + "subfulfillments":[ + { + "bitmask":32, + "public_key":"qv8DvdNG5nZHWCP5aPSqgqxAvaPJpQj19abRvFCntor", + "signature":null, + "type":"fulfillment", + "type_id":4, + "weight":1 + }, + { + "bitmask":9, + "expire_time":"1464242352.227917", + "type":"fulfillment", + "type_id":99, + "weight":1 + } + ], + "threshold":2, + "type":"fulfillment", + "type_id":2, + "weight":1 + }, + { + "bitmask":41, + "subfulfillments":[ + { + "bitmask":32, + "public_key":"BwuhqQX8FPsmqYiRV2CSZYWWsSWgSSQQFHjqxKEuqkPs", + "signature":null, + "type":"fulfillment", + "type_id":4, + "weight":1 + }, + { + "bitmask":9, + "expire_time":"1464242352.227917", + "type":"fulfillment", + "type_id":99, + "weight":-1 + } + ], + "threshold":2, + "type":"fulfillment", + "type_id":2, + "weight":1 + } + ], + "threshold":1, + "type":"fulfillment", + "type_id":2 + }, + "uri":"cc:2:29:sg08ERtppQrGxot7mu7XMdNkZTc29xCbWE1r8DgxuL8:181" + }, + "new_owners":[ + "BwuhqQX8FPsmqYiRV2CSZYWWsSWgSSQQFHjqxKEuqkPs", + "qv8DvdNG5nZHWCP5aPSqgqxAvaPJpQj19abRvFCntor" + ] + } + ], + "data":null, + "fulfillments":[ + { + "current_owners":[ + "qv8DvdNG5nZHWCP5aPSqgqxAvaPJpQj19abRvFCntor" + ], + "fid":0, + "fulfillment":"cf:4:B6VAa7KAMD1v-pyvDx9RuBLb6l2Qs3vhucgXqzU_RbuRucOp6tNY8AoNMoC-HAOZBJSnHXZsdJ7pLCZ6aDTwUHXf0zxyLaCgy1NpES3h8qcuxbfv4Nchw3BtUcVSY3AM", + "input":{ + "cid":1, + "txid":"d3f5e78f6d4346466178745f1c01cbcaf1c1dce1932a16cd653051b16ee29bac" + } + } + ], + "operation":"TRANSFER", + "timestamp":"1464242340.227787" + }, + "version":1 +} +``` + +At any given moment `testuser1` and `testuser2` can try to fulfill the `execute` and `abort` branch respectively. +Whether the fulfillment will validate depends on the timeout condition. + +We'll illustrate this by example. + +In the case of `testuser1`, we create the `execute` fulfillment: + +```python +# Create a base template for execute fulfillment +tx_escrow_execute = b.create_transaction([testuser2_pub, testuser1_pub], testuser1_pub, {'txid': tx_escrow_signed['id'], 'cid': 0}, 'TRANSFER') + +# Parse the Escrow cryptocondition +escrow_fulfillment = cc.Fulfillment.from_json( + tx_escrow['transaction']['conditions'][0]['condition']['details']) + +subfulfillment_testuser1 = escrow_fulfillment.get_subcondition_from_vk(testuser1_pub)[0] +subfulfillment_testuser2 = escrow_fulfillment.get_subcondition_from_vk(testuser2_pub)[0] +subfulfillment_timeout = escrow_fulfillment.subconditions[0]['body'].subconditions[1]['body'] + +# Get the fulfillment message to sign +tx_escrow_execute_fulfillment_message = \ + util.get_fulfillment_message(tx_escrow_execute, + tx_escrow_execute['transaction']['fulfillments'][0], + serialized=True) + +# Clear the subconditions of the escrow fulfillment +escrow_fulfillment.subconditions = [] + +# Fulfill the execute branch +fulfillment_execute = cc.ThresholdSha256Fulfillment(threshold=2) +subfulfillment_testuser1.sign(tx_escrow_execute_fulfillment_message, crypto.SigningKey(testuser1_priv)) +fulfillment_execute.add_subfulfillment(subfulfillment_testuser1) +fulfillment_execute.add_subfulfillment(subfulfillment_timeout) +escrow_fulfillment.add_subfulfillment(fulfillment_execute) + +# Do not fulfill the abort branch +condition_abort = cc.ThresholdSha256Fulfillment(threshold=2) +condition_abort.add_subfulfillment(subfulfillment_testuser2) +condition_abort.add_subfulfillment(subfulfillment_timeout, weight=-1) +escrow_fulfillment.add_subcondition(condition_abort.condition) # Adding only the condition here + +# Update the execute transaction with the fulfillment +tx_escrow_execute['transaction']['fulfillments'][0]['fulfillment'] = escrow_fulfillment.serialize_uri() +``` + +In the case of `testuser2`, we create the `abort` fulfillment: + +```python +# Create a base template for execute fulfillment +tx_escrow_execute = b.create_transaction([testuser2_pub, testuser1_pub], testuser2_pub, {'txid': tx_escrow_signed['id'], 'cid': 0}, 'TRANSFER') + +# Parse the threshold cryptocondition +escrow_fulfillment = cc.Fulfillment.from_json( + tx_escrow['transaction']['conditions'][0]['condition']['details']) + +subfulfillment_testuser1 = escrow_fulfillment.get_subcondition_from_vk(testuser1_pub)[0] +subfulfillment_testuser2 = escrow_fulfillment.get_subcondition_from_vk(testuser2_pub)[0] +subfulfillment_timeout = escrow_fulfillment.subconditions[0]['body'].subconditions[1]['body'] + +# Get the fulfillment message to sign +tx_escrow_abort_fulfillment_message = \ + util.get_fulfillment_message(tx_escrow_abort, + tx_escrow_abort['transaction']['fulfillments'][0], + serialized=True) + +# Clear the subconditions of the escrow fulfillment +escrow_fulfillment.subconditions = [] + +# Do not fulfill the execute branch +condition_execute = cc.ThresholdSha256Fulfillment(threshold=2) +condition_execute.add_subfulfillment(subfulfillment_testuser1) +condition_execute.add_subfulfillment(subfulfillment_timeout) +escrow_fulfillment.add_subcondition(condition_execute.condition) # Adding only the condition here + +# Fulfill the abort branch +fulfillment_abort = cc.ThresholdSha256Fulfillment(threshold=2) +subfulfillment_testuser2.sign(tx_escrow_abort_fulfillment_message, crypto.SigningKey(testuser2_priv)) +fulfillment_abort.add_subfulfillment(subfulfillment_testuser2) +fulfillment_abort.add_subfulfillment(subfulfillment_timeout, weight=-1) +escrow_fulfillment.add_subfulfillment(fulfillment_abort) + +# Update the abort transaction with the fulfillment +tx_escrow_abort['transaction']['fulfillments'][0]['fulfillment'] = escrow_fulfillment.serialize_uri() +``` + +The following demonstrates that the transaction validation switches once the timeout occurs: + +```python +for i in range(time_sleep - 4): + valid_execute = b.is_valid_transaction(tx_escrow_execute) == tx_escrow_execute + valid_abort = b.is_valid_transaction(tx_escrow_abort) == tx_escrow_abort + + seconds_to_timeout = int(float(time_expire) - float(util.timestamp())) + print('tx_execute valid: {} - tx_abort valid {} ({}s to timeout)'.format(valid_execute, valid_abort, seconds_to_timeout)) + sleep(1) +``` + +If you execute in a timely fashion, you should see the following: + +```python +tx_execute valid: True - tx_abort valid False (3s to timeout) +tx_execute valid: True - tx_abort valid False (2s to timeout) +tx_execute valid: True - tx_abort valid False (1s to timeout) +tx_execute valid: True - tx_abort valid False (0s to timeout) +tx_execute valid: False - tx_abort valid True (0s to timeout) +tx_execute valid: False - tx_abort valid True (-1s to timeout) +tx_execute valid: False - tx_abort valid True (-2s to timeout) +tx_execute valid: False - tx_abort valid True (-3s to timeout) ``` \ No newline at end of file diff --git a/tests/doc/run_doc_python_server_api_examples.py b/tests/doc/run_doc_python_server_api_examples.py index ee95ef3a..5ae9300f 100644 --- a/tests/doc/run_doc_python_server_api_examples.py +++ b/tests/doc/run_doc_python_server_api_examples.py @@ -481,5 +481,7 @@ tx_escrow_abort['transaction']['fulfillments'][0]['fulfillment'] = escrow_fulfil for i in range(time_sleep - 4): valid_execute = b.is_valid_transaction(tx_escrow_execute) == tx_escrow_execute valid_abort = b.is_valid_transaction(tx_escrow_abort) == tx_escrow_abort - print('execute: {} - abort {}'.format(valid_execute, valid_abort)) + + seconds_to_timeout = int(float(time_expire) - float(util.timestamp())) + print('tx_execute valid: {} - tx_abort valid {} ({}s to timeout)'.format(valid_execute, valid_abort, seconds_to_timeout)) sleep(1)