fabric-gateway 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.yardopts +2 -0
- data/README.md +14 -13
- data/Rakefile +2 -0
- data/fabric-gateway.gemspec +1 -0
- data/lib/fabric/accessors/contract.rb +51 -0
- data/lib/fabric/accessors/gateway.rb +33 -0
- data/lib/fabric/accessors/network.rb +40 -0
- data/lib/fabric/client.rb +30 -18
- data/lib/fabric/contract.rb +17 -26
- data/lib/fabric/ec_crypto_suite.rb +1 -1
- data/lib/fabric/entities/envelope.rb +153 -0
- data/lib/fabric/{identity.rb → entities/identity.rb} +2 -2
- data/lib/fabric/{proposal.rb → entities/proposal.rb} +41 -34
- data/lib/fabric/{proposed_transaction.rb → entities/proposed_transaction.rb} +4 -28
- data/lib/fabric/entities/status.rb +32 -0
- data/lib/fabric/entities/transaction.rb +247 -0
- data/lib/fabric/network.rb +5 -10
- data/lib/fabric/version.rb +1 -1
- data/lib/fabric.rb +22 -9
- metadata +26 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 84dbcb3d572350e328ca48178859e0edfc7f57bbc331980612c4c5f537701b12
|
4
|
+
data.tar.gz: 9aaeed65be8ea7b5296e4e4fb12d8027583581cca24c96ccdf4f7a3afb781758
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a931d1e6fff596991560afedd817f3091e0c393c4b6aefa9eed5f3dfee19f37db8b1f744c9ea9b4375d661bdf1c0b4c72402eb9048225be7d028569520fb8d23
|
7
|
+
data.tar.gz: 553c329d4dbb5b9b7729e5c1226f2c680901e40e27f630ce1f577fd9f4c33eb648b06a8ab92630873c8ded4be7ba4870b82fbef236a0520d848371b09d5de848
|
data/.yardopts
ADDED
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Fabric::Gateway
|
2
2
|
|
3
|
-
 [](https://codecov.io/gh/EthicalIdentity/fabric-gateway-ruby) [](https://codeclimate.com/github/EthicalIdentity/fabric-gateway-ruby/maintainability)   [](https://github.com/EthicalIdentity/fabric-gateway-ruby/blob/master/LICENSE.txt)
|
3
|
+
[](https://github.com/EthicalIdentity/fabric-gateway-ruby/actions/workflows/rspec.yml?query=branch%3Amaster) [](https://codecov.io/gh/EthicalIdentity/fabric-gateway-ruby) [](https://codeclimate.com/github/EthicalIdentity/fabric-gateway-ruby/maintainability) [](https://rubygems.org/gems/fabric-gateway) [](https://rubygems.org/gems/fabric-gateway) [](https://github.com/EthicalIdentity/fabric-gateway-ruby/blob/master/LICENSE.txt)
|
4
4
|
|
5
5
|
|
6
6
|
|
@@ -32,11 +32,13 @@ Will update to new version of grpc when fix is released.
|
|
32
32
|
|
33
33
|
## Usage
|
34
34
|
|
35
|
-
This is an alpha stage library suitable for early adopters.
|
35
|
+
This is an alpha stage library suitable for early adopters. The basic evaluate and submit gateway functions are implemented. Chaincode events monitoring is not yet implemented.
|
36
36
|
|
37
|
-
```
|
37
|
+
```ruby
|
38
38
|
$ bin/console
|
39
39
|
|
40
|
+
# for running in application or script; not needed from bin/console
|
41
|
+
require 'fabric'
|
40
42
|
|
41
43
|
def load_certs
|
42
44
|
data_dir ='/your/certs/directory' # aka test-network/organizations
|
@@ -80,12 +82,9 @@ contract = network.new_contract('basic')
|
|
80
82
|
# Evaluate
|
81
83
|
puts contract.evaluate_transaction('GetAllAssets')
|
82
84
|
|
83
|
-
# Submit
|
84
|
-
puts contract.submit_transaction('CreateAsset', 'asset13', 'yellow', '5', 'Tom', '1300')
|
85
|
-
|
86
|
-
# Endorse - Not Yet Implemented!
|
87
|
-
|
88
|
-
# Commit Status - Not Yet Implemented!
|
85
|
+
# Submit
|
86
|
+
puts contract.submit_transaction('CreateAsset', ['asset13', 'yellow', '5', 'Tom', '1300'])
|
87
|
+
puts contract.submit_transaction('UpdateAsset', %w[asset999 yellow 5 Tom 5555])
|
89
88
|
|
90
89
|
# Chaincode Events - Not Yet Implemented!
|
91
90
|
|
@@ -133,13 +132,15 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/ethica
|
|
133
132
|
- [x] Setup auto-generation of API docs on rubydoc.info
|
134
133
|
- [x] Abstract connection and calls such that the protos aren't being interacted directly
|
135
134
|
- [x] Implement, Document & Test Evaluate
|
136
|
-
- [
|
137
|
-
- [
|
138
|
-
- [
|
135
|
+
- [x] Implement, Document & Test Endorse
|
136
|
+
- [x] Implement, Document & Test Submit
|
137
|
+
- [x] Implement, Document & Test CommitStatus
|
139
138
|
- [ ] Implement, Document & Test ChaincodeEvents
|
140
|
-
- [ ]
|
139
|
+
- [ ] Support Submit Async (currently blocks waiting for the transaction to be committed)
|
141
140
|
- [ ] Consider adding error handling, invalid transaction proposals will result in random GRPC::FailedPrecondition type errors
|
141
|
+
- [ ] Consider adding transaction_id information to Fabric::Errors that are raised; would help a lot for debugging.
|
142
142
|
- [ ] Consider adding integration tests against blockchain; might be a ton of stuff to setup
|
143
|
+
- [ ] Implement off-line signing - https://github.com/hyperledger/fabric-gateway/blob/1e4a926ddb98ec8ee969da3fc1500642ab389d01/node/src/contract.ts#L63
|
143
144
|
- [ ] Support for offline transaction signing (write scenario test for this) - https://github.com/hyperledger/fabric-gateway/blob/cf78fc11a439ced7dfd2f9b55886c55c73119b25/pkg/client/offlinesign_test.go
|
144
145
|
|
145
146
|
|
data/Rakefile
CHANGED
data/fabric-gateway.gemspec
CHANGED
@@ -33,6 +33,7 @@ Gem::Specification.new do |spec|
|
|
33
33
|
spec.add_development_dependency('codecov', '~> 0.6.0')
|
34
34
|
spec.add_development_dependency('factory_bot', '~> 6.2.0')
|
35
35
|
spec.add_development_dependency('grpc-tools', '~> 1.42')
|
36
|
+
spec.add_development_dependency('rake-notes', '~> 0.2.0')
|
36
37
|
spec.add_development_dependency('rubocop', '~> 1.23.0')
|
37
38
|
spec.add_development_dependency('rubocop-rspec', '~> 2.6.0')
|
38
39
|
spec.add_development_dependency('simplecov', '~> 0.21.2')
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Fabric
|
4
|
+
module Accessors
|
5
|
+
#
|
6
|
+
# Add accessor methods to the given class.
|
7
|
+
#
|
8
|
+
# Usage: make sure the class has a contract accessor method
|
9
|
+
# and then `include Fabric::Accessors::Contract`
|
10
|
+
#
|
11
|
+
module Contract
|
12
|
+
# @!visibility private
|
13
|
+
def self.included(base)
|
14
|
+
base.send :include, Fabric::Accessors::Network
|
15
|
+
end
|
16
|
+
|
17
|
+
# @!parse include Fabric::Accessors::Network
|
18
|
+
# @!parse include Fabric::Accessors::Gateway
|
19
|
+
|
20
|
+
#
|
21
|
+
# Returns the network instance
|
22
|
+
#
|
23
|
+
# @return [Fabric::Network] network
|
24
|
+
# @!parse attr_reader :network
|
25
|
+
#
|
26
|
+
def network
|
27
|
+
contract.network
|
28
|
+
end
|
29
|
+
|
30
|
+
#
|
31
|
+
# Returns the contract name
|
32
|
+
#
|
33
|
+
# @return [String] contract name
|
34
|
+
# @!parse attr_reader :contract_name
|
35
|
+
#
|
36
|
+
def contract_name
|
37
|
+
contract.contract_name
|
38
|
+
end
|
39
|
+
|
40
|
+
#
|
41
|
+
# Returns the chaincode name
|
42
|
+
#
|
43
|
+
# @return [String] chaincode name
|
44
|
+
# @!parse attr_reader :chaincode_name
|
45
|
+
#
|
46
|
+
def chaincode_name
|
47
|
+
contract.chaincode_name
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Fabric
|
4
|
+
module Accessors
|
5
|
+
#
|
6
|
+
# Add accessor methods to the given class.
|
7
|
+
#
|
8
|
+
# Usage: make sure the class has a gateway accessor method
|
9
|
+
# and then `include Fabric::Accessors::Gateway`
|
10
|
+
#
|
11
|
+
module Gateway
|
12
|
+
#
|
13
|
+
# Returns the client instance
|
14
|
+
#
|
15
|
+
# @return [Fabric::Client] client
|
16
|
+
# @!parse attr_reader :client
|
17
|
+
#
|
18
|
+
def client
|
19
|
+
gateway.client
|
20
|
+
end
|
21
|
+
|
22
|
+
#
|
23
|
+
# Returns the signer identity instance
|
24
|
+
#
|
25
|
+
# @return [Fabric::Identity] signer
|
26
|
+
# @!parse attr_reader :signer
|
27
|
+
#
|
28
|
+
def signer
|
29
|
+
gateway.signer
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Fabric
|
4
|
+
module Accessors
|
5
|
+
#
|
6
|
+
# Add accessor methods to the given class.
|
7
|
+
#
|
8
|
+
# Usage: make sure the class has a network accessor method
|
9
|
+
# and then `include Fabric::Accessors::Network`
|
10
|
+
#
|
11
|
+
module Network
|
12
|
+
# @!visibility private
|
13
|
+
def self.included(base)
|
14
|
+
base.send :include, Fabric::Accessors::Gateway
|
15
|
+
end
|
16
|
+
|
17
|
+
# @!parse include Fabric::Accessors::Gateway
|
18
|
+
|
19
|
+
#
|
20
|
+
# Returns the gateway instance
|
21
|
+
#
|
22
|
+
# @return [Fabric::Gateway] gateway
|
23
|
+
# @!parse attr_reader :gateway
|
24
|
+
#
|
25
|
+
def gateway
|
26
|
+
network.gateway
|
27
|
+
end
|
28
|
+
|
29
|
+
#
|
30
|
+
# Network name or the channel name or channel id
|
31
|
+
#
|
32
|
+
# @return [String] network name
|
33
|
+
# @!parse attr_reader :network_name
|
34
|
+
#
|
35
|
+
def network_name
|
36
|
+
network.name
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/fabric/client.rb
CHANGED
@@ -10,22 +10,34 @@ module Fabric
|
|
10
10
|
#
|
11
11
|
# Initializes a client
|
12
12
|
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
#
|
13
|
+
#
|
14
|
+
# @overload initialize(grpc_client: client, default_call_options: {}, **client_opts)
|
15
|
+
# Initializes a client from a gRPC Gateway client stub
|
16
|
+
# @param [Gateway::Gateway::Stub] grpc_client grpc gateway client stub
|
17
|
+
# @param [Hash] default_call_options call options to use by default for different operations
|
18
|
+
# @see https://www.rubydoc.info/gems/grpc/GRPC%2FClientStub:request_response Keyword Argument call options for
|
19
|
+
# *_options default_call_options
|
20
|
+
# @see https://www.rubydoc.info/gems/grpc/GRPC%2FClientStub:initialize Keyword arguments for **client_opts
|
21
|
+
# @option default_call_options [Hash] :endorse_options default options for endorse call
|
22
|
+
# @option default_call_options [Hash] :evaluate_options default options for evaluate call
|
23
|
+
# @option default_call_options [Hash] :submit_options default options for submit call
|
24
|
+
# @option default_call_options [Hash] :commit_status_options default options for commit_status call
|
25
|
+
# @option default_call_options [Hash] :chaincode_events_options default options for chaincode_events call
|
26
|
+
# @param [Hash] **client_opts client initialization options
|
27
|
+
# @overload initialize(host: host, creds: creds, default_call_options: {}, **client_opts)
|
28
|
+
# Instantiates a new gRPC Gateway client stub from the parameters
|
29
|
+
# @param [string] host hostname and port of the gateway
|
30
|
+
# @param [GRPC::Core::ChannelCredentials|GRPC::Core::XdsChannelCredentials|Symbol] creds channel credentials
|
31
|
+
# (usually the CA certificate)
|
32
|
+
# @see https://www.rubydoc.info/gems/grpc/GRPC%2FClientStub:request_response Keyword Argument call options for
|
33
|
+
# *_options default_call_options
|
34
|
+
# @see https://www.rubydoc.info/gems/grpc/GRPC%2FClientStub:initialize Keyword arguments for **client_opts
|
35
|
+
# @option default_call_options [Hash] :endorse_options default options for endorse call
|
36
|
+
# @option default_call_options [Hash] :evaluate_options default options for evaluate call
|
37
|
+
# @option default_call_options [Hash] :submit_options default options for submit call
|
38
|
+
# @option default_call_options [Hash] :commit_status_options default options for commit_status call
|
39
|
+
# @option default_call_options [Hash] :chaincode_events_options default options for chaincode_events call
|
40
|
+
# @param [Hash] **client_opts client initialization options
|
29
41
|
#
|
30
42
|
def initialize(grpc_client: nil, host: nil, creds: nil, default_call_options: {}, **client_opts)
|
31
43
|
if grpc_client
|
@@ -89,8 +101,8 @@ module Fabric
|
|
89
101
|
#
|
90
102
|
# Subscribe to chaincode events
|
91
103
|
#
|
92
|
-
# @
|
93
|
-
# @
|
104
|
+
# @note This function has never been utilized or tested. This function is probably wrong, missing a block.
|
105
|
+
# @todo add testing!
|
94
106
|
#
|
95
107
|
# @param [Gateway::ChaincodeEventsRequest] chaincode_events_request
|
96
108
|
# @param [Hash] options gRPC call options (merged with default options) @see https://www.rubydoc.info/gems/grpc/GRPC%2FClientStub:server_streamer
|
data/lib/fabric/contract.rb
CHANGED
@@ -25,28 +25,16 @@ module Fabric
|
|
25
25
|
class Contract
|
26
26
|
attr_reader :network, :chaincode_name, :contract_name
|
27
27
|
|
28
|
+
# @!parse include Fabric::Accessors::Network
|
29
|
+
# @!parse include Fabric::Accessors::Gateway
|
30
|
+
include Fabric::Accessors::Network
|
31
|
+
|
28
32
|
def initialize(network, chaincode_name, contract_name = '')
|
29
33
|
@network = network
|
30
34
|
@chaincode_name = chaincode_name
|
31
35
|
@contract_name = contract_name
|
32
36
|
end
|
33
37
|
|
34
|
-
def client
|
35
|
-
network.client
|
36
|
-
end
|
37
|
-
|
38
|
-
def signer
|
39
|
-
network.signer
|
40
|
-
end
|
41
|
-
|
42
|
-
def gateway
|
43
|
-
network.gateway
|
44
|
-
end
|
45
|
-
|
46
|
-
def network_name
|
47
|
-
network.name
|
48
|
-
end
|
49
|
-
|
50
38
|
#
|
51
39
|
# Evaluate a transaction function and return its results. A transaction proposal will be evaluated on endorsing
|
52
40
|
# peers but the transaction will not be sent to the ordering service and so will not be committed to the ledger.
|
@@ -66,7 +54,6 @@ module Fabric
|
|
66
54
|
# transaction function will be evaluated on endorsing peers and then submitted to the ordering service to be
|
67
55
|
# committed to the ledger.
|
68
56
|
#
|
69
|
-
# @TODO: Not yet complete
|
70
57
|
#
|
71
58
|
# @param [String] transaction_name
|
72
59
|
# @param [Array] arguments array of arguments to pass to the transaction
|
@@ -102,8 +89,6 @@ module Fabric
|
|
102
89
|
# transaction function will be evaluated on endorsing peers and then submitted to the ordering service to be
|
103
90
|
# committed to the ledger.
|
104
91
|
#
|
105
|
-
# @TODO: Implement Me! - LEFT OFF HERE!
|
106
|
-
#
|
107
92
|
# @param [String] transaction_name
|
108
93
|
# @param [Hash] proposal_options
|
109
94
|
# @option proposal_options [Array] :arguments array of arguments to pass to the transaction
|
@@ -116,17 +101,15 @@ module Fabric
|
|
116
101
|
#
|
117
102
|
def submit(transaction_name, proposal_options = {})
|
118
103
|
transaction = new_proposal(transaction_name, **proposal_options).endorse
|
119
|
-
|
104
|
+
transaction.submit
|
120
105
|
|
121
|
-
|
122
|
-
|
123
|
-
raise CommitError, status unless status.get_status == ::GRPC::Core::StatusCodes::OK
|
106
|
+
transaction.result
|
124
107
|
end
|
125
108
|
|
126
109
|
#
|
127
|
-
# @
|
128
|
-
#
|
129
|
-
#
|
110
|
+
# @todo unimplemented, not sure if this can be implemented because
|
111
|
+
# the official grpc ruby client does not support non-blocking async
|
112
|
+
# calls (https://github.com/grpc/grpc/issues/10973)
|
130
113
|
#
|
131
114
|
# not 100% sure if grpc support is necessary for this.
|
132
115
|
#
|
@@ -156,6 +139,14 @@ module Fabric
|
|
156
139
|
Proposal.new(proposed_transaction)
|
157
140
|
end
|
158
141
|
|
142
|
+
#
|
143
|
+
# Generates the qualified transaction name for the contract. (prepends the contract name to the transaction name if
|
144
|
+
# contract name is set)
|
145
|
+
#
|
146
|
+
# @param [string] transaction_name
|
147
|
+
#
|
148
|
+
# @return [string] qualified transaction name
|
149
|
+
#
|
159
150
|
def qualified_transaction_name(transaction_name)
|
160
151
|
contract_name.nil? || contract_name.empty? ? transaction_name : "#{contract_name}:#{transaction_name}"
|
161
152
|
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Fabric
|
4
|
+
#
|
5
|
+
# Encapsulates an Envelop protobuf message
|
6
|
+
#
|
7
|
+
class Envelope
|
8
|
+
# @return [Common::Envelope] transaction envelope
|
9
|
+
attr_reader :envelope
|
10
|
+
|
11
|
+
#
|
12
|
+
# Creates a new Envelope instance.
|
13
|
+
#
|
14
|
+
# @param [Common::Envelope] envelope
|
15
|
+
#
|
16
|
+
def initialize(envelope)
|
17
|
+
@envelope = envelope
|
18
|
+
end
|
19
|
+
|
20
|
+
#
|
21
|
+
# Checks if the envelope has been signed.
|
22
|
+
#
|
23
|
+
# @return [Boolean] true if the envelope has been signed; otherwise false.
|
24
|
+
#
|
25
|
+
def signed?
|
26
|
+
!envelope.signature.empty?
|
27
|
+
end
|
28
|
+
|
29
|
+
#
|
30
|
+
# The protobuffer serialized form of the envelope payload.
|
31
|
+
#
|
32
|
+
# @return [String] serialized payload
|
33
|
+
#
|
34
|
+
def payload_bytes
|
35
|
+
envelope.payload
|
36
|
+
end
|
37
|
+
|
38
|
+
#
|
39
|
+
# The digest of the payload.
|
40
|
+
#
|
41
|
+
# @return [String] payload digest
|
42
|
+
#
|
43
|
+
def payload_digest
|
44
|
+
Fabric.crypto_suite.digest(envelope.payload)
|
45
|
+
end
|
46
|
+
|
47
|
+
#
|
48
|
+
# Sets the envelope signature.
|
49
|
+
#
|
50
|
+
# @param [String] signature
|
51
|
+
#
|
52
|
+
# @return [Void]
|
53
|
+
#
|
54
|
+
def signature=(signature)
|
55
|
+
envelope.signature = signature
|
56
|
+
end
|
57
|
+
|
58
|
+
def result
|
59
|
+
@result ||= parse_result_from_payload
|
60
|
+
end
|
61
|
+
|
62
|
+
#
|
63
|
+
# Returns the deserialized payload.
|
64
|
+
#
|
65
|
+
# @return [Common::Payload] Envelope payload
|
66
|
+
#
|
67
|
+
def payload
|
68
|
+
@payload ||= Common::Payload.decode(envelope.payload)
|
69
|
+
end
|
70
|
+
|
71
|
+
#
|
72
|
+
# Returns the envelope payload header.
|
73
|
+
#
|
74
|
+
# Envelope => Payload => Header
|
75
|
+
#
|
76
|
+
# @return [Common::Header] Envelope Payload Header
|
77
|
+
#
|
78
|
+
def header
|
79
|
+
raise Fabric::Error, 'Missing header' if payload.header.nil?
|
80
|
+
|
81
|
+
@header ||= payload.header
|
82
|
+
end
|
83
|
+
|
84
|
+
#
|
85
|
+
# Returns the deserialized transaction channel header
|
86
|
+
#
|
87
|
+
# Envelope => Payload => Header => ChannelHeader
|
88
|
+
#
|
89
|
+
# @return [Common::ChannelHeader] envelop payload header channel header
|
90
|
+
#
|
91
|
+
def channel_header
|
92
|
+
@channel_header ||= Common::ChannelHeader.decode(header.channel_header)
|
93
|
+
end
|
94
|
+
|
95
|
+
#
|
96
|
+
# Grabs the channel_name frmo the depths of the envelope.
|
97
|
+
#
|
98
|
+
# @return [String] channel name
|
99
|
+
#
|
100
|
+
def channel_name
|
101
|
+
channel_header.channel_id
|
102
|
+
end
|
103
|
+
|
104
|
+
#
|
105
|
+
# Returns the deserialized transaction
|
106
|
+
#
|
107
|
+
# @return [Protos::Transaction] transaction
|
108
|
+
#
|
109
|
+
def transaction
|
110
|
+
@transaction ||= Protos::Transaction.decode(payload.data)
|
111
|
+
end
|
112
|
+
|
113
|
+
private
|
114
|
+
|
115
|
+
#
|
116
|
+
# Parse the transaction actinos from the payload looking for the transaction result payload.
|
117
|
+
#
|
118
|
+
# @return [String] result payload
|
119
|
+
# @raise [Fabric::Error] if the transaction result payload is not found
|
120
|
+
#
|
121
|
+
def parse_result_from_payload
|
122
|
+
errors = []
|
123
|
+
transaction.actions.each do |action|
|
124
|
+
return parse_result_from_transaction_action(action)
|
125
|
+
rescue Fabric::Error => e
|
126
|
+
errors << e
|
127
|
+
end
|
128
|
+
|
129
|
+
raise Fabric::Error, "No proposal response found: #{errors.inspect}"
|
130
|
+
end
|
131
|
+
|
132
|
+
#
|
133
|
+
# Parse a single transaction action looking for the transaction result payload.
|
134
|
+
#
|
135
|
+
# @param [Protos::TransactionAction] transaction_action
|
136
|
+
#
|
137
|
+
# @return [Payload] transaction result payload
|
138
|
+
# @raise [Fabric::Error] if the endorsed_action is missing or the chaincode response is missing
|
139
|
+
#
|
140
|
+
def parse_result_from_transaction_action(transaction_action)
|
141
|
+
action_payload = Protos::ChaincodeActionPayload.decode(transaction_action.payload)
|
142
|
+
endorsed_action = action_payload.action
|
143
|
+
raise Fabric::Error, 'Missing endorsed action' if endorsed_action.nil?
|
144
|
+
|
145
|
+
response_payload = Protos::ProposalResponsePayload.decode(endorsed_action.proposal_response_payload)
|
146
|
+
chaincode_action = Protos::ChaincodeAction.decode(response_payload.extension)
|
147
|
+
chaincode_response = chaincode_action.response
|
148
|
+
raise Fabric::Error, 'Missing chaincode response' if chaincode_response.nil?
|
149
|
+
|
150
|
+
chaincode_response.payload
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
@@ -76,9 +76,9 @@ module Fabric
|
|
76
76
|
#
|
77
77
|
# Creates a new gateway passing in the current identity
|
78
78
|
#
|
79
|
-
# @param [
|
79
|
+
# @param [Fabric::Client] client
|
80
80
|
#
|
81
|
-
# @return [Fabric::Gateway]
|
81
|
+
# @return [Fabric::Gateway] gateway
|
82
82
|
#
|
83
83
|
def new_gateway(client)
|
84
84
|
Fabric::Gateway.new(self, client)
|
@@ -22,33 +22,7 @@ module Fabric
|
|
22
22
|
@proposed_transaction.contract
|
23
23
|
end
|
24
24
|
|
25
|
-
|
26
|
-
contract.network
|
27
|
-
end
|
28
|
-
|
29
|
-
def client
|
30
|
-
network.client
|
31
|
-
end
|
32
|
-
|
33
|
-
def signer
|
34
|
-
network.signer
|
35
|
-
end
|
36
|
-
|
37
|
-
def gateway
|
38
|
-
network.gateway
|
39
|
-
end
|
40
|
-
|
41
|
-
def network_name
|
42
|
-
network.name
|
43
|
-
end
|
44
|
-
|
45
|
-
def contract_name
|
46
|
-
contract.contract_name
|
47
|
-
end
|
48
|
-
|
49
|
-
def chaincode_name
|
50
|
-
contract.chaincode_name
|
51
|
-
end
|
25
|
+
include Fabric::Accessors::Contract
|
52
26
|
|
53
27
|
def transaction_id
|
54
28
|
proposed_transaction.transaction_id
|
@@ -96,7 +70,7 @@ module Fabric
|
|
96
70
|
# @return [String] raw binary digest of the proposal message.
|
97
71
|
#
|
98
72
|
def digest
|
99
|
-
|
73
|
+
Fabric.crypto_suite.digest(proposal.to_proto)
|
100
74
|
end
|
101
75
|
|
102
76
|
#
|
@@ -153,8 +127,22 @@ module Fabric
|
|
153
127
|
evaluate_response.result.payload
|
154
128
|
end
|
155
129
|
|
156
|
-
|
157
|
-
|
130
|
+
#
|
131
|
+
# Obtain endorsement for the transaction proposal from sufficient peers to allow it to be committed to the ledger.
|
132
|
+
#
|
133
|
+
# @param [Hash] options gRPC call options @see https://www.rubydoc.info/gems/grpc/GRPC%2FClientStub:request_response
|
134
|
+
#
|
135
|
+
# @return [Fabric::Transaction] An endorsed transaction that can be submitted to the ledger.
|
136
|
+
#
|
137
|
+
def endorse(options = {})
|
138
|
+
sign
|
139
|
+
endorse_response = client.endorse(new_endorse_request, options)
|
140
|
+
|
141
|
+
raise Fabric::Error, 'Missing transaction envelope' if endorse_response.prepared_transaction.nil?
|
142
|
+
|
143
|
+
prepared_transaction = new_prepared_transaction(endorse_response.prepared_transaction)
|
144
|
+
|
145
|
+
Fabric::Transaction.new(network, prepared_transaction)
|
158
146
|
end
|
159
147
|
|
160
148
|
#
|
@@ -170,13 +158,32 @@ module Fabric
|
|
170
158
|
)
|
171
159
|
end
|
172
160
|
|
161
|
+
#
|
162
|
+
# Creates a new endorse request from this proposal.
|
163
|
+
#
|
164
|
+
# @return [Gateway::EndorseRequest] EndorseRequest protobuf message
|
165
|
+
#
|
173
166
|
def new_endorse_request
|
174
|
-
|
167
|
+
::Gateway::EndorseRequest.new(
|
168
|
+
transaction_id: transaction_id,
|
169
|
+
channel_id: network_name,
|
170
|
+
proposed_transaction: signed_proposal,
|
171
|
+
endorsing_organizations: proposed_transaction.endorsing_organizations
|
172
|
+
)
|
175
173
|
end
|
176
174
|
|
177
|
-
|
178
|
-
|
179
|
-
|
175
|
+
#
|
176
|
+
# Creates a new prepared transaction from a transaction envelope.
|
177
|
+
#
|
178
|
+
# @param [Common::Envelope] envelope transaction envelope
|
179
|
+
#
|
180
|
+
# @return [Gateway::PreparedTransaction] prepared transaction protobuf message
|
181
|
+
#
|
182
|
+
def new_prepared_transaction(envelope)
|
183
|
+
::Gateway::PreparedTransaction.new(
|
184
|
+
transaction_id: transaction_id,
|
185
|
+
envelope: envelope
|
186
|
+
)
|
180
187
|
end
|
181
188
|
end
|
182
189
|
end
|
@@ -19,6 +19,10 @@ module Fabric
|
|
19
19
|
# This is usually used in conjunction with transientData for private data scenarios.
|
20
20
|
attr_reader :endorsing_organizations
|
21
21
|
|
22
|
+
# @!parse include Fabric::Accessors::Network
|
23
|
+
# @!parse include Fabric::Accessors::Gateway
|
24
|
+
include Fabric::Accessors::Contract
|
25
|
+
|
22
26
|
def initialize(contract, transaction_name, arguments: [], transient_data: {}, endorsing_organizations: [])
|
23
27
|
@contract = contract
|
24
28
|
@transaction_name = transaction_name
|
@@ -29,34 +33,6 @@ module Fabric
|
|
29
33
|
generate_proposed_transaction
|
30
34
|
end
|
31
35
|
|
32
|
-
def network
|
33
|
-
contract.network
|
34
|
-
end
|
35
|
-
|
36
|
-
def client
|
37
|
-
network.client
|
38
|
-
end
|
39
|
-
|
40
|
-
def signer
|
41
|
-
network.signer
|
42
|
-
end
|
43
|
-
|
44
|
-
def gateway
|
45
|
-
network.gateway
|
46
|
-
end
|
47
|
-
|
48
|
-
def network_name
|
49
|
-
network.name
|
50
|
-
end
|
51
|
-
|
52
|
-
def contract_name
|
53
|
-
contract.contract_name
|
54
|
-
end
|
55
|
-
|
56
|
-
def chaincode_name
|
57
|
-
contract.chaincode_name
|
58
|
-
end
|
59
|
-
|
60
36
|
#
|
61
37
|
# Builds the proposed transaction protobuf message
|
62
38
|
#
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Fabric
|
4
|
+
#
|
5
|
+
# Status of a transaction that is to be committed to the ledger.
|
6
|
+
#
|
7
|
+
class Status
|
8
|
+
TRANSACTION_STATUSES = ::Protos::TxValidationCode.constants.map(&::Protos::TxValidationCode.method(:const_get))
|
9
|
+
.collect do |i|
|
10
|
+
[::Protos::TxValidationCode.lookup(i), i]
|
11
|
+
end.to_h
|
12
|
+
|
13
|
+
# @return [Integer] Block number in which the transaction committed.
|
14
|
+
attr_reader :block_number
|
15
|
+
|
16
|
+
# @return [Integer] Transaction status
|
17
|
+
attr_reader :code
|
18
|
+
|
19
|
+
# @return [Boolean] `true` if the transaction committed successfully; otherwise `false`.
|
20
|
+
attr_reader :successful
|
21
|
+
|
22
|
+
# @return [String] The ID of the transaction.
|
23
|
+
attr_reader :transaction_id
|
24
|
+
|
25
|
+
def initialize(transaction_id, block_number, code)
|
26
|
+
@transaction_id = transaction_id
|
27
|
+
@block_number = block_number
|
28
|
+
@code = code
|
29
|
+
@successful = @code == TRANSACTION_STATUSES[:VALID]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,247 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Fabric
|
4
|
+
#
|
5
|
+
# Represents an endorsed transaction that can be submitted to the orderer for commit to the ledger,
|
6
|
+
# query the transaction results and its commit status.
|
7
|
+
#
|
8
|
+
class Transaction
|
9
|
+
attr_reader :network
|
10
|
+
|
11
|
+
include Fabric::Accessors::Network
|
12
|
+
|
13
|
+
# @return [Gateway::PreparedTransaction] Prepared Transaction
|
14
|
+
attr_reader :prepared_transaction
|
15
|
+
|
16
|
+
# @return [Fabric::Envelope]
|
17
|
+
attr_reader :envelope
|
18
|
+
|
19
|
+
#
|
20
|
+
# Creates a new Transaction instance.
|
21
|
+
#
|
22
|
+
# @param [Fabric::Network] network
|
23
|
+
# @param [Gateway::PreparedTransaction] prepared_transaction
|
24
|
+
#
|
25
|
+
def initialize(network, prepared_transaction)
|
26
|
+
@network = network
|
27
|
+
@prepared_transaction = prepared_transaction
|
28
|
+
@envelope = Envelope.new(prepared_transaction.envelope)
|
29
|
+
end
|
30
|
+
|
31
|
+
#
|
32
|
+
# Get the transaction result. This is obtained during the endorsement process when the transaction proposal is
|
33
|
+
# run on endorsing peers.
|
34
|
+
#
|
35
|
+
# @param [boolean] check_status set to true to raise exception if transaction has not yet been committed
|
36
|
+
#
|
37
|
+
# @return [String] Raw transaction result
|
38
|
+
#
|
39
|
+
def result(check_status: true)
|
40
|
+
raise Fabric::CommitError, status if check_status && !status.successful
|
41
|
+
|
42
|
+
envelope.result
|
43
|
+
end
|
44
|
+
|
45
|
+
#
|
46
|
+
# Returns the transaction ID from the prepared transaction.
|
47
|
+
#
|
48
|
+
# @return [String] transaction_id
|
49
|
+
#
|
50
|
+
def transaction_id
|
51
|
+
prepared_transaction.transaction_id
|
52
|
+
end
|
53
|
+
|
54
|
+
#
|
55
|
+
# Submit the transaction to the orderer to be committed to the ledger.
|
56
|
+
#
|
57
|
+
# @see https://www.rubydoc.info/gems/grpc/GRPC%2FClientStub:request_response
|
58
|
+
#
|
59
|
+
# @param [Hash] options gRPC call options
|
60
|
+
#
|
61
|
+
# @return [Fabric::Transaction] self
|
62
|
+
def submit(options = {})
|
63
|
+
sign_submit_request
|
64
|
+
|
65
|
+
client.submit(new_submit_request, options)
|
66
|
+
|
67
|
+
self
|
68
|
+
end
|
69
|
+
|
70
|
+
#
|
71
|
+
# Sign the transaction envelope.
|
72
|
+
#
|
73
|
+
# @return [void]
|
74
|
+
def sign_submit_request
|
75
|
+
return if submit_request_signed?
|
76
|
+
|
77
|
+
signature = signer.sign(envelope.payload_bytes)
|
78
|
+
self.submit_request_signature = signature
|
79
|
+
end
|
80
|
+
|
81
|
+
#
|
82
|
+
# Returns true if the transaction envelope has been signed.
|
83
|
+
#
|
84
|
+
# @return [Boolean] true if signed; false otherwise
|
85
|
+
#
|
86
|
+
def submit_request_signed?
|
87
|
+
@envelope.signed?
|
88
|
+
end
|
89
|
+
|
90
|
+
#
|
91
|
+
# Digest to be signed to support offline signing of the submit request
|
92
|
+
#
|
93
|
+
# @return [String] digest of the submit request
|
94
|
+
#
|
95
|
+
def submit_request_digest
|
96
|
+
envelope.payload_digest
|
97
|
+
end
|
98
|
+
|
99
|
+
#
|
100
|
+
# Sets the submit request signature. This is used to support offline signing of the submit request.
|
101
|
+
#
|
102
|
+
# @param [String] signature
|
103
|
+
#
|
104
|
+
# @return [void]
|
105
|
+
#
|
106
|
+
def submit_request_signature=(signature)
|
107
|
+
envelope.signature = signature
|
108
|
+
end
|
109
|
+
|
110
|
+
#
|
111
|
+
# Get status of the committed transaction. If the transaction has not yet committed, this method blocks until the
|
112
|
+
# commit occurs. If status is already queried, this returns status from cache and does not make additional queries.
|
113
|
+
#
|
114
|
+
# @see https://www.rubydoc.info/gems/grpc/GRPC%2FClientStub:request_response
|
115
|
+
#
|
116
|
+
# @param [Hash] options gRPC call options
|
117
|
+
#
|
118
|
+
# @return [Fabric::Status] status of the committed transaction
|
119
|
+
#
|
120
|
+
def status(options = {})
|
121
|
+
@status ||= query_status(options)
|
122
|
+
end
|
123
|
+
|
124
|
+
#
|
125
|
+
# Digest to be signed to support offline signing of the commit status request
|
126
|
+
#
|
127
|
+
# @return [String] digest of the commit status request
|
128
|
+
#
|
129
|
+
def status_request_digest
|
130
|
+
Fabric.crypto_suite.digest(signed_commit_status_request.request)
|
131
|
+
end
|
132
|
+
|
133
|
+
#
|
134
|
+
# Sets the status request signature. This is used to support offline signing of the commit status request.
|
135
|
+
#
|
136
|
+
# @param [String] signature
|
137
|
+
#
|
138
|
+
# @return [void]
|
139
|
+
#
|
140
|
+
def status_request_signature=(signature)
|
141
|
+
signed_commit_status_request.signature = signature
|
142
|
+
end
|
143
|
+
|
144
|
+
#
|
145
|
+
# Returns true if the signed commit status request has been signed.
|
146
|
+
#
|
147
|
+
# @return [Boolean] true if signed; false otherwise
|
148
|
+
#
|
149
|
+
def status_request_signed?
|
150
|
+
!signed_commit_status_request.signature.empty?
|
151
|
+
end
|
152
|
+
|
153
|
+
#
|
154
|
+
# Sign the signed commit status request
|
155
|
+
#
|
156
|
+
# @return [Fabric::Transaction] self
|
157
|
+
#
|
158
|
+
def sign_status_request
|
159
|
+
return if status_request_signed?
|
160
|
+
|
161
|
+
signature = signer.sign(signed_commit_status_request.request)
|
162
|
+
signed_commit_status_request.signature = signature
|
163
|
+
|
164
|
+
self
|
165
|
+
end
|
166
|
+
|
167
|
+
#
|
168
|
+
# Returns the current instance of the signed commit status request. Necessary so we can keep the state of the
|
169
|
+
# signature in the transaction object.
|
170
|
+
#
|
171
|
+
# @return [Gateway::SignedCommitStatusRequest] signed commit status request
|
172
|
+
#
|
173
|
+
def signed_commit_status_request
|
174
|
+
@signed_commit_status_request ||= new_signed_commit_status_request
|
175
|
+
end
|
176
|
+
|
177
|
+
private
|
178
|
+
|
179
|
+
#
|
180
|
+
# Actual status query call used by status method.
|
181
|
+
#
|
182
|
+
# @see https://www.rubydoc.info/gems/grpc/GRPC%2FClientStub:request_response
|
183
|
+
#
|
184
|
+
# @param [Hash] options gRPC call options
|
185
|
+
#
|
186
|
+
# @return [Fabric::Status] status of the committed transaction
|
187
|
+
#
|
188
|
+
def query_status(options = {})
|
189
|
+
sign_status_request
|
190
|
+
|
191
|
+
commit_status_response = client.commit_status(signed_commit_status_request, options)
|
192
|
+
new_status(commit_status_response)
|
193
|
+
end
|
194
|
+
|
195
|
+
#
|
196
|
+
# Generates a new signed commit status request
|
197
|
+
#
|
198
|
+
# @return [Gateway::SignedCommitStatusRequest] signed commit status request protobuf message
|
199
|
+
#
|
200
|
+
def new_signed_commit_status_request
|
201
|
+
::Gateway::SignedCommitStatusRequest.new(
|
202
|
+
request: new_commit_status_request.to_proto
|
203
|
+
)
|
204
|
+
end
|
205
|
+
|
206
|
+
#
|
207
|
+
# Generates a new commit status request
|
208
|
+
#
|
209
|
+
# @return [Gateway::CommitStatusRequest] commit status request protobuf message
|
210
|
+
#
|
211
|
+
def new_commit_status_request
|
212
|
+
::Gateway::CommitStatusRequest.new(
|
213
|
+
channel_id: network_name,
|
214
|
+
transaction_id: transaction_id,
|
215
|
+
identity: signer.to_proto
|
216
|
+
)
|
217
|
+
end
|
218
|
+
|
219
|
+
#
|
220
|
+
# Generates a new submit request.
|
221
|
+
#
|
222
|
+
# @return [Gateway::SubmitRequest] submit request protobuf message
|
223
|
+
#
|
224
|
+
def new_submit_request
|
225
|
+
::Gateway::SubmitRequest.new(
|
226
|
+
transaction_id: transaction_id,
|
227
|
+
channel_id: network_name,
|
228
|
+
prepared_transaction: envelope.envelope
|
229
|
+
)
|
230
|
+
end
|
231
|
+
|
232
|
+
#
|
233
|
+
# New Status from CommitStatusResponse
|
234
|
+
#
|
235
|
+
# @param [Gateway::CommitStatusResponse] response commit status response
|
236
|
+
#
|
237
|
+
# @return [Fabric::Status] transaction status
|
238
|
+
#
|
239
|
+
def new_status(response)
|
240
|
+
Fabric::Status.new(
|
241
|
+
transaction_id,
|
242
|
+
response.block_number,
|
243
|
+
Fabric::Status::TRANSACTION_STATUSES[response.result]
|
244
|
+
)
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|
data/lib/fabric/network.rb
CHANGED
@@ -11,19 +11,14 @@ module Fabric
|
|
11
11
|
class Network
|
12
12
|
attr_reader :gateway, :name
|
13
13
|
|
14
|
+
# @!parse include Fabric::Accessors::Gateway
|
15
|
+
include Fabric::Accessors::Gateway
|
16
|
+
|
14
17
|
def initialize(gateway, name)
|
15
18
|
@gateway = gateway
|
16
19
|
@name = name
|
17
20
|
end
|
18
21
|
|
19
|
-
def client
|
20
|
-
gateway.client
|
21
|
-
end
|
22
|
-
|
23
|
-
def signer
|
24
|
-
gateway.signer
|
25
|
-
end
|
26
|
-
|
27
22
|
#
|
28
23
|
# Creates a new contract instance
|
29
24
|
#
|
@@ -37,7 +32,7 @@ module Fabric
|
|
37
32
|
end
|
38
33
|
|
39
34
|
#
|
40
|
-
# @
|
35
|
+
# @todo original SDK has getChaincodeEvents and newChaincodeEventsRequest methods
|
41
36
|
# @see https://github.com/hyperledger/fabric-gateway/blob/08118cf0a792898925d0b2710b0a9e7c5ec23228/node/src/network.ts
|
42
37
|
# @see https://github.com/hyperledger/fabric-gateway/blob/main/pkg/client/network.go
|
43
38
|
#
|
@@ -48,7 +43,7 @@ module Fabric
|
|
48
43
|
end
|
49
44
|
|
50
45
|
#
|
51
|
-
# @
|
46
|
+
# @todo original SDK has getChaincodeEvents and newChaincodeEventsRequest methods
|
52
47
|
# @see https://github.com/hyperledger/fabric-gateway/blob/08118cf0a792898925d0b2710b0a9e7c5ec23228/node/src/network.ts
|
53
48
|
# @see https://github.com/hyperledger/fabric-gateway/blob/main/pkg/client/network.go
|
54
49
|
#
|
data/lib/fabric/version.rb
CHANGED
data/lib/fabric.rb
CHANGED
@@ -1,19 +1,27 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'gateway/gateway_pb'
|
4
|
+
require 'gateway/gateway_services_pb'
|
5
|
+
|
6
|
+
require 'fabric/accessors/gateway'
|
7
|
+
require 'fabric/accessors/network'
|
8
|
+
require 'fabric/accessors/contract'
|
9
|
+
|
10
|
+
require 'fabric/entities/envelope'
|
11
|
+
require 'fabric/entities/identity'
|
12
|
+
require 'fabric/entities/proposal'
|
13
|
+
require 'fabric/entities/proposed_transaction'
|
14
|
+
require 'fabric/entities/status'
|
15
|
+
require 'fabric/entities/transaction'
|
16
|
+
|
3
17
|
require 'fabric/constants'
|
4
18
|
require 'fabric/contract'
|
5
19
|
require 'fabric/client'
|
6
20
|
require 'fabric/ec_crypto_suite'
|
7
21
|
require 'fabric/gateway'
|
8
|
-
require 'fabric/identity'
|
9
22
|
require 'fabric/network'
|
10
|
-
require 'fabric/proposal'
|
11
|
-
require 'fabric/proposed_transaction'
|
12
23
|
require 'fabric/version'
|
13
24
|
|
14
|
-
require 'gateway/gateway_pb'
|
15
|
-
require 'gateway/gateway_services_pb'
|
16
|
-
|
17
25
|
#
|
18
26
|
# Hyperledger Fabric Gateway SDK
|
19
27
|
#
|
@@ -25,14 +33,19 @@ module Fabric
|
|
25
33
|
#
|
26
34
|
# CommitError
|
27
35
|
#
|
28
|
-
# @
|
36
|
+
# @todo TEST ME!
|
29
37
|
#
|
30
38
|
class CommitError < Error
|
31
39
|
attr_reader :code, :transaction_id
|
32
40
|
|
41
|
+
#
|
42
|
+
# Creates a transaction commit error from the status
|
43
|
+
#
|
44
|
+
# @param [Fabric::Status] status transaction status
|
45
|
+
#
|
33
46
|
def initialize(status)
|
34
|
-
super("Transaction #{status.transaction_id} failed to commit with status code #{status.code} -" +
|
35
|
-
|
47
|
+
super("Transaction #{status.transaction_id} failed to commit with status code #{status.code} - " +
|
48
|
+
Status::TRANSACTION_STATUSES.key(status.code).to_s)
|
36
49
|
@code = code
|
37
50
|
@transaction_id = status.transaction_id
|
38
51
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fabric-gateway
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Chan
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: google-protobuf
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '1.42'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rake-notes
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.2.0
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.2.0
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: rubocop
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -154,6 +168,7 @@ files:
|
|
154
168
|
- ".ruby-version"
|
155
169
|
- ".travis.yml"
|
156
170
|
- ".vscode/settings.json"
|
171
|
+
- ".yardopts"
|
157
172
|
- CHANGELOG.md
|
158
173
|
- CODE_OF_CONDUCT.md
|
159
174
|
- Gemfile
|
@@ -171,15 +186,21 @@ files:
|
|
171
186
|
- lib/common/policies_pb.rb
|
172
187
|
- lib/fabric.rb
|
173
188
|
- lib/fabric/.DS_Store
|
189
|
+
- lib/fabric/accessors/contract.rb
|
190
|
+
- lib/fabric/accessors/gateway.rb
|
191
|
+
- lib/fabric/accessors/network.rb
|
174
192
|
- lib/fabric/client.rb
|
175
193
|
- lib/fabric/constants.rb
|
176
194
|
- lib/fabric/contract.rb
|
177
195
|
- lib/fabric/ec_crypto_suite.rb
|
196
|
+
- lib/fabric/entities/envelope.rb
|
197
|
+
- lib/fabric/entities/identity.rb
|
198
|
+
- lib/fabric/entities/proposal.rb
|
199
|
+
- lib/fabric/entities/proposed_transaction.rb
|
200
|
+
- lib/fabric/entities/status.rb
|
201
|
+
- lib/fabric/entities/transaction.rb
|
178
202
|
- lib/fabric/gateway.rb
|
179
|
-
- lib/fabric/identity.rb
|
180
203
|
- lib/fabric/network.rb
|
181
|
-
- lib/fabric/proposal.rb
|
182
|
-
- lib/fabric/proposed_transaction.rb
|
183
204
|
- lib/fabric/version.rb
|
184
205
|
- lib/gateway/gateway_pb.rb
|
185
206
|
- lib/gateway/gateway_services_pb.rb
|