LoginServer HTTP-Interface ActionsPage /addToGroup select: on Login Server registered groups with short description if user is already in a group: // check if birth hash and user public key haven't changed call to node server registered with login-server containing current group of user: {"jsonrpc": "2.0", "method": "checkBirthHash", "params": { "groupAlias":, "birthHash": , "pubkey":, "apiKey": }, "id": rand()} Node Server search for birthHash in StateUserChangeGroup transactions in group[groupAlias] if found as last StateUserChangeGroup with birthHash and pubkey are correct: return {"jsonrpc": "2.0", "result": {"state": "success"}, "id": } if not found: check if a StateUserChangeGroup transaction for pubkey can be found if found: return {"jsonrpc": "2.0", "result": {"state": "not same", "msg": "birth hash is different", "details": {"birthHash": }}, "id": } else: return {"jsonrpc": "2.0", "result": {"state": "not found", "msg": "birth hash not found"}, "id": } if birth hash and pubkey from last StateUserChangeGroup not the same: return {"jsonrpc": "2.0", "result": {"state": "not same", "msg": "pubkey is different", "details": {"pubkey":}, "id": } LoginServer cancel process if user is in group and request return not same or not found show error message if user isn't already in a group: // check if birth hash is unique call all registered Nodes: {"jsonrpc": "2.0", "method": "checkBirthHash", "params": { "groupAlias":, "birthHash": , "pubkey":, "apiKey": }, "id": rand()} Node Server getting discovery transaction from mirror node searching for birth hash in global blockchain if found calling model.messages.gradido.DiscoverIfExist.answearUrl with: { "birthHash": model.messages.gradido.DiscoverIfExist.value, "pubkey" : "groupAlias": "received" : } LoginServer Waiting at least 2 minutes for answear(s) collect answears cancel if birthHash was discovered with another pubkey and this has the biggest received value show error message else save group alias as parent If not canceled Hedera::ConsensusService::ConsensusSubmitMessage proto.ConsensusSubmitMessageTransactionBody.topicID = proto.ConsensusSubmitMessageTransactionBody.message = model.messages.gradido.Transaction id = ; received = ; sigMap = model.messages.gradido.SignatureMap if user is group founder: sigPair = model.messages.gradido.SignaturePair pubKey = signature = ed25519 = else sigPair = [ model.messages.gradido.SignaturePair pubKey = signature = ed25519 = for i = 0, i < n, i++ model.messages.gradido.SignaturePair pubKey = signature = ed25519 = , ], txHash = ; bodyBytes = model.messages.gradido.TransactionBody serialized memo = created = model.messages.gradido.TimestampSeconds seconds = data = model.messages.gradido.StateCreateGroup name = alias = parentGroupAlias = hederaTopicId = serialized Node Server(s) receiving message, validate, put into blockchain of group