async def get_block_info(org_name: str,
                         user_name: str,
                         user_password: str,
                         channel_name: str = constants.channel_name) -> str:
    """
    Fetches the blockchain state of the given channel
    Args:
        org_name: Name of the submitting user's organization
        user_name: Username of the submitter
        user_password: Password of the submitting user
        channel_name: Name of the channel on which to connect client
    Returns:
        String of blockchain info
    """
    # Setup a HF network client
    hf_client = Client(net_profile=constants.config_path)

    # Connect to the given channel
    hf_client.new_channel(channel_name)

    # Gather information about the network
    network_info = hf_client.get_net_info()

    # For queries, we only need a single peer
    # Here we will randomly select one from our org
    peers = network_info['organizations'][org_name]['peers']
    random_peer = random.choice(peers)

    user = enroll_user(hf_client, org_name, user_name, user_password)

    response = await hf_client.query_info(requestor=user,
                                          channel_name=channel_name,
                                          peers=[random_peer])
    return str(response)
async def get_channels(org_name: str, user_name: str,
                       user_password: str) -> List[str]:
    """
    Fetches the IDs of all the channels on the network
    Args:
        org_name: Name of the submitting user's organization
        user_name: Username of the submitter
        user_password: Password of the submitting user
    Returns:
        List of channel IDs
    """
    # Setup a HF network client
    hf_client = Client(net_profile=constants.config_path)

    # Gather information about the network
    network_info = hf_client.get_net_info()

    # For queries, we only need a single peer
    # Here we will randomly select one from our org
    peers = network_info['organizations'][org_name]['peers']
    random_peer = random.choice(peers)

    user = enroll_user(hf_client, org_name, user_name, user_password)

    response = await hf_client.query_channels(requestor=user,
                                              peers=[random_peer])
    return [x.channel_id for x in response.channels]
async def invoke(org_name: str, user_name: str, user_password: str,
                 channel_name: str, function: str, args: List[str]) -> str:
    """
    Submits a blockchain transaction invocation to all the peers in
    the network.

    Args:
        org_name: Name of the submitting user's organization
        user_name: Username of the submitter
        user_password: Password of the submitting user
        channel_name: Name of the channel on which to connect client
        function: Name of the chaincode function to invoke
        args: A list of string arguments passed to the chaincode
    Returns:
        Response string from the *first* peer that responded with
        confirmation of the execution.
    """

    # Setup a HF network client
    hf_client = Client(net_profile=constants.config_path)

    # Connect to the given channel
    hf_client.new_channel(channel_name)

    # Gather information about the network
    network_info = hf_client.get_net_info()

    # Invocations require read/write sets from as many peers
    # as specified in the endorsement policy. Here we will
    # go ahead and request endorsement from ALL peers.
    # If your policy requires only a subset, you may wish to
    # alter this section
    peers = []
    for org in network_info['organizations'].keys():
        if 'peers' in network_info['organizations'][org]:
            for peer in network_info['organizations'][org]['peers']:
                peers.append(peer)

    # Enroll the user that will be invoking the query
    user = enroll_user(hf_client, org_name, user_name, user_password)

    # Submit the query to the peers and await a response
    response = await hf_client.chaincode_invoke(
        requestor=user,
        channel_name=channel_name,
        peers=peers,
        fcn=function,
        args=args,
        cc_name=constants.chaincode_name,
        transient_map=None,  # optional, for private data
        wait_for_event=
        True,  # for being sure chaincode invocation has been commited in the ledger, default is on tx event
    )

    if not response:
        raise ValueError(
            f'Failure to invoke chaincode function {function} with response: {response}'
        )
    return response
def get_network_info() -> Dict:
    '''
    Returns the dictionary containing the network information
    Returns:
        Dictionary of network configuration information
    '''
    hf_client = Client(net_profile=constants.config_path)
    return hf_client.get_net_info()
async def query(org_name: str, user_name: str, user_password: str,
                channel_name: str, function: str, args: List[str]) -> str:
    """
    Submits a ledger query to a single peer within the specified org.
    Note that queries will NOT submit any changes to the ledger state,
    even if an invocation query function is invoked.
    Args:
        org_name: Name of the submitting user's organization
        user_name: Username of the submitter
        user_password: Password of the submitting user
        channel_name: Name of the channel on which to connect client
        function: Name of the chaincode function to invoke
        args: A list of string arguments passed to the chaincode
    Returns:
        Response string from the given peer
    """
    # Setup a HF network client
    hf_client = Client(net_profile=constants.config_path)

    # Connect to the given channel
    hf_client.new_channel(channel_name)

    # Gather information about the network
    network_info = hf_client.get_net_info()

    # For queries, we only need a single peer
    # Here we will randomly select one from our org
    peers = network_info['organizations'][org_name]['peers']
    random_peer = random.choice(peers)

    # Enroll the user that will be invoking the query
    user = enroll_user(hf_client, org_name, user_name, user_password)

    # Submit the query to the selected peer and await a response
    response = await hf_client.chaincode_query(
        requestor=user,
        channel_name=channel_name,
        fcn=function,
        peers=[random_peer],
        args=args,
        cc_name=constants.chaincode_name)
    if not response:
        raise ValueError(
            f'Failure to query chaincode function {function} with response: {response}'
        )
    return response
async def get_instantiated_chaincodes(
        org_name: str,
        user_name: str,
        user_password: str,
        channel_name: str = constants.channel_name) -> List[Dict[str, str]]:
    """
    Fetches the blockchain state of the given channel
    Args:
        org_name: Name of the submitting user's organization
        user_name: Username of the submitter
        user_password: Password of the submitting user
        channel_name: Name of the channel on which to connect client
    Returns:
        List of instantiated chaincodes, each of which contains:
            'Name': Chaincode name,
            'Version': Chaincode version,
            'Path': GOPATH relative chaincode location
    """
    # Setup a HF network client
    hf_client = Client(net_profile=constants.config_path)

    # Connect to the given channel
    hf_client.new_channel(channel_name)

    # Gather information about the network
    network_info = hf_client.get_net_info()

    # For queries, we only need a single peer
    # Here we will randomly select one from our org
    peers = network_info['organizations'][org_name]['peers']
    random_peer = random.choice(peers)

    user = enroll_user(hf_client, org_name, user_name, user_password)

    response = await hf_client.query_instantiated_chaincodes(
        requestor=user, channel_name=channel_name, peers=[random_peer])
    chaincodes = []
    for chaincode in response[0].chaincodes:
        code = {
            'Name': chaincode.name,
            'Version': chaincode.version,
            'Path': chaincode.path
        }
        chaincodes.append(code)

    return chaincodes
async def register_user(org_name: str,
                        request: constants.RegisterUserRequest) -> str:
    """
    Registers a user to the Org's Fabric CA Server
    Args:
        org_name: Organization's name
        request: RegisterUserRequest object containing
            registration information
    Returns:
        Pre-generated user secret
    """
    # Create/Open a wallet on a temp path including the org name
    # Org name must be included, otherwise usernames must be unique
    # over all orgs
    wallet_path = os.path.join(os.getcwd(), 'tmp', 'hfc-kvs', org_name)
    cred_wallet = wallet.FileSystenWallet(path=wallet_path)  # [sic]

    # Setup a HF network client
    hf_client = Client(net_profile=constants.config_path)
    hf_client.new_channel(constants.channel_name)

    # Extract CA info
    network_info = hf_client.get_net_info()
    org_info = network_info['organizations'][org_name]
    ca_name = org_info['certificateAuthorities'][0]
    ca_info = network_info['certificateAuthorities'][ca_name]

    # if user already exists, pull ID from storage
    if cred_wallet.exists(request.user_name):
        return None
    casvc = ca_service(target=ca_info['url'])
    admin_enrollment = casvc.enroll(request.admin_user_name,
                                    request.admin_password)

    secret = admin_enrollment.register(enrollmentID=request.user_name,
                                       enrollmentSecret=request.user_password,
                                       role=request.role,
                                       affiliation=request.affiliation,
                                       attrs=[dict(x) for x in request.attrs])

    return secret
Example #8
0
class FabricEvents:
    def __init__(self):
        self._async_loop = asyncio.get_event_loop()
        self._configtx_dir = None
        self._chaincode_dir = None
        self._config_sdk = None
        self._cli = None
        self._topo = None

    def config(self, topology, configsdk, chaincode, configtx):
        self._topo = topology
        self._configtx_dir = configtx
        self._chaincode_dir = chaincode
        self._config_sdk = configsdk
        if all([topology, configsdk, chaincode, configtx]):
            logger.info("FabricEvents configs OK")
            logger.info("configsdk %s, chaincode %s, configtx %s", configsdk,
                        chaincode, configtx)

            self.config_gopath()
            self.build_cli()
            return True
        else:
            logger.info("FabricEvents configs FAILED")
            return False

    def config_gopath(self):
        gopath = os.path.normpath(os.path.join(self._chaincode_dir))
        os.environ['GOPATH'] = os.path.abspath(gopath)

    def build_cli(self):
        pathlist = [
            os.environ["HOME"] + "/hl/bin",
        ]  # TODO set dynamic config path for configtxgen bin
        os.environ["PATH"] += os.pathsep + os.pathsep.join(pathlist)

        self._cli = Client(net_profile=self._config_sdk)
        logger.debug("FABRIC_CONFIG: Fabric Orgs %s",
                     self._cli.organizations.keys())
        logger.debug("FABRIC_CONFIG: Fabric Peers %s", self._cli.peers.keys())
        logger.debug("FABRIC_CONFIG: Fabric Orderers %s",
                     self._cli.orderers.keys())
        logger.debug("FABRIC_CONFIG: Fabric CAs %s", self._cli.CAs.keys())
        logger.info("Fabric Client SDK CLI Started")

    def schedule(self, events):
        for _id, event in events.items():
            event_category = event.get("category")

            if event_category == "fabric":
                when = event.get("when")
                logger.info("Calling at %s event %s", when,
                            event.get("params").get("action"))
                self.call_at(when, event.get("params"))

    def sched_time(self, when):
        if type(when) is float:
            if when >= time.time():
                rel_when = when - time.time()
            else:
                rel_when = 0
        elif type(when) is str:
            if when == "now":
                rel_when = 0
            else:
                rel_when = float(when)
        else:
            rel_when = 0
        return rel_when

    def call_at(self, when, event):
        rel_when = self.sched_time(when)
        self._async_loop.call_later(max(0, rel_when), self.call, event)

    def run_task(self, task):
        try:
            self._async_loop.create_task(task)
        except asyncio.CancelledError:
            pass
        except Exception:
            logger.error("Exception in Fabric Event Task", exc_info=True)

    def call(self, event):
        task = None
        action = event.get("action")

        if action == "info_network":
            task = self.event_info_network(event)
        if action == "create_channel":
            task = self.event_create_channel(event)
        if action == "join_channel":
            task = self.event_join_channel(event)
        if action == "info_channels":
            task = self.event_info_channels(event)
        if action == "info_channel":
            task = self.event_info_channel(event)
        if action == "info_channel_config":
            task = self.event_info_channel_config(event)
        if action == "info_channel_chaincodes":
            task = self.event_info_channel_chaincodes(event)
        if action == "chaincode_install":
            task = self.event_chaincode_install(event)
        if action == "chaincode_instantiate":
            task = self.event_chaincode_instantiate(event)
        if action == "chaincode_invoke":
            task = self.event_chaincode_invoke(event)
        if action == "chaincode_query":
            task = self.event_chaincode_query(event)

        if task:
            self.run_task(task)
        else:
            logger.info("Unkown task for event %s", event)

    async def event_create_channel(self, ev):
        org_name = ev.get("org")
        user_name = ev.get("user")
        orderer_name = ev.get("orderer")
        channel = ev.get("channel")
        profile = ev.get("profile")

        orderer = self._topo.get("orderers").get(orderer_name)
        orderer_fqdn = orderer.get("orderer_fqdn")

        org = self._topo.get("orgs").get(org_name)
        org_fqdn = org.get("org_fqdn")

        if org_fqdn and orderer_fqdn:
            org_user = self._cli.get_user(org_name=org_fqdn, name=user_name)

            response = await self._cli.channel_create(
                orderer=orderer_fqdn,
                channel_name=channel,
                requestor=org_user,
                config_yaml=self._configtx_dir,
                channel_profile=profile)
            logger.info("FABRIC_EV:create_channel: Create channel response %s",
                        response)
            return response

        logger.info("unknown orderer %s and org %s", orderer_name, org_name)
        return None

    async def event_join_channel(self, ev):
        org_name = ev.get("org")
        user_name = ev.get("user")
        orderer_name = ev.get("orderer")
        channel = ev.get("channel")
        peers_names = ev.get("peers")

        orderer = self._topo.get("orderers").get(orderer_name)
        orderer_fqdn = orderer.get("orderer_fqdn")

        org = self._topo.get("orgs").get(org_name)
        org_fqdn = org.get("org_fqdn")

        if org_fqdn and orderer_fqdn:
            org_user = self._cli.get_user(org_name=org_fqdn, name=user_name)

            peers = org.get("peers")
            peers_fqdn = [
                peer.get("peer_fqdn") for peer in peers.values()
                if peer.get("name") in peers_names
            ]

            response = await self._cli.channel_join(requestor=org_user,
                                                    channel_name=channel,
                                                    peers=peers_fqdn,
                                                    orderer=orderer_fqdn)
            logger.info("FABRIC_EV:join_channel: Join channel response %s",
                        response)
            return response

        logger.info("unknown orderer %s and org %s", orderer_name, org_name)
        return None

    async def event_info_channel(self, ev):
        org_name = ev.get("org")
        user_name = ev.get("user")
        channel = ev.get("channel")
        peers_names = ev.get("peers")

        org = self._topo.get("orgs").get(org_name)
        org_fqdn = org.get("org_fqdn")

        peers = org.get("peers")
        peers_fqdn = [
            peer.get("peer_fqdn") for peer in peers.values()
            if peer.get("name") in peers_names
        ]

        if org_fqdn and peers_fqdn:
            org_user = self._cli.get_user(org_name=org_fqdn, name=user_name)

            response = await self._cli.query_info(requestor=org_user,
                                                  channel_name=channel,
                                                  peers=peers_fqdn,
                                                  decode=True)
            logger.info("FABRIC_EV:info_channel: Info channel response %s",
                        response)
            return response

        logger.info("unknown org %s and/org peers %s", org_name, peers_names)
        return None

    async def event_info_channels(self, ev):
        org_name = ev.get("org")
        user_name = ev.get("user")
        peers_names = ev.get("peers")

        org = self._topo.get("orgs").get(org_name)
        org_fqdn = org.get("org_fqdn")

        peers = org.get("peers")
        peers_fqdn = [
            peer.get("peer_fqdn") for peer in peers.values()
            if peer.get("name") in peers_names
        ]

        if org_fqdn and peers_fqdn:
            org_user = self._cli.get_user(org_name=org_fqdn, name=user_name)

            response = await self._cli.query_channels(requestor=org_user,
                                                      peers=peers_fqdn,
                                                      decode=True)
            logger.info("FABRIC_EV:info_channels: Info channels response %s",
                        response)
            return response

        logger.info("unknown org %s and/org peers %s", org_name, peers_names)
        return None

    async def event_info_channel_config(self, ev):
        org_name = ev.get("org")
        user_name = ev.get("user")
        channel = ev.get("channel")
        peers_names = ev.get("peers")

        org = self._topo.get("orgs").get(org_name)
        org_fqdn = org.get("org_fqdn")

        peers = org.get("peers")
        peers_fqdn = [
            peer.get("peer_fqdn") for peer in peers.values()
            if peer.get("name") in peers_names
        ]

        if org_fqdn and peers_fqdn:
            org_user = self._cli.get_user(org_name=org_fqdn, name=user_name)

            response = await self._cli.get_channel_config(requestor=org_user,
                                                          channel_name=channel,
                                                          peers=peers_fqdn,
                                                          decode=True)
            logger.info(
                "FABRIC_EV:info_channel_config: Info channel config response %s",
                response)
            return response

        logger.info("unknown org %s and/org peers %s", org_name, peers_names)
        return None

    async def event_info_channel_chaincodes(self, ev):
        org_name = ev.get("org")
        user_name = ev.get("user")
        peers_names = ev.get("peers")

        org = self._topo.get("orgs").get(org_name)
        org_fqdn = org.get("org_fqdn")

        peers = org.get("peers")
        peers_fqdn = [
            peer.get("peer_fqdn") for peer in peers.values()
            if peer.get("name") in peers_names
        ]

        if org_fqdn and peers_fqdn:
            org_user = self._cli.get_user(org_name=org_fqdn, name=user_name)

            response = await self._cli.query_installed_chaincodes(
                requestor=org_user, peers=peers_fqdn, decode=True)
            logger.info(
                "FABRIC_EV:info_channel_chaincodes: Info channel chaincodes response %s",
                response)
            return response

        logger.info("unknown org %s and/org peers %s", org_name, peers_names)
        return None

    async def event_info_network(self, ev):
        orderer_name = ev.get("orderer")
        orderer = self._topo.get("orderers").get(orderer_name)
        orderer_fqdn = orderer.get("orderer_fqdn")

        if orderer_fqdn:
            response = self._cli.get_net_info('organizations', orderer_fqdn,
                                              'mspid')
            logger.info("FABRIC_EV:info_network: Info network response %s",
                        response)
            return response

        logger.info("unknown orderer %s", orderer_name)
        return None

    async def event_chaincode_install(self, ev):
        org_name = ev.get("org")
        user_name = ev.get("user")
        peers_names = ev.get("peers")
        chaincode_name = ev.get("chaincode_name")
        chaincode_path = ev.get("chaincode_path")
        chaincode_version = ev.get("chaincode_version")

        org = self._topo.get("orgs").get(org_name)
        org_fqdn = org.get("org_fqdn")

        peers = org.get("peers")
        peers_fqdn = [
            peer.get("peer_fqdn") for peer in peers.values()
            if peer.get("name") in peers_names
        ]

        if org_fqdn and peers_fqdn:
            org_user = self._cli.get_user(org_name=org_fqdn, name=user_name)

            response = await self._cli.chaincode_install(
                requestor=org_user,
                peers=peers_fqdn,
                cc_path=chaincode_path,
                cc_name=chaincode_name,
                cc_version=chaincode_version)
            logger.info(
                "FABRIC_EV:chaincode_install: Chaincode install response %s",
                response)
            return response

        logger.info("unknown org %s and/or peers %s", org_name, peers_names)
        return None

    async def event_chaincode_instantiate(self, ev):
        org_name = ev.get("org")
        user_name = ev.get("user")
        peers_names = ev.get("peers")
        channel = ev.get("channel")
        chaincode_args = ev.get("chaincode_args")
        chaincode_name = ev.get("chaincode_name")
        chaincode_version = ev.get("chaincode_version")

        org = self._topo.get("orgs").get(org_name)
        org_fqdn = org.get("org_fqdn")

        peers = org.get("peers")
        peers_fqdn = [
            peer.get("peer_fqdn") for peer in peers.values()
            if peer.get("name") in peers_names
        ]

        if org_fqdn and peers_fqdn:
            org_user = self._cli.get_user(org_name=org_fqdn, name=user_name)

            response = await self._cli.chaincode_instantiate(
                requestor=org_user,
                channel_name=channel,
                peers=peers_fqdn,
                args=chaincode_args,
                cc_name=chaincode_name,
                cc_version=chaincode_version)
            logger.info(
                "FABRIC_EV:chaincode_instantiate: Chaincode instantiate response %s",
                response)
            return response

        logger.info("unknown org %s and/or peers %s", org_name, peers_names)
        return None

    async def event_chaincode_invoke(self, ev):
        org_name = ev.get("org")
        user_name = ev.get("user")
        peers_names = ev.get("peers")
        channel = ev.get("channel")
        chaincode_args = ev.get("chaincode_args")
        chaincode_name = ev.get("chaincode_name")

        org = self._topo.get("orgs").get(org_name)
        org_fqdn = org.get("org_fqdn")

        peers = org.get("peers")
        peers_fqdn = [
            peer.get("peer_fqdn") for peer in peers.values()
            if peer.get("name") in peers_names
        ]

        if org_fqdn and peers_fqdn:
            org_user = self._cli.get_user(org_name=org_fqdn, name=user_name)

            response = await self._cli.chaincode_invoke(requestor=org_user,
                                                        channel_name=channel,
                                                        peers=peers_fqdn,
                                                        args=chaincode_args,
                                                        cc_name=chaincode_name)
            logger.info(
                "FABRIC_EV:chaincode_invoke: Chaincode invoke response %s",
                response)
            return response

        logger.info("unknown org %s and/or peers %s", org_name, peers_names)
        return None

    async def event_chaincode_query(self, ev):
        org_name = ev.get("org")
        user_name = ev.get("user")
        peers_names = ev.get("peers")
        channel = ev.get("channel")
        chaincode_args = ev.get("chaincode_args")
        chaincode_name = ev.get("chaincode_name")

        org = self._topo.get("orgs").get(org_name)
        org_fqdn = org.get("org_fqdn")

        peers = org.get("peers")
        peers_fqdn = [
            peer.get("peer_fqdn") for peer in peers.values()
            if peer.get("name") in peers_names
        ]

        if org_fqdn and peers_fqdn:
            org_user = self._cli.get_user(org_name=org_fqdn, name=user_name)

            response = await self._cli.chaincode_query(requestor=org_user,
                                                       channel_name=channel,
                                                       peers=peers_fqdn,
                                                       args=chaincode_args,
                                                       cc_name=chaincode_name)
            logger.info(
                "FABRIC_EV:chaincode_query: Chaincode query response %s",
                response)
            return response

        logger.info("unknown org %s and/or peers %s", org_name, peers_names)
        return None
Example #9
0
from hfc.fabric import Client
import middleware.constants as constants
import middleware.operations as operations
from middleware.access_utils import enroll_user

org_name = 'appdevorg.beatchain.com'
admin_user_name = 'admin'
admin_password = '******'
function = 'ListBankAccounts'
admin_fee_frac = 0.5

hf_client = Client(net_profile=constants.config_path)

hf_client.new_channel(constants.channel_name)

network_info = hf_client.get_net_info()

peers = network_info['organizations'][org_name]['peers']
random_peer = random.choice(peers)

user = enroll_user(hf_client, org_name, user_name, user_password)
user = hf_client.get_user(org_name=org_name, name='Admin')

loop = asyncio.get_event_loop()

response = loop.run_until_complete(
    operations.invoke('appdevorg.beatchain.com',
                      admin_user_name,
                      admin_password,
                      constants.channel_name,
                      function='AddAppDevRecord',
Example #10
0
class FabricEvents:
    def __init__(self):
        self._configtx_dir = None
        self._chaincode_dir = None
        self._config_sdk = None
        self._cli = None
        self._settings = None

    def config(self, settings, configsdk, chaincode, configtx):
        self._settings = settings
        self._configtx_dir = configtx
        self._chaincode_dir = chaincode
        self._config_sdk = configsdk
        if all([settings, configsdk, chaincode, configtx]):
            logger.info("FabricEvents configs OK")
            logger.info(
                "configsdk %s, chaincode %s, configtx %s",
                configsdk,
                chaincode,
                configtx,
            )

            self.config_gopath()
            self.build_cli()
            return True
        else:
            logger.info("FabricEvents configs FAILED")
            return False

    def config_gopath(self):
        gopath = os.path.normpath(os.path.join(self._chaincode_dir))
        os.environ["GOPATH"] = os.path.abspath(gopath)

    def build_cli(self):
        pathlist = [
            "$HOME/hl/bin",
        ]  # TODO set dynamic config path for configtxgen bin
        os.environ["PATH"] += os.pathsep + os.pathsep.join(pathlist)

        self._cli = Client(net_profile=self._config_sdk)
        logger.debug("Fabric Orgs %s", self._cli.organizations)
        logger.debug("Fabric Peers %s", self._cli.peers)
        logger.debug("Fabric Orderers %s", self._cli.orderers)
        logger.debug("Fabric CAs %s", self._cli.CAs)
        logger.info("Fabric Client SDK CLI Started")

    def schedule(self, events):
        evs_sched = {}

        for event in events:
            ev_id = event.get("id")
            ev_data = event.get("event")
            action_call = self.create_call(ev_data)
            if action_call:
                evs_sched[ev_id] = (action_call, event.get("schedule"))
            else:
                logger.info(
                    f"Could not schedule fabric event task call for event {event}"
                )

        return evs_sched

    def create_call(self, event):
        task = None
        action = event.get("action")

        if action == "info_network":
            task = self.event_info_network(event)
        if action == "create_channel":
            task = self.event_create_channel(event)
        if action == "join_channel":
            task = self.event_join_channel(event)
        if action == "info_channels":
            task = self.event_info_channels(event)
        if action == "info_channel":
            task = self.event_info_channel(event)
        if action == "info_channel_config":
            task = self.event_info_channel_config(event)
        if action == "info_channel_chaincodes":
            task = self.event_info_channel_chaincodes(event)
        if action == "chaincode_install":
            task = self.event_chaincode_install(event)
        if action == "chaincode_instantiate":
            task = self.event_chaincode_instantiate(event)
        if action == "chaincode_invoke":
            task = self.event_chaincode_invoke(event)
        if action == "chaincode_query":
            task = self.event_chaincode_query(event)

        if task:
            return task
        else:
            logger.info("Unkown task for event %s", event)
            return None

    async def event_create_channel(self, ev):
        org_name = ev.get("org")
        user_name = ev.get("user")
        orderer_name = ev.get("orderer")
        channel = ev.get("channel")
        profile = ev.get("profile")

        orderer = self._settings.get("orderers").get(orderer_name)
        orderer_fqdn = orderer.get("orderer_fqdn")

        org = self._settings.get("orgs").get(org_name)
        org_fqdn = org.get("org_fqdn")

        if org_fqdn and orderer_fqdn:
            org_user = self._cli.get_user(org_name=org_fqdn, name=user_name)

            response = await self._cli.channel_create(
                orderer=orderer_fqdn,
                channel_name=channel,
                requestor=org_user,
                config_yaml=self._configtx_dir,
                channel_profile=profile,
            )
            logger.info("FABRIC_EV:create_channel: Create channel response %s",
                        response)
            return response

        logger.info("unknown orderer %s and org %s", orderer_name, org_name)
        return None

    async def event_join_channel(self, ev):
        org_name = ev.get("org")
        user_name = ev.get("user")
        orderer_name = ev.get("orderer")
        channel = ev.get("channel")
        peers_names = ev.get("peers")

        orderer = self._settings.get("orderers").get(orderer_name)
        orderer_fqdn = orderer.get("orderer_fqdn")

        org = self._settings.get("orgs").get(org_name)
        org_fqdn = org.get("org_fqdn")

        if org_fqdn and orderer_fqdn:
            org_user = self._cli.get_user(org_name=org_fqdn, name=user_name)

            peers = org.get("peers")
            peers_fqdn = [
                peer.get("peer_fqdn") for peer in peers.values()
                if peer.get("name") in peers_names
            ]

            response = await self._cli.channel_join(
                requestor=org_user,
                channel_name=channel,
                peers=peers_fqdn,
                orderer=orderer_fqdn,
            )
            logger.info("FABRIC_EV:join_channel: Join channel response %s",
                        response)
            return response

        logger.info("unknown orderer %s and org %s", orderer_name, org_name)
        return None

    async def event_info_channel(self, ev):
        org_name = ev.get("org")
        user_name = ev.get("user")
        channel = ev.get("channel")
        peers_names = ev.get("peers")

        org = self._settings.get("orgs").get(org_name)
        org_fqdn = org.get("org_fqdn")

        peers = org.get("peers")
        peers_fqdn = [
            peer.get("peer_fqdn") for peer in peers.values()
            if peer.get("name") in peers_names
        ]

        if org_fqdn and peers_fqdn:
            org_user = self._cli.get_user(org_name=org_fqdn, name=user_name)

            response = await self._cli.query_info(requestor=org_user,
                                                  channel_name=channel,
                                                  peers=peers_fqdn,
                                                  decode=True)
            logger.info("FABRIC_EV:info_channel: Info channel response %s",
                        response)
            return response

        logger.info("unknown org %s and/org peers %s", org_name, peers_names)
        return None

    async def event_info_channels(self, ev):
        logger.info("Event fabric: info_channels")
        org_name = ev.get("org")
        user_name = ev.get("user")
        peers_names = ev.get("peers")

        org = self._settings.get("orgs").get(org_name)
        org_fqdn = org.get("org_fqdn")

        peers = org.get("peers")
        peers_fqdn = [
            peer.get("peer_fqdn") for peer in peers.values()
            if peer.get("name") in peers_names
        ]

        if org_fqdn and peers_fqdn:
            org_user = self._cli.get_user(org_name=org_fqdn, name=user_name)

            response = await self._cli.query_channels(requestor=org_user,
                                                      peers=peers_fqdn,
                                                      decode=True)
            logger.info("FABRIC_EV:info_channels: Info channels response %s",
                        response)
            return response

        logger.info("unknown org %s and/org peers %s", org_name, peers_names)
        return None

    async def event_info_channel_config(self, ev):
        org_name = ev.get("org")
        user_name = ev.get("user")
        channel = ev.get("channel")
        peers_names = ev.get("peers")

        org = self._settings.get("orgs").get(org_name)
        org_fqdn = org.get("org_fqdn")

        peers = org.get("peers")
        peers_fqdn = [
            peer.get("peer_fqdn") for peer in peers.values()
            if peer.get("name") in peers_names
        ]

        if org_fqdn and peers_fqdn:
            org_user = self._cli.get_user(org_name=org_fqdn, name=user_name)

            response = await self._cli.get_channel_config(requestor=org_user,
                                                          channel_name=channel,
                                                          peers=peers_fqdn,
                                                          decode=True)
            logger.info(
                "FABRIC_EV:info_channel_config: Info channel config response %s",
                response,
            )
            return response

        logger.info("unknown org %s and/org peers %s", org_name, peers_names)
        return None

    async def event_info_channel_chaincodes(self, ev):
        org_name = ev.get("org")
        user_name = ev.get("user")
        peers_names = ev.get("peers")

        org = self._settings.get("orgs").get(org_name)
        org_fqdn = org.get("org_fqdn")

        peers = org.get("peers")
        peers_fqdn = [
            peer.get("peer_fqdn") for peer in peers.values()
            if peer.get("name") in peers_names
        ]

        if org_fqdn and peers_fqdn:
            org_user = self._cli.get_user(org_name=org_fqdn, name=user_name)

            response = await self._cli.query_installed_chaincodes(
                requestor=org_user, peers=peers_fqdn, decode=True)
            logger.info(
                "FABRIC_EV:info_channel_chaincodes: Info channel chaincodes response %s",
                response,
            )
            return response

        logger.info("unknown org %s and/org peers %s", org_name, peers_names)
        return None

    async def event_info_network(self, ev):
        orderer_name = ev.get("orderer")
        orderer = self._settings.get("orderers").get(orderer_name)
        orderer_fqdn = orderer.get("orderer_fqdn")

        if orderer_fqdn:
            response = self._cli.get_net_info("organizations", orderer_fqdn,
                                              "mspid")
            logger.info("Info network response %s", response)
            return response

        logger.info("unknown orderer %s", orderer_name)
        return None

    async def event_chaincode_install(self, ev):
        org_name = ev.get("org")
        user_name = ev.get("user")
        peers_names = ev.get("peers")
        chaincode_name = ev.get("chaincode_name")
        chaincode_path = ev.get("chaincode_path")
        chaincode_version = ev.get("chaincode_version")

        org = self._settings.get("orgs").get(org_name)
        org_fqdn = org.get("org_fqdn")

        peers = org.get("peers")
        peers_fqdn = [
            peer.get("peer_fqdn") for peer in peers.values()
            if peer.get("name") in peers_names
        ]

        if org_fqdn and peers_fqdn:
            org_user = self._cli.get_user(org_name=org_fqdn, name=user_name)

            response = await self._cli.chaincode_install(
                requestor=org_user,
                peers=peers_fqdn,
                cc_path=chaincode_path,
                cc_name=chaincode_name,
                cc_version=chaincode_version,
            )
            logger.info(
                "FABRIC_EV:chaincode_install: Chaincode install response %s",
                response)
            return response

        logger.info("unknown org %s and/or peers %s", org_name, peers_names)
        return None

    async def event_chaincode_instantiate(self, ev):
        org_name = ev.get("org")
        user_name = ev.get("user")
        peers_names = ev.get("peers")
        channel = ev.get("channel")
        chaincode_args = ev.get("chaincode_args")
        chaincode_name = ev.get("chaincode_name")
        chaincode_version = ev.get("chaincode_version")

        org = self._settings.get("orgs").get(org_name)
        org_fqdn = org.get("org_fqdn")

        peers = org.get("peers")
        peers_fqdn = [
            peer.get("peer_fqdn") for peer in peers.values()
            if peer.get("name") in peers_names
        ]

        if org_fqdn and peers_fqdn:
            org_user = self._cli.get_user(org_name=org_fqdn, name=user_name)

            response = await self._cli.chaincode_instantiate(
                requestor=org_user,
                channel_name=channel,
                peers=peers_fqdn,
                args=chaincode_args,
                cc_name=chaincode_name,
                cc_version=chaincode_version,
            )
            logger.info(
                "FABRIC_EV:chaincode_instantiate: Chaincode instantiate response %s",
                response,
            )
            return response

        logger.info("unknown org %s and/or peers %s", org_name, peers_names)
        return None

    async def event_chaincode_invoke(self, ev):
        org_name = ev.get("org")
        user_name = ev.get("user")
        peers_names = ev.get("peers")
        channel = ev.get("channel")
        chaincode_args = ev.get("chaincode_args")
        chaincode_name = ev.get("chaincode_name")

        org = self._settings.get("orgs").get(org_name)
        org_fqdn = org.get("org_fqdn")

        peers = org.get("peers")
        peers_fqdn = [
            peer.get("peer_fqdn") for peer in peers.values()
            if peer.get("name") in peers_names
        ]

        if org_fqdn and peers_fqdn:
            org_user = self._cli.get_user(org_name=org_fqdn, name=user_name)

            response = await self._cli.chaincode_invoke(
                requestor=org_user,
                channel_name=channel,
                peers=peers_fqdn,
                args=chaincode_args,
                cc_name=chaincode_name,
            )
            logger.info(
                "FABRIC_EV:chaincode_invoke: Chaincode invoke response %s",
                response)
            return response

        logger.info("unknown org %s and/or peers %s", org_name, peers_names)
        return None

    async def event_chaincode_query(self, ev):
        org_name = ev.get("org")
        user_name = ev.get("user")
        peers_names = ev.get("peers")
        channel = ev.get("channel")
        chaincode_args = ev.get("chaincode_args")
        chaincode_name = ev.get("chaincode_name")

        org = self._settings.get("orgs").get(org_name)
        org_fqdn = org.get("org_fqdn")

        peers = org.get("peers")
        peers_fqdn = [
            peer.get("peer_fqdn") for peer in peers.values()
            if peer.get("name") in peers_names
        ]

        if org_fqdn and peers_fqdn:
            org_user = self._cli.get_user(org_name=org_fqdn, name=user_name)

            response = await self._cli.chaincode_query(
                requestor=org_user,
                channel_name=channel,
                peers=peers_fqdn,
                args=chaincode_args,
                cc_name=chaincode_name,
            )
            logger.info(
                "FABRIC_EV:chaincode_query: Chaincode query response %s",
                response)
            return response

        logger.info("unknown org %s and/or peers %s", org_name, peers_names)
        return None