eth 0.4.8 → 0.4.10
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 +5 -5
- data/CHANGELOG.md +12 -0
- data/eth.gemspec +1 -1
- data/lib/eth.rb +8 -9
- data/lib/eth/tx.rb +58 -15
- data/lib/eth/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c2145cbe87b192081aa7f1ef32e8e92669c089e61e6d9d7221a1f18885c7bbcd
|
4
|
+
data.tar.gz: c20ed4ac5450ad6cfae066f58e7bb7a193e6c6a4a29ce9a1d2be71f5d2cbaf7b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 492fcfbda0bfebacc44d0b684350d3e73e68a8449461cc8fcd97364b0e4be06909c2eff0bc86da7f127aceb8b0109f4ad86edf716b65e0e00b701d7f29f17c4e
|
7
|
+
data.tar.gz: 2450ae894c0324ecefd737105cb47275406a816ba998423bd4562539c1c1278062f564b97b725dc050e1e2c192260f19daad2f4e6a67d5aa8505a68332dd51b2
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,18 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
5
5
|
and this project adheres to [Semantic Versioning](http://semver.org/).
|
6
6
|
|
7
|
+
### Unreleased
|
8
|
+
|
9
|
+
## [0.4.10]
|
10
|
+
|
11
|
+
### Changed
|
12
|
+
- Changed Eth::Configuration.default_chain_id back to .chain_id for dependent libraries.
|
13
|
+
|
14
|
+
## [0.4.9]
|
15
|
+
|
16
|
+
### Changed
|
17
|
+
- [escoffon](https://github.com/escoffon) added support for chain IDs larger than 120.
|
18
|
+
|
7
19
|
## [0.4.8]
|
8
20
|
|
9
21
|
### Added
|
data/eth.gemspec
CHANGED
@@ -23,7 +23,7 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_dependency 'ffi', '~> 1.0'
|
24
24
|
spec.add_dependency 'money-tree', '~> 0.10.0'
|
25
25
|
spec.add_dependency 'rlp', '~> 0.7.3'
|
26
|
-
spec.add_dependency 'scrypt', '~> 3.0.
|
26
|
+
spec.add_dependency 'scrypt', '~> 3.0.6'
|
27
27
|
|
28
28
|
spec.add_development_dependency 'bundler', '~> 1.12'
|
29
29
|
spec.add_development_dependency 'pry', '~> 0.1'
|
data/lib/eth.rb
CHANGED
@@ -30,15 +30,7 @@ module Eth
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def v_base
|
33
|
-
|
34
|
-
(chain_id * 2) + 35
|
35
|
-
else
|
36
|
-
replayable_chain_id
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def prevent_replays?
|
41
|
-
!chain_id.nil?
|
33
|
+
replayable_chain_id
|
42
34
|
end
|
43
35
|
|
44
36
|
def replayable_v?(v)
|
@@ -49,6 +41,12 @@ module Eth
|
|
49
41
|
!!configuration.tx_data_hex
|
50
42
|
end
|
51
43
|
|
44
|
+
def chain_id_from_signature(signature)
|
45
|
+
return nil if Eth.replayable_v?(signature[:v])
|
46
|
+
|
47
|
+
cid = (signature[:v] - 35) / 2
|
48
|
+
(cid < 1) ? nil : cid
|
49
|
+
end
|
52
50
|
|
53
51
|
private
|
54
52
|
|
@@ -61,6 +59,7 @@ module Eth
|
|
61
59
|
attr_accessor :chain_id, :tx_data_hex
|
62
60
|
|
63
61
|
def initialize
|
62
|
+
self.chain_id = nil
|
64
63
|
self.tx_data_hex = true
|
65
64
|
end
|
66
65
|
end
|
data/lib/eth/tx.rb
CHANGED
@@ -20,13 +20,19 @@ module Eth
|
|
20
20
|
|
21
21
|
def self.decode(data)
|
22
22
|
data = Utils.hex_to_bin(data) if data.match(/\A(?:0x)?\h+\Z/)
|
23
|
-
deserialize(RLP.decode data)
|
23
|
+
txh = deserialize(RLP.decode data).to_h
|
24
|
+
|
25
|
+
txh[:chain_id] = Eth.chain_id_from_signature(txh)
|
26
|
+
|
27
|
+
self.new txh
|
24
28
|
end
|
25
29
|
|
26
30
|
def initialize(params)
|
27
31
|
fields = {v: 0, r: 0, s: 0}.merge params
|
28
32
|
fields[:to] = Utils.normalize_address(fields[:to])
|
29
33
|
|
34
|
+
self.chain_id = (params[:chain_id]) ? params.delete(:chain_id) : Eth.chain_id
|
35
|
+
|
30
36
|
if params[:data]
|
31
37
|
self.data = params.delete(:data)
|
32
38
|
fields[:data_bin] = data_bin
|
@@ -37,7 +43,8 @@ module Eth
|
|
37
43
|
end
|
38
44
|
|
39
45
|
def unsigned_encoded
|
40
|
-
|
46
|
+
us = unsigned
|
47
|
+
RLP.encode(us, sedes: us.sedes)
|
41
48
|
end
|
42
49
|
|
43
50
|
def signing_data
|
@@ -53,12 +60,13 @@ module Eth
|
|
53
60
|
end
|
54
61
|
|
55
62
|
def sign(key)
|
56
|
-
|
57
|
-
vrs = Utils.v_r_s_for
|
58
|
-
self.v = vrs[0]
|
63
|
+
sig = key.sign(unsigned_encoded)
|
64
|
+
vrs = Utils.v_r_s_for sig
|
65
|
+
self.v = (self.chain_id) ? ((self.chain_id * 2) + vrs[0] + 8) : vrs[0]
|
59
66
|
self.r = vrs[1]
|
60
67
|
self.s = vrs[2]
|
61
68
|
|
69
|
+
clear_signature
|
62
70
|
self
|
63
71
|
end
|
64
72
|
|
@@ -70,19 +78,28 @@ module Eth
|
|
70
78
|
end
|
71
79
|
|
72
80
|
def from
|
73
|
-
if
|
74
|
-
public_key = OpenSsl.recover_compact(signature_hash,
|
81
|
+
if ecdsa_signature
|
82
|
+
public_key = OpenSsl.recover_compact(signature_hash, ecdsa_signature)
|
75
83
|
Utils.public_key_to_address(public_key) if public_key
|
76
84
|
end
|
77
85
|
end
|
78
86
|
|
79
87
|
def signature
|
80
88
|
return @signature if @signature
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
89
|
+
@signature = { v: v, r: r, s: s } if [v, r, s].all? && (v > 0)
|
90
|
+
end
|
91
|
+
|
92
|
+
def ecdsa_signature
|
93
|
+
return @ecdsa_signature if @ecdsa_signature
|
94
|
+
|
95
|
+
if [v, r, s].all? && (v > 0)
|
96
|
+
s_v = (self.chain_id) ? (v - (self.chain_id * 2) - 8) : v
|
97
|
+
@ecdsa_signature = [
|
98
|
+
Utils.int_to_base256(s_v),
|
99
|
+
Utils.zpad_int(r),
|
100
|
+
Utils.zpad_int(s),
|
101
|
+
].join
|
102
|
+
end
|
86
103
|
end
|
87
104
|
|
88
105
|
def hash
|
@@ -106,13 +123,37 @@ module Eth
|
|
106
123
|
Eth.tx_data_hex? ? self.data_hex=(string) : self.data_bin=(string)
|
107
124
|
end
|
108
125
|
|
126
|
+
def chain_id
|
127
|
+
@chain_id
|
128
|
+
end
|
129
|
+
|
130
|
+
def chain_id=(cid)
|
131
|
+
if cid != @chain_id
|
132
|
+
self.v = 0
|
133
|
+
self.r = 0
|
134
|
+
self.s = 0
|
135
|
+
|
136
|
+
clear_signature
|
137
|
+
end
|
138
|
+
|
139
|
+
@chain_id = (cid == 0) ? nil : cid
|
140
|
+
end
|
141
|
+
|
142
|
+
def prevent_replays?
|
143
|
+
!self.chain_id.nil?
|
144
|
+
end
|
109
145
|
|
110
146
|
private
|
111
147
|
|
148
|
+
def clear_signature
|
149
|
+
@signature = nil
|
150
|
+
@ecdsa_signature = nil
|
151
|
+
end
|
152
|
+
|
112
153
|
def hash_keys
|
113
154
|
keys = self.class.serializable_fields.keys
|
114
155
|
keys.delete(:data_bin)
|
115
|
-
keys + [:data]
|
156
|
+
keys + [:data, :chain_id]
|
116
157
|
end
|
117
158
|
|
118
159
|
def check_transaction_validity
|
@@ -137,11 +178,13 @@ module Eth
|
|
137
178
|
end
|
138
179
|
|
139
180
|
def unsigned
|
140
|
-
Tx.new to_h.merge(v:
|
181
|
+
Tx.new to_h.merge(v: (self.chain_id) ? self.chain_id : 0, r: 0, s: 0)
|
141
182
|
end
|
142
183
|
|
184
|
+
protected
|
185
|
+
|
143
186
|
def sedes
|
144
|
-
if
|
187
|
+
if self.prevent_replays? && !(Eth.replayable_v? v)
|
145
188
|
self.class
|
146
189
|
else
|
147
190
|
UnsignedTx
|
data/lib/eth/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eth
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steve Ellis
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-10-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: digest-sha3
|
@@ -72,14 +72,14 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 3.0.
|
75
|
+
version: 3.0.6
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 3.0.
|
82
|
+
version: 3.0.6
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: bundler
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -187,7 +187,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
187
187
|
version: '0'
|
188
188
|
requirements: []
|
189
189
|
rubyforge_project:
|
190
|
-
rubygems_version: 2.
|
190
|
+
rubygems_version: 2.7.6
|
191
191
|
signing_key:
|
192
192
|
specification_version: 4
|
193
193
|
summary: Simple API to sign Ethereum transactions.
|