mirror of https://github.com/nucypher/nucypher.git
Blockchain make arrangement lock periods, and consideration
parent
a0681c78d7
commit
820f41bdc0
|
@ -311,12 +311,12 @@ class PolicyAuthor(NucypherTokenActor):
|
||||||
txhash = arrangement.revoke()
|
txhash = arrangement.revoke()
|
||||||
return txhash
|
return txhash
|
||||||
|
|
||||||
def recruit(self, quantity: int, **options) -> List[Miner]:
|
def recruit(self, quantity: int, **options) -> Generator[Miner, None, None]:
|
||||||
"""Uses sampling logic to gather miners from the blockchain"""
|
"""Uses sampling logic to gather miners from the blockchain"""
|
||||||
|
|
||||||
miner_addresses = self.policy_agent.miner_agent.sample(quantity=quantity, **options)
|
miner_addresses = self.policy_agent.miner_agent.sample(quantity=quantity, **options)
|
||||||
miners = [Miner(ether_address=address, miner_agent=self.miner_agent) for address in miner_addresses]
|
for address in miner_addresses:
|
||||||
return miners
|
miner = Miner(ether_address=address, miner_agent=self.miner_agent)
|
||||||
|
yield miner
|
||||||
|
|
||||||
def create_policy(self, *args, **kwargs):
|
def create_policy(self, *args, **kwargs):
|
||||||
from nucypher.blockchain.eth.policies import BlockchainPolicy
|
from nucypher.blockchain.eth.policies import BlockchainPolicy
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import math
|
import math
|
||||||
|
from typing import List, Set
|
||||||
|
|
||||||
import maya
|
import maya
|
||||||
from constant_sorrow import constants
|
from constant_sorrow import constants
|
||||||
|
@ -7,6 +8,7 @@ from nucypher.blockchain.eth.actors import PolicyAuthor
|
||||||
|
|
||||||
from nucypher.blockchain.eth.actors import Miner
|
from nucypher.blockchain.eth.actors import Miner
|
||||||
from nucypher.blockchain.eth.agents import MinerAgent
|
from nucypher.blockchain.eth.agents import MinerAgent
|
||||||
|
from nucypher.characters import Ursula
|
||||||
from nucypher.policy.models import Arrangement, Policy
|
from nucypher.policy.models import Arrangement, Policy
|
||||||
|
|
||||||
|
|
||||||
|
@ -95,23 +97,31 @@ class BlockchainPolicy(Policy):
|
||||||
return arrangement
|
return arrangement
|
||||||
|
|
||||||
def make_arrangements(self, network_middleware, quantity: int,
|
def make_arrangements(self, network_middleware, quantity: int,
|
||||||
deposit: int, expiration: maya.MayaDT,
|
deposit: int, expiration: maya.MayaDT, ursulas: Set[Ursula]=None) -> None:
|
||||||
federated_only=False) -> None:
|
|
||||||
"""
|
"""
|
||||||
Create and consider n Arangement objects from sampled miners.
|
Create and consider n Arangement objects from sampled miners.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
if ursulas is not None:
|
||||||
|
# if len(ursulas) < self.n:
|
||||||
|
# raise Exception # TODO: Validate ursulas
|
||||||
|
pass
|
||||||
|
|
||||||
|
else:
|
||||||
try:
|
try:
|
||||||
sampled_miners = self.alice.recruit(quantity=quantity or self.n)
|
sampled_miners = self.alice.recruit(quantity=quantity or self.n)
|
||||||
except MinerAgent.NotEnoughMiners:
|
except MinerAgent.NotEnoughMiners:
|
||||||
raise # TODO
|
raise # TODO
|
||||||
|
else:
|
||||||
|
ursulas = (Ursula.from_miner(miner, is_me=False) for miner in sampled_miners)
|
||||||
|
|
||||||
for miner in sampled_miners: # TODO:
|
for ursula in ursulas:
|
||||||
|
|
||||||
delta = expiration - maya.now()
|
delta = expiration - maya.now()
|
||||||
hours = delta.seconds / 60 / 60
|
hours = (delta.total_seconds() / 60) / 60
|
||||||
periods = int(math.ceil(hours / int(constants.HOURS_PER_PERIOD)))
|
periods = int(math.ceil(hours / int(constants.HOURS_PER_PERIOD)))
|
||||||
|
|
||||||
blockchain_arrangement = BlockchainArrangement(author=self.alice, miner=miner,
|
blockchain_arrangement = BlockchainArrangement(author=self.alice, miner=ursula,
|
||||||
value=deposit, lock_periods=periods,
|
value=deposit, lock_periods=periods,
|
||||||
expiration=expiration, hrac=self.hrac)
|
expiration=expiration, hrac=self.hrac)
|
||||||
|
|
||||||
|
|
|
@ -653,13 +653,8 @@ class Ursula(Character, ProxyRESTServer, Miner):
|
||||||
return self._rest_app
|
return self._rest_app
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_config(cls, config: CharacterConfiguration) -> 'Ursula':
|
def from_miner(cls, miner, *args, **kwargs):
|
||||||
"""TODO"""
|
instance = cls(miner_agent=miner.miner_agent, ether_address=miner.ether_address, *args, **kwargs)
|
||||||
|
|
||||||
# Use BlockchainConfig to default to the first wallet address
|
|
||||||
wallet_address = config.blockchain.wallet_addresses[0]
|
|
||||||
|
|
||||||
instance = cls(ether_address=wallet_address)
|
|
||||||
return instance
|
return instance
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -712,7 +707,7 @@ class Ursula(Character, ProxyRESTServer, Miner):
|
||||||
|
|
||||||
value = self.interface_info_with_metadata()
|
value = self.interface_info_with_metadata()
|
||||||
setter = self.dht_server.set(key=ursula_id, value=value)
|
setter = self.dht_server.set(key=ursula_id, value=value)
|
||||||
self.publish_data(ursula_id)
|
self.publish_datastore(ursula_id)
|
||||||
loop = asyncio.get_event_loop()
|
loop = asyncio.get_event_loop()
|
||||||
loop.run_until_complete(setter)
|
loop.run_until_complete(setter)
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ import binascii
|
||||||
import uuid
|
import uuid
|
||||||
from abc import ABC, abstractmethod
|
from abc import ABC, abstractmethod
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
from typing import Generator
|
from typing import Generator, List
|
||||||
|
|
||||||
import maya
|
import maya
|
||||||
import msgpack
|
import msgpack
|
||||||
|
@ -113,7 +113,6 @@ class Policy(ABC):
|
||||||
Once Alice has secured agreement with n Ursulas to enact a Policy, she sends each a KFrag,
|
Once Alice has secured agreement with n Ursulas to enact a Policy, she sends each a KFrag,
|
||||||
and generates a TreasureMap for the Policy, recording which Ursulas got a KFrag.
|
and generates a TreasureMap for the Policy, recording which Ursulas got a KFrag.
|
||||||
"""
|
"""
|
||||||
_ursula = None
|
|
||||||
|
|
||||||
def __init__(self, alice, label, bob=None, kfrags=(constants.UNKNOWN_KFRAG,),
|
def __init__(self, alice, label, bob=None, kfrags=(constants.UNKNOWN_KFRAG,),
|
||||||
public_key=None, m=None, alices_signature=constants.NOT_SIGNED):
|
public_key=None, m=None, alices_signature=constants.NOT_SIGNED):
|
||||||
|
@ -148,18 +147,6 @@ class Policy(ABC):
|
||||||
def n(self):
|
def n(self):
|
||||||
return len(self.kfrags)
|
return len(self.kfrags)
|
||||||
|
|
||||||
@property
|
|
||||||
def ursula(self):
|
|
||||||
if not self._ursula:
|
|
||||||
raise Ursula.NotFound
|
|
||||||
else:
|
|
||||||
return self._ursula
|
|
||||||
|
|
||||||
@ursula.setter
|
|
||||||
def ursula(self, ursula_object):
|
|
||||||
self.alice.learn_about_actor(ursula_object)
|
|
||||||
self._ursula = ursula_object
|
|
||||||
|
|
||||||
def hrac(self):
|
def hrac(self):
|
||||||
"""
|
"""
|
||||||
The "hashed resource authentication code".
|
The "hashed resource authentication code".
|
||||||
|
@ -258,7 +245,7 @@ class Policy(ABC):
|
||||||
self.publish()
|
self.publish()
|
||||||
|
|
||||||
def consider_arrangement(self, network_middleware, arrangement):
|
def consider_arrangement(self, network_middleware, arrangement):
|
||||||
ursula, negotiation_response = network_middleware.consider_arrangement(ursula=self.ursula,
|
ursula, negotiation_response = network_middleware.consider_arrangement(ursula=arrangement.ursula,
|
||||||
arrangement=arrangement)
|
arrangement=arrangement)
|
||||||
|
|
||||||
# TODO: check out the response: need to assess the result and see if we're actually good to go.
|
# TODO: check out the response: need to assess the result and see if we're actually good to go.
|
||||||
|
@ -271,14 +258,18 @@ class Policy(ABC):
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def make_arrangements(self, network_middleware, quantity: int,
|
def make_arrangements(self, network_middleware, quantity: int,
|
||||||
deposit: int, expiration: maya.MayaDT) -> None:
|
deposit: int, expiration: maya.MayaDT, ursulas: List[Ursula]=None) -> None:
|
||||||
"""
|
"""
|
||||||
Create and consider n Arangement objects.
|
Create and consider n Arangement objects.
|
||||||
"""
|
"""
|
||||||
|
if not ursulas:
|
||||||
ursulas = NotImplemented
|
ursulas = NotImplemented
|
||||||
|
|
||||||
for ursula in ursulas:
|
for ursula in ursulas:
|
||||||
arrangement = Arrangement(alice=NotImplemented,
|
arrangement = Arrangement(alice=NotImplemented,
|
||||||
ursula=ursula, hrac=self.hrac, expiration=expiration)
|
ursula=ursula,
|
||||||
|
hrac=self.hrac,
|
||||||
|
expiration=expiration)
|
||||||
|
|
||||||
self.consider_arrangement(network_middleware=network_middleware,
|
self.consider_arrangement(network_middleware=network_middleware,
|
||||||
arrangement=arrangement)
|
arrangement=arrangement)
|
||||||
|
|
|
@ -65,7 +65,7 @@ class TestMiner:
|
||||||
|
|
||||||
# Publish Miner IDs to the DHT
|
# Publish Miner IDs to the DHT
|
||||||
some_data = os.urandom(32)
|
some_data = os.urandom(32)
|
||||||
_txhash = miner.publish_data(some_data)
|
_txhash = miner.publish_datastore(some_data)
|
||||||
|
|
||||||
# Fetch the miner Ids
|
# Fetch the miner Ids
|
||||||
stored_miner_ids = miner.fetch_data()
|
stored_miner_ids = miner.fetch_data()
|
||||||
|
@ -75,7 +75,7 @@ class TestMiner:
|
||||||
|
|
||||||
# Repeat, with another miner ID
|
# Repeat, with another miner ID
|
||||||
another_mock_miner_id = os.urandom(32)
|
another_mock_miner_id = os.urandom(32)
|
||||||
_txhash = miner.publish_data(another_mock_miner_id)
|
_txhash = miner.publish_datastore(another_mock_miner_id)
|
||||||
|
|
||||||
stored_miner_ids = miner.fetch_data()
|
stored_miner_ids = miner.fetch_data()
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@ def make_ursulas(ether_addresses: list, ursula_starting_port: int, miners=False)
|
||||||
_ursulas = []
|
_ursulas = []
|
||||||
for _counter, ether_address in enumerate(ether_addresses):
|
for _counter, ether_address in enumerate(ether_addresses):
|
||||||
port = ursula_starting_port + _counter
|
port = ursula_starting_port + _counter
|
||||||
ursula = Ursula(ether_address=ether_address, dht_port=port, db_name="test-{}".format(port),
|
ursula = Ursula(is_me=True, ether_address=ether_address, dht_port=port, db_name="test-{}".format(port),
|
||||||
ip_address="127.0.0.1", rest_port=port + 100)
|
ip_address="127.0.0.1", rest_port=port + 100)
|
||||||
|
|
||||||
class MockDatastoreThreadPool(object):
|
class MockDatastoreThreadPool(object):
|
||||||
|
|
Loading…
Reference in New Issue