From 8c1d7b7bd9ecb50a4b2c63dbf0ff196f376701ee Mon Sep 17 00:00:00 2001 From: DiyiWi <809290733@qq.com> Date: Thu, 16 Dec 2021 14:33:02 +0800 Subject: [PATCH 1/2] feat(fabric):support simple dynamic validator --- validator/fabric_simple_dynamic_validator.go | 111 +++++++++++++++++++ validator/validation_engine.go | 41 ++++--- 2 files changed, 135 insertions(+), 17 deletions(-) create mode 100644 validator/fabric_simple_dynamic_validator.go diff --git a/validator/fabric_simple_dynamic_validator.go b/validator/fabric_simple_dynamic_validator.go new file mode 100644 index 0000000..1d1300f --- /dev/null +++ b/validator/fabric_simple_dynamic_validator.go @@ -0,0 +1,111 @@ +package validator + +import ( + "crypto/ecdsa" + "crypto/sha256" + "crypto/x509" + "encoding/json" + "encoding/pem" + "fmt" + "sort" + "sync" + + "github.com/meshplus/bitxhub-core/validator/validatorlib" + "github.com/sirupsen/logrus" +) + +// Validator is the instance that can use wasm to verify transaction validity +type FabSimDynamicValidator struct { + logger logrus.FieldLogger + pkMap *sync.Map +} + +type DynamicProof struct { + Proof []byte `json:"proof"` + height uint64 `json:"height"` +} + +type DynamicValidator struct { + Height []uint64 `json:"height"` + Pem []string `json:"pem"` +} + +// New a validator instance +func NewFabSimDynamicValidator(logger logrus.FieldLogger) *FabSimDynamicValidator { + return &FabSimDynamicValidator{ + logger: logger, + pkMap: &sync.Map{}, + } +} + +// Verify will check whether the transaction info is valid +func (vlt *FabSimDynamicValidator) Verify(from string, proof, payload []byte, validators string) (bool, uint64, error) { + // ----------------parse proof and validators start---------------------------- + dynamicProof := &DynamicProof{} + err := json.Unmarshal(proof, dynamicProof) + if err != nil { + return false, 0, err + } + dynamicValidator := &DynamicValidator{} + err = json.Unmarshal([]byte(validators), dynamicValidator) + if err != nil { + return false, 0, err + } + // Check that the array is in order and that pem length is equal to height length + if len(dynamicValidator.Height) == 0 || len(dynamicValidator.Height) != len(dynamicValidator.Pem) { + return false, 0, fmt.Errorf("len of dynamic validator invalid ") + } + for i := 0; i < len(dynamicValidator.Height)-1; i++ { + if dynamicValidator.Height[i] > dynamicValidator.Height[i+1] { + return false, 0, fmt.Errorf("dynamic validator height slice not ordered") + } + } + if dynamicProof.height >= dynamicValidator.Height[len(dynamicValidator.Height)-1] { + validators = dynamicValidator.Pem[len(dynamicValidator.Height)-1] + } else { + index := sort.Search(len(dynamicValidator.Height), func(i int) bool { return dynamicValidator.Height[i+1] > dynamicProof.height }) + validators = dynamicValidator.Pem[index] + } + // ----------------parse proof and validators end---------------------------- + + artifact, err := validatorlib.PreCheck(dynamicProof.Proof, payload, "broker") + if err != nil { + return false, 0, err + } + + signatureSet := validatorlib.GetSignatureSet(artifact) + + var pk *ecdsa.PublicKey + raw, ok := vlt.pkMap.Load(from) + if !ok { + pemCert, _ := pem.Decode([]byte(validators)) + if pemCert == nil { + return false, 0, fmt.Errorf("invalid validators information: %s", validators) + } + cert, err := x509.ParseCertificate(pemCert.Bytes) + if err != nil { + return false, 0, err + } + pk = cert.PublicKey.(*ecdsa.PublicKey) + vlt.pkMap.Store(from, pk) + } else { + pk = raw.(*ecdsa.PublicKey) + } + + r, s, err := unmarshalECDSASignature(signatureSet[0].Signature) + if err != nil { + return false, 0, err + } + + h := sha256.New() + _, err = h.Write(signatureSet[0].Data) + if err != nil { + return false, 0, err + } + ret := h.Sum(nil) + isValid := ecdsa.Verify(pk, ret, r, s) + if !isValid { + return false, 0, fmt.Errorf("signature not right") + } + return true, 0, nil +} diff --git a/validator/validation_engine.go b/validator/validation_engine.go index 4d7cd62..3479f80 100644 --- a/validator/validation_engine.go +++ b/validator/validation_engine.go @@ -9,32 +9,35 @@ import ( ) const ( - FabricRuleAddr = "0x00000000000000000000000000000000000000a0" - SimFabricRuleAddr = "0x00000000000000000000000000000000000000a1" - HappyRuleAddr = "0x00000000000000000000000000000000000000a2" + FabricRuleAddr = "0x00000000000000000000000000000000000000a0" + SimFabricRuleAddr = "0x00000000000000000000000000000000000000a1" + HappyRuleAddr = "0x00000000000000000000000000000000000000a2" + SimDynamicFabricRuleAddr = "0x00000000000000000000000000000000000000a3" ) // Validator is the instance that can use wasm to verify transaction validity type ValidationEngine struct { - instances *sync.Map - fabValidator Validator - simFabValidator Validator - happyValidator Validator - wasmGasLimit uint64 - ledger Ledger - logger logrus.FieldLogger + instances *sync.Map + fabValidator Validator + simFabValidator Validator + simDynamicFabValidator Validator + happyValidator Validator + wasmGasLimit uint64 + ledger Ledger + logger logrus.FieldLogger } // New a validator instance func NewValidationEngine(ledger Ledger, instances *sync.Map, logger logrus.FieldLogger, gasLimit uint64) *ValidationEngine { return &ValidationEngine{ - ledger: ledger, - logger: logger, - fabValidator: NewFabV14Validator(logger), - simFabValidator: NewFabSimValidator(logger), - happyValidator: &HappyValidator{}, - instances: instances, - wasmGasLimit: gasLimit, + ledger: ledger, + logger: logger, + fabValidator: NewFabV14Validator(logger), + simFabValidator: NewFabSimValidator(logger), + simDynamicFabValidator: NewFabSimDynamicValidator(logger), + happyValidator: &HappyValidator{}, + instances: instances, + wasmGasLimit: gasLimit, } } @@ -57,6 +60,10 @@ func (ve *ValidationEngine) getValidator(address string) (Validator, error) { return ve.simFabValidator, nil } + if address == SimDynamicFabricRuleAddr { + return ve.simDynamicFabValidator, nil + } + if address == HappyRuleAddr { return ve.happyValidator, nil } From 86ce34a6884b5d1e1609e956a61c514ba994714a Mon Sep 17 00:00:00 2001 From: DiyiWi <809290733@qq.com> Date: Mon, 20 Dec 2021 15:22:43 +0800 Subject: [PATCH 2/2] feat(fabric):support v14 dynamic validator --- validator/fabric_simple_dynamic_validator.go | 56 ++------------ validator/fabric_v14_dynamic_validator.go | 73 +++++++++++++++++++ validator/testdata/dynamic_validator_1.0.0_rc | 7 ++ validator/validation_engine.go | 7 ++ validator/validatorlib/fabric_validation.go | 8 ++ 5 files changed, 100 insertions(+), 51 deletions(-) create mode 100644 validator/fabric_v14_dynamic_validator.go create mode 100644 validator/testdata/dynamic_validator_1.0.0_rc diff --git a/validator/fabric_simple_dynamic_validator.go b/validator/fabric_simple_dynamic_validator.go index 1d1300f..31abd36 100644 --- a/validator/fabric_simple_dynamic_validator.go +++ b/validator/fabric_simple_dynamic_validator.go @@ -1,23 +1,17 @@ package validator import ( - "crypto/ecdsa" - "crypto/sha256" - "crypto/x509" "encoding/json" - "encoding/pem" "fmt" "sort" - "sync" - "github.com/meshplus/bitxhub-core/validator/validatorlib" "github.com/sirupsen/logrus" ) // Validator is the instance that can use wasm to verify transaction validity type FabSimDynamicValidator struct { - logger logrus.FieldLogger - pkMap *sync.Map + logger logrus.FieldLogger + simFabValidator Validator } type DynamicProof struct { @@ -33,8 +27,8 @@ type DynamicValidator struct { // New a validator instance func NewFabSimDynamicValidator(logger logrus.FieldLogger) *FabSimDynamicValidator { return &FabSimDynamicValidator{ - logger: logger, - pkMap: &sync.Map{}, + logger: logger, + simFabValidator: NewFabSimValidator(logger), } } @@ -67,45 +61,5 @@ func (vlt *FabSimDynamicValidator) Verify(from string, proof, payload []byte, va validators = dynamicValidator.Pem[index] } // ----------------parse proof and validators end---------------------------- - - artifact, err := validatorlib.PreCheck(dynamicProof.Proof, payload, "broker") - if err != nil { - return false, 0, err - } - - signatureSet := validatorlib.GetSignatureSet(artifact) - - var pk *ecdsa.PublicKey - raw, ok := vlt.pkMap.Load(from) - if !ok { - pemCert, _ := pem.Decode([]byte(validators)) - if pemCert == nil { - return false, 0, fmt.Errorf("invalid validators information: %s", validators) - } - cert, err := x509.ParseCertificate(pemCert.Bytes) - if err != nil { - return false, 0, err - } - pk = cert.PublicKey.(*ecdsa.PublicKey) - vlt.pkMap.Store(from, pk) - } else { - pk = raw.(*ecdsa.PublicKey) - } - - r, s, err := unmarshalECDSASignature(signatureSet[0].Signature) - if err != nil { - return false, 0, err - } - - h := sha256.New() - _, err = h.Write(signatureSet[0].Data) - if err != nil { - return false, 0, err - } - ret := h.Sum(nil) - isValid := ecdsa.Verify(pk, ret, r, s) - if !isValid { - return false, 0, fmt.Errorf("signature not right") - } - return true, 0, nil + return vlt.simFabValidator.Verify(from, dynamicProof.Proof, payload, validators) } diff --git a/validator/fabric_v14_dynamic_validator.go b/validator/fabric_v14_dynamic_validator.go new file mode 100644 index 0000000..215e9c5 --- /dev/null +++ b/validator/fabric_v14_dynamic_validator.go @@ -0,0 +1,73 @@ +package validator + +import ( + "encoding/json" + "fmt" + "sort" + + "github.com/meshplus/bitxhub-core/validator/validatorlib" + "github.com/sirupsen/logrus" +) + +// Validator is the instance that can use wasm to verify transaction validity +type FabV14DynamicValidator struct { + logger logrus.FieldLogger + fabValidator Validator +} + +type V14DynamicValidator struct { + Height []uint64 `json:"height"` + ChainId string `json:"chain_id"` + ConfByte []string `json:"conf_byte"` + Policy []string `json:"policy"` + Cid string `json:"cid"` +} + +// New a validator instance +func NewFabV14DynamicValidator(logger logrus.FieldLogger) *FabV14DynamicValidator { + return &FabV14DynamicValidator{ + logger: logger, + fabValidator: NewFabV14Validator(logger), + } +} + +// Verify will check whether the transaction info is valid +func (vlt *FabV14DynamicValidator) Verify(from string, proof, payload []byte, validators string) (bool, uint64, error) { + // ----------------parse proof and validators start---------------------------- + dynamicProof := &DynamicProof{} + err := json.Unmarshal(proof, dynamicProof) + if err != nil { + return false, 0, err + } + dynamicValidator := &V14DynamicValidator{} + err = json.Unmarshal([]byte(validators), dynamicValidator) + if err != nil { + return false, 0, err + } + // Check that the array is in order and that pem length is equal to height length + if len(dynamicValidator.Height) == 0 || len(dynamicValidator.Height) != len(dynamicValidator.Policy) { + return false, 0, fmt.Errorf("len of dynamic validator invalid ") + } + for i := 0; i < len(dynamicValidator.Height)-1; i++ { + if dynamicValidator.Height[i] > dynamicValidator.Height[i+1] { + return false, 0, fmt.Errorf("dynamic validator height slice not ordered") + } + } + if dynamicProof.height >= dynamicValidator.Height[len(dynamicValidator.Height)-1] { + validators = dynamicValidator.Policy[len(dynamicValidator.Height)-1] + } else { + index := sort.Search(len(dynamicValidator.Height), func(i int) bool { return dynamicValidator.Height[i+1] > dynamicProof.height }) + validators = dynamicValidator.Policy[index] + } + validatorInfo, err := validatorlib.MarshalValidatorInfo(&validatorlib.ValidatorInfo{ + ChainId: dynamicValidator.ChainId, + ConfByte: dynamicValidator.ConfByte, + Cid: dynamicValidator.Cid, + Policy: validators, + }) + if err != nil { + return false, 0, err + } + // ----------------parse proof and validators end---------------------------- + return vlt.fabValidator.Verify(from, dynamicProof.Proof, payload, string(validatorInfo)) +} diff --git a/validator/testdata/dynamic_validator_1.0.0_rc b/validator/testdata/dynamic_validator_1.0.0_rc new file mode 100644 index 0000000..5feacbd --- /dev/null +++ b/validator/testdata/dynamic_validator_1.0.0_rc @@ -0,0 +1,7 @@ +{ + "conf_byte": ["config:\"\\n\\nOrdererMSP\\022\\307\\006-----BEGIN CERTIFICATE-----\\nMIICPTCCAeSgAwIBAgIRAIBSWrAozETBRvZ9CE4maGUwCgYIKoZIzj0EAwIwaTEL\\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\\ncmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt\\ncGxlLmNvbTAeFw0yMDA4MDQyMDIwMDBaFw0zMDA4MDIyMDIwMDBaMGkxCzAJBgNV\\nBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp\\nc2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEXMBUGA1UEAxMOY2EuZXhhbXBsZS5j\\nb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQa/t1+DEXi/CbleEWO0qiL74FA\\ngPWVzu305334eOAtIENTJE8q9nbbWQ4Gm2l1EN0ttFwR0q+c+rp3JIR7OAhDo20w\\nazAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB\\nMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEILxx4FUSaSQ3rdC7XqpEnkX9+xOd\\nWJA2aFNCc4oeMXELMAoGCCqGSM49BAMCA0cAMEQCIFsCH1V0Mm8m29KxhKpAYzvo\\nuE2OcHBWl6Tu5srwurhjAiAkqY1CtHTN8BN6YvBcFWZo7yLmH9EGNZJ7HYiYp1D9\\nWQ==\\n-----END CERTIFICATE-----\\nB\\016\\n\\004SHA2\\022\\006SHA256J\\317\\006-----BEGIN CERTIFICATE-----\\nMIICRDCCAeqgAwIBAgIRAJbz7kwm1Ecvc41nnaGk/KMwCgYIKoZIzj0EAwIwbDEL\\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\\ncmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5l\\neGFtcGxlLmNvbTAeFw0yMDA4MDQyMDIwMDBaFw0zMDA4MDIyMDIwMDBaMGwxCzAJ\\nBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJh\\nbmNpc2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEaMBgGA1UEAxMRdGxzY2EuZXhh\\nbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATswcWw9LMaIB4Lyr6E\\nTyIYzLWfvjZmIFfUUXZZm5HkAdudOrW3QcHA+E9cqN8eBWdvjgTUTYx+wrjWn68K\\nh8Uvo20wazAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsG\\nAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIEWIAZ9FTx3X37U09xw6\\n/i9IG4My65uDgpBgcFbJ5j5iMAoGCCqGSM49BAMCA0gAMEUCIQDOwoXVD57GLo0J\\n3/j8kWdCdLtL9LF2z5vSQ/oqkzMSAwIgMuXq5AjSogy88SnQVt+2SRGrh1B9qEul\\nNfz0FygFt7U=\\n-----END CERTIFICATE-----\\nZ\\324\\032\\010\\001\\022\\322\\006\\n\\307\\006-----BEGIN CERTIFICATE-----\\nMIICPTCCAeSgAwIBAgIRAIBSWrAozETBRvZ9CE4maGUwCgYIKoZIzj0EAwIwaTEL\\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\\ncmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt\\ncGxlLmNvbTAeFw0yMDA4MDQyMDIwMDBaFw0zMDA4MDIyMDIwMDBaMGkxCzAJBgNV\\nBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp\\nc2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEXMBUGA1UEAxMOY2EuZXhhbXBsZS5j\\nb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQa/t1+DEXi/CbleEWO0qiL74FA\\ngPWVzu305334eOAtIENTJE8q9nbbWQ4Gm2l1EN0ttFwR0q+c+rp3JIR7OAhDo20w\\nazAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB\\nMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEILxx4FUSaSQ3rdC7XqpEnkX9+xOd\\nWJA2aFNCc4oeMXELMAoGCCqGSM49BAMCA0cAMEQCIFsCH1V0Mm8m29KxhKpAYzvo\\nuE2OcHBWl6Tu5srwurhjAiAkqY1CtHTN8BN6YvBcFWZo7yLmH9EGNZJ7HYiYp1D9\\nWQ==\\n-----END CERTIFICATE-----\\n\\022\\006client\\032\\320\\006\\n\\307\\006-----BEGIN CERTIFICATE-----\\nMIICPTCCAeSgAwIBAgIRAIBSWrAozETBRvZ9CE4maGUwCgYIKoZIzj0EAwIwaTEL\\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\\ncmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt\\ncGxlLmNvbTAeFw0yMDA4MDQyMDIwMDBaFw0zMDA4MDIyMDIwMDBaMGkxCzAJBgNV\\nBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp\\nc2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEXMBUGA1UEAxMOY2EuZXhhbXBsZS5j\\nb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQa/t1+DEXi/CbleEWO0qiL74FA\\ngPWVzu305334eOAtIENTJE8q9nbbWQ4Gm2l1EN0ttFwR0q+c+rp3JIR7OAhDo20w\\nazAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB\\nMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEILxx4FUSaSQ3rdC7XqpEnkX9+xOd\\nWJA2aFNCc4oeMXELMAoGCCqGSM49BAMCA0cAMEQCIFsCH1V0Mm8m29KxhKpAYzvo\\nuE2OcHBWl6Tu5srwurhjAiAkqY1CtHTN8BN6YvBcFWZo7yLmH9EGNZJ7HYiYp1D9\\nWQ==\\n-----END CERTIFICATE-----\\n\\022\\004peer\\\"\\321\\006\\n\\307\\006-----BEGIN CERTIFICATE-----\\nMIICPTCCAeSgAwIBAgIRAIBSWrAozETBRvZ9CE4maGUwCgYIKoZIzj0EAwIwaTEL\\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\\ncmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt\\ncGxlLmNvbTAeFw0yMDA4MDQyMDIwMDBaFw0zMDA4MDIyMDIwMDBaMGkxCzAJBgNV\\nBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp\\nc2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEXMBUGA1UEAxMOY2EuZXhhbXBsZS5j\\nb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQa/t1+DEXi/CbleEWO0qiL74FA\\ngPWVzu305334eOAtIENTJE8q9nbbWQ4Gm2l1EN0ttFwR0q+c+rp3JIR7OAhDo20w\\nazAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB\\nMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEILxx4FUSaSQ3rdC7XqpEnkX9+xOd\\nWJA2aFNCc4oeMXELMAoGCCqGSM49BAMCA0cAMEQCIFsCH1V0Mm8m29KxhKpAYzvo\\nuE2OcHBWl6Tu5srwurhjAiAkqY1CtHTN8BN6YvBcFWZo7yLmH9EGNZJ7HYiYp1D9\\nWQ==\\n-----END CERTIFICATE-----\\n\\022\\005admin*\\323\\006\\n\\307\\006-----BEGIN CERTIFICATE-----\\nMIICPTCCAeSgAwIBAgIRAIBSWrAozETBRvZ9CE4maGUwCgYIKoZIzj0EAwIwaTEL\\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\\ncmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt\\ncGxlLmNvbTAeFw0yMDA4MDQyMDIwMDBaFw0zMDA4MDIyMDIwMDBaMGkxCzAJBgNV\\nBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp\\nc2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEXMBUGA1UEAxMOY2EuZXhhbXBsZS5j\\nb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQa/t1+DEXi/CbleEWO0qiL74FA\\ngPWVzu305334eOAtIENTJE8q9nbbWQ4Gm2l1EN0ttFwR0q+c+rp3JIR7OAhDo20w\\nazAOBgNVHQ8BAf8EBAMCAaYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB\\nMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEILxx4FUSaSQ3rdC7XqpEnkX9+xOd\\nWJA2aFNCc4oeMXELMAoGCCqGSM49BAMCA0cAMEQCIFsCH1V0Mm8m29KxhKpAYzvo\\nuE2OcHBWl6Tu5srwurhjAiAkqY1CtHTN8BN6YvBcFWZo7yLmH9EGNZJ7HYiYp1D9\\nWQ==\\n-----END CERTIFICATE-----\\n\\022\\007orderer\" ", "config:\"\\n\\007Org2MSP\\022\\337\\006-----BEGIN CERTIFICATE-----\\nMIICUTCCAfigAwIBAgIRAO4vAqUpJO7ZjmG0YdIzcAswCgYIKoZIzj0EAwIwczEL\\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\\ncmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\\nLm9yZzIuZXhhbXBsZS5jb20wHhcNMjAwODA0MjAyMDAwWhcNMzAwODAyMjAyMDAw\\nWjBzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN\\nU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEcMBoGA1UE\\nAxMTY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\\nBJjSzSupav9mnD1RP/VPgFuEnsTVD2NE78lszqMdE+og7P+TZnKuqZP0cuu7kM91\\nsqJGbH9evxc0djagFxSJB16jbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNVHSUEFjAU\\nBggrBgEFBQcDAgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQg\\nQUONUuzvq4uUgsAUzKmVHCiuE2XbCYkE1asPRyTmvAcwCgYIKoZIzj0EAwIDRwAw\\nRAIgNbc7aulL71giV7Dm4+PTLyD0uWBbGQ0L2WRDSskMoHQCIFlYSGBC2dfsrOJi\\nsVbJFulsnO3mPNnmbjrdcZKpuzfJ\\n-----END CERTIFICATE-----\\nB\\016\\n\\004SHA2\\022\\006SHA256J\\347\\006-----BEGIN CERTIFICATE-----\\nMIICVzCCAf6gAwIBAgIRAN73WXJhRKQBxo65+t3k+kQwCgYIKoZIzj0EAwIwdjEL\\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\\ncmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs\\nc2NhLm9yZzIuZXhhbXBsZS5jb20wHhcNMjAwODA0MjAyMDAwWhcNMzAwODAyMjAy\\nMDAwWjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE\\nBxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEfMB0G\\nA1UEAxMWdGxzY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49\\nAwEHA0IABKrzvNuNg8eYN0ajX6EQX7gdRH8KmuxVxFrRKpzOnH1cQIbDG3EWIwI4\\nAX27V3V3lW2cHZLNWeVVGLYu3G++ZAajbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNV\\nHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNV\\nHQ4EIgQgO/HUE9Ak9Ta8xgR8/T+yzegutHSyvap4ZDZpd5ScBmswCgYIKoZIzj0E\\nAwIDRwAwRAIgQpoqEL9fOcM5uyLHU7CXoOmO4y1MY03N5+5gVOPr2SwCIAqWuSqF\\nbAaCAy0Gc7ronKP1L1UbkgxCqE7mI+LkVAHC\\n-----END CERTIFICATE-----\\nZ\\264\\033\\010\\001\\022\\352\\006\\n\\337\\006-----BEGIN CERTIFICATE-----\\nMIICUTCCAfigAwIBAgIRAO4vAqUpJO7ZjmG0YdIzcAswCgYIKoZIzj0EAwIwczEL\\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\\ncmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\\nLm9yZzIuZXhhbXBsZS5jb20wHhcNMjAwODA0MjAyMDAwWhcNMzAwODAyMjAyMDAw\\nWjBzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN\\nU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEcMBoGA1UE\\nAxMTY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\\nBJjSzSupav9mnD1RP/VPgFuEnsTVD2NE78lszqMdE+og7P+TZnKuqZP0cuu7kM91\\nsqJGbH9evxc0djagFxSJB16jbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNVHSUEFjAU\\nBggrBgEFBQcDAgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQg\\nQUONUuzvq4uUgsAUzKmVHCiuE2XbCYkE1asPRyTmvAcwCgYIKoZIzj0EAwIDRwAw\\nRAIgNbc7aulL71giV7Dm4+PTLyD0uWBbGQ0L2WRDSskMoHQCIFlYSGBC2dfsrOJi\\nsVbJFulsnO3mPNnmbjrdcZKpuzfJ\\n-----END CERTIFICATE-----\\n\\022\\006client\\032\\350\\006\\n\\337\\006-----BEGIN CERTIFICATE-----\\nMIICUTCCAfigAwIBAgIRAO4vAqUpJO7ZjmG0YdIzcAswCgYIKoZIzj0EAwIwczEL\\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\\ncmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\\nLm9yZzIuZXhhbXBsZS5jb20wHhcNMjAwODA0MjAyMDAwWhcNMzAwODAyMjAyMDAw\\nWjBzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN\\nU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEcMBoGA1UE\\nAxMTY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\\nBJjSzSupav9mnD1RP/VPgFuEnsTVD2NE78lszqMdE+og7P+TZnKuqZP0cuu7kM91\\nsqJGbH9evxc0djagFxSJB16jbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNVHSUEFjAU\\nBggrBgEFBQcDAgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQg\\nQUONUuzvq4uUgsAUzKmVHCiuE2XbCYkE1asPRyTmvAcwCgYIKoZIzj0EAwIDRwAw\\nRAIgNbc7aulL71giV7Dm4+PTLyD0uWBbGQ0L2WRDSskMoHQCIFlYSGBC2dfsrOJi\\nsVbJFulsnO3mPNnmbjrdcZKpuzfJ\\n-----END CERTIFICATE-----\\n\\022\\004peer\\\"\\351\\006\\n\\337\\006-----BEGIN CERTIFICATE-----\\nMIICUTCCAfigAwIBAgIRAO4vAqUpJO7ZjmG0YdIzcAswCgYIKoZIzj0EAwIwczEL\\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\\ncmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\\nLm9yZzIuZXhhbXBsZS5jb20wHhcNMjAwODA0MjAyMDAwWhcNMzAwODAyMjAyMDAw\\nWjBzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN\\nU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEcMBoGA1UE\\nAxMTY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\\nBJjSzSupav9mnD1RP/VPgFuEnsTVD2NE78lszqMdE+og7P+TZnKuqZP0cuu7kM91\\nsqJGbH9evxc0djagFxSJB16jbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNVHSUEFjAU\\nBggrBgEFBQcDAgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQg\\nQUONUuzvq4uUgsAUzKmVHCiuE2XbCYkE1asPRyTmvAcwCgYIKoZIzj0EAwIDRwAw\\nRAIgNbc7aulL71giV7Dm4+PTLyD0uWBbGQ0L2WRDSskMoHQCIFlYSGBC2dfsrOJi\\nsVbJFulsnO3mPNnmbjrdcZKpuzfJ\\n-----END CERTIFICATE-----\\n\\022\\005admin*\\353\\006\\n\\337\\006-----BEGIN CERTIFICATE-----\\nMIICUTCCAfigAwIBAgIRAO4vAqUpJO7ZjmG0YdIzcAswCgYIKoZIzj0EAwIwczEL\\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\\ncmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\\nLm9yZzIuZXhhbXBsZS5jb20wHhcNMjAwODA0MjAyMDAwWhcNMzAwODAyMjAyMDAw\\nWjBzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN\\nU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEcMBoGA1UE\\nAxMTY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\\nBJjSzSupav9mnD1RP/VPgFuEnsTVD2NE78lszqMdE+og7P+TZnKuqZP0cuu7kM91\\nsqJGbH9evxc0djagFxSJB16jbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNVHSUEFjAU\\nBggrBgEFBQcDAgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQg\\nQUONUuzvq4uUgsAUzKmVHCiuE2XbCYkE1asPRyTmvAcwCgYIKoZIzj0EAwIDRwAw\\nRAIgNbc7aulL71giV7Dm4+PTLyD0uWBbGQ0L2WRDSskMoHQCIFlYSGBC2dfsrOJi\\nsVbJFulsnO3mPNnmbjrdcZKpuzfJ\\n-----END CERTIFICATE-----\\n\\022\\007orderer\" ", "config:\"\\n\\007Org1MSP\\022\\337\\006-----BEGIN CERTIFICATE-----\\nMIICUDCCAfegAwIBAgIQRQHZ2Xk4+PTEDsDh1p5fkzAKBggqhkjOPQQDAjBzMQsw\\nCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy\\nYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu\\nb3JnMS5leGFtcGxlLmNvbTAeFw0yMDA4MDQyMDIwMDBaFw0zMDA4MDIyMDIwMDBa\\nMHMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T\\nYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMRwwGgYDVQQD\\nExNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\\n+25rYajOK8UcMWSpeqA2VOKfSpajyWFOg/KsaZ1SOHBJ8YmbcvZWPkBkpqGtS/rR\\nGAOEZTMgHcXTfzzhu2Spw6NtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQG\\nCCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCA8\\na93yp20xFCn/1UiPWb/VV4lJZVvYKEaAmoC2zhZE7DAKBggqhkjOPQQDAgNHADBE\\nAiAxKOwUx1WGBo74z/RLU6KeP9rVX9sBYTVUykzHAnCyWwIgQzOHx47BCtljISHq\\n5XCpjFi/QRdIVRMpoEWQxlPnPDA=\\n-----END CERTIFICATE-----\\nB\\016\\n\\004SHA2\\022\\006SHA256J\\353\\006-----BEGIN CERTIFICATE-----\\nMIICWDCCAf6gAwIBAgIRAI+9ivoQvyHv8CCxVYcKV6AwCgYIKoZIzj0EAwIwdjEL\\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\\ncmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs\\nc2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMjAwODA0MjAyMDAwWhcNMzAwODAyMjAy\\nMDAwWjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE\\nBxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0G\\nA1UEAxMWdGxzY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49\\nAwEHA0IABIgYXx7eYBFC2YsMiVls7iagWYgc9jjcHbd/XBLMo2iiHSa56oapg5jX\\nO06VZ5t2QcbqrQWgPW2JPkRRxS40NbejbTBrMA4GA1UdDwEB/wQEAwIBpjAdBgNV\\nHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zApBgNV\\nHQ4EIgQgN2J9mBran9JAzXthM9o/wwQMPsJpEZiAFMsDPha9krUwCgYIKoZIzj0E\\nAwIDSAAwRQIhAJYw1NkJEKWujCvByScwuWALb7G7eqEjN1jk0XFmHi7AAiAL8k/z\\n2/BuA3zvylaX/EKZU9vREd68l5sIREM20RusGw==\\n-----END CERTIFICATE-----\\nZ\\264\\033\\010\\001\\022\\352\\006\\n\\337\\006-----BEGIN CERTIFICATE-----\\nMIICUDCCAfegAwIBAgIQRQHZ2Xk4+PTEDsDh1p5fkzAKBggqhkjOPQQDAjBzMQsw\\nCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy\\nYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu\\nb3JnMS5leGFtcGxlLmNvbTAeFw0yMDA4MDQyMDIwMDBaFw0zMDA4MDIyMDIwMDBa\\nMHMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T\\nYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMRwwGgYDVQQD\\nExNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\\n+25rYajOK8UcMWSpeqA2VOKfSpajyWFOg/KsaZ1SOHBJ8YmbcvZWPkBkpqGtS/rR\\nGAOEZTMgHcXTfzzhu2Spw6NtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQG\\nCCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCA8\\na93yp20xFCn/1UiPWb/VV4lJZVvYKEaAmoC2zhZE7DAKBggqhkjOPQQDAgNHADBE\\nAiAxKOwUx1WGBo74z/RLU6KeP9rVX9sBYTVUykzHAnCyWwIgQzOHx47BCtljISHq\\n5XCpjFi/QRdIVRMpoEWQxlPnPDA=\\n-----END CERTIFICATE-----\\n\\022\\006client\\032\\350\\006\\n\\337\\006-----BEGIN CERTIFICATE-----\\nMIICUDCCAfegAwIBAgIQRQHZ2Xk4+PTEDsDh1p5fkzAKBggqhkjOPQQDAjBzMQsw\\nCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy\\nYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu\\nb3JnMS5leGFtcGxlLmNvbTAeFw0yMDA4MDQyMDIwMDBaFw0zMDA4MDIyMDIwMDBa\\nMHMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T\\nYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMRwwGgYDVQQD\\nExNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\\n+25rYajOK8UcMWSpeqA2VOKfSpajyWFOg/KsaZ1SOHBJ8YmbcvZWPkBkpqGtS/rR\\nGAOEZTMgHcXTfzzhu2Spw6NtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQG\\nCCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCA8\\na93yp20xFCn/1UiPWb/VV4lJZVvYKEaAmoC2zhZE7DAKBggqhkjOPQQDAgNHADBE\\nAiAxKOwUx1WGBo74z/RLU6KeP9rVX9sBYTVUykzHAnCyWwIgQzOHx47BCtljISHq\\n5XCpjFi/QRdIVRMpoEWQxlPnPDA=\\n-----END CERTIFICATE-----\\n\\022\\004peer\\\"\\351\\006\\n\\337\\006-----BEGIN CERTIFICATE-----\\nMIICUDCCAfegAwIBAgIQRQHZ2Xk4+PTEDsDh1p5fkzAKBggqhkjOPQQDAjBzMQsw\\nCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy\\nYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu\\nb3JnMS5leGFtcGxlLmNvbTAeFw0yMDA4MDQyMDIwMDBaFw0zMDA4MDIyMDIwMDBa\\nMHMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T\\nYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMRwwGgYDVQQD\\nExNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\\n+25rYajOK8UcMWSpeqA2VOKfSpajyWFOg/KsaZ1SOHBJ8YmbcvZWPkBkpqGtS/rR\\nGAOEZTMgHcXTfzzhu2Spw6NtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQG\\nCCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCA8\\na93yp20xFCn/1UiPWb/VV4lJZVvYKEaAmoC2zhZE7DAKBggqhkjOPQQDAgNHADBE\\nAiAxKOwUx1WGBo74z/RLU6KeP9rVX9sBYTVUykzHAnCyWwIgQzOHx47BCtljISHq\\n5XCpjFi/QRdIVRMpoEWQxlPnPDA=\\n-----END CERTIFICATE-----\\n\\022\\005admin*\\353\\006\\n\\337\\006-----BEGIN CERTIFICATE-----\\nMIICUDCCAfegAwIBAgIQRQHZ2Xk4+PTEDsDh1p5fkzAKBggqhkjOPQQDAjBzMQsw\\nCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy\\nYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu\\nb3JnMS5leGFtcGxlLmNvbTAeFw0yMDA4MDQyMDIwMDBaFw0zMDA4MDIyMDIwMDBa\\nMHMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T\\nYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMRwwGgYDVQQD\\nExNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\\n+25rYajOK8UcMWSpeqA2VOKfSpajyWFOg/KsaZ1SOHBJ8YmbcvZWPkBkpqGtS/rR\\nGAOEZTMgHcXTfzzhu2Spw6NtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQG\\nCCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCA8\\na93yp20xFCn/1UiPWb/VV4lJZVvYKEaAmoC2zhZE7DAKBggqhkjOPQQDAgNHADBE\\nAiAxKOwUx1WGBo74z/RLU6KeP9rVX9sBYTVUykzHAnCyWwIgQzOHx47BCtljISHq\\n5XCpjFi/QRdIVRMpoEWQxlPnPDA=\\n-----END CERTIFICATE-----\\n\\022\\007orderer\" "], + "height": [1, 10, 30], + "policy": ["\u0012\f\u0012\n\b\u0002\u0012\u0002\b\u0000\u0012\u0002\b\u0001\u001a\r\u0012\u000b\n\u0007Org2MSP\u0010\u0003\u001a\r\u0012\u000b\n\u0007Org1MSP\u0010\u0003", "\u0012\f\u0012\n\b\u0002\u0012\u0002\b\u0000\u0012\u0002\b\u0001\u001a\r\u0012\u000b\n\u0007Org2MSP\u0010\u0003\u001a\r\u0012\u000b\n\u0007Org1MSP\u0010\u0003", "\u0012\f\u0012\n\b\u0002\u0012\u0002\b\u0000\u0012\u0002\b\u0001\u001a\r\u0012\u000b\n\u0007Org2MSP\u0010\u0003\u001a\r\u0012\u000b\n\u0007Org1MSP\u0010\u0003"], + "cid": "broker", + "chain_id": "111" +} \ No newline at end of file diff --git a/validator/validation_engine.go b/validator/validation_engine.go index 3479f80..a0a605b 100644 --- a/validator/validation_engine.go +++ b/validator/validation_engine.go @@ -13,12 +13,14 @@ const ( SimFabricRuleAddr = "0x00000000000000000000000000000000000000a1" HappyRuleAddr = "0x00000000000000000000000000000000000000a2" SimDynamicFabricRuleAddr = "0x00000000000000000000000000000000000000a3" + DynamicFabricRuleAddr = "0x00000000000000000000000000000000000000a4" ) // Validator is the instance that can use wasm to verify transaction validity type ValidationEngine struct { instances *sync.Map fabValidator Validator + fabDynamicValidator Validator simFabValidator Validator simDynamicFabValidator Validator happyValidator Validator @@ -33,6 +35,7 @@ func NewValidationEngine(ledger Ledger, instances *sync.Map, logger logrus.Field ledger: ledger, logger: logger, fabValidator: NewFabV14Validator(logger), + fabDynamicValidator: NewFabV14DynamicValidator(logger), simFabValidator: NewFabSimValidator(logger), simDynamicFabValidator: NewFabSimDynamicValidator(logger), happyValidator: &HappyValidator{}, @@ -56,6 +59,10 @@ func (ve *ValidationEngine) getValidator(address string) (Validator, error) { return ve.fabValidator, nil } + if address == DynamicFabricRuleAddr { + return ve.fabDynamicValidator, nil + } + if address == SimFabricRuleAddr { return ve.simFabValidator, nil } diff --git a/validator/validatorlib/fabric_validation.go b/validator/validatorlib/fabric_validation.go index fd7d857..aae24d5 100644 --- a/validator/validatorlib/fabric_validation.go +++ b/validator/validatorlib/fabric_validation.go @@ -55,6 +55,14 @@ func UnmarshalValidatorInfo(validatorBytes []byte) (*ValidatorInfo, error) { return vInfo, nil } +func MarshalValidatorInfo(validatorInfo *ValidatorInfo) ([]byte, error) { + result, err := json.Marshal(validatorInfo) + if err != nil { + return nil, err + } + return result, nil +} + func ExtractValidationArtifacts(proof []byte) (*valiadationArtifacts, error) { return extractValidationArtifacts(proof) }