Skip to content

Commit c2e46f2

Browse files
authored
Merge pull request #86 from hyperledger/master
Master
2 parents 31b1a9c + b5f63b3 commit c2e46f2

File tree

87 files changed

+1400
-2125
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

87 files changed

+1400
-2125
lines changed

Jenkinsfile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ def stpTestUbuntu = {
7878
testHelpers.install()
7979

8080
echo 'Ubuntu Test: Test'
81-
testHelpers.testJUnit([testDir: 'stp_raet', resFile: "test-result-stp-raet.${NODE_NAME}.xml"])
8281
testHelpers.testJUnit([testDir: 'stp_zmq', resFile: "test-result-stp-zmq.${NODE_NAME}.xml"])
8382
}
8483
}

Jenkinsfile.cd

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ def stpTestUbuntu = {
7878
testHelpers.install()
7979

8080
echo 'Ubuntu Test: Test'
81-
testHelpers.testJUnit([testDir: 'stp_raet', resFile: "test-result-stp-raet.${NODE_NAME}.xml"])
8281
testHelpers.testJUnit([testDir: 'stp_zmq', resFile: "test-result-stp-zmq.${NODE_NAME}.xml"])
8382
}
8483
}

Jenkinsfile.ci

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,6 @@ def staticCodeValidation() {
128128

129129
def tests = [
130130
stp: { python ->
131-
test(testDir: 'stp_raet', resFile: "test-result-stp-raet.${NODE_NAME}.xml", python: python)
132131
test(testDir: 'stp_zmq', resFile: "test-result-stp-zmq.${NODE_NAME}.xml", python: python)
133132
},
134133
ledger: { python ->

README.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,7 @@ mechanism that Plenum needs.
4949
- state storage using python 3 version of Ethereum's Patricia Trie
5050
- stp:
5151
- secure transport abstraction
52-
- it has two implementations: RAET and ZeroMQ
53-
- Although RAET implementation is there, it's not supported anymore, and [ZeroMQ](http://zeromq.org/) is the default secure transport in plenum.
52+
- it has [ZeroMQ](http://zeromq.org/) implementations
5453
- storage:
5554
- key-value storage abstractions
5655
- contains [leveldb](http://leveldb.org/) implementation as the main key-valued storage used in Plenum (for ledger, state, etc.)

build-scripts/ubuntu-1604/build-3rd-parties.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ build_from_pypi base58 0.2.4
4444
build_from_pypi prompt-toolkit 0.57
4545
build_from_pypi rlp 0.5.1
4646
build_from_pypi sha3 0.2.1
47-
build_from_pypi raet 0.6.6
47+
build_from_pypi libnacl 1.6.1
48+
build_from_pypi six 1.11.0
4849
build_from_pypi pyzmq 16.0.2
4950
build_from_pypi intervaltree 2.1.0
5051
build_from_pypi portalocker 0.5.7

ci/ubuntu.dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ ARG venv=venv
88
RUN apt-get update -y && apt-get install -y \
99
python3-nacl \
1010
libindy-crypto=0.2.0 \
11-
libindy
11+
libindy=1.3.1~403
1212

1313
RUN indy_ci_add_user $uid $user $venv
1414

plenum/cli/cli.py

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
from stp_core.crypto.util import cleanSeed, seedFromHex
4141
from stp_core.network.port_dispenser import genHa
4242
from stp_core.types import HA
43-
from stp_raet.util import getLocalEstateData
4443
from plenum.common.config_helper import PNodeConfigHelper
4544

4645
import configparser
@@ -231,20 +230,13 @@ def __init__(self, looper, basedirpath: str, ledger_base_dir: str, nodeReg=None,
231230
eventloop=eventloop,
232231
output=out)
233232

234-
# RAETVerbosity = getRAETLogLevelFromConfig("RAETLogLevelCli",
235-
# Console.Wordage.mute,
236-
# self.config)
237-
# RAETLogFile = getRAETLogFilePath("RAETLogFilePathCli", self.config)
238233
# Patch stdout in something that will always print *above* the prompt
239234
# when something is written to stdout.
240235
sys.stdout = self.cli.stdout_proxy()
241236

242237
if logFileName:
243238
Logger().enableFileLogging(logFileName)
244239

245-
# TODO: If we want RAET logging in CLI we need fix this. See INDY-315.
246-
# Logger().setupRaet(RAETVerbosity, RAETLogFile)
247-
248240
self.logger = getlogger("cli")
249241
self.print("\n{}-CLI (c) 2017 Evernym, Inc.".format(self.properName))
250242
self._actions = []
@@ -1062,8 +1054,7 @@ def newClient(self, clientName,
10621054
if not areKeysSetup(clientName, self.basedirpath):
10631055
client_addr = genHa(ip='0.0.0.0')
10641056
else:
1065-
client_addr = tuple(getLocalEstateData(clientName,
1066-
self.basedirpath)['ha'])
1057+
raise Exception("Usage of deprecated code")
10671058
nodeReg = None if self.nodeRegLoadedFromFile else self.cliNodeReg
10681059
client = self.ClientClass(clientName,
10691060
ha=client_addr,

plenum/client/client.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,6 @@ def __init__(self,
107107
self.keys_dir = os.path.join(_keys_dir, "keys")
108108

109109
cha = None
110-
# If client information already exists is RAET then use that
111110
if self.exists(self.stackName, self.keys_dir):
112111
cha = self.nodeStackClass.getHaFromLocal(
113112
self.stackName, self.keys_dir)

plenum/common/batched.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,11 @@ def flushOutBoxes(self) -> None:
141141
del self.outBoxes[rid]
142142

143143
def _make_batch(self, msgs):
144-
batch = Batch(msgs, None)
145-
serialized_batch = self.sign_and_serialize(batch)
144+
if len(msgs) > 1:
145+
batch = Batch(msgs, None)
146+
serialized_batch = self.sign_and_serialize(batch)
147+
else:
148+
serialized_batch = msgs[0]
146149
return serialized_batch
147150

148151
def _test_batch_len(self, batch_len):

plenum/common/ledger_info.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ def set_defaults(self):
4747

4848
# Key of the 3PC-batch ordered by the master instance that contained
4949
# the last transaction of this node's ledger
50-
self.last_txn_3PC_key = None
50+
# This is a map of last 3PC for each received LedgerStatus
51+
self.last_txn_3PC_key = {}
5152

5253
# Dictionary of consistency proofs received for the ledger
5354
# in process of catching up
@@ -83,7 +84,7 @@ def done_syncing(self):
8384
self.canSync = False
8485
self.state = LedgerState.synced
8586
self.ledgerStatusOk = set()
86-
self.last_txn_3PC_key = None
87+
self.last_txn_3PC_key = {}
8788
self.recvdConsistencyProofs = {}
8889
self.receivedCatchUpReplies = []
8990
self.recvdCatchupRepliesFrm = {}

plenum/common/ledger_manager.py

Lines changed: 49 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,39 @@
11
import heapq
2+
import math
23
import operator
3-
from collections import Callable
4+
import time
5+
from collections import Callable, Counter
46
from functools import partial
57
from random import shuffle
68
from typing import Any, List, Dict, Tuple
7-
import math
89
from typing import Optional
910

10-
import time
11-
from plenum.common.ledger import Ledger
1211
from ledger.merkle_verifier import MerkleVerifier
1312
from ledger.util import F
14-
15-
from plenum.common.messages.node_messages import LedgerStatus, CatchupRep, \
16-
ConsistencyProof, f, CatchupReq
13+
from plenum.common.config_util import getConfig
1714
from plenum.common.constants import POOL_LEDGER_ID, LedgerState, DOMAIN_LEDGER_ID, \
1815
CONSISTENCY_PROOF, CATCH_UP_PREFIX
19-
from plenum.common.util import compare_3PC_keys, SortedDict
20-
from plenum.common.config_util import getConfig
16+
from plenum.common.ledger import Ledger
17+
from plenum.common.ledger_info import LedgerInfo
18+
from plenum.common.messages.node_messages import LedgerStatus, CatchupRep, \
19+
ConsistencyProof, f, CatchupReq
20+
from plenum.common.txn_util import reqToTxn
21+
from plenum.common.util import compare_3PC_keys, SortedDict, mostCommonElement, min_3PC_key
22+
from plenum.server.has_action_queue import HasActionQueue
2123
from plenum.server.quorums import Quorums
2224
from stp_core.common.constants import CONNECTION_PREFIX
2325
from stp_core.common.log import getlogger
24-
from plenum.server.has_action_queue import HasActionQueue
25-
from plenum.common.ledger_info import LedgerInfo
26-
from plenum.common.txn_util import reqToTxn
27-
2826

2927
logger = getlogger()
3028

3129

3230
class LedgerManager(HasActionQueue):
33-
3431
def __init__(self,
3532
owner,
36-
ownedByNode: bool=True,
37-
postAllLedgersCaughtUp: Optional[Callable]=None,
38-
preCatchupClbk: Optional[Callable]=None,
39-
ledger_sync_order: Optional[List]=None):
33+
ownedByNode: bool = True,
34+
postAllLedgersCaughtUp: Optional[Callable] = None,
35+
preCatchupClbk: Optional[Callable] = None,
36+
ledger_sync_order: Optional[List] = None):
4037
# If ledger_sync_order is not provided (is None), it is assumed that
4138
# `postCatchupCompleteClbk` of the LedgerInfo will be used
4239
self.owner = owner
@@ -52,7 +49,7 @@ def __init__(self,
5249

5350
# Holds ledgers of different types with
5451
# their info like callbacks, state, etc
55-
self.ledgerRegistry = {} # type: Dict[int, LedgerInfo]
52+
self.ledgerRegistry = {} # type: Dict[int, LedgerInfo]
5653

5754
# Largest 3 phase key received during catchup.
5855
# This field is needed to discard any stashed 3PC messages or
@@ -67,11 +64,11 @@ def service(self):
6764
return self._serviceActions()
6865

6966
def addLedger(self, iD: int, ledger: Ledger,
70-
preCatchupStartClbk: Callable=None,
71-
postCatchupStartClbk: Callable=None,
72-
preCatchupCompleteClbk: Callable=None,
73-
postCatchupCompleteClbk: Callable=None,
74-
postTxnAddedToLedgerClbk: Callable=None):
67+
preCatchupStartClbk: Callable = None,
68+
postCatchupStartClbk: Callable = None,
69+
preCatchupCompleteClbk: Callable = None,
70+
postCatchupCompleteClbk: Callable = None,
71+
postTxnAddedToLedgerClbk: Callable = None):
7572

7673
if iD in self.ledgerRegistry:
7774
logger.error("{} already present in ledgers "
@@ -257,7 +254,7 @@ def processLedgerStatus(self, status: LedgerStatus, frm: str):
257254
ledgerStatus = LedgerStatus(*status)
258255
if ledgerStatus.txnSeqNo < 0:
259256
self.discard(status, reason="Received negative sequence number "
260-
"from {}".format(frm),
257+
"from {}".format(frm),
261258
logMethod=logger.warning)
262259
return
263260
ledgerId = getattr(status, f.LEDGER_ID.nm)
@@ -309,10 +306,8 @@ def processLedgerStatus(self, status: LedgerStatus, frm: str):
309306
ledgerInfo.recvdConsistencyProofs[frm] = None
310307
ledgerInfo.ledgerStatusOk.add(frm)
311308

312-
if self.isLedgerSame(ledgerStatus) \
313-
and ledgerStatus.viewNo is not None \
314-
and ledgerStatus.ppSeqNo is not None:
315-
ledgerInfo.last_txn_3PC_key = \
309+
if self.isLedgerSame(ledgerStatus):
310+
ledgerInfo.last_txn_3PC_key[frm] = \
316311
(ledgerStatus.viewNo, ledgerStatus.ppSeqNo)
317312

318313
if self.has_ledger_status_quorum(
@@ -329,11 +324,30 @@ def processLedgerStatus(self, status: LedgerStatus, frm: str):
329324
self.do_pre_catchup(ledgerId)
330325
# Any state cleanup that is part of pre-catchup should be
331326
# done
332-
self.catchupCompleted(ledgerId, ledgerInfo.last_txn_3PC_key)
327+
last_3PC_key = self._get_last_txn_3PC_key(ledgerInfo)
328+
self.catchupCompleted(ledgerId, last_3PC_key)
333329
else:
334330
# Ledger was already synced
335331
self.mark_ledger_synced(ledgerId)
336332

333+
def _get_last_txn_3PC_key(self, ledgerInfo):
334+
quorum = Quorums(self.owner.totalNodes)
335+
quorumed_3PC_keys = \
336+
[
337+
most_common_element
338+
for most_common_element, freq in
339+
Counter(ledgerInfo.last_txn_3PC_key.values()).most_common()
340+
if quorum.ledger_status_last_3PC.is_reached(freq) and
341+
most_common_element[0] is not None and
342+
most_common_element[1] is not None
343+
]
344+
345+
if len(quorumed_3PC_keys) == 0:
346+
return None
347+
348+
min_quorumed_3PC_key = min_3PC_key(quorumed_3PC_keys)
349+
return min_quorumed_3PC_key
350+
337351
@staticmethod
338352
def has_ledger_status_quorum(leger_status_num, total_nodes):
339353
quorum = Quorums(total_nodes).ledger_status
@@ -577,7 +591,7 @@ def _transform(self, txn):
577591
# Certain transactions might need to be
578592
# transformed to certain format before applying to the ledger
579593
txn = reqToTxn(txn)
580-
z = txn if not self.ownedByNode else \
594+
z = txn if not self.ownedByNode else \
581595
self.owner.transform_txn_for_ledger(txn)
582596
return z
583597

@@ -636,7 +650,7 @@ def _getCatchupReplyForSeqNo(self, ledgerId, seqNo):
636650
for k, catchupReps in ledgerInfo.recvdCatchupRepliesFrm.items():
637651
for rep in catchupReps:
638652
txns = getattr(rep, f.TXNS.nm)
639-
# Transfers of odcits in RAET converts integer keys to string
653+
640654
if str(seqNo) in txns:
641655
return k, rep
642656

@@ -726,7 +740,7 @@ def canStartCatchUpProcess(self, ledgerId: int):
726740

727741
logger.debug(
728742
"{} cannot start catchup since received only {} "
729-
"consistency proofs but need at least {}". format(
743+
"consistency proofs but need at least {}".format(
730744
self,
731745
len(recvdConsProof),
732746
adjustedQuorum.consistency_proof.value))
@@ -852,7 +866,7 @@ def startCatchUpProcess(self, ledgerId: int, proof: ConsistencyProof):
852866
def _getCatchupTimeout(self, numRequest, batchSize):
853867
return numRequest * self.config.CatchupTransactionsTimeout
854868

855-
def catchupCompleted(self, ledgerId: int, last_3PC: Optional[Tuple]=None):
869+
def catchupCompleted(self, ledgerId: int, last_3PC: Optional[Tuple] = None):
856870
if ledgerId not in self.ledgerRegistry:
857871
logger.error("{}{} called catchup completed for ledger {}".
858872
format(CATCH_UP_PREFIX, self, ledgerId))
@@ -975,7 +989,7 @@ def _get_merged_catchup_txns(existing_txns, new_txns):
975989
key=operator.itemgetter(0)))
976990

977991
def getConsistencyProof(self, status: LedgerStatus):
978-
ledger = self.getLedgerForMsg(status) # type: Ledger
992+
ledger = self.getLedgerForMsg(status) # type: Ledger
979993
ledgerId = getattr(status, f.LEDGER_ID.nm)
980994
seqNoStart = getattr(status, f.TXN_SEQ_NO.nm)
981995
seqNoEnd = ledger.size

plenum/common/messages/fields.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,13 @@ def _specific_validation(self, val):
102102
return
103103

104104

105+
class IntegerField(FieldBase):
106+
_base_types = (int,)
107+
108+
def _specific_validation(self, val):
109+
return
110+
111+
105112
class NonEmptyStringField(FieldBase):
106113
_base_types = (str,)
107114

plenum/common/script_helper.py

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
from stp_core.loop.eventually import eventually
1515
from stp_core.network.port_dispenser import genHa
1616
from stp_core.types import HA
17-
from stp_raet.util import getLocalVerKey, getLocalPubKey
1817

1918
NodeInfoFile = "node-info"
2019
GenTxnFile = "genesis_txn"
@@ -107,10 +106,6 @@ def storeGenTxns(baseDir, txn):
107106
isLineNoKey=True)
108107

109108

110-
def getStewardKeyFromName(baseDir, name):
111-
return getLocalVerKey(name, baseDir)
112-
113-
114109
def getAddGenesisHAs(nodeip, nodeport, clientip, clientport):
115110
vnodeip = nodeip if nodeip else "127.0.0.1"
116111
vnodeport = nodeport if nodeport else "9701"
@@ -182,41 +177,6 @@ def printGenTxn(txn, displayTxn):
182177
print('\n' + txn)
183178

184179

185-
def getVerKeyFromName(baseDir, roleName):
186-
return getLocalVerKey(roleName, baseDir)
187-
188-
189-
def getPubKeyFromName(baseDir, roleName):
190-
return getLocalPubKey(roleName, baseDir)
191-
192-
193-
def exportNodeGenTxn(baseDir, displayTxn, name):
194-
nodeInfo = getNodeInfo(baseDir, name)
195-
nodeVerKey = getVerKeyFromName(baseDir, name)
196-
stewardKey = nodeInfo.get('steward')
197-
nodeAddr = nodeInfo.get('nodeAddr')
198-
clientAddr = nodeInfo.get('clientAddr')
199-
200-
txn = 'add genesis transaction {node} with data {"'.format(node=PlenumTransactions.NODE.name) + name + '": {' \
201-
'"verkey":' \
202-
' "' + \
203-
nodeVerKey + \
204-
'", "node_address": "' + nodeAddr + \
205-
'", "client_address": "' + clientAddr + '"}, "by":"' + stewardKey + \
206-
'"}'
207-
storeExportedTxns(baseDir, txn)
208-
printGenTxn(txn, displayTxn)
209-
210-
211-
def exportStewardGenTxn(baseDir, displayTxn, name):
212-
verkey = getLocalVerKey(name, baseDir)
213-
txn = 'add genesis transaction {nym} with data {"'.format(nym=PlenumTransactions.NYM.name) + name + '": {' \
214-
'"verkey": "' + verkey + '"} role={role}'.format(
215-
role=Roles.STEWARD.name)
216-
storeExportedTxns(baseDir, txn)
217-
printGenTxn(txn, displayTxn)
218-
219-
220180
def submitNodeIpChange(client, stewardWallet, name: str, nym: str,
221181
nodeStackHa: HA, clientStackHa: HA):
222182
(nodeIp, nodePort), (clientIp, clientPort) = nodeStackHa, clientStackHa

0 commit comments

Comments
 (0)