Skip to content

Commit

Permalink
Merge pull request #32 from skalenetwork/feature/SKALE-1770-integrate…
Browse files Browse the repository at this point in the history
…-sgx-dkg-into-skale-admin

Feature/skale 1770 integrate sgx dkg into skale admin
  • Loading branch information
dmytrotkk authored Dec 2, 2019
2 parents fab4be3 + c67557f commit fb83405
Show file tree
Hide file tree
Showing 5 changed files with 142 additions and 167 deletions.
41 changes: 23 additions & 18 deletions core/schains/dkg.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,25 +22,26 @@
import logging
import time
from time import sleep
import random

from core.schains.helper import get_schain_config_filepath
from tools.configs import NODE_DATA_PATH
from tools.bls.dkg_utils import init_dkg_client, broadcast, get_dkg_broadcast_filter, send_complaint, response, send_allright, get_dkg_successful_filter, get_dkg_fail_filter, get_dkg_all_data_received_filter, get_dkg_bad_guy_filter, get_dkg_complaint_sent_filter, get_schains_data_contract, get_dkg_all_complaints_filter
from tools.bls.dkg_utils import init_dkg_client, broadcast, get_dkg_broadcast_filter, send_complaint, response, send_allright, get_dkg_successful_filter, get_dkg_fail_filter, get_dkg_all_data_received_filter, get_dkg_bad_guy_filter, get_dkg_complaint_sent_filter, get_schains_data_contract, get_dkg_all_complaints_filter, generate_bls_key, generate_bls_key_name, generate_poly_name
from tools.bls.dkg_client import DkgVerificationError

logger = logging.getLogger(__name__)


class FailedDKG(Exception):
def __init__(self, msg):
super().__init__(msg)

def init_bls(web3, skale, wallet, schain_name):


def init_bls(skale, schain_name, sgx_key_name):

secret_key_share_filepath = get_secret_key_share_filepath(schain_name)
config_filepath = get_schain_config_filepath(schain_name)

group_index = web3.sha3(text = schain_name)

if not os.path.isfile(secret_key_share_filepath):

with open(config_filepath, 'r') as infile:
Expand All @@ -49,13 +50,13 @@ def init_bls(web3, skale, wallet, schain_name):
n = len(config_file["skaleConfig"]["sChain"]["nodes"])
t = (2 * n + 1) // 3

local_wallet = wallet.get_full()

#todo: remove local_wallet -> skale
dkg_client = init_dkg_client(config_filepath, web3, skale, local_wallet, n, t)
dkg_client = init_dkg_client(config_filepath, skale, n, t, sgx_key_name)
dkg_id = random.randint(0, 10**50)
group_index_str = str(int(skale.web3.toHex(dkg_client.group_index)[2:], 16))
poly_name = generate_poly_name(group_index_str, dkg_client.node_id_dkg, dkg_id)

dkg_broadcast_filter = get_dkg_broadcast_filter(skale, dkg_client.group_index)
broadcast(dkg_client)
broadcast(dkg_client, poly_name)

is_received = [False] * n
is_received[dkg_client.node_id_dkg] = True
Expand All @@ -72,16 +73,16 @@ def init_bls(web3, skale, wallet, schain_name):
for event in dkg_broadcast_filter.get_all_entries():
from_node = event["args"]["fromNode"]

if is_received[dkg_client.node_ids_contract[from_node]] == False:
if not is_received[dkg_client.node_ids_contract[from_node]]:
is_received[dkg_client.node_ids_contract[from_node]] = True

try:
dkg_client.RecieveAll(from_node, event)
dkg_client.RecieveFromNode(from_node, event)
is_correct[dkg_client.node_ids_contract[from_node]] = True
except DkgVerificationError:
continue

logger.info(f'Recieved by {dkg_client.node_id_dkg}')
logger.info(f'Recieved by {dkg_client.node_id_dkg} from {dkg_client.node_ids_contract[from_node]}')
sleep(1)

dkg_fail_filter = get_dkg_fail_filter(skale, dkg_client.group_index)
Expand All @@ -90,7 +91,7 @@ def init_bls(web3, skale, wallet, schain_name):
complainted_node_index = -1
start_time_response = time.time()
for i in range(n):
if is_correct[i] == False or is_received[i] == False:
if not is_correct[i] or not is_received[i]:
send_complaint(dkg_client, i)
dkg_bad_guy_filter = get_dkg_bad_guy_filter(skale)
is_comlaint_sent = True
Expand All @@ -103,18 +104,23 @@ def init_bls(web3, skale, wallet, schain_name):
start_time_allright = time.time()
dkg_all_data_received_filter = get_dkg_all_data_received_filter(skale, dkg_client.group_index)
dkg_successful_filter = get_dkg_successful_filter(skale, dkg_client.group_index)
encrypted_bls_key = 0
bls_key_name = generate_bls_key_name(group_index_str, dkg_client.node_id_dkg, dkg_id)
if not is_comlaint_sent:
send_allright(dkg_client)
encrypted_bls_key = generate_bls_key(dkg_client, bls_key_name)
is_allright_sent_list[dkg_client.node_id_dkg] = True

logger.info(f'Node`s encrypted bls key is: {encrypted_bls_key}')

if len(dkg_fail_filter.get_all_entries()) > 0:
raise FailedDKG("failed due to event FailedDKG")

is_complaint_received = False
dkg_complaint_sent_filter = get_dkg_complaint_sent_filter(skale, dkg_client.group_index, dkg_client.node_id_contract)
for event in dkg_complaint_sent_filter.get_all_entries():
is_complaint_received = True
response(dkg_client)
response(dkg_client, event["fromNodeIndex"])

if len(dkg_fail_filter.get_all_entries()) > 0:
raise FailedDKG("failed due to event FailedDKG")
Expand Down Expand Up @@ -148,12 +154,11 @@ def init_bls(web3, skale, wallet, schain_name):

if True in is_allright_sent_list:
if len(dkg_successful_filter.get_all_entries()) > 0:
schains_data_contract = get_schains_data_contract(web3)
schains_data_contract = get_schains_data_contract(skale.web3)
common_public_key = schains_data_contract.functions.getGroupsPublicKey(dkg_client.group_index).call()

with open(secret_key_share_filepath, 'w') as outfile:
json.dump({"secret_key :": dkg_client.secret_key_share,
"common_public_key :": common_public_key,
json.dump({"common_public_key :": common_public_key,
"public_key :": dkg_client.public_key}, outfile)


Expand Down
12 changes: 6 additions & 6 deletions core/schains/monitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,12 +85,12 @@ def monitor_schain(self, schain):
init_schain_dir(name)
if not checks['config']:
self.init_schain_config(name, owner)
#if not checks['dkg']:
# try:
# init_bls(self.skale.web3, self.skale, schain['name']) # todo!
# except FailedDKG:
# # todo: clean up here
# exit(1)
if not checks['dkg']:
try:
init_bls(self.skale, schain['name'], self.node_config.sgx_key_name)
except FailedDKG:
# todo: clean up here
exit(1)
if not checks['volume']:
init_data_volume(schain)
if not checks['container']:
Expand Down
5 changes: 3 additions & 2 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ docker==4.0.2
pyjwt==1.4.2
simple-crypt==4.1.7
pycryptodome==3.4.11
coincurve==12.0.0

skale.py==2.0.dev16

Expand All @@ -20,4 +19,6 @@ psutil==5.6.3

colorful==0.5.4

filelock==3.0.12
filelock==3.0.12

eth-utils==1.0.1
Loading

0 comments on commit fb83405

Please sign in to comment.