diff --git a/validator/fabric_simple_dynamic_validator.go b/validator/fabric_simple_dynamic_validator.go new file mode 100644 index 0000000..31abd36 --- /dev/null +++ b/validator/fabric_simple_dynamic_validator.go @@ -0,0 +1,65 @@ +package validator + +import ( + "encoding/json" + "fmt" + "sort" + + "github.com/sirupsen/logrus" +) + +// Validator is the instance that can use wasm to verify transaction validity +type FabSimDynamicValidator struct { + logger logrus.FieldLogger + simFabValidator Validator +} + +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, + simFabValidator: NewFabSimValidator(logger), + } +} + +// 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---------------------------- + 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 4d7cd62..a0a605b 100644 --- a/validator/validation_engine.go +++ b/validator/validation_engine.go @@ -9,32 +9,38 @@ import ( ) const ( - FabricRuleAddr = "0x00000000000000000000000000000000000000a0" - SimFabricRuleAddr = "0x00000000000000000000000000000000000000a1" - HappyRuleAddr = "0x00000000000000000000000000000000000000a2" + FabricRuleAddr = "0x00000000000000000000000000000000000000a0" + 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 - simFabValidator Validator - happyValidator Validator - wasmGasLimit uint64 - ledger Ledger - logger logrus.FieldLogger + instances *sync.Map + fabValidator Validator + fabDynamicValidator 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), + fabDynamicValidator: NewFabV14DynamicValidator(logger), + simFabValidator: NewFabSimValidator(logger), + simDynamicFabValidator: NewFabSimDynamicValidator(logger), + happyValidator: &HappyValidator{}, + instances: instances, + wasmGasLimit: gasLimit, } } @@ -53,10 +59,18 @@ 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 } + if address == SimDynamicFabricRuleAddr { + return ve.simDynamicFabValidator, nil + } + if address == HappyRuleAddr { return ve.happyValidator, 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) }