diff --git a/client.go b/client.go index a645b47..a8acdbb 100755 --- a/client.go +++ b/client.go @@ -57,6 +57,11 @@ type ContractMeta struct { ORG string `json:"org"` } +type DynamicProof struct { + Proof []byte `json:"proof"` + height uint64 `json:"height"` +} + type Client struct { meta *ContractMeta consumer *Consumer @@ -213,11 +218,23 @@ func (c *Client) getProof(response channel.Response) ([]byte, error) { if err := proto.Unmarshal(t.TransactionEnvelope.Payload, pd); err != nil { return nil, err } - pt := &peer.Transaction{} if err := proto.Unmarshal(pd.Data, pt); err != nil { return nil, err } + if c.config.Fabric.DynamicValidators { + block, err := l.QueryBlockByTxID(response.TransactionID) + if err != nil { + return nil, err + } + number := block.GetHeader().Number + dynamicProof := &DynamicProof{ + Proof: pt.Actions[0].Payload, + height: number, + } + dynamicProofBytes, _ := json.Marshal(dynamicProof) + return dynamicProofBytes, nil + } return pt.Actions[0].Payload, nil } diff --git a/config.go b/config.go index 876ee82..b59a75f 100644 --- a/config.go +++ b/config.go @@ -16,13 +16,14 @@ type Config struct { Services []Service `mapstructure:"services" json:"services"` } type Fabric struct { - Name string `toml:"name" json:"name"` - Username string `toml:"username" json:"username"` - CCID string `toml:"ccid" json:"ccid"` - ChannelId string `mapstructure:"channel_id" toml:"channel_id" json:"channel_id"` - Org string `toml:"org" json:"org"` - ServerPort string `toml:"server_port" json:"server_port"` - TimeoutHeight int64 `mapstructure:"timeout_height" json:"timeout_height"` + Name string `toml:"name" json:"name"` + Username string `toml:"username" json:"username"` + CCID string `toml:"ccid" json:"ccid"` + ChannelId string `mapstructure:"channel_id" toml:"channel_id" json:"channel_id"` + Org string `toml:"org" json:"org"` + ServerPort string `toml:"server_port" json:"server_port"` + TimeoutHeight int64 `mapstructure:"timeout_height" json:"timeout_height"` + DynamicValidators bool `mapstructure:"dynamic_validators" json:"dynamic_validators"` } type Service struct { @@ -34,12 +35,13 @@ type Service struct { func DefaultConfig() *Config { return &Config{ Fabric: Fabric{ - Name: "fabric", - Username: "Admin", - CCID: "broker", - ChannelId: "mychannel", - Org: "org2", - TimeoutHeight: 30, + Name: "fabric", + Username: "Admin", + CCID: "broker", + ChannelId: "mychannel", + Org: "org2", + TimeoutHeight: 30, + DynamicValidators: false, }, Services: nil, } diff --git a/config/fabric-dynamic.validators b/config/fabric-dynamic.validators new file mode 100644 index 0000000..be8055f --- /dev/null +++ b/config/fabric-dynamic.validators @@ -0,0 +1,45 @@ +{ + "height": [1, 9, 22], + "pem": ["-----BEGIN CERTIFICATE----- + MIICKTCCAc + gAwIBAgIRAIBO31aZaSZoEYSy2AJuhJcwCgYIKoZIzj0EAwIwczEL + MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG + cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh + Lm9yZzIuZXhhbXBsZS5jb20wHhcNMjAwMjA1MDgyMjAwWhcNMzAwMjAyMDgyMjAw + WjBqMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN + U2FuIEZyYW5jaXNjbzENMAsGA1UECxMEcGVlcjEfMB0GA1UEAxMWcGVlcjEub3Jn + Mi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABG3jszFPTbGm + dAYg2BxmHMTDKfQReNw3p9ttMK130qF5lQo5zLBG8Sa3viOCLnvjjg6A / P + yKnwv + isI / jEVE8T2jTTBLMA4GA1UdDwEB / wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1Ud + IwQkMCKAIMVL + daK7nMGr2 / AQIXTSPFkdd3UiPVDkWtkh5ujnalEMAoGCCqGSM49 + BAMCA0gAMEUCIQDMYOQiYeMiQZTxlRkj / 3 / jjYvwwdCcX5AWuFmraiHkugIgFkX / + 6 uiTSD0lz8P + wwlLf24cIABq2aZyi8q4gj0YfwA = + -- -- - END CERTIFICATE-- -- - ", + "-- -- - BEGIN CERTIFICATE-- -- - + MIICKTCCAc + gAwIBAgIRAIBO31aZaSZoEYSy2AJuhJcwCgYIKoZIzj0EAwIwczEL + MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG + cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh + Lm9yZzIuZXhhbXBsZS5jb20wHhcNMjAwMjA1MDgyMjAwWhcNMzAwMjAyMDgyMjAw + WjBqMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN + U2FuIEZyYW5jaXNjbzENMAsGA1UECxMEcGVlcjEfMB0GA1UEAxMWcGVlcjEub3Jn + Mi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABG3jszFPTbGm + dAYg2BxmHMTDKfQReNw3p9ttMK130qF5lQo5zLBG8Sa3viOCLnvjjg6A / P + yKnwv + isI / jEVE8T2jTTBLMA4GA1UdDwEB / wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1Ud + IwQkMCKAIMVL + daK7nMGr2 / AQIXTSPFkdd3UiPVDkWtkh5ujnalEMAoGCCqGSM49 + BAMCA0gAMEUCIQDMYOQiYeMiQZTxlRkj / 3 / jjYvwwdCcX5AWuFmraiHkugIgFkX / + 6 uiTSD0lz8P + wwlLf24cIABq2aZyi8q4gj0YfwA = + -- -- - END CERTIFICATE-- -- - ", + "-- -- - BEGIN CERTIFICATE-- -- - + MIICKTCCAc + gAwIBAgIRAIBO31aZaSZoEYSy2AJuhJcwCgYIKoZIzj0EAwIwczEL + MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG + cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh + Lm9yZzIuZXhhbXBsZS5jb20wHhcNMjAwMjA1MDgyMjAwWhcNMzAwMjAyMDgyMjAw + WjBqMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN + U2FuIEZyYW5jaXNjbzENMAsGA1UECxMEcGVlcjEfMB0GA1UEAxMWcGVlcjEub3Jn + Mi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABG3jszFPTbGm + dAYg2BxmHMTDKfQReNw3p9ttMK130qF5lQo5zLBG8Sa3viOCLnvjjg6A / P + yKnwv + isI / jEVE8T2jTTBLMA4GA1UdDwEB / wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1Ud + IwQkMCKAIMVL + daK7nMGr2 / AQIXTSPFkdd3UiPVDkWtkh5ujnalEMAoGCCqGSM49 + BAMCA0gAMEUCIQDMYOQiYeMiQZTxlRkj / 3 / jjYvwwdCcX5AWuFmraiHkugIgFkX / + 6 uiTSD0lz8P + wwlLf24cIABq2aZyi8q4gj0YfwA = + -- -- - END CERTIFICATE-- -- - "] + } \ No newline at end of file diff --git a/config/fabric.toml b/config/fabric.toml index 70270c0..40eb778 100644 --- a/config/fabric.toml +++ b/config/fabric.toml @@ -5,6 +5,7 @@ channel_id = "mychannel" org = "org2" timeout_height = 30 chain_id = "3" +dynamic_validators = false [[services]] id = "mychannel&transfer"