Merge remote-tracking branch 'remotes/origin/feat/127/crypto-conditions-ilp-bigchain-integration' into feat/128/multiple-input-output

This commit is contained in:
Rodolphe Marques 2016-04-18 11:12:26 +02:00
commit 5439c0bdda
4 changed files with 57 additions and 62 deletions

View File

@ -1,7 +1,7 @@
# Separate all crypto code so that we can easily test several implementations # Separate all crypto code so that we can easily test several implementations
import sha3 import sha3
from cryptoconditions import ed25519 from cryptoconditions import crypto
def hash_data(data): def hash_data(data):
@ -10,8 +10,8 @@ def hash_data(data):
def generate_key_pair(): def generate_key_pair():
sk, pk = ed25519.ed25519_generate_key_pair() sk, pk = crypto.ed25519_generate_key_pair()
return sk.decode(), pk.decode() return sk.decode(), pk.decode()
SigningKey = ed25519.SigningKey SigningKey = crypto.Ed25519SigningKey
VerifyingKey = ed25519.VerifyingKey VerifyingKey = crypto.Ed25519VerifyingKey

View File

@ -4,8 +4,7 @@ import time
import multiprocessing as mp import multiprocessing as mp
from datetime import datetime from datetime import datetime
from cryptoconditions import Ed25519Fulfillment, ThresholdSha256Fulfillment import cryptoconditions as cc
from cryptoconditions.fulfillment import Fulfillment
import bigchaindb import bigchaindb
from bigchaindb import exceptions from bigchaindb import exceptions
@ -194,11 +193,11 @@ def create_tx(current_owners, new_owners, inputs, operation, payload=None):
conditions = [] conditions = []
for fulfillment in fulfillments: for fulfillment in fulfillments:
if len(new_owners) > 1: if len(new_owners) > 1:
condition = ThresholdSha256Fulfillment(threshold=len(new_owners)) condition = cc.ThresholdSha256Fulfillment(threshold=len(new_owners))
for new_owner in new_owners: for new_owner in new_owners:
condition.add_subfulfillment(Ed25519Fulfillment(public_key=new_owner)) condition.add_subfulfillment(cc.Ed25519Fulfillment(public_key=new_owner))
elif len(new_owners) == 1: elif len(new_owners) == 1:
condition = Ed25519Fulfillment(public_key=new_owners[0]) condition = cc.Ed25519Fulfillment(public_key=new_owners[0])
conditions.append({ conditions.append({
'new_owners': new_owners, 'new_owners': new_owners,
'condition': { 'condition': {
@ -258,10 +257,10 @@ def sign_tx(transaction, sks):
for fulfillment in tx['transaction']['fulfillments']: for fulfillment in tx['transaction']['fulfillments']:
fulfillment_message = get_fulfillment_message(transaction, fulfillment) fulfillment_message = get_fulfillment_message(transaction, fulfillment)
parsed_fulfillment = Fulfillment.from_json(fulfillment_message['condition']['condition']['details']) parsed_fulfillment = cc.Fulfillment.from_json(fulfillment_message['condition']['condition']['details'])
parsed_fulfillment_copy = copy.deepcopy(parsed_fulfillment)
# single current owner # single current owner
if isinstance(parsed_fulfillment, Ed25519Fulfillment): if isinstance(parsed_fulfillment, cc.Ed25519Fulfillment):
current_owner = fulfillment['current_owners'][0] current_owner = fulfillment['current_owners'][0]
try: try:
parsed_fulfillment.sign(serialize(fulfillment_message), key_pairs[current_owner]) parsed_fulfillment.sign(serialize(fulfillment_message), key_pairs[current_owner])
@ -269,11 +268,15 @@ def sign_tx(transaction, sks):
raise exceptions.KeypairMismatchException('Public key {} is not a pair to any of the private keys' raise exceptions.KeypairMismatchException('Public key {} is not a pair to any of the private keys'
.format(current_owner)) .format(current_owner))
# multiple current owners # multiple current owners
elif isinstance(parsed_fulfillment, ThresholdSha256Fulfillment): elif isinstance(parsed_fulfillment, cc.ThresholdSha256Fulfillment):
# replace the fulfillments with the signed fulfillments # replace the fulfillments with the signed fulfillments
parsed_fulfillment.subconditions = [] parsed_fulfillment.subconditions = []
for current_owner in fulfillment['current_owners']: for current_owner in fulfillment['current_owners']:
subfulfillment = get_subcondition_from_vk(fulfillment_message['condition'], current_owner) try:
subfulfillment = parsed_fulfillment_copy.get_subcondition_from_vk(current_owner)[0]
except IndexError:
exceptions.KeypairMismatchException('Public key {} cannot be found in the fulfillment'
.format(current_owner))
try: try:
subfulfillment.sign(serialize(fulfillment_message), key_pairs[current_owner]) subfulfillment.sign(serialize(fulfillment_message), key_pairs[current_owner])
except KeyError: except KeyError:
@ -320,7 +323,7 @@ def verify_signature(signed_transaction):
fulfillment_message = get_fulfillment_message(signed_transaction, fulfillment) fulfillment_message = get_fulfillment_message(signed_transaction, fulfillment)
# verify the fulfillment (for now lets assume there is only one owner) # verify the fulfillment (for now lets assume there is only one owner)
try: try:
parsed_fulfillment = Fulfillment.from_uri(fulfillment['fulfillment']) parsed_fulfillment = cc.Fulfillment.from_uri(fulfillment['fulfillment'])
except Exception: except Exception:
return False return False
is_valid = parsed_fulfillment.validate(serialize(fulfillment_message)) is_valid = parsed_fulfillment.validate(serialize(fulfillment_message))
@ -372,7 +375,7 @@ def get_fulfillment_message(transaction, fulfillment, serialized=False):
# there is no previous transaction so we need to create one on the fly # there is no previous transaction so we need to create one on the fly
else: else:
current_owner = transaction['transaction']['fulfillments'][0]['current_owners'][0] current_owner = transaction['transaction']['fulfillments'][0]['current_owners'][0]
condition = json.loads(Ed25519Fulfillment(public_key=current_owner).serialize_json()) condition = json.loads(cc.Ed25519Fulfillment(public_key=current_owner).serialize_json())
fulfillment_message['condition'] = {'condition': {'details': condition}} fulfillment_message['condition'] = {'condition': {'details': condition}}
if serialized: if serialized:
return serialize(fulfillment_message) return serialize(fulfillment_message)
@ -399,13 +402,6 @@ def get_hash_data(transaction):
return crypto.hash_data(serialize(tx)) return crypto.hash_data(serialize(tx))
def get_subcondition_from_vk(condition, vk):
threshold_fulfillment = Fulfillment.from_json(condition['condition']['details'])
for subcondition in threshold_fulfillment.subconditions:
if subcondition['body'].public_key.to_ascii().decode() == vk:
return subcondition['body']
def transform_create(tx): def transform_create(tx):
"""Change the owner and signature for a ``CREATE`` transaction created by a node""" """Change the owner and signature for a ``CREATE`` transaction created by a node"""

View File

@ -71,7 +71,7 @@ setup(
'rethinkdb==2.2.0.post4', 'rethinkdb==2.2.0.post4',
'pysha3==0.3', 'pysha3==0.3',
'pytz==2015.7', 'pytz==2015.7',
'cryptoconditions==0.1.6', 'cryptoconditions==0.2.0',
'statsd==3.2.1', 'statsd==3.2.1',
'python-rapidjson==0.0.6', 'python-rapidjson==0.0.6',
'logstats==0.2.1', 'logstats==0.2.1',

View File

@ -6,9 +6,7 @@ import json
import pytest import pytest
import rethinkdb as r import rethinkdb as r
from cryptoconditions import Ed25519Fulfillment, ThresholdSha256Fulfillment import cryptoconditions as cc
from cryptoconditions.condition import Condition
from cryptoconditions.fulfillment import Fulfillment
import bigchaindb import bigchaindb
from bigchaindb import util from bigchaindb import util
@ -330,7 +328,7 @@ class TestTransactionValidation(object):
# create a correctly signed transaction and change the signature # create a correctly signed transaction and change the signature
tx_signed = b.sign_transaction(tx_valid, user_sk) tx_signed = b.sign_transaction(tx_valid, user_sk)
fulfillment = tx_signed['transaction']['fulfillments'][0]['fulfillment'] fulfillment = tx_signed['transaction']['fulfillments'][0]['fulfillment']
changed_fulfillment = Ed25519Fulfillment().from_uri(fulfillment) changed_fulfillment = cc.Ed25519Fulfillment().from_uri(fulfillment)
changed_fulfillment.signature = b'0' * 64 changed_fulfillment.signature = b'0' * 64
tx_signed['transaction']['fulfillments'][0]['fulfillment'] = changed_fulfillment.serialize_uri() tx_signed['transaction']['fulfillments'][0]['fulfillment'] = changed_fulfillment.serialize_uri()
@ -1178,15 +1176,15 @@ class TestCryptoconditions(object):
def test_fulfillment_transaction_create(self, b, user_vk): def test_fulfillment_transaction_create(self, b, user_vk):
tx = b.create_transaction(b.me, user_vk, None, 'CREATE') tx = b.create_transaction(b.me, user_vk, None, 'CREATE')
condition = tx['transaction']['conditions'][0]['condition'] condition = tx['transaction']['conditions'][0]['condition']
condition_from_uri = Condition.from_uri(condition['uri']) condition_from_uri = cc.Condition.from_uri(condition['uri'])
condition_from_json = Fulfillment.from_json(condition['details']).condition condition_from_json = cc.Fulfillment.from_json(condition['details']).condition
assert condition_from_uri.serialize_uri() == condition_from_json.serialize_uri() assert condition_from_uri.serialize_uri() == condition_from_json.serialize_uri()
assert condition['details']['public_key'] == user_vk assert condition['details']['public_key'] == user_vk
tx_signed = b.sign_transaction(tx, b.me_private) tx_signed = b.sign_transaction(tx, b.me_private)
fulfillment = tx_signed['transaction']['fulfillments'][0] fulfillment = tx_signed['transaction']['fulfillments'][0]
fulfillment_from_uri = Fulfillment.from_uri(fulfillment['fulfillment']) fulfillment_from_uri = cc.Fulfillment.from_uri(fulfillment['fulfillment'])
assert fulfillment['current_owners'][0] == b.me assert fulfillment['current_owners'][0] == b.me
assert fulfillment_from_uri.public_key.to_ascii().decode() == b.me assert fulfillment_from_uri.public_key.to_ascii().decode() == b.me
@ -1202,22 +1200,22 @@ class TestCryptoconditions(object):
prev_tx = b.get_transaction(prev_tx_id['txid']) prev_tx = b.get_transaction(prev_tx_id['txid'])
prev_condition = prev_tx['transaction']['conditions'][0]['condition'] prev_condition = prev_tx['transaction']['conditions'][0]['condition']
prev_condition_from_uri = Condition.from_uri(prev_condition['uri']) prev_condition_from_uri = cc.Condition.from_uri(prev_condition['uri'])
prev_condition_from_json = Fulfillment.from_json(prev_condition['details']).condition prev_condition_from_json = cc.Fulfillment.from_json(prev_condition['details']).condition
assert prev_condition_from_uri.serialize_uri() == prev_condition_from_json.serialize_uri() assert prev_condition_from_uri.serialize_uri() == prev_condition_from_json.serialize_uri()
assert prev_condition['details']['public_key'] == user_vk assert prev_condition['details']['public_key'] == user_vk
condition = tx['transaction']['conditions'][0]['condition'] condition = tx['transaction']['conditions'][0]['condition']
condition_from_uri = Condition.from_uri(condition['uri']) condition_from_uri = cc.Condition.from_uri(condition['uri'])
condition_from_json = Fulfillment.from_json(condition['details']).condition condition_from_json = cc.Fulfillment.from_json(condition['details']).condition
assert condition_from_uri.serialize_uri() == condition_from_json.serialize_uri() assert condition_from_uri.serialize_uri() == condition_from_json.serialize_uri()
assert condition['details']['public_key'] == other_vk assert condition['details']['public_key'] == other_vk
tx_signed = b.sign_transaction(tx, user_sk) tx_signed = b.sign_transaction(tx, user_sk)
fulfillment = tx_signed['transaction']['fulfillments'][0] fulfillment = tx_signed['transaction']['fulfillments'][0]
fulfillment_from_uri = Fulfillment.from_uri(fulfillment['fulfillment']) fulfillment_from_uri = cc.Fulfillment.from_uri(fulfillment['fulfillment'])
assert fulfillment['current_owners'][0] == user_vk assert fulfillment['current_owners'][0] == user_vk
assert fulfillment_from_uri.public_key.to_ascii().decode() == user_vk assert fulfillment_from_uri.public_key.to_ascii().decode() == user_vk
@ -1227,7 +1225,7 @@ class TestCryptoconditions(object):
def test_override_condition_create(self, b, user_vk): def test_override_condition_create(self, b, user_vk):
tx = b.create_transaction(b.me, user_vk, None, 'CREATE') tx = b.create_transaction(b.me, user_vk, None, 'CREATE')
fulfillment = Ed25519Fulfillment(public_key=user_vk) fulfillment = cc.Ed25519Fulfillment(public_key=user_vk)
tx['transaction']['conditions'][0]['condition'] = { tx['transaction']['conditions'][0]['condition'] = {
'details': json.loads(fulfillment.serialize_json()), 'details': json.loads(fulfillment.serialize_json()),
'uri': fulfillment.condition.serialize_uri() 'uri': fulfillment.condition.serialize_uri()
@ -1236,7 +1234,7 @@ class TestCryptoconditions(object):
tx_signed = b.sign_transaction(tx, b.me_private) tx_signed = b.sign_transaction(tx, b.me_private)
fulfillment = tx_signed['transaction']['fulfillments'][0] fulfillment = tx_signed['transaction']['fulfillments'][0]
fulfillment_from_uri = Fulfillment.from_uri(fulfillment['fulfillment']) fulfillment_from_uri = cc.Fulfillment.from_uri(fulfillment['fulfillment'])
assert fulfillment['current_owners'][0] == b.me assert fulfillment['current_owners'][0] == b.me
assert fulfillment_from_uri.public_key.to_ascii().decode() == b.me assert fulfillment_from_uri.public_key.to_ascii().decode() == b.me
@ -1250,7 +1248,7 @@ class TestCryptoconditions(object):
prev_tx_id = b.get_owned_ids(user_vk).pop() prev_tx_id = b.get_owned_ids(user_vk).pop()
tx = b.create_transaction(user_vk, other_vk, prev_tx_id, 'TRANSFER') tx = b.create_transaction(user_vk, other_vk, prev_tx_id, 'TRANSFER')
fulfillment = Ed25519Fulfillment(public_key=other_vk) fulfillment = cc.Ed25519Fulfillment(public_key=other_vk)
tx['transaction']['conditions'][0]['condition'] = { tx['transaction']['conditions'][0]['condition'] = {
'details': json.loads(fulfillment.serialize_json()), 'details': json.loads(fulfillment.serialize_json()),
'uri': fulfillment.condition.serialize_uri() 'uri': fulfillment.condition.serialize_uri()
@ -1258,7 +1256,7 @@ class TestCryptoconditions(object):
tx_signed = b.sign_transaction(tx, user_sk) tx_signed = b.sign_transaction(tx, user_sk)
fulfillment = tx_signed['transaction']['fulfillments'][0] fulfillment = tx_signed['transaction']['fulfillments'][0]
fulfillment_from_uri = Fulfillment.from_uri(fulfillment['fulfillment']) fulfillment_from_uri = cc.Fulfillment.from_uri(fulfillment['fulfillment'])
assert fulfillment['current_owners'][0] == user_vk assert fulfillment['current_owners'][0] == user_vk
assert fulfillment_from_uri.public_key.to_ascii().decode() == user_vk assert fulfillment_from_uri.public_key.to_ascii().decode() == user_vk
@ -1269,7 +1267,7 @@ class TestCryptoconditions(object):
tx = b.create_transaction(b.me, user_vk, None, 'CREATE') tx = b.create_transaction(b.me, user_vk, None, 'CREATE')
original_fulfillment = tx['transaction']['fulfillments'][0] original_fulfillment = tx['transaction']['fulfillments'][0]
fulfillment_message = util.get_fulfillment_message(tx, original_fulfillment, serialized=True) fulfillment_message = util.get_fulfillment_message(tx, original_fulfillment, serialized=True)
fulfillment = Ed25519Fulfillment(public_key=b.me) fulfillment = cc.Ed25519Fulfillment(public_key=b.me)
fulfillment.sign(fulfillment_message, crypto.SigningKey(b.me_private)) fulfillment.sign(fulfillment_message, crypto.SigningKey(b.me_private))
tx['transaction']['fulfillments'][0]['fulfillment'] = fulfillment.serialize_uri() tx['transaction']['fulfillments'][0]['fulfillment'] = fulfillment.serialize_uri()
@ -1286,7 +1284,7 @@ class TestCryptoconditions(object):
original_fulfillment = tx['transaction']['fulfillments'][0] original_fulfillment = tx['transaction']['fulfillments'][0]
fulfillment_message = util.get_fulfillment_message(tx, original_fulfillment, serialized=True) fulfillment_message = util.get_fulfillment_message(tx, original_fulfillment, serialized=True)
fulfillment = Ed25519Fulfillment(public_key=user_vk) fulfillment = cc.Ed25519Fulfillment(public_key=user_vk)
fulfillment.sign(fulfillment_message, crypto.SigningKey(user_sk)) fulfillment.sign(fulfillment_message, crypto.SigningKey(user_sk))
tx['transaction']['fulfillments'][0]['fulfillment'] = fulfillment.serialize_uri() tx['transaction']['fulfillments'][0]['fulfillment'] = fulfillment.serialize_uri()
@ -1300,7 +1298,7 @@ class TestCryptoconditions(object):
first_input_tx = b.get_owned_ids(user_vk).pop() first_input_tx = b.get_owned_ids(user_vk).pop()
first_tx = b.create_transaction(user_vk, other_vk, first_input_tx, 'TRANSFER') first_tx = b.create_transaction(user_vk, other_vk, first_input_tx, 'TRANSFER')
first_tx_condition = Ed25519Fulfillment(public_key=other_vk) first_tx_condition = cc.Ed25519Fulfillment(public_key=other_vk)
first_tx['transaction']['conditions'][0]['condition'] = { first_tx['transaction']['conditions'][0]['condition'] = {
'details': json.loads(first_tx_condition.serialize_json()), 'details': json.loads(first_tx_condition.serialize_json()),
'uri': first_tx_condition.condition.serialize_uri() 'uri': first_tx_condition.condition.serialize_uri()
@ -1308,7 +1306,7 @@ class TestCryptoconditions(object):
first_tx_fulfillment = first_tx['transaction']['fulfillments'][0] first_tx_fulfillment = first_tx['transaction']['fulfillments'][0]
first_tx_fulfillment_message = util.get_fulfillment_message(first_tx, first_tx_fulfillment, serialized=True) first_tx_fulfillment_message = util.get_fulfillment_message(first_tx, first_tx_fulfillment, serialized=True)
first_tx_fulfillment = Ed25519Fulfillment(public_key=user_vk) first_tx_fulfillment = cc.Ed25519Fulfillment(public_key=user_vk)
first_tx_fulfillment.sign(first_tx_fulfillment_message, crypto.SigningKey(user_sk)) first_tx_fulfillment.sign(first_tx_fulfillment_message, crypto.SigningKey(user_sk))
first_tx['transaction']['fulfillments'][0]['fulfillment'] = first_tx_fulfillment.serialize_uri() first_tx['transaction']['fulfillments'][0]['fulfillment'] = first_tx_fulfillment.serialize_uri()
@ -1327,7 +1325,7 @@ class TestCryptoconditions(object):
next_tx_fulfillment = next_tx['transaction']['fulfillments'][0] next_tx_fulfillment = next_tx['transaction']['fulfillments'][0]
next_tx_fulfillment_message = util.get_fulfillment_message(next_tx, next_tx_fulfillment, serialized=True) next_tx_fulfillment_message = util.get_fulfillment_message(next_tx, next_tx_fulfillment, serialized=True)
next_tx_fulfillment = Ed25519Fulfillment(public_key=other_vk) next_tx_fulfillment = cc.Ed25519Fulfillment(public_key=other_vk)
next_tx_fulfillment.sign(next_tx_fulfillment_message, crypto.SigningKey(other_sk)) next_tx_fulfillment.sign(next_tx_fulfillment_message, crypto.SigningKey(other_sk))
next_tx['transaction']['fulfillments'][0]['fulfillment'] = next_tx_fulfillment.serialize_uri() next_tx['transaction']['fulfillments'][0]['fulfillment'] = next_tx_fulfillment.serialize_uri()
@ -1342,9 +1340,9 @@ class TestCryptoconditions(object):
first_input_tx = b.get_owned_ids(user_vk).pop() first_input_tx = b.get_owned_ids(user_vk).pop()
first_tx = b.create_transaction(user_vk, [other1_vk, other2_vk], first_input_tx, 'TRANSFER') first_tx = b.create_transaction(user_vk, [other1_vk, other2_vk], first_input_tx, 'TRANSFER')
first_tx_condition = ThresholdSha256Fulfillment(threshold=2) first_tx_condition = cc.ThresholdSha256Fulfillment(threshold=2)
first_tx_condition.add_subfulfillment(Ed25519Fulfillment(public_key=other1_vk)) first_tx_condition.add_subfulfillment(cc.Ed25519Fulfillment(public_key=other1_vk))
first_tx_condition.add_subfulfillment(Ed25519Fulfillment(public_key=other2_vk)) first_tx_condition.add_subfulfillment(cc.Ed25519Fulfillment(public_key=other2_vk))
first_tx['transaction']['conditions'][0]['condition'] = { first_tx['transaction']['conditions'][0]['condition'] = {
'details': json.loads(first_tx_condition.serialize_json()), 'details': json.loads(first_tx_condition.serialize_json()),
@ -1370,11 +1368,11 @@ class TestCryptoconditions(object):
next_tx_fulfillment = next_tx['transaction']['fulfillments'][0] next_tx_fulfillment = next_tx['transaction']['fulfillments'][0]
next_tx_fulfillment_message = util.get_fulfillment_message(next_tx, next_tx_fulfillment, serialized=True) next_tx_fulfillment_message = util.get_fulfillment_message(next_tx, next_tx_fulfillment, serialized=True)
next_tx_fulfillment = ThresholdSha256Fulfillment(threshold=2) next_tx_fulfillment = cc.ThresholdSha256Fulfillment(threshold=2)
next_tx_subfulfillment1 = Ed25519Fulfillment(public_key=other1_vk) next_tx_subfulfillment1 = cc.Ed25519Fulfillment(public_key=other1_vk)
next_tx_subfulfillment1.sign(next_tx_fulfillment_message, crypto.SigningKey(other1_sk)) next_tx_subfulfillment1.sign(next_tx_fulfillment_message, crypto.SigningKey(other1_sk))
next_tx_fulfillment.add_subfulfillment(next_tx_subfulfillment1) next_tx_fulfillment.add_subfulfillment(next_tx_subfulfillment1)
next_tx_subfulfillment2 = Ed25519Fulfillment(public_key=other2_vk) next_tx_subfulfillment2 = cc.Ed25519Fulfillment(public_key=other2_vk)
next_tx_subfulfillment2.sign(next_tx_fulfillment_message, crypto.SigningKey(other2_sk)) next_tx_subfulfillment2.sign(next_tx_fulfillment_message, crypto.SigningKey(other2_sk))
next_tx_fulfillment.add_subfulfillment(next_tx_subfulfillment2) next_tx_fulfillment.add_subfulfillment(next_tx_subfulfillment2)
next_tx['transaction']['fulfillments'][0]['fulfillment'] = next_tx_fulfillment.serialize_uri() next_tx['transaction']['fulfillments'][0]['fulfillment'] = next_tx_fulfillment.serialize_uri()
@ -1390,9 +1388,9 @@ class TestCryptoconditions(object):
first_input_tx = b.get_owned_ids(user_vk).pop() first_input_tx = b.get_owned_ids(user_vk).pop()
first_tx = b.create_transaction(user_vk, [other1_vk, other2_vk], first_input_tx, 'TRANSFER') first_tx = b.create_transaction(user_vk, [other1_vk, other2_vk], first_input_tx, 'TRANSFER')
first_tx_condition = ThresholdSha256Fulfillment(threshold=2) first_tx_condition = cc.ThresholdSha256Fulfillment(threshold=2)
first_tx_condition.add_subfulfillment(Ed25519Fulfillment(public_key=other1_vk)) first_tx_condition.add_subfulfillment(cc.Ed25519Fulfillment(public_key=other1_vk))
first_tx_condition.add_subfulfillment(Ed25519Fulfillment(public_key=other2_vk)) first_tx_condition.add_subfulfillment(cc.Ed25519Fulfillment(public_key=other2_vk))
first_tx['transaction']['conditions'][0]['condition'] = { first_tx['transaction']['conditions'][0]['condition'] = {
'details': json.loads(first_tx_condition.serialize_json()), 'details': json.loads(first_tx_condition.serialize_json()),
@ -1418,13 +1416,13 @@ class TestCryptoconditions(object):
next_tx_fulfillment = next_tx['transaction']['fulfillments'][0] next_tx_fulfillment = next_tx['transaction']['fulfillments'][0]
next_tx_fulfillment_message = util.get_fulfillment_message(next_tx, next_tx_fulfillment, serialized=True) next_tx_fulfillment_message = util.get_fulfillment_message(next_tx, next_tx_fulfillment, serialized=True)
next_tx_fulfillment = ThresholdSha256Fulfillment(threshold=2) next_tx_fulfillment = cc.ThresholdSha256Fulfillment(threshold=2)
next_tx_subfulfillment1 = Ed25519Fulfillment(public_key=other1_vk) next_tx_subfulfillment1 = cc.Ed25519Fulfillment(public_key=other1_vk)
next_tx_subfulfillment1.sign(next_tx_fulfillment_message, crypto.SigningKey(other1_sk)) next_tx_subfulfillment1.sign(next_tx_fulfillment_message, crypto.SigningKey(other1_sk))
next_tx_fulfillment.add_subfulfillment(next_tx_subfulfillment1) next_tx_fulfillment.add_subfulfillment(next_tx_subfulfillment1)
# Wrong signing happens here # Wrong signing happens here
next_tx_subfulfillment2 = Ed25519Fulfillment(public_key=other1_vk) next_tx_subfulfillment2 = cc.Ed25519Fulfillment(public_key=other1_vk)
next_tx_subfulfillment2.sign(next_tx_fulfillment_message, crypto.SigningKey(other1_sk)) next_tx_subfulfillment2.sign(next_tx_fulfillment_message, crypto.SigningKey(other1_sk))
next_tx_fulfillment.add_subfulfillment(next_tx_subfulfillment2) next_tx_fulfillment.add_subfulfillment(next_tx_subfulfillment2)
next_tx['transaction']['fulfillments'][0]['fulfillment'] = next_tx_fulfillment.serialize_uri() next_tx['transaction']['fulfillments'][0]['fulfillment'] = next_tx_fulfillment.serialize_uri()
@ -1443,9 +1441,9 @@ class TestCryptoconditions(object):
assert len(tx['transaction']['conditions'][0]['condition']['details']['subfulfillments']) == 2 assert len(tx['transaction']['conditions'][0]['condition']['details']['subfulfillments']) == 2
# expected condition subfulfillments # expected condition subfulfillments
expected_condition = ThresholdSha256Fulfillment(threshold=2) expected_condition = cc.ThresholdSha256Fulfillment(threshold=2)
expected_condition.add_subfulfillment(Ed25519Fulfillment(public_key=user_vk)) expected_condition.add_subfulfillment(cc.Ed25519Fulfillment(public_key=user_vk))
expected_condition.add_subfulfillment(Ed25519Fulfillment(public_key=user2_vk)) expected_condition.add_subfulfillment(cc.Ed25519Fulfillment(public_key=user2_vk))
tx_expected_condition = { tx_expected_condition = {
'details': json.loads(expected_condition.serialize_json()), 'details': json.loads(expected_condition.serialize_json()),
'uri': expected_condition.condition.serialize_uri() 'uri': expected_condition.condition.serialize_uri()
@ -1469,7 +1467,7 @@ class TestCryptoconditions(object):
tx_transfer_signed = b.sign_transaction(tx_transfer, [user_sk, user2_sk]) tx_transfer_signed = b.sign_transaction(tx_transfer, [user_sk, user2_sk])
# expected fulfillment # expected fulfillment
expected_fulfillment = Fulfillment.from_json(tx_create['transaction']['conditions'][0]['condition']['details']) expected_fulfillment = cc.Fulfillment.from_json(tx_create['transaction']['conditions'][0]['condition']['details'])
subfulfillment1 = expected_fulfillment.subconditions[0]['body'] subfulfillment1 = expected_fulfillment.subconditions[0]['body']
subfulfillment2 = expected_fulfillment.subconditions[1]['body'] subfulfillment2 = expected_fulfillment.subconditions[1]['body']
@ -1493,7 +1491,8 @@ class TestCryptoconditions(object):
# create a transaction with multiple new_owners # create a transaction with multiple new_owners
tx = b.create_transaction(b.me, new_owners, None, 'CREATE') tx = b.create_transaction(b.me, new_owners, None, 'CREATE')
condition = cc.Fulfillment.from_json(tx['transaction']['conditions'][0]['condition']['details'])
for new_owner in new_owners: for new_owner in new_owners:
subcondition = util.get_subcondition_from_vk(tx['transaction']['conditions'][0], new_owner) subcondition = condition.get_subcondition_from_vk(new_owner)[0]
assert subcondition.public_key.to_ascii().decode() == new_owner assert subcondition.public_key.to_ascii().decode() == new_owner