iota-ruby 1.1.6 → 1.1.7
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/.travis.yml +5 -0
- data/.yardopts +7 -0
- data/CHANGELOG.md +4 -0
- data/README.md +23 -4
- data/ext/ccurl/extconf.rb +1 -2
- data/ext/pow/ccurl-0.3.0.dll +0 -0
- data/ext/pow/libccurl-0.3.0.dylib +0 -0
- data/ext/pow/libccurl-0.3.0.so +0 -0
- data/iota-ruby.gemspec +2 -0
- data/lib/iota.rb +4 -2
- data/lib/iota/api/api.rb +47 -4
- data/lib/iota/api/wrappers.rb +2 -3
- data/lib/iota/crypto/pow_provider.rb +27 -0
- data/lib/iota/utils/broker.rb +7 -3
- data/lib/iota/version.rb +1 -1
- data/test/pow_provider_test.rb +36 -0
- metadata +24 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1e5423f9645a1fceef2e926f77101b6d28a2e837
|
4
|
+
data.tar.gz: 55d897d2dec4177927a57e90f7e5570c79d95604
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 16ccbc15b79c844294c81ab21146e6fb848dd1db5d2e3e6b8b56b8096f3aed43d117a607f046b3b7ddd4fcb2e7770284662df7246ea5649c94498f03ceb5e3d9
|
7
|
+
data.tar.gz: 077a3b55befc66196a5bfa9e2ceab5074d5d42afd856a245a90c4c15d701b7b4f6446973e604c53c748acc1263d549dca8f48df232c826a0b1c42b681c6ba2f1
|
data/.travis.yml
CHANGED
data/.yardopts
ADDED
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# IOTA Ruby Gem
|
2
2
|
|
3
|
-
[](https://travis-ci.org/vivekmarakana/iota.lib.rb) [](https://badge.fury.io/rb/iota-ruby) [](https://raw.githubusercontent.com/vivekmarakana/iota.lib.rb/master/LICENSE)
|
4
4
|
|
5
5
|
This is the **unofficial** Ruby gem for the IOTA Core. It implements both the [official API](https://iota.readme.io/), as well as newly proposed functionality (such as signing, bundles, utilities, conversion, multi signature support and reattch/promote).
|
6
6
|
|
@@ -33,10 +33,15 @@ After you've successfully installed the library, it is fairly easy to get starte
|
|
33
33
|
The optional settings object can have the following values:
|
34
34
|
|
35
35
|
1. **`host`**: `String` Host you want to connect to. Can be DNS, IPv4 or IPv6. Defaults to `localhost `
|
36
|
-
2. **`port`**: `
|
36
|
+
2. **`port`**: `Integer` port of the host you want to connect to. Defaults to 14265.
|
37
|
+
2. **`user`**: `String` username for host if required.
|
38
|
+
2. **`password`**: `String` password for host if required.
|
37
39
|
3. **`provider`**: `String` If you don't provide host and port, you can supply the full provider value to connect to
|
38
|
-
4. **`sandbox`**: `
|
40
|
+
4. **`sandbox`**: `Boolean` Optional value to determine if your provider is the IOTA Sandbox or not.
|
39
41
|
5. **`token`**: `String` Token string in case you are using sandbox.
|
42
|
+
5. **`timeout`**: `Integer` Timeout in seconds for api requests to full node. Defaults to 120.
|
43
|
+
5. **`batch_size`**: `Integer` Batch size for apis like `getTrytes`, `getBalances` etc. Defaults to 500.
|
44
|
+
5. **`local_pow`**: `Boolean` Should PoW be done local machine or not. Defaults to `false` i.e. remote PoW.
|
40
45
|
|
41
46
|
You can either supply the remote node directly via the `provider` option, or individually with `host` and `port`, as can be seen in the example below:
|
42
47
|
|
@@ -87,4 +92,18 @@ else
|
|
87
92
|
end
|
88
93
|
```
|
89
94
|
|
90
|
-
|
95
|
+
## Local PoW Support
|
96
|
+
|
97
|
+
If you want to use this gem with public full node which does not support remote PoW on host, you can set `local_pow` to `true` when initialising the client.
|
98
|
+
|
99
|
+
```ruby
|
100
|
+
require 'iota'
|
101
|
+
|
102
|
+
# With remote PoW
|
103
|
+
client = IOTA::Client.new(provider: 'https://node.iota-tangle.io:14265')
|
104
|
+
# If you use `client.api.attachToTangle` api here, you'll get error saying that attachToTangle command is not allowed
|
105
|
+
|
106
|
+
# With local pow
|
107
|
+
client = IOTA::Client.new(provider: 'https://node.iota-tangle.io:14265', local_pow: true)
|
108
|
+
# Now you can use `client.api.attachToTangle` api, which will do the proof-of-work on transaction and return the trytes that needs to be broadcasted
|
109
|
+
```
|
data/ext/ccurl/extconf.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
can_compile_extensions = false
|
2
|
-
want_extensions = true
|
3
2
|
|
4
3
|
begin
|
5
4
|
require 'mkmf'
|
@@ -9,7 +8,7 @@ rescue Exception
|
|
9
8
|
$stderr.puts "Could not require 'mkmf'. Not fatal, the extensions are optional."
|
10
9
|
end
|
11
10
|
|
12
|
-
if can_compile_extensions &&
|
11
|
+
if can_compile_extensions && have_header('ruby.h')
|
13
12
|
extension_name = 'ccurl'
|
14
13
|
dir_config(extension_name) # The destination
|
15
14
|
create_makefile(extension_name) # Create Makefile
|
Binary file
|
Binary file
|
Binary file
|
data/iota-ruby.gemspec
CHANGED
@@ -19,9 +19,11 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
spec.extensions = ["ext/ccurl/extconf.rb"]
|
21
21
|
|
22
|
+
spec.required_ruby_version = '>= 2.4.0'
|
22
23
|
spec.add_development_dependency "bundler", "~> 1.15"
|
23
24
|
spec.add_development_dependency "rake", "~> 10.0"
|
24
25
|
spec.add_development_dependency "minitest", "~> 5.0"
|
25
26
|
spec.add_development_dependency "rake-compiler", "~> 1.0.4"
|
26
27
|
spec.add_dependency "digest-sha3", "~> 1.1"
|
28
|
+
spec.add_dependency "ffi", "~> 1.9.25"
|
27
29
|
end
|
data/lib/iota.rb
CHANGED
@@ -11,6 +11,7 @@ require "iota/api/wrappers"
|
|
11
11
|
require "iota/api/transport"
|
12
12
|
require "iota/api/api"
|
13
13
|
|
14
|
+
require "iota/crypto/pow_provider"
|
14
15
|
require "iota/crypto/curl"
|
15
16
|
require "iota/crypto/kerl"
|
16
17
|
require "iota/crypto/converter"
|
@@ -58,14 +59,15 @@ module IOTA
|
|
58
59
|
@token = settings[:token] || false
|
59
60
|
@timeout = settings[:timeout] || 120
|
60
61
|
@batch_size = settings[:batch_size] || 500
|
62
|
+
@local_pow = settings[:local_pow] || false
|
61
63
|
|
62
64
|
if @sandbox
|
63
65
|
@sandbox = @provider.gsub(/\/$/, '')
|
64
66
|
@provider = @sandbox + '/commands'
|
65
67
|
end
|
66
68
|
|
67
|
-
@broker = IOTA::Utils::Broker.new(@provider, @token, @timeout)
|
68
|
-
@api = IOTA::API::Api.new(@broker, @sandbox, @batch_size)
|
69
|
+
@broker = IOTA::Utils::Broker.new(@provider, @token, @timeout, user: settings[:user], password: settings[:password])
|
70
|
+
@api = IOTA::API::Api.new(@broker, @sandbox, @batch_size, @local_pow)
|
69
71
|
end
|
70
72
|
|
71
73
|
def symbolize_keys(hash)
|
data/lib/iota/api/api.rb
CHANGED
@@ -4,13 +4,16 @@ module IOTA
|
|
4
4
|
include Wrappers
|
5
5
|
include Transport
|
6
6
|
|
7
|
-
|
7
|
+
attr_reader :pow_provider
|
8
|
+
|
9
|
+
def initialize(broker, sandbox, batch_size = 500, local_pow = false)
|
8
10
|
@broker = broker
|
9
11
|
@sandbox = sandbox
|
10
12
|
@commands = Commands.new
|
11
13
|
@utils = IOTA::Utils::Utils.new
|
12
14
|
@validator = @utils.validator
|
13
15
|
@batch_size = batch_size
|
16
|
+
@pow_provider = local_pow ? IOTA::Crypto::PowProvider.new : nil
|
14
17
|
end
|
15
18
|
|
16
19
|
def findTransactions(searchValues, &callback)
|
@@ -149,7 +152,7 @@ module IOTA
|
|
149
152
|
|
150
153
|
# Check if minweight is integer
|
151
154
|
if !@validator.isValue(minWeightMagnitude)
|
152
|
-
return sendData(false, "Invalid
|
155
|
+
return sendData(false, "Invalid minWeightMagnitude provided", &callback)
|
153
156
|
end
|
154
157
|
|
155
158
|
# Check if array of trytes
|
@@ -157,9 +160,49 @@ module IOTA
|
|
157
160
|
return sendData(false, "Invalid Trytes provided", &callback)
|
158
161
|
end
|
159
162
|
|
160
|
-
|
163
|
+
if @pow_provider.nil?
|
164
|
+
command = @commands.attachToTangle(trunkTransaction, branchTransaction, minWeightMagnitude, trytes)
|
165
|
+
|
166
|
+
sendCommand(command, &callback)
|
167
|
+
else
|
168
|
+
previousTxHash = nil
|
169
|
+
finalBundleTrytes = []
|
170
|
+
|
171
|
+
trytes.each do |current_trytes|
|
172
|
+
txObject = @utils.transactionObject(current_trytes)
|
173
|
+
|
174
|
+
if !previousTxHash
|
175
|
+
if txObject.lastIndex != txObject.currentIndex
|
176
|
+
return sendData(false, "Wrong bundle order. The bundle should be ordered in descending order from currentIndex", &callback)
|
177
|
+
end
|
178
|
+
|
179
|
+
txObject.trunkTransaction = trunkTransaction
|
180
|
+
txObject.branchTransaction = branchTransaction
|
181
|
+
else
|
182
|
+
txObject.trunkTransaction = previousTxHash
|
183
|
+
txObject.branchTransaction = trunkTransaction
|
184
|
+
end
|
161
185
|
|
162
|
-
|
186
|
+
txObject.attachmentTimestamp = (Time.now.to_f * 1000).to_i
|
187
|
+
txObject.attachmentTimestampLowerBound = 0
|
188
|
+
txObject.attachmentTimestampUpperBound = (3**27 - 1) / 2
|
189
|
+
|
190
|
+
newTrytes = @utils.transactionTrytes(txObject)
|
191
|
+
|
192
|
+
begin
|
193
|
+
returnedTrytes = @pow_provider.pow(newTrytes, minWeightMagnitude)
|
194
|
+
|
195
|
+
newTxObject= @utils.transactionObject(returnedTrytes)
|
196
|
+
previousTxHash = newTxObject.hash
|
197
|
+
|
198
|
+
finalBundleTrytes << returnedTrytes
|
199
|
+
rescue => e
|
200
|
+
return sendData(false, e.message, &callback)
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
sendData(true, finalBundleTrytes, &callback)
|
205
|
+
end
|
163
206
|
end
|
164
207
|
|
165
208
|
def interruptAttachingToTangle(&callback)
|
data/lib/iota/api/wrappers.rb
CHANGED
@@ -85,9 +85,8 @@ module IOTA
|
|
85
85
|
return sendData(false, attached_data, &callback)
|
86
86
|
end
|
87
87
|
|
88
|
-
# If the user is connected to the sandbox, we have to monitor the POW queue
|
89
|
-
|
90
|
-
if @sandbox
|
88
|
+
# If the user is connected to the sandbox and local pow is not used, we have to monitor the POW queue to check if the POW job was completed
|
89
|
+
if @sandbox && @pow_provider.nil?
|
91
90
|
# Implement sandbox processing
|
92
91
|
jobUri = @sandbox + '/jobs/' + attached_data['id']
|
93
92
|
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'ffi'
|
2
|
+
|
3
|
+
module IOTA
|
4
|
+
module Crypto
|
5
|
+
class PowProvider
|
6
|
+
extend FFI::Library
|
7
|
+
|
8
|
+
ccurl_version = '0.3.0'
|
9
|
+
lib_root = File.join(File.dirname(__FILE__), '../../../ext/pow')
|
10
|
+
if FFI::Platform.windows?
|
11
|
+
libccurl_path = "#{lib_root}/ccurl-#{ccurl_version}.dll"
|
12
|
+
elsif FFI::Platform.mac?
|
13
|
+
libccurl_path = "#{lib_root}/libccurl-#{ccurl_version}.dylib"
|
14
|
+
else
|
15
|
+
libccurl_path = "#{lib_root}/libccurl-#{ccurl_version}.so"
|
16
|
+
end
|
17
|
+
|
18
|
+
ffi_lib libccurl_path
|
19
|
+
|
20
|
+
attach_function :ccurl_pow, [ :string, :int ], :string
|
21
|
+
attach_function :ccurl_digest_transaction, [ :string ], :string
|
22
|
+
|
23
|
+
alias_method :pow, :ccurl_pow
|
24
|
+
alias_method :digest, :ccurl_digest_transaction
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/iota/utils/broker.rb
CHANGED
@@ -5,8 +5,8 @@ require 'json'
|
|
5
5
|
module IOTA
|
6
6
|
module Utils
|
7
7
|
class Broker
|
8
|
-
def initialize(provider, token, timeout = 120)
|
9
|
-
@provider, @token = provider, token
|
8
|
+
def initialize(provider, token, timeout = 120, user: nil, password: nil)
|
9
|
+
@provider, @token, @user, @password = provider, token, user, password
|
10
10
|
@timeout = timeout if timeout.to_i > 0
|
11
11
|
end
|
12
12
|
|
@@ -83,7 +83,11 @@ module IOTA
|
|
83
83
|
read_timeout: @timeout || 120
|
84
84
|
}
|
85
85
|
|
86
|
-
|
86
|
+
if @token
|
87
|
+
request["Authorization"] = "token #{@token}"
|
88
|
+
elsif @user && @password
|
89
|
+
request.basic_auth @user, @password
|
90
|
+
end
|
87
91
|
|
88
92
|
[uri, request, req_options]
|
89
93
|
end
|
data/lib/iota/version.rb
CHANGED
@@ -0,0 +1,36 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class PowProviderTest < Minitest::Test
|
4
|
+
def setup
|
5
|
+
@client = IOTA::Client.new(provider: 'http://localhost:14265', local_pow: true)
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_that_digest_works
|
9
|
+
trytes = "999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999G9AIBZPUUIXPRDTUJNGAUSWPJMLJOCSJSPVGP9KDCABPQIWXYOAXJVMDYSCPAAIJNWOHUIUNKKOVJJASCHJYTXA999999999999999999999FOINFALCON99999999999999999RJFYLXD99999999999D99999999WCKBQGFJRFIYVJAZDYLNQZIUQGG9EKZKNUOBEEASPPJXUGCTAGHGWLQSWJKC9DRVEKKHDOUJLNEQCGYK9HKFPGUUIXFOZBXZIJAFPWBYUTIAZMYHGAC9QMRDJCGOW9VXVLVQKTKRLQFITNLDHPDXHDWIVRZQGZ9999OEMEOVATRLZWXXDXIX9AVNDCHRLC9WHB9IAUUYKHUGIFBKCCYN9LRGTTQISBQYPDHTXRTOYVZTLU99999COINFALCON99999999999999999Z9PSAGQJE999999999L99999999IQXMVTRNAQVADDX9ET9IAMVJDZV"
|
10
|
+
expected_hash = "QLMNETEZDOYSBQLRPRJIZNRRDZ9EKY9LCOLNIDQEZNUFWOVYR9SJLBCVIJWIOKGNPMPGWYTNFMOW99999"
|
11
|
+
|
12
|
+
start = Time.now
|
13
|
+
# generate the correct transaction hash
|
14
|
+
hash = @client.api.pow_provider.digest(trytes)
|
15
|
+
puts "Digest time: #{(Time.now - start) * 1000.0}ms"
|
16
|
+
|
17
|
+
assert expected_hash == hash
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_that_pow_works
|
21
|
+
trunkTransaction = branchTransaction = "LLJDW9NTJHKYWIWEGIF9WDQCNHGGJOUHMYLGAOAUOFKWTFFFNSAJLBJTHWQAWFBNAPZAXKXWNL9K99999"
|
22
|
+
trytes = [
|
23
|
+
"999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999A9RGRKVGWMWMKOLVMDFWJUHNUNYWZTJADGGPZGXNLERLXYWJE9WQHWWBMCPZMVVMJUMWWBLZLNMLDCGDJ999999999999999999999999999999999999999999999999999999YGYQIVD99999999999999999999TXEFLKNPJRBYZPORHZU9CEMFIFVVQBUSTDGSJCZMBTZCDTTJVUFPTCCVHHORPMGCURKTH9VGJIXUQJVHK999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999",
|
24
|
+
"BYSWEAUTWXHXZ9YBZISEK9LUHWGMHXCGEVNZHRLUWQFCUSDXZHOFHWHL9MQPVJXXZLIXPXPXF9KYEREFSKCPKYIIKPZVLHUTDFQKKVVBBN9ATTLPCNPJDWDEVIYYLGPZGCWXOBDXMLJC9VO9QXTTBLAXTTBFUAROYEGQIVB9MJWJKXJMCUPTWAUGFZBTZCSJVRBGMYXTVBDDS9MYUJCPZ9YDWWQNIPUAIJXXSNLKUBSCOIJPCLEFPOXFJREXQCUVUMKSDOVQGGHRNILCO9GNCLWFM9APMNMWYASHXQAYBEXF9QRIHIBHYEJOYHRQJAOKAQ9AJJFQ9WEIWIJOTZATIBOXQLBMIJU9PCGBLVDDVFP9CFFSXTDUXMEGOOFXWRTLFGV9XXMYWEMGQEEEDBTIJ9OJOXFAPFQXCDAXOUDMLVYRMRLUDBETOLRJQAEDDLNVIRQJUBZBO9CCFDHIX9MSQCWYAXJVWHCUPTRSXJDESISQPRKZAFKFRULCGVRSBLVFOPEYLEE99JD9SEBALQINPDAZHFAB9RNBH9AZWIJOTLBZVIEJIAYGMC9AZGNFWGRSWAXTYSXVROVNKCOQQIWGPNQZKHUNODGYADPYLZZZUQRTJRTODOUKAOITNOMWNGHJBBA99QUMBHRENGBHTH9KHUAOXBVIVDVYYZMSEYSJWIOGGXZVRGN999EEGQMCOYVJQRIRROMPCQBLDYIGQO9AMORPYFSSUGACOJXGAQSPDY9YWRRPESNXXBDQ9OZOXVIOMLGTSWAMKMTDRSPGJKGBXQIVNRJRFRYEZ9VJDLHIKPSKMYC9YEGHFDS9SGVDHRIXBEMLFIINOHVPXIFAZCJKBHVMQZEVWCOSNWQRDYWVAIBLSCBGESJUIBWZECPUCAYAWMTQKRMCHONIPKJYYTEGZCJYCT9ABRWTJLRQXKMWY9GWZMHYZNWPXULNZAPVQLPMYQZCYNEPOCGOHBJUZLZDPIXVHLDMQYJUUBEDXXPXFLNRGIPWBRNQQZJSGSJTTYHIGGFAWJVXWL9THTPWOOHTNQWCNYOYZXALHAZXVMIZE9WMQUDCHDJMIBWKTYH9AC9AFOT9DPCADCV9ZWUTE9QNOMSZPTZDJLJZCJGHXUNBJFUBJWQUEZDMHXGBPTNSPZBR9TGSKVOHMOQSWPGFLSWNESFKSAZY9HHERAXALZCABFYPOVLAHMIHVDBGKUMDXC9WHHTIRYHZVWNXSVQUWCR9M9RAGMFEZZKZ9XEOQGOSLFQCHHOKLDSA9QCMDGCGMRYJZLBVIFOLBIJPROKMHOYTBTJIWUZWJMCTKCJKKTR9LCVYPVJI9AHGI9JOWMIWZAGMLDFJA9WU9QAMEFGABIBEZNNAL9OXSBFLOEHKDGHWFQSHMPLYFCNXAAZYJLMQDEYRGL9QKCEUEJ9LLVUOINVSZZQHCIKPAGMT9CAYIIMTTBCPKWTYHOJIIY9GYNPAJNUJ9BKYYXSV9JSPEXYMCFAIKTGNRSQGUNIYZCRT9FOWENSZQPD9ALUPYYAVICHVYELYFPUYDTWUSWNIYFXPX9MICCCOOZIWRNJIDALWGWRATGLJXNAYTNIZWQ9YTVDBOFZRKO9CFWRPAQQRXTPACOWCPRLYRYSJARRKSQPR9TCFXDVIXLP9XVL99ERRDSOHBFJDJQQGGGCZNDQ9NYCTQJWVZIAELCRBJJFDMCNZU9FIZRPGNURTXOCDSQGXTQHKHUECGWFUUYS9J9NYQ9U9P9UUP9YMZHWWWCIASCFLCMSKTELZWUGCDE9YOKVOVKTAYPHDF9ZCCQAYPJIJNGSHUIHHCOSSOOBUDOKE9CJZGYSSGNCQJVBEFTZFJ9SQUHOASKRRGBSHWKBCBWBTJHOGQ9WOMQFHWJVEG9NYX9KWBTCAIXNXHEBDIOFO9ALYMFGRICLCKKLG9FOBOX9PDWNQRGHBKHGKKRLWTBEQMCWQRLHAVYYZDIIPKVQTHYTWQMTOACXZOQCDTJTBAAUWXSGJF9PNQIJ9AJRUMUVCPWYVYVARKR9RKGOUHHNKNVGGPDDLGKPQNOYHNKAVVKCXWXOQPZNSLATUJT9AUWRMPPSWHSTTYDFAQDXOCYTZHOYYGAIM9CELMZ9AZPWB9MJXGHOKDNNSZVUDAGXTJJSSZCPZVPZBYNNTUQABSXQWZCHDQSLGK9UOHCFKBIBNETK999999999999999999999999999999999999999999999999999999999999999999999999999999999NOXDXXKUDW99999999999999999PGDNLQOLQS99EQYKBIU9VHCJVIPFUYCQDNY9APGEVYLCENJIOBLWNB999999999XKBRHUD99C99999999NKZKEKWLDKMJCI9N9XQOLWEPAYWSH9999999999999999999999999KDDTGZLIPBNZKMLTOLOXQVNGLASESDQVPTXALEKRMIOHQLUHD9ELQDBQETS9QFGTYOYWLNTSKKMVJAUXSIROUICDOXKSYZTDPEDKOQENTJOWJONDEWROCEJIEWFWLUAACVSJFTMCHHXJBJRKAAPUDXXVXFWP9X9999IROUICDOXKSYZTDPEDKOQENTJOWJONDEWROCEJIEWFWLUAACVSJFTMCHHXJBJRKAAPUDXXVXFWP9X9999"
|
25
|
+
]
|
26
|
+
|
27
|
+
start = Time.now
|
28
|
+
# generate the correct transaction hash
|
29
|
+
status, trytes_with_pow = @client.api.attachToTangle(trunkTransaction, branchTransaction, 2, trytes)
|
30
|
+
puts "PoW time: #{(Time.now - start) * 1000.0}ms"
|
31
|
+
|
32
|
+
assert status == true
|
33
|
+
assert trytes_with_pow.class == Array
|
34
|
+
assert trytes_with_pow.length == trytes.length
|
35
|
+
end
|
36
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: iota-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vivek Marakana
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-12-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '1.1'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: ffi
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 1.9.25
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 1.9.25
|
83
97
|
description: Ruby gem for the IOTA core
|
84
98
|
email:
|
85
99
|
- vivek.marakana@gmail.com
|
@@ -92,6 +106,7 @@ files:
|
|
92
106
|
- ".editorconfig"
|
93
107
|
- ".gitignore"
|
94
108
|
- ".travis.yml"
|
109
|
+
- ".yardopts"
|
95
110
|
- CHANGELOG.md
|
96
111
|
- Gemfile
|
97
112
|
- LICENSE
|
@@ -101,6 +116,9 @@ files:
|
|
101
116
|
- examples/multisig.rb
|
102
117
|
- ext/ccurl/ccurl.c
|
103
118
|
- ext/ccurl/extconf.rb
|
119
|
+
- ext/pow/ccurl-0.3.0.dll
|
120
|
+
- ext/pow/libccurl-0.3.0.dylib
|
121
|
+
- ext/pow/libccurl-0.3.0.so
|
104
122
|
- iota-ruby.gemspec
|
105
123
|
- lib/iota.rb
|
106
124
|
- lib/iota/api/api.rb
|
@@ -114,6 +132,7 @@ files:
|
|
114
132
|
- lib/iota/crypto/curl_ruby.rb
|
115
133
|
- lib/iota/crypto/hmac.rb
|
116
134
|
- lib/iota/crypto/kerl.rb
|
135
|
+
- lib/iota/crypto/pow_provider.rb
|
117
136
|
- lib/iota/crypto/private_key.rb
|
118
137
|
- lib/iota/crypto/signing.rb
|
119
138
|
- lib/iota/models/account.rb
|
@@ -135,6 +154,7 @@ files:
|
|
135
154
|
- test/curl_c_test.rb
|
136
155
|
- test/curl_ruby_test.rb
|
137
156
|
- test/kerl_test.rb
|
157
|
+
- test/pow_provider_test.rb
|
138
158
|
- test/test_helper.rb
|
139
159
|
- test/utils_test.rb
|
140
160
|
homepage: https://github.com/vivekmarakana/iota.lib.rb
|
@@ -148,7 +168,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
148
168
|
requirements:
|
149
169
|
- - ">="
|
150
170
|
- !ruby/object:Gem::Version
|
151
|
-
version:
|
171
|
+
version: 2.4.0
|
152
172
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
153
173
|
requirements:
|
154
174
|
- - ">="
|
@@ -165,5 +185,6 @@ test_files:
|
|
165
185
|
- test/curl_c_test.rb
|
166
186
|
- test/curl_ruby_test.rb
|
167
187
|
- test/kerl_test.rb
|
188
|
+
- test/pow_provider_test.rb
|
168
189
|
- test/test_helper.rb
|
169
190
|
- test/utils_test.rb
|