Skip to content

Commit a7a3fd0

Browse files
author
Andrew Nikitin
committed
Merge remote-tracking branch 'public/master' into rc-1.2.35
Signed-off-by: Andrew Nikitin <[email protected]>
2 parents 493cb2f + d7155f9 commit a7a3fd0

File tree

414 files changed

+8773
-6860
lines changed

Some content is hidden

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

414 files changed

+8773
-6860
lines changed

Jenkinsfile

-1
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

-1
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

+1-2
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ def test(options=[:]) {
8989

9090
try {
9191
if (options.useRunner) {
92-
sh "PYTHONASYNCIODEBUG='0' $options.python runner.py --pytest \"$options.python -m pytest\" --dir $options.testDir --output \"$options.resFile\" --test-only-slice \"$options.testOnlySlice\""
92+
sh "RUSTPYTHONASYNCIODEBUG='0' $options.python runner.py --pytest \"$options.python -m pytest\" --dir $options.testDir --output \"$options.resFile\" --test-only-slice \"$options.testOnlySlice\""
9393
} else {
9494
sh "$options.python -m pytest --junitxml=$options.resFile $options.testDir"
9595
}
@@ -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

+1-2
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/Dockerfile

+13-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
FROM ubuntu:16.04
22

3+
RUN apt-get update -y && apt-get install -y \
4+
apt-transport-https \
5+
ca-certificates
6+
37
RUN apt-get update -y && apt-get install -y \
48
# common stuff
59
git \
@@ -9,12 +13,19 @@ RUN apt-get update -y && apt-get install -y \
913
python3-pip \
1014
python-setuptools \
1115
python3-venv \
12-
# fmp
16+
# fpm
1317
ruby \
1418
ruby-dev \
1519
rubygems \
1620
gcc \
17-
make
21+
make \
22+
# rocksdb python wrapper
23+
libbz2-dev \
24+
zlib1g-dev \
25+
liblz4-dev \
26+
libsnappy-dev
27+
28+
RUN pip3 install -U setuptools
1829

1930
# install fpm
2031
RUN gem install --no-ri --no-rdoc fpm

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

+32-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,23 @@ set -x
55

66
OUTPUT_PATH=${1:-.}
77

8+
function build_rocksdb_deb {
9+
VERSION=$1
10+
VERSION_TAG="rocksdb-$VERSION"
11+
12+
git clone https://github.com/evernym/rocksdb.git /tmp/rocksdb
13+
cd /tmp/rocksdb
14+
git checkout $VERSION_TAG
15+
sed -i 's/-m [email protected]/-m "Hyperledger <[email protected]>"/g' \
16+
./build_tools/make_package.sh
17+
PORTABLE=1 EXTRA_CFLAGS="-fPIC" EXTRA_CXXFLAGS="-fPIC" ./build_tools/make_package.sh $VERSION
18+
cp ./package/rocksdb_${VERSION}_amd64.deb $OUTPUT_PATH
19+
# Install it in the system as it is needed by python-rocksdb.
20+
make install
21+
cd -
22+
rm -rf /tmp/rocksdb
23+
}
24+
825
function build_from_pypi {
926
PACKAGE_NAME=$1
1027

@@ -17,8 +34,13 @@ function build_from_pypi {
1734
PREREM_TMP=prerm-${PACKAGE_NAME}
1835
cp postinst ${POSTINST_TMP}
1936
cp prerm ${PREREM_TMP}
20-
sed -i 's/{package_name}/python3-'${PACKAGE_NAME}'/' ${POSTINST_TMP}
21-
sed -i 's/{package_name}/python3-'${PACKAGE_NAME}'/' ${PREREM_TMP}
37+
if [[ ${PACKAGE_NAME} =~ ^python-* ]]; then
38+
PACKAGE_NAME_TMP="${PACKAGE_NAME/python-/}"
39+
else
40+
PACKAGE_NAME_TMP=$PACKAGE_NAME
41+
fi
42+
sed -i 's/{package_name}/python3-'${PACKAGE_NAME_TMP}'/' ${POSTINST_TMP}
43+
sed -i 's/{package_name}/python3-'${PACKAGE_NAME_TMP}'/' ${PREREM_TMP}
2244

2345
fpm --input-type "python" \
2446
--output-type "deb" \
@@ -38,14 +60,21 @@ function build_from_pypi {
3860
rm ${PREREM_TMP}
3961
}
4062

63+
# Build rocksdb at first
64+
build_rocksdb_deb 5.8.8
65+
4166
build_from_pypi ioflo 1.5.4
4267
build_from_pypi orderedset 2.0
4368
build_from_pypi base58 0.2.4
4469
build_from_pypi prompt-toolkit 0.57
4570
build_from_pypi rlp 0.5.1
4671
build_from_pypi sha3 0.2.1
47-
build_from_pypi raet 0.6.6
72+
build_from_pypi libnacl 1.6.1
73+
build_from_pypi six 1.11.0
4874
build_from_pypi pyzmq 16.0.2
4975
build_from_pypi intervaltree 2.1.0
5076
build_from_pypi portalocker 0.5.7
5177
build_from_pypi sortedcontainers 1.5.7
78+
build_from_pypi setuptools 38.5.2
79+
# TODO: add libsnappy dependency for python-rocksdb package
80+
build_from_pypi python-rocksdb 0.6.9

ci/ubuntu.dockerfile

+9-1
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,18 @@ ARG uid=1000
55
ARG user=indy
66
ARG venv=venv
77

8+
RUN echo "To invalidate cache"
9+
810
RUN apt-get update -y && apt-get install -y \
911
python3-nacl \
1012
libindy-crypto=0.2.0 \
11-
libindy
13+
libindy=1.3.1~452 \
14+
# rocksdb python wrapper
15+
libbz2-dev \
16+
zlib1g-dev \
17+
liblz4-dev \
18+
libsnappy-dev \
19+
rocksdb=5.8.8
1220

1321
RUN indy_ci_add_user $uid $user $venv
1422

ledger/ledger.py

+17-7
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,20 @@
1010
from ledger.tree_hasher import TreeHasher
1111
from ledger.util import F, ConsistencyVerificationFailed
1212
from storage.kv_store import KeyValueStorage
13-
from storage.kv_store_leveldb_int_keys import KeyValueStorageLeveldbIntKeys
13+
from storage.helper import initKeyValueStorageIntKeys
14+
from plenum.common.config_util import getConfig
1415

1516

1617
class Ledger(ImmutableStore):
1718
@staticmethod
1819
def _defaultStore(dataDir,
1920
logName,
2021
ensureDurability,
21-
open=True) -> KeyValueStorage:
22-
return KeyValueStorageLeveldbIntKeys(dataDir, logName, open)
22+
open=True,
23+
config=None) -> KeyValueStorage:
24+
config = config or getConfig()
25+
return initKeyValueStorageIntKeys(config.transactionLogDefaultStorage,
26+
dataDir, logName, open)
2327

2428
def __init__(self,
2529
tree: MerkleTree,
@@ -29,7 +33,8 @@ def __init__(self,
2933
fileName: str = None,
3034
ensureDurability: bool = True,
3135
transactionLogStore: KeyValueStorage = None,
32-
genesis_txn_initiator: GenesisTxnInitiator = None):
36+
genesis_txn_initiator: GenesisTxnInitiator = None,
37+
config=None):
3338
"""
3439
:param tree: an implementation of MerkleTree
3540
:param dataDir: the directory where the transaction log is stored
@@ -42,6 +47,7 @@ def __init__(self,
4247

4348
self.dataDir = dataDir
4449
self.tree = tree
50+
self.config = config or getConfig()
4551
self.txn_serializer = txn_serializer or ledger_txn_serializer # type: MappingSerializer
4652
# type: MappingSerializer
4753
self.hash_serializer = hash_serializer or ledger_hash_serializer
@@ -204,7 +210,8 @@ def start(self, loop=None, ensureDurability=True):
204210
self._customTransactionLogStore or \
205211
self._defaultStore(self.dataDir,
206212
self._transactionLogName,
207-
ensureDurability)
213+
ensureDurability,
214+
config=self.config)
208215
if self._transactionLog.closed:
209216
self._transactionLog.open()
210217
if self.tree.hashStore.closed:
@@ -222,8 +229,11 @@ def reset(self):
222229
# TODO: rename getAllTxn to get_txn_slice with required parameters frm to
223230
# add get_txn_all without args.
224231
def getAllTxn(self, frm: int = None, to: int = None):
225-
yield from ((int(seq_no), self.txn_serializer.deserialize(txn))
226-
for seq_no, txn in self._transactionLog.iterator(start=frm, end=to))
232+
for seq_no, txn in self._transactionLog.iterator(start=frm, end=to):
233+
if to is None or int(seq_no) <= to:
234+
yield (int(seq_no), self.txn_serializer.deserialize(txn))
235+
else:
236+
break
227237

228238
@staticmethod
229239
def hashToStr(h):

ledger/test/conftest.py

+12-6
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from common.serializers.signing_serializer import SigningSerializer
88
from ledger.genesis_txn.genesis_txn_file_util import create_genesis_txn_init_ledger
99
from ledger.test.helper import create_ledger, create_ledger_text_file_storage, \
10-
create_ledger_chunked_file_storage, create_ledger_leveldb_file_storage
10+
create_ledger_chunked_file_storage, create_ledger_leveldb_storage, create_ledger_rocksdb_storage
1111

1212

1313
@pytest.fixture(scope='module')
@@ -75,32 +75,38 @@ def hash_serializer(request):
7575
return CompactSerializer(orderedFields)
7676

7777

78-
@pytest.yield_fixture(scope="function", params=['TextFileStorage', 'ChunkedFileStorage', 'LeveldbStorage'])
78+
@pytest.yield_fixture(scope="function", params=['TextFileStorage', 'ChunkedFileStorage',
79+
'LeveldbStorage', 'RocksdbStorage'])
7980
def ledger(request, genesis_txn_file, tempdir, txn_serializer, hash_serializer):
8081
ledger = create_ledger(request, txn_serializer,
8182
hash_serializer, tempdir, genesis_txn_file)
8283
yield ledger
8384
ledger.stop()
8485

8586

86-
@pytest.yield_fixture(scope="function", params=['TextFileStorage', 'ChunkedFileStorage', 'LeveldbStorage'])
87+
@pytest.yield_fixture(scope="function", params=['TextFileStorage', 'ChunkedFileStorage',
88+
'LeveldbStorage', 'RocksdbStorage'])
8789
def create_ledger_callable(request):
8890
if request.param == 'TextFileStorage':
8991
return create_ledger_text_file_storage
9092
elif request.param == 'ChunkedFileStorage':
9193
return create_ledger_chunked_file_storage
9294
elif request.param == 'LeveldbStorage':
93-
return create_ledger_leveldb_file_storage
95+
return create_ledger_leveldb_storage
96+
elif request.param == 'RocksdbStorage':
97+
return create_ledger_rocksdb_storage
9498

9599

96-
@pytest.yield_fixture(scope="function", params=['TextFileStorage', 'ChunkedFileStorage', 'LeveldbStorage'])
100+
@pytest.yield_fixture(scope="function", params=['TextFileStorage', 'ChunkedFileStorage',
101+
'LeveldbStorage', 'RocksdbStorage'])
97102
def ledger_no_genesis(request, tempdir, txn_serializer, hash_serializer):
98103
ledger = create_ledger(request, txn_serializer, hash_serializer, tempdir)
99104
yield ledger
100105
ledger.stop()
101106

102107

103-
@pytest.yield_fixture(scope="function", params=['TextFileStorage', 'ChunkedFileStorage', 'LeveldbStorage'])
108+
@pytest.yield_fixture(scope="function", params=['TextFileStorage', 'ChunkedFileStorage',
109+
'LeveldbStorage', 'RocksdbStorage'])
104110
def ledger_with_genesis(request, init_genesis_txn_file, tempdir, txn_serializer, hash_serializer):
105111
ledger = create_ledger(request, txn_serializer,
106112
hash_serializer, tempdir, init_genesis_txn_file)

ledger/test/helper.py

+11-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from storage.binary_serializer_based_file_store import BinarySerializerBasedFileStore
1313
from storage.chunked_file_store import ChunkedFileStore
1414
from storage.kv_store_leveldb_int_keys import KeyValueStorageLeveldbIntKeys
15+
from storage.kv_store_rocksdb_int_keys import KeyValueStorageRocksdbIntKeys
1516
from storage.text_file_store import TextFileStore
1617

1718

@@ -70,7 +71,9 @@ def create_ledger(request, txn_serializer, hash_serializer, tempdir, init_genesi
7071
elif request.param == 'ChunkedFileStorage':
7172
return create_ledger_chunked_file_storage(txn_serializer, hash_serializer, tempdir, init_genesis_txn_file)
7273
elif request.param == 'LeveldbStorage':
73-
return create_ledger_leveldb_file_storage(txn_serializer, hash_serializer, tempdir, init_genesis_txn_file)
74+
return create_ledger_leveldb_storage(txn_serializer, hash_serializer, tempdir, init_genesis_txn_file)
75+
elif request.param == 'RocksdbStorage':
76+
return create_ledger_rocksdb_storage(txn_serializer, hash_serializer, tempdir, init_genesis_txn_file)
7477

7578

7679
def create_ledger_text_file_storage(txn_serializer, hash_serializer, tempdir, init_genesis_txn_file=None):
@@ -92,12 +95,18 @@ def create_ledger_text_file_storage(txn_serializer, hash_serializer, tempdir, in
9295
return __create_ledger(store, txn_serializer, hash_serializer, tempdir, init_genesis_txn_file)
9396

9497

95-
def create_ledger_leveldb_file_storage(txn_serializer, hash_serializer, tempdir, init_genesis_txn_file=None):
98+
def create_ledger_leveldb_storage(txn_serializer, hash_serializer, tempdir, init_genesis_txn_file=None):
9699
store = KeyValueStorageLeveldbIntKeys(tempdir,
97100
'transactions')
98101
return __create_ledger(store, txn_serializer, hash_serializer, tempdir, init_genesis_txn_file)
99102

100103

104+
def create_ledger_rocksdb_storage(txn_serializer, hash_serializer, tempdir, init_genesis_txn_file=None):
105+
store = KeyValueStorageRocksdbIntKeys(tempdir,
106+
'transactions')
107+
return __create_ledger(store, txn_serializer, hash_serializer, tempdir, init_genesis_txn_file)
108+
109+
101110
def create_ledger_chunked_file_storage(txn_serializer, hash_serializer, tempdir, init_genesis_txn_file=None):
102111
chunk_creator = None
103112
db_name = 'transactions'

ledger/test/test_utils.py

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import random
2+
3+
from ledger.util import has_nth_bit_set
4+
5+
6+
def test_nth_bit_set():
7+
"""
8+
Check if bits of randomly chosen integers are set or unset and compare
9+
with the binary representation.
10+
"""
11+
for _ in range(0, 10000):
12+
number = random.randint(0, 100000000)
13+
bits = bin(number)[2:]
14+
for i, b in enumerate(reversed(bits)):
15+
assert has_nth_bit_set(number, i) == (int(b) == 1)

ledger/util.py

+10
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,16 @@ def highest_bit_set(i):
3232
return hiBit
3333

3434

35+
def has_nth_bit_set(number, n):
36+
"""
37+
Check if a specific bit is set in a number.
38+
:param number: The number to check.
39+
:param n: The bit if set
40+
:return:
41+
"""
42+
return ((1 << n) & number) > 0
43+
44+
3545
def highestPowerOf2LessThan(n):
3646
return n.bit_length() - 1
3747

plenum/bls/bls_store.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from common.serializers.serialization import multi_sig_store_serializer
2-
from plenum.persistence.storage import initKeyValueStorage
2+
from storage.helper import initKeyValueStorage
33
from crypto.bls.bls_multi_signature import MultiSignature
44
from typing import Optional
55

plenum/cli/cli.py

+1-10
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,

0 commit comments

Comments
 (0)