 Hello and welcome to this Hyperledger Sweden Meetup. My name is Roland again and I'm happy to be your host for today. In today's session, that's me, in today's session we will talk about channels. And to start, I will give you a short overview of what we will do today. So first of all, I will give you an overview about the example. So what we are going to do, so that we have a big picture. What is the goal of this session today? And then because of the fact that we are going to use the channels, the application channels and also the system channel. So we have to look a little bit into the config.tx.yaml file. So that's the main configuration file for the channels. And then we talk a little bit about the difference between system and application channel. And I will give you as well an overview about the needed tools to use this. And then after this theoretical part, we are going to do it hands on. So I will show you how we can use the test network. We will modify a little bit the test network script so that we only create the identities and the crypto material for the users and the peers. And then we, so we are able to install the system channel and also the application channel by our own. And we will do it step by step so that we can leave a little bit away from the installation script from the network, from this network script. And in this example, we are going to install step by step the system channel and two application channels, one the default channel, so the my channel and the second one, which is dedicated only to organization one. And here you find the agenda, then also the support material. I have put this links also in the chat. So you find the slides, the link to the slides in the chat and also to the GitHub repo, where all the examples are listed. And maybe some of you know that since yesterday, there is a new version of Fevic, Fevic 2.3. And this version has two new big features. And one of them is the capacity that we don't have to start with the system channel. So we can start with application channel. But I think my examples and all these examples here are based on the 2.2 version. This is also the long-term support version. And also the version, which is for the moment now needed to pass the Fevic administrator certification. So for now, I think it's 1.46 and in the next year, I think in January also, there will be the certification also for the 2.2 version available. And that's important to know that the 2.2 version is the long-term support version. And for the moment, 2.3 is maybe a new version. So yeah, we will see what this means without the system channel, to use the system channel in the first step. But today, that's not all what you are seeing today. So that's the version, which is used for the long-term support version. Okay, so a short overview of what we are doing today. So as you know, this is the traditional example.com network consortium. And we have two beers here and one aura. And then we have the MyChannel, an application channel, and we have a system channel. And in this application, or in this example, the MyChannel is so organized that PR1, PR0 from Organization 1 and PR0 from Organization 2 have access to this channel. And then we will try to make a new channel, the Organization 1 channel. And this channel has only access, is only accessible from Organization 1. So and in both channels, we are going to install some chain code. In the first, we are going to use the basic chain code. And in the second, we are going to use the ABStore chain code. And that's the aim of the example. And that's what we are going to do. And you see here also, Sean, you see here different names. So I named this letter here system channel, so because it starts with this. And then we have an application channel, which is called MyChannel. And then we have an application channel, which is called org1Channel. And yeah, and on this, in this channel, we install a chain code. The basic and the ABStore chain code, which you should be familiar from the last sessions. So and one of the important things to use the channels is the understanding of this configs.tx.yaml file. And when you see here this way, you can see here that we need this config.tx.yaml file. Then we use a tool that is config.tx.gen, which creates the system channel block. And then it's called the genesis block. So and then this version 2.1.4 and 1.2 version, we need as a first step this system channel block. And from this channel on, we will create the channel transactions for the so-called application channels. And to understand a little bit what is for this process needed in this config.tx.yaml file. So we are going to look in this file a little bit. And the most important part for us are the channel profiles. So with this channel profiles, we can create different channel configurations. And then we can use this config.tx.gen file to create these channel transactions. And the first step what we need is the system channel. So since 2.2, this must be the first channel that is created in the fabric network. And this is so called the genesis block. And there could only be one system channel. And that's important when you talk about the channels. Then you have to decide between two different kinds of channels. You have to decide between the system channel and then you have the so-called application channels. And you can have as many as application channels if you want, but you can only have one system channel. And then the system channel is important because in the system channels there are also the consortium members included. And you cannot add a new organization when this, when you, when you, when you doesn't change the system channel. So that's an important part that you know what belongs to the system channel and what is part of the application channel. And the system channel defines the set of the ordering nodes that form the ordering service. So in the system channels, we have defined the ordering nodes. And one important point is that, that here in the system channel is also defined who are the administrators from the ordering service. So that's important to know only these administrators which are defined in the system channel can administrate the ordering service. So that's an task from the system channel. And it defines the organization that are members of the blockchain consortium. So that's, that's maybe a little bit of misunderstanding when we do the examples in the, in the, in the February examples and also from the Witte Docs. That we forget to use the new member to the system channel. And we have to, when we add the new organization, we have to modify the system channel and add the new member there. And then we can add the new organization also to the existing application channels. So that's an important part that all organization members are defined in the system channel. And the consortium is a set of P organization that belong to the system channel, but are not administrators of the ordering service. So that's also important that you know that all peer organizations must also be part of the system channel. Yeah, and then the Genesis block of the system channel is required to deploy a new ordering service. That's also important part that you do the creation of the Genesis block of the system channel with the system channel as a first step. And then in the second step, we can start the network because when you look at the Docker compose file, you will find the, the, the binding in the Docker compose file by the ordering settings to this Genesis file. And without this Genesis file, this will not work. So and important, there is a Genesis block. There's only one Genesis block for this lecture. So we have only one Genesis block for the system channel. And based on this, but this belongs also to 2.2 now. So that could be a little bit different now in the 2.3 version. And that's an important part. So we need the Genesis block in the first step. And after the creation of the Genesis block, then we can start the network. And when we look later into the Docker compose file, we will see the point where this Genesis file is linked to the position on the file system. And then you have the application channels. So and the application channels. So that is the, that is where the transactions come together and where different members of the consortium can talk to, to each other. And this should be a private and confidential, in a private and confidential way. And so a channel, this is I think a unique part of the fabric in the blockchain world. So with this channels only organizations with with with part of this channel can communicate and can read the can read what I can use the chain code can read can read some informations from the chain code and send transactions to the chain code. And with this console with this element, you can control who has access to the to the data into the into the blockchain. So you can have 10 members, but not all 10 members must have access, but can have access to a channel. So you can play with this and you can say, okay, in the first channel, only this two members have access and can interact with each other. And in the channel B, that's an general channel, all members can communicate with each other. So and that depends on the business need. And in this way, you can make this so important is that this is a private area like your private chat and only the people where the members which have access rights in this channel have the possibility to create transactions or read transactions. And also important, you can have as many as possible, as many as needed application channels. So and that's also an important part. But the really important part is that you in your mind understand that there are two different kinds of general types. One is the system channel and one is the application channel and the detain code will be installed always in the application channels here. I have here some more information. So it's true that the channel is defined by the member organization of the consortium and also of the N-CAPIers for these members. And sometimes you find the term, it's a shared ledger and you have only one channel per ledger. And you have a chain code, but we have seen you can have more than one chain code on one channel, so we can install different chain codes on one channel. And also the ordering nodes are defined for this channel in this application channel. Yeah, so that's I think that's clear. So each transaction on a channel is executed on the channel, as I have mentioned. And every participant on this channel must be authenticated and authorized to transact on the channel. So and that's where the permission, because it's a permission network and only people who are authenticated and authorized can have transactions on this channel. Yes. And also it's clear that each peer that joins a channel has its own identity, given by the membership service provider. So as we have seen sometimes, the term membership service provider is an important one. And this is a topic we will cover in the next sessions. And yeah, the membership service provider includes the crypto material for one organization. And with this membership service provider data, the identity is provided to the ledger. And through this identity, the channel can authenticate the peer against the system. And there is a genesis block for the channel. So when we talk about the genesis block, so we have to be carefully so that we know that there is a genesis block for a channel or a starting block for the channel. And we have also a system genesis block, which is responsible for the start of the whole network. And I have tried to do it in this diagram and you can see here we can have two lines here. So we have the ordering node, so the ordering system here and we have here the peer system. And when we say the ordering node, from the ordering node, sort of from the order of service, so we have to create first this genesis, the system channel. And with the system channel, this is also the genesis block created. And this is the foundation, the basic. And from this genesis block, we can create this updated transactions for the channel transaction. And this channel transaction, we need for every channel. So for my channel, we need my channel TX file. So when you do this, you see that there is a file, some TX file created. And with this TX file, we can create this channel genesis block, the block zero. And that belongs to the application channel. And yeah, and this started from the peer node. And that is also for a second channel, when we have this for the single organization, one sole. And we also need that genesis block. And for this, we also need here a new transaction, a new transaction for the single organization one. So that's wrong here. That's a mistake. Here should be not my channel. This should be organization one channel, I think. And so, and here you can see that we have the system channel belongs to the ordering service, and the application channels belongs to the peers. And on this lecture, we are also on the peers channels. We are going to install the chain code. And here all the transactions are stored to the application channel. And to do this, we need a special tool for this. And this tool is this config TX gen file. So the file is, you can find this file in the bin directory for your favorite centers. And here we have some common options, which we have to use. So to create the system channel or the application channel, we have to use here this option profile. And this profile we will see later comes from the config TX YAML file, where we can create the channel configuration. And then we can define the output of this. And in the test network, it's called the channel artifacts. And then here the my channel TX D file. And this file is named mostly in the same way like the channel is named. And yeah, but it doesn't matter how this file is named. And then we can say, okay, we need the system channel. So I think that's a fixed name for the system channel. And then you can, and when you create an application channel, you can make, you can name if the name is free. But I think there are some regulations for the naming. So I think that you must always use lowercase. And you can only use alpha, alpha numeric and numeric characters for the channel name. And then you need a conflict path. So mostly the conflict path shows to the config TX D YAML file. And this mostly through done with an environment variable. And this is called favorite config path. And but you can use also this option config path. And then you don't have to set this environment variable. So I have mixed this. So in the example, so we will see that it works also when we use the option here and set their relative path to this config YAML file. Or we can use this favorite config path environment variable. So you will find both ways. And the conflict TX TX game file is responsible for this for the creation of this system channel. Genesis block and also for the application channels for the application channels. Oops. And yeah. And then we need some commands. So we have the beer command, this beer command, beer channel command. And then we need some commands. So we can need the beer channel create. We need beer channel join with the list command. We can see we can get some information about this. And with the update command. This is a command which is used for changing the configuration, the channel configuration. And beer channel get info shows us shows us a little bit about the peer itself gives us some information. And that's interesting conflict TX later. And that's a command which converts the command translate translate between the protocol path and chasing. So what does this mean? So the data structure in the fabric network is done with the protocol with Google's Puffer protocol. And that we can read it, we have to translate it. And beer can translate it to in the chasing format. And that is their task for this conflict TX later. So that's the only thing what these two do is that it translated some information from the prototype protocol Puffer to the chasing format. And that's an an helpful tool to do this. And the chaco tool is a chasing parser which we have used in the last sessions as well. Okay, so now that's the theory. So now I would like to show you how we can do this. So let me switch to my help file here. And so and the first step, what we are going to do. So I start with the fabric samples. And in the fabric samples, we have this test network folder. And in the test network folder, we have a file which is called the network the network script. And we copy this. I copy this file and I call it my network. And in this file. So okay, that's not very good. We do it in another way. So I have prepared this here. So this is the file, my network. Which I have copied. And here there's a function network up. And then this network up function is there are two functions here to create organizations, create orcs and create consortium. And because we want to do it step by step to the we want want to create a system channel and also the application channel. And but we don't want to create the identities and the crypto material for the identities for ourselves. So and that's the reason why I have commented this out here. So they create consortium function. And then also the docker compose command here. So that's the change I have done here. And then in the end, we will call this script. The crypto material will be created. But no system channel is created. And also not the application channels are created. And also not the chain code will be installed. So and that's then we can do this and practice per hand. But it's not so. And then with this small modification, then we have to. Yeah, so we can make it. Executive and then and then we can start this in the same way as we have. We would do it when we are going to use the normal script. So and then the crypto material for the organizations on the peer should be created. And we can see here when we use the three command and limit this to two levels. Then we see here the crypto material for the order for the other organization example com and also for the peer organization for both peer organizations here. So and the next step is we have to create the system channel. And the system channel before we create the system channel, we have a small look into this conflict TXYAML file. And here is this TXYAML file. And when you scroll through this file, so we can close this here. So and in these are the main areas. So we have a section organization here and the section capabilities here. So and here some application defaults and order defaults and channel defaults. And here are these profiles. And for us important now are these profiles. And in this profiles, the configuration file has this configuration here file here. And as you can see the important part here, this is an profile name. So you can say this is in two orgs, all of our again this is a block one name. And when we call the command, then we have to say which profile we are going to use. And then we can use this name. And here you see here to find you the consortium name and also the organization which belongs to this consortium. And we have now organization one and two. And that's the reason why when we have free organizations or when we change it later, then we have to modify this. And that's for us the important part here. So we have this sample organization here. And the channels here as you can see belongs to this sample organization. And then we say, okay, they are channel defaults with policies and application defaults, whatever does mean. But the important part is to this two orgs channel. This two organizations belongs to. So and organization one there in the solution two belongs to this channel. And this channel belongs to this consortium. And that's the way you should see this. And here you see the one orgs channel. So that's the second example. And this channel belongs also to the sample organization. But only the organization one belongs to this channel. And that means that organization two cannot create a channel for this organization. Organization two cannot install or use the chain code which belongs to this organization, to this channel. And that's important to see here. And for the moment, it's not so important what about the channel defaults and order defaults. So in this example, we are focusing on the members of this organization. And these members of the organization belongs to a particular channel. And this is how this fit together. So we have here this genesis configuration and the genesis configuration have a so-called sample organization, sample consortium. And these two organization belongs to. So we cannot say here this is, for example, something like this. You cannot say organization one and organization three belongs to this consortium because there is no organization three here. Okay. So and I think that's the important part here. So you can look into this. So these are elements about the channel policy, but this is not a topic for today. And this maybe that's important. So this profile belongs to point that links to elements to intersections in this file. So the order or defaults will be definite here. So when you see here some elements from the organization. So the patch timeout. So some examples are the, so as we know in this, in this example, we will have a single raft system. And but this is only for testing. So the raft is a crash for tolerant ordering system. And to be crash for tolerant, you need at least three orderers or consenters here. That's the correct name. And then we have to, we have to configure this here in this block. Also the patch time or the batch size. These are some, some configuration values which often use to demonstrate how you can change the configuration to a later time. And yeah. And this you can find here. Are there in the application here. So, but these are from the policies. Some parts. And yeah. And here are the organizations. So yeah. So as you can see here, yeah. We have an Ottawa organization. So always we speak from an Ottawa organization. We speak from a peer organization. Then we need this organization type here. The organization one or the organization two. And then you see here their default policies. Yeah. And for us important for, for playing with that in the first step, policies are not so important here. So more important for the understanding is here when we have the name and the, and the ID and then path to the membership service provider. So when we come to a state, when we are trying to go in the way that we say, we don't want this here. And then we don't want to organization one example. Come when you want to have your own names, then you have to change this and you can do it with with an editor, which replaces these things. But you should know what is important to change here. Yeah. And also for the organization too. So, and that what I mean when I say that the conflict TX YAML file defines also all organizations. And here is no definition for organization free. So, and yeah, when we want the organization free, then we have to fill this in here. And then we have to create an update transaction. And then we can make an up to it transaction. And with this up to update transaction, we can extend the network for the system channel. So, and all the informations in this conflict TX YAML file here. But for now, for us, it's only important how we can create channels. And these are the way. So, and to point this here, yeah, to repeat this here. So the important part is that we have a simple, a simple consortium and only this organization belongs to. And only these two organizations can be included in the channel configuration here. And that's the part where we say, okay, organization one and two belongs to the two orgs channel. However, this channel is named here. And the one orgs channel only organization one belongs to this. And these are, this is the configuration for this. So, and when we have this in place, then we can use the conflict TX conflict TX GAN file to, for the, for the creation of the, and we see here the conflict path. So the conflict path. So from this position, we have here the conflict TX D file that's here. And then, oops, so, and we have here this file. And then we use the profile. And what we are going to use is this profile, the two orgs or our Genesis profile, which we have seen. And we have to define the channel. This is the channel ID. And the first channel is the system channel. And then we can say, okay, we want the output block in this system. Genesis block, Genesis block file. So here now. And this file is then linked in the, in the Docker compose file for the start of the network. So, and when we do this, you can copy this. And when we look into the system, we will see the file here. So, which is not created. And yeah. And then we can start the network. And let me switch to the, here. And when, when you look into the Docker compose file, here's the Docker compose test.net file, which we're going to use. Then you'll find here, the auto-organisers block. And this auto-organisers block is mounted here through the volumes. Here's our file. So, you can do it in another directory. But if you do this, then you have to modify these paths here. Yeah. So, and this is the link to this. Okay. So now, when we start, and with this, we can start the network. Now you see the same happened as the last sessions. And we see, okay, we have the auto-organisers block. The auto-warning. And we have a PS0 from organization one-warning and PS0 from organization two-warning. And then we can use the logging. So, to see what happened. And then, okay, let's see. And then we can start with the creation of the application channel. And that's basically the same. So, we have to use the config.tx.game file. And we have to use the derived profile. And in the first way, we are going to use the TrueOxChannel file, or TrueOxChannel profile. And then we create the, this file creates the channel transaction. And this channel transaction is stored here in another directory, in a channel artifact here. And that's the default directory, which also the original script is used. And then we can say, okay, we need a channel, a channel ID, that's the channel name. And we can also define here the config path to the config.tx.game file here. So, you see the same, that's the same process as we have seen for the system channel. And I have here only two environment variables. So, to reduce here the typing. And then as with the channel name, so it's quite a my channel. And then the Ottawa CA environment variable, which is used later here in the creation. So, on a test network, we used to collect this environment variables. And then we can create the first channel transaction. And you see, this works. And in the channel transaction, channel artifacts directory, you see this my channel txt file. And that's the first step. And then we need some, we need these anchor peers. So, as you know, the term peer is divided into basically into two elements. So, we have the endorsement peers and we have the committing peers. And then we have a special type. This is the anchor peer. And the anchor peer is used when you have two organizations. And to communicate between these organizations, then there's a specific peer used and that is called the anchor peer. And to define this anchor peer, we have to do this, another channel configuration for this anchor peers. And you see, there is a specific option here. It's called the output anchor peers update. And then that's needed the path and the channel name and this SORG parameter, organization one MSP and the config path as well. And this we need for the organization one and also for the organization two. So, this is needed for the private data order for the service discovery. And the service discovery is now responsible for that the organizations find each other between the different organizations. So, this is the first update transaction for the anchor peer and the second as well. And we look into this channel. You can see here the my channel, GX channel transaction and the anchor peer transactions here. And the next step is that we can create the channel. And to create the channel, we need these helper scripts. And then with this helper script, we can switch between the organizations to set the proper environment variables. So, when they say set globals one, then we are using organization one. And when you use the point environment file with the core command and set for that, then you'll see your environment variables that you use the local membership member should provide ID ARC one MSP. And that's the ID which we have seen in the config TX YAML file. ARC one MSP. So, that's the link between. And that's important to know when you change this environment variable, then you have to change also this in your config TX YAML file. Peer organization and so on. So, when you switch to organization two. So, here I have set this path as well. And then we can use the peer channel create command. And on this command, nothing is special. The only thing what we have to need is we need the ordering system here. So, for the channel create command, we need the ordering system that is also running on local host a 70-50. And yeah, so the channel name which we are going to use, then we are using TLS. So, we have to use this order TLS or write command, but these TLS commands are always the same, which we are also used for the invoke command. Then here, you can see the file, the channel transaction file. And then here the output option. And here we have then the genesis block for this channel. And that will be the channel name dot block here. And here are also the information for the TLS. So, and with this we can create. And you see here on the output here, you have seen here some things. And you will see there's the raft leader and so on. And we have received a block zero. And then we should have in the channel artifacts. We see here my channel block. And that's the genesis block from this channel. And with this, we can join the next step is. So, in the last, in the last exam, so in all exams, we have always used the network script to do this in an automatic way. So, but the steps to create it step by step is always the same. So, we have to create the channel here. Then we have to join the channel. So, the peer has to join the channel. So, now we are in tier zero, organization one, and we have to join this. And the command is peer channel join for this. And we can join with the genesis block here. And why we are peer zero in this organization, this is because we have set here this environment. So, okay, so now we have joined this peer. And we can use the peer channel list command to see which channels this peer has joined. And you see here, channel spear has joined my channel. So, this works for now. And the same we have to do for your organization two. With the set globals, one switches to organization one, two switches to organization two. Now we have using organization two. And when we look at the environment variables, we will see the difference. And you see here, the local membership service provider ID is now organization two. You have also a different part. And you have also here other paths to these membership service provider counting path and to the TLSWOOD certificate. And this part, this part comes also, all parts come from the configuration in the Docker Compose right here. But now we work as an organization two member. And then, since we are on the same machine, we can join the organization peer channel, organization two peer channel as well to this channel. Okay. So, the next step is to update the incapiers. And we switch back to this. And here we have this update command. And with this update command, we can say, we can use this organization one MSP incapiers transaction to define the incapier for the organization one. And the same we have to do for organization two. We switch to the organization two. And then you do basically the same command. Only the path here is changed to the organization two MSP. Encapiers. So, okay. It works as well. So, now we are ready to install the chain code for my channel. So, you see there are some steps to do, but these are the steps which you also will find in the network script. And that's all the scripts you have to do best when you are doing this step by step. So, and when we are going to install this chain code, then we have to, we are going to use the basic transfer, the asset basic transfer chain code. So, then, first of all, we have to check if all dependencies are installed. And we can switch to this. And yeah, as I've tried this before. And so, but we can do it. And then we will have here in this vendor directory all the dependencies which are needed for the chain code. And then we do this, what we have seen in the last sessions. So, the first step is to package the chain code. And then we can, we have to install this chain code on the peers, on the organization peers here and here. And then we have to improve it. So, we have to approve the chain code. We have to approve the chain code of organization one and for organization two. And then we can commit this chain code. And with the committing the chain code is ready. And the reason why we have to do it for both organizations is because we, the default configuration for the endorsement life cycle for the chain code is that the majority of the organization must approve the chain code. And in a system with two organizations, the majority is two. So, when we only do it with organization one, then it will not be, that would not be enough. Okay, so then let us do this steps. So, the first step is we are going to package this chain code again. And that produces this basic file. And then we can install this file. And we do it with the same commands. So, it takes some seconds. So, and that's one of the difference between the version 1.4 or version one that in this way, it takes some time because in the background, the corresponding Docker container, Docker image will be created. And in the version one point, the Docker container is created on the first invoke. So, that's the reason why this takes here some times. And the advantage is that we don't have to wait on this creation process when we use it for the first time. So, we do it also for the second one. And then you see here, we have also some check commands with peer lifecycle chain code query installed. And we can check what is installed on this peer. So, okay, this works also. So, we want to switch back to the organization one. And now we check what is installed. And now you see on this peer, the package ID basic one with this hash value is installed. And we need this. It's the same here. So, okay, it's the same. And we need this because when we try to approve this chain code, then we have to name here the package ID. And we start this in an environment variable. And then we can approve this for organization one. So, this is basically the same we have seen in the last sessions. So, that's the reason why I explain it not so much here. So, the approved process is the same. Yeah. So, now both organization has approved this basic chain code. And then we can commit this. And yeah, this is important to mention here. So, when we do a commit here, we have to do it also for both peers, for all peers. So, as you can see here, we have the peer address, the first peer, and we have here the second peer. So, and that's important. And also the TLS root certificate path here. Yeah. So, then, if everything works, then we should see something like this. And we can check this with the chain code committed option. And we see here that we see here this basic chain code on channel, my channel is successfully committed. And we see also the approvers. So, we see organization one has approved and organization two has approved. So, there could be a situation where you have three organizations and we need the majority. Then here we will see organization three MSP maybe set to false. Yeah. And then we can, and then we know, okay, organization three has not approved this chain code. And but it will work. It must work because the rules in the consortium is set to the majority. But we could change this that we have to say that we must all approve this. All organization members must approve this chain code. But that's not the default or not the default configuration. And with this command, with this chain code created, you can track this here. So, okay. And then let us check if this all works. So, now we have to call the init function from the chain code. And you see here it takes some minutes to create the blocks. But the chain code invokes successful. And then we can try some queries and you'll see if it works. And you'll see it works. So, this is the basic, this default chain code. And it has a function get all assets. And so these are the assets which are filled in by the invoke command here, but init lecture command. And these are the assets. And this pipe jq, so we can use this jq parser to get this nice print on the consort here. But that's the same as we have seen in the last sessions. So, yeah, we can query the chain code. This works as well. And then, okay, the query works. And then let us try also an invoke command so that we see we can also change something. This is asset one. So, and we see we have changed the owner to Roland from Tomoko. So, okay. That means that our channel one works. And we can query and invoke some chain code. And now we try to create the channel B. And for this, so the aim is that only that in channel B only organization one can read and write. So, and the first step is that we change the configuration or we create the profile for this. So, as we have seen it, we have changed. We named it one works channel in this conflict TXYAML file. And we changed. We used here the sample consortium so that we know that this channel belongs to the sample consortium. And which organization should be remembered. And we say only organization one should be remembered. So, and this we have seen. And now we can make the same steps. So, okay. Now I use this config fabric config path. And yeah, so we have channel name organization one channel. And so we use this environment variables here. So, but let me look if I have set global. So, but I have, I think I have to change to set global one. Yeah. So, and now, oops. Okay. My helper environment variables here. And then we create, we use the conflict TXYAML file and create this channel transaction and for the profile. So, and here we use one works channel. The rest is the same here. So, I have copied this. So, okay. This is also here. And we see in the channel artifacts, we have here one channel TXT file. And this is my channel TXT file. So, and then. And with this conflict TXYAML, we can inspect this configuration as well. And that's interesting to look a little bit into it. So, so we can compare the difference between this organization one channel transaction and the my channel transaction. And when we try this, then we will see something like that. And when you scroll it, then you will see here in this groups. So, yeah, channel ID organization one. So, and you see here in the application group, we have here organization one. So, okay. And, yeah. So, and when we do the same for the my channel transaction file, let's scroll a little bit up. Then you see here organization one and organization two. This right set. Yeah. And only here in the read set. So, for the read set, we have organization one and organization two. And then in the right set, we have also organization one and organization two. And then we look in the organization one in the other profile file. Then we have only organization one. You see here the right set. We have only organization one. And here in the read set, we have also organization one. So, and that's what you can see in the, in the channel transaction file. You can also use, I have here another example. So, you can check this also with the JQ tool. Yeah. And you can dig a little bit in. So, when you use this path payload data config up the read set. So, with this, you can check, is your configuration, is your organization in the organization. So, and then you see here, okay, organization one, organization two in the my channel. And when we do it with the organization one channel, and we see here only organization one. Only organization one in the read set and also in the right set. And with this config TX, GAN file and the option inspect channel create transaction. You can look into this file and you can see, okay, this, this must be okay here. So, you can a little bit inspect this what's going on here. And you see also here the sample consortium and you see other things, which we don't have to look into for the moment now. But the important thing is that you see which organization belongs to this channel. So, and that's what you can do with this inspect channel create TX option here. Okay, so now that we have this, so okay, I will make sure that I have the right organization, organization one. And then we can create the second channel. And that's basically the same, but we use only here another transaction file. And we get another Genesis block here, also in the channel artifacts folder. So I'm going to do this. Okay. Then we should see the channel artifacts here, the channel organization one channel block file. So this is the Guinness block. And you can also look into this file. You can look into this file with the config TX later file. So and that's this tool where you can look into the into the proto buffer file and see and pass this and convert this to a readable form. And that's in that situation. And when we look at, and then we can use the trick tool for this. And when we use this, then you can debug the Guinness block and see what is in this Guinness block. And that's an important step. So when you maybe sometimes you want to extract the block from the blockchain and in the block of the blockchain, you will have at least one or more transaction. And when you try to extract this, then you can do this. So you can get, you can fetch a block from your blockchain and from your channel. And then you can look into this. And then you can extract a transaction. And in this transaction, you will find all the information. And one important point is, but we will not see it today. But that's an important part. So you will see here a lot of a lot of things. But most most things are encoded base 64. And all values are not encrypted in the blockchain. So that's important to know when you start transaction and when you fetch a block and to look into this and translate it back to chasing, you can read your data. You can read your data because all data, the data in the, in the transaction and in the block is better for it not encrypted. So it's only encoded in base 64. And then when you fetch this block, you can read it. And you can see all input parameters and the information about the values and also about the chain code. So, and with this tool, you can translate the information from the protocol path format to the chasing format, and then you can read all this stuff. So, but you have to know what you're looking for. What you're looking for. So you see here, yeah. And you see also which certificates are used and so on. So you can find a lot of information when you know how you can extract the data from convert this data from the protocol to a readable format here. And you see here the header and the data from our signatures and so on. So a lot of information are backed in. Okay. So, and then we can, we have to join the beer and then we can check the channels. I can look which channels are listed on this peer. And now you see you have here organization one channel and also the my channel. So now you have two channels here. And so what about the organization two here? So that's an interesting part here. So in my observations, I found out you can create the channel. Oh, you cannot create. Sorry, you cannot create the channel. That if you try this, then you will receive this error message. But you can when you have the Genesis block here, you can join this channel. Yeah, that will work. You join this channel. And when you make a channel list command, then you will see this channel is also joined to the second peer. And yeah, I don't know why this, why this goes. But when you try to approve it, then you will receive the error. So access tonight when you try this out. So and that's, I have maybe, yeah, I don't know why, but you can join this channel. Yeah, but you cannot approve this channel because we are not part of this channel. And in this way, we cannot approve this chain code. But we can also install this chain code. So we can join this channel and we can also install this chain code, but we cannot approve it. And yeah. And that's my observation on organization too. So I don't know why this, why you can join a channel, like why you can try to a channel where you're not a member. So, but it works. And also then you can install some chain code. Okay. And but the proof process fails here with this error. And so, and the process ends here. So it seems that you can join a channel and destroy some chain code, but you cannot approve and chain code, which isn't, which is not allowed for you. So that's my facet here on this, on this situation. And then we must install the, oops, so we must install the chain code, the AD store chain code. And for this, we install first the dependencies and then, and then we can do the same as we have did for the first chain code. So we have to pack the chain code. We have to install the chain code. Then we have also to improve it. And then we have to commit it. And there's another command which we have seen in the last sessions. We have this check commit readiness command where we can control which organizations have improved this chain code for a certain time. So, okay, this is here. So, okay, then here the package command, it's the same. The path to this go package, to this go package. Then we have to say, okay, that's a goal length. But we can also use Node.js and Java. And we have to set the label. So, okay. And then we have here this basic target set file. So, okay, make sure that the organization one and then we install this, maybe store file. And then here you can use the same steps. So you can, yes, yes, yes, they're recording everything is recorded here. And later you will see this on the Hyperledger channel on YouTube. And, yeah, so I will write it also on the Meetup Chat. But normally, so the end of the day or tomorrow the video, the recording will be on the YouTube channel. Okay, so this is this. So, and then we can check this query installed. Then you see here, you have two packages on this peer. So, and that, so we have a channel, yeah, my channel. And then this channel, we have two packages here. So we have two packages on this peer. So that's good. That's great. We have a peer and we have two packages on this peer here. So we need the package ID. So let's stay in store. So let us check if that's the same. Yes, it's the same. So, and then we have to improve it. That's everything is the same like we did it before. So the transaction is valid. So, and that's the command we have not seen in the first example. And here you'll see we had the quality approvers. So we only have to approve organization one. And that's true in this JSON structure. And that means we have the majority of this members of this channel. And because here channel one, so we check the commit readiness on this channel. And on this chain code in this version and in this sequence. And then we have to commit it. And then to test it, we can call in the peer chain code invoke command. And we can call this init function. So this belongs, these functions belongs to the chain code. And so yeah, it works. Chain code invoke successful. And that means that we can now query the account one. And we see, okay, that we have here 2000. And the organization, the account two has here zero. And then we try to send from organization one to organization two. Account one to count 200 and do the transaction. And you'll see here, take some time on this machine. So the chain code invoke successfully is faster. And then the raft order here, and you'll see. And then when we check here, and you'll see here, the amount is 100. And the amount for account one must be 1900. So, and the second chain code is also works. And in the last, I will show you this channel to get info command. So, and that's useful for you that you can see. You can check the current block hash and the previous block hash. So, but that's not so useful for now, but you see the block height. And this is the block height. You'll see how many blocks you have in this, in this chain. And we have, in my channel, we have eight blocks. And then the odd one channel, we have five blocks. So, okay. That's now we do on the, we do the same again. So, and then we must have on the odd one channel, we have six. And that means we have six blocks. And we have seen in the channel configuration a block time from two seconds. And that means that a new block is always created in an interval of two seconds. And that means for us now that every transaction is in a block. And we will not have more than one transactions in a block. And yeah, and that's one what you can control. So you can say, okay, I need more than two seconds for a block. So then you will have basically more than one transaction in your block. But this depends on your business need. And that's this configuration here. So, and you'll say here, the Ottawa organization now here, Ottawa. And you hear the patch timeout. So you have two seconds. And every two seconds a new block is created. But you can control this a little bit. So you have here a batch size. So you can say, okay, the maximum message of 10 transactions. So max message count 10. So but then we will need a faster system. So in two seconds, we will not have 10 transactions here. So yeah. So and one and the first rule, the first rule which matches is used here. So when we need here, so we can use 20 seconds. And then we will have obviously more than one transactions in one block. But I don't know if this makes sense. So also the maximum batch size here. And yeah. So here are some, this is a little bit where you can configure the creation of a block. And it depends then here on the height. So when you have it in our case, you can say one invoke transaction will be a new block. So okay. I think we are good in time. So in my file here, so I have, so there are a lot of steps. So but when you would like to try only the second step, then you can have here this this way. This is a so-called fast track. So we can use the test network, the normal network script with the create channel command here. And then the my channel is created and then you can deploy the basic transfer chain code with this deploy command here. So and that's also the standard way where you can use the network. So don't forget this. And then you can do it step by step to create another channel with limited organization members. And here you can find also some steps to install the AB. Oh, that's the same, I think. Yeah, that's the same. So okay. Yeah, so that's a lot. I think we are now in the end. And yes, as I have mentioned, everything here is recorded. You will find it later on YouTube on the Hyperledger channel. And when the file is ready, I will post it also on the Meetup page. Yeah, so do you have any questions to this? Maybe next time we will have a guest speaker. And yeah, so we will see. But I will write this in the agenda so you can look always in the agenda. And this guest speaker will present and maybe I don't know if he'll do it. But if he will do it, then he will present his new course. He's going to develop a course and university course. And at the university of, I think it's a university in Portugal. And yeah, so if this works, then you will see another way of course. So and he will present his course and we can see a different point of view, how people from the university see this topic favorite. And that's pretty interesting. So maybe a little complicated, but it's interesting. And it's I think very, very informative and interesting. So but for this, so how do we have a question here? Thanks, Roland. In one of your sessions, you will have created the network from scratch. Yes, we can do this. So we did this. I think we did this in the sessions before in these favorite administrator sessions. And in the next step, we will see if we can do this with the university course. And then we will look a little bit into the membership service providers and in the field of couch TV. So so for now, we only use the level to be so, but we can also use couch TV. And when we have some foundations, then we can go and do this more step by step. And today, this is the first way to come a little bit away from the network script. And yeah, so I think we can do this. Yes. And I think in the next sessions, we will do this as well. So you can see it is a lot of work to do this. And we have to modify some files. But then you can see how the whole process is organized. And I try this in a way to not to do it all in the same session. So for today, we have the creation process extracted. And only the creation of the crypto credentials of the identity files is from the script. But yeah, so we can do it step by step. And another important part is the knowledge of the favorite CA. So that's also an important part, which we can play and use a little bit. And the network as hard script is also a good choice to do that. Because in this version of the network script, we can create, we can use the option CA. And then the crypto material is used from the three favorite CA's. One for the Aurora, one for organization one and organization two. And the crypto material is used from these organizations. And that's also important when it comes to use the Node.js SDK. So for now, we only use the CLI command. But that's only for testing. So when we make it a little bit more in a professional way, then we cannot use this CLI command. So we have to use the Node.js SDK, for example. And for this, we need an identity management, a wallet. And this users, we can only get through a favorite CA. And so, yeah, favorite CA is also an important part. OK, so do you have another question? So is there a limit onto how many application channels can be created? I don't think so. And so I have seen, but I have seen is there is no limit how many application channels you can create. Yes, the recording of the previous sessions are also on this YouTube channel. OK, so any other questions? And let me say, if you have a topic or you want to present an example. So that would be really cool if someone of you tries to try an example. And then you can present here this example. So that and if you are, if you need help, I can help you. And yeah, so that because this session is basically from the community for the community. And everyone is invited to contribute to this to this series. And it would be really a great thing if one of you can show an example. And yeah, and then he can present this. And if you are, yeah, and I can help you if you want. And then you can present your example on OK. Yeah, so if no questions, then I have to say thank you for your attention and stay safe and stay at home. So in this time, it's a little bit difficult. And yeah, so maybe please try my examples. So and you can give me a feedback if anybody will not work. So but I think everything must work. And we will stay also on the 2.2 version in the next sessions. Because I have seen the certification, as I have mentioned, is now also on the on the official homepage. So the developer certification is as I have mentioned some time, I think the developer certification is cancelled. So it will come when the version 42.2 version is ready. So that will, I think in the beginning of the next year. And also for the administrator certification, but the administrator certification you can do for the version 1.4, 6, I think so. And there will come also an upgrade to this 2.2. And because 2.2 is also a long-time support version. And that's just really interesting when you go into this process to make this certification. Yeah, so that's the reason why we stay on this 2.2 version because of the upcoming certification process. Yes, thank you for your attention and see you next time. Thank you.