mychannel failed because of validation of configuration block

Hi, I just did the 2 steps of the video.
export MICROFAB_CONFIG=$(cat microfab.json)
docker run -it -p 8443:8443 -e MICROFAB_CONFIG ibmcom/ibp-microfab

It deploys microfabric in docker but i receive this error message:
[       microfabd] 2023/03/25 00:02:06 Failed to start application: Bad proposal response: status 500, mesage "JoinChain" for channelID = mychannel failed because of validation of configuration block, because of Failed capabilities check: [Application capability V2_5 is required but not supported]

I can see the peers are version 2.4.6 and the HF version is 2.5, but i don't know if it is be the problem or not.
The microfab.json file:
{
    "endorsing_organizations": [
        {
            "name": "org1"
        },
        {
            "name": "org2"
        }
    ],
    "channels": [
        {
            "name": "mychannel",
            "endorsing_organizations": [
                "org1"
            ]
        },
        {
            "name": "appchannel",
            "endorsing_organizations": [
                "org1",
                "org2"
            ]
        }
    ],
    "capability_level": "V2_5"
}

The logs:
[       microfabd] 2023/03/24 23:57:28 Starting Microfab ...
[       microfabd] 2023/03/24 23:57:28 MBW
[       microfabd] 2023/03/24 23:57:28 Creating endorsing organization org2 ...
[       microfabd] 2023/03/24 23:57:28 Creating ordering organization Orderer ...
[       microfabd] 2023/03/24 23:57:28 Creating endorsing organization org1 ...
[       microfabd] 2023/03/24 23:57:28 Created endorsing organization org2
[       microfabd] 2023/03/24 23:57:28 Created ordering organization Orderer
[       microfabd] 2023/03/24 23:57:28 Created endorsing organization org1
[       microfabd] 2023/03/24 23:57:28 Waiting for CouchDB to start ...
[       microfabd] 2023/03/24 23:57:29 CouchDB has started
[       microfabd] 2023/03/24 23:57:29 Creating and starting CA for endorsing organization org2 ...
[       microfabd] 2023/03/24 23:57:29 Creating and starting peer for endorsing organization org1 ...
[       microfabd] 2023/03/24 23:57:29 Creating and starting CA for endorsing organization org1 ...
[       microfabd] 2023/03/24 23:57:29 Creating and starting peer for endorsing organization org2 ...
[       microfabd] 2023/03/24 23:57:29 Creating and starting CouchDB proxy for endorsing organization org2 ...
[start --boot admin:adminpw --ca.certfile /opt/microfab/data/ca-org1/ca-cert.pem --ca.keyfile /opt/microfab/data/ca-org1/ca-key.pem --port 2008 --operations.listenaddress <IP_ADDRESS>:2009 --ca.name org1ca][       microfabd] 2023/03/24 23:57:29 Creating and starting orderer for ordering organization Orderer ...
[       microfabd] 2023/03/24 23:57:29 Creating and starting CouchDB proxy for endorsing organization org1 ...
[start --boot admin:adminpw --ca.certfile /opt/microfab/data/ca-org2/ca-cert.pem --ca.keyfile /opt/microfab/data/ca-org2/ca-key.pem --port 2000 --operations.listenaddress <IP_ADDRESS>:2001 --ca.name org2ca][          org2ca] 2023/03/24 23:57:29 [INFO] Created default configuration file at /opt/microfab/data/ca-org2/fabric-ca-server-config.yaml
[          org1ca] 2023/03/24 23:57:29 [INFO] Created default configuration file at /opt/microfab/data/ca-org1/fabric-ca-server-config.yaml
[        org2peer] 2023-03-24 23:57:29.611 UTC 0001 INFO [nodeCmd] serve -> Starting peer:
[        org2peer]  Version: 2.4.6
[        org2peer]  Commit SHA: 83596078d
[        org2peer]  Go version: go1.18.2
[        org2peer]  OS/Arch: linux/amd64
[        org2peer]  Chaincode:
[        org2peer]   Base Docker Label: org.hyperledger.fabric
[        org2peer]   Docker Namespace: hyperledger
[        org2peer] 2023-03-24 23:57:29.612 UTC 0002 INFO [peer] getLocalAddress -> Auto-detected peer address: <IP_ADDRESS>:2010
[        org2peer] 2023-03-24 23:57:29.612 UTC 0003 INFO [peer] getLocalAddress -> Host is <IP_ADDRESS> , falling back to auto-detected address: <IP_ADDRESS>:2010
[        org2peer] 2023-03-24 23:57:29.614 UTC 0004 INFO [nodeCmd] initGrpcSemaphores -> concurrency limit for endorser service is 2500
[        org2peer] 2023-03-24 23:57:29.614 UTC 0005 INFO [nodeCmd] initGrpcSemaphores -> concurrency limit for deliver service is 2500
[        org2peer] 2023-03-24 23:57:29.614 UTC 0006 INFO [nodeCmd] initGrpcSemaphores -> concurrency limit for gateway service is 500
[        org2peer] 2023-03-24 23:57:29.625 UTC 0007 INFO [certmonitor] trackCertExpiration -> The enrollment certificate will expire on 2033-03-21 23:52:29 +0000 UTC
[         orderer] 2023-03-24 23:57:29.626 UTC 0001 INFO [localconfig] completeInitialization -> Kafka.Version unset, setting to <IP_ADDRESS>
[         orderer] 2023-03-24 23:57:29.627 UTC 0002 INFO [orderer.common.server] prettyPrintStruct -> Orderer config values:
[         orderer] General.ListenAddress = "<IP_ADDRESS>"
[         orderer] General.ListenPort = 2006
[         orderer] General.TLS.Enabled = false
[         orderer] General.TLS.PrivateKey = "/opt/fabric/config/tls/server.key"
[         orderer] General.TLS.Certificate = "/opt/fabric/config/tls/server.crt"
[         orderer] General.TLS.RootCAs = [/opt/fabric/config/tls/ca.crt]
[         orderer] General.TLS.ClientAuthRequired = false
[         orderer] General.TLS.ClientRootCAs = []
[         orderer] General.TLS.TLSHandshakeTimeShift = 0s
[         orderer] General.Cluster.ListenAddress = ""
[         orderer] General.Cluster.ListenPort = 0
[         orderer] General.Cluster.ServerCertificate = ""
[         orderer] General.Cluster.ServerPrivateKey = ""
[         orderer] General.Cluster.ClientCertificate = ""
[         orderer] General.Cluster.ClientPrivateKey = ""
[         orderer] General.Cluster.RootCAs = []
[         orderer] General.Cluster.DialTimeout = 5s
[         orderer] General.Cluster.RPCTimeout = 7s
[         orderer] General.Cluster.ReplicationBufferSize = 20971520
[         orderer] General.Cluster.ReplicationPullTimeout = 5s
[         orderer] General.Cluster.ReplicationRetryTimeout = 5s
[         orderer] General.Cluster.ReplicationBackgroundRefreshInterval = 5m0s
[         orderer] General.Cluster.ReplicationMaxRetries = 12
[         orderer] General.Cluster.SendBufferSize = 10
[         orderer] General.Cluster.CertExpirationWarningThreshold = 168h0m0s
[         orderer] General.Cluster.TLSHandshakeTimeShift = 0s
[         orderer] General.Keepalive.ServerMinInterval = 1m0s
[         orderer] General.Keepalive.ServerInterval = 2h0m0s
[         orderer] General.Keepalive.ServerTimeout = 20s
[         orderer] General.ConnectionTimeout = 0s
[         orderer] General.GenesisMethod = ""
[         orderer] General.GenesisFile = ""
[         orderer] General.BootstrapMethod = "file"
[         orderer] General.BootstrapFile = "/opt/microfab/data/orderer/config/genesisblock"
[         orderer] General.Profile.Enabled = false
[         orderer] General.Profile.Address = "<IP_ADDRESS>:6060"
[         orderer] General.LocalMSPDir = "/opt/microfab/data/orderer/msp"
[         orderer] General.LocalMSPID = "OrdererMSP"
[         orderer] General.BCCSP.Default = "SW"
[         orderer] General.BCCSP.SW.Security = 256
[         orderer] General.BCCSP.SW.Hash = "SHA2"
[         orderer] General.BCCSP.SW.FileKeystore.KeyStorePath = ""
[         orderer] General.Authentication.TimeWindow = 15m0s
[         orderer] General.Authentication.NoExpirationChecks = false
[         orderer] General.MaxRecvMsgSize = 104857600
[         orderer] General.MaxSendMsgSize = 104857600
[         orderer] FileLedger.Location = "/opt/microfab/data/orderer/data"
[         orderer] FileLedger.Prefix = ""
[         orderer] Kafka.Retry.ShortInterval = 5s
[         orderer] Kafka.Retry.ShortTotal = 10m0s
[         orderer] Kafka.Retry.LongInterval = 5m0s
[         orderer] Kafka.Retry.LongTotal = 12h0m0s
[         orderer] Kafka.Retry.NetworkTimeouts.DialTimeout = 10s
[         orderer] Kafka.Retry.NetworkTimeouts.ReadTimeout = 10s
[         orderer] Kafka.Retry.NetworkTimeouts.WriteTimeout = 10s
[         orderer] Kafka.Retry.Metadata.RetryMax = 3
[         orderer] Kafka.Retry.Metadata.RetryBackoff = 250ms
[         orderer] Kafka.Retry.Producer.RetryMax = 3
[         orderer] Kafka.Retry.Producer.RetryBackoff = 100ms
[         orderer] Kafka.Retry.Consumer.RetryBackoff = 2s
[         orderer] Kafka.Verbose = false
[         orderer] Kafka.Version = <IP_ADDRESS>
[         orderer] Kafka.TLS.Enabled = false
[         orderer] Kafka.TLS.PrivateKey = ""
[         orderer] Kafka.TLS.Certificate = ""
[         orderer] Kafka.TLS.RootCAs = []
[         orderer] Kafka.TLS.ClientAuthRequired = false
[         orderer] Kafka.TLS.ClientRootCAs = []
[         orderer] Kafka.TLS.TLSHandshakeTimeShift = 0s
[         orderer] Kafka.SASLPlain.Enabled = false
[         orderer] Kafka.SASLPlain.User = ""
[         orderer] Kafka.SASLPlain.Password = ""
[         orderer] Kafka.Topic.ReplicationFactor = 3
[         orderer] Debug.BroadcastTraceDir = ""
[         orderer] Debug.DeliverTraceDir = ""
[         orderer] Consensus = map[SnapDir:/opt/microfab/data/orderer/data/etcdraft/snapshot WALDir:/opt/microfab/data/orderer/data/etcdraft/wal]
[         orderer] Operations.ListenAddress = "<IP_ADDRESS>:2007"
[         orderer] Operations.TLS.Enabled = false
[         orderer] Operations.TLS.PrivateKey = ""
[         orderer] Operations.TLS.Certificate = ""
[         orderer] Operations.TLS.RootCAs = []
[         orderer] Operations.TLS.ClientAuthRequired = false
[         orderer] Operations.TLS.ClientRootCAs = []
[         orderer] Operations.TLS.TLSHandshakeTimeShift = 0s
[         orderer] Metrics.Provider = "prometheus"
[         orderer] Metrics.Statsd.Network = "udp"
[         orderer] Metrics.Statsd.Address = "<IP_ADDRESS>:8125"
[         orderer] Metrics.Statsd.WriteInterval = 30s
[         orderer] Metrics.Statsd.Prefix = ""
[         orderer] ChannelParticipation.Enabled = false
[         orderer] ChannelParticipation.MaxRequestBodySize = 1048576
[         orderer] Admin.ListenAddress = "<IP_ADDRESS>:9443"
[         orderer] Admin.TLS.Enabled = false
[         orderer] Admin.TLS.PrivateKey = ""
[         orderer] Admin.TLS.Certificate = ""
[         orderer] Admin.TLS.RootCAs = []
[         orderer] Admin.TLS.ClientAuthRequired = true
[         orderer] Admin.TLS.ClientRootCAs = []
[         orderer] Admin.TLS.TLSHandshakeTimeShift = 0s
[        org2peer] 2023-03-24 23:57:29.627 UTC 0008 INFO [ledgermgmt] NewLedgerMgr -> Initializing LedgerMgr
[          org1ca] 2023/03/24 23:57:29 [INFO] Starting server in home directory: /opt/microfab/data/ca-org1
[          org1ca] 2023/03/24 23:57:29 [INFO] Server Version: 1.5.2
[          org1ca] 2023/03/24 23:57:29 [INFO] Server Levels: &{Identity:2 Affiliation:1 Certificate:1 Credential:1 RAInfo:1 Nonce:1}
[          org1ca] 2023/03/24 23:57:29 [INFO] The CA key and certificate files already exist
[          org1ca] 2023/03/24 23:57:29 [INFO] Key file location: /opt/microfab/data/ca-org1/ca-key.pem
[          org1ca] 2023/03/24 23:57:29 [INFO] Certificate file location: /opt/microfab/data/ca-org1/ca-cert.pem
[        org1peer] 2023-03-24 23:57:29.632 UTC 0001 INFO [nodeCmd] serve -> Starting peer:
[        org1peer]  Version: 2.4.6
[        org1peer]  Commit SHA: 83596078d
[        org1peer]  Go version: go1.18.2
[        org1peer]  OS/Arch: linux/amd64
[        org1peer]  Chaincode:
[        org1peer]   Base Docker Label: org.hyperledger.fabric
[        org1peer]   Docker Namespace: hyperledger
[        org1peer] 2023-03-24 23:57:29.633 UTC 0002 INFO [peer] getLocalAddress -> Auto-detected peer address: <IP_ADDRESS>:2002
[        org1peer] 2023-03-24 23:57:29.633 UTC 0003 INFO [peer] getLocalAddress -> Host is <IP_ADDRESS> , falling back to auto-detected address: <IP_ADDRESS>:2002
[        org1peer] 2023-03-24 23:57:29.635 UTC 0004 INFO [nodeCmd] initGrpcSemaphores -> concurrency limit for endorser service is 2500
[        org1peer] 2023-03-24 23:57:29.635 UTC 0005 INFO [nodeCmd] initGrpcSemaphores -> concurrency limit for deliver service is 2500
[        org1peer] 2023-03-24 23:57:29.635 UTC 0006 INFO [nodeCmd] initGrpcSemaphores -> concurrency limit for gateway service is 500
[         orderer] 2023-03-24 23:57:29.641 UTC 0003 INFO [blkstorage] NewProvider -> Creating new file ledger directory at /opt/microfab/data/orderer/data/chains
[         orderer] 2023-03-24 23:57:29.646 UTC 0004 INFO [orderer.common.server] Main -> Bootstrapping the system channel
[         orderer] 2023-03-24 23:57:29.648 UTC 0005 INFO [blkstorage] newBlockfileMgr -> Getting block information from block storage
[          org2ca] 2023/03/24 23:57:29 [INFO] Starting server in home directory: /opt/microfab/data/ca-org2
[          org2ca] 2023/03/24 23:57:29 [INFO] Server Version: 1.5.2
[          org2ca] 2023/03/24 23:57:29 [INFO] Server Levels: &{Identity:2 Affiliation:1 Certificate:1 Credential:1 RAInfo:1 Nonce:1}
[          org2ca] 2023/03/24 23:57:29 [INFO] The CA key and certificate files already exist
[          org2ca] 2023/03/24 23:57:29 [INFO] Key file location: /opt/microfab/data/ca-org2/ca-key.pem
[          org2ca] 2023/03/24 23:57:29 [INFO] Certificate file location: /opt/microfab/data/ca-org2/ca-cert.pem
[         orderer] 2023-03-24 23:57:29.655 UTC 0006 INFO [orderer.common.server] initializeBootstrapChannel -> Initialized the system channel 'testchainid' from bootstrap block
[        org1peer] 2023-03-24 23:57:29.656 UTC 0007 INFO [certmonitor] trackCertExpiration -> The enrollment certificate will expire on 2033-03-21 23:52:29 +0000 UTC
[        org1peer] 2023-03-24 23:57:29.657 UTC 0008 INFO [ledgermgmt] NewLedgerMgr -> Initializing LedgerMgr
[         orderer] 2023-03-24 23:57:29.657 UTC 0007 INFO [orderer.common.server] extractSystemChannel -> Found system channel config block, number: 0
[         orderer] 2023-03-24 23:57:29.657 UTC 0008 INFO [orderer.common.server] selectClusterBootBlock -> Cluster boot block is bootstrap (genesis) block; Blocks Header.Number system-channel=0, bootstrap=0
[         orderer] 2023-03-24 23:57:29.660 UTC 0009 INFO [orderer.common.server] Main -> Starting with system channel: testchainid, consensus type: solo
[         orderer] 2023-03-24 23:57:29.660 UTC 000a INFO [certmonitor] trackCertExpiration -> The enrollment certificate will expire on 2033-03-21 23:52:29 +0000 UTC
[         orderer] 2023-03-24 23:57:29.664 UTC 000b WARN [orderer.consensus.solo] HandleChain -> Use of the Solo orderer is deprecated and remains only for use in test environments but may be removed in the future.
[         orderer] 2023-03-24 23:57:29.664 UTC 000c INFO [orderer.commmon.multichannel] initSystemChannel -> Starting system channel 'testchainid' with genesis block hash a8ac54659e19a02b76f2f7376f78f58afc12f8132cb535023247d9f06a72701b and orderer type solo
[         orderer] 2023-03-24 23:57:29.665 UTC 000d INFO [orderer.common.server] Main -> Starting orderer:
[         orderer]  Version: 2.4.6
[         orderer]  Commit SHA: 83596078d
[         orderer]  Go version: go1.18.2
[         orderer]  OS/Arch: linux/amd64
[         orderer] 2023-03-24 23:57:29.665 UTC 000e INFO [orderer.common.server] Main -> Beginning to serve requests
[        org2peer] 2023-03-24 23:57:29.667 UTC 0009 INFO [leveldbhelper] openDBAndCheckFormat -> DB is empty Setting db format as 2.0
[        org2peer] 2023-03-24 23:57:29.668 UTC 000a INFO [blkstorage] NewProvider -> Creating new file ledger directory at /opt/microfab/data/peer-org2/data/ledgersData/chains/chains
[        org1peer] 2023-03-24 23:57:29.680 UTC 0009 INFO [leveldbhelper] openDBAndCheckFormat -> DB is empty Setting db format as 2.0
[        org1peer] 2023-03-24 23:57:29.681 UTC 000a INFO [blkstorage] NewProvider -> Creating new file ledger directory at /opt/microfab/data/peer-org1/data/ledgersData/chains/chains
[        org2peer] 2023-03-24 23:57:29.682 UTC 000b INFO [leveldbhelper] openDBAndCheckFormat -> DB is empty Setting db format as 2.0
[        org1peer] 2023-03-24 23:57:29.692 UTC 000b INFO [leveldbhelper] openDBAndCheckFormat -> DB is empty Setting db format as 2.0
[          org1ca] 2023/03/24 23:57:29 [INFO] Initialized sqlite3 database at /opt/microfab/data/ca-org1/fabric-ca-server.db
[          org2ca] 2023/03/24 23:57:29 [INFO] Initialized sqlite3 database at /opt/microfab/data/ca-org2/fabric-ca-server.db
[          org1ca] 2023/03/24 23:57:29 [INFO] The issuer key was successfully stored. The public key is at: /opt/microfab/data/ca-org1/IssuerPublicKey, secret key is at: /opt/microfab/data/ca-org1/msp/keystore/IssuerSecretKey
[        org2peer] 2023-03-24 23:57:29.795 UTC 000c INFO [couchdb] createDatabaseIfNotExist -> Created state database fabric__internal
[          org1ca] 2023/03/24 23:57:29 [INFO] Idemix issuer revocation public and secret keys were generated for CA 'org1ca'
[          org1ca] 2023/03/24 23:57:29 [INFO] The revocation key was successfully stored. The public key is at: /opt/microfab/data/ca-org1/IssuerRevocationPublicKey, private key is at: /opt/microfab/data/ca-org1/msp/keystore/IssuerRevocationPrivateKey
[          org1ca] 2023/03/24 23:57:29 [INFO] Home directory for default CA: /opt/microfab/data/ca-org1
[          org1ca] 2023/03/24 23:57:29 [INFO] Operation Server Listening on [::]:2009
[          org1ca] 2023/03/24 23:57:29 [INFO] Listening on http://<IP_ADDRESS>:2008
[        org1peer] 2023-03-24 23:57:29.813 UTC 000c INFO [couchdb] createDatabaseIfNotExist -> Created state database fabric__internal
2023/03/24 23:57:29 error waiting for CA: Get "http://localhost:2001/healthz": dial tcp <IP_ADDRESS>:2001: connect: connection refused
[       microfabd] 2023/03/24 23:57:29 Created and started orderer for ordering organization Orderer
[          org2ca] 2023/03/24 23:57:29 [INFO] The issuer key was successfully stored. The public key is at: /opt/microfab/data/ca-org2/IssuerPublicKey, secret key is at: /opt/microfab/data/ca-org2/msp/keystore/IssuerSecretKey
[          org2ca] 2023/03/24 23:57:29 [INFO] Idemix issuer revocation public and secret keys were generated for CA 'org2ca'
[          org2ca] 2023/03/24 23:57:29 [INFO] The revocation key was successfully stored. The public key is at: /opt/microfab/data/ca-org2/IssuerRevocationPublicKey, private key is at: /opt/microfab/data/ca-org2/msp/keystore/IssuerRevocationPrivateKey
[          org2ca] 2023/03/24 23:57:29 [INFO] Home directory for default CA: /opt/microfab/data/ca-org2
[          org2ca] 2023/03/24 23:57:29 [INFO] Operation Server Listening on [::]:2001
[          org2ca] 2023/03/24 23:57:29 [INFO] Listening on http://<IP_ADDRESS>:2000
[        org1peer] 2023-03-24 23:57:29.848 UTC 000d INFO [ledgermgmt] NewLedgerMgr -> Initialized LedgerMgr
[        org1peer] 2023-03-24 23:57:29.848 UTC 000e INFO [gossip.service] New -> Initialize gossip with endpoint org1peer-api.127-0-0-1.nip.io:8080
[        org1peer] 2023-03-24 23:57:29.850 UTC 000f INFO [gossip.gossip] New -> Creating gossip service with self membership of Endpoint: org1peer-api.127-0-0-1.nip.io:8080, InternalEndpoint: org1peer-api.127-0-0-1.nip.io:8080, PKI-ID: abd5731068457fd18882734975f5a4f1d9ea8a01c2825246f7a7bf76032de1d2, Metadata:
[        org1peer] 2023-03-24 23:57:29.850 UTC 0010 INFO [gossip.gossip] start -> Gossip instance org1peer-api.127-0-0-1.nip.io:8080 started
[        org1peer] 2023-03-24 23:57:29.850 UTC 0011 INFO [lifecycle] InitializeLocalChaincodes -> Initialized lifecycle cache with 0 already installed chaincodes
[        org1peer] 2023-03-24 23:57:29.851 UTC 0012 INFO [nodeCmd] computeChaincodeEndpoint -> Entering computeChaincodeEndpoint with peerHostname: <IP_ADDRESS>
[        org1peer] 2023-03-24 23:57:29.851 UTC 0013 INFO [nodeCmd] computeChaincodeEndpoint -> Exit with ccEndpoint: <IP_ADDRESS>:2003
[        org1peer] 2023-03-24 23:57:29.852 UTC 0014 INFO [sccapi] DeploySysCC -> deploying system chaincode 'lscc'
[        org1peer] 2023-03-24 23:57:29.852 UTC 0015 INFO [sccapi] DeploySysCC -> deploying system chaincode 'cscc'
[        org1peer] 2023-03-24 23:57:29.852 UTC 0016 INFO [sccapi] DeploySysCC -> deploying system chaincode 'qscc'
[        org1peer] 2023-03-24 23:57:29.852 UTC 0017 INFO [sccapi] DeploySysCC -> deploying system chaincode '_lifecycle'
[        org1peer] 2023-03-24 23:57:29.852 UTC 0018 INFO [nodeCmd] serve -> Deployed system chaincodes
[        org1peer] 2023-03-24 23:57:29.853 UTC 0019 INFO [discovery] NewService -> Created with config TLS: false, authCacheMaxSize: 1000, authCachePurgeRatio: 0.750000
[        org1peer] 2023-03-24 23:57:29.853 UTC 001a INFO [nodeCmd] serve -> Discovery service activated
[        org1peer] 2023-03-24 23:57:29.853 UTC 001b INFO [nodeCmd] serve -> Starting peer with Gateway enabled
[        org1peer] 2023-03-24 23:57:29.853 UTC 001c INFO [nodeCmd] serve -> Starting peer with ID=[org1peer], network ID=[dev], address=[<IP_ADDRESS>:2002]
[        org1peer] 2023-03-24 23:57:29.854 UTC 001d INFO [nodeCmd] serve -> Started peer with ID=[org1peer], network ID=[dev], address=[<IP_ADDRESS>:2002]
[        org1peer] 2023-03-24 23:57:29.854 UTC 001e INFO [kvledger] LoadPreResetHeight -> Loading prereset height from path [/opt/microfab/data/peer-org1/data/ledgersData/chains]
[        org1peer] 2023-03-24 23:57:29.854 UTC 001f INFO [blkstorage] preResetHtFiles -> No active channels passed
[        org2peer] 2023-03-24 23:57:29.855 UTC 000d INFO [ledgermgmt] NewLedgerMgr -> Initialized LedgerMgr
[        org2peer] 2023-03-24 23:57:29.856 UTC 000e INFO [gossip.service] New -> Initialize gossip with endpoint org2peer-api.127-0-0-1.nip.io:8080
[        org2peer] 2023-03-24 23:57:29.857 UTC 000f INFO [gossip.gossip] New -> Creating gossip service with self membership of Endpoint: org2peer-api.127-0-0-1.nip.io:8080, InternalEndpoint: org2peer-api.127-0-0-1.nip.io:8080, PKI-ID: 8970a1058406c79adeb8bb4634f16898cd065c8f9386821386e27951f012cec5, Metadata:
[        org2peer] 2023-03-24 23:57:29.857 UTC 0010 INFO [lifecycle] InitializeLocalChaincodes -> Initialized lifecycle cache with 0 already installed chaincodes
[        org2peer] 2023-03-24 23:57:29.857 UTC 0011 INFO [gossip.gossip] start -> Gossip instance org2peer-api.127-0-0-1.nip.io:8080 started
[        org2peer] 2023-03-24 23:57:29.858 UTC 0012 INFO [nodeCmd] computeChaincodeEndpoint -> Entering computeChaincodeEndpoint with peerHostname: <IP_ADDRESS>
[        org2peer] 2023-03-24 23:57:29.858 UTC 0013 INFO [nodeCmd] computeChaincodeEndpoint -> Exit with ccEndpoint: <IP_ADDRESS>:2011
[        org2peer] 2023-03-24 23:57:29.859 UTC 0014 INFO [sccapi] DeploySysCC -> deploying system chaincode 'lscc'
[        org2peer] 2023-03-24 23:57:29.859 UTC 0015 INFO [sccapi] DeploySysCC -> deploying system chaincode 'cscc'
[        org2peer] 2023-03-24 23:57:29.859 UTC 0016 INFO [sccapi] DeploySysCC -> deploying system chaincode 'qscc'
[        org2peer] 2023-03-24 23:57:29.859 UTC 0017 INFO [sccapi] DeploySysCC -> deploying system chaincode '_lifecycle'
[        org2peer] 2023-03-24 23:57:29.860 UTC 0018 INFO [nodeCmd] serve -> Deployed system chaincodes
[        org2peer] 2023-03-24 23:57:29.860 UTC 0019 INFO [discovery] NewService -> Created with config TLS: false, authCacheMaxSize: 1000, authCachePurgeRatio: 0.750000
[        org2peer] 2023-03-24 23:57:29.860 UTC 001a INFO [nodeCmd] serve -> Discovery service activated
[        org2peer] 2023-03-24 23:57:29.860 UTC 001b INFO [nodeCmd] serve -> Starting peer with Gateway enabled
[        org2peer] 2023-03-24 23:57:29.860 UTC 001c INFO [nodeCmd] serve -> Starting peer with ID=[org2peer], network ID=[dev], address=[<IP_ADDRESS>:2010]
[        org2peer] 2023-03-24 23:57:29.861 UTC 001d INFO [nodeCmd] serve -> Started peer with ID=[org2peer], network ID=[dev], address=[<IP_ADDRESS>:2010]
[        org2peer] 2023-03-24 23:57:29.861 UTC 001e INFO [kvledger] LoadPreResetHeight -> Loading prereset height from path [/opt/microfab/data/peer-org2/data/ledgersData/chains]
[        org2peer] 2023-03-24 23:57:29.861 UTC 001f INFO [blkstorage] preResetHtFiles -> No active channels passed
[          org1ca] 2023/03/24 23:57:29 [INFO] signed certificate with serial number<PHONE_NUMBER>55986515017697760212623208023948844711
[          org1ca] 2023/03/24 23:57:29 [INFO] <IP_ADDRESS>:36168 POST /enroll 201 0 "OK"
[       microfabd] 2023/03/24 23:57:29 Created and started CA for endorsing organization org1
[        org1peer] 2023-03-24 23:57:30.056 UTC 0020 INFO [endorser] callChaincode -> finished chaincode: cscc duration: 0ms channel= txID=b9e4324f
[        org1peer] 2023-03-24 23:57:30.056 UTC 0021 INFO [comm.grpc.server] 1 -> unary call completed grpc.service=protos.Endorser grpc.method=ProcessProposal grpc.request_deadline=2023-03-24T23:58:00.054Z grpc.peer_address=<IP_ADDRESS>:35072 grpc.code=OK grpc.call_duration=1.041091ms
[       microfabd] 2023/03/24 23:57:30 Created and started peer for endorsing organization org1
[        org2peer] 2023-03-24 23:57:30.060 UTC 0020 INFO [endorser] callChaincode -> finished chaincode: cscc duration: 0ms channel= txID=62debcb1
[        org2peer] 2023-03-24 23:57:30.060 UTC 0021 INFO [comm.grpc.server] 1 -> unary call completed grpc.service=protos.Endorser grpc.method=ProcessProposal grpc.request_deadline=2023-03-24T23:58:00.058Z grpc.peer_address=<IP_ADDRESS>:40956 grpc.code=OK grpc.call_duration=998.981µs
[       microfabd] 2023/03/24 23:57:30 Created and started peer for endorsing organization org2
[          org2ca] 2023/03/24 23:57:30 [INFO] signed certificate with serial number<PHONE_NUMBER>08801448306522366253249120396438221185
[          org2ca] 2023/03/24 23:57:30 [INFO] <IP_ADDRESS>:47344 POST /enroll 201 0 "OK"
[       microfabd] 2023/03/24 23:57:30 Created and started CA for endorsing organization org2
[       microfabd] 2023/03/24 23:57:30 Creating and starting console ...
[         console] 2023/03/24 23:57:30 Created new console...
[         console] 2023/03/24 23:57:30 [mbw] RegisterOrganization &{Orderer 0xc000195980 0xc0005ccf60 <nil> OrdererMSP}
[         console] 2023/03/24 23:57:30 [mbw] RegisterOrganization &{org1 0xc000609200 0xc00014a510 0xc0000437a0 org1MSP}
[         console] 2023/03/24 23:57:30 [mbw] RegisterOrganization &{org2 0xc000043aa0 0xc0000d2db0 0xc000330810 org2MSP}
[       microfabd] 2023/03/24 23:57:30 Created and started console
[       microfabd] 2023/03/24 23:57:30 Creating and starting proxy ...
[       microfabd] 2023/03/24 23:57:30 Created and started proxy
[       microfabd] 2023/03/24 23:57:30 Creating and joining channel appchannel ...
[       microfabd] 2023/03/24 23:57:30 Creating channel appchannel ...
[       microfabd] 2023/03/24 23:57:30 Creating and joining channel mychannel ...
[       microfabd] 2023/03/24 23:57:30 Creating channel mychannel ...
[         orderer] 2023-03-24 23:57:30.139 UTC 000f INFO [comm.grpc.server] 1 -> streaming call completed grpc.service=orderer.AtomicBroadcast grpc.method=Broadcast grpc.request_deadline=2023-03-24T23:58:00.128Z grpc.peer_address=<IP_ADDRESS>:50966 grpc.code=OK grpc.call_duration=9.430271ms
[         orderer] 2023-03-24 23:57:30.141 UTC 0010 INFO [blkstorage] newBlockfileMgr -> Getting block information from block storage
[         orderer] 2023-03-24 23:57:30.144 UTC 0011 WARN [orderer.consensus.solo] HandleChain -> Use of the Solo orderer is deprecated and remains only for use in test environments but may be removed in the future.
[         orderer] 2023-03-24 23:57:30.144 UTC 0012 INFO [orderer.commmon.multichannel] newChain -> Created and started new channel appchannel
[         orderer] 2023-03-24 23:57:30.147 UTC 0013 INFO [comm.grpc.server] 1 -> streaming call completed grpc.service=orderer.AtomicBroadcast grpc.method=Deliver grpc.request_deadline=2023-03-24T23:58:00.139Z grpc.peer_address=<IP_ADDRESS>:50966 grpc.code=OK grpc.call_duration=7.339773ms
[         orderer] 2023-03-24 23:57:30.147 UTC 0014 INFO [comm.grpc.server] 1 -> streaming call completed grpc.service=orderer.AtomicBroadcast grpc.method=Broadcast grpc.request_deadline=2023-03-24T23:58:00.132Z grpc.peer_address=<IP_ADDRESS>:50968 grpc.code=OK grpc.call_duration=14.46761ms
[         orderer] 2023-03-24 23:57:30.150 UTC 0015 INFO [blkstorage] newBlockfileMgr -> Getting block information from block storage
[         orderer] 2023-03-24 23:57:30.153 UTC 0016 WARN [orderer.consensus.solo] HandleChain -> Use of the Solo orderer is deprecated and remains only for use in test environments but may be removed in the future.
[         orderer] 2023-03-24 23:57:30.153 UTC 0017 INFO [orderer.commmon.multichannel] newChain -> Created and started new channel mychannel
[         orderer] 2023-03-24 23:57:30.155 UTC 0018 INFO [comm.grpc.server] 1 -> streaming call completed grpc.service=orderer.AtomicBroadcast grpc.method=Deliver grpc.request_deadline=2023-03-24T23:58:00.148Z grpc.peer_address=<IP_ADDRESS>:50968 grpc.code=OK grpc.call_duration=6.172855ms
[         orderer] 2023-03-24 23:57:30.154 UTC 0019 INFO [comm.grpc.server] 1 -> streaming call completed grpc.service=orderer.AtomicBroadcast grpc.method=Deliver grpc.request_deadline=2023-03-24T23:58:00.148Z grpc.peer_address=<IP_ADDRESS>:50966 grpc.code=OK grpc.call_duration=5.881974ms
[         orderer] 2023-03-24 23:57:30.157 UTC 001a INFO [comm.grpc.server] 1 -> streaming call completed grpc.service=orderer.AtomicBroadcast grpc.method=Deliver grpc.request_deadline=2023-03-24T23:58:00.156Z grpc.peer_address=<IP_ADDRESS>:50968 grpc.code=OK grpc.call_duration=463.633µs
[         orderer] 2023-03-24 23:57:30.157 UTC 001b INFO [comm.grpc.server] 1 -> streaming call completed grpc.service=orderer.AtomicBroadcast grpc.method=Deliver grpc.request_deadline=2023-03-24T23:58:00.155Z grpc.peer_address=<IP_ADDRESS>:50966 grpc.code=OK grpc.call_duration=1.095815ms
[         orderer] 2023-03-24 23:57:30.159 UTC 001c INFO [comm.grpc.server] 1 -> streaming call completed grpc.service=orderer.AtomicBroadcast grpc.method=Deliver grpc.request_deadline=2023-03-24T23:58:00.158Z grpc.peer_address=<IP_ADDRESS>:50968 grpc.code=OK grpc.call_duration=388.713µs
[         orderer] 2023-03-24 23:57:30.165 UTC 001d INFO [comm.grpc.server] 1 -> streaming call completed grpc.service=orderer.AtomicBroadcast grpc.method=Broadcast grpc.request_deadline=2023-03-24T23:58:00.158Z grpc.peer_address=<IP_ADDRESS>:50966 grpc.code=OK grpc.call_duration=7.310914ms
[       microfabd] 2023/03/24 23:57:30 Created channel appchannel
[       microfabd] 2023/03/24 23:57:30 Joining channel appchannel on peer for endorsing organization org2 ...
[       microfabd] 2023/03/24 23:57:30 Joining channel appchannel on peer for endorsing organization org1 ...
[         orderer] 2023-03-24 23:57:30.168 UTC 001e INFO [comm.grpc.server] 1 -> streaming call completed grpc.service=orderer.AtomicBroadcast grpc.method=Broadcast grpc.request_deadline=2023-03-24T23:58:00.16Z grpc.peer_address=<IP_ADDRESS>:50968 grpc.code=OK grpc.call_duration=8.303099ms
[        org2peer] 2023-03-24 23:57:30.169 UTC 0022 INFO [endorser] callChaincode -> finished chaincode: cscc duration: 1ms channel= txID=3477ac1b
[        org2peer] 2023-03-24 23:57:30.169 UTC 0023 INFO [comm.grpc.server] 1 -> unary call completed grpc.service=protos.Endorser grpc.method=ProcessProposal grpc.request_deadline=2023-03-24T23:58:00.167Z grpc.peer_address=<IP_ADDRESS>:40958 grpc.code=OK grpc.call_duration=2.503196ms
[        org1peer] 2023-03-24 23:57:30.170 UTC 0022 INFO [endorser] callChaincode -> finished chaincode: cscc duration: 2ms channel= txID=3402c141
[        org1peer] 2023-03-24 23:57:30.170 UTC 0023 INFO [comm.grpc.server] 1 -> unary call completed grpc.service=protos.Endorser grpc.method=ProcessProposal grpc.request_deadline=2023-03-24T23:58:00.167Z grpc.peer_address=<IP_ADDRESS>:35074 grpc.code=OK grpc.call_duration=2.77791ms
[       microfabd] 2023/03/24 23:57:30 Created channel mychannel
[       microfabd] 2023/03/24 23:57:30 Joining channel mychannel on peer for endorsing organization org1 ...
[        org1peer] 2023-03-24 23:57:30.174 UTC 0024 INFO [endorser] callChaincode -> finished chaincode: cscc duration: 2ms channel= txID=2e5ecfc0
[        org1peer] 2023-03-24 23:57:30.174 UTC 0025 INFO [comm.grpc.server] 1 -> unary call completed grpc.service=protos.Endorser grpc.method=ProcessProposal grpc.request_deadline=2023-03-24T23:58:00.171Z grpc.peer_address=<IP_ADDRESS>:35074 grpc.code=OK grpc.call_duration=2.707119ms
[       microfabd] 2023/03/24 23:57:30 Failed to start application: Bad proposal response: status 500, mesage "JoinChain" for channelID = appchannel failed because of validation of configuration block, because of Failed capabilities check: [Application capability V2_5 is required but not supported]
[       microfabd] 2023/03/25 00:02:04 Starting Microfab ...
[       microfabd] 2023/03/25 00:02:04 MBW
[       microfabd] 2023/03/25 00:02:04 Creating endorsing organization org2 ...
[       microfabd] 2023/03/25 00:02:04 Creating ordering organization Orderer ...
[       microfabd] 2023/03/25 00:02:04 Creating endorsing organization org1 ...
[       microfabd] 2023/03/25 00:02:05 Created endorsing organization org2
[       microfabd] 2023/03/25 00:02:05 Created ordering organization Orderer
[       microfabd] 2023/03/25 00:02:05 Created endorsing organization org1
[       microfabd] 2023/03/25 00:02:05 Waiting for CouchDB to start ...
[       microfabd] 2023/03/25 00:02:05 CouchDB has started
[       microfabd] 2023/03/25 00:02:05 Creating and starting CA for endorsing organization org2 ...
[start --boot admin:adminpw --ca.certfile /opt/microfab/data/ca-org2/ca-cert.pem --ca.keyfile /opt/microfab/data/ca-org2/ca-key.pem --port 2000 --operations.listenaddress <IP_ADDRESS>:2001 --ca.name org2ca][       microfabd] 2023/03/25 00:02:05 Creating and starting orderer for ordering organization Orderer ...
[       microfabd] 2023/03/25 00:02:05 Creating and starting peer for endorsing organization org2 ...
[       microfabd] 2023/03/25 00:02:05 Creating and starting CA for endorsing organization org1 ...
[       microfabd] 2023/03/25 00:02:05 Creating and starting peer for endorsing organization org1 ...
[start --boot admin:adminpw --ca.certfile /opt/microfab/data/ca-org1/ca-cert.pem --ca.keyfile /opt/microfab/data/ca-org1/ca-key.pem --port 2008 --operations.listenaddress <IP_ADDRESS>:2009 --ca.name org1ca][       microfabd] 2023/03/25 00:02:05 Creating and starting CouchDB proxy for endorsing organization org1 ...
[       microfabd] 2023/03/25 00:02:05 Creating and starting CouchDB proxy for endorsing organization org2 ...
[          org2ca] 2023/03/25 00:02:05 [INFO] Created default configuration file at /opt/microfab/data/ca-org2/fabric-ca-server-config.yaml
[          org1ca] 2023/03/25 00:02:05 [INFO] Created default configuration file at /opt/microfab/data/ca-org1/fabric-ca-server-config.yaml
[          org2ca] 2023/03/25 00:02:05 [INFO] Starting server in home directory: /opt/microfab/data/ca-org2
[          org2ca] 2023/03/25 00:02:05 [INFO] Server Version: 1.5.2
[          org2ca] 2023/03/25 00:02:05 [INFO] Server Levels: &{Identity:2 Affiliation:1 Certificate:1 Credential:1 RAInfo:1 Nonce:1}
[          org2ca] 2023/03/25 00:02:05 [INFO] The CA key and certificate files already exist
[          org2ca] 2023/03/25 00:02:05 [INFO] Key file location: /opt/microfab/data/ca-org2/ca-key.pem
[          org2ca] 2023/03/25 00:02:05 [INFO] Certificate file location: /opt/microfab/data/ca-org2/ca-cert.pem
[         orderer] 2023-03-25 00:02:05.609 UTC 0001 INFO [localconfig] completeInitialization -> Kafka.Version unset, setting to <IP_ADDRESS>
[         orderer] 2023-03-25 00:02:05.610 UTC 0002 INFO [orderer.common.server] prettyPrintStruct -> Orderer config values:
[         orderer] General.ListenAddress = "<IP_ADDRESS>"
[         orderer] General.ListenPort = 2002
[         orderer] General.TLS.Enabled = false
[         orderer] General.TLS.PrivateKey = "/opt/fabric/config/tls/server.key"
[         orderer] General.TLS.Certificate = "/opt/fabric/config/tls/server.crt"
[         orderer] General.TLS.RootCAs = [/opt/fabric/config/tls/ca.crt]
[         orderer] General.TLS.ClientAuthRequired = false
[         orderer] General.TLS.ClientRootCAs = []
[         orderer] General.TLS.TLSHandshakeTimeShift = 0s
[         orderer] General.Cluster.ListenAddress = ""
[         orderer] General.Cluster.ListenPort = 0
[         orderer] General.Cluster.ServerCertificate = ""
[         orderer] General.Cluster.ServerPrivateKey = ""
[         orderer] General.Cluster.ClientCertificate = ""
[         orderer] General.Cluster.ClientPrivateKey = ""
[         orderer] General.Cluster.RootCAs = []
[         orderer] General.Cluster.DialTimeout = 5s
[         orderer] General.Cluster.RPCTimeout = 7s
[         orderer] General.Cluster.ReplicationBufferSize = 20971520
[         orderer] General.Cluster.ReplicationPullTimeout = 5s
[         orderer] General.Cluster.ReplicationRetryTimeout = 5s
[         orderer] General.Cluster.ReplicationBackgroundRefreshInterval = 5m0s
[         orderer] General.Cluster.ReplicationMaxRetries = 12
[         orderer] General.Cluster.SendBufferSize = 10
[         orderer] General.Cluster.CertExpirationWarningThreshold = 168h0m0s
[         orderer] General.Cluster.TLSHandshakeTimeShift = 0s
[         orderer] General.Keepalive.ServerMinInterval = 1m0s
[         orderer] General.Keepalive.ServerInterval = 2h0m0s
[         orderer] General.Keepalive.ServerTimeout = 20s
[         orderer] General.ConnectionTimeout = 0s
[         orderer] General.GenesisMethod = ""
[         orderer] General.GenesisFile = ""
[         orderer] General.BootstrapMethod = "file"
[         orderer] General.BootstrapFile = "/opt/microfab/data/orderer/config/genesisblock"
[         orderer] General.Profile.Enabled = false
[         orderer] General.Profile.Address = "<IP_ADDRESS>:6060"
[         orderer] General.LocalMSPDir = "/opt/microfab/data/orderer/msp"
[         orderer] General.LocalMSPID = "OrdererMSP"
[         orderer] General.BCCSP.Default = "SW"
[         orderer] General.BCCSP.SW.Security = 256
[         orderer] General.BCCSP.SW.Hash = "SHA2"
[         orderer] General.BCCSP.SW.FileKeystore.KeyStorePath = ""
[         orderer] General.Authentication.TimeWindow = 15m0s
[         orderer] General.Authentication.NoExpirationChecks = false
[         orderer] General.MaxRecvMsgSize = 104857600
[         orderer] General.MaxSendMsgSize = 104857600
[         orderer] FileLedger.Location = "/opt/microfab/data/orderer/data"
[         orderer] FileLedger.Prefix = ""
[         orderer] Kafka.Retry.ShortInterval = 5s
[         orderer] Kafka.Retry.ShortTotal = 10m0s
[         orderer] Kafka.Retry.LongInterval = 5m0s
[         orderer] Kafka.Retry.LongTotal = 12h0m0s
[         orderer] Kafka.Retry.NetworkTimeouts.DialTimeout = 10s
[         orderer] Kafka.Retry.NetworkTimeouts.ReadTimeout = 10s
[         orderer] Kafka.Retry.NetworkTimeouts.WriteTimeout = 10s
[         orderer] Kafka.Retry.Metadata.RetryMax = 3
[         orderer] Kafka.Retry.Metadata.RetryBackoff = 250ms
[         orderer] Kafka.Retry.Producer.RetryMax = 3
[         orderer] Kafka.Retry.Producer.RetryBackoff = 100ms
[         orderer] Kafka.Retry.Consumer.RetryBackoff = 2s
[         orderer] Kafka.Verbose = false
[         orderer] Kafka.Version = <IP_ADDRESS>
[         orderer] Kafka.TLS.Enabled = false
[         orderer] Kafka.TLS.PrivateKey = ""
[         orderer] Kafka.TLS.Certificate = ""
[         orderer] Kafka.TLS.RootCAs = []
[         orderer] Kafka.TLS.ClientAuthRequired = false
[         orderer] Kafka.TLS.ClientRootCAs = []
[         orderer] Kafka.TLS.TLSHandshakeTimeShift = 0s
[         orderer] Kafka.SASLPlain.Enabled = false
[         orderer] Kafka.SASLPlain.User = ""
[         orderer] Kafka.SASLPlain.Password = ""
[         orderer] Kafka.Topic.ReplicationFactor = 3
[         orderer] Debug.BroadcastTraceDir = ""
[         orderer] Debug.DeliverTraceDir = ""
[         orderer] Consensus = map[SnapDir:/opt/microfab/data/orderer/data/etcdraft/snapshot WALDir:/opt/microfab/data/orderer/data/etcdraft/wal]
[         orderer] Operations.ListenAddress = "<IP_ADDRESS>:2003"
[         orderer] Operations.TLS.Enabled = false
[         orderer] Operations.TLS.PrivateKey = ""
[         orderer] Operations.TLS.Certificate = ""
[         orderer] Operations.TLS.RootCAs = []
[         orderer] Operations.TLS.ClientAuthRequired = false
[         orderer] Operations.TLS.ClientRootCAs = []
[         orderer] Operations.TLS.TLSHandshakeTimeShift = 0s
[         orderer] Metrics.Provider = "prometheus"
[         orderer] Metrics.Statsd.Network = "udp"
[         orderer] Metrics.Statsd.Address = "<IP_ADDRESS>:8125"
[         orderer] Metrics.Statsd.WriteInterval = 30s
[         orderer] Metrics.Statsd.Prefix = ""
[         orderer] ChannelParticipation.Enabled = false
[         orderer] ChannelParticipation.MaxRequestBodySize = 1048576
[         orderer] Admin.ListenAddress = "<IP_ADDRESS>:9443"
[         orderer] Admin.TLS.Enabled = false
[         orderer] Admin.TLS.PrivateKey = ""
[         orderer] Admin.TLS.Certificate = ""
[         orderer] Admin.TLS.RootCAs = []
[         orderer] Admin.TLS.ClientAuthRequired = true
[         orderer] Admin.TLS.ClientRootCAs = []
[         orderer] Admin.TLS.TLSHandshakeTimeShift = 0s
[          org1ca] 2023/03/25 00:02:05 [INFO] Starting server in home directory: /opt/microfab/data/ca-org1
[          org1ca] 2023/03/25 00:02:05 [INFO] Server Version: 1.5.2
[          org1ca] 2023/03/25 00:02:05 [INFO] Server Levels: &{Identity:2 Affiliation:1 Certificate:1 Credential:1 RAInfo:1 Nonce:1}
[        org2peer] 2023-03-25 00:02:05.618 UTC 0001 INFO [nodeCmd] serve -> Starting peer:
[        org2peer]  Version: 2.4.6
[        org2peer]  Commit SHA: 83596078d
[        org2peer]  Go version: go1.18.2
[        org2peer]  OS/Arch: linux/amd64
[        org2peer]  Chaincode:
[        org2peer]   Base Docker Label: org.hyperledger.fabric
[        org2peer]   Docker Namespace: hyperledger
[        org2peer] 2023-03-25 00:02:05.618 UTC 0002 INFO [peer] getLocalAddress -> Auto-detected peer address: <IP_ADDRESS>:2004
[        org2peer] 2023-03-25 00:02:05.618 UTC 0003 INFO [peer] getLocalAddress -> Host is <IP_ADDRESS> , falling back to auto-detected address: <IP_ADDRESS>:2004
[        org2peer] 2023-03-25 00:02:05.619 UTC 0004 INFO [nodeCmd] initGrpcSemaphores -> concurrency limit for endorser service is 2500
[        org2peer] 2023-03-25 00:02:05.619 UTC 0005 INFO [nodeCmd] initGrpcSemaphores -> concurrency limit for deliver service is 2500
[        org2peer] 2023-03-25 00:02:05.620 UTC 0006 INFO [nodeCmd] initGrpcSemaphores -> concurrency limit for gateway service is 500
[         orderer] 2023-03-25 00:02:05.620 UTC 0003 INFO [blkstorage] NewProvider -> Creating new file ledger directory at /opt/microfab/data/orderer/data/chains
[          org1ca] 2023/03/25 00:02:05 [INFO] The CA key and certificate files already exist
[          org1ca] 2023/03/25 00:02:05 [INFO] Key file location: /opt/microfab/data/ca-org1/ca-key.pem
[          org1ca] 2023/03/25 00:02:05 [INFO] Certificate file location: /opt/microfab/data/ca-org1/ca-cert.pem
[         orderer] 2023-03-25 00:02:05.625 UTC 0004 INFO [orderer.common.server] Main -> Bootstrapping the system channel
[         orderer] 2023-03-25 00:02:05.626 UTC 0005 INFO [blkstorage] newBlockfileMgr -> Getting block information from block storage
[         orderer] 2023-03-25 00:02:05.630 UTC 0006 INFO [orderer.common.server] initializeBootstrapChannel -> Initialized the system channel 'testchainid' from bootstrap block
[         orderer] 2023-03-25 00:02:05.633 UTC 0007 INFO [orderer.common.server] extractSystemChannel -> Found system channel config block, number: 0
[         orderer] 2023-03-25 00:02:05.633 UTC 0008 INFO [orderer.common.server] selectClusterBootBlock -> Cluster boot block is bootstrap (genesis) block; Blocks Header.Number system-channel=0, bootstrap=0
[        org2peer] 2023-03-25 00:02:05.635 UTC 0007 INFO [certmonitor] trackCertExpiration -> The enrollment certificate will expire on 2033-03-21 23:57:05 +0000 UTC
[         orderer] 2023-03-25 00:02:05.635 UTC 0009 INFO [orderer.common.server] Main -> Starting with system channel: testchainid, consensus type: solo
[         orderer] 2023-03-25 00:02:05.635 UTC 000a INFO [certmonitor] trackCertExpiration -> The enrollment certificate will expire on 2033-03-21 23:57:05 +0000 UTC
[        org2peer] 2023-03-25 00:02:05.636 UTC 0008 INFO [ledgermgmt] NewLedgerMgr -> Initializing LedgerMgr
[         orderer] 2023-03-25 00:02:05.641 UTC 000b WARN [orderer.consensus.solo] HandleChain -> Use of the Solo orderer is deprecated and remains only for use in test environments but may be removed in the future.
[         orderer] 2023-03-25 00:02:05.641 UTC 000c INFO [orderer.commmon.multichannel] initSystemChannel -> Starting system channel 'testchainid' with genesis block hash 2e2c5bf8b2c9a25c64e022f8dcabed2afe1f44a689753acee82f2c3e84693408 and orderer type solo
[        org1peer] 2023-03-25 00:02:05.641 UTC 0001 INFO [nodeCmd] serve -> Starting peer:
[        org1peer]  Version: 2.4.6
[        org1peer]  Commit SHA: 83596078d
[        org1peer]  Go version: go1.18.2
[        org1peer]  OS/Arch: linux/amd64
[        org1peer]  Chaincode:
[        org1peer]   Base Docker Label: org.hyperledger.fabric
[        org1peer]   Docker Namespace: hyperledger
[        org1peer] 2023-03-25 00:02:05.641 UTC 0002 INFO [peer] getLocalAddress -> Auto-detected peer address: <IP_ADDRESS>:2010
[        org1peer] 2023-03-25 00:02:05.641 UTC 0003 INFO [peer] getLocalAddress -> Host is <IP_ADDRESS> , falling back to auto-detected address: <IP_ADDRESS>:2010
[         orderer] 2023-03-25 00:02:05.641 UTC 000d INFO [orderer.common.server] Main -> Starting orderer:
[         orderer]  Version: 2.4.6
[         orderer]  Commit SHA: 83596078d
[         orderer]  Go version: go1.18.2
[         orderer]  OS/Arch: linux/amd64
[         orderer] 2023-03-25 00:02:05.642 UTC 000e INFO [orderer.common.server] Main -> Beginning to serve requests
[        org1peer] 2023-03-25 00:02:05.642 UTC 0004 INFO [nodeCmd] initGrpcSemaphores -> concurrency limit for endorser service is 2500
[        org1peer] 2023-03-25 00:02:05.642 UTC 0005 INFO [nodeCmd] initGrpcSemaphores -> concurrency limit for deliver service is 2500
[        org1peer] 2023-03-25 00:02:05.642 UTC 0006 INFO [nodeCmd] initGrpcSemaphores -> concurrency limit for gateway service is 500
[        org2peer] 2023-03-25 00:02:05.657 UTC 0009 INFO [leveldbhelper] openDBAndCheckFormat -> DB is empty Setting db format as 2.0
[        org2peer] 2023-03-25 00:02:05.659 UTC 000a INFO [blkstorage] NewProvider -> Creating new file ledger directory at /opt/microfab/data/peer-org2/data/ledgersData/chains/chains
[        org1peer] 2023-03-25 00:02:05.665 UTC 0007 INFO [certmonitor] trackCertExpiration -> The enrollment certificate will expire on 2033-03-21 23:57:05 +0000 UTC
[        org1peer] 2023-03-25 00:02:05.666 UTC 0008 INFO [ledgermgmt] NewLedgerMgr -> Initializing LedgerMgr
[        org2peer] 2023-03-25 00:02:05.673 UTC 000b INFO [leveldbhelper] openDBAndCheckFormat -> DB is empty Setting db format as 2.0
[        org1peer] 2023-03-25 00:02:05.687 UTC 0009 INFO [leveldbhelper] openDBAndCheckFormat -> DB is empty Setting db format as 2.0
[        org1peer] 2023-03-25 00:02:05.688 UTC 000a INFO [blkstorage] NewProvider -> Creating new file ledger directory at /opt/microfab/data/peer-org1/data/ledgersData/chains/chains
[        org1peer] 2023-03-25 00:02:05.696 UTC 000b INFO [leveldbhelper] openDBAndCheckFormat -> DB is empty Setting db format as 2.0
[          org2ca] 2023/03/25 00:02:05 [INFO] Initialized sqlite3 database at /opt/microfab/data/ca-org2/fabric-ca-server.db
[        org2peer] 2023-03-25 00:02:05.743 UTC 000c INFO [couchdb] createDatabaseIfNotExist -> Created state database fabric__internal
[        org1peer] 2023-03-25 00:02:05.748 UTC 000c INFO [couchdb] createDatabaseIfNotExist -> Created state database fabric__internal
[          org1ca] 2023/03/25 00:02:05 [INFO] Initialized sqlite3 database at /opt/microfab/data/ca-org1/fabric-ca-server.db
[        org1peer] 2023-03-25 00:02:05.778 UTC 000d INFO [ledgermgmt] NewLedgerMgr -> Initialized LedgerMgr
[        org1peer] 2023-03-25 00:02:05.779 UTC 000e INFO [gossip.service] New -> Initialize gossip with endpoint org1peer-api.127-0-0-1.nip.io:8080
[        org1peer] 2023-03-25 00:02:05.780 UTC 000f INFO [gossip.gossip] New -> Creating gossip service with self membership of Endpoint: org1peer-api.127-0-0-1.nip.io:8080, InternalEndpoint: org1peer-api.127-0-0-1.nip.io:8080, PKI-ID: 864d0582f0c09942f9bbd64d95a932e5c6bdaee984a3821c261cc086e39795a3, Metadata:
[        org1peer] 2023-03-25 00:02:05.780 UTC 0010 INFO [lifecycle] InitializeLocalChaincodes -> Initialized lifecycle cache with 0 already installed chaincodes
[        org1peer] 2023-03-25 00:02:05.780 UTC 0011 INFO [gossip.gossip] start -> Gossip instance org1peer-api.127-0-0-1.nip.io:8080 started
[        org2peer] 2023-03-25 00:02:05.779 UTC 000d INFO [ledgermgmt] NewLedgerMgr -> Initialized LedgerMgr
[        org2peer] 2023-03-25 00:02:05.779 UTC 000e INFO [gossip.service] New -> Initialize gossip with endpoint org2peer-api.127-0-0-1.nip.io:8080
[        org2peer] 2023-03-25 00:02:05.780 UTC 000f INFO [gossip.gossip] New -> Creating gossip service with self membership of Endpoint: org2peer-api.127-0-0-1.nip.io:8080, InternalEndpoint: org2peer-api.127-0-0-1.nip.io:8080, PKI-ID: 424401d9a5e8d80e372931f7c30170dd421f39d5529eca188525b7b7cc696607, Metadata:
[        org2peer] 2023-03-25 00:02:05.781 UTC 0010 INFO [gossip.gossip] start -> Gossip instance org2peer-api.127-0-0-1.nip.io:8080 started
[        org2peer] 2023-03-25 00:02:05.781 UTC 0011 INFO [lifecycle] InitializeLocalChaincodes -> Initialized lifecycle cache with 0 already installed chaincodes
[        org1peer] 2023-03-25 00:02:05.781 UTC 0012 INFO [nodeCmd] computeChaincodeEndpoint -> Entering computeChaincodeEndpoint with peerHostname: <IP_ADDRESS>
[        org1peer] 2023-03-25 00:02:05.781 UTC 0013 INFO [nodeCmd] computeChaincodeEndpoint -> Exit with ccEndpoint: <IP_ADDRESS>:2011
[        org1peer] 2023-03-25 00:02:05.781 UTC 0014 INFO [sccapi] DeploySysCC -> deploying system chaincode 'lscc'
[        org1peer] 2023-03-25 00:02:05.781 UTC 0015 INFO [sccapi] DeploySysCC -> deploying system chaincode 'cscc'
[        org1peer] 2023-03-25 00:02:05.782 UTC 0016 INFO [sccapi] DeploySysCC -> deploying system chaincode 'qscc'
[        org1peer] 2023-03-25 00:02:05.782 UTC 0017 INFO [sccapi] DeploySysCC -> deploying system chaincode '_lifecycle'
[        org1peer] 2023-03-25 00:02:05.782 UTC 0018 INFO [nodeCmd] serve -> Deployed system chaincodes
[        org1peer] 2023-03-25 00:02:05.782 UTC 0019 INFO [discovery] NewService -> Created with config TLS: false, authCacheMaxSize: 1000, authCachePurgeRatio: 0.750000
[        org1peer] 2023-03-25 00:02:05.782 UTC 001a INFO [nodeCmd] serve -> Discovery service activated
[        org1peer] 2023-03-25 00:02:05.782 UTC 001b INFO [nodeCmd] serve -> Starting peer with Gateway enabled
[        org1peer] 2023-03-25 00:02:05.782 UTC 001c INFO [nodeCmd] serve -> Starting peer with ID=[org1peer], network ID=[dev], address=[<IP_ADDRESS>:2010]
[        org2peer] 2023-03-25 00:02:05.782 UTC 0012 INFO [nodeCmd] computeChaincodeEndpoint -> Entering computeChaincodeEndpoint with peerHostname: <IP_ADDRESS>
[        org2peer] 2023-03-25 00:02:05.782 UTC 0013 INFO [nodeCmd] computeChaincodeEndpoint -> Exit with ccEndpoint: <IP_ADDRESS>:2005
[        org1peer] 2023-03-25 00:02:05.782 UTC 001d INFO [nodeCmd] serve -> Started peer with ID=[org1peer], network ID=[dev], address=[<IP_ADDRESS>:2010]
[        org1peer] 2023-03-25 00:02:05.782 UTC 001e INFO [kvledger] LoadPreResetHeight -> Loading prereset height from path [/opt/microfab/data/peer-org1/data/ledgersData/chains]
[        org1peer] 2023-03-25 00:02:05.782 UTC 001f INFO [blkstorage] preResetHtFiles -> No active channels passed
[        org2peer] 2023-03-25 00:02:05.783 UTC 0014 INFO [sccapi] DeploySysCC -> deploying system chaincode 'lscc'
[        org2peer] 2023-03-25 00:02:05.783 UTC 0015 INFO [sccapi] DeploySysCC -> deploying system chaincode 'cscc'
[        org2peer] 2023-03-25 00:02:05.783 UTC 0016 INFO [sccapi] DeploySysCC -> deploying system chaincode 'qscc'
[        org2peer] 2023-03-25 00:02:05.783 UTC 0017 INFO [sccapi] DeploySysCC -> deploying system chaincode '_lifecycle'
[        org2peer] 2023-03-25 00:02:05.783 UTC 0018 INFO [nodeCmd] serve -> Deployed system chaincodes
[        org2peer] 2023-03-25 00:02:05.784 UTC 0019 INFO [discovery] NewService -> Created with config TLS: false, authCacheMaxSize: 1000, authCachePurgeRatio: 0.750000
[        org2peer] 2023-03-25 00:02:05.784 UTC 001a INFO [nodeCmd] serve -> Discovery service activated
[        org2peer] 2023-03-25 00:02:05.784 UTC 001b INFO [nodeCmd] serve -> Starting peer with Gateway enabled
[        org2peer] 2023-03-25 00:02:05.784 UTC 001c INFO [nodeCmd] serve -> Starting peer with ID=[org2peer], network ID=[dev], address=[<IP_ADDRESS>:2004]
[        org2peer] 2023-03-25 00:02:05.784 UTC 001d INFO [nodeCmd] serve -> Started peer with ID=[org2peer], network ID=[dev], address=[<IP_ADDRESS>:2004]
[          org2ca] 2023/03/25 00:02:05 [INFO] The issuer key was successfully stored. The public key is at: /opt/microfab/data/ca-org2/IssuerPublicKey, secret key is at: /opt/microfab/data/ca-org2/msp/keystore/IssuerSecretKey
[        org2peer] 2023-03-25 00:02:05.784 UTC 001e INFO [kvledger] LoadPreResetHeight -> Loading prereset height from path [/opt/microfab/data/peer-org2/data/ledgersData/chains]
[        org2peer] 2023-03-25 00:02:05.784 UTC 001f INFO [blkstorage] preResetHtFiles -> No active channels passed
2023/03/25 00:02:05 error waiting for CA: Get "http://localhost:2001/healthz": dial tcp <IP_ADDRESS>:2001: connect: connection refused
[          org2ca] 2023/03/25 00:02:05 [INFO] Idemix issuer revocation public and secret keys were generated for CA 'org2ca'
[          org2ca] 2023/03/25 00:02:05 [INFO] The revocation key was successfully stored. The public key is at: /opt/microfab/data/ca-org2/IssuerRevocationPublicKey, private key is at: /opt/microfab/data/ca-org2/msp/keystore/IssuerRevocationPrivateKey
2023/03/25 00:02:05 error waiting for CA: Get "http://localhost:2009/healthz": dial tcp <IP_ADDRESS>:2009: connect: connection refused
[       microfabd] 2023/03/25 00:02:05 Created and started orderer for ordering organization Orderer
[          org2ca] 2023/03/25 00:02:05 [INFO] Home directory for default CA: /opt/microfab/data/ca-org2
[          org2ca] 2023/03/25 00:02:05 [INFO] Operation Server Listening on [::]:2001
[          org2ca] 2023/03/25 00:02:05 [INFO] Listening on http://<IP_ADDRESS>:2000
[        org1peer] 2023-03-25 00:02:05.801 UTC 0020 INFO [endorser] callChaincode -> finished chaincode: cscc duration: 0ms channel= txID=3d7d5f96
[        org1peer] 2023-03-25 00:02:05.801 UTC 0021 INFO [comm.grpc.server] 1 -> unary call completed grpc.service=protos.Endorser grpc.method=ProcessProposal grpc.request_deadline=2023-03-25T00:02:35.8Z grpc.peer_address=<IP_ADDRESS>:53316 grpc.code=OK grpc.call_duration=1.173467ms
[        org2peer] 2023-03-25 00:02:05.801 UTC 0020 INFO [endorser] callChaincode -> finished chaincode: cscc duration: 0ms channel= txID=58b86746
[        org2peer] 2023-03-25 00:02:05.801 UTC 0021 INFO [comm.grpc.server] 1 -> unary call completed grpc.service=protos.Endorser grpc.method=ProcessProposal grpc.request_deadline=2023-03-25T00:02:35.8Z grpc.peer_address=<IP_ADDRESS>:51786 grpc.code=OK grpc.call_duration=1.089612ms
[       microfabd] 2023/03/25 00:02:05 Created and started peer for endorsing organization org1
[       microfabd] 2023/03/25 00:02:05 Created and started peer for endorsing organization org2
[          org1ca] 2023/03/25 00:02:05 [INFO] The issuer key was successfully stored. The public key is at: /opt/microfab/data/ca-org1/IssuerPublicKey, secret key is at: /opt/microfab/data/ca-org1/msp/keystore/IssuerSecretKey
[          org1ca] 2023/03/25 00:02:05 [INFO] Idemix issuer revocation public and secret keys were generated for CA 'org1ca'
[          org1ca] 2023/03/25 00:02:05 [INFO] The revocation key was successfully stored. The public key is at: /opt/microfab/data/ca-org1/IssuerRevocationPublicKey, private key is at: /opt/microfab/data/ca-org1/msp/keystore/IssuerRevocationPrivateKey
[          org1ca] 2023/03/25 00:02:05 [INFO] Home directory for default CA: /opt/microfab/data/ca-org1
[          org1ca] 2023/03/25 00:02:05 [INFO] Operation Server Listening on [::]:2009
[          org1ca] 2023/03/25 00:02:05 [INFO] Listening on http://<IP_ADDRESS>:2008
[          org2ca] 2023/03/25 00:02:06 [INFO] signed certificate with serial number<PHONE_NUMBER>14093375495805575309407605353711857753
[          org1ca] 2023/03/25 00:02:06 [INFO] signed certificate with serial number<PHONE_NUMBER>3850460356883544741186595114594871197
[          org2ca] 2023/03/25 00:02:06 [INFO] <IP_ADDRESS>:48524 POST /enroll 201 0 "OK"
[       microfabd] 2023/03/25 00:02:06 Created and started CA for endorsing organization org2
[          org1ca] 2023/03/25 00:02:06 [INFO] <IP_ADDRESS>:37966 POST /enroll 201 0 "OK"
[       microfabd] 2023/03/25 00:02:06 Created and started CA for endorsing organization org1
[       microfabd] 2023/03/25 00:02:06 Creating and starting console ...
[         console] 2023/03/25 00:02:06 Created new console...
[         console] 2023/03/25 00:02:06 [mbw] RegisterOrganization &{Orderer 0xc000664a20 0xc000665d10 <nil> OrdererMSP}
[         console] 2023/03/25 00:02:06 [mbw] RegisterOrganization &{org1 0xc0005c2420 0xc0005c3710 0xc0002e5d40 org1MSP}
[         console] 2023/03/25 00:02:06 [mbw] RegisterOrganization &{org2 0xc000043c80 0xc0000ccf90 0xc0002e5230 org2MSP}
[       microfabd] 2023/03/25 00:02:06 Created and started console
[       microfabd] 2023/03/25 00:02:06 Creating and starting proxy ...
[       microfabd] 2023/03/25 00:02:06 Created and started proxy
[       microfabd] 2023/03/25 00:02:06 Creating and joining channel appchannel ...
[       microfabd] 2023/03/25 00:02:06 Creating channel appchannel ...
[       microfabd] 2023/03/25 00:02:06 Creating and joining channel mychannel ...
[       microfabd] 2023/03/25 00:02:06 Creating channel mychannel ...
[         orderer] 2023-03-25 00:02:06.125 UTC 000f INFO [comm.grpc.server] 1 -> streaming call completed grpc.service=orderer.AtomicBroadcast grpc.method=Broadcast grpc.request_deadline=2023-03-25T00:02:36.117Z grpc.peer_address=<IP_ADDRESS>:42788 grpc.code=OK grpc.call_duration=7.395491ms
[         orderer] 2023-03-25 00:02:06.128 UTC 0010 INFO [blkstorage] newBlockfileMgr -> Getting block information from block storage
[         orderer] 2023-03-25 00:02:06.131 UTC 0011 WARN [orderer.consensus.solo] HandleChain -> Use of the Solo orderer is deprecated and remains only for use in test environments but may be removed in the future.
[         orderer] 2023-03-25 00:02:06.131 UTC 0012 INFO [orderer.commmon.multichannel] newChain -> Created and started new channel mychannel
[         orderer] 2023-03-25 00:02:06.132 UTC 0013 INFO [comm.grpc.server] 1 -> streaming call completed grpc.service=orderer.AtomicBroadcast grpc.method=Deliver grpc.request_deadline=2023-03-25T00:02:36.126Z grpc.peer_address=<IP_ADDRESS>:42788 grpc.code=OK grpc.call_duration=5.568904ms
[         orderer] 2023-03-25 00:02:06.133 UTC 0014 INFO [comm.grpc.server] 1 -> streaming call completed grpc.service=orderer.AtomicBroadcast grpc.method=Broadcast grpc.request_deadline=2023-03-25T00:02:36.117Z grpc.peer_address=<IP_ADDRESS>:42786 grpc.code=OK grpc.call_duration=15.504491ms
[         orderer] 2023-03-25 00:02:06.135 UTC 0015 INFO [blkstorage] newBlockfileMgr -> Getting block information from block storage
[         orderer] 2023-03-25 00:02:06.139 UTC 0016 WARN [orderer.consensus.solo] HandleChain -> Use of the Solo orderer is deprecated and remains only for use in test environments but may be removed in the future.
[         orderer] 2023-03-25 00:02:06.139 UTC 0017 INFO [orderer.commmon.multichannel] newChain -> Created and started new channel appchannel
[         orderer] 2023-03-25 00:02:06.139 UTC 0018 INFO [comm.grpc.server] 1 -> streaming call completed grpc.service=orderer.AtomicBroadcast grpc.method=Deliver grpc.request_deadline=2023-03-25T00:02:36.133Z grpc.peer_address=<IP_ADDRESS>:42788 grpc.code=OK grpc.call_duration=6.108346ms
[         orderer] 2023-03-25 00:02:06.140 UTC 0019 INFO [comm.grpc.server] 1 -> streaming call completed grpc.service=orderer.AtomicBroadcast grpc.method=Deliver grpc.request_deadline=2023-03-25T00:02:36.134Z grpc.peer_address=<IP_ADDRESS>:42786 grpc.code=OK grpc.call_duration=6.303889ms
[         orderer] 2023-03-25 00:02:06.141 UTC 001a INFO [comm.grpc.server] 1 -> streaming call completed grpc.service=orderer.AtomicBroadcast grpc.method=Deliver grpc.request_deadline=2023-03-25T00:02:36.14Z grpc.peer_address=<IP_ADDRESS>:42788 grpc.code=OK grpc.call_duration=583.391µs
[         orderer] 2023-03-25 00:02:06.142 UTC 001b INFO [comm.grpc.server] 1 -> streaming call completed grpc.service=orderer.AtomicBroadcast grpc.method=Deliver grpc.request_deadline=2023-03-25T00:02:36.141Z grpc.peer_address=<IP_ADDRESS>:42786 grpc.code=OK grpc.call_duration=573.048µs
[         orderer] 2023-03-25 00:02:06.143 UTC 001c INFO [comm.grpc.server] 1 -> streaming call completed grpc.service=orderer.AtomicBroadcast grpc.method=Deliver grpc.request_deadline=2023-03-25T00:02:36.142Z grpc.peer_address=<IP_ADDRESS>:42786 grpc.code=OK grpc.call_duration=872.503µs
[         orderer] 2023-03-25 00:02:06.146 UTC 001d INFO [comm.grpc.server] 1 -> streaming call completed grpc.service=orderer.AtomicBroadcast grpc.method=Broadcast grpc.request_deadline=2023-03-25T00:02:36.143Z grpc.peer_address=<IP_ADDRESS>:42788 grpc.code=OK grpc.call_duration=3.345928ms
[       microfabd] 2023/03/25 00:02:06 Created channel mychannel
[       microfabd] 2023/03/25 00:02:06 Joining channel mychannel on peer for endorsing organization org1 ...
[        org1peer] 2023-03-25 00:02:06.149 UTC 0022 INFO [endorser] callChaincode -> finished chaincode: cscc duration: 1ms channel= txID=6e68fdf3
[        org1peer] 2023-03-25 00:02:06.149 UTC 0023 INFO [comm.grpc.server] 1 -> unary call completed grpc.service=protos.Endorser grpc.method=ProcessProposal grpc.request_deadline=2023-03-25T00:02:36.147Z grpc.peer_address=<IP_ADDRESS>:53318 grpc.code=OK grpc.call_duration=1.806705ms
[         orderer] 2023-03-25 00:02:06.152 UTC 001e INFO [comm.grpc.server] 1 -> streaming call completed grpc.service=orderer.AtomicBroadcast grpc.method=Broadcast grpc.request_deadline=2023-03-25T00:02:36.144Z grpc.peer_address=<IP_ADDRESS>:42786 grpc.code=OK grpc.call_duration=7.222894ms
[       microfabd] 2023/03/25 00:02:06 Created channel appchannel
[       microfabd] 2023/03/25 00:02:06 Joining channel appchannel on peer for endorsing organization org2 ...
[       microfabd] 2023/03/25 00:02:06 Joining channel appchannel on peer for endorsing organization org1 ...
[        org2peer] 2023-03-25 00:02:06.154 UTC 0022 INFO [endorser] callChaincode -> finished chaincode: cscc duration: 1ms channel= txID=7c38de0d
[        org2peer] 2023-03-25 00:02:06.155 UTC 0023 INFO [comm.grpc.server] 1 -> unary call completed grpc.service=protos.Endorser grpc.method=ProcessProposal grpc.request_deadline=2023-03-25T00:02:36.152Z grpc.peer_address=<IP_ADDRESS>:51788 grpc.code=OK grpc.call_duration=2.13344ms
[        org1peer] 2023-03-25 00:02:06.157 UTC 0024 INFO [endorser] callChaincode -> finished chaincode: cscc duration: 1ms channel= txID=978fb338
[        org1peer] 2023-03-25 00:02:06.157 UTC 0025 INFO [comm.grpc.server] 1 -> unary call completed grpc.service=protos.Endorser grpc.method=ProcessProposal grpc.request_deadline=2023-03-25T00:02:36.155Z grpc.peer_address=<IP_ADDRESS>:53318 grpc.code=OK grpc.call_duration=1.782798ms
[       microfabd] 2023/03/25 00:02:06 Failed to start application: Bad proposal response: status 500, mesage "JoinChain" for channelID = mychannel failed because of validation of configuration block, because of Failed capabilities check: [Application capability V2_5 is required but not supported]

it works just removing the line
"capability_level": "V2_5"

as appears in the fabric-2.4 branch
https://github.com/hyperledger-labs/microfab/tree/fabric-2.4#configuration
So, the "Configuration" section as it appears in the video should appear like this in the README.md file:
export MICROFAB_CONFIG='{
    "endorsing_organizations": [
        {
            "name": "org1"
        },
        {
            "name": "org2"
        }
    ],
    "channels": [
        {
            "name": "mychannel",
            "endorsing_organizations": [
                "org1"
            ]
        },
        {
            "name": "appchannel",
            "endorsing_organizations": [
                "org1",
                "org2"
            ]
        }
    ]
}'

docker run -it -p 8443:8443 -e MICROFAB_CONFIG ibmcom/ibp-microfab


the project reuses some code from axolotl_tamu.

is this project open-source?
Or are there any documents?

@HuaizhengZhang Good question! The axolotl is a high-level abstraction of D3M with easier interfaces. axolotl_tamu is our maintained version of the axolotl. The original version is in https://gitlab.com/axolotl1/axolotl For this one, we are continuously adding new features so the code-base is not very stable. Thus, we maintain a stable and periodically updated version in https://github.com/tods-doc/axolotl This is the same one when you install axolotl_tamu


Validate filter value

Hi all, Congrats for the project!
Is there a way to validate filter values?
For example, I want to filter by name, but only if the name value is a string with more than 3 characters.
Is there a standard way to do this?
I couldn't find any documentation about this.

I haven't tried, but I assume you could just raise an error inside the filter callback. See http://jsonapi-resources.com/v0.9/guide/resources.html#Applying-Filters for how to implement a custom filter.

Thank you @scottgonzalez ! I have already looked at that doc.
What I was doing is something like:
      filter :name, verify: ->(values, context) {
        raise JSONAPI::Exceptions::InvalidFilterValue.new(:name, values) if ...
      }

But I'm wondering if there is a standard way to validate the filter values, and return an error with all the "wrong" filters, something like:
{
    "errors": [
        {
            "title": "Invalid filter value",
            "detail": "[\"10\"] is not a valid value for name.",
            "code": "107",
            "status": "400"
        },
        {
            "title": "Invalid filter value",
            "detail": "[\"10\"] is not a valid value for last_name.",
            "code": "107",
            "status": "400"
        }
    ]
}

BTW: It would be nice if we could something like:
filter :name, validate: { lenght: { min: 3, max: 20 } }

JR does not support filters validation, but you can implement it yourself by overriding verify_filter.
something like code below can do the trick:
class JSONAPI::Validators::LengthValidator
  def initialize(filter_name, values, options)
    @filter_name = filter_name
    @values = values
    @options = options
  end

  def valid?
    return false if !options[:allow_empty] && values.empty?
    values.each do |value|
      return false if options[:min] && value.length < options[:min]
      return false if options[:max] && value.length > options[:max]
    end
    true
  end
end

class ApplicationResource < JSONAPI::Resource
  def self.verify_filter(filter, raw, context = nil)
    result = super
    options = _allowed_filters.fetch(filter, {})
    options.fetch(:validate, {}).each do |validator, opts|
      klass = "JSONAPI::Validators::#{validator.to_s.classify}Validator".constantize
      unless klass.new(result[0], result[1], opts).valild?
        raise JSONAPI::Exceptions::InvalidFilterValue.new(filter, raw)
      end
    end
  end
end

class UserResource < ApplicationResource
  attribute :name
  filter :name, validate: { length: { min: 3, max: 20 } }
end

Thank you @senid231! That looks good. I'm just using verify for now. So I'll close this issue


Enable the consistent-return ESLint rule

This rule is already enabled in mozilla-central, and helps ensure more consistent functions/methods, see https://searchfox.org/mozilla-central/rev/b9da45f63cb567244933c77b2c7e827a057d3f9b/tools/lint/eslint/eslint-plugin-mozilla/lib/configs/recommended.js#119-120
Please see https://eslint.org/docs/rules/consistent-return for additional information.

/botio test

/botio-linux preview

Looks good. Thank you!

173fbef05b3c88cc5a6e3448ca6e19c5b8b86713


Comdbg crc

Add tow features:
1: Add 2 bytes CRC16 check code to the end of send content (Hex mode)
2: Auto reply when receive messages.


features request for command palette

dbt Power User: Run current model not working with tests. dbt test when the model runs from /tests/*
Ability to choose environment to use

dbt Power User: Run current model not working with tests

Do you mean running the tests for a model? I think that might be useful.
In my case running on any other environment than your own environment is handled by CI/CD (promotion to uat/prod), so I've never really needed to choose environments.

Tests is implemented in latest version.
Environment is raised in #124


Unnecessary client-side query with SSR

🐛 Current behavior
After the page is rendered server side, there is a duplicate client-side query. This is true for both doc and data requests.
🔍 Steps to reproduce

Go to the https://shopify-hydrogen-algolia-ff7a0d8a34696233bb09.o2.myshopify.dev/
Click on Men from the top navigation, the results are loaded with server side rendering and there is no client-side query.
Now click on Women, there is a data request(which handles SSR via the loader using getServerState) and there is also an unnecessary client side query.
Now refresh the browser, you will see an SSR'ed page but again another unnecessary client-side query.

Live reproduction
https://shopify-hydrogen-algolia-ff7a0d8a34696233bb09.o2.myshopify.dev/
💭 Expected behavior
There should be no client-side query at Step 3.
Also, there should be no client-side query for a page refresh at Step 4.
Package version
"instantsearch.js": "^4.56.1","react-instantsearch": "^7.5.2",
Operating system
No response
Browser
No response
Code of Conduct

[X] I agree to follow this project's Code of Conduct

Assign this issue to me

I have confirmed that this is not related to Remix, Next.js versions also have the same behaviour.

Check for Edge Runtime: Ensure you're not deploying to Edge Runtime; use Node.js runtime instead.

Thank you @aymeric-giraudet ,
How can I test the master branch, is there an npm package for that.
For the second part, for each HierarchicalMenu refinement I have a SEO path, so I need that path from the server with other path related data not present on algolia indexes.
By the way I switched to Next.js, because somehow the same Remix app's CPU usage is way higher than Next.js on cloudflare, I am not sure if it is related to InstantSearch but right now the page only has InstantSearch components.

is there an npm package for that

you can follow these instructions: https://ci.codesandbox.io/status/algolia/instantsearch/pr/6275/builds/521243

Hello @Haroenv,
I have tried with the following packages, but the results are the same. Did you tried this fix with a HierarchicalMenu having more than one levels?
"instantsearch.js": "https://pkg.csb.dev/algolia/instantsearch/commit/ca700da2/instantsearch.js",
"react-instantsearch": "https://pkg.csb.dev/algolia/instantsearch/commit/ca700da2/react-instantsearch",
"react-instantsearch-nextjs": "https://pkg.csb.dev/algolia/instantsearch/commit/ca700da2/react-instantsearch-nextjs",

Hi @sefai, there is indeed a problem when selecting a nested hierarchical menu attribute, due to an explicit facetFilters: undefined in one of the requests :/
I will publish another fix for that but can you try to do JSON.parse(JSON.stringify(serverState)) in your loader and see if it is indeed the issue ?

Hello @aymeric-giraudet
Unfortunately I switched to Next.js, I am using react-instantsearch-nextjs.

Hello @aymeric-giraudet
I still see the client-side query and a new hydration error. As you can see from the record below the root menu count changes 3 times. I am not sure if the additional fetch is caused by the hydration error.
https://github.com/algolia/instantsearch/assets/18752451/442e8f42-e6b4-47bc-ac7a-744adcc00459
If I set persistHierarchicalRootCount to false the counts stay the same for each hierarchical menu item, but the fetch and errors does not go away.
Uploading Screen Recording 2024-07-11 at 17.26.24.mov…

Hello @aymeric-giraudet, sorry I missed that, by patching the algoliasearch-helper package, I can confirm the additional client-side query is fixed by #6283.


[requires.io] dependency update on master branch

Codecov Report

Merging #26 (25821fb) into master (5f352cc) will not change coverage.
The diff coverage is n/a.

@@           Coverage Diff           @@
##           master      #26   +/-   ##
=======================================
  Coverage   76.47%   76.47%
=======================================
  Files           7        7
  Lines          85       85
=======================================
  Hits           65       65
  Misses         20       20

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 5f352cc...25821fb. Read the comment docs.


Tracer, et al, setup question - once per process constraint with bootstraps

I've recently dropped swift-otel into a Hummingbird project, doing the relevant logging, metrics, and tracing setup in a buildApplication() method. But I'm also using that method in testing, establishing an instance in each suite for running tests.
But as I started building multiple suites of tests and setting up multiple instances, I ran face-first into the whole "one bootstrap per process" thing with distributed-tracing.
Is there a better way to handle the bootstrapping setup so that as I'm expanding tests, the relevant bootstrap pieces are only invoked once during the test suite run? Maybe this is more of a Hummingbird/Vapor question, but thought if anyone had hid similar issues, they'd likely be looking here.
I've thought that perhaps I should set up logging, tracing, and metrics external to the buildApplication() method, passing it in, and then doing my own singleton hacky thing for once-per-test-process setup, passing in the references to add them into the service lifecycle as a part of Hummingbird.
Any suggestions?

This is not an official answer, but one thing I’ve done with my projects is simply not bootstrapping telemetry or logging in my apps when running unit or integration tests. Maybe there’s a better way, but for me it worked to have a “bootstrap” flag that I pass to the functions that setup my logger and tracer and set that to false when running tests.

I also usually follow a similar approach @xtremekforever mentioned when writing integration tests.
Slightly unrelated and won't be helpful in production ... if you still want to bootstrap any of the "systems" during unit tests, e.g. to provide an in-memory version to assert against things being instrumented, you may use the bootstrapInternal variants to bootstrap within your tests. These methods skip checking the "already bootstrapped" constraint:

Logging: https://github.com/apple/swift-log/blob/db86ac725bb4a194636c716461f5a166e93b29ba/Sources/Logging/Logging.swift#L544
Metrics: https://github.com/apple/swift-metrics/blob/e0165b53d49b413dd987526b641e05e246782685/Sources/CoreMetrics/Metrics.swift#L586
Tracing: https://github.com/apple/swift-distributed-tracing/blob/11c756c5c4d7de0eeed8595695cadd7fa107aa19/Sources/Instrumentation/InstrumentationSystem.swift#L47

Thanks @slashmo - bootstrapInternal is perfect to something I'd like to do!

A pattern I also quite like is to set up OTel and instrumentation in general in an executable target that is the CLI to my server and then put the majority of my code in a library target. Here's a recent example of this:
Executable target
import API
import ArgumentParser
import Logging
import OTel
import OTLPGRPC
import ServiceLifecycle
import Tracing

@main
struct APICTL: AsyncParsableCommand {
    @Option(name: .shortAndLong)
    private var hostname: String = "<IP_ADDRESS>"

    @Option(name: .shortAndLong)
    private var port: Int = 8080

    @Option(name: .shortAndLong)
    private var logLevel: Logger.Level = .info

    func run() async throws {
        bootstrapLogging()

        let environment = OTelEnvironment.detected()
        let resource = await resource(environment: environment)

        let tracer = try bootstrappedTracer(resource: resource, environment: environment)

        let service = APIService(hostname: hostname, port: port)
        let serviceGroup = ServiceGroup(
            services: [tracer, service],
            gracefulShutdownSignals: [.sigterm, .sigint],
            logger: service.logger
        )

        try await serviceGroup.run()
    }

    private func bootstrapLogging() {
        LoggingSystem.bootstrap { label in
            var handler = StreamLogHandler.standardOutput(label: label, metadataProvider: .otel)
            handler.logLevel = logLevel
            return handler
        }
    }

    private func resource(environment: OTelEnvironment) async -> OTelResource {
        let resourceDetection = OTelResourceDetection(detectors: [
            OTelProcessResourceDetector(),
            OTelEnvironmentResourceDetector(environment: environment),
            .manual(OTelResource(attributes: ["service.name": "api"])),
        ])
        return await resourceDetection.resource(environment: environment, logLevel: logLevel)
    }

    private func bootstrappedTracer(resource: OTelResource, environment: OTelEnvironment) throws -> some Service {
        let spanExporter = try OTLPGRPCSpanExporter(configuration: .init(environment: environment))
        let batchSpanProcessor = OTelBatchSpanProcessor(
            exporter: spanExporter,
            configuration: .init(environment: environment)
        )
        let tracer = OTelTracer(
            idGenerator: OTelRandomIDGenerator(),
            sampler: OTelParentBasedSampler(rootSampler: OTelConstantSampler(isOn: true)),
            propagator: OTelW3CPropagator(),
            processor: batchSpanProcessor,
            environment: environment,
            resource: resource
        )
        InstrumentationSystem.bootstrap(tracer)
        return tracer
    }
}

extension Logger.Level: @retroactive ExpressibleByArgument {}

Library target
import Hummingbird
import Logging
import ServiceLifecycle

public struct APIService: Service {
    public let logger = Logger(label: "APIService")

    public init(hostname: String, port: Int) {
        self.hostname = hostname
        self.port = port
    }

    public func run() async throws {
        let router = Router()
        router.add(middleware: TracingMiddleware())

        router.get("/health/alive") { _, _ in
            HTTPResponse.Status.ok
        }

        let application = Application(
            router: router,
            configuration: ApplicationConfiguration(
                address: .hostname(hostname, port: port),
                serverName: "api"
            ),
            logger: logger
        )
        try await application.run()
    }

    private let hostname: String
    private let port: Int
}

extension APIService: CustomStringConvertible {
    public var description: String { "APIService" }
}

@heckj Would it be okay if I closed this issue? I don't think there's anything to do here in terms of swift-otel. What do you think?

Absolutely - sorry, thank you for the suggestions! I ended up breaking up bootstrapping into it's own "little thing", that returned a logger and set of services, using that as inputs to "build the application" in Hummingbird. A specific variation in testing includes the tracer with the bootstrapInternal specifically for the testing scenarios, which is working nicely for me.

Great, I'm glad you found a solution 👌


Discord invite link in Readme has expired

Hello,
Thanks for doing this!
As indicated by the readme I tried to join your Discord via the given link: https://discord.gg/wXHHxD.
According to Discord this link has expired. I suppose that this is not a permission issue due to the public nature of the readme-file.
Regards,
Phil

Phil, thanks for opening this issue. The (expired) Discord link will be removed from the README until a moderation policy is put in place for the server. Closing this issue for now but please stay tuned for updates. Cheers!


refactored GET requests to POST to support longer texts

The request sent to to the Google Translate API was a GET request, which restricted the translation length to 2000 characters and a longer text would cause an error 400 (Bad Request).
A possible solution is to switch to POST requests, which have pretty much the same syntax, but the text is transported in the request body which does not have such limitations.
This pull request attempts to fix that with the aforementioned approach.

I'll look into this. If it doesn't break old functionality I could merge this.

Just a bump. Did you look at it? Are there any issues to be solved so it can be merged?


Add support for pathLen basicConstraint

pathLen controls the number of CA certificates which may appear in the chain under the given certificate; the doc comments on the new MaxPathLen fields should be clear about this.
This PR adds support for the CA and SelfSigned issuer. Vault can be extended to support pathLen, but this will require much wider changes to the Vault issuer since we'd need to call a different Vault endpoint to issue CA certificates. That's left for a separate PR.
Other issuers may support this too, but again that's left for a separate PR.
Fixes #2820
/kind feature
Add support for setting the pathLen basicConstraint on CA certificates using the CA or SelfSigned issuers. This is an important extra tool for defence-in-depth in the event of private key exposure.

/test all

/test pull-cert-manager-bazel

/test all

/test all

/test pull-cert-manager-bazel

/test all

/test all

/test pull-cert-manager-bazel
flake :snowflake:

NB: I removed the "experimental" commit, which was going to clash heavily with #4261 - it can be added in a separate PR, and I don't think it's required for this PR to merge.

Hm, given this is a feature of a subset of issuers, would it make more sense for this field to be exposed on the Issuer object(s) instead? My primary reasons for thinking it may do are:

this is really more of a CAs policy rather than a user’s request in my opinion
it allows policy based on issuer/signerName, which is simpler to model than requiring a dialect that expresses constraints on individual fields
it avoids adding options to CRs that ultimately may just be ignored due to CA policy

As someone managing a CA (aka someone managing an Issuer resource), I feel like this is something I’d like to set as a policy for anyone requesting from my CA rather than something I’d allow end users to configure.

Hm, given this is a feature of a subset of issuers, would it make ...

Replying with a list of unordered reasons I think this is the right approach:

I think there's a feature request you've just made to have Issuers be more configurable, but that's separate to this.
We already have support for modifying basicConstraints via IsCA on a (Certificate|CertificateRequest)Spec; it seems reasonable to support the other important bit of basicConstraints.
pathLen is the X.509 way of giving issuing CAs the power to choose how they want to handle issuance of CA certificates.
Vault has it implemented this way too via max_path_length
I don't think this is a "subset of issuers" - it's a subset of X.509 certificates
Go itself has implemented it this way too

Specific replies:

this is really more of a CAs policy rather than a user’s request in my opinion

This feature enables "CA policy". This allows a user to request an intermediate signing certificate that they'll use as a CA Issuer and configure

I feel like this is something I’d like to set as a policy for anyone requesting from my CA rather than something I’d allow end users to configure

You can control what you allow end-users to configure by setting pathLen on your intermediate. If you have a CA issuer using a cert with pathLen: 0 - which is the ideal use case for this feature - you've stopped that cert from being able to issue valid CAs entirely. This feature, as-is, allows that policy to be put in place.
Importantly, this feature is far stronger than any policy we can put in place around issuers because it's embedded in the cert.
If someone manages to get your cert-manager issuer to issue an arbitrary certificate once, they can issue an evil CA (via IsCA which is already supported today) and then can issue anything off that CA. But with a pathLen: 0 on your Issuer, the evil CA they managed to issue isn't actually usable.
With a new cert-manager "IssuerPolicy" which says "no CAs", if the attacker does manage to issue a cert once, it's game over. Their evil CA will be totally valid.
This implementation is the way that we set pathLen on our intermediates in the first place. It's probably less useful for most day-to-day issuance, but it's very useful for bootstrapping private PKI.

/test pull-cert-manager-bazel

I'll move it off the 1.5 milestone since we are now in code freeze 👍
/milestone clear

I remain absolutely convinced that supporting pathLen - the other bit of the basicConstraints extension, half of which we already support - in the Certificate and CertificateRequest resources is the correct thing to do. Clearly this PR is going nowhere fast though, so I'll close it rather than address the conflicts.

sigh running into an issue that this could've resolved. Was anything like this ever implemented?

I'm afraid this was pretty thoroughly killed and it hit my confidence and motivation enough that I never got the strength to try raising it again.
Would it be possible for you to elaborate on how this feature would've helped you? It's possible that a user story might help revive this!

@NeckBeardPrince
Thanks for the context! I think the google-cas-issuer thing is definitely more Jetstack-specific yeah and it starts to touch on commerical stuff. If you want to talk to people about that at Jetstack I can link you up, but it's kinda separate to cert-manager as a project.
From looking at that error it looks like an issue with what the CAS issuer is sending to the service and this pathLen support wouldn't be related. pathLen is in the basicConstraints extension alongside the cA bit which is referenced in the error message. The cA bit is more important!

@NeckBeardPrince
Thanks for the context! I think the google-cas-issuer thing is definitely more Jetstack-specific yeah and it starts to touch on commerical stuff. If you want to talk to people about that at Jetstack I can link you up, but it's kinda separate to cert-manager as a project.
From looking at that error it looks like an issue with what the CAS issuer is sending to the service and this pathLen support wouldn't be related. pathLen is in the basicConstraints extension alongside the cA bit which is referenced in the error message. The cA bit is more important!

So to sum it up, this issue is likely related to the google-cas-issuer itself and not to cert-manager? Yeah, the cA bit is set, as is the keyCertSign bit. Sadly, it looks like the project really isn't getting any attention from Jetstack as of late.

That's correct, yeah. I haven't confirmed that but it'd be my suspicion that this is a cas-issuer thing :+1:


Where to view the list of projects?

When visiting http://github.khronos.org/glTF-Project-Explorer/, I see instructions for contributing but not a list of projects — have I missed the URL for that? Or is there an issue or PR to track making that list available?

Yikes, I will investigate ASAP. Not sure what happened. Stay tuned.

This is resolved. Accidentally removed skip_cleanup in Travis at some point.


refactor(types): clean up

:tada: This PR is included in version 1.4.0 :tada:
The release is available on GitHub release
Your semantic-release bot :package::rocket:


determine coordinator mode by is_grad

Why?
As described in https://github.com/microsoft/DeepSpeed/issues/4922, the mode of coordinator is determined by sub_module.training at pre and 1st post forward hook, but by is_grad at the 2nd post forward hook for the case of inference.
If model.train() and torch.no_grad() are both set, in pre and 1st post forward hook, the state of "train coordinator" is updated, but in 2nd post forward hook, the state of "inference coordinator" is cleared and reset. It means that the resetting is on "eval coordinator", so the state of "train coordinator" will keep accumulating.
Test
WIP

@ByronHsu - ping on Heyang's comment if you are able to follow up on that.

Closing due to lack response.


Unable to write in url while loading

Url text field is buggy during web page loading.

URL may change different times during loading.
No solution actually


genshinstats.get_spiral_abyss() method returns Yanfei character name as 'Feiyan'

i assume this is how they do in chinese, but here is my output:

also charcter icon too haha:
https://upload-os-bbs.mihoyo.com/game_record/genshin/character_icon/UI_AvatarIcon_Feiyan.png

Yup, that's a problem with how Mihoyo handles the endpoint. Normally you only get returned the character's id, rarity, and icon, I have to get the name by pulling it out of the icon. Multiple other characters already have this issue so I can just add it for Yanfei no problem.
Thanks for informing me.


Support SCRIPTS_DIR in config.sh

(Only) for maximizing REUSABILITY of scripts in different projects - in case scripts dir is already used by project
Affects:

[x] config.sh
[x] host_build_in_place.sh
[x] host_test.sh
[x] root_install_test_in_docker.sh
[x] venv_test_install_inplace.sh

Fixed in 267c5ea


Add support for system version 15.0.0

AAuth was updated.

For digital titles, the cert_key parameter was removed and it is no longer necessary to dump the application certificate. Instead, the Switch requests a contents authorization token from the dragons server.

I implemented 15.0.0 and 15.0.1 support locally. Things to do:

Update the example scripts. Test them.
Update the documentation.

Let me know when you push these changes

@TheGreatRambler I pushed my changes. It's become a bit more complicated because of the dragons thing (6 requests are required instead of 4 now).

Thank you for your awesome reverse engineering work, I'll take a look

Quick question about getting elicenses, what is the device id or did needed to obtain them? In this header NintendoSDK Firmware/%s (platform:NX; did:%016x; eid:lp1).

Figured it out. For anyone else its
# Obtain device ID from prodinfo
device_id = None
with open("ConsoleData/PRODINFO.dec", mode="rb") as file:
	data = file.read()
	device_id = int(data[0x546:0x556].decode("ascii"), 16)

I'm still unsure about NA_ID however

ERROR:nintendo.dragons:Dragons server returned an error: {'type': 'https://problems.dragons.nintendo.net/errors/v1/400/invalid_parameter', 'title': 'Parameter is invalid', 'detail': '', 'number': 400} with account_id.

Huh weird, I hope you're not banned. On my system, the na_id is indeed the same as the account_id of the elicense. Maybe check if you got it right with a man-in-the-middle on your Switch?

I can't actually MITM this one since the physical switch is with someone else, oh no

Which elicense_id should I use since there are many? I've been doing the first

None of them work anyway.

Did you check the rights id? This should be the same as the title id.
There are some exceptions, but in general, I have only one elicense for a given rights id.

I just tested it again, with Tetris 99. Works fine here.

Interesting, it does not.

Aha, apparently Super Mario Maker 2 is not on this switch (anymore?) I think I'll figure this out now

Okay I've confirmed Super Mario Maker 2 is on the switch, the only games that have elicenses however are Smash Ultimate DLCs and Among Us. Do elicenses not get automatically generated for every game you go online in?

When downloaded Tetris99 does not show up as an elicense.

I think I got the elicense right after I downloaded the game. I have no idea why it doesn't work for you :confused:

I would really recommend doing a mitm if there is any way that you can get your hands on the Switch. That is the safest way to figure out what your Switch is doing, and what's different.

I can't do it myself but I'll help the owner do that

Do you have some example code of using publish_device_linked_elicenses btw?

I've isolated it down to the header AccountAuthorization in
/v1/rights/publish_elicenses. Getting a token with dauth.ACCOUNT returns
invalid token however. The request returns no elicenses currently.
[image: image.png]
On Sat, Nov 19, 2022 at 2:18 PM Yannik Marchand @.***>
wrote:

I would really recommend doing a mitm if there is any way that you can get
your hands on the Switch. That is the safest way to figure out what your
Switch is doing, and what's different.
—
Reply to this email directly, view it on GitHub
https://github.com/kinnay/NintendoClients/issues/90#issuecomment-1320961424,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AHTNY2GUX3BP7ODWHWGDUATWJEYYLANCNFSM6AAAAAARDGSXCM
.
You are receiving this because you were mentioned.Message ID:
@.***>

Yeah the AccountAuthorization header is not a dauth token. It is an id token from https://accounts.nintendo.com.
I can't see your image btw.

Do you have some example code of using publish_device_linked_elicenses btw?

Maybe something like this:
from nintendo.dauth import DAuthClient
from nintendo.dragons import DragonsClient
from nintendo import switch
import anyio

async def main():
    keys = switch.load_keys("/path/to/prod.keys")

    info = switch.ProdInfo(keys, "/path/to/PRODINFO")
    cert = info.get_tls_cert()
    pkey = info.get_tls_key()

    dauth = DAuthClient(keys)
    dauth.set_certificate(cert, pkey)
    response = await dauth.device_token(dauth.DRAGONS)
    device_token = response["device_auth_token"]

    dragons = DragonsClient(info.get_device_id())
    dragons.set_certificate(cert, pkey)
    print(await dragons.publish_device_linked_elicenses(device_token))
anyio.run(main)

It looked exactly like that (I've since removed it from my codebase but it
did follow that structure), but I learned why my elicense doesn't show.
Mine is marked as temporary and not a device elicense, so it can only be
seen in publish_elicences which shows more than just device elicenses.
publish_elicences also have expiration times you have to respect. The image
I shared is here, it's just the headers captured during this session
https://imgur.com/a/hp6ZkWU. How can I obtain that id token btw?
On Thu, Dec 1, 2022 at 4:27 PM Yannik Marchand @.***>
wrote:

Yeah the AccountAuthorization header is not a dauth token. It is an id
token from https://accounts.nintendo.com.
I can't see your image btw.
Do you have some example code of using publish_device_linked_elicenses btw?
Maybe something like this:
from nintendo.dauth import DAuthClientfrom nintendo.dragons import DragonsClientfrom nintendo import switchimport anyio
async def main():
keys = switch.load_keys("/path/to/prod.keys")
info = switch.ProdInfo(keys, "/path/to/PRODINFO")
cert = info.get_tls_cert()
pkey = info.get_tls_key()

dauth = DAuthClient(keys)
dauth.set_certificate(cert, pkey)
response = await dauth.device_token(dauth.DRAGONS)
device_token = response["device_auth_token"]

dragons = DragonsClient(info.get_device_id())
dragons.set_certificate(cert, pkey)
print(await dragons.publish_device_linked_elicenses(device_token))anyio.run(main)

—
Reply to this email directly, view it on GitHub
https://github.com/kinnay/NintendoClients/issues/90#issuecomment-1334527762,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AHTNY2ELCP5WO3TIJEL6PRDWLEQ5XANCNFSM6AAAAAARDGSXCM
.
You are receiving this because you were mentioned.Message ID:
@.***>

Is it possible that this is a non-primary Switch? That might explain why your license is temporary. This sounds like you only get a permanent license on the primary Switch.
https://accounts.nintendo.com uses OAuth. A bit of it is explained here, but I don't really know the details yet.


docs: update GraphQL instructions

Hi there! Thank you for all of your work helping make neovim a powerful tool for developers.
I'm proposing an update to the GraphQL section of the docs. My experience was that the GraphQL language server would exit with an error when I opened a GraphQL file until I made two changes:

Globally installed the graphql package
Created a GraphQL config file in my project's root folder

Adding a note about these needs might help others who run into the same thing.
If it's helpful context, below are the errors I was receiving.

Missing module:
[ERROR][2022-02-26 17:20:55] .../vim/lsp/rpc.lua:420    "rpc"   "graphql-lsp"   "stderr"        "node:internal/modules/cjs/loader:936
  throw err;
  ^

Error: Cannot find module 'graphql'
Require stack:
- /home/mmirus/.config/yarn/global/node_modules/graphql-language-service-cli/dist/client.js
- /home/mmirus/.config/yarn/global/node_modules/graphql-language-service-cli/dist/cli.js
- /home/mmirus/.config/yarn/global/node_modules/graphql-language-service-cli/bin/graphql.js
    at Function.Module._resolveFilename (node:internal/modules/cjs/loader:933:15)
    at Function.Module._load (node:internal/modules/cjs/loader:778:27)
    at Module.require (node:internal/modules/cjs/loader:1005:19)
    at require (node:internal/modules/cjs/helpers:102:18)
    at Object.<anonymous> (/home/mmirus/.config/yarn/global/node_modules/graphql-language-service-cli/dist/client.js:8:19)
    at Module._compile (node:internal/modules/cjs/loader:1101:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Module.require (node:internal/modules/cjs/loader:1005:19) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    '/home/mmirus/.config/yarn/global/node_modules/graphql-language-service-cli/dist/client.js',
    '/home/mmirus/.config/yarn/global/node_modules/graphql-language-service-cli/dist/cli.js',
    '/home/mmirus/.config/yarn/global/node_modules/graphql-language-service-cli/bin/graphql.js'
  ]
}
"

Missing config:
[ERROR][2022-02-26 17:32:20] .../vim/lsp/rpc.lua:420    "rpc"   "graphql-lsp"   "stderr"        "2/26/2022, 5:32:20 PM [1] (pid: 2059291) graphql-language-service-usage-logs: ConfigNotFoundError: GraphQL Config file is not available in the provided config directory: /home/mmirus/git/the-project-folder
Please check the config directory.
"

The failing check seems like an error with the workflow. It's failing on a file that I didn't change. https://github.com/neovim/nvim-lspconfig/runs/5354100024?check_suite_focus=true