Archive for 2017

Sending new transfer (create transaction) to IOTA node using Java (aka sendTransfer)

2017-09-10   

Due to the lack of any official documentation it is hard to start using IOTA. Here you will find a short tutorial about sending transfer (i.e. creating transaction) and checking it's status.

I am assuming that you use Intellij IDEA.

Project setup

1. Create new gradle project

2. Add following dependencies to your build.gradle:

compile 'com.github.iotaledger:iota.lib.java:f43d606'
compile 'ch.qos.logback:logback-classic:1.2.3'

 

Building IotaAPI

In order to execute commands against IOTA node you have to create an IotaAPI instance. IotaAPI is the client that connects to a node and provides you the services of IOTA.

api = new IotaAPI.Builder().protocol(PROTOCOL).host(HOST).port(((Integer) PORT).toString()).build();

where PROTOCOL, HOST and PORT are constants defining the node's address.

Preparing and sending a transfer

For the sake of simplicity here we will send "empty" transfer, i.e. with value = 0.

The code:

List transfers = new ArrayList<>();  // (1)
Transfer t = new Transfer(ADDRESS_TO,  // (2)
        0, // (3)
        TrytesConverter.toTrytes("some msg"), // (4)
        "999999999999999999999999999"); // (5)
transfers.add(t);  // (6)
SendTransferResponse resp = api.sendTransfer(SEED, // (7)
        2, // (8)
        9, // (9)
        15, // (10)
        transfers, // (11)
        null,  // (12)
        ADDRESS_REMAINDER);  // (13)

First we need to prepare the transfer(s).

(1)  we are createing a list that will hold our transfer(s)

(2) ADDRESS_TO is the address of the recipient

(3) we set 0 for the value of the transfer, i.e. "empty" transfer

(4) this is the message. It is up to you what the message will contain but it must be encoded to trytes.

(5) optional tag, here we send empty tag, i.e. 999999999999999999999999999

(6) add the Transfer object to the list

(7) send the Transfer. Here SEED is your seed

(8)  2 is the security level (default value)

(9) 9 is the depth (default value)

(10) 15 is inWeightMagnitude which is basically the amount of PoW that is done for a transaction

(11) your transfer(s)

(12) prepared list of inputs. What an input really means is an address from which to take the iotas for the transfer. One transaction with value may use several inputs/address. We put null here because our value is 0

(13) address where the remainder of the transaction to be send. In our case not used because the value is 0. Remainder is difference between the sum of all inputs and the value of the transaction.

In the returned SendTransferResponse object you have a field successfully which is an array containing one boolean value per transaction which indicates if the transfer is send successfully. Please note that "send" differs from "confirmed". "Send" just means that the node received and accepted the transfer. Your transaction will now have "Pending" status.

If you send 2 transfers at once you will get 2 transactions. Those 2 transactions will be in the same bundle.

Now you may ask "Where is my transaction hash and how do I check if it is confirmed?". Well, oddly enough, SendTransferResponse does not contain the transaction hash(es) even though it is quite easy for it do to so because in the underlying code that information exist. It is probably just because the IOTA's java lib is still immature and this may change in the future.

In order to find your transaction's hash you will have to use:

FindTransactionResponse resp = api.findTransactions(new String[] {ADDRESS_FROM}, null, null, null);

In the response object you will get all transactions (their hashes) for this address and you will have to use the last. Then to check the status of the transaction:

GetInclusionStateResponse inclusionResp = api.getLatestInclusion(new String[] {transHash});

In inclusionResp there is a field 'states' which contain an array with the states of all matched transactions (in our case just one). If it is 'true' your transaction is approved.

How to check IOTA IRI neighbors or node status

2017-09-08   

So you had your IRI up and running and now you need to check the node status or how your neighbor are performing?

I am using this simple solution:

Prerequisites:
1. Chrome/Chromium browser
2. Restlet client plug-in for Chrome
3. Json export of the requests' definition

Install the plug-in, start it, then click Import in the loser left corner then select "Restlet client repository", select the file, then click checkbox next to IRI, then import.

In the left menu now you will have menu item IRI. Expand it, click on "Neighbors" and the neighbors request will be shown on the right. Change "http://yourserver:14265/" to reflect your server's address and port. Click "Save" to save the changes. Now click the "Send" button and scroll down. You should see something that looks like:

Click on "Node info" in the menu and do the same for it.

That is it. I hope this short tutorial was helpful.

Setting up Google single sign in

2017-01-16   

This post is more like a note to myself. Setting up Google sign in is not something I do very often. It happens on average once a year and each time I have to do it I have to struggle with the crappy documentation (because I manage to forget the implementation details).

 

So:
1 .Go to Google developer console at https://console.developers.google.com/apis/

2. Create new project, Click 'Credentials' menu item

3. Click the Create credentials button -> OAuth client ID -> Web application -> Create. Don't mind the "Web application" thing, you need this for the android app. Enter some name and then Save. Google will generate two things for it: Client ID and Client secret. Client ID is used in the android app when creating GoogleSignInOptions like this:

        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.google_client_id))
                .build();

Client secret is used on the server side only.

4. Now we have to create android credentials for both debug and release (optionally) .

4.1. Debug

Click the Create credentials button -> OAuth client ID -> Android

For name use 'Android client debug' (for example)

For signing-certificate finger print use:

keytool -exportcert -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore

to show the fingerprint (use SHA-1)

For package name use the package name from your AndroidManifest.xml. You may need to add '.debug' suffix if gradle is configured to add it when building debug version.

4.2. Release

Do the same but using the release key

keytool -exportcert -keystore android_release_keys.keystore -list -v

 

4. Go to https://developers.google.com/identity/sign-in/android/start-integrating

Click 'Get a configuration' file button. Select the app and package (usually release package, i.e. without debug). 'Continue and configure services'

There is a button 'Enable google sign in", Click it.

There is a button "Generate conf files". Click it.

There is a button 'Download google-services.json'. DON'T click it.

Go again to https://developers.google.com/identity/sign-in/android/start-integrating
Select the app, but enter the debug package, i.e. with the .debug suffix.'Continue and configure services'

There is a button 'Enable google sign in", Click it.

There is a button "Generate conf files". Click it.

There is a button 'Download google-services.json'. Click it and download the file. This file contains the configuration for both release and debug builds.

Copy the file in the root of the app module folder (that is NOT the project root).

Now everything should work.