Skip to content

Commit

Permalink
Merge pull request #96 from valory-xyz/feat/activation_round
Browse files Browse the repository at this point in the history
Feat/activation round
  • Loading branch information
DavidMinarsch authored Sep 1, 2022
2 parents 17ead57 + 35821af commit 5f1097c
Show file tree
Hide file tree
Showing 9 changed files with 139 additions and 168 deletions.
6 changes: 3 additions & 3 deletions packages/hashes.csv
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
gabrielfu/contracts/keep3r_job,bafybeihgz7flasaijeachrkmpgyqdqmeawknh2nfoie2page57ejy5l4ai
keep3r_co/agents/keep3r_bot,bafybeibrktz6j7amqtvpehqjqinxt2d666am7wmbydxykj4hqjqromsbtu
keep3r_co/skills/keep3r_abci,bafybeietb24lkcerqsg5qk4ewtnijtnog7lizqygpdqivyfe4jn4itmw3a
keep3r_co/skills/keep3r_job,bafybeie5dcpg27txzckid4npmkb6bznwlcv5ma4s2gvveugrmw7nyodynq
keep3r_co/agents/keep3r_bot,bafybeidnvpygt4h5unlsddlwgj4wyzoq5akzpitfowccae45mxzoxxpkwe
keep3r_co/skills/keep3r_abci,bafybeibupzwhflvsbwy2frvsvty2srexrhymbgjctskpur443yripiyzge
keep3r_co/skills/keep3r_job,bafybeibdnf6zzxyiyn5tbhlk6zev7gx4oxn72iu62bcgctmbetuhmwey4u
open_aea/connections/scaffold,bafybeifucsl5zfe4if4zfaddud77lzwgg7emv3mr3x3us57py7vbhktb24
open_aea/contracts/scaffold,bafybeiba4pdufnxve5hdkla42lixnxwfkyg7s2bvuy6zqbxjsxtaygehda
open_aea/protocols/scaffold,bafybeihhyjuqvp5zqtikkjrwtikg4fr4tsub43n777huxtpeu77g75poze
Expand Down
4 changes: 2 additions & 2 deletions packages/keep3r_co/agents/keep3r_bot/aea-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ protocols:
- valory/ledger_api:1.0.0:bafybeif2c3jt4tim3zbfq5c2lds7bs6qj5gvj2obk3pzdk3uy6zk2ivo3e
- valory/tendermint:0.1.0:bafybeihcnjhovvyyfbkuw5sjyfx2lfd4soeocfqzxz54g67333m6nk5gxq
skills:
- keep3r_co/keep3r_abci:0.1.0:bafybeietb24lkcerqsg5qk4ewtnijtnog7lizqygpdqivyfe4jn4itmw3a
- keep3r_co/keep3r_job:0.1.0:bafybeie5dcpg27txzckid4npmkb6bznwlcv5ma4s2gvveugrmw7nyodynq
- keep3r_co/keep3r_abci:0.1.0:bafybeibupzwhflvsbwy2frvsvty2srexrhymbgjctskpur443yripiyzge
- keep3r_co/keep3r_job:0.1.0:bafybeibdnf6zzxyiyn5tbhlk6zev7gx4oxn72iu62bcgctmbetuhmwey4u
- valory/abstract_abci:0.1.0:bafybeiam52ztcss46i3tgywuv4qmvddqgn7exmbt5kcicqpyip4kfeyap4
- valory/abstract_round_abci:0.1.0:bafybeiayewfb2ytovp7exhawqwbw63eerx4tw53ztey5r4ozbtcvsw3gua
- valory/registration_abci:0.1.0:bafybeibe2so7dcm2sivhum7gqik27c73a6v7gf3aligmbbucgh2zh2wvzu
Expand Down
2 changes: 1 addition & 1 deletion packages/keep3r_co/skills/keep3r_abci/skill.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ connections: []
contracts: []
protocols: []
skills:
- keep3r_co/keep3r_job:0.1.0:bafybeie5dcpg27txzckid4npmkb6bznwlcv5ma4s2gvveugrmw7nyodynq
- keep3r_co/keep3r_job:0.1.0:bafybeibdnf6zzxyiyn5tbhlk6zev7gx4oxn72iu62bcgctmbetuhmwey4u
- valory/abstract_round_abci:0.1.0:bafybeiayewfb2ytovp7exhawqwbw63eerx4tw53ztey5r4ozbtcvsw3gua
- valory/registration_abci:0.1.0:bafybeibe2so7dcm2sivhum7gqik27c73a6v7gf3aligmbbucgh2zh2wvzu
- valory/reset_pause_abci:0.1.0:bafybeiehyoay5bjg7zpc47bynycvs7gf7o7tcau77b5rwsgpg7shnrjnje
Expand Down
53 changes: 32 additions & 21 deletions packages/keep3r_co/skills/keep3r_job/behaviours.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@

from packages.keep3r_co.skills.keep3r_job.models import Params
from packages.keep3r_co.skills.keep3r_job.payloads import (
ActivationTxPayload,
BondingTxPayload,
GetJobsPayload,
IsProfitablePayload,
Expand Down Expand Up @@ -77,15 +78,6 @@ def keep3r_v1_contract_address(self) -> str:
"""Return Keep3r V1 Contract address."""
return self.context.params.keep3r_v1_contract_address

@property
def current_job_contract(self) -> Optional[str]:
"""Get current job contract address"""
if not self.context.params.job_contract_addresses:
return None
addresses = self.context.params.job_contract_addresses
job_ix = self.synchronized_data.period_count % len(addresses)
return self.context.params.job_contract_addresses[job_ix]

def read_keep3r_v1(self, method: str, **kwargs: Any) -> Generator[None, None, Any]:
"""Read Keep3r V1 contract state"""

Expand Down Expand Up @@ -256,6 +248,25 @@ class ActivationBehaviour(Keep3rJobBaseBehaviour):
def async_act(self) -> Generator:
"""Do the act, supporting asynchronous execution."""

with self.context.benchmark_tool.measure(self.behaviour_id).local():
contract_api_response = yield from self.get_contract_api_response(
performative=ContractApiMessage.Performative.GET_STATE,
contract_address=self.keep3r_v1_contract_address,
contract_id=str(Keep3rV1Contract.contract_id),
contract_callable="build_activation_tx",
)
activation_tx = cast(str, contract_api_response.state.body.get("data"))
payload = ActivationTxPayload(
self.context.agent_address, activation_tx=activation_tx
)
self.context.logger.info(f"Activation raw tx: {activation_tx}")

with self.context.benchmark_tool.measure(self.behaviour_id).consensus():
yield from self.send_a2a_transaction(payload)
yield from self.wait_until_round_end()

self.set_done()


class GetJobsBehaviour(Keep3rJobBaseBehaviour):
"""GetJobsBehaviour"""
Expand Down Expand Up @@ -297,9 +308,15 @@ def async_act(self) -> Generator:
job selection payload is shared between participants.
"""
with self.context.benchmark_tool.measure(self.behaviour_id).local():
job_contract = self.current_job_contract
payload = JobSelectionPayload(self.context.agent_address, job_contract)
self.context.logger.info(f"Job contract selected : {job_contract}")
if not self.synchronized_data.job_list:
current_job = None
else:
addresses = self.synchronized_data.job_list
period_count = self.synchronized_data.period_count
job_ix = period_count % len(addresses)
current_job = addresses[job_ix]
payload = JobSelectionPayload(self.context.agent_address, current_job)
self.context.logger.info(f"Job contract selected: {current_job}")

with self.context.benchmark_tool.measure(self.behaviour_id).consensus():
yield from self.send_a2a_transaction(payload)
Expand All @@ -321,18 +338,12 @@ def async_act(self) -> Generator:
is workable payload is shared between participants.
"""
with self.context.benchmark_tool.measure(self.behaviour_id).local():
self.context.logger.info(
f"Interacting with Job contract at {self.current_job_contract}"
)
is_workable = yield from self._get_workable()
if is_workable is None:
is_workable = False
payload = IsWorkablePayload(self.context.agent_address, is_workable)

with self.context.benchmark_tool.measure(self.behaviour_id).consensus():
self.context.logger.info(
f"Job contract is workable {self.current_job_contract}: {is_workable}"
)
yield from self.send_a2a_transaction(payload)
yield from self.wait_until_round_end()

Expand All @@ -342,7 +353,7 @@ def _get_workable(self) -> Generator:
"""Get workable jobs from contract"""
contract_api_response = yield from self.get_contract_api_response(
performative=ContractApiMessage.Performative.GET_STATE, # type: ignore
contract_address=self.current_job_contract,
contract_address=self.synchronized_data.current_job,
contract_id=str(Keep3rTestJobContract.contract_id),
contract_callable="get_workable",
)
Expand Down Expand Up @@ -388,7 +399,7 @@ def rewardMultiplier(self) -> Generator:

contract_api_response = yield from self.get_contract_api_response(
performative=ContractApiMessage.Performative.GET_STATE,
contract_address=self.current_job_contract,
contract_address=self.synchronized_data.current_job,
contract_id=str(Keep3rTestJobContract.contract_id),
contract_callable="rewardMultiplier",
)
Expand Down Expand Up @@ -438,7 +449,7 @@ def _get_raw_work_transaction_hash(self) -> Generator[None, None, Optional[str]]
performative=ContractApiMessage.Performative.GET_RAW_TRANSACTION, # type: ignore
contract_id=str(Keep3rTestJobContract.contract_id),
contract_callable="work",
contract_address=self.current_job_contract,
contract_address=self.synchronized_data.current_job,
sender_address=self.context.agent_address,
)

Expand Down
14 changes: 7 additions & 7 deletions packages/keep3r_co/skills/keep3r_job/payloads.py
Original file line number Diff line number Diff line change
Expand Up @@ -196,23 +196,23 @@ def job_list(self) -> str:
class JobSelectionPayload(BaseKeep3rJobPayload):
"""Represent a transaction payload of type 'job_selection'."""

_data_keys: Tuple[str] = ("job_selection",)
_data_keys: Tuple[str] = ("current_job",)
transaction_type = TransactionType.JOB_SELECTION

def __init__(self, sender: str, job_selection: Any, **kwargs: Any) -> None:
def __init__(self, sender: str, current_job: Optional[str], **kwargs: Any) -> None:
"""Initialize an 'job_selection' payload.
:param sender: the sender (Ethereum) address
:param job_selection: Selected job address
:param current_job: selected job address
:param kwargs: the keyword arguments
"""
super().__init__(sender, **kwargs)
self._job_selection = job_selection
self._current_job = current_job

@property
def job_selection(self) -> Optional[Any]:
"""Get the job selection."""
return self._job_selection
def current_job(self) -> Optional[str]:
"""Get the current job selection."""
return self._current_job


class IsWorkablePayload(BaseKeep3rJobPayload):
Expand Down
44 changes: 24 additions & 20 deletions packages/keep3r_co/skills/keep3r_job/rounds.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,9 +87,14 @@ def most_voted_tx_hash(self) -> str:
return cast(str, self.db.get_strict("most_voted_tx_hash"))

@property
def job_selection(self) -> str:
"""Get the job_selection."""
return cast(str, self.db.get_strict("job_selection"))
def job_list(self) -> str:
"""Get the job_list."""
return cast(str, self.db.get_strict("job_list"))

@property
def current_job(self) -> Optional[str]:
"""Get the current_job."""
return cast(str, self.db.get_strict("current_job"))


class Keep3rJobAbstractRound(CollectSameUntilThresholdRound, ABC):
Expand Down Expand Up @@ -175,20 +180,21 @@ class ActivationRound(Keep3rJobAbstractRound):

round_id: str = "activation"
allowed_tx_type: TransactionType = ActivationTxPayload.transaction_type
payload_attribute: str
payload_attribute: str = "activation_tx"

def end_block(self) -> Optional[Tuple[BaseSynchronizedData, Event]]:
"""Process the end of the block."""
_ = (Event.ACTIVATION_TX, Event.AWAITING_BONDING, Event.NO_MAJORITY)
raise NotImplementedError
_ = Event.AWAITING_BONDING

def check_payload(self, payload: BaseTxPayload) -> None:
"""Check payload."""
raise NotImplementedError

def process_payload(self, payload: BaseTxPayload) -> None:
"""Process payload."""
raise NotImplementedError
if self.threshold_reached:
activation_tx = self.most_voted_payload
state = self.synchronized_data.update(activation_tx=activation_tx)
return state, Event.ACTIVATION_TX
if not self.is_majority_possible(
self.collection, self.synchronized_data.nb_participants
):
return self.synchronized_data, Event.NO_MAJORITY
return None


class GetJobsRound(Keep3rJobAbstractRound):
Expand Down Expand Up @@ -217,17 +223,15 @@ class JobSelectionRound(Keep3rJobAbstractRound):

round_id = "job_selection"
allowed_tx_type: TransactionType = JobSelectionPayload.transaction_type
payload_attribute = "job_selection"
payload_attribute = "current_job"

def end_block(self) -> Optional[Tuple[BaseSynchronizedData, Event]]:
"""Process the end of the block."""

if self.threshold_reached:
_ = (Event.DONE, Event.NO_JOBS, Event.NO_MAJORITY)
job_selection = self.most_voted_payload
state = self.synchronized_data.update(job_selection=job_selection)
if job_selection:
return state, Event.DONE
return state, Event.NO_JOBS # NO_JOBS ?
current_job = self.most_voted_payload
state = self.synchronized_data.update(current_job=current_job)
return state, Event.DONE if current_job else Event.NO_JOBS
if not self.is_majority_possible(
self.collection, self.synchronized_data.nb_participants
):
Expand Down
6 changes: 3 additions & 3 deletions packages/keep3r_co/skills/keep3r_job/skill.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ aea_version: '>=1.0.0, <2.0.0'
fingerprint:
README.md: bafybeidq32yfua6bopvzlo7xwpfdiz4bwr7txkv4vo4vxmjmvdthkr2cwe
__init__.py: bafybeiewrlbkuksvnjfs5aubeg3ubwyxcqm3qytv2svbvk2lq7k36zlj2y
behaviours.py: bafybeiezoi7a4bg5zbkeequ43t35tpompmecjqw5x6hciycew2m4ydzy3y
behaviours.py: bafybeib4xltuvxwau3gzqqv7bq7ecvfy6bhukfgip2vednq4zai5oyexmm
dialogues.py: bafybeib4jbdycm2vofni3vp6draqet3nejoviqjurcilrzindr4k5dg5fa
fsm_specification.yaml: bafybeifjaklbcefmwqkr45ar7ak3fkhodb73ulddamwot7lymqbrc55j4q
handlers.py: bafybeie6ntjlqfb5glkciuo56pisvgobi2tuqhcjlzm7h5uvhgi2ipxrzq
models.py: bafybeifxjxhec2vsi7oitjxqdzsgou5w4bg7addhzu7zttjokgncqkiayu
payloads.py: bafybeifgyhcppjkndwqfrzso54c7kmkjwtmdmfsz7vsasoxojwwhlfy4wq
rounds.py: bafybeifi5u7h7t6nmdxhy3sw4ct6zcbaxl2h4sc6jey4ragcqxk56xpv4a
payloads.py: bafybeicpmqifm4fnccqhaeprjnj3azxj5b5shtnf7ybomfrysnuh4n6yoe
rounds.py: bafybeid6xlpmztcksf7tdyk3wkfvskwzi6uapnjkw24znbkhb7zt6qblce
fingerprint_ignore_patterns: []
connections: []
contracts:
Expand Down
Loading

0 comments on commit 5f1097c

Please sign in to comment.