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
         |