Skip to content

Commit 3370a4d

Browse files
authored
Merge pull request #299 from anikitinDSR/rc-1.0.2
[RC-1.0.2] Release candidate for plugins
2 parents ffdfc41 + f045113 commit 3370a4d

21 files changed

Lines changed: 919 additions & 378 deletions

devops/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ ifeq ($(SRC_DIR_NAME),sovtoken)
5353
# pypi: indy-plenum
5454
# apt: indy-plenum (stable component)
5555

56-
FPM_P_DEPENDS := indy-node(=1.9.1)
56+
FPM_P_DEPENDS := indy-node(=1.9.2~rc1)
5757
FPM_ARGS := --no-python-dependencies $(FPM_ARGS)
5858
endif
5959

devops/docker/ci/xenial/Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys CE7709D068DB5E88 \
2525
RUN add-apt-repository "deb https://repo.sovrin.org/sdk/deb xenial master" \
2626
&& apt-get update && apt-get install -y \
2727
libindy-crypto=0.4.5 \
28-
libindy=1.9.0~1132 \
29-
libsovtoken=0.9.7~66 \
28+
libindy=1.11.0~1282 \
29+
libsovtoken=1.0.0~79 \
3030
&& rm -rf /var/lib/apt/lists/*
3131

3232
RUN mkdir -p /etc/indy && echo "ENABLED_PLUGINS = ['sovtoken', 'sovtokenfees']" > /etc/indy/indy_config.py \

sovtoken/setup.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
with open(os.path.join(here, 'sovtoken', '__metadata__.py'), 'r') as f:
2020
exec(f.read(), metadata)
2121

22-
tests_require = ['pytest==4.6.2', 'pytest-xdist', 'mock', 'python3-indy==1.10.0-dev-1198']
22+
tests_require = ['pytest==4.6.2', 'pytest-xdist', 'mock', 'python3-indy==1.11.0-dev-1282']
2323

2424
setup(
2525
name=metadata['__title__'],
@@ -38,7 +38,7 @@
3838
'*.css', '*.ico', '*.png', 'LICENSE', 'LEGAL', 'sovtoken']},
3939
include_package_data=True,
4040

41-
install_requires=['indy-node==1.9.1'],
41+
install_requires=['indy-node==1.9.2rc1'],
4242

4343
setup_requires=['pytest-runner'],
4444
extras_require={

sovtoken/sovtoken/client_authnr.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
1-
from copy import deepcopy
2-
31
import base58
42
from base58 import b58decode
53

64
from common.serializers.serialization import serialize_msg_for_signing
7-
from plenum.common.constants import TXN_TYPE, IDENTIFIER
8-
from plenum.common.exceptions import (CouldNotAuthenticate,
9-
InsufficientCorrectSignatures,
5+
from indy_node.server.client_authn import LedgerBasedAuthNr
6+
from plenum.common.constants import TXN_TYPE
7+
from plenum.common.exceptions import (InsufficientCorrectSignatures,
108
InvalidSignatureFormat)
119
from plenum.common.types import OPERATION, PLUGIN_TYPE_AUTHENTICATOR, f
1210
from plenum.common.verifier import DidVerifier, Verifier
13-
from plenum.server.client_authn import CoreAuthNr
1411
from sovtoken.constants import (ADDRESS, INPUTS, MINT_PUBLIC, OUTPUTS, SIGS,
1512
XFER_PUBLIC, EXTRA)
1613
from sovtoken.util import address_to_verkey
@@ -26,7 +23,7 @@ def verify(self, sig, msg) -> bool:
2623
return self._vr.verify(sig, msg)
2724

2825

29-
class TokenAuthNr(CoreAuthNr):
26+
class TokenAuthNr(LedgerBasedAuthNr):
3027
pluginType = PLUGIN_TYPE_AUTHENTICATOR
3128

3229
# ------------------------------------------------------------------------------------

sovtoken/sovtoken/main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,5 +100,5 @@ def register_authentication(node):
100100
token_authnr = TokenAuthNr(ACCEPTABLE_WRITE_TYPES,
101101
ACCEPTABLE_QUERY_TYPES,
102102
ACCEPTABLE_ACTION_TYPES,
103-
node.states[DOMAIN_LEDGER_ID])
103+
node.db_manager.idr_cache)
104104
node.clientAuthNr.register_authenticator(token_authnr)

sovtoken/sovtoken/test/helpers/helper_request.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from indy.ledger import build_nym_request, build_schema_request, \
55
build_acceptance_mechanisms_request, build_txn_author_agreement_request, \
66
build_get_txn_author_agreement_request, append_txn_author_agreement_acceptance_to_request
7-
from indy.payment import build_get_payment_sources_request, build_payment_req, build_mint_req, \
7+
from indy.payment import build_get_payment_sources_with_from_request, build_payment_req, build_mint_req, \
88
prepare_payment_extra_with_acceptance_data
99
from sovtoken.test.constants import VALID_IDENTIFIER
1010

@@ -44,17 +44,13 @@ def __init__(
4444
self._client_wallet = client_wallet
4545
self._steward_wallet = steward_wallet
4646

47-
def get_utxo(self, address, from_seqno=None):
47+
def get_utxo(self, address, from_seqno=-1):
4848
""" Builds a get_utxo request. """
4949

50-
get_utxo_request_future = build_get_payment_sources_request(self._client_wallet_handle, VALID_IDENTIFIER, address)
50+
get_utxo_request_future = build_get_payment_sources_with_from_request(self._client_wallet_handle, VALID_IDENTIFIER, address, from_seqno)
5151
get_utxo_request = self._looper.loop.run_until_complete(get_utxo_request_future)[0]
5252
get_utxo_request = self._sdk.sdk_json_to_request_object(json.loads(get_utxo_request))
5353

54-
# TODO: as soon as SDK gets implemented "from", remove this two lines and pass it to the builder
55-
if from_seqno:
56-
get_utxo_request.operation[FROM_SEQNO] = from_seqno
57-
5854
return get_utxo_request
5955

6056
def get_txn(self, ledger_id, seq_no):
@@ -92,15 +88,15 @@ def add_transaction_author_agreement_to_request(self, request, text, mechanism,
9288
extra = self._looper.loop.run_until_complete(extra_future)
9389
return extra
9490

95-
def mint(self, outputs, text=None, mechanism=None, version=None):
91+
def mint(self, outputs, text=None, mechanism=None, version=None, number_signers=3):
9692
""" Builds a mint request. """
9793
outputs_ready = self._prepare_outputs(outputs)
9894

9995
mint_request_future = build_mint_req(self._client_wallet_handle, self._wallet._trustees[0], json.dumps(outputs_ready), None)
10096
mint_request = self._looper.loop.run_until_complete(mint_request_future)[0]
10197
if text and mechanism and version:
10298
mint_request = self.add_transaction_author_agreement_to_request(mint_request, text, mechanism, version)
103-
mint_request = self._wallet.sign_request_trustees(mint_request, number_signers=3)
99+
mint_request = self._wallet.sign_request_trustees(mint_request, number_signers=number_signers)
104100
mint_request = json.loads(mint_request)
105101
signatures = mint_request["signatures"]
106102
mint_request = self._sdk.sdk_json_to_request_object(mint_request)

sovtoken/sovtoken/test/req_handlers/mint_req_handler/test_mint_req_handler_dynamic_validation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ def test_mint_handler_dynamic_validation_valid_request(mint_handler, mint_reques
99

1010

1111
def test_mint_handler_dynamic_validation_not_enough_signatures(mint_handler, mint_request):
12-
mint_request.signatures = dict([(k, v) for k, v in mint_request.signatures.items()][:-1])
12+
mint_request.signatures = {mint_request.identifier: mint_request.signatures[mint_request.identifier]}
1313
with pytest.raises(UnauthorizedClientRequest, match='Not enough TRUSTEE signatures'):
1414
mint_handler.dynamic_validation(mint_request)
1515

sovtoken/sovtoken/test/test_client_authnr.py

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,8 @@
88
from sovtoken.test.helpers.helper_request import SEC_PER_DAY
99

1010
from indy_common.types import Request
11-
from plenum.common.constants import DOMAIN_LEDGER_ID
12-
from plenum.common.exceptions import UnknownIdentifier, InvalidSignatureFormat, InsufficientCorrectSignatures, \
13-
CouldNotAuthenticate
14-
from plenum.server.client_authn import CoreAuthNr
11+
from indy_node.server.client_authn import LedgerBasedAuthNr
12+
from plenum.common.exceptions import UnknownIdentifier, InvalidSignatureFormat, InsufficientCorrectSignatures
1513
from sovtoken.test.wallet import TokenWallet
1614
from sovtoken.client_authnr import TokenAuthNr, AddressSigVerifier
1715
from sovtoken.constants import INPUTS, OUTPUTS, EXTRA, ACCEPTABLE_WRITE_TYPES, ACCEPTABLE_QUERY_TYPES, \
@@ -118,7 +116,7 @@ def test_authenticate_invalid_signatures_format(helpers, node, addresses):
118116
token_authnr = TokenAuthNr(ACCEPTABLE_WRITE_TYPES,
119117
ACCEPTABLE_QUERY_TYPES,
120118
ACCEPTABLE_ACTION_TYPES,
121-
node[0].states[DOMAIN_LEDGER_ID])
119+
node[0].db_manager.idr_cache)
122120
outputs = [{"address": SF_address, "amount": 30}, {"address": user1_address, "amount": 30}]
123121
request = helpers.request.mint(outputs)
124122
req_data = request.as_dict
@@ -137,7 +135,7 @@ def test_authenticate_insufficient_valid_signatures_data(helpers, node, addresse
137135
token_authnr = TokenAuthNr(ACCEPTABLE_WRITE_TYPES,
138136
ACCEPTABLE_QUERY_TYPES,
139137
ACCEPTABLE_ACTION_TYPES,
140-
node[0].states[DOMAIN_LEDGER_ID])
138+
node[0].db_manager.idr_cache)
141139
outputs = [{"address": SF_address, "amount": 30}, {"address": user1_address, "amount": 30}]
142140
request = helpers.request.mint(outputs)
143141
req_data = request.as_dict
@@ -153,7 +151,7 @@ def test_authenticate_success_3_sigs(helpers, node, addresses):
153151
token_authnr = TokenAuthNr(ACCEPTABLE_WRITE_TYPES,
154152
ACCEPTABLE_QUERY_TYPES,
155153
ACCEPTABLE_ACTION_TYPES,
156-
node[0].states[DOMAIN_LEDGER_ID])
154+
node[0].db_manager.idr_cache)
157155
outputs = [{"address": SF_address, "amount": 30}, {"address": user1_address, "amount": 30}]
158156
request = helpers.request.mint(outputs)
159157
req_data = request.as_dict
@@ -167,7 +165,7 @@ def test_authenticate_calls_authenticate_xfer(helpers, node, addresses):
167165
token_authnr = TokenAuthNr(ACCEPTABLE_WRITE_TYPES,
168166
ACCEPTABLE_QUERY_TYPES,
169167
ACCEPTABLE_ACTION_TYPES,
170-
node[0].states[DOMAIN_LEDGER_ID])
168+
node[0].db_manager.idr_cache)
171169
inputs = [{"source": utxo_from_addr_and_seq_no(SF_address, 1)}]
172170
outputs = [{"address": user1_address, "amount": 10}, {"address": SF_address, "amount": 10}]
173171
request = helpers.request.transfer(inputs, outputs)
@@ -185,7 +183,7 @@ def test_authenticate_xfer_success(node, user2_token_wallet, user2_address, user
185183
token_authnr = TokenAuthNr(ACCEPTABLE_WRITE_TYPES,
186184
ACCEPTABLE_QUERY_TYPES,
187185
ACCEPTABLE_ACTION_TYPES,
188-
node[0].states[DOMAIN_LEDGER_ID])
186+
node[0].db_manager.idr_cache)
189187
inputs = [[user2_token_wallet, user2_address, 1]]
190188
outputs = [{"address": user1_address, "amount": 10}, {"address": user2_address, "amount": 10}]
191189
request = xfer_request(inputs, outputs)
@@ -199,7 +197,7 @@ def test_authenticate_xfer_invalid_signature_format(node, user2_token_wallet, us
199197
token_authnr = TokenAuthNr(ACCEPTABLE_WRITE_TYPES,
200198
ACCEPTABLE_QUERY_TYPES,
201199
ACCEPTABLE_ACTION_TYPES,
202-
node[0].states[DOMAIN_LEDGER_ID])
200+
node[0].db_manager.idr_cache)
203201
inputs = [[user2_token_wallet, user2_address, 1]]
204202
outputs = [[user1_address, 10], [user2_address, 10]]
205203
request = xfer_request(inputs, outputs)
@@ -215,7 +213,7 @@ def test_authenticate_xfer_insufficient_correct_signatures(node, user2_token_wal
215213
token_authnr = TokenAuthNr(ACCEPTABLE_WRITE_TYPES,
216214
ACCEPTABLE_QUERY_TYPES,
217215
ACCEPTABLE_ACTION_TYPES,
218-
node[0].states[DOMAIN_LEDGER_ID])
216+
node[0].db_manager.idr_cache)
219217
inputs = [[user2_token_wallet, user2_address, 1], [SF_token_wallet, SF_address, 2]]
220218
outputs = [[user1_address, 10], [user2_address, 10]]
221219
request = xfer_request(inputs, outputs)
@@ -232,7 +230,7 @@ def test_authenticate_xfer_with_extra(helpers, node, addresses):
232230
token_authnr = TokenAuthNr(ACCEPTABLE_WRITE_TYPES,
233231
ACCEPTABLE_QUERY_TYPES,
234232
ACCEPTABLE_ACTION_TYPES,
235-
node[0].states[DOMAIN_LEDGER_ID])
233+
node[0].db_manager.idr_cache)
236234
inputs = [{"source": utxo_from_addr_and_seq_no(SF_address, 1)}]
237235
outputs = [{"address": user1_address, "amount": 10}, {"address": SF_address, "amount": 10}]
238236
request = helpers.request.transfer(inputs, outputs, extra=json.dumps({"aaa": "bbb"}))
@@ -246,7 +244,7 @@ def test_authenticate_xfer_with_extra_not_signed(helpers, node, addresses):
246244
token_authnr = TokenAuthNr(ACCEPTABLE_WRITE_TYPES,
247245
ACCEPTABLE_QUERY_TYPES,
248246
ACCEPTABLE_ACTION_TYPES,
249-
node[0].states[DOMAIN_LEDGER_ID])
247+
node[0].db_manager.idr_cache)
250248
inputs = [{"source": utxo_from_addr_and_seq_no(SF_address, 1)}]
251249
outputs = [{"address": user1_address, "amount": 10}, {"address": SF_address, "amount": 10}]
252250
request = helpers.request.transfer(inputs, outputs)
@@ -262,7 +260,7 @@ def test_authenticate_xfer_with_taa(helpers, node, addresses):
262260
token_authnr = TokenAuthNr(ACCEPTABLE_WRITE_TYPES,
263261
ACCEPTABLE_QUERY_TYPES,
264262
ACCEPTABLE_ACTION_TYPES,
265-
node[0].states[DOMAIN_LEDGER_ID])
263+
node[0].db_manager.idr_cache)
266264
inputs = [{"source": utxo_from_addr_and_seq_no(SF_address, 1)}]
267265
outputs = [{"address": user1_address, "amount": 10}, {"address": SF_address, "amount": 10}]
268266
extra = helpers.request.add_transaction_author_agreement_to_extra(None, "text", "mechanism", "version")
@@ -276,7 +274,7 @@ def test_authenticate_xfer_with_taa_not_signed(helpers, node, addresses, looper)
276274
token_authnr = TokenAuthNr(ACCEPTABLE_WRITE_TYPES,
277275
ACCEPTABLE_QUERY_TYPES,
278276
ACCEPTABLE_ACTION_TYPES,
279-
node[0].states[DOMAIN_LEDGER_ID])
277+
node[0].db_manager.idr_cache)
280278
inputs = [{"source": utxo_from_addr_and_seq_no(SF_address, 1)}]
281279
outputs = [{"address": user1_address, "amount": 10}, {"address": SF_address, "amount": 10}]
282280
request = helpers.request.transfer(inputs, outputs)
@@ -295,13 +293,13 @@ def test_authenticate_xfer_with_taa_not_signed(helpers, node, addresses, looper)
295293
# -------------------------Test serializeForSig method------------------------------------------------------------------
296294

297295
# This test that the serializeForSig method is being called when a XFER_PUBLIC request is submitted
298-
@mock.patch.object(CoreAuthNr, 'serializeForSig', return_value=True)
296+
@mock.patch.object(LedgerBasedAuthNr, 'serializeForSig', return_value=True)
299297
def test_serializeForSig_XFER_PUBLIC_path(node, user2_token_wallet, user2_address,
300298
SF_token_wallet, SF_address, user1_address):
301299
token_authnr = TokenAuthNr(ACCEPTABLE_WRITE_TYPES,
302300
ACCEPTABLE_QUERY_TYPES,
303301
ACCEPTABLE_ACTION_TYPES,
304-
node[0].states[DOMAIN_LEDGER_ID])
302+
node[0].db_manager.idr_cache)
305303
inputs = [[user2_token_wallet, user2_address, 1], [SF_token_wallet, SF_address, 2]]
306304
outputs = [[user1_address, 10], [user1_address, 10]]
307305
request = xfer_request(inputs, outputs)
@@ -311,13 +309,13 @@ def test_serializeForSig_XFER_PUBLIC_path(node, user2_token_wallet, user2_addres
311309

312310

313311
# This test that the serializeForSig method is being called when a MINT_PUBLIC request is submitted
314-
@mock.patch.object(CoreAuthNr, 'serializeForSig')
312+
@mock.patch.object(LedgerBasedAuthNr, 'serializeForSig')
315313
def test_serializeForSig_MINT_PUBLIC_path(helpers, node, addresses):
316314
[SF_address, user1_address] = addresses
317315
token_authnr = TokenAuthNr(ACCEPTABLE_WRITE_TYPES,
318316
ACCEPTABLE_QUERY_TYPES,
319317
ACCEPTABLE_ACTION_TYPES,
320-
node[0].states[DOMAIN_LEDGER_ID])
318+
node[0].db_manager.idr_cache)
321319
outputs = [[SF_address, 30], [user1_address, 30]]
322320
request = helpers.request.mint(outputs)
323321
msg = request.as_dict
@@ -333,7 +331,7 @@ def test_getVerkey_success(node):
333331
token_authnr = TokenAuthNr(ACCEPTABLE_WRITE_TYPES,
334332
ACCEPTABLE_QUERY_TYPES,
335333
ACCEPTABLE_ACTION_TYPES,
336-
node[0].states[DOMAIN_LEDGER_ID])
334+
node[0].db_manager.idr_cache)
337335
ver_key = token_authnr.getVerkey(VALID_IDENTIFIER, Request())
338336
assert len(ver_key) == 23
339337
assert ver_key[0] == '~'
@@ -344,7 +342,7 @@ def test_getVerkey_pay_address_success(node):
344342
token_authnr = TokenAuthNr(ACCEPTABLE_WRITE_TYPES,
345343
ACCEPTABLE_QUERY_TYPES,
346344
ACCEPTABLE_ACTION_TYPES,
347-
node[0].states[DOMAIN_LEDGER_ID])
345+
node[0].db_manager.idr_cache)
348346
# TODO change these to indicate they are addresses
349347
identifier_43 = 'sjw1ceG7wtym3VcnyaYtf1xo37gCUQHDR5VWcKWNPLRZ1X8eC'
350348
ver_key = token_authnr.getVerkey(identifier_43, Request())
@@ -356,7 +354,7 @@ def test_getVerkey_invalid_identifier(node):
356354
token_authnr = TokenAuthNr(ACCEPTABLE_WRITE_TYPES,
357355
ACCEPTABLE_QUERY_TYPES,
358356
ACCEPTABLE_ACTION_TYPES,
359-
node[0].states[DOMAIN_LEDGER_ID])
357+
node[0].db_manager.idr_cache)
360358
identifier_invalid = 'INVALID_IDENTIFIER'
361359
with pytest.raises(UnknownIdentifier):
362360
token_authnr.getVerkey(identifier_invalid, Request())
@@ -370,7 +368,7 @@ def test_get_xfer_ser_data_success(node, user2_token_wallet, user2_address,
370368
token_authnr = TokenAuthNr(ACCEPTABLE_WRITE_TYPES,
371369
ACCEPTABLE_QUERY_TYPES,
372370
ACCEPTABLE_ACTION_TYPES,
373-
node[0].states[DOMAIN_LEDGER_ID])
371+
node[0].db_manager.idr_cache)
374372
inputs = [[user2_token_wallet, user2_address, 1], [SF_token_wallet, SF_address, 2]]
375373
outputs = [[user1_address, 10], [user1_address, 10]]
376374
request = xfer_request(inputs, outputs)
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
from random import randint
2+
3+
import pytest
4+
from plenum.test.stasher import delay_rules
5+
from plenum.test.delayers import req_delay
6+
from sovtoken.constants import UTXO_LIMIT, TOKEN_LEDGER_ID
7+
from sovtoken.request_handlers.token_utils import TokenStaticHelper
8+
from sovtoken.test.helper import libsovtoken_address_to_address
9+
10+
11+
@pytest.fixture
12+
def addresses(helpers):
13+
return helpers.wallet.create_new_addresses(2)
14+
15+
16+
@pytest.fixture(scope='function')
17+
def make_tokens(helpers, nodeSetWithIntegratedTokenPlugin, addresses):
18+
address, address_2 = addresses
19+
states = [n.db_manager.get_state(TOKEN_LEDGER_ID) for n in nodeSetWithIntegratedTokenPlugin]
20+
utxos = []
21+
22+
for i in range(UTXO_LIMIT+200):
23+
amount = randint(1, 5)
24+
seq_no = i+5
25+
key = TokenStaticHelper.create_state_key(libsovtoken_address_to_address(address), seq_no)
26+
utxos.append((key, amount, seq_no))
27+
for state in states:
28+
state.set(key, str(amount).encode())
29+
30+
total = 1000
31+
outputs = [{"address": address_2, "amount": total}]
32+
helpers.general.do_mint(outputs)
33+
34+
35+
@pytest.fixture(scope='function', params=['all_responding', 'one_responding'])
36+
def nodeSetWithOneRespondingNode(request, nodeSetWithIntegratedTokenPlugin, make_tokens):
37+
if request.param == 'all_responding':
38+
yield nodeSetWithIntegratedTokenPlugin
39+
else:
40+
stashers = [node.clientIbStasher for node in nodeSetWithIntegratedTokenPlugin[1:]]
41+
with delay_rules(stashers, req_delay()):
42+
yield nodeSetWithIntegratedTokenPlugin
43+
44+
45+
def test_state_proof_get_utxo_read(helpers, addresses, make_tokens, nodeSetWithOneRespondingNode):
46+
address, _ = addresses
47+
request = helpers.request.get_utxo(address)
48+
helpers.sdk.send_and_check_request_objects([request])

0 commit comments

Comments
 (0)