How to handle an event raised in one channel in a different channel in Hyperledger Composer of Fabric? - hyperledger-fabric

I have this scenario that a single node is part of different channels. In one channel there are only traders. In the other channel there are traders and regulator. Details of the trades should not be shared with the regulator. The only thing which is being shared is aggregated value at the end of the business day. By aggregated value, we mean how much of each asset is sold, not the detail of each trade. In other words there is confidential information between two parties that cannot be shared with regulator, and there is aggregated value that is not confidential and must be shared with the regulator.
Now I have an event when there is a nomination. By nomination I mean a trade made over some asset in the first channel, the one without regulator. Is it possible to handle this trading event in the other channel where the regulator is?
As I read through the documents, channels are isolated. But how isolated are they? Are they isolated in a way that events raised in one channel cannot be seen or handled in another channel? In that case, how do you suggest to implement this scenario? I mean do you suggest any specific architecture or tools enabling implementation of this scenario? Also do you think Hyperledger Fabric or Composer are suitable for these requirements?
I appreciate any help. Thank you.

So you have two channels, two separate ledgers and two separate business networks (as you've configured it).
Your 'nomination' is, in effect, a 'transaction' as described above. (events in Composer mean, business events that are usually subscribed to by a client application FYI).
In Hyperledger Composer, you can do 'cross-channel' or 'inter business network' queries. So can allow [only] the Regulator (from the 2nd channel) to query [only] those trade 'events' (ie transactions with the fields that contain the 'trade') or indeed assets (updated by the transaction), if need be - back in the '1st' channel (and access controls) in the 2nd channel can restrict the Regulator to do only that 'query' (if that's all he/she is supposed to have jurisdiction to do). Hope this helps.
See example
https://hyperledger.github.io/composer/latest/tutorials/invoke-composer-network

Related

How to send messages between instances of a smart contract in Hyperledger Fabric?

In a Hyperledger Fabric Network, I would like the different instances of a smart contract in different peers to be able to communicate through messages (let say for example, a communication could be a message with text string).
Then I would like that the instances of the smart contract receiving the message to be able to invoke a smart contract method based on the message content (like in a switch/case control flow statement) or send its own message to the network.
Example:
We have a network made of several organizations. Each organization has a copy of the distributed ledger and an instance of a smart contract up and running.
Let say that a smart contract can read the ledger at a specific index and triggers an event message when it read the ledger. The event message could for example contain the name of the reader and the time of the read.
Then when another instance of the smart contract receives the message, it could either send another message to all the peers or invoke a smart contract method.
I would appreciate if anyone has a solution for this use case but any ideas, thoughts or pointers would be also highly appreciated !
This feature has already been proposed in the past, and I implemented a prototype of it here.
From a high level point of view, the way it works is that a smart contract has an ability to send a message to the same smart contract running the same transaction, on another peer by sending the message to its peer, and asking it to route it to a specific peer. That peer, sends the message through the native Fabric communication infrastructure (the same used for disseminating blocks) and that remote peer forwards the message to the chaincode and inside the chaincode it routes it to the right transaction.
If you want, you can roll your own fork of Fabric and cherry pick the commits, or just use this one, but note that this fork is from 2 years ago, so all the bug fixes and security fixes in these 2 years do not exist there.

Using HLF peers for off ledger communication

I would like to leverage Hyperledger Fabric Peers (specifically identities) to communicate data that does not need to be recorded as a world state.
The Private Data Collection seems a step in that direction but everything is ordered and recorded.
Is there a way to send a payload between participants that does not get persisted?
Of course, every parameter sent is recorded in the channel's chain (but not in the world state unless your chaincode specifically does it).
Maybe you can save the payload (encrypted if you need it) in a distributed storage system (IPFS, for instance), share the IPFS hash/index via Fabric and delete from IPFS when it is no longer needed. I don't know if it fits your use case.

How to keep one account consistent between the two channels in fabric network

There are three accounts A,B and C and two channels CH1 and CH2 in fabric network. There are a transaction between A and B in CH1 and another transaction between A and C in CH2.
My problem is that how to keep the account of A consistent between the two different ledgers about CH1 and CH2.
Typically, the data within a channel is restricted to that channel. It is possible to have some state external to the channel that is managed independently of the channel's ledger.
There is a new feature of Hyperledger Fabric in v1.2 (coming real soon... RC1 is available today) called SideDB that allows you to manage such data, though I am not certain that it would make sense to manage accounts in that manner.
The new SideDB feature, referred to as Private Data, is described here:
http://hyperledger-fabric.readthedocs.io/en/latest/private-data/private-data.html
and
http://hyperledger-fabric.readthedocs.io/en/latest/private-data-arch.html

How to maintain provenance in a network while using channels

I am wondering of how to maintain provenance in a network while using channels. In marbles example, lets say Regulator, Manufacturer, country dealer and retailers are transacting on a blockchain network.
Regulator,Manufacturer and dealer are transacting on Channel1 whereas dealer transact with retailer1 on Channel2 and with retailer2 on Channel3, just to keep privacy on selling price for different retailers. As marble1 was originated in Channel1 by the manufacturer , How do the same marble is available in Channel2 or Channel3 for transactions without duplicating the marble and keeping its provenance to Channel1.
I don't know how works the marbles example. However, I think that not all the participants could see all the information and provenance for a marble.
The dealer is in the three channels, so he would be duplicating the info in the three channels. The dealer would has an application that links all the info.
I believe that this issue is more related to the client application.
It is related to client code. A channel cannot send data to other channel due to privacy in fabric. One can implement state of transaction in application code. One way to achieve it through the application code could be to keep id of marble same in all channnels and then run GetHistoryForKey() method on different channel and then accumulate txns in one place in client app to arrive at a solution.

Disable reading from Hyperledger Fabric

Is there a way to disable reading from Hyperledger Fabric for a period of time?
I need this to allow only to write in hyperledger Fabric for a period of time, after this to allow only reading from hyperledger Fabric.
You might add a transaction to your chaincode that would update a state value that your other chaincode functions could check.
For example a disable_write transaction might set a state variable that other transaction chaincode could check before writing/modifying the world state. If the variable is set, don't allow the "write" transaction to occur.
You could then also add a second transaction to enable writes.
The only way to block any client from reading from blockchain has to be coded in the deployed smart contract and applying appropiate logic depending on your desired time policies, you will return requested data or an error indicating that reading is not allowed.
Found this today on https://chat.hyperledger.org/channels/fabric-questions:
Question:
from an operational standpoint, can you
'stop' a channel - for application-type transactions? That is,
'quiesce' the channel (ie the question posed is from an operational
management perspective based on a time-event)
jeffgarratt Answered:
one possibility is to alter the policies associated with the
channel with a config update. However, in general config changes
require multiple signatures from channel members. but once the
config is changed, you can effectively 'stop' the channel, i.e. alter
ability to write. this would still allow for reads, but the chain
would not progress, as no writes are allowed

Resources